From 975d4a6edf3574606d02253a39f27321af91adbb Mon Sep 17 00:00:00 2001 From: Marcelo Lazaroni Date: Wed, 15 Nov 2017 10:17:34 +0000 Subject: [PATCH] Fix jsx compilation (#10) * Change extension of files with JSX syntax in them * Add a magical loader to allow importing of .jsx files * Remove all .js counterparts of jsx files * The miracle of successful compilation is performed. Hosana in the highest!! --- dist/fl-form-builder-tests.js.map | 2 +- gulp-tasks/extensions.js | 87 + gulp-tasks/transpile-react.js | 3 + ...downOption.js => ButtonDropdownOption.jsx} | 0 ...oupDropdown.js => ButtonGroupDropdown.jsx} | 0 .../View/ControlBar/{index.js => index.jsx} | 0 ...onfigBar.js => FieldWrapper.ConfigBar.jsx} | 0 ...er.Sidebar.js => FieldWrapper.Sidebar.jsx} | 0 .../{FieldWrapper.js => FieldWrapper.jsx} | 0 src/js/View/Fields/{index.js => index.jsx} | 0 src/js/View/{Main.js => Main.jsx} | 0 src/js/View/{index.js => index.jsx} | 0 ...or.js => buildOptionsFieldConstructor.jsx} | 0 .../{options-utils.js => options-utils.jsx} | 0 ...uctor.js => buildTextFieldConstructor.jsx} | 0 src/js/index.js | 23 - src/js/index.jsx | 28 + yarn.lock | 4622 +++++++++++++++++ 18 files changed, 4741 insertions(+), 24 deletions(-) create mode 100644 gulp-tasks/extensions.js rename src/js/View/ControlBar/{ButtonDropdownOption.js => ButtonDropdownOption.jsx} (100%) rename src/js/View/ControlBar/{ButtonGroupDropdown.js => ButtonGroupDropdown.jsx} (100%) rename src/js/View/ControlBar/{index.js => index.jsx} (100%) rename src/js/View/Fields/{FieldWrapper.ConfigBar.js => FieldWrapper.ConfigBar.jsx} (100%) rename src/js/View/Fields/{FieldWrapper.Sidebar.js => FieldWrapper.Sidebar.jsx} (100%) rename src/js/View/Fields/{FieldWrapper.js => FieldWrapper.jsx} (100%) rename src/js/View/Fields/{index.js => index.jsx} (100%) rename src/js/View/{Main.js => Main.jsx} (100%) rename src/js/View/{index.js => index.jsx} (100%) rename src/js/default-types/options-fields/{buildOptionsFieldConstructor.js => buildOptionsFieldConstructor.jsx} (100%) rename src/js/default-types/options-fields/{options-utils.js => options-utils.jsx} (100%) rename src/js/default-types/text-fields/{buildTextFieldConstructor.js => buildTextFieldConstructor.jsx} (100%) delete mode 100644 src/js/index.js create mode 100644 src/js/index.jsx create mode 100644 yarn.lock diff --git a/dist/fl-form-builder-tests.js.map b/dist/fl-form-builder-tests.js.map index 846cd8a..0c8a1a2 100644 --- a/dist/fl-form-builder-tests.js.map +++ b/dist/fl-form-builder-tests.js.map @@ -1 +1 @@ -{"version":3,"file":"fl-form-builder-tests.js","sources":["src/js/Actions.js","src/tests/actions.js","node_modules/seamless-immutable/src/seamless-immutable.js","src/js/utils/asyncDispatchMiddleware.js","src/tests/utils.asyncDispatchMiddleware.js","node_modules/fl-assert/dist/assert.js","node_modules/ramda/src/internal/_isArray.js","node_modules/ramda/src/internal/_slice.js","node_modules/ramda/src/internal/_checkForMethod.js","node_modules/ramda/src/internal/_isPlaceholder.js","node_modules/ramda/src/internal/_curry1.js","node_modules/ramda/src/internal/_curry2.js","node_modules/ramda/src/internal/_curry3.js","node_modules/ramda/src/slice.js","node_modules/ramda/src/over.js","node_modules/ramda/src/always.js","node_modules/ramda/src/set.js","node_modules/ramda/src/internal/_arity.js","node_modules/ramda/src/internal/_pipe.js","node_modules/ramda/src/internal/_xwrap.js","node_modules/ramda/src/bind.js","node_modules/ramda/src/internal/_isString.js","node_modules/ramda/src/isArrayLike.js","node_modules/ramda/src/internal/_reduce.js","node_modules/ramda/src/reduce.js","node_modules/ramda/src/tail.js","node_modules/ramda/src/pipe.js","node_modules/ramda/src/internal/_concat.js","node_modules/ramda/src/prepend.js","node_modules/ramda/src/prop.js","node_modules/ramda/src/internal/_isTransformer.js","node_modules/ramda/src/internal/_dispatchable.js","node_modules/ramda/src/internal/_map.js","node_modules/ramda/src/internal/_xfBase.js","node_modules/ramda/src/internal/_xmap.js","node_modules/ramda/src/internal/_curryN.js","node_modules/ramda/src/curryN.js","node_modules/ramda/src/internal/_has.js","node_modules/ramda/src/internal/_isArguments.js","node_modules/ramda/src/keys.js","node_modules/ramda/src/map.js","node_modules/ramda/src/lens.js","node_modules/ramda/src/curry.js","node_modules/data.either/lib/either.js","node_modules/data.either/lib/index.js","src/js/Update/utils.js","src/js/Update/undo.js","node_modules/ramda/src/internal/_identity.js","node_modules/ramda/src/identity.js","node_modules/ramda/src/path.js","node_modules/ramda/src/ap.js","node_modules/ramda/src/reduceRight.js","node_modules/ramda/src/sequence.js","node_modules/ramda/src/traverse.js","node_modules/ramda/src/internal/_arrayFromIterator.js","node_modules/ramda/src/internal/_functionName.js","node_modules/ramda/src/identical.js","node_modules/ramda/src/type.js","node_modules/ramda/src/internal/_equals.js","node_modules/ramda/src/equals.js","src/js/Update/importState.js","node_modules/ramda/src/internal/_reduced.js","node_modules/ramda/src/internal/_xfind.js","node_modules/ramda/src/find.js","node_modules/data.task/lib/task.js","node_modules/data.task/lib/index.js","src/js/Update/createField.js","node_modules/ramda/src/append.js","node_modules/data.maybe/lib/maybe.js","node_modules/data.maybe/lib/index.js","src/js/Update/fieldCreated.js","src/js/Update/field.toggleConfig.js","src/js/Update/field.toggleRequired.js","node_modules/ramda/src/internal/_filter.js","node_modules/ramda/src/internal/_isObject.js","node_modules/ramda/src/internal/_xfilter.js","node_modules/ramda/src/filter.js","src/js/Update/field.deleteField.js","src/js/Update/field.updateField.js","node_modules/ramda/src/sort.js","src/js/Update/reorderFields.js","src/js/Update/importCustomComponents.js","src/js/Update/index.js","src/tests/update/undo.js","src/tests/update/importState.js","src/tests/update/createField.js","src/tests/update/fieldCreated.js","src/tests/update/field.toggleConfig.js","src/tests/update/field.toggleRequired.js","src/tests/update/field.deleteField.js","src/tests/update/field.updateField.js","src/tests/update/reorderFields.js","src/tests/update/importCustomComponents.js"],"sourcesContent":["//\n// ACTION CREATORS\n//\n\nexport const undo = _ =>\n({\n type: \"undo\",\n});\n\nexport const importCustomComponents = customComponents =>\n({\n type: \"importCustomComponents\",\n customComponents,\n});\n\n\nexport const importState = newFieldsState =>\n({\n type: \"importState\",\n newFieldsState,\n});\n\nexport const createField = fieldType =>\n({\n type: \"createField\",\n fieldType,\n});\n\nexport const fieldCreated = createdFieldState =>\n({\n type: \"fieldCreated\",\n createdFieldState,\n});\n\nexport const toggleConfig = fieldState =>\n({\n type: \"toggleConfig\",\n fieldState,\n});\n\nexport const toggleRequired = fieldState =>\n({\n type: \"toggleRequired\",\n fieldState,\n});\n\nexport const deleteField = fieldState =>\n({\n type: \"deleteField\",\n fieldState,\n});\n\nexport const updateField = newFieldState =>\n({\n type: \"updateField\",\n newFieldState,\n});\n\nexport const reorderFields = newFieldsOrder =>\n({\n type: \"reorderFields\",\n newFieldsOrder,\n});\n","/* eslint-env jasmine */\n\nimport {\n undo,\n importState,\n createField,\n fieldCreated,\n toggleConfig,\n toggleRequired,\n deleteField,\n updateField,\n reorderFields,\n importCustomComponents,\n} from \"../js/Actions\";\n\ndescribe(\"Action\", () => {\n describe(\"undo\", () => {\n it(\"returns the correct action type\", () => {\n const action = undo();\n expect(action.type).toEqual(\"undo\");\n });\n });\n\n describe(\"importState\", () => {\n const mockStateToImport = [\"a\", \"b\"];\n\n it(\"returns the correct action type\", () => {\n const action = importState(mockStateToImport);\n expect(action.type).toEqual(\"importState\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = importState(mockStateToImport);\n expect(action.newFieldsState).toEqual(mockStateToImport);\n });\n });\n\n describe(\"createField\", () => {\n const fieldType = \"testField\";\n\n it(\"returns the correct action type\", () => {\n const action = createField(fieldType);\n expect(action.type).toEqual(\"createField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = createField(fieldType);\n expect(action.fieldType).toEqual(fieldType);\n });\n });\n\n describe(\"fieldCreated\", () => {\n const createdFieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = fieldCreated(createdFieldState);\n expect(action.type).toEqual(\"fieldCreated\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = fieldCreated(createdFieldState);\n expect(action.createdFieldState).toEqual(createdFieldState);\n });\n });\n\n describe(\"toggleConfig\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = toggleConfig(fieldState);\n expect(action.type).toEqual(\"toggleConfig\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = toggleConfig(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"toggleRequired\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = toggleRequired(fieldState);\n expect(action.type).toEqual(\"toggleRequired\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = toggleRequired(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"deleteField\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = deleteField(fieldState);\n expect(action.type).toEqual(\"deleteField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = deleteField(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"updateField\", () => {\n const newFieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = updateField(newFieldState);\n expect(action.type).toEqual(\"updateField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = updateField(newFieldState);\n expect(action.newFieldState).toEqual(newFieldState);\n });\n });\n\n describe(\"reorderFields\", () => {\n const newFieldsOrder = {};\n\n it(\"returns the correct action type\", () => {\n const action = reorderFields(newFieldsOrder);\n expect(action.type).toEqual(\"reorderFields\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = reorderFields(newFieldsOrder);\n expect(action.newFieldsOrder).toEqual(newFieldsOrder);\n });\n });\n\n describe(\"importCustomComponents\", () => {\n const customComponents = [];\n\n it(\"returns the correct action type\", () => {\n const action = importCustomComponents(customComponents);\n expect(action.type).toEqual(\"importCustomComponents\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = importCustomComponents(customComponents);\n expect(action.customComponents).toEqual(customComponents);\n });\n });\n});\n","(function() {\n \"use strict\";\n\nfunction immutableInit(config) {\n\n // https://github.com/facebook/react/blob/v15.0.1/src/isomorphic/classic/element/ReactElement.js#L21\n var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element');\n var REACT_ELEMENT_TYPE_FALLBACK = 0xeac7;\n\n var globalConfig = {\n use_static: false\n };\n if (isObject(config)) {\n if (config.use_static !== undefined) {\n globalConfig.use_static = Boolean(config.use_static);\n }\n }\n\n function isObject(data) {\n return (\n typeof data === 'object' &&\n !Array.isArray(data) &&\n data !== null\n );\n }\n\n function instantiateEmptyObject(obj) {\n var prototype = Object.getPrototypeOf(obj);\n if (!prototype) {\n return {};\n } else {\n return Object.create(prototype);\n }\n }\n\n function addPropertyTo(target, methodName, value) {\n Object.defineProperty(target, methodName, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: value\n });\n }\n\n function banProperty(target, methodName) {\n addPropertyTo(target, methodName, function() {\n throw new ImmutableError(\"The \" + methodName +\n \" method cannot be invoked on an Immutable data structure.\");\n });\n }\n\n var immutabilityTag = \"__immutable_invariants_hold\";\n\n function addImmutabilityTag(target) {\n addPropertyTo(target, immutabilityTag, true);\n }\n\n function isImmutable(target) {\n if (typeof target === \"object\") {\n return target === null || Boolean(\n Object.getOwnPropertyDescriptor(target, immutabilityTag)\n );\n } else {\n // In JavaScript, only objects are even potentially mutable.\n // strings, numbers, null, and undefined are all naturally immutable.\n return true;\n }\n }\n\n function isEqual(a, b) {\n // Avoid false positives due to (NaN !== NaN) evaluating to true\n return (a === b || (a !== a && b !== b));\n }\n\n function isMergableObject(target) {\n return target !== null && typeof target === \"object\" && !(Array.isArray(target)) && !(target instanceof Date);\n }\n\n var mutatingObjectMethods = [\n \"setPrototypeOf\"\n ];\n\n var nonMutatingObjectMethods = [\n \"keys\"\n ];\n\n var mutatingArrayMethods = mutatingObjectMethods.concat([\n \"push\", \"pop\", \"sort\", \"splice\", \"shift\", \"unshift\", \"reverse\"\n ]);\n\n var nonMutatingArrayMethods = nonMutatingObjectMethods.concat([\n \"map\", \"filter\", \"slice\", \"concat\", \"reduce\", \"reduceRight\"\n ]);\n\n var mutatingDateMethods = mutatingObjectMethods.concat([\n \"setDate\", \"setFullYear\", \"setHours\", \"setMilliseconds\", \"setMinutes\", \"setMonth\", \"setSeconds\",\n \"setTime\", \"setUTCDate\", \"setUTCFullYear\", \"setUTCHours\", \"setUTCMilliseconds\", \"setUTCMinutes\",\n \"setUTCMonth\", \"setUTCSeconds\", \"setYear\"\n ]);\n\n function ImmutableError(message) {\n this.name = 'MyError';\n this.message = message;\n this.stack = (new Error()).stack;\n }\n ImmutableError.prototype = new Error();\n ImmutableError.prototype.constructor = Error;\n\n function makeImmutable(obj, bannedMethods) {\n // Tag it so we can quickly tell it's immutable later.\n addImmutabilityTag(obj);\n\n if (process.env.NODE_ENV !== \"production\") {\n // Make all mutating methods throw exceptions.\n for (var index in bannedMethods) {\n if (bannedMethods.hasOwnProperty(index)) {\n banProperty(obj, bannedMethods[index]);\n }\n }\n\n // Freeze it and return it.\n Object.freeze(obj);\n }\n\n return obj;\n }\n\n function makeMethodReturnImmutable(obj, methodName) {\n var currentMethod = obj[methodName];\n\n addPropertyTo(obj, methodName, function() {\n return Immutable(currentMethod.apply(obj, arguments));\n });\n }\n\n function arraySet(idx, value, config) {\n var deep = config && config.deep;\n\n if (idx in this) {\n if (deep && this[idx] !== value && isMergableObject(value) && isMergableObject(this[idx])) {\n value = Immutable.merge(this[idx], value, {deep: true, mode: 'replace'});\n }\n if (isEqual(this[idx], value)) {\n return this;\n }\n }\n\n var mutable = asMutableArray.call(this);\n mutable[idx] = Immutable(value);\n return makeImmutableArray(mutable);\n }\n\n var immutableEmptyArray = Immutable([]);\n\n function arraySetIn(pth, value, config) {\n var head = pth[0];\n\n if (pth.length === 1) {\n return arraySet.call(this, head, value, config);\n } else {\n var tail = pth.slice(1);\n var thisHead = this[head];\n var newValue;\n\n if (typeof(thisHead) === \"object\" && thisHead !== null) {\n // Might (validly) be object or array\n newValue = Immutable.setIn(thisHead, tail, value);\n } else {\n var nextHead = tail[0];\n // If the next path part is a number, then we are setting into an array, else an object.\n if (nextHead !== '' && isFinite(nextHead)) {\n newValue = arraySetIn.call(immutableEmptyArray, tail, value);\n } else {\n newValue = objectSetIn.call(immutableEmptyObject, tail, value);\n }\n }\n\n if (head in this && thisHead === newValue) {\n return this;\n }\n\n var mutable = asMutableArray.call(this);\n mutable[head] = newValue;\n return makeImmutableArray(mutable);\n }\n }\n\n function makeImmutableArray(array) {\n // Don't change their implementations, but wrap these functions to make sure\n // they always return an immutable value.\n for (var index in nonMutatingArrayMethods) {\n if (nonMutatingArrayMethods.hasOwnProperty(index)) {\n var methodName = nonMutatingArrayMethods[index];\n makeMethodReturnImmutable(array, methodName);\n }\n }\n\n if (!globalConfig.use_static) {\n addPropertyTo(array, \"flatMap\", flatMap);\n addPropertyTo(array, \"asObject\", asObject);\n addPropertyTo(array, \"asMutable\", asMutableArray);\n addPropertyTo(array, \"set\", arraySet);\n addPropertyTo(array, \"setIn\", arraySetIn);\n addPropertyTo(array, \"update\", update);\n addPropertyTo(array, \"updateIn\", updateIn);\n addPropertyTo(array, \"getIn\", getIn);\n }\n\n for(var i = 0, length = array.length; i < length; i++) {\n array[i] = Immutable(array[i]);\n }\n\n return makeImmutable(array, mutatingArrayMethods);\n }\n\n function makeImmutableDate(date) {\n if (!globalConfig.use_static) {\n addPropertyTo(date, \"asMutable\", asMutableDate);\n }\n\n return makeImmutable(date, mutatingDateMethods);\n }\n\n function asMutableDate() {\n return new Date(this.getTime());\n }\n\n /**\n * Effectively performs a map() over the elements in the array, using the\n * provided iterator, except that whenever the iterator returns an array, that\n * array's elements are added to the final result instead of the array itself.\n *\n * @param {function} iterator - The iterator function that will be invoked on each element in the array. It will receive three arguments: the current value, the current index, and the current object.\n */\n function flatMap(iterator) {\n // Calling .flatMap() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n var result = [],\n length = this.length,\n index;\n\n for (index = 0; index < length; index++) {\n var iteratorResult = iterator(this[index], index, this);\n\n if (Array.isArray(iteratorResult)) {\n // Concatenate Array results into the return value we're building up.\n result.push.apply(result, iteratorResult);\n } else {\n // Handle non-Array results the same way map() does.\n result.push(iteratorResult);\n }\n }\n\n return makeImmutableArray(result);\n }\n\n /**\n * Returns an Immutable copy of the object without the given keys included.\n *\n * @param {array} keysToRemove - A list of strings representing the keys to exclude in the return value. Instead of providing a single array, this method can also be called by passing multiple strings as separate arguments.\n */\n function without(remove) {\n // Calling .without() with no arguments is a no-op. Don't bother cloning.\n if (typeof remove === \"undefined\" && arguments.length === 0) {\n return this;\n }\n\n if (typeof remove !== \"function\") {\n // If we weren't given an array, use the arguments list.\n var keysToRemoveArray = (Array.isArray(remove)) ?\n remove.slice() : Array.prototype.slice.call(arguments);\n\n // Convert numeric keys to strings since that's how they'll\n // come from the enumeration of the object.\n keysToRemoveArray.forEach(function(el, idx, arr) {\n if(typeof(el) === \"number\") {\n arr[idx] = el.toString();\n }\n });\n\n remove = function(val, key) {\n return keysToRemoveArray.indexOf(key) !== -1;\n };\n }\n\n var result = instantiateEmptyObject(this);\n\n for (var key in this) {\n if (this.hasOwnProperty(key) && remove(this[key], key) === false) {\n result[key] = this[key];\n }\n }\n\n return makeImmutableObject(result);\n }\n\n function asMutableArray(opts) {\n var result = [], i, length;\n\n if(opts && opts.deep) {\n for(i = 0, length = this.length; i < length; i++) {\n result.push(asDeepMutable(this[i]));\n }\n } else {\n for(i = 0, length = this.length; i < length; i++) {\n result.push(this[i]);\n }\n }\n\n return result;\n }\n\n /**\n * Effectively performs a [map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) over the elements in the array, expecting that the iterator function\n * will return an array of two elements - the first representing a key, the other\n * a value. Then returns an Immutable Object constructed of those keys and values.\n *\n * @param {function} iterator - A function which should return an array of two elements - the first representing the desired key, the other the desired value.\n */\n function asObject(iterator) {\n // If no iterator was provided, assume the identity function\n // (suggesting this array is already a list of key/value pairs.)\n if (typeof iterator !== \"function\") {\n iterator = function(value) { return value; };\n }\n\n var result = {},\n length = this.length,\n index;\n\n for (index = 0; index < length; index++) {\n var pair = iterator(this[index], index, this),\n key = pair[0],\n value = pair[1];\n\n result[key] = value;\n }\n\n return makeImmutableObject(result);\n }\n\n function asDeepMutable(obj) {\n if (\n (!obj) ||\n (typeof obj !== 'object') ||\n (!Object.getOwnPropertyDescriptor(obj, immutabilityTag)) ||\n (obj instanceof Date)\n ) { return obj; }\n return Immutable.asMutable(obj, {deep: true});\n }\n\n function quickCopy(src, dest) {\n for (var key in src) {\n if (Object.getOwnPropertyDescriptor(src, key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n }\n\n /**\n * Returns an Immutable Object containing the properties and values of both\n * this object and the provided object, prioritizing the provided object's\n * values whenever the same key is present in both objects.\n *\n * @param {object} other - The other object to merge. Multiple objects can be passed as an array. In such a case, the later an object appears in that list, the higher its priority.\n * @param {object} config - Optional config object that contains settings. Supported settings are: {deep: true} for deep merge and {merger: mergerFunc} where mergerFunc is a function\n * that takes a property from both objects. If anything is returned it overrides the normal merge behaviour.\n */\n function merge(other, config) {\n // Calling .merge() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n if (other === null || (typeof other !== \"object\")) {\n throw new TypeError(\"Immutable#merge can only be invoked with objects or arrays, not \" + JSON.stringify(other));\n }\n\n var receivedArray = (Array.isArray(other)),\n deep = config && config.deep,\n mode = config && config.mode || 'merge',\n merger = config && config.merger,\n result;\n\n // Use the given key to extract a value from the given object, then place\n // that value in the result object under the same key. If that resulted\n // in a change from this object's value at that key, set anyChanges = true.\n function addToResult(currentObj, otherObj, key) {\n var immutableValue = Immutable(otherObj[key]);\n var mergerResult = merger && merger(currentObj[key], immutableValue, config);\n var currentValue = currentObj[key];\n\n if ((result !== undefined) ||\n (mergerResult !== undefined) ||\n (!currentObj.hasOwnProperty(key)) ||\n !isEqual(immutableValue, currentValue)) {\n\n var newValue;\n\n if (mergerResult) {\n newValue = mergerResult;\n } else if (deep && isMergableObject(currentValue) && isMergableObject(immutableValue)) {\n newValue = Immutable.merge(currentValue, immutableValue, config);\n } else {\n newValue = immutableValue;\n }\n\n if (!isEqual(currentValue, newValue) || !currentObj.hasOwnProperty(key)) {\n if (result === undefined) {\n // Make a shallow clone of the current object.\n result = quickCopy(currentObj, instantiateEmptyObject(currentObj));\n }\n\n result[key] = newValue;\n }\n }\n }\n\n function clearDroppedKeys(currentObj, otherObj) {\n for (var key in currentObj) {\n if (!otherObj.hasOwnProperty(key)) {\n if (result === undefined) {\n // Make a shallow clone of the current object.\n result = quickCopy(currentObj, instantiateEmptyObject(currentObj));\n }\n delete result[key];\n }\n }\n }\n\n var key;\n\n // Achieve prioritization by overriding previous values that get in the way.\n if (!receivedArray) {\n // The most common use case: just merge one object into the existing one.\n for (key in other) {\n if (Object.getOwnPropertyDescriptor(other, key)) {\n addToResult(this, other, key);\n }\n }\n if (mode === 'replace') {\n clearDroppedKeys(this, other);\n }\n } else {\n // We also accept an Array\n for (var index = 0, length = other.length; index < length; index++) {\n var otherFromArray = other[index];\n\n for (key in otherFromArray) {\n if (otherFromArray.hasOwnProperty(key)) {\n addToResult(result !== undefined ? result : this, otherFromArray, key);\n }\n }\n }\n }\n\n if (result === undefined) {\n return this;\n } else {\n return makeImmutableObject(result);\n }\n }\n\n function objectReplace(value, config) {\n var deep = config && config.deep;\n\n // Calling .replace() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n if (value === null || typeof value !== \"object\") {\n throw new TypeError(\"Immutable#replace can only be invoked with objects or arrays, not \" + JSON.stringify(value));\n }\n\n return Immutable.merge(this, value, {deep: deep, mode: 'replace'});\n }\n\n var immutableEmptyObject = Immutable({});\n\n function objectSetIn(path, value, config) {\n if (!(path instanceof Array) || path.length === 0) {\n throw new TypeError(\"The first argument to Immutable#setIn must be an array containing at least one \\\"key\\\" string.\");\n }\n\n var head = path[0];\n if (path.length === 1) {\n return objectSet.call(this, head, value, config);\n }\n\n var tail = path.slice(1);\n var newValue;\n var thisHead = this[head];\n\n if (this.hasOwnProperty(head) && typeof(thisHead) === \"object\" && thisHead !== null) {\n // Might (validly) be object or array\n newValue = Immutable.setIn(thisHead, tail, value);\n } else {\n newValue = objectSetIn.call(immutableEmptyObject, tail, value);\n }\n\n if (this.hasOwnProperty(head) && thisHead === newValue) {\n return this;\n }\n\n var mutable = quickCopy(this, instantiateEmptyObject(this));\n mutable[head] = newValue;\n return makeImmutableObject(mutable);\n }\n\n function objectSet(property, value, config) {\n var deep = config && config.deep;\n\n if (this.hasOwnProperty(property)) {\n if (deep && this[property] !== value && isMergableObject(value) && isMergableObject(this[property])) {\n value = Immutable.merge(this[property], value, {deep: true, mode: 'replace'});\n }\n if (isEqual(this[property], value)) {\n return this;\n }\n }\n\n var mutable = quickCopy(this, instantiateEmptyObject(this));\n mutable[property] = Immutable(value);\n return makeImmutableObject(mutable);\n }\n\n function update(property, updater) {\n var restArgs = Array.prototype.slice.call(arguments, 2);\n var initialVal = this[property];\n return Immutable.set(this, property, updater.apply(initialVal, [initialVal].concat(restArgs)));\n }\n\n function getInPath(obj, path) {\n /*jshint eqnull:true */\n for (var i = 0, l = path.length; obj != null && i < l; i++) {\n obj = obj[path[i]];\n }\n\n return (i && i == l) ? obj : undefined;\n }\n\n function updateIn(path, updater) {\n var restArgs = Array.prototype.slice.call(arguments, 2);\n var initialVal = getInPath(this, path);\n\n return Immutable.setIn(this, path, updater.apply(initialVal, [initialVal].concat(restArgs)));\n }\n\n function getIn(path, defaultValue) {\n var value = getInPath(this, path);\n return value === undefined ? defaultValue : value;\n }\n\n function asMutableObject(opts) {\n var result = instantiateEmptyObject(this), key;\n\n if(opts && opts.deep) {\n for (key in this) {\n if (this.hasOwnProperty(key)) {\n result[key] = asDeepMutable(this[key]);\n }\n }\n } else {\n for (key in this) {\n if (this.hasOwnProperty(key)) {\n result[key] = this[key];\n }\n }\n }\n\n return result;\n }\n\n // Creates plain object to be used for cloning\n function instantiatePlainObject() {\n return {};\n }\n\n // Finalizes an object with immutable methods, freezes it, and returns it.\n function makeImmutableObject(obj) {\n if (!globalConfig.use_static) {\n addPropertyTo(obj, \"merge\", merge);\n addPropertyTo(obj, \"replace\", objectReplace);\n addPropertyTo(obj, \"without\", without);\n addPropertyTo(obj, \"asMutable\", asMutableObject);\n addPropertyTo(obj, \"set\", objectSet);\n addPropertyTo(obj, \"setIn\", objectSetIn);\n addPropertyTo(obj, \"update\", update);\n addPropertyTo(obj, \"updateIn\", updateIn);\n addPropertyTo(obj, \"getIn\", getIn);\n }\n\n return makeImmutable(obj, mutatingObjectMethods);\n }\n\n // Returns true if object is a valid react element\n // https://github.com/facebook/react/blob/v15.0.1/src/isomorphic/classic/element/ReactElement.js#L326\n function isReactElement(obj) {\n return typeof obj === 'object' &&\n obj !== null &&\n (obj.$$typeof === REACT_ELEMENT_TYPE_FALLBACK || obj.$$typeof === REACT_ELEMENT_TYPE);\n }\n\n function isFileObject(obj) {\n return typeof File !== 'undefined' &&\n obj instanceof File;\n }\n\n function isPromise(obj) {\n return typeof obj === 'object' &&\n typeof obj.then === 'function';\n }\n\n function isError(obj) {\n return obj instanceof Error;\n }\n\n function Immutable(obj, options, stackRemaining) {\n if (isImmutable(obj) || isReactElement(obj) || isFileObject(obj) || isError(obj)) {\n return obj;\n } else if (isPromise(obj)) {\n return obj.then(Immutable);\n } else if (Array.isArray(obj)) {\n return makeImmutableArray(obj.slice());\n } else if (obj instanceof Date) {\n return makeImmutableDate(new Date(obj.getTime()));\n } else {\n // Don't freeze the object we were given; make a clone and use that.\n var prototype = options && options.prototype;\n var instantiateEmptyObject =\n (!prototype || prototype === Object.prototype) ?\n instantiatePlainObject : (function() { return Object.create(prototype); });\n var clone = instantiateEmptyObject();\n\n if (process.env.NODE_ENV !== \"production\") {\n /*jshint eqnull:true */\n if (stackRemaining == null) {\n stackRemaining = 64;\n }\n if (stackRemaining <= 0) {\n throw new ImmutableError(\"Attempt to construct Immutable from a deeply nested object was detected.\" +\n \" Have you tried to wrap an object with circular references (e.g. React element)?\" +\n \" See https://github.com/rtfeldman/seamless-immutable/wiki/Deeply-nested-object-was-detected for details.\");\n }\n stackRemaining -= 1;\n }\n\n for (var key in obj) {\n if (Object.getOwnPropertyDescriptor(obj, key)) {\n clone[key] = Immutable(obj[key], undefined, stackRemaining);\n }\n }\n\n return makeImmutableObject(clone);\n }\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n function toStatic(fn) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n return fn.apply(self, args);\n }\n\n return staticWrapper;\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n // with the additional condition of choosing which function to call depending\n // if argument is an array or an object.\n function toStaticObjectOrArray(fnObject, fnArray) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n if (Array.isArray(self)) {\n return fnArray.apply(self, args);\n } else {\n return fnObject.apply(self, args);\n }\n }\n\n return staticWrapper;\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n // with the additional condition of choosing which function to call depending\n // if argument is an array or an object or a date.\n function toStaticObjectOrDateOrArray(fnObject, fnArray, fnDate) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n if (Array.isArray(self)) {\n return fnArray.apply(self, args);\n } else if (self instanceof Date) {\n return fnDate.apply(self, args);\n } else {\n return fnObject.apply(self, args);\n }\n }\n\n return staticWrapper;\n }\n\n // Export the library\n Immutable.from = Immutable;\n Immutable.isImmutable = isImmutable;\n Immutable.ImmutableError = ImmutableError;\n Immutable.merge = toStatic(merge);\n Immutable.replace = toStatic(objectReplace);\n Immutable.without = toStatic(without);\n Immutable.asMutable = toStaticObjectOrDateOrArray(asMutableObject, asMutableArray, asMutableDate);\n Immutable.set = toStaticObjectOrArray(objectSet, arraySet);\n Immutable.setIn = toStaticObjectOrArray(objectSetIn, arraySetIn);\n Immutable.update = toStatic(update);\n Immutable.updateIn = toStatic(updateIn);\n Immutable.getIn = toStatic(getIn);\n Immutable.flatMap = toStatic(flatMap);\n Immutable.asObject = toStatic(asObject);\n if (!globalConfig.use_static) {\n Immutable.static = immutableInit({\n use_static: true\n });\n }\n\n Object.freeze(Immutable);\n\n return Immutable;\n}\n\n var Immutable = immutableInit();\n /* istanbul ignore if */\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Immutable;\n });\n } else if (typeof module === \"object\") {\n module.exports = Immutable;\n } else if (typeof exports === \"object\") {\n exports.Immutable = Immutable;\n } else if (typeof window === \"object\") {\n window.Immutable = Immutable;\n } else if (typeof global === \"object\") {\n global.Immutable = Immutable;\n }\n})();\n","/* eslint-disable new-cap */\nimport Immutable from \"seamless-immutable\";\n\n// This middleware will just add the property \"async dispatch\"\n// to actions with the \"async\" propperty set to true\nconst asyncDispatchMiddleware = store => next => action => {\n let syncActivityFinished = false;\n let actionQueue = [];\n\n function flushQueue() {\n actionQueue.forEach(a => store.dispatch(a)); // flush queue\n actionQueue = [];\n }\n\n function asyncDispatch(asyncAction) {\n actionQueue = actionQueue.concat([asyncAction]);\n\n if (syncActivityFinished) {\n flushQueue();\n }\n }\n\n const actionWithAsyncDispatch =\n Immutable(action).merge({ asyncDispatch });\n\n next(actionWithAsyncDispatch);\n syncActivityFinished = true;\n flushQueue();\n};\n\nexport default asyncDispatchMiddleware;\n","/* eslint-env jasmine */\nimport asyncDispatchMiddleware from \"../js/utils/asyncDispatchMiddleware\";\n\nconst fakeAction = { type: \"fake action\" };\n\ndescribe(\"The asyncDispatchMiddleware\", () => {\n it(\"calls next with asyncDispatch property\", (done) => {\n const next = returnedAction => {\n expect(returnedAction.asyncDispatch).not.toEqual(undefined);\n expect(typeof returnedAction.asyncDispatch).toEqual(\"function\");\n done();\n };\n\n asyncDispatchMiddleware(\"fakeStore\")(next)(fakeAction);\n });\n\n\n it(\"asyncDispatch triggers a store dispatch\", (done) => {\n const fakeAsyncAction = { type: \"fakeAsyncAction\" };\n\n const fakeStore = {\n dispatch: action => {\n expect(action.type).toEqual(fakeAsyncAction.type);\n done();\n },\n };\n\n const next = returnedAction =>\n returnedAction.asyncDispatch(fakeAsyncAction);\n\n asyncDispatchMiddleware(fakeStore)(next)(fakeAction);\n });\n});\n","// Bug checking function that will throw an error whenever\n// the condition sent to it is evaluated to false\n/**\n * Processes the message and outputs the correct message if the condition\n * is false. Otherwise it outputs null.\n * @api private\n * @method processCondition\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return {String | null} - Error message if there is an error, nul otherwise.\n */\nfunction processCondition(condition, errorMessage) {\n if (!condition) {\n var completeErrorMessage = '';\n var re = /at ([^\\s]+)\\s\\(/g;\n var stackTrace = new Error().stack;\n var stackFunctions = [];\n\n var funcName = re.exec(stackTrace);\n while (funcName && funcName[1]) {\n stackFunctions.push(funcName[1]);\n funcName = re.exec(stackTrace);\n }\n\n // Number 0 is processCondition itself,\n // Number 1 is assert,\n // Number 2 is the caller function.\n if (stackFunctions[2]) {\n completeErrorMessage = stackFunctions[2] + ': ' + completeErrorMessage;\n }\n\n completeErrorMessage += errorMessage;\n return completeErrorMessage;\n }\n\n return null;\n}\n\n/**\n * Throws an error if the boolean passed to it evaluates to false.\n * To be used like this:\n * \t\tassert(myDate !== undefined, \"Date cannot be undefined.\");\n * @api public\n * @method assert\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return void\n */\nfunction assert(condition, errorMessage) {\n var error = processCondition(condition, errorMessage);\n if (typeof error === 'string') {\n throw new Error(error);\n }\n}\n\n/**\n * Logs a warning if the boolean passed to it evaluates to false.\n * To be used like this:\n * \t\tassert.warn(myDate !== undefined, \"No date provided.\");\n * @api public\n * @method warn\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return void\n */\nassert.warn = function warn(condition, errorMessage) {\n var error = processCondition(condition, errorMessage);\n if (typeof error === 'string') {\n console.warn(error);\n }\n};\n\nexport default assert;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJhc3NlcnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQnVnIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuZXZlclxuLy8gdGhlIGNvbmRpdGlvbiBzZW50IHRvIGl0IGlzIGV2YWx1YXRlZCB0byBmYWxzZVxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgYW5kIG91dHB1dHMgdGhlIGNvcnJlY3QgbWVzc2FnZSBpZiB0aGUgY29uZGl0aW9uXG4gKiBpcyBmYWxzZS4gT3RoZXJ3aXNlIGl0IG91dHB1dHMgbnVsbC5cbiAqIEBhcGkgcHJpdmF0ZVxuICogQG1ldGhvZCBwcm9jZXNzQ29uZGl0aW9uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHtTdHJpbmcgfCBudWxsfSAgLSBFcnJvciBtZXNzYWdlIGlmIHRoZXJlIGlzIGFuIGVycm9yLCBudWwgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgbGV0IGNvbXBsZXRlRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgY29uc3QgcmUgPSAvYXQgKFteXFxzXSspXFxzXFwoL2c7XG4gICAgY29uc3Qgc3RhY2tUcmFjZSA9IG5ldyBFcnJvcigpLnN0YWNrO1xuICAgIGNvbnN0IHN0YWNrRnVuY3Rpb25zID0gW107XG5cbiAgICBsZXQgZnVuY05hbWUgPSByZS5leGVjKHN0YWNrVHJhY2UpO1xuICAgIHdoaWxlIChmdW5jTmFtZSAmJiBmdW5jTmFtZVsxXSkge1xuICAgICAgc3RhY2tGdW5jdGlvbnMucHVzaChmdW5jTmFtZVsxXSk7XG4gICAgICBmdW5jTmFtZSA9IHJlLmV4ZWMoc3RhY2tUcmFjZSk7XG4gICAgfVxuXG4gICAgLy8gTnVtYmVyIDAgaXMgcHJvY2Vzc0NvbmRpdGlvbiBpdHNlbGYsXG4gICAgLy8gTnVtYmVyIDEgaXMgYXNzZXJ0LFxuICAgIC8vIE51bWJlciAyIGlzIHRoZSBjYWxsZXIgZnVuY3Rpb24uXG4gICAgaWYgKHN0YWNrRnVuY3Rpb25zWzJdKSB7XG4gICAgICBjb21wbGV0ZUVycm9yTWVzc2FnZSA9IGAke3N0YWNrRnVuY3Rpb25zWzJdfTogJHtjb21wbGV0ZUVycm9yTWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGNvbXBsZXRlRXJyb3JNZXNzYWdlICs9IGVycm9yTWVzc2FnZTtcbiAgICByZXR1cm4gY29tcGxldGVFcnJvck1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGJvb2xlYW4gcGFzc2VkIHRvIGl0IGV2YWx1YXRlcyB0byBmYWxzZS5cbiAqIFRvIGJlIHVzZWQgbGlrZSB0aGlzOlxuICogXHRcdGFzc2VydChteURhdGUgIT09IHVuZGVmaW5lZCwgXCJEYXRlIGNhbm5vdCBiZSB1bmRlZmluZWQuXCIpO1xuICogQGFwaSBwdWJsaWNcbiAqIEBtZXRob2QgYXNzZXJ0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGNvbnN0IGVycm9yID0gcHJvY2Vzc0NvbmRpdGlvbihjb25kaXRpb24sIGVycm9yTWVzc2FnZSk7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIExvZ3MgYSB3YXJuaW5nIGlmIHRoZSBib29sZWFuIHBhc3NlZCB0byBpdCBldmFsdWF0ZXMgdG8gZmFsc2UuXG4gKiBUbyBiZSB1c2VkIGxpa2UgdGhpczpcbiAqIFx0XHRhc3NlcnQud2FybihteURhdGUgIT09IHVuZGVmaW5lZCwgXCJObyBkYXRlIHByb3ZpZGVkLlwiKTtcbiAqIEBhcGkgcHVibGljXG4gKiBAbWV0aG9kIHdhcm5cbiAqIEBwYXJhbSAge0Jvb2xlYW59IGNvbmRpdGlvbiAtIFJlc3VsdCBvZiB0aGUgZXZhbHVhdGVkIGNvbmRpdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBNZXNzYWdlIGV4cGxhaW5pZyB0aGUgZXJyb3IgaW4gY2FzZSBpdCBpcyB0aHJvd25cbiAqIEByZXR1cm4gdm9pZFxuICovXG5hc3NlcnQud2FybiA9IGZ1bmN0aW9uIHdhcm4oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpIHtcbiAgY29uc3QgZXJyb3IgPSBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKTtcbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhc3NlcnQ7XG4iXSwiZmlsZSI6ImFzc2VydC5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9\n","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nmodule.exports = Array.isArray || function _isArray(val) {\n return (val != null &&\n val.length >= 0 &&\n Object.prototype.toString.call(val) === '[object Array]');\n};\n","/**\n * An optimized, private array `slice` implementation.\n *\n * @private\n * @param {Arguments|Array} args The array or arguments object to consider.\n * @param {Number} [from=0] The array index to slice from, inclusive.\n * @param {Number} [to=args.length] The array index to slice to, exclusive.\n * @return {Array} A new, sliced array.\n * @example\n *\n * _slice([1, 2, 3, 4, 5], 1, 3); //=> [2, 3]\n *\n * var firstThreeArgs = function(a, b, c, d) {\n * return _slice(arguments, 0, 3);\n * };\n * firstThreeArgs(1, 2, 3, 4); //=> [1, 2, 3]\n */\nmodule.exports = function _slice(args, from, to) {\n switch (arguments.length) {\n case 1: return _slice(args, 0, args.length);\n case 2: return _slice(args, from, args.length);\n default:\n var list = [];\n var idx = 0;\n var len = Math.max(0, Math.min(args.length, to) - from);\n while (idx < len) {\n list[idx] = args[from + idx];\n idx += 1;\n }\n return list;\n }\n};\n","var _isArray = require('./_isArray');\nvar _slice = require('./_slice');\n\n\n/**\n * Similar to hasMethod, this checks whether a function has a [methodname]\n * function. If it isn't an array it will execute that function otherwise it\n * will default to the ramda implementation.\n *\n * @private\n * @param {Function} fn ramda implemtation\n * @param {String} methodname property to check for a custom implementation\n * @return {Object} Whatever the return value of the method is.\n */\nmodule.exports = function _checkForMethod(methodname, fn) {\n return function() {\n var length = arguments.length;\n if (length === 0) {\n return fn();\n }\n var obj = arguments[length - 1];\n return (_isArray(obj) || typeof obj[methodname] !== 'function') ?\n fn.apply(this, arguments) :\n obj[methodname].apply(obj, _slice(arguments, 0, length - 1));\n };\n};\n","module.exports = function _isPlaceholder(a) {\n return a != null &&\n typeof a === 'object' &&\n a['@@functional/placeholder'] === true;\n};\n","var _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n};\n","var _curry1 = require('./_curry1');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2\n : _curry1(function(_b) { return fn(a, _b); });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2\n : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b); })\n : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b); })\n : fn(a, b);\n }\n };\n};\n","var _curry1 = require('./_curry1');\nvar _curry2 = require('./_curry2');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3\n : _curry2(function(_b, _c) { return fn(a, _b, _c); });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3\n : _isPlaceholder(a) ? _curry2(function(_a, _c) { return fn(_a, b, _c); })\n : _isPlaceholder(b) ? _curry2(function(_b, _c) { return fn(a, _b, _c); })\n : _curry1(function(_c) { return fn(a, b, _c); });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3\n : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function(_a, _b) { return fn(_a, _b, c); })\n : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function(_a, _c) { return fn(_a, b, _c); })\n : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function(_b, _c) { return fn(a, _b, _c); })\n : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b, c); })\n : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b, c); })\n : _isPlaceholder(c) ? _curry1(function(_c) { return fn(a, b, _c); })\n : fn(a, b, c);\n }\n };\n};\n","var _checkForMethod = require('./internal/_checkForMethod');\nvar _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns the elements of the given list or string (or object with a `slice`\n * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).\n *\n * Dispatches to the `slice` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.4\n * @category List\n * @sig Number -> Number -> [a] -> [a]\n * @sig Number -> Number -> String -> String\n * @param {Number} fromIndex The start index (inclusive).\n * @param {Number} toIndex The end index (exclusive).\n * @param {*} list\n * @return {*}\n * @example\n *\n * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']\n * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c']\n * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(0, 3, 'ramda'); //=> 'ram'\n */\nmodule.exports = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) {\n return Array.prototype.slice.call(list, fromIndex, toIndex);\n}));\n","var _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns the result of \"setting\" the portion of the given data structure\n * focused by the given lens to the result of applying the given function to\n * the focused value.\n *\n * @func\n * @memberOf R\n * @since v0.16.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig Lens s a -> (a -> a) -> s -> s\n * @param {Lens} lens\n * @param {*} v\n * @param {*} x\n * @return {*}\n * @see R.prop, R.lensIndex, R.lensProp\n * @example\n *\n * var headLens = R.lensIndex(0);\n *\n * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']\n */\nmodule.exports = (function() {\n // `Identity` is a functor that holds a single value, where `map` simply\n // transforms the held value with the provided function.\n var Identity = function(x) {\n return {value: x, map: function(f) { return Identity(f(x)); }};\n };\n\n return _curry3(function over(lens, f, x) {\n // The value returned by the getter function is first transformed with `f`,\n // then set as the value of an `Identity`. This is then mapped over with the\n // setter function of the lens.\n return lens(function(y) { return Identity(f(y)); })(x).value;\n });\n}());\n","var _curry1 = require('./internal/_curry1');\n\n\n/**\n * Returns a function that always returns the given value. Note that for\n * non-primitives the value returned is a reference to the original value.\n *\n * This function is known as `const`, `constant`, or `K` (for K combinator) in\n * other languages and libraries.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig a -> (* -> a)\n * @param {*} val The value to wrap in a function\n * @return {Function} A Function :: * -> val.\n * @example\n *\n * var t = R.always('Tee');\n * t(); //=> 'Tee'\n */\nmodule.exports = _curry1(function always(val) {\n return function() {\n return val;\n };\n});\n","var _curry3 = require('./internal/_curry3');\nvar always = require('./always');\nvar over = require('./over');\n\n\n/**\n * Returns the result of \"setting\" the portion of the given data structure\n * focused by the given lens to the given value.\n *\n * @func\n * @memberOf R\n * @since v0.16.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig Lens s a -> a -> s -> s\n * @param {Lens} lens\n * @param {*} v\n * @param {*} x\n * @return {*}\n * @see R.prop, R.lensIndex, R.lensProp\n * @example\n *\n * var xLens = R.lensProp('x');\n *\n * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}\n * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2}\n */\nmodule.exports = _curry3(function set(lens, v, x) {\n return over(lens, always(v), x);\n});\n","module.exports = function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0: return function() { return fn.apply(this, arguments); };\n case 1: return function(a0) { return fn.apply(this, arguments); };\n case 2: return function(a0, a1) { return fn.apply(this, arguments); };\n case 3: return function(a0, a1, a2) { return fn.apply(this, arguments); };\n case 4: return function(a0, a1, a2, a3) { return fn.apply(this, arguments); };\n case 5: return function(a0, a1, a2, a3, a4) { return fn.apply(this, arguments); };\n case 6: return function(a0, a1, a2, a3, a4, a5) { return fn.apply(this, arguments); };\n case 7: return function(a0, a1, a2, a3, a4, a5, a6) { return fn.apply(this, arguments); };\n case 8: return function(a0, a1, a2, a3, a4, a5, a6, a7) { return fn.apply(this, arguments); };\n case 9: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8) { return fn.apply(this, arguments); };\n case 10: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { return fn.apply(this, arguments); };\n default: throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n};\n","module.exports = function _pipe(f, g) {\n return function() {\n return g.call(this, f.apply(this, arguments));\n };\n};\n","module.exports = (function() {\n function XWrap(fn) {\n this.f = fn;\n }\n XWrap.prototype['@@transducer/init'] = function() {\n throw new Error('init not implemented on XWrap');\n };\n XWrap.prototype['@@transducer/result'] = function(acc) { return acc; };\n XWrap.prototype['@@transducer/step'] = function(acc, x) {\n return this.f(acc, x);\n };\n\n return function _xwrap(fn) { return new XWrap(fn); };\n}());\n","var _arity = require('./internal/_arity');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Creates a function that is bound to a context.\n * Note: `R.bind` does not provide the additional argument-binding capabilities of\n * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\n *\n * @func\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @category Object\n * @sig (* -> *) -> {*} -> (* -> *)\n * @param {Function} fn The function to bind to context\n * @param {Object} thisObj The context to bind `fn` to\n * @return {Function} A function that will execute in the context of `thisObj`.\n * @see R.partial\n * @example\n *\n * var log = R.bind(console.log, console);\n * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}\n * // logs {a: 2}\n */\nmodule.exports = _curry2(function bind(fn, thisObj) {\n return _arity(fn.length, function() {\n return fn.apply(thisObj, arguments);\n });\n});\n","module.exports = function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n};\n","var _curry1 = require('./internal/_curry1');\nvar _isArray = require('./internal/_isArray');\nvar _isString = require('./internal/_isString');\n\n\n/**\n * Tests whether or not an object is similar to an array.\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Type\n * @category List\n * @sig * -> Boolean\n * @param {*} x The object to test.\n * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.\n * @example\n *\n * R.isArrayLike([]); //=> true\n * R.isArrayLike(true); //=> false\n * R.isArrayLike({}); //=> false\n * R.isArrayLike({length: 10}); //=> false\n * R.isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true\n */\nmodule.exports = _curry1(function isArrayLike(x) {\n if (_isArray(x)) { return true; }\n if (!x) { return false; }\n if (typeof x !== 'object') { return false; }\n if (_isString(x)) { return false; }\n if (x.nodeType === 1) { return !!x.length; }\n if (x.length === 0) { return true; }\n if (x.length > 0) {\n return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);\n }\n return false;\n});\n","var _xwrap = require('./_xwrap');\nvar bind = require('../bind');\nvar isArrayLike = require('../isArrayLike');\n\n\nmodule.exports = (function() {\n function _arrayReduce(xf, acc, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n acc = xf['@@transducer/step'](acc, list[idx]);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n idx += 1;\n }\n return xf['@@transducer/result'](acc);\n }\n\n function _iterableReduce(xf, acc, iter) {\n var step = iter.next();\n while (!step.done) {\n acc = xf['@@transducer/step'](acc, step.value);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n step = iter.next();\n }\n return xf['@@transducer/result'](acc);\n }\n\n function _methodReduce(xf, acc, obj) {\n return xf['@@transducer/result'](obj.reduce(bind(xf['@@transducer/step'], xf), acc));\n }\n\n var symIterator = (typeof Symbol !== 'undefined') ? Symbol.iterator : '@@iterator';\n return function _reduce(fn, acc, list) {\n if (typeof fn === 'function') {\n fn = _xwrap(fn);\n }\n if (isArrayLike(list)) {\n return _arrayReduce(fn, acc, list);\n }\n if (typeof list.reduce === 'function') {\n return _methodReduce(fn, acc, list);\n }\n if (list[symIterator] != null) {\n return _iterableReduce(fn, acc, list[symIterator]());\n }\n if (typeof list.next === 'function') {\n return _iterableReduce(fn, acc, list);\n }\n throw new TypeError('reduce: list must be array or iterable');\n };\n}());\n","var _curry3 = require('./internal/_curry3');\nvar _reduce = require('./internal/_reduce');\n\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * The iterator function receives two values: *(acc, value)*. It may use\n * `R.reduced` to shortcut the iteration.\n *\n * Note: `R.reduce` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description\n *\n * Dispatches to the `reduce` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.reduced, R.addIndex\n * @example\n *\n * var numbers = [1, 2, 3];\n * var plus = (a, b) => a + b;\n *\n * R.reduce(plus, 10, numbers); //=> 16\n */\nmodule.exports = _curry3(_reduce);\n","var _checkForMethod = require('./internal/_checkForMethod');\nvar slice = require('./slice');\n\n\n/**\n * Returns all but the first element of the given list or string (or object\n * with a `tail` method).\n *\n * Dispatches to the `slice` method of the first argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig [a] -> [a]\n * @sig String -> String\n * @param {*} list\n * @return {*}\n * @see R.head, R.init, R.last\n * @example\n *\n * R.tail([1, 2, 3]); //=> [2, 3]\n * R.tail([1, 2]); //=> [2]\n * R.tail([1]); //=> []\n * R.tail([]); //=> []\n *\n * R.tail('abc'); //=> 'bc'\n * R.tail('ab'); //=> 'b'\n * R.tail('a'); //=> ''\n * R.tail(''); //=> ''\n */\nmodule.exports = _checkForMethod('tail', slice(1, Infinity));\n","var _arity = require('./internal/_arity');\nvar _pipe = require('./internal/_pipe');\nvar reduce = require('./reduce');\nvar tail = require('./tail');\n\n\n/**\n * Performs left-to-right function composition. The leftmost function may have\n * any arity; the remaining functions must be unary.\n *\n * In some libraries this function is named `sequence`.\n *\n * **Note:** The result of pipe is not automatically curried.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)\n * @param {...Function} functions\n * @return {Function}\n * @see R.compose\n * @example\n *\n * var f = R.pipe(Math.pow, R.negate, R.inc);\n *\n * f(3, 4); // -(3^4) + 1\n */\nmodule.exports = function pipe() {\n if (arguments.length === 0) {\n throw new Error('pipe requires at least one argument');\n }\n return _arity(arguments[0].length,\n reduce(_pipe, arguments[0], tail(arguments)));\n};\n","/**\n * Private `concat` function to merge two array-like objects.\n *\n * @private\n * @param {Array|Arguments} [set1=[]] An array-like object.\n * @param {Array|Arguments} [set2=[]] An array-like object.\n * @return {Array} A new, merged array.\n * @example\n *\n * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]\n */\nmodule.exports = function _concat(set1, set2) {\n set1 = set1 || [];\n set2 = set2 || [];\n var idx;\n var len1 = set1.length;\n var len2 = set2.length;\n var result = [];\n\n idx = 0;\n while (idx < len1) {\n result[result.length] = set1[idx];\n idx += 1;\n }\n idx = 0;\n while (idx < len2) {\n result[result.length] = set2[idx];\n idx += 1;\n }\n return result;\n};\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a new list with the given element at the front, followed by the\n * contents of the list.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The item to add to the head of the output list.\n * @param {Array} list The array to add to the tail of the output list.\n * @return {Array} A new array.\n * @see R.append\n * @example\n *\n * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']\n */\nmodule.exports = _curry2(function prepend(el, list) {\n return _concat([el], list);\n});\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a function that when supplied an object returns the indicated\n * property of that object, if it exists.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig s -> {s: a} -> a | Undefined\n * @param {String} p The property name\n * @param {Object} obj The object to query\n * @return {*} The value at `obj.p`.\n * @see R.path\n * @example\n *\n * R.prop('x', {x: 100}); //=> 100\n * R.prop('x', {}); //=> undefined\n */\nmodule.exports = _curry2(function prop(p, obj) { return obj[p]; });\n","module.exports = function _isTransformer(obj) {\n return typeof obj['@@transducer/step'] === 'function';\n};\n","var _isArray = require('./_isArray');\nvar _isTransformer = require('./_isTransformer');\nvar _slice = require('./_slice');\n\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with [methodname], it will execute that\n * function (functor case). Otherwise, if it is a transformer, uses transducer\n * [xf] to return a new transformer (transducer case). Otherwise, it will\n * default to executing [fn].\n *\n * @private\n * @param {String} methodname property to check for a custom implementation\n * @param {Function} xf transducer to initialize if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\nmodule.exports = function _dispatchable(methodname, xf, fn) {\n return function() {\n var length = arguments.length;\n if (length === 0) {\n return fn();\n }\n var obj = arguments[length - 1];\n if (!_isArray(obj)) {\n var args = _slice(arguments, 0, length - 1);\n if (typeof obj[methodname] === 'function') {\n return obj[methodname].apply(obj, args);\n }\n if (_isTransformer(obj)) {\n var transducer = xf.apply(null, args);\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n};\n","module.exports = function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n};\n","module.exports = {\n init: function() {\n return this.xf['@@transducer/init']();\n },\n result: function(result) {\n return this.xf['@@transducer/result'](result);\n }\n};\n","var _curry2 = require('./_curry2');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XMap(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XMap.prototype['@@transducer/init'] = _xfBase.init;\n XMap.prototype['@@transducer/result'] = _xfBase.result;\n XMap.prototype['@@transducer/step'] = function(result, input) {\n return this.xf['@@transducer/step'](result, this.f(input));\n };\n\n return _curry2(function _xmap(f, xf) { return new XMap(f, xf); });\n}());\n","var _arity = require('./_arity');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curryN(length, received, fn) {\n return function() {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length &&\n (!_isPlaceholder(received[combinedIdx]) ||\n argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n }\n combinedIdx += 1;\n }\n return left <= 0 ? fn.apply(this, combined)\n : _arity(left, _curryN(length, combined, fn));\n };\n};\n","var _arity = require('./internal/_arity');\nvar _curry1 = require('./internal/_curry1');\nvar _curry2 = require('./internal/_curry2');\nvar _curryN = require('./internal/_curryN');\n\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value `R.__` may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is `R.__`, the\n * following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * var sumArgs = (...args) => R.sum(args);\n *\n * var curriedAddFourNumbers = R.curryN(4, sumArgs);\n * var f = curriedAddFourNumbers(1, 2);\n * var g = f(3);\n * g(4); //=> 10\n */\nmodule.exports = _curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\n","module.exports = function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n};\n","var _has = require('./_has');\n\n\nmodule.exports = (function() {\n var toString = Object.prototype.toString;\n return toString.call(arguments) === '[object Arguments]' ?\n function _isArguments(x) { return toString.call(x) === '[object Arguments]'; } :\n function _isArguments(x) { return _has('callee', x); };\n}());\n","var _curry1 = require('./internal/_curry1');\nvar _has = require('./internal/_has');\nvar _isArguments = require('./internal/_isArguments');\n\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nmodule.exports = (function() {\n // cover IE < 9 keys issues\n var hasEnumBug = !({toString: null}).propertyIsEnumerable('toString');\n var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n // Safari bug\n var hasArgsEnumBug = (function() {\n 'use strict';\n return arguments.propertyIsEnumerable('length');\n }());\n\n var contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n };\n\n return typeof Object.keys === 'function' && !hasArgsEnumBug ?\n _curry1(function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n }) :\n _curry1(function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _map = require('./internal/_map');\nvar _reduce = require('./internal/_reduce');\nvar _xmap = require('./internal/_xmap');\nvar curryN = require('./curryN');\nvar keys = require('./keys');\n\n\n/**\n * Takes a function and\n * a [functor](https://github.com/fantasyland/fantasy-land#functor),\n * applies the function to each of the functor's values, and returns\n * a functor of the same shape.\n *\n * Ramda provides suitable `map` implementations for `Array` and `Object`,\n * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.\n *\n * Dispatches to the `map` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * Also treats functions as functors and will compose them together.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Functor f => (a -> b) -> f a -> f b\n * @param {Function} fn The function to be called on every element of the input `list`.\n * @param {Array} list The list to be iterated over.\n * @return {Array} The new list.\n * @see R.transduce, R.addIndex\n * @example\n *\n * var double = x => x * 2;\n *\n * R.map(double, [1, 2, 3]); //=> [2, 4, 6]\n *\n * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}\n */\nmodule.exports = _curry2(_dispatchable('map', _xmap, function map(fn, functor) {\n switch (Object.prototype.toString.call(functor)) {\n case '[object Function]':\n return curryN(functor.length, function() {\n return fn.call(this, functor.apply(this, arguments));\n });\n case '[object Object]':\n return _reduce(function(acc, key) {\n acc[key] = fn(functor[key]);\n return acc;\n }, {}, keys(functor));\n default:\n return _map(fn, functor);\n }\n}));\n","var _curry2 = require('./internal/_curry2');\nvar map = require('./map');\n\n\n/**\n * Returns a lens for the given getter and setter functions. The getter \"gets\"\n * the value of the focus; the setter \"sets\" the value of the focus. The setter\n * should not mutate the data structure.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig (s -> a) -> ((a, s) -> s) -> Lens s a\n * @param {Function} getter\n * @param {Function} setter\n * @return {Lens}\n * @see R.view, R.set, R.over, R.lensIndex, R.lensProp\n * @example\n *\n * var xLens = R.lens(R.prop('x'), R.assoc('x'));\n *\n * R.view(xLens, {x: 1, y: 2}); //=> 1\n * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}\n * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2}\n */\nmodule.exports = _curry2(function lens(getter, setter) {\n return function(toFunctorFn) {\n return function(target) {\n return map(\n function(focus) {\n return setter(focus, target);\n },\n toFunctorFn(getter(target))\n );\n };\n };\n});\n","var _curry1 = require('./internal/_curry1');\nvar curryN = require('./curryN');\n\n\n/**\n * Returns a curried equivalent of the provided function. The curried function\n * has two unusual capabilities. First, its arguments needn't be provided one\n * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value `R.__` may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is `R.__`, the\n * following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (* -> a) -> (* -> a)\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curryN\n * @example\n *\n * var addFourNumbers = (a, b, c, d) => a + b + c + d;\n *\n * var curriedAddFourNumbers = R.curry(addFourNumbers);\n * var f = curriedAddFourNumbers(1, 2);\n * var g = f(3);\n * g(4); //=> 10\n */\nmodule.exports = _curry1(function curry(fn) {\n return curryN(fn.length, fn);\n});\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n * @module lib/either\n */\nmodule.exports = Either\n\n// -- Aliases ----------------------------------------------------------\nvar clone = Object.create\nvar unimplemented = function(){ throw new Error('Not implemented.') }\nvar noop = function(){ return this }\n\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * The `Either(a, b)` structure represents the logical disjunction between `a`\n * and `b`. In other words, `Either` may contain either a value of type `a` or\n * a value of type `b`, at any given time. This particular implementation is\n * biased on the right value (`b`), thus projections will take the right value\n * over the left one.\n *\n * This class models two different cases: `Left a` and `Right b`, and can hold\n * one of the cases at any given time. The projections are, none the less,\n * biased for the `Right` case, thus a common use case for this structure is to\n * hold the results of computations that may fail, when you want to store\n * additional information on the failure (instead of throwing an exception).\n *\n * Furthermore, the values of `Either(a, b)` can be combined and manipulated by\n * using the expressive monadic operations. This allows safely sequencing\n * operations that may fail, and safely composing values that you don't know\n * whether they're present or not, failing early (returning a `Left a`) if any\n * of the operations fail.\n *\n * While this class can certainly model input validations, the [Validation][]\n * structure lends itself better to that use case, since it can naturally\n * aggregate failures — monads shortcut on the first failure.\n *\n * [Validation]: https://github.com/folktale/data.validation\n *\n *\n * @class\n * @summary\n * Either[α, β] <: Applicative[β]\n * , Functor[β]\n * , Chain[β]\n * , Show\n * , Eq\n */\nfunction Either() { }\n\nLeft.prototype = clone(Either.prototype)\nfunction Left(a) {\n this.value = a\n}\n\nRight.prototype = clone(Either.prototype)\nfunction Right(a) {\n this.value = a\n}\n\n// -- Constructors -----------------------------------------------------\n\n/**\n * Constructs a new `Either[α, β]` structure holding a `Left` value. This\n * usually represents a failure due to the right-bias of this structure.\n *\n * @summary a → Either[α, β]\n */\nEither.Left = function(a) {\n return new Left(a)\n}\nEither.prototype.Left = Either.Left\n\n/**\n * Constructs a new `Either[α, β]` structure holding a `Right` value. This\n * usually represents a successful value due to the right bias of this\n * structure.\n *\n * @summary β → Either[α, β]\n */\nEither.Right = function(a) {\n return new Right(a)\n}\nEither.prototype.Right = Either.Right\n\n\n// -- Conversions ------------------------------------------------------\n\n/**\n * Constructs a new `Either[α, β]` structure from a nullable type.\n *\n * Takes the `Left` case if the value is `null` or `undefined`. Takes the\n * `Right` case otherwise.\n *\n * @summary α → Either[α, α]\n */\nEither.fromNullable = function(a) {\n return a != null? new Right(a)\n : /* otherwise */ new Left(a)\n}\nEither.prototype.fromNullable = Either.fromNullable\n\n/**\n * Constructs a new `Either[α, β]` structure from a `Validation[α, β]` type.\n *\n * @summary Validation[α, β] → Either[α, β]\n */\nEither.fromValidation = function(a) {\n return a.fold(Either.Left, Either.Right)\n}\n\n/**\n * Executes a synchronous computation that may throw and converts it to an\n * Either type.\n *\n * @summary (α₁, α₂, ..., αₙ -> β :: throws γ) -> (α₁, α₂, ..., αₙ -> Either[γ, β])\n */\nEither.try = function(f) {\n return function() {\n try {\n return new Right(f.apply(null, arguments))\n } catch(e) {\n return new Left(e)\n }\n }\n}\n\n\n// -- Predicates -------------------------------------------------------\n\n/**\n * True if the `Either[α, β]` contains a `Left` value.\n *\n * @summary Boolean\n */\nEither.prototype.isLeft = false\nLeft.prototype.isLeft = true\n\n/**\n * True if the `Either[α, β]` contains a `Right` value.\n *\n * @summary Boolean\n */\nEither.prototype.isRight = false\nRight.prototype.isRight = true\n\n\n// -- Applicative ------------------------------------------------------\n\n/**\n * Creates a new `Either[α, β]` instance holding the `Right` value `b`.\n *\n * `b` can be any value, including `null`, `undefined` or another\n * `Either[α, β]` structure.\n *\n * @summary β → Either[α, β]\n */\nEither.of = function(a) {\n return new Right(a)\n}\nEither.prototype.of = Either.of\n\n\n/**\n * Applies the function inside the `Right` case of the `Either[α, β]` structure\n * to another applicative type.\n *\n * The `Either[α, β]` should contain a function value, otherwise a `TypeError`\n * is thrown.\n *\n * @method\n * @summary (@Either[α, β → γ], f:Applicative[_]) => f[β] → f[γ]\n */\nEither.prototype.ap = unimplemented\n\nLeft.prototype.ap = function(b) {\n return this\n}\n\nRight.prototype.ap = function(b) {\n return b.map(this.value)\n}\n\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the `Right` value of the `Either[α, β]` structure using a regular\n * unary function.\n *\n * @method\n * @summary (@Either[α, β]) => (β → γ) → Either[α, γ]\n */\nEither.prototype.map = unimplemented\nLeft.prototype.map = noop\n\nRight.prototype.map = function(f) {\n return this.of(f(this.value))\n}\n\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the `Right` value of the `Either[α, β]` structure using an unary\n * function to monads.\n *\n * @method\n * @summary (@Either[α, β], m:Monad[_]) => (β → m[γ]) → m[γ]\n */\nEither.prototype.chain = unimplemented\nLeft.prototype.chain = noop\n\nRight.prototype.chain = function(f) {\n return f(this.value)\n}\n\n// -- Semigroup ----------------------------------------------------------\n\n/**\n * Concats the `Right` value of the `Either[α, β]` structure with another `Right` or keeps the `Left` on either side\n *\n * @method\n * @summary (@Either[α, m:Monoid]) => Either[β, m] → Either[α, m]\n */\nEither.prototype.concat = unimplemented\n\nLeft.prototype.concat = function(other) {\n return this\n}\n\nRight.prototype.concat = function(other) {\n var that = this\n return other.fold(function(_){\n return other\n },\n function(y) {\n return that.Right(that.value.concat(y))\n })\n}\n\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Either[α, β]` structure.\n *\n * @method\n * @summary (@Either[α, β]) => Void → String\n */\nEither.prototype.toString = unimplemented\n\nLeft.prototype.toString = function() {\n return 'Either.Left(' + this.value + ')'\n}\n\nRight.prototype.toString = function() {\n return 'Either.Right(' + this.value + ')'\n}\n\n\n// -- Eq ---------------------------------------------------------------\n\n/**\n * Tests if an `Either[α, β]` structure is equal to another `Either[α, β]`\n * structure.\n *\n * @method\n * @summary (@Either[α, β]) => Either[α, β] → Boolean\n */\nEither.prototype.isEqual = unimplemented\n\nLeft.prototype.isEqual = function(a) {\n return a.isLeft && (a.value === this.value)\n}\n\nRight.prototype.isEqual = function(a) {\n return a.isRight && (a.value === this.value)\n}\n\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Extracts the `Right` value out of the `Either[α, β]` structure, if it\n * exists. Otherwise throws a `TypeError`.\n *\n * @method\n * @summary (@Either[α, β]) => Void → β :: partial, throws\n * @see {@link module:lib/either~Either#getOrElse} — A getter that can handle failures.\n * @see {@link module:lib/either~Either#merge} — The convergence of both values.\n * @throws {TypeError} if the structure has no `Right` value.\n */\nEither.prototype.get = unimplemented\n\nLeft.prototype.get = function() {\n throw new TypeError(\"Can't extract the value of a Left(a).\")\n}\n\nRight.prototype.get = function() {\n return this.value\n}\n\n\n/**\n * Extracts the `Right` value out of the `Either[α, β]` structure. If the\n * structure doesn't have a `Right` value, returns the given default.\n *\n * @method\n * @summary (@Either[α, β]) => β → β\n */\nEither.prototype.getOrElse = unimplemented\n\nLeft.prototype.getOrElse = function(a) {\n return a\n}\n\nRight.prototype.getOrElse = function(_) {\n return this.value\n}\n\n\n/**\n * Transforms a `Left` value into a new `Either[α, β]` structure. Does nothing\n * if the structure contain a `Right` value.\n *\n * @method\n * @summary (@Either[α, β]) => (α → Either[γ, β]) → Either[γ, β]\n */\nEither.prototype.orElse = unimplemented\nRight.prototype.orElse = noop\n\nLeft.prototype.orElse = function(f) {\n return f(this.value)\n}\n\n\n/**\n * Returns the value of whichever side of the disjunction that is present.\n *\n * @summary (@Either[α, α]) => Void → α\n */\nEither.prototype.merge = function() {\n return this.value\n}\n\n\n// -- Folds and Extended Transformations -------------------------------\n\n/**\n * Applies a function to each case in this data structure.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ), (β → γ) → γ\n */\nEither.prototype.fold = unimplemented\n\nLeft.prototype.fold = function(f, _) {\n return f(this.value)\n}\n\nRight.prototype.fold = function(_, g) {\n return g(this.value)\n}\n\n/**\n * Catamorphism.\n * \n * @method\n * @summary (@Either[α, β]) => { Left: α → γ, Right: β → γ } → γ\n */\nEither.prototype.cata = unimplemented\n\nLeft.prototype.cata = function(pattern) {\n return pattern.Left(this.value)\n}\n\nRight.prototype.cata = function(pattern) {\n return pattern.Right(this.value)\n}\n\n\n/**\n * Swaps the disjunction values.\n *\n * @method\n * @summary (@Either[α, β]) => Void → Either[β, α]\n */\nEither.prototype.swap = unimplemented\n\nLeft.prototype.swap = function() {\n return this.Right(this.value)\n}\n\nRight.prototype.swap = function() {\n return this.Left(this.value)\n}\n\n\n/**\n * Maps both sides of the disjunction.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ), (β → δ) → Either[γ, δ]\n */\nEither.prototype.bimap = unimplemented\n\nLeft.prototype.bimap = function(f, _) {\n return this.Left(f(this.value))\n}\n\nRight.prototype.bimap = function(_, g) {\n return this.Right(g(this.value))\n}\n\n\n/**\n * Maps the left side of the disjunction.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ) → Either[γ, β]\n */\nEither.prototype.leftMap = unimplemented\nRight.prototype.leftMap = noop\n\nLeft.prototype.leftMap = function(f) {\n return this.Left(f(this.value))\n}\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = require('./either')","/* eslint-disable new-cap */\n\nimport Immutable from \"seamless-immutable\";\nimport { curry, lens, prop, prepend, over, set, pipe } from \"ramda\";\nimport Either from \"data.either\";\n\nexport const updateAt = curry((keyArray, newVal, obj) => {\n const deepNewVal = keyArray.reduceRight(\n (result, key) => ({ [key]: result })\n , newVal\n );\n\n return Immutable(obj).merge(deepNewVal, { deep: true });\n});\n\n// State lenses\nexport const StateLenses = {\n fieldTypes: lens(prop(\"fieldTypes\"), updateAt([\"fieldTypes\"])),\n fieldsState: lens(prop(\"fieldsState\"), updateAt([\"fieldsState\"])),\n fieldsStateHistory: lens(prop(\"fieldsStateHistory\"), updateAt([\"fieldsStateHistory\"])),\n};\n\n// _ => String\nexport const createId = _ =>\n (Date.now() + Math.random()).toString();\n\n// State -> [fieldsState] -> State\nexport const pushHistoryState = curry((state, newHistoryState) => pipe(\n // Add current state to history\n over(StateLenses.fieldsStateHistory, prepend(state.fieldsState)),\n // Make new State the current\n set(StateLenses.fieldsState, newHistoryState)\n)(state));\n\n\n// State -> State\nexport const hideConfigs = state =>\n set(\n StateLenses.fieldsState,\n state.fieldsState.map(s => Object.assign({}, s, { configShowing: false })),\n state\n );\n\n\n// String -> String -> Object -> Either String Object\nexport const propertyTypeCheck = curry((propertyName, type, obj) =>\n typeof obj[propertyName] === type\n ? Either.Right(obj)\n : Either.Left(`Property '${propertyName}' cannot be of type ${typeof obj[propertyName]}`)\n);\n\n// Checks that a field has its essential properties\n// Object -> Either String Object\nexport const validateField = fieldState =>\n Either.fromNullable(fieldState)\n .leftMap(fs => `A field State cannot be empty ${typeof fs}`)\n .chain(propertyTypeCheck(\"required\", \"boolean\"))\n .chain(propertyTypeCheck(\"configShowing\", \"boolean\"))\n .chain(propertyTypeCheck(\"id\", \"string\"));\n","import { StateLenses } from \"./utils\";\nimport { set, over, slice, pipe } from \"ramda\";\n\nconst lastHistoryState = state =>\n state.fieldsStateHistory[0] || [];\n\nconst undo = (state, _) => pipe(\n // Make last history last state the current one\n set(StateLenses.fieldsState, lastHistoryState(state)),\n // Remove last history state from the history array\n over(StateLenses.fieldsStateHistory, slice(1, Infinity))\n)(state);\n\nexport default undo;\n","module.exports = function _identity(x) { return x; };\n","var _curry1 = require('./internal/_curry1');\nvar _identity = require('./internal/_identity');\n\n\n/**\n * A function that does nothing but return the parameter supplied to it. Good\n * as a default or placeholder function.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig a -> a\n * @param {*} x The value to return.\n * @return {*} The input value, `x`.\n * @example\n *\n * R.identity(1); //=> 1\n *\n * var obj = {};\n * R.identity(obj) === obj; //=> true\n */\nmodule.exports = _curry1(_identity);\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Retrieve the value at a given path.\n *\n * @func\n * @memberOf R\n * @since v0.2.0\n * @category Object\n * @sig [String] -> {k: v} -> v | Undefined\n * @param {Array} path The path to use.\n * @param {Object} obj The object to retrieve the nested property from.\n * @return {*} The data at `path`.\n * @see R.prop\n * @example\n *\n * R.path(['a', 'b'], {a: {b: 2}}); //=> 2\n * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined\n */\nmodule.exports = _curry2(function path(paths, obj) {\n var val = obj;\n var idx = 0;\n while (idx < paths.length) {\n if (val == null) {\n return;\n }\n val = val[paths[idx]];\n idx += 1;\n }\n return val;\n});\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\nvar _reduce = require('./internal/_reduce');\nvar map = require('./map');\n\n\n/**\n * ap applies a list of functions to a list of values.\n *\n * Dispatches to the `ap` method of the second argument, if present. Also\n * treats curried functions as applicatives.\n *\n * @func\n * @memberOf R\n * @since v0.3.0\n * @category Function\n * @sig [a -> b] -> [a] -> [b]\n * @sig Apply f => f (a -> b) -> f a -> f b\n * @param {Array} fns An array of functions\n * @param {Array} vs An array of values\n * @return {Array} An array of results of applying each of `fns` to all of `vs` in turn.\n * @example\n *\n * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]\n */\nmodule.exports = _curry2(function ap(applicative, fn) {\n return (\n typeof applicative.ap === 'function' ?\n applicative.ap(fn) :\n typeof applicative === 'function' ?\n function(x) { return applicative(x)(fn(x)); } :\n // else\n _reduce(function(acc, f) { return _concat(acc, map(f, fn)); }, [], applicative)\n );\n});\n","var _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * Similar to `reduce`, except moves through the input list from the right to\n * the left.\n *\n * The iterator function receives two values: *(acc, value)*\n *\n * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a,b -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.addIndex\n * @example\n *\n * var pairs = [ ['a', 1], ['b', 2], ['c', 3] ];\n * var flattenPairs = (acc, pair) => acc.concat(pair);\n *\n * R.reduceRight(flattenPairs, [], pairs); //=> [ 'c', 3, 'b', 2, 'a', 1 ]\n */\nmodule.exports = _curry3(function reduceRight(fn, acc, list) {\n var idx = list.length - 1;\n while (idx >= 0) {\n acc = fn(acc, list[idx]);\n idx -= 1;\n }\n return acc;\n});\n","var _curry2 = require('./internal/_curry2');\nvar ap = require('./ap');\nvar map = require('./map');\nvar prepend = require('./prepend');\nvar reduceRight = require('./reduceRight');\n\n\n/**\n * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)\n * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an\n * Applicative of Traversable.\n *\n * Dispatches to the `sequence` method of the second argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)\n * @param {Function} of\n * @param {*} traversable\n * @return {*}\n * @see R.traverse\n * @example\n *\n * R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3])\n * R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()\n *\n * R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]\n * R.sequence(R.of, Nothing()); //=> [Nothing()]\n */\nmodule.exports = _curry2(function sequence(of, traversable) {\n return typeof traversable.sequence === 'function' ?\n traversable.sequence(of) :\n reduceRight(function(acc, x) { return ap(map(prepend, x), acc); },\n of([]),\n traversable);\n});\n","var _curry3 = require('./internal/_curry3');\nvar map = require('./map');\nvar sequence = require('./sequence');\n\n\n/**\n * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning\n * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),\n * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative\n * into an Applicative of Traversable.\n *\n * Dispatches to the `sequence` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)\n * @param {Function} of\n * @param {Function} f\n * @param {*} traversable\n * @return {*}\n * @see R.sequence\n * @example\n *\n * // Returns `Nothing` if the given divisor is `0`\n * safeDiv = n => d => d === 0 ? Nothing() : Just(n / d)\n *\n * R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Just([5, 2.5, 2])\n * R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Nothing\n */\nmodule.exports = _curry3(function traverse(of, f, traversable) {\n return sequence(of, map(f, traversable));\n});\n","module.exports = function _arrayFromIterator(iter) {\n var list = [];\n var next;\n while (!(next = iter.next()).done) {\n list.push(next.value);\n }\n return list;\n};\n","module.exports = function _functionName(f) {\n // String(x => x) evaluates to \"x => x\", so the pattern may not match.\n var match = String(f).match(/^function (\\w*)/);\n return match == null ? '' : match[1];\n};\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns true if its arguments are identical, false otherwise. Values are\n * identical if they reference the same memory. `NaN` is identical to `NaN`;\n * `0` and `-0` are not identical.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> a -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * var o = {};\n * R.identical(o, o); //=> true\n * R.identical(1, 1); //=> true\n * R.identical(1, '1'); //=> false\n * R.identical([], []); //=> false\n * R.identical(0, -0); //=> false\n * R.identical(NaN, NaN); //=> true\n */\nmodule.exports = _curry2(function identical(a, b) {\n // SameValue algorithm\n if (a === b) { // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return a !== 0 || 1 / a === 1 / b;\n } else {\n // Step 6.a: NaN == NaN\n return a !== a && b !== b;\n }\n});\n","var _curry1 = require('./internal/_curry1');\n\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig (* -> {*}) -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n */\nmodule.exports = _curry1(function type(val) {\n return val === null ? 'Null' :\n val === undefined ? 'Undefined' :\n Object.prototype.toString.call(val).slice(8, -1);\n});\n","var _arrayFromIterator = require('./_arrayFromIterator');\nvar _functionName = require('./_functionName');\nvar _has = require('./_has');\nvar identical = require('../identical');\nvar keys = require('../keys');\nvar type = require('../type');\n\n\nmodule.exports = function _equals(a, b, stackA, stackB) {\n if (identical(a, b)) {\n return true;\n }\n\n if (type(a) !== type(b)) {\n return false;\n }\n\n if (a == null || b == null) {\n return false;\n }\n\n if (typeof a.equals === 'function' || typeof b.equals === 'function') {\n return typeof a.equals === 'function' && a.equals(b) &&\n typeof b.equals === 'function' && b.equals(a);\n }\n\n switch (type(a)) {\n case 'Arguments':\n case 'Array':\n case 'Object':\n if (typeof a.constructor === 'function' &&\n _functionName(a.constructor) === 'Promise') {\n return a === b;\n }\n break;\n case 'Boolean':\n case 'Number':\n case 'String':\n if (!(typeof a === typeof b && identical(a.valueOf(), b.valueOf()))) {\n return false;\n }\n break;\n case 'Date':\n if (!identical(a.valueOf(), b.valueOf())) {\n return false;\n }\n break;\n case 'Error':\n return a.name === b.name && a.message === b.message;\n case 'RegExp':\n if (!(a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.sticky === b.sticky &&\n a.unicode === b.unicode)) {\n return false;\n }\n break;\n case 'Map':\n case 'Set':\n if (!_equals(_arrayFromIterator(a.entries()), _arrayFromIterator(b.entries()), stackA, stackB)) {\n return false;\n }\n break;\n case 'Int8Array':\n case 'Uint8Array':\n case 'Uint8ClampedArray':\n case 'Int16Array':\n case 'Uint16Array':\n case 'Int32Array':\n case 'Uint32Array':\n case 'Float32Array':\n case 'Float64Array':\n break;\n case 'ArrayBuffer':\n break;\n default:\n // Values of other types are only equal if identical.\n return false;\n }\n\n var keysA = keys(a);\n if (keysA.length !== keys(b).length) {\n return false;\n }\n\n var idx = stackA.length - 1;\n while (idx >= 0) {\n if (stackA[idx] === a) {\n return stackB[idx] === b;\n }\n idx -= 1;\n }\n\n stackA.push(a);\n stackB.push(b);\n idx = keysA.length - 1;\n while (idx >= 0) {\n var key = keysA[idx];\n if (!(_has(key, b) && _equals(b[key], a[key], stackA, stackB))) {\n return false;\n }\n idx -= 1;\n }\n stackA.pop();\n stackB.pop();\n return true;\n};\n","var _curry2 = require('./internal/_curry2');\nvar _equals = require('./internal/_equals');\n\n\n/**\n * Returns `true` if its arguments are equivalent, `false` otherwise. Handles\n * cyclical data structures.\n *\n * Dispatches symmetrically to the `equals` methods of both arguments, if\n * present.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> b -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * R.equals(1, 1); //=> true\n * R.equals(1, '1'); //=> false\n * R.equals([1, 2, 3], [1, 2, 3]); //=> true\n *\n * var a = {}; a.v = a;\n * var b = {}; b.v = b;\n * R.equals(a, b); //=> true\n */\nmodule.exports = _curry2(function equals(a, b) {\n return _equals(a, b, [], []);\n});\n","/* @flow weak */\n/* eslint-disable new-cap */\nimport { pushHistoryState, createId } from \"./utils\";\nimport { curry, equals, traverse, identity, path } from \"ramda\";\nimport Either from \"data.either\";\n\n// [a] => Either String [a]\nconst isArray = arr =>\n Array.isArray(arr)\n ? Either.Right(arr)\n : Either.Left(`Invalid states sent with importState. Expected Array but received ${typeof arr}`); // eslint-disable-line max-len\n\nconst fieldTypeIsValid = curry((validTypes, field) =>\n validTypes.find(equals(field.type))\n ? Either.Right(field)\n : Either.Left(`Invalid field type ${field.type}`)\n);\n\nconst validFieldTypes = curry((validTypes, fieldsState) =>\n traverse(Either.of, fieldTypeIsValid(validTypes), fieldsState)\n);\n\n\n// [a] -> [a] -> Either String [a]\nconst validateFieldsState = curry((fieldsState, state) =>\n Either.of(fieldsState)\n .chain(isArray)\n .chain(validFieldTypes(state.fieldTypes.map(path([\"info\", \"type\"]))))\n);\n\n\n// Add required properties that are not managed by the field\n// component but by the FormBuilder component itself, so may\n// not be there.\n// [a] => [a]\nconst addRequiredProperties = fieldStates =>\n fieldStates\n .map(s => Object.assign(\n {\n configShowing: false,\n required: false,\n },\n s,\n { id: createId() }\n ));\n\n\n// If there are any problems with the import, the same state\n// will be returned\nexport default (state, { newFieldsState }) =>\n validateFieldsState(newFieldsState, state)\n .map(addRequiredProperties)\n .map(pushHistoryState(state))\n .bimap(console.error, identity)\n .getOrElse(state);\n","module.exports = function _reduced(x) {\n return x && x['@@transducer/reduced'] ? x :\n {\n '@@transducer/value': x,\n '@@transducer/reduced': true\n };\n};\n","var _curry2 = require('./_curry2');\nvar _reduced = require('./_reduced');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XFind(f, xf) {\n this.xf = xf;\n this.f = f;\n this.found = false;\n }\n XFind.prototype['@@transducer/init'] = _xfBase.init;\n XFind.prototype['@@transducer/result'] = function(result) {\n if (!this.found) {\n result = this.xf['@@transducer/step'](result, void 0);\n }\n return this.xf['@@transducer/result'](result);\n };\n XFind.prototype['@@transducer/step'] = function(result, input) {\n if (this.f(input)) {\n this.found = true;\n result = _reduced(this.xf['@@transducer/step'](result, input));\n }\n return result;\n };\n\n return _curry2(function _xfind(f, xf) { return new XFind(f, xf); });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _xfind = require('./internal/_xfind');\n\n\n/**\n * Returns the first element of the list which matches the predicate, or\n * `undefined` if no element matches.\n *\n * Dispatches to the `find` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a -> Boolean) -> [a] -> a | undefined\n * @param {Function} fn The predicate function used to determine if the element is the\n * desired one.\n * @param {Array} list The array to consider.\n * @return {Object} The element found, or `undefined`.\n * @see R.transduce\n * @example\n *\n * var xs = [{a: 1}, {a: 2}, {a: 3}];\n * R.find(R.propEq('a', 2))(xs); //=> {a: 2}\n * R.find(R.propEq('a', 4))(xs); //=> undefined\n */\nmodule.exports = _curry2(_dispatchable('find', _xfind, function find(fn, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n if (fn(list[idx])) {\n return list[idx];\n }\n idx += 1;\n }\n}));\n","'use strict';\n\n\n/**\n * A helper for delaying the execution of a function.\n * @private\n * @summary (Any... -> Any) -> Void\n */\nvar delayed = typeof setImmediate !== 'undefined'? setImmediate\n : typeof process !== 'undefined'? process.nextTick\n : /* otherwise */ setTimeout\n\n/**\n * @module lib/task\n */\nmodule.exports = Task;\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * The `Task[α, β]` structure represents values that depend on time. This\n * allows one to model time-based effects explicitly, such that one can have\n * full knowledge of when they're dealing with delayed computations, latency,\n * or anything that can not be computed immediately.\n *\n * A common use for this structure is to replace the usual Continuation-Passing\n * Style form of programming, in order to be able to compose and sequence\n * time-dependent effects using the generic and powerful monadic operations.\n *\n * @class\n * @summary\n * ((α → Void), (β → Void) → Void), (Void → Void) → Task[α, β]\n *\n * Task[α, β] <: Chain[β]\n * , Monad[β]\n * , Functor[β]\n * , Applicative[β]\n * , Semigroup[β]\n * , Monoid[β]\n * , Show\n */\nfunction Task(computation, cleanup) {\n this.fork = computation;\n\n this.cleanup = cleanup || function() {};\n}\n\n/**\n * Constructs a new `Task[α, β]` containing the single value `β`.\n *\n * `β` can be any value, including `null`, `undefined`, or another\n * `Task[α, β]` structure.\n *\n * @summary β → Task[α, β]\n */\nTask.prototype.of = function _of(b) {\n return new Task(function(_, resolve) {\n return resolve(b);\n });\n};\n\nTask.of = Task.prototype.of;\n\n/**\n * Constructs a new `Task[α, β]` containing the single value `α`.\n *\n * `α` can be any value, including `null`, `undefined`, or another\n * `Task[α, β]` structure.\n *\n * @summary α → Task[α, β]\n */\nTask.prototype.rejected = function _rejected(a) {\n return new Task(function(reject) {\n return reject(a);\n });\n};\n\nTask.rejected = Task.prototype.rejected;\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the successful value of the `Task[α, β]` using a regular unary\n * function.\n *\n * @summary @Task[α, β] => (β → γ) → Task[α, γ]\n */\nTask.prototype.map = function _map(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(a);\n }, function(b) {\n return resolve(f(b));\n });\n }, cleanup);\n};\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the succesful value of the `Task[α, β]` using a function to a\n * monad.\n *\n * @summary @Task[α, β] => (β → Task[α, γ]) → Task[α, γ]\n */\nTask.prototype.chain = function _chain(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(a);\n }, function(b) {\n return f(b).fork(reject, resolve);\n });\n }, cleanup);\n};\n\n// -- Apply ------------------------------------------------------------\n\n/**\n * Applys the successful value of the `Task[α, (β → γ)]` to the successful\n * value of the `Task[α, β]`\n *\n * @summary @Task[α, (β → γ)] => Task[α, β] → Task[α, γ]\n */\n\nTask.prototype.ap = function _ap(that) {\n var forkThis = this.fork;\n var forkThat = that.fork;\n var cleanupThis = this.cleanup;\n var cleanupThat = that.cleanup;\n\n function cleanupBoth(state) {\n cleanupThis(state[0]);\n cleanupThat(state[1]);\n }\n\n return new Task(function(reject, resolve) {\n var func, funcLoaded = false;\n var val, valLoaded = false;\n var rejected = false;\n var allState;\n\n var thisState = forkThis(guardReject, guardResolve(function(x) {\n funcLoaded = true;\n func = x;\n }));\n\n var thatState = forkThat(guardReject, guardResolve(function(x) {\n valLoaded = true;\n val = x;\n }));\n\n function guardResolve(setter) {\n return function(x) {\n if (rejected) {\n return;\n }\n\n setter(x);\n if (funcLoaded && valLoaded) {\n delayed(function(){ cleanupBoth(allState) });\n return resolve(func(val));\n } else {\n return x;\n }\n }\n }\n\n function guardReject(x) {\n if (!rejected) {\n rejected = true;\n return reject(x);\n }\n }\n\n return allState = [thisState, thatState];\n }, cleanupBoth);\n};\n\n// -- Semigroup ------------------------------------------------------------\n\n/**\n * Selects the earlier of the two tasks `Task[α, β]`\n *\n * @summary @Task[α, β] => Task[α, β] → Task[α, β]\n */\n\nTask.prototype.concat = function _concat(that) {\n var forkThis = this.fork;\n var forkThat = that.fork;\n var cleanupThis = this.cleanup;\n var cleanupThat = that.cleanup;\n\n function cleanupBoth(state) {\n cleanupThis(state[0]);\n cleanupThat(state[1]);\n }\n\n return new Task(function(reject, resolve) {\n var done = false;\n var allState;\n var thisState = forkThis(guard(reject), guard(resolve));\n var thatState = forkThat(guard(reject), guard(resolve));\n\n return allState = [thisState, thatState];\n\n function guard(f) {\n return function(x) {\n if (!done) {\n done = true;\n delayed(function(){ cleanupBoth(allState) })\n return f(x);\n }\n };\n }\n }, cleanupBoth);\n\n};\n\n// -- Monoid ------------------------------------------------------------\n\n/**\n * Returns a Task that will never resolve\n *\n * @summary Void → Task[α, _]\n */\nTask.empty = function _empty() {\n return new Task(function() {});\n};\n\nTask.prototype.empty = Task.empty;\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Task[α, β]`\n *\n * @summary @Task[α, β] => Void → String\n */\nTask.prototype.toString = function _toString() {\n return 'Task';\n};\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Transforms a failure value into a new `Task[α, β]`. Does nothing if the\n * structure already contains a successful value.\n *\n * @summary @Task[α, β] => (α → Task[γ, β]) → Task[γ, β]\n */\nTask.prototype.orElse = function _orElse(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return f(a).fork(reject, resolve);\n }, function(b) {\n return resolve(b);\n });\n }, cleanup);\n};\n\n// -- Folds and extended transformations -------------------------------\n\n/**\n * Catamorphism. Takes two functions, applies the leftmost one to the failure\n * value, and the rightmost one to the successful value, depending on which one\n * is present.\n *\n * @summary @Task[α, β] => (α → γ), (β → γ) → Task[δ, γ]\n */\nTask.prototype.fold = function _fold(f, g) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return resolve(f(a));\n }, function(b) {\n return resolve(g(b));\n });\n }, cleanup);\n};\n\n/**\n * Catamorphism.\n *\n * @summary @Task[α, β] => { Rejected: α → γ, Resolved: β → γ } → Task[δ, γ]\n */\nTask.prototype.cata = function _cata(pattern) {\n return this.fold(pattern.Rejected, pattern.Resolved);\n};\n\n/**\n * Swaps the disjunction values.\n *\n * @summary @Task[α, β] => Void → Task[β, α]\n */\nTask.prototype.swap = function _swap() {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return resolve(a);\n }, function(b) {\n return reject(b);\n });\n }, cleanup);\n};\n\n/**\n * Maps both sides of the disjunction.\n *\n * @summary @Task[α, β] => (α → γ), (β → δ) → Task[γ, δ]\n */\nTask.prototype.bimap = function _bimap(f, g) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(f(a));\n }, function(b) {\n return resolve(g(b));\n });\n }, cleanup);\n};\n\n/**\n * Maps the left side of the disjunction (failure).\n *\n * @summary @Task[α, β] => (α → γ) → Task[γ, β]\n */\nTask.prototype.rejectedMap = function _rejectedMap(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(f(a));\n }, function(b) {\n return resolve(b);\n });\n }, cleanup);\n};\n","module.exports = require('./task');\n","/* eslint-disable new-cap */\nimport { prop, find, identity, pipe } from \"ramda\";\nimport { createId } from \"./utils\";\nimport Either from \"data.either\";\nimport Task from \"data.task\";\nimport Immutable from \"seamless-immutable\";\nimport { fieldCreated } from \"../Actions\";\n\n// State -> String -> Either String Function\nconst typeConstructor = (state, fieldType) => {\n return Either.of(state)\n .map(prop(\"fieldTypes\"))\n .map(find(v => v.info.type === fieldType))\n .chain(Either.fromNullable)\n .bimap(_ => `Field \"${fieldType}\" does not exist.`, identity);\n};\n\n// { initialState: Function } -> Task String Object\nconst createField = constr =>\n new Task((reject, resolve) => {\n // Make sure the promise is only resolved once\n let called = false;\n const fieldState = constr.initialState();\n\n if (!(fieldState instanceof Promise)) {\n resolve(fieldState);\n } else {\n fieldState\n .then(v => {\n if (called) { return; }\n called = true;\n resolve(v);\n })\n .catch(v => {\n if (called) { throw v; }\n called = true;\n reject(v);\n });\n }\n });\n\n// Object -> Object\nconst insertRequiredProps = field =>\n Immutable(field).merge({\n id: createId(),\n configShowing: true,\n }, {\n deep: true,\n });\n\nconst createFieldAsynchronously = (state, fieldType, asyncDispatch) =>\n typeConstructor(state, fieldType)\n .map(createField) // Either String (Task String Object)\n .leftMap(Task.rejected)\n .merge() // Task String Object\n .map(insertRequiredProps)\n .fork( // execute task\n err => console.error(\"Task rejected\", err),\n pipe(fieldCreated, asyncDispatch)\n );\n\n// This is an async action. When it is finished it will trigger the\n// field created action\nexport default (state, { fieldType, asyncDispatch }) => {\n createFieldAsynchronously(state, fieldType, asyncDispatch);\n return state;\n};\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a new list containing the contents of the given list, followed by\n * the given element.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The element to add to the end of the new list.\n * @param {Array} list The list whose contents will be added to the beginning of the output\n * list.\n * @return {Array} A new list containing the contents of the old list followed by `el`.\n * @see R.prepend\n * @example\n *\n * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']\n * R.append('tests', []); //=> ['tests']\n * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]\n */\nmodule.exports = _curry2(function append(el, list) {\n return _concat(list, [el]);\n});\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n * @module lib/maybe\n */\nmodule.exports = Maybe\n\n// -- Aliases ----------------------------------------------------------\nvar clone = Object.create\nvar unimplemented = function(){ throw new Error('Not implemented.') }\nvar noop = function(){ return this }\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * A structure for values that may not be present, or computations that may\n * fail. `Maybe(a)` explicitly models the effects that are implicit in\n * `Nullable` types, thus has none of the problems associated with\n * `null` or `undefined` — like `NullPointerExceptions`.\n *\n * The class models two different cases:\n *\n * + `Just a` — represents a `Maybe(a)` that contains a value. `a` may\n * be any value, including `null` or `undefined`.\n *\n * + `Nothing` — represents a `Maybe(a)` that has no values. Or a\n * failure that needs no additional information.\n *\n * Common uses of this structure includes modelling values that may or may\n * not be present in a collection, thus instead of needing a\n * `collection.has(a)`, the `collection.get(a)` operation gives you all\n * the information you need — `collection.get(a).is-nothing` being\n * equivalent to `collection.has(a)`; Similarly the same reasoning may\n * be applied to computations that may fail to provide a value, e.g.:\n * `collection.find(predicate)` can safely return a `Maybe(a)` instance,\n * even if the collection contains nullable values.\n *\n * Furthermore, the values of `Maybe(a)` can be combined and manipulated\n * by using the expressive monadic operations. This allows safely\n * sequencing operations that may fail, and safely composing values that\n * you don't know whether they're present or not, failing early\n * (returning a `Nothing`) if any of the operations fail.\n *\n * If one wants to store additional information about failures, the\n * [Either][] and [Validation][] structures provide such a capability, and\n * should be used instead of the `Maybe(a)` structure.\n *\n * [Either]: https://github.com/folktale/data.either\n * [Validation]: https://github.com/folktale/data.validation\n *\n *\n * @class\n */\nfunction Maybe() {}\n\n// The case for successful values\nJust.prototype = clone(Maybe.prototype)\nfunction Just(a){\n this.value = a\n}\n\n// The case for failure values\nNothing.prototype = clone(Maybe.prototype)\nfunction Nothing(){}\n\n\n// -- Constructors -----------------------------------------------------\n\n/**\n * Constructs a new `Maybe[α]` structure with an absent value. Commonly used\n * to represent a failure.\n *\n * @summary Void → Maybe[α]\n */\nMaybe.Nothing = function() {\n return new Nothing\n}\nMaybe.prototype.Nothing = Maybe.Nothing\n\n/**\n * Constructs a new `Maybe[α]` structure that holds the single value\n * `α`. Commonly used to represent a success.\n *\n * `α` can be any value, including `null`, `undefined` or another\n * `Maybe[α]` structure.\n *\n * @summary α → Maybe[α]\n */\nMaybe.Just = function(a) {\n return new Just(a)\n}\nMaybe.prototype.Just = Maybe.Just\n\n\n// -- Conversions ------------------------------------------------------\n\n/**\n * Constructs a new `Maybe[α]` structure from a nullable type.\n *\n * If the value is either `null` or `undefined`, this function returns a\n * `Nothing`, otherwise the value is wrapped in a `Just(α)`.\n *\n * @summary α → Maybe[α]\n */\nMaybe.fromNullable = function(a) {\n return a != null? new Just(a)\n : /* otherwise */ new Nothing\n}\nMaybe.prototype.fromNullable = Maybe.fromNullable\n\n/**\n * Constructs a new `Maybe[β]` structure from an `Either[α, β]` type.\n *\n * The left side of the `Either` becomes `Nothing`, and the right side\n * is wrapped in a `Just(β)`.\n *\n * @summary Either[α, β] → Maybe[β]\n */\nMaybe.fromEither = function(a) {\n return a.fold(Maybe.Nothing, Maybe.Just)\n}\nMaybe.prototype.fromEither = Maybe.fromEither\n\n/**\n * Constructs a new `Maybe[β]` structure from a `Validation[α, β]` type.\n *\n * The failure side of the `Validation` becomes `Nothing`, and the right\n * side is wrapped in a `Just(β)`.\n *\n * @method\n * @summary Validation[α, β] → Maybe[β]\n */\nMaybe.fromValidation = Maybe.fromEither\nMaybe.prototype.fromValidation = Maybe.fromEither\n\n\n// -- Predicates -------------------------------------------------------\n\n/**\n * True if the `Maybe[α]` structure contains a failure (i.e.: `Nothing`).\n *\n * @summary Boolean\n */\nMaybe.prototype.isNothing = false\nNothing.prototype.isNothing = true\n\n\n/**\n * True if the `Maybe[α]` structure contains a single value (i.e.: `Just(α)`).\n *\n * @summary Boolean\n */\nMaybe.prototype.isJust = false\nJust.prototype.isJust = true\n\n\n// -- Applicative ------------------------------------------------------\n\n/**\n * Creates a new `Maybe[α]` structure holding the single value `α`.\n *\n * `α` can be any value, including `null`, `undefined`, or another\n * `Maybe[α]` structure.\n *\n * @summary α → Maybe[α]\n */\nMaybe.of = function(a) {\n return new Just(a)\n}\nMaybe.prototype.of = Maybe.of\n\n\n/**\n * Applies the function inside the `Maybe[α]` structure to another\n * applicative type.\n *\n * The `Maybe[α]` structure should contain a function value, otherwise a\n * `TypeError` is thrown.\n *\n * @method\n * @summary (@Maybe[α → β], f:Applicative[_]) => f[α] → f[β]\n */\nMaybe.prototype.ap = unimplemented\n\nNothing.prototype.ap = noop\n\nJust.prototype.ap = function(b) {\n return b.map(this.value)\n}\n\n\n\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the value of the `Maybe[α]` structure using a regular unary\n * function.\n *\n * @method\n * @summary @Maybe[α] => (α → β) → Maybe[β]\n */\nMaybe.prototype.map = unimplemented\nNothing.prototype.map = noop\n\nJust.prototype.map = function(f) {\n return this.of(f(this.value))\n}\n\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the value of the `Maybe[α]` structure using an unary function\n * to monads.\n *\n * @method\n * @summary (@Maybe[α], m:Monad[_]) => (α → m[β]) → m[β]\n */\nMaybe.prototype.chain = unimplemented\nNothing.prototype.chain = noop\n\nJust.prototype.chain = function(f) {\n return f(this.value)\n}\n\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Maybe[α]` structure.\n *\n * @method\n * @summary @Maybe[α] => Void → String\n */\nMaybe.prototype.toString = unimplemented\n\nNothing.prototype.toString = function() {\n return 'Maybe.Nothing'\n}\n\nJust.prototype.toString = function() {\n return 'Maybe.Just(' + this.value + ')'\n}\n\n\n// -- Eq ---------------------------------------------------------------\n\n/**\n * Tests if a `Maybe[α]` structure is equal to another `Maybe[α]` structure.\n *\n * @method\n * @summary @Maybe[α] => Maybe[α] → Boolean\n */\nMaybe.prototype.isEqual = unimplemented\n\nNothing.prototype.isEqual = function(b) {\n return b.isNothing\n}\n\nJust.prototype.isEqual = function(b) {\n return b.isJust\n && b.value === this.value\n}\n\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Extracts the value out of the `Maybe[α]` structure, if it\n * exists. Otherwise throws a `TypeError`.\n *\n * @method\n * @summary @Maybe[α] => Void → a, :: partial, throws\n * @see {@link module:lib/maybe~Maybe#getOrElse} — A getter that can handle failures\n * @throws {TypeError} if the structure has no value (`Nothing`).\n */\nMaybe.prototype.get = unimplemented\n\nNothing.prototype.get = function() {\n throw new TypeError(\"Can't extract the value of a Nothing.\")\n}\n\nJust.prototype.get = function() {\n return this.value\n}\n\n\n/**\n * Extracts the value out of the `Maybe[α]` structure. If there is no value,\n * returns the given default.\n *\n * @method\n * @summary @Maybe[α] => α → α\n */\nMaybe.prototype.getOrElse = unimplemented\n\nNothing.prototype.getOrElse = function(a) {\n return a\n}\n\nJust.prototype.getOrElse = function(_) {\n return this.value\n}\n\n\n/**\n * Transforms a failure into a new `Maybe[α]` structure. Does nothing if the\n * structure already contains a value.\n *\n * @method\n * @summary @Maybe[α] => (Void → Maybe[α]) → Maybe[α]\n */\nMaybe.prototype.orElse = unimplemented\n\nNothing.prototype.orElse = function(f) {\n return f()\n}\n\nJust.prototype.orElse = function(_) {\n return this\n}\n\n\n/**\n * Catamorphism.\n * \n * @method\n * @summary @Maybe[α] => { Nothing: Void → β, Just: α → β } → β\n */\nMaybe.prototype.cata = unimplemented\n\nNothing.prototype.cata = function(pattern) {\n return pattern.Nothing()\n}\n\nJust.prototype.cata = function(pattern) {\n return pattern.Just(this.value);\n}\n\n\n/**\n * JSON serialisation\n *\n * @method\n * @summary @Maybe[α] => Void → Object\n */\nMaybe.prototype.toJSON = unimplemented\n\nNothing.prototype.toJSON = function() {\n return { '#type': 'folktale:Maybe.Nothing' }\n}\n\nJust.prototype.toJSON = function() {\n return { '#type': 'folktale:Maybe.Just'\n , value: this.value }\n}\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = require('./maybe')","import { curry, pipe, prop, over, append } from \"ramda\";\nimport { hideConfigs, StateLenses, pushHistoryState } from \"./utils\";\nimport Maybe from \"data.maybe\";\n\n// State -> Object -> State\nconst historyStateWithNewField = curry((state, newField) => pipe(\n hideConfigs,\n over(StateLenses.fieldsState, append(newField))\n)(state));\n\nexport default (state, { createdFieldState }) =>\n Maybe.fromNullable(createdFieldState)\n .map(historyStateWithNewField(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","/* eslint-disable new-cap */\nimport { curry } from \"ramda\";\nimport Maybe from \"data.maybe\";\nimport Immutable from \"seamless-immutable\";\nimport { pushHistoryState } from \"./utils\";\n\nconst toggleConfig = fieldState =>\n Immutable(fieldState).set(\"configShowing\", !fieldState.configShowing);\n\nconst replaceFieldState = curry((state, fieldState) =>\n state\n .fieldsState\n .map(aField => aField.id === fieldState.id\n ? fieldState\n : aField\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(toggleConfig)\n .map(replaceFieldState(state))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","/* eslint-disable new-cap */\nimport { curry } from \"ramda\";\nimport Maybe from \"data.maybe\";\nimport Immutable from \"seamless-immutable\";\nimport { pushHistoryState } from \"./utils\";\n\nconst toggleRequired = fieldState =>\n Immutable(fieldState).set(\"required\", !fieldState.required);\n\nconst replaceFieldState = curry((state, fieldState) =>\n state\n .fieldsState\n .map(aField => aField.id === fieldState.id\n ? fieldState\n : aField\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(toggleRequired)\n .map(replaceFieldState(state))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","module.exports = function _filter(fn, list) {\n var idx = 0;\n var len = list.length;\n var result = [];\n\n while (idx < len) {\n if (fn(list[idx])) {\n result[result.length] = list[idx];\n }\n idx += 1;\n }\n return result;\n};\n","module.exports = function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n};\n","var _curry2 = require('./_curry2');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XFilter(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XFilter.prototype['@@transducer/init'] = _xfBase.init;\n XFilter.prototype['@@transducer/result'] = _xfBase.result;\n XFilter.prototype['@@transducer/step'] = function(result, input) {\n return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;\n };\n\n return _curry2(function _xfilter(f, xf) { return new XFilter(f, xf); });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _filter = require('./internal/_filter');\nvar _isObject = require('./internal/_isObject');\nvar _reduce = require('./internal/_reduce');\nvar _xfilter = require('./internal/_xfilter');\nvar keys = require('./keys');\n\n\n/**\n * Takes a predicate and a \"filterable\", and returns a new filterable of the\n * same type containing the members of the given filterable which satisfy the\n * given predicate.\n *\n * Dispatches to the `filter` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array}\n * @see R.reject, R.transduce, R.addIndex\n * @example\n *\n * var isEven = n => n % 2 === 0;\n *\n * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nmodule.exports = _curry2(_dispatchable('filter', _xfilter, function(pred, filterable) {\n return (\n _isObject(filterable) ?\n _reduce(function(acc, key) {\n if (pred(filterable[key])) {\n acc[key] = filterable[key];\n }\n return acc;\n }, {}, keys(filterable)) :\n // else\n _filter(pred, filterable)\n );\n}));\n","import { curry, prop, over, filter } from \"ramda\";\nimport { StateLenses, pushHistoryState } from \"./utils\";\nimport Maybe from \"data.maybe\";\n\n// State -> Object -> State\nconst historyStateWithoutField = curry((state, fieldState) =>\n over(\n StateLenses.fieldsState,\n filter(fs => fs.id !== fieldState.id),\n state\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(historyStateWithoutField(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","import { curry, prop, over, map } from \"ramda\";\nimport { StateLenses, pushHistoryState, validateField } from \"./utils\";\n\n// State -> Object -> State\nconst updateFieldState = curry((state, newFieldState) =>\n over(\n StateLenses.fieldsState,\n map(fs => fs.id === newFieldState.id ? newFieldState : fs),\n state\n )\n);\n\nexport default (state, { newFieldState }) =>\n validateField(newFieldState) // Either\n .map(updateFieldState(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .leftMap(console.error)\n .getOrElse(state);\n","var _curry2 = require('./internal/_curry2');\nvar _slice = require('./internal/_slice');\n\n\n/**\n * Returns a copy of the list, sorted according to the comparator function,\n * which should accept two values at a time and return a negative number if the\n * first value is smaller, a positive number if it's larger, and zero if they\n * are equal. Please note that this is a **copy** of the list. It does not\n * modify the original.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a,a -> Number) -> [a] -> [a]\n * @param {Function} comparator A sorting function :: a -> b -> Int\n * @param {Array} list The list to sort\n * @return {Array} a new array with its elements sorted by the comparator function.\n * @example\n *\n * var diff = function(a, b) { return a - b; };\n * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]\n */\nmodule.exports = _curry2(function sort(comparator, list) {\n return _slice(list).sort(comparator);\n});\n","/* eslint-disable new-cap */\nimport { curry, pipe, prop, over, sort } from \"ramda\";\nimport { hideConfigs, StateLenses, pushHistoryState } from \"./utils\";\nimport Either from \"data.either\";\n\n// State -> Object -> State\nconst historyStateWithNewOrder = curry((state, newOrder) => pipe(\n hideConfigs,\n over(\n StateLenses.fieldsState,\n sort((f1, f2) => newOrder.indexOf(f1.id) - newOrder.indexOf(f2.id))\n )\n)(state));\n\nexport default (state, { newFieldsOrder }) =>\n (newFieldsOrder && Array.isArray(newFieldsOrder)\n ? Either.Right(newFieldsOrder)\n : Either.Left(`newFieldsOrder must be an array but received ${typeof newFieldsOrder}`)\n )\n .chain(o =>\n o.length === state.fieldsState.length\n ? Either.Right(o)\n : Either.Left(`newFieldsOrder has ${o.length} elements, but the current state has ${state.fieldsState.length} elements`) // eslint-disable-line max-len\n )\n .chain(o => {\n const stateIds = state.fieldsState.map(prop(\"id\"));\n const noMissingId = stateIds.reduce((acc, fId) => acc && o.includes(fId), true);\n return noMissingId\n ? Either.Right(o)\n : Either.Left(\"Not all ids in the new order are matched in the existing state ids.\");\n })\n .map(historyStateWithNewOrder(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .leftMap(err => console.error(`Unable to reorder: ${err}`))\n .getOrElse(state);\n","/* @flow weak */\n/* eslint-disable new-cap */\nimport { StateLenses, propertyTypeCheck } from \"./utils\";\nimport { over, traverse, curry } from \"ramda\";\nimport Either from \"data.either\";\n\n// [a] => Either String [a]\nconst isArray = arr =>\n Array.isArray(arr)\n ? Either.Right(arr)\n : Either.Left(`Expected Array but received ${typeof arr}`); // eslint-disable-line max-len\n\n// Object -> Either String Object\nconst hasRequiredInfo = component =>\n propertyTypeCheck(\"initialState\", \"function\", component)\n .chain(propertyTypeCheck(\"RenderEditor\", \"function\"))\n .chain(propertyTypeCheck(\"info\", \"object\"))\n .chain(c => Either.fromNullable(c.info))\n .chain(propertyTypeCheck(\"type\", \"string\"))\n .chain(propertyTypeCheck(\"displayName\", \"string\"))\n .chain(propertyTypeCheck(\"group\", \"string\"))\n .chain(_ => Either.Right(component));\n\nconst isComponentValid = customComponents =>\n traverse(Either.of, hasRequiredInfo, customComponents);\n\n// [a] -> [a] -> Either String [a]\nconst validateComponents = customComponents =>\n Either.Right(customComponents)\n .chain(isArray)\n .chain(isComponentValid);\n\nconst addToFieldTypes = curry((state, customComponents) =>\n over(StateLenses.fieldTypes, s => s.concat(customComponents), state)\n);\n\n// If there are any problems with the import, the same state\n// will be returned\nexport default (state, { customComponents }) =>\n (customComponents\n ? Either.Right(customComponents)\n : Either.Left(\"Empty custom components\")\n )\n .chain(validateComponents)\n .leftMap(err => console.error(\"Invalid custom components:\", err))\n .map(addToFieldTypes(state))\n .getOrElse(state);\n","/* eslint-disable no-nested-ternary */\nimport assert from \"fl-assert\";\nimport undo from \"./undo\";\nimport importState from \"./importState\";\nimport createField from \"./createField\";\nimport fieldCreated from \"./fieldCreated\";\nimport toggleConfig from \"./field.toggleConfig\";\nimport toggleRequired from \"./field.toggleRequired\";\nimport deleteField from \"./field.deleteField\";\nimport updateField from \"./field.updateField\";\nimport reorderFields from \"./reorderFields\";\nimport importCustomComponents from \"./importCustomComponents\";\n\nconst actionHandlers = {\n undo,\n importState,\n createField,\n fieldCreated,\n toggleConfig,\n toggleRequired,\n deleteField,\n updateField,\n reorderFields,\n importCustomComponents,\n};\n\nconst isExpectedAction = a => a && a.type && actionHandlers[a.type];\nconst isReduxAction = a => a && a.type && a.type.includes(\"@@redux\");\n\n\nconst update = (state, action) =>\n isExpectedAction(action)\n ? actionHandlers[action.type](state, action)\n : isReduxAction(action)\n ? state\n : assert(false, `Invalid action type: ${action.type}`);\n\nexport default update;\n","/* eslint-env jasmine */\n\nimport { undo as undoAction } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst currentFieldsState = [\"current\"];\nconst oldFieldsState = [\"old\"];\nconst mockState = {\n fieldTypes: [],\n fieldsState: currentFieldsState,\n fieldsStateHistory: [oldFieldsState],\n};\n\nconst emptyMockState = {\n fieldTypes: [],\n fieldsState: [],\n fieldsStateHistory: [],\n};\n\nconst emptyHistoryMockState = {\n fieldTypes: [],\n fieldsState: currentFieldsState,\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.undo\", () => {\n it(\"removes first old state from history\", () => {\n const modifiedState = update(mockState, undoAction());\n expect(modifiedState.fieldsStateHistory.length).toEqual(0);\n });\n\n it(\"sets first old state as current state\", () => {\n const modifiedState = update(mockState, undoAction());\n expect(modifiedState.fieldsState).toEqual(oldFieldsState);\n });\n\n it(\"doesn't modify the state if there aren't more history states to undo\", () => {\n const modifiedState = update(emptyMockState, undoAction());\n expect(modifiedState).toEqual(emptyMockState);\n });\n\n it(\"set's the current state to empty if there are no more history states\", () => {\n const modifiedState = update(emptyHistoryMockState, undoAction());\n expect(modifiedState.fieldsState.length).toEqual(0);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { importState } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst typesArray = [{\n \"info\": {\n \"type\": \"RadioButtons\",\n },\n}, {\n \"info\": {\n \"type\": \"Checkboxes\",\n },\n}, {\n \"info\": {\n \"type\": \"Dropdown\",\n },\n}, {\n \"info\": {\n \"type\": \"TextBox\",\n },\n}, {\n \"info\": {\n \"type\": \"EmailBox\",\n },\n}, {\n \"info\": {\n \"type\": \"TelephoneBox\",\n },\n}, {\n \"info\": {\n \"type\": \"NumberBox\",\n },\n}, {\n \"info\": {\n \"type\": \"TextArea\",\n },\n}, {\n \"info\": {\n \"type\": \"DateField\",\n },\n}];\n\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: typesArray,\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst newValidState = [{\n \"type\": \"Checkboxes\",\n \"displayName\": \"Checkboxes\",\n \"group\": \"Options Components\",\n \"htmlInputType\": \"checkbox\",\n \"title\": \"Add a title\",\n \"id\": 2,\n \"options\": [{\n \"caption\": \"Insert an option\",\n }],\n \"newOptionCaption\": \"\",\n}];\n\nconst newInvalidState = [{\n \"type\": \"Invalid type\",\n \"displayName\": \"Checkboxes\",\n \"group\": \"Options Components\",\n \"htmlInputType\": \"checkbox\",\n \"title\": \"Add a title\",\n \"options\": [{\n \"caption\": \"Insert an option\",\n }],\n \"newOptionCaption\": \"\",\n}];\n\ndescribe(\"Update.importState\", () => {\n it(\"Returns an unchanged array if the new state is invalid\", () => {\n expect(update(mockState, importState({}))).toEqual(mockState);\n expect(update(mockState, importState(null))).toEqual(mockState);\n });\n\n it(\"Returns an unchanged array if the a field's type is not in fieldTypes\", () => {\n expect(update(mockState, importState(newInvalidState))).toEqual(mockState);\n });\n\n it(\"Sends the last current state to the history\", () => {\n const updated = update(mockState, importState(newValidState));\n expect(updated.fieldsStateHistory[0].toString()).toEqual(mockCurrentState.toString());\n expect(updated.fieldsStateHistory.length).toEqual(mockHistory.length + 1);\n });\n\n it(\"Sets the new state as current\", () => {\n const updated = update(mockState, importState(newValidState));\n expect(updated.fieldsState[0].type).toEqual(newValidState[0].type);\n expect(updated.fieldsState[0].type).not.toEqual(undefined);\n expect(updated.fieldsState[0].displayName).toEqual(newValidState[0].displayName);\n expect(updated.fieldsState[0].displayName).not.toEqual(undefined);\n expect(updated.fieldsState[0].group).toEqual(newValidState[0].group);\n expect(updated.fieldsState[0].group).not.toEqual(undefined);\n });\n\n it(\"Makes sure all ids are strings\", () => {\n const validState2 = newValidState\n .map((v, idx) => idx !== 0 ? v : Object.assign({}, v, { id: 2 }));\n const updated = update(mockState, importState(validState2));\n expect(typeof updated.fieldsState[0].id).toEqual(\"string\");\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { createField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst promiseTypeInstance = { type: \"promise-instance\" };\nconst promiseType = {\n info: { type: \"PromiseType\" },\n initialState: () => Promise.resolve(promiseTypeInstance),\n};\n\nconst syncTypeInstance = { type: \"sync-instance\" };\nconst syncType = {\n info: { type: \"SyncType\" },\n initialState: () => syncTypeInstance,\n};\n\nconst typesArray = [promiseType, syncType];\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: typesArray,\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\ndescribe(\"Update.createField\", () => {\n it(\"creates fields asynchronously\", done => {\n const asyncDispatch = v => {\n expect(v).not.toEqual(undefined);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"returns a 'fieldCreated' action when field is created\", done => {\n const asyncDispatch = action => {\n expect(action.type).toEqual(\"fieldCreated\");\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"creates types with constructors that return a plain object\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState).not.toEqual(undefined);\n expect(action.createdFieldState.type).toEqual(syncTypeInstance.type);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"creates types with constructors that return a promise\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState).not.toEqual(undefined);\n expect(action.createdFieldState.type).toEqual(promiseTypeInstance.type);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(promiseType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"adds required fields to instance\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState.id).not.toEqual(undefined);\n expect(typeof action.createdFieldState.configShowing).toEqual(\"boolean\");\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(promiseType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"does not create a field if type is not in model.fieldTypes\", done => {\n const asyncDispatch = jasmine.createSpy(\"asyncDispatch\");\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(\"non-existing-type\")\n );\n\n update(mockState, asyncAcion);\n\n setTimeout(\n () => { expect(asyncDispatch).not.toHaveBeenCalled(); done(); },\n 50\n );\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { fieldCreated } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst createdFieldState = { type: \"fictitious-instance\" };\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldCreatedAction = fieldCreated(createdFieldState);\nconst newState = update(mockState, fieldCreatedAction);\n\ndescribe(\"Update.fieldCreated\", () => {\n it(\"outputs a state with the new field included\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length + 1);\n expect(\n newState.fieldsState\n .find(v => v.type === createdFieldState.type)\n ).not.toEqual(undefined);\n });\n\n it(\"sends the current state to history\", () => {\n expect(newState.fieldsStateHistory[0][0]).toEqual(mockCurrentState[0]);\n expect(newState.fieldsStateHistory[0][1]).toEqual(mockCurrentState[1]);\n });\n\n it(\"Returns the current state if no new field is given to it\", () => {\n const sameState = update(mockState, fieldCreated(null));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after creating one object\", () => {\n const changed1 = update(mockState, fieldCreated(createdFieldState));\n const changed2 = update(changed1, fieldCreated(createdFieldState));\n const changed3 = update(changed2, fieldCreated(createdFieldState));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockCurrentState.length + 3);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n\nimport { toggleConfig } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\n\nconst fieldStateConfigShowing = {\n id: 123,\n configShowing: true,\n};\n\nconst fieldStateConfigNotShowing = {\n id: 321,\n configShowing: false,\n};\n\nconst mockState = {\n fieldTypes: [],\n fieldsState: [fieldStateConfigShowing, fieldStateConfigNotShowing],\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.toggleConfig\", () => {\n it(\"turns the config option to false when needed\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigShowing));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateConfigShowing.id)\n .configShowing\n ).toEqual(false);\n });\n\n it(\"turns the config option to true when needed\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigNotShowing));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateConfigShowing.id)\n .configShowing\n ).toEqual(true);\n });\n\n it(\"adds the last state to the history\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigShowing));\n expect(modifiedState.fieldsStateHistory.length).toEqual(1);\n expect(modifiedState.fieldsStateHistory[0][0].id).toEqual(mockState.fieldsState[0].id);\n expect(modifiedState.fieldsStateHistory[0][1].id).toEqual(mockState.fieldsState[1].id);\n });\n});\n","/* eslint-env jasmine */\n\nimport { toggleRequired } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\n\nconst fieldStateIsRequired = {\n id: 123,\n required: true,\n};\n\nconst fieldStateIsNotRequired = {\n id: 321,\n required: false,\n};\n\nconst mockState = {\n fieldTypes: [],\n fieldsState: [fieldStateIsRequired, fieldStateIsNotRequired],\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.toggleRequired\", () => {\n it(\"turns the required option to false when needed\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsRequired));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateIsRequired.id)\n .required\n ).toEqual(false);\n });\n\n it(\"turns the required option to true when needed\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsNotRequired));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateIsRequired.id)\n .required\n ).toEqual(true);\n });\n\n it(\"adds the last state to the history\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsRequired));\n expect(modifiedState.fieldsStateHistory.length).toEqual(1);\n expect(modifiedState.fieldsStateHistory[0][0].id).toEqual(mockState.fieldsState[0].id);\n expect(modifiedState.fieldsStateHistory[0][1].id).toEqual(mockState.fieldsState[1].id);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { deleteField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst toBeDeletedFieldState = { type: \"fictitious-instance\", id: 0 };\nconst mockCurrentState = [toBeDeletedFieldState, { id: 1 }, { id: 2 }];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldDeleteAction = deleteField(toBeDeletedFieldState);\nconst newState = update(mockState, fieldDeleteAction);\n\ndescribe(\"Update.deleteField\", () => {\n it(\"outputs a state without the field included\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length - 1);\n expect(\n newState.fieldsState\n .find(v => v.id === toBeDeletedFieldState.id)\n ).toEqual(undefined);\n });\n\n it(\"sends the current state to history\", () => {\n const recentHistoryState = newState.fieldsStateHistory[0];\n expect(recentHistoryState.length).toEqual(mockCurrentState.length);\n expect(recentHistoryState[0].id).toEqual(mockCurrentState[0].id);\n expect(recentHistoryState[1].id).toEqual(mockCurrentState[1].id);\n });\n\n it(\"Returns the current state if no new field is given to it\", () => {\n const sameState = update(mockState, deleteField(null));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after deleting a field\", () => {\n const mockField1 = Object.assign({}, toBeDeletedFieldState, { id: 5 });\n const mockField2 = Object.assign({}, toBeDeletedFieldState, { id: 6 });\n const mockField3 = Object.assign({}, toBeDeletedFieldState, { id: 7 });\n\n const mockState2 = Object.assign({}, mockState, {\n fieldsState: [\n mockField1,\n mockField2,\n mockField3,\n ],\n });\n const changed1 = update(mockState2, deleteField(mockField1));\n const changed2 = update(changed1, deleteField(mockField2));\n const changed3 = update(changed2, deleteField(mockField3));\n expect(changed3.fieldTypes.length).toEqual(mockState2.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockState2.fieldsState.length - 3);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { updateField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst oldFieldState = {\n type: \"fictitious-instance\",\n id: \"0\",\n configShowing: false,\n required: false,\n color: \"blue\",\n};\nconst newFieldState = Object.assign({}, oldFieldState, { color: \"green\" });\nconst mockCurrentState = [oldFieldState, { id: 1 }, { id: 2 }];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldUpdateAction = updateField(newFieldState);\nconst newState = update(mockState, fieldUpdateAction);\n\ndescribe(\"Update.updateField\", () => {\n it(\"outputs a state the field updated\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(\n newState.fieldsState\n .find(v => v.color === newFieldState.color)\n ).not.toEqual(undefined);\n });\n\n it(\"outputs a state the updated field in the correct order\", () => {\n expect(newState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(newState.fieldsState[0].color).toEqual(newFieldState.color);\n });\n\n it(\"sends the current state to history\", () => {\n const recentHistoryState = newState.fieldsStateHistory[0];\n expect(recentHistoryState.length).toEqual(mockCurrentState.length);\n expect(recentHistoryState[0].id).toEqual(mockCurrentState[0].id);\n expect(recentHistoryState[0].color).toEqual(mockCurrentState[0].color);\n });\n\n it(\"Returns the current state if an invalid field state is given to it\", () => {\n const isSame = (state1, state2) => {\n expect(state1.fieldTypes.length).toEqual(state2.fieldTypes.length);\n expect(state1.fieldsState.length).toEqual(state2.fieldsState.length);\n expect(state1.fieldsState[0].color).toEqual(state2.fieldsState[0].color);\n expect(state1.fieldsState[0].id).toEqual(state2.fieldsState[0].id);\n expect(state1.fieldsStateHistory.length).toEqual(state2.fieldsStateHistory.length);\n };\n\n const sameState1 = update(mockState, updateField(null));\n isSame(mockState, sameState1);\n\n const sameState2 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { id: null }))\n );\n isSame(mockState, sameState2);\n\n const sameState3 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { configShowing: null }))\n );\n isSame(mockState, sameState3);\n\n const sameState4 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { required: null }))\n );\n\n isSame(mockState, sameState4);\n });\n\n it(\"does not break the state after updating a field multiple times a field\", () => {\n const mockField1 = Object.assign({}, oldFieldState, { color: \"yellow\" });\n const mockField2 = Object.assign({}, oldFieldState, { color: \"orange\" });\n const mockField3 = Object.assign({}, oldFieldState, { color: \"purple\" });\n\n const changed1 = update(mockState, updateField(mockField1));\n const changed2 = update(changed1, updateField(mockField2));\n const changed3 = update(changed2, updateField(mockField3));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(changed3.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(changed3.fieldsState[0].color).toEqual(mockField3.color);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { reorderFields } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst templateField = {\n type: \"fictitious-instance\",\n required: false,\n configShowing: false,\n id: \"0\",\n};\nconst field1 = Object.assign({}, templateField, { id: \"1\" });\nconst field2 = Object.assign({}, templateField, { id: \"2\" });\nconst field3 = Object.assign({}, templateField, { id: \"3\" });\nconst mockCurrentState = [field1, field2, field3];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst newOrder = [\"2\", \"3\", \"1\"];\nconst reorderFieldsAction = reorderFields(newOrder);\nconst newState = update(mockState, reorderFieldsAction);\n\ndescribe(\"Update.reorderFields\", () => {\n it(\"outputs a state with fields in the new order\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(newState.fieldsState[0].id).toEqual(newOrder[0]);\n expect(newState.fieldsState[1].id).toEqual(newOrder[1]);\n expect(newState.fieldsState[2].id).toEqual(newOrder[2]);\n });\n\n it(\"sends the current state to history\", () => {\n expect(newState.fieldsStateHistory[0][0].id).toEqual(mockCurrentState[0].id);\n expect(newState.fieldsStateHistory[0][1].id).toEqual(mockCurrentState[1].id);\n expect(newState.fieldsStateHistory[0][2].id).toEqual(mockCurrentState[2].id);\n });\n\n it(\"Returns the current state if any field id is missing\", () => {\n const sameState = update(mockState, reorderFields([\"1\", \"2\"]));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(sameState.fieldsState[1].id).toEqual(mockState.fieldsState[1].id);\n expect(sameState.fieldsState[2].id).toEqual(mockState.fieldsState[2].id);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"Returns the current state if the reorder array has more elements than it should\", () => {\n const sameState = update(mockState, reorderFields([\"1\", \"2\", \"3\", \"4\"]));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(sameState.fieldsState[1].id).toEqual(mockState.fieldsState[1].id);\n expect(sameState.fieldsState[2].id).toEqual(mockState.fieldsState[2].id);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after creating one object\", () => {\n const changed1 = update(mockState, reorderFields([\"1\", \"2\", \"3\"]));\n const changed2 = update(changed1, reorderFields([\"3\", \"1\", \"2\"]));\n const changed3 = update(changed2, reorderFields([\"3\", \"2\", \"1\"]));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockCurrentState.length);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n expect(changed3.fieldsState[0].id).toEqual(\"3\");\n expect(changed3.fieldsState[1].id).toEqual(\"2\");\n expect(changed3.fieldsState[2].id).toEqual(\"1\");\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { importCustomComponents } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst createType = name => ({\n initialState: _ => _,\n RenderEditor: _ => _,\n info: { type: name, group: \"custom\", displayName: name },\n});\n\nconst mockState = {\n fieldTypes: [createType(\"fictitious-instance\")],\n fieldsState: [],\n fieldsStateHistory: [],\n};\n\nconst customTypes = [\n createType(\"custom-1\"),\n createType(\"custom-2\"),\n createType(\"custom-3\"),\n];\n\nconst importCustomComponentsAction = importCustomComponents(customTypes);\nconst newState = update(mockState, importCustomComponentsAction);\n\n\ndescribe(\"Update.importCustomComponents\", () => {\n it(\"Appends the new valid custom types to the end of the existing types\", () => {\n expect(newState.fieldTypes.length).toEqual(mockState.fieldTypes.length + customTypes.length);\n expect(newState.fieldTypes[1].info.type).toEqual(customTypes[0].info.type);\n expect(newState.fieldTypes[2].info.type).toEqual(customTypes[1].info.type);\n expect(newState.fieldTypes[3].info.type).toEqual(customTypes[2].info.type);\n });\n\n it(\"Returns an unchanged array if customTypes is invalid\", () => {\n expect(update(mockState, importCustomComponents(null))).toEqual(mockState);\n\n const invalid1 = [\n Object.assign({}, createType(\"custom-1\"), { info: null }),\n ];\n expect(update(mockState, importCustomComponents(invalid1))).toEqual(mockState);\n\n const invalid2 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: null, group: \"custom\", displayName: \"custom\" } }),\n ];\n expect(update(mockState, importCustomComponents(invalid2))).toEqual(mockState);\n\n const invalid3 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: \"custom\", group: null, displayName: \"custom\" } }\n ),\n ];\n expect(update(mockState, importCustomComponents(invalid3))).toEqual(mockState);\n\n const invalid4 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: \"custom\", group: \"custom\", displayName: null } }),\n ];\n expect(update(mockState, importCustomComponents(invalid4))).toEqual(mockState);\n\n const invalid5 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { RenderEditor: \"not a function\" }),\n ];\n expect(update(mockState, importCustomComponents(invalid5))).toEqual(mockState);\n\n const invalid6 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { initialState: \"not a function\" }),\n ];\n expect(update(mockState, importCustomComponents(invalid6))).toEqual(mockState);\n });\n});\n"],"names":["undo","importCustomComponents","importState","createField","fieldCreated","toggleConfig","toggleRequired","deleteField","updateField","reorderFields","describe","action","type","toEqual","mockStateToImport","newFieldsState","fieldType","createdFieldState","fieldState","newFieldState","newFieldsOrder","customComponents","define","asyncDispatchMiddleware","syncActivityFinished","actionQueue","flushQueue","forEach","store","dispatch","a","asyncDispatch","asyncAction","concat","actionWithAsyncDispatch","Immutable","merge","fakeAction","done","next","returnedAction","not","undefined","fakeAsyncAction","fakeStore","Either","require$$0","updateAt","_default","keyArray","newVal","obj","deepNewVal","reduceRight","result","key","deep","StateLenses","_default2","_default3","createId","Date","now","Math","random","toString","pushHistoryState","state","newHistoryState","_default4","fieldsStateHistory","_default6","fieldsState","hideConfigs","_default7","map","Object","assign","s","configShowing","propertyTypeCheck","propertyName","babelHelpers.typeof","Right","Left","validateField","fromNullable","leftMap","fs","chain","lastHistoryState","_","Infinity","isArray","Array","arr","fieldTypeIsValid","validTypes","field","find","validFieldTypes","of","validateFieldsState","fieldTypes","addRequiredProperties","fieldStates","id","bimap","console","error","getOrElse","Task","typeConstructor","v","info","reject","resolve","called","constr","initialState","Promise","then","catch","insertRequiredProps","createFieldAsynchronously","rejected","fork","err","Maybe","clone","unimplemented","noop","historyStateWithNewField","newField","_default5","set","replaceFieldState","aField","required","historyStateWithoutField","updateFieldState","historyStateWithNewOrder","newOrder","f1","f2","indexOf","o","length","stateIds","noMissingId","reduce","acc","fId","includes","hasRequiredInfo","component","c","isComponentValid","validateComponents","addToFieldTypes","actionHandlers","isExpectedAction","isReduxAction","update","assert","currentFieldsState","oldFieldsState","mockState","emptyMockState","emptyHistoryMockState","modifiedState","undoAction","typesArray","mockCurrentState","mockHistory","newValidState","newInvalidState","updated","displayName","group","validState2","idx","promiseTypeInstance","promiseType","syncTypeInstance","syncType","asyncAcion","jasmine","createSpy","toHaveBeenCalled","fieldCreatedAction","newState","sameState","changed1","changed2","changed3","fieldStateConfigShowing","fieldStateConfigNotShowing","f","fieldStateIsRequired","fieldStateIsNotRequired","toBeDeletedFieldState","fieldDeleteAction","recentHistoryState","mockField1","mockField2","mockField3","mockState2","oldFieldState","color","fieldUpdateAction","isSame","state1","state2","sameState1","sameState2","sameState3","sameState4","templateField","field1","field2","field3","reorderFieldsAction","createType","name","customTypes","importCustomComponentsAction","invalid1","invalid2","invalid3","invalid4","invalid5","RenderEditor","invalid6"],"mappings":"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","preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL0FjdGlvbnMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy9hY3Rpb25zLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvc2VhbWxlc3MtaW1tdXRhYmxlL3NyYy9zZWFtbGVzcy1pbW11dGFibGUuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy91dGlscy9hc3luY0Rpc3BhdGNoTWlkZGxld2FyZS5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3V0aWxzLmFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZmwtYXNzZXJ0L2Rpc3QvYXNzZXJ0LmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc0FycmF5LmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19zbGljZS5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzUGxhY2Vob2xkZXIuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2N1cnJ5MS5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY3VycnkyLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeTMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc2xpY2UuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvb3Zlci5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9hbHdheXMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc2V0LmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19hcml0eS5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fcGlwZS5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feHdyYXAuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYmluZC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNTdHJpbmcuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaXNBcnJheUxpa2UuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3JlZHVjZS5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9yZWR1Y2UuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdGFpbC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9waXBlLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jb25jYXQuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcHJlcGVuZC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcm9wLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc1RyYW5zZm9ybWVyLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19kaXNwYXRjaGFibGUuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX21hcC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feGZCYXNlLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194bWFwLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeU4uanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvY3VycnlOLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19oYXMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2tleXMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbWFwLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2xlbnMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvY3VycnkuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLmVpdGhlci9saWIvZWl0aGVyLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS5laXRoZXIvbGliL2luZGV4LmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL3V0aWxzLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL3VuZG8uanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lkZW50aXR5LmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2lkZW50aXR5LmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3BhdGguanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXAuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcmVkdWNlUmlnaHQuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc2VxdWVuY2UuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdHJhdmVyc2UuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2FycmF5RnJvbUl0ZXJhdG9yLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19mdW5jdGlvbk5hbWUuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaWRlbnRpY2FsLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3R5cGUuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2VxdWFscy5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9lcXVhbHMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvaW1wb3J0U3RhdGUuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3JlZHVjZWQuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3hmaW5kLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZpbmQuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLnRhc2svbGliL3Rhc2suanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLnRhc2svbGliL2luZGV4LmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2NyZWF0ZUZpZWxkLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2FwcGVuZC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL2RhdGEubWF5YmUvbGliL21heWJlLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS5tYXliZS9saWIvaW5kZXguanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvZmllbGRDcmVhdGVkLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ZpZWxkLnRvZ2dsZUNvbmZpZy5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9maWVsZC50b2dnbGVSZXF1aXJlZC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZmlsdGVyLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc09iamVjdC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feGZpbHRlci5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9maWx0ZXIuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvZmllbGQuZGVsZXRlRmllbGQuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvZmllbGQudXBkYXRlRmllbGQuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc29ydC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9yZW9yZGVyRmllbGRzLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ltcG9ydEN1c3RvbUNvbXBvbmVudHMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvaW5kZXguanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvdW5kby5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9pbXBvcnRTdGF0ZS5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9jcmVhdGVGaWVsZC5qcyIsIi9Vc2Vycy9qb25ueXNjaG1pZC9TaXRlcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9maWVsZENyZWF0ZWQuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvZmllbGQudG9nZ2xlQ29uZmlnLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ZpZWxkLnRvZ2dsZVJlcXVpcmVkLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ZpZWxkLmRlbGV0ZUZpZWxkLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ZpZWxkLnVwZGF0ZUZpZWxkLmpzIiwiL1VzZXJzL2pvbm55c2NobWlkL1NpdGVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL3Jlb3JkZXJGaWVsZHMuanMiLCIvVXNlcnMvam9ubnlzY2htaWQvU2l0ZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvaW1wb3J0Q3VzdG9tQ29tcG9uZW50cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvL1xuLy8gICAgQUNUSU9OIENSRUFUT1JTXG4vL1xuXG5leHBvcnQgY29uc3QgdW5kbyA9IF8gPT5cbih7XG4gIHR5cGU6IFwidW5kb1wiLFxufSk7XG5cbmV4cG9ydCBjb25zdCBpbXBvcnRDdXN0b21Db21wb25lbnRzID0gY3VzdG9tQ29tcG9uZW50cyA9PlxuKHtcbiAgdHlwZTogXCJpbXBvcnRDdXN0b21Db21wb25lbnRzXCIsXG4gIGN1c3RvbUNvbXBvbmVudHMsXG59KTtcblxuXG5leHBvcnQgY29uc3QgaW1wb3J0U3RhdGUgPSBuZXdGaWVsZHNTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJpbXBvcnRTdGF0ZVwiLFxuICBuZXdGaWVsZHNTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRmllbGQgPSBmaWVsZFR5cGUgPT5cbih7XG4gIHR5cGU6IFwiY3JlYXRlRmllbGRcIixcbiAgZmllbGRUeXBlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBmaWVsZENyZWF0ZWQgPSBjcmVhdGVkRmllbGRTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJmaWVsZENyZWF0ZWRcIixcbiAgY3JlYXRlZEZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHRvZ2dsZUNvbmZpZyA9IGZpZWxkU3RhdGUgPT5cbih7XG4gIHR5cGU6IFwidG9nZ2xlQ29uZmlnXCIsXG4gIGZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHRvZ2dsZVJlcXVpcmVkID0gZmllbGRTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJ0b2dnbGVSZXF1aXJlZFwiLFxuICBmaWVsZFN0YXRlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBkZWxldGVGaWVsZCA9IGZpZWxkU3RhdGUgPT5cbih7XG4gIHR5cGU6IFwiZGVsZXRlRmllbGRcIixcbiAgZmllbGRTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlRmllbGQgPSBuZXdGaWVsZFN0YXRlID0+XG4oe1xuICB0eXBlOiBcInVwZGF0ZUZpZWxkXCIsXG4gIG5ld0ZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHJlb3JkZXJGaWVsZHMgPSBuZXdGaWVsZHNPcmRlciA9PlxuKHtcbiAgdHlwZTogXCJyZW9yZGVyRmllbGRzXCIsXG4gIG5ld0ZpZWxkc09yZGVyLFxufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cblxuaW1wb3J0IHtcbiAgdW5kbyxcbiAgaW1wb3J0U3RhdGUsXG4gIGNyZWF0ZUZpZWxkLFxuICBmaWVsZENyZWF0ZWQsXG4gIHRvZ2dsZUNvbmZpZyxcbiAgdG9nZ2xlUmVxdWlyZWQsXG4gIGRlbGV0ZUZpZWxkLFxuICB1cGRhdGVGaWVsZCxcbiAgcmVvcmRlckZpZWxkcyxcbiAgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyxcbn0gZnJvbSBcIi4uL2pzL0FjdGlvbnNcIjtcblxuZGVzY3JpYmUoXCJBY3Rpb25cIiwgKCkgPT4ge1xuICBkZXNjcmliZShcInVuZG9cIiwgKCkgPT4ge1xuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB1bmRvKCk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJ1bmRvXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImltcG9ydFN0YXRlXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2NrU3RhdGVUb0ltcG9ydCA9IFtcImFcIiwgXCJiXCJdO1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGltcG9ydFN0YXRlKG1vY2tTdGF0ZVRvSW1wb3J0KTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcImltcG9ydFN0YXRlXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpbXBvcnRTdGF0ZShtb2NrU3RhdGVUb0ltcG9ydCk7XG4gICAgICBleHBlY3QoYWN0aW9uLm5ld0ZpZWxkc1N0YXRlKS50b0VxdWFsKG1vY2tTdGF0ZVRvSW1wb3J0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJjcmVhdGVGaWVsZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGRUeXBlID0gXCJ0ZXN0RmllbGRcIjtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVGaWVsZChmaWVsZFR5cGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiY3JlYXRlRmllbGRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZpZWxkKGZpZWxkVHlwZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLmZpZWxkVHlwZSkudG9FcXVhbChmaWVsZFR5cGUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImZpZWxkQ3JlYXRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZEZpZWxkU3RhdGUgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiZmllbGRDcmVhdGVkXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZSkudG9FcXVhbChjcmVhdGVkRmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwidG9nZ2xlQ29uZmlnXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZFN0YXRlID0ge307XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdG9nZ2xlQ29uZmlnKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwidG9nZ2xlQ29uZmlnXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVDb25maWcoZmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLmZpZWxkU3RhdGUpLnRvRXF1YWwoZmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwidG9nZ2xlUmVxdWlyZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcInRvZ2dsZVJlcXVpcmVkXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uZmllbGRTdGF0ZSkudG9FcXVhbChmaWVsZFN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJkZWxldGVGaWVsZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGRTdGF0ZSA9IHt9O1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGRlbGV0ZUZpZWxkKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiZGVsZXRlRmllbGRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGRlbGV0ZUZpZWxkKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5maWVsZFN0YXRlKS50b0VxdWFsKGZpZWxkU3RhdGUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcInVwZGF0ZUZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBuZXdGaWVsZFN0YXRlID0ge307XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdXBkYXRlRmllbGQobmV3RmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJ1cGRhdGVGaWVsZFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiQ3JlYXRlcyB0aGUgY29ycmVjdCB2YXJpYWJsZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdXBkYXRlRmllbGQobmV3RmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLm5ld0ZpZWxkU3RhdGUpLnRvRXF1YWwobmV3RmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwicmVvcmRlckZpZWxkc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgbmV3RmllbGRzT3JkZXIgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSByZW9yZGVyRmllbGRzKG5ld0ZpZWxkc09yZGVyKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcInJlb3JkZXJGaWVsZHNcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHJlb3JkZXJGaWVsZHMobmV3RmllbGRzT3JkZXIpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5uZXdGaWVsZHNPcmRlcikudG9FcXVhbChuZXdGaWVsZHNPcmRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiaW1wb3J0Q3VzdG9tQ29tcG9uZW50c1wiLCAoKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tQ29tcG9uZW50cyA9IFtdO1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGltcG9ydEN1c3RvbUNvbXBvbmVudHMoY3VzdG9tQ29tcG9uZW50cyk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJpbXBvcnRDdXN0b21Db21wb25lbnRzXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpbXBvcnRDdXN0b21Db21wb25lbnRzKGN1c3RvbUNvbXBvbmVudHMpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jdXN0b21Db21wb25lbnRzKS50b0VxdWFsKGN1c3RvbUNvbXBvbmVudHMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIiwiKGZ1bmN0aW9uKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gaW1tdXRhYmxlSW5pdChjb25maWcpIHtcblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MTUuMC4xL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDIxXG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xuICB2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFX0ZBTExCQUNLID0gMHhlYWM3O1xuXG4gIHZhciBnbG9iYWxDb25maWcgPSB7XG4gICAgdXNlX3N0YXRpYzogZmFsc2VcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KGNvbmZpZykpIHtcbiAgICAgIGlmIChjb25maWcudXNlX3N0YXRpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ2xvYmFsQ29uZmlnLnVzZV9zdGF0aWMgPSBCb29sZWFuKGNvbmZpZy51c2Vfc3RhdGljKTtcbiAgICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgZGF0YSAhPT0gbnVsbFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KG9iaikge1xuICAgICAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAgICAgaWYgKCFwcm90b3R5cGUpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRQcm9wZXJ0eVRvKHRhcmdldCwgbWV0aG9kTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBtZXRob2ROYW1lLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhblByb3BlcnR5KHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIGFkZFByb3BlcnR5VG8odGFyZ2V0LCBtZXRob2ROYW1lLCBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBJbW11dGFibGVFcnJvcihcIlRoZSBcIiArIG1ldGhvZE5hbWUgK1xuICAgICAgICBcIiBtZXRob2QgY2Fubm90IGJlIGludm9rZWQgb24gYW4gSW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlLlwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBpbW11dGFiaWxpdHlUYWcgPSBcIl9faW1tdXRhYmxlX2ludmFyaWFudHNfaG9sZFwiO1xuXG4gIGZ1bmN0aW9uIGFkZEltbXV0YWJpbGl0eVRhZyh0YXJnZXQpIHtcbiAgICBhZGRQcm9wZXJ0eVRvKHRhcmdldCwgaW1tdXRhYmlsaXR5VGFnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW1tdXRhYmxlKHRhcmdldCkge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0ID09PSBudWxsIHx8IEJvb2xlYW4oXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBpbW11dGFiaWxpdHlUYWcpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBKYXZhU2NyaXB0LCBvbmx5IG9iamVjdHMgYXJlIGV2ZW4gcG90ZW50aWFsbHkgbXV0YWJsZS5cbiAgICAgIC8vIHN0cmluZ3MsIG51bWJlcnMsIG51bGwsIGFuZCB1bmRlZmluZWQgYXJlIGFsbCBuYXR1cmFsbHkgaW1tdXRhYmxlLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gICAgLy8gQXZvaWQgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byAoTmFOICE9PSBOYU4pIGV2YWx1YXRpbmcgdG8gdHJ1ZVxuICAgIHJldHVybiAoYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc01lcmdhYmxlT2JqZWN0KHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQgIT09IG51bGwgJiYgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIiAmJiAhKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBEYXRlKTtcbiAgfVxuXG4gIHZhciBtdXRhdGluZ09iamVjdE1ldGhvZHMgPSBbXG4gICAgXCJzZXRQcm90b3R5cGVPZlwiXG4gIF07XG5cbiAgdmFyIG5vbk11dGF0aW5nT2JqZWN0TWV0aG9kcyA9IFtcbiAgICBcImtleXNcIlxuICBdO1xuXG4gIHZhciBtdXRhdGluZ0FycmF5TWV0aG9kcyA9IG11dGF0aW5nT2JqZWN0TWV0aG9kcy5jb25jYXQoW1xuICAgIFwicHVzaFwiLCBcInBvcFwiLCBcInNvcnRcIiwgXCJzcGxpY2VcIiwgXCJzaGlmdFwiLCBcInVuc2hpZnRcIiwgXCJyZXZlcnNlXCJcbiAgXSk7XG5cbiAgdmFyIG5vbk11dGF0aW5nQXJyYXlNZXRob2RzID0gbm9uTXV0YXRpbmdPYmplY3RNZXRob2RzLmNvbmNhdChbXG4gICAgXCJtYXBcIiwgXCJmaWx0ZXJcIiwgXCJzbGljZVwiLCBcImNvbmNhdFwiLCBcInJlZHVjZVwiLCBcInJlZHVjZVJpZ2h0XCJcbiAgXSk7XG5cbiAgdmFyIG11dGF0aW5nRGF0ZU1ldGhvZHMgPSBtdXRhdGluZ09iamVjdE1ldGhvZHMuY29uY2F0KFtcbiAgICBcInNldERhdGVcIiwgXCJzZXRGdWxsWWVhclwiLCBcInNldEhvdXJzXCIsIFwic2V0TWlsbGlzZWNvbmRzXCIsIFwic2V0TWludXRlc1wiLCBcInNldE1vbnRoXCIsIFwic2V0U2Vjb25kc1wiLFxuICAgIFwic2V0VGltZVwiLCBcInNldFVUQ0RhdGVcIiwgXCJzZXRVVENGdWxsWWVhclwiLCBcInNldFVUQ0hvdXJzXCIsIFwic2V0VVRDTWlsbGlzZWNvbmRzXCIsIFwic2V0VVRDTWludXRlc1wiLFxuICAgIFwic2V0VVRDTW9udGhcIiwgXCJzZXRVVENTZWNvbmRzXCIsIFwic2V0WWVhclwiXG4gIF0pO1xuXG4gIGZ1bmN0aW9uIEltbXV0YWJsZUVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm5hbWUgPSAnTXlFcnJvcic7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuICBJbW11dGFibGVFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbiAgSW1tdXRhYmxlRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXJyb3I7XG5cbiAgZnVuY3Rpb24gbWFrZUltbXV0YWJsZShvYmosIGJhbm5lZE1ldGhvZHMpIHtcbiAgICAvLyBUYWcgaXQgc28gd2UgY2FuIHF1aWNrbHkgdGVsbCBpdCdzIGltbXV0YWJsZSBsYXRlci5cbiAgICBhZGRJbW11dGFiaWxpdHlUYWcob2JqKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIC8vIE1ha2UgYWxsIG11dGF0aW5nIG1ldGhvZHMgdGhyb3cgZXhjZXB0aW9ucy5cbiAgICAgIGZvciAodmFyIGluZGV4IGluIGJhbm5lZE1ldGhvZHMpIHtcbiAgICAgICAgaWYgKGJhbm5lZE1ldGhvZHMuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XG4gICAgICAgICAgYmFuUHJvcGVydHkob2JqLCBiYW5uZWRNZXRob2RzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRnJlZXplIGl0IGFuZCByZXR1cm4gaXQuXG4gICAgICBPYmplY3QuZnJlZXplKG9iaik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VNZXRob2RSZXR1cm5JbW11dGFibGUob2JqLCBtZXRob2ROYW1lKSB7XG4gICAgdmFyIGN1cnJlbnRNZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07XG5cbiAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgbWV0aG9kTmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gSW1tdXRhYmxlKGN1cnJlbnRNZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5U2V0KGlkeCwgdmFsdWUsIGNvbmZpZykge1xuICAgIHZhciBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwO1xuXG4gICAgaWYgKGlkeCBpbiB0aGlzKSB7XG4gICAgICBpZiAoZGVlcCAmJiB0aGlzW2lkeF0gIT09IHZhbHVlICYmIGlzTWVyZ2FibGVPYmplY3QodmFsdWUpICYmIGlzTWVyZ2FibGVPYmplY3QodGhpc1tpZHhdKSkge1xuICAgICAgICB2YWx1ZSA9IEltbXV0YWJsZS5tZXJnZSh0aGlzW2lkeF0sIHZhbHVlLCB7ZGVlcDogdHJ1ZSwgbW9kZTogJ3JlcGxhY2UnfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNFcXVhbCh0aGlzW2lkeF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IGFzTXV0YWJsZUFycmF5LmNhbGwodGhpcyk7XG4gICAgbXV0YWJsZVtpZHhdID0gSW1tdXRhYmxlKHZhbHVlKTtcbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZUFycmF5KG11dGFibGUpO1xuICB9XG5cbiAgdmFyIGltbXV0YWJsZUVtcHR5QXJyYXkgPSBJbW11dGFibGUoW10pO1xuXG4gIGZ1bmN0aW9uIGFycmF5U2V0SW4ocHRoLCB2YWx1ZSwgY29uZmlnKSB7XG4gICAgdmFyIGhlYWQgPSBwdGhbMF07XG5cbiAgICBpZiAocHRoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGFycmF5U2V0LmNhbGwodGhpcywgaGVhZCwgdmFsdWUsIGNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWlsID0gcHRoLnNsaWNlKDEpO1xuICAgICAgdmFyIHRoaXNIZWFkID0gdGhpc1toZWFkXTtcbiAgICAgIHZhciBuZXdWYWx1ZTtcblxuICAgICAgaWYgKHR5cGVvZih0aGlzSGVhZCkgPT09IFwib2JqZWN0XCIgJiYgdGhpc0hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWlnaHQgKHZhbGlkbHkpIGJlIG9iamVjdCBvciBhcnJheVxuICAgICAgICBuZXdWYWx1ZSA9IEltbXV0YWJsZS5zZXRJbih0aGlzSGVhZCwgdGFpbCwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5leHRIZWFkID0gdGFpbFswXTtcbiAgICAgICAgLy8gSWYgdGhlIG5leHQgcGF0aCBwYXJ0IGlzIGEgbnVtYmVyLCB0aGVuIHdlIGFyZSBzZXR0aW5nIGludG8gYW4gYXJyYXksIGVsc2UgYW4gb2JqZWN0LlxuICAgICAgICBpZiAobmV4dEhlYWQgIT09ICcnICYmIGlzRmluaXRlKG5leHRIZWFkKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gYXJyYXlTZXRJbi5jYWxsKGltbXV0YWJsZUVtcHR5QXJyYXksIHRhaWwsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG9iamVjdFNldEluLmNhbGwoaW1tdXRhYmxlRW1wdHlPYmplY3QsIHRhaWwsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaGVhZCBpbiB0aGlzICYmIHRoaXNIZWFkID09PSBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG11dGFibGUgPSBhc011dGFibGVBcnJheS5jYWxsKHRoaXMpO1xuICAgICAgbXV0YWJsZVtoZWFkXSA9IG5ld1ZhbHVlO1xuICAgICAgcmV0dXJuIG1ha2VJbW11dGFibGVBcnJheShtdXRhYmxlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlSW1tdXRhYmxlQXJyYXkoYXJyYXkpIHtcbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlaXIgaW1wbGVtZW50YXRpb25zLCBidXQgd3JhcCB0aGVzZSBmdW5jdGlvbnMgdG8gbWFrZSBzdXJlXG4gICAgLy8gdGhleSBhbHdheXMgcmV0dXJuIGFuIGltbXV0YWJsZSB2YWx1ZS5cbiAgICBmb3IgKHZhciBpbmRleCBpbiBub25NdXRhdGluZ0FycmF5TWV0aG9kcykge1xuICAgICAgaWYgKG5vbk11dGF0aW5nQXJyYXlNZXRob2RzLmhhc093blByb3BlcnR5KGluZGV4KSkge1xuICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IG5vbk11dGF0aW5nQXJyYXlNZXRob2RzW2luZGV4XTtcbiAgICAgICAgbWFrZU1ldGhvZFJldHVybkltbXV0YWJsZShhcnJheSwgbWV0aG9kTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFnbG9iYWxDb25maWcudXNlX3N0YXRpYykge1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJmbGF0TWFwXCIsICBmbGF0TWFwKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwiYXNPYmplY3RcIiwgYXNPYmplY3QpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJhc011dGFibGVcIiwgYXNNdXRhYmxlQXJyYXkpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJzZXRcIiwgYXJyYXlTZXQpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJzZXRJblwiLCBhcnJheVNldEluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwidXBkYXRlXCIsIHVwZGF0ZSk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGFycmF5LCBcInVwZGF0ZUluXCIsIHVwZGF0ZUluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwiZ2V0SW5cIiwgZ2V0SW4pO1xuICAgIH1cblxuICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheVtpXSA9IEltbXV0YWJsZShhcnJheVtpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGUoYXJyYXksIG11dGF0aW5nQXJyYXlNZXRob2RzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VJbW11dGFibGVEYXRlKGRhdGUpIHtcbiAgICBpZiAoIWdsb2JhbENvbmZpZy51c2Vfc3RhdGljKSB7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGRhdGUsIFwiYXNNdXRhYmxlXCIsIGFzTXV0YWJsZURhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlKGRhdGUsIG11dGF0aW5nRGF0ZU1ldGhvZHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNNdXRhYmxlRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVmZmVjdGl2ZWx5IHBlcmZvcm1zIGEgbWFwKCkgb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LCB1c2luZyB0aGVcbiAgICogcHJvdmlkZWQgaXRlcmF0b3IsIGV4Y2VwdCB0aGF0IHdoZW5ldmVyIHRoZSBpdGVyYXRvciByZXR1cm5zIGFuIGFycmF5LCB0aGF0XG4gICAqIGFycmF5J3MgZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBmaW5hbCByZXN1bHQgaW5zdGVhZCBvZiB0aGUgYXJyYXkgaXRzZWxmLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBpdGVyYXRvciAtIFRoZSBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5LiBJdCB3aWxsIHJlY2VpdmUgdGhyZWUgYXJndW1lbnRzOiB0aGUgY3VycmVudCB2YWx1ZSwgdGhlIGN1cnJlbnQgaW5kZXgsIGFuZCB0aGUgY3VycmVudCBvYmplY3QuXG4gICAqL1xuICBmdW5jdGlvbiBmbGF0TWFwKGl0ZXJhdG9yKSB7XG4gICAgLy8gQ2FsbGluZyAuZmxhdE1hcCgpIHdpdGggbm8gYXJndW1lbnRzIGlzIGEgbm8tb3AuIERvbid0IGJvdGhlciBjbG9uaW5nLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gW10sXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBpbmRleDtcblxuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGl0ZXJhdG9yUmVzdWx0ID0gaXRlcmF0b3IodGhpc1tpbmRleF0sIGluZGV4LCB0aGlzKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlcmF0b3JSZXN1bHQpKSB7XG4gICAgICAgIC8vIENvbmNhdGVuYXRlIEFycmF5IHJlc3VsdHMgaW50byB0aGUgcmV0dXJuIHZhbHVlIHdlJ3JlIGJ1aWxkaW5nIHVwLlxuICAgICAgICByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIGl0ZXJhdG9yUmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBub24tQXJyYXkgcmVzdWx0cyB0aGUgc2FtZSB3YXkgbWFwKCkgZG9lcy5cbiAgICAgICAgcmVzdWx0LnB1c2goaXRlcmF0b3JSZXN1bHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlQXJyYXkocmVzdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEltbXV0YWJsZSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cyBpbmNsdWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0ga2V5c1RvUmVtb3ZlIC0gQSBsaXN0IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBrZXlzIHRvIGV4Y2x1ZGUgaW4gdGhlIHJldHVybiB2YWx1ZS4gSW5zdGVhZCBvZiBwcm92aWRpbmcgYSBzaW5nbGUgYXJyYXksIHRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIGNhbGxlZCBieSBwYXNzaW5nIG11bHRpcGxlIHN0cmluZ3MgYXMgc2VwYXJhdGUgYXJndW1lbnRzLlxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aG91dChyZW1vdmUpIHtcbiAgICAvLyBDYWxsaW5nIC53aXRob3V0KCkgd2l0aCBubyBhcmd1bWVudHMgaXMgYSBuby1vcC4gRG9uJ3QgYm90aGVyIGNsb25pbmcuXG4gICAgaWYgKHR5cGVvZiByZW1vdmUgPT09IFwidW5kZWZpbmVkXCIgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZW1vdmUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSWYgd2Ugd2VyZW4ndCBnaXZlbiBhbiBhcnJheSwgdXNlIHRoZSBhcmd1bWVudHMgbGlzdC5cbiAgICAgIHZhciBrZXlzVG9SZW1vdmVBcnJheSA9IChBcnJheS5pc0FycmF5KHJlbW92ZSkpID9cbiAgICAgICAgIHJlbW92ZS5zbGljZSgpIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgICAgLy8gQ29udmVydCBudW1lcmljIGtleXMgdG8gc3RyaW5ncyBzaW5jZSB0aGF0J3MgaG93IHRoZXknbGxcbiAgICAgIC8vIGNvbWUgZnJvbSB0aGUgZW51bWVyYXRpb24gb2YgdGhlIG9iamVjdC5cbiAgICAgIGtleXNUb1JlbW92ZUFycmF5LmZvckVhY2goZnVuY3Rpb24oZWwsIGlkeCwgYXJyKSB7XG4gICAgICAgIGlmKHR5cGVvZihlbCkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBhcnJbaWR4XSA9IGVsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZW1vdmUgPSBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgICByZXR1cm4ga2V5c1RvUmVtb3ZlQXJyYXkuaW5kZXhPZihrZXkpICE9PSAtMTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QodGhpcyk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiByZW1vdmUodGhpc1trZXldLCBrZXkpID09PSBmYWxzZSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChyZXN1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNNdXRhYmxlQXJyYXkob3B0cykge1xuICAgIHZhciByZXN1bHQgPSBbXSwgaSwgbGVuZ3RoO1xuXG4gICAgaWYob3B0cyAmJiBvcHRzLmRlZXApIHtcbiAgICAgIGZvcihpID0gMCwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChhc0RlZXBNdXRhYmxlKHRoaXNbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRWZmZWN0aXZlbHkgcGVyZm9ybXMgYSBbbWFwXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9tYXApIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSwgZXhwZWN0aW5nIHRoYXQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gICAqIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIHR3byBlbGVtZW50cyAtIHRoZSBmaXJzdCByZXByZXNlbnRpbmcgYSBrZXksIHRoZSBvdGhlclxuICAgKiBhIHZhbHVlLiBUaGVuIHJldHVybnMgYW4gSW1tdXRhYmxlIE9iamVjdCBjb25zdHJ1Y3RlZCBvZiB0aG9zZSBrZXlzIGFuZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGl0ZXJhdG9yIC0gQSBmdW5jdGlvbiB3aGljaCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIHR3byBlbGVtZW50cyAtIHRoZSBmaXJzdCByZXByZXNlbnRpbmcgdGhlIGRlc2lyZWQga2V5LCB0aGUgb3RoZXIgdGhlIGRlc2lyZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhc09iamVjdChpdGVyYXRvcikge1xuICAgIC8vIElmIG5vIGl0ZXJhdG9yIHdhcyBwcm92aWRlZCwgYXNzdW1lIHRoZSBpZGVudGl0eSBmdW5jdGlvblxuICAgIC8vIChzdWdnZXN0aW5nIHRoaXMgYXJyYXkgaXMgYWxyZWFkeSBhIGxpc3Qgb2Yga2V5L3ZhbHVlIHBhaXJzLilcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGl0ZXJhdG9yID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSB7fSxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGluZGV4O1xuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgcGFpciAgPSBpdGVyYXRvcih0aGlzW2luZGV4XSwgaW5kZXgsIHRoaXMpLFxuICAgICAgICAgIGtleSAgID0gcGFpclswXSxcbiAgICAgICAgICB2YWx1ZSA9IHBhaXJbMV07XG5cbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QocmVzdWx0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzRGVlcE11dGFibGUob2JqKSB7XG4gICAgaWYgKFxuICAgICAgKCFvYmopIHx8XG4gICAgICAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHx8XG4gICAgICAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBpbW11dGFiaWxpdHlUYWcpKSB8fFxuICAgICAgKG9iaiBpbnN0YW5jZW9mIERhdGUpXG4gICAgKSB7IHJldHVybiBvYmo7IH1cbiAgICByZXR1cm4gSW1tdXRhYmxlLmFzTXV0YWJsZShvYmosIHtkZWVwOiB0cnVlfSk7XG4gIH1cblxuICBmdW5jdGlvbiBxdWlja0NvcHkoc3JjLCBkZXN0KSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3JjLCBrZXkpKSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSW1tdXRhYmxlIE9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgb2YgYm90aFxuICAgKiB0aGlzIG9iamVjdCBhbmQgdGhlIHByb3ZpZGVkIG9iamVjdCwgcHJpb3JpdGl6aW5nIHRoZSBwcm92aWRlZCBvYmplY3Qnc1xuICAgKiB2YWx1ZXMgd2hlbmV2ZXIgdGhlIHNhbWUga2V5IGlzIHByZXNlbnQgaW4gYm90aCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3RoZXIgLSBUaGUgb3RoZXIgb2JqZWN0IHRvIG1lcmdlLiBNdWx0aXBsZSBvYmplY3RzIGNhbiBiZSBwYXNzZWQgYXMgYW4gYXJyYXkuIEluIHN1Y2ggYSBjYXNlLCB0aGUgbGF0ZXIgYW4gb2JqZWN0IGFwcGVhcnMgaW4gdGhhdCBsaXN0LCB0aGUgaGlnaGVyIGl0cyBwcmlvcml0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZyBvYmplY3QgdGhhdCBjb250YWlucyBzZXR0aW5ncy4gU3VwcG9ydGVkIHNldHRpbmdzIGFyZToge2RlZXA6IHRydWV9IGZvciBkZWVwIG1lcmdlIGFuZCB7bWVyZ2VyOiBtZXJnZXJGdW5jfSB3aGVyZSBtZXJnZXJGdW5jIGlzIGEgZnVuY3Rpb25cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGFrZXMgYSBwcm9wZXJ0eSBmcm9tIGJvdGggb2JqZWN0cy4gSWYgYW55dGhpbmcgaXMgcmV0dXJuZWQgaXQgb3ZlcnJpZGVzIHRoZSBub3JtYWwgbWVyZ2UgYmVoYXZpb3VyLlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2Uob3RoZXIsIGNvbmZpZykge1xuICAgIC8vIENhbGxpbmcgLm1lcmdlKCkgd2l0aCBubyBhcmd1bWVudHMgaXMgYSBuby1vcC4gRG9uJ3QgYm90aGVyIGNsb25pbmcuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChvdGhlciA9PT0gbnVsbCB8fCAodHlwZW9mIG90aGVyICE9PSBcIm9iamVjdFwiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkltbXV0YWJsZSNtZXJnZSBjYW4gb25seSBiZSBpbnZva2VkIHdpdGggb2JqZWN0cyBvciBhcnJheXMsIG5vdCBcIiArIEpTT04uc3RyaW5naWZ5KG90aGVyKSk7XG4gICAgfVxuXG4gICAgdmFyIHJlY2VpdmVkQXJyYXkgPSAoQXJyYXkuaXNBcnJheShvdGhlcikpLFxuICAgICAgICBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwLFxuICAgICAgICBtb2RlICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5tb2RlIHx8ICdtZXJnZScsXG4gICAgICAgIG1lcmdlciAgICAgICAgPSBjb25maWcgJiYgY29uZmlnLm1lcmdlcixcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgLy8gVXNlIHRoZSBnaXZlbiBrZXkgdG8gZXh0cmFjdCBhIHZhbHVlIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgdGhlbiBwbGFjZVxuICAgIC8vIHRoYXQgdmFsdWUgaW4gdGhlIHJlc3VsdCBvYmplY3QgdW5kZXIgdGhlIHNhbWUga2V5LiBJZiB0aGF0IHJlc3VsdGVkXG4gICAgLy8gaW4gYSBjaGFuZ2UgZnJvbSB0aGlzIG9iamVjdCdzIHZhbHVlIGF0IHRoYXQga2V5LCBzZXQgYW55Q2hhbmdlcyA9IHRydWUuXG4gICAgZnVuY3Rpb24gYWRkVG9SZXN1bHQoY3VycmVudE9iaiwgb3RoZXJPYmosIGtleSkge1xuICAgICAgdmFyIGltbXV0YWJsZVZhbHVlID0gSW1tdXRhYmxlKG90aGVyT2JqW2tleV0pO1xuICAgICAgdmFyIG1lcmdlclJlc3VsdCA9IG1lcmdlciAmJiBtZXJnZXIoY3VycmVudE9ialtrZXldLCBpbW11dGFibGVWYWx1ZSwgY29uZmlnKTtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50T2JqW2tleV07XG5cbiAgICAgIGlmICgocmVzdWx0ICE9PSB1bmRlZmluZWQpIHx8XG4gICAgICAgIChtZXJnZXJSZXN1bHQgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICAgKCFjdXJyZW50T2JqLmhhc093blByb3BlcnR5KGtleSkpIHx8XG4gICAgICAgICFpc0VxdWFsKGltbXV0YWJsZVZhbHVlLCBjdXJyZW50VmFsdWUpKSB7XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlO1xuXG4gICAgICAgIGlmIChtZXJnZXJSZXN1bHQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG1lcmdlclJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmIChkZWVwICYmIGlzTWVyZ2FibGVPYmplY3QoY3VycmVudFZhbHVlKSAmJiBpc01lcmdhYmxlT2JqZWN0KGltbXV0YWJsZVZhbHVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gSW1tdXRhYmxlLm1lcmdlKGN1cnJlbnRWYWx1ZSwgaW1tdXRhYmxlVmFsdWUsIGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBpbW11dGFibGVWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNFcXVhbChjdXJyZW50VmFsdWUsIG5ld1ZhbHVlKSB8fCAhY3VycmVudE9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBNYWtlIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGUgY3VycmVudCBvYmplY3QuXG4gICAgICAgICAgICByZXN1bHQgPSBxdWlja0NvcHkoY3VycmVudE9iaiwgaW5zdGFudGlhdGVFbXB0eU9iamVjdChjdXJyZW50T2JqKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyRHJvcHBlZEtleXMoY3VycmVudE9iaiwgb3RoZXJPYmopIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBjdXJyZW50T2JqKSB7XG4gICAgICAgIGlmICghb3RoZXJPYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gTWFrZSBhIHNoYWxsb3cgY2xvbmUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LlxuICAgICAgICAgICAgcmVzdWx0ID0gcXVpY2tDb3B5KGN1cnJlbnRPYmosIGluc3RhbnRpYXRlRW1wdHlPYmplY3QoY3VycmVudE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgcmVzdWx0W2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5O1xuXG4gICAgLy8gQWNoaWV2ZSBwcmlvcml0aXphdGlvbiBieSBvdmVycmlkaW5nIHByZXZpb3VzIHZhbHVlcyB0aGF0IGdldCBpbiB0aGUgd2F5LlxuICAgIGlmICghcmVjZWl2ZWRBcnJheSkge1xuICAgICAgLy8gVGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlOiBqdXN0IG1lcmdlIG9uZSBvYmplY3QgaW50byB0aGUgZXhpc3Rpbmcgb25lLlxuICAgICAgZm9yIChrZXkgaW4gb3RoZXIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3RoZXIsIGtleSkpIHtcbiAgICAgICAgICBhZGRUb1Jlc3VsdCh0aGlzLCBvdGhlciwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1vZGUgPT09ICdyZXBsYWNlJykge1xuICAgICAgICBjbGVhckRyb3BwZWRLZXlzKHRoaXMsIG90aGVyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgYWxzbyBhY2NlcHQgYW4gQXJyYXlcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0gb3RoZXIubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgb3RoZXJGcm9tQXJyYXkgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgZm9yIChrZXkgaW4gb3RoZXJGcm9tQXJyYXkpIHtcbiAgICAgICAgICBpZiAob3RoZXJGcm9tQXJyYXkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgYWRkVG9SZXN1bHQocmVzdWx0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0aGlzLCBvdGhlckZyb21BcnJheSwga2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChyZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9iamVjdFJlcGxhY2UodmFsdWUsIGNvbmZpZykge1xuICAgIHZhciBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwO1xuXG4gICAgLy8gQ2FsbGluZyAucmVwbGFjZSgpIHdpdGggbm8gYXJndW1lbnRzIGlzIGEgbm8tb3AuIERvbid0IGJvdGhlciBjbG9uaW5nLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW1tdXRhYmxlI3JlcGxhY2UgY2FuIG9ubHkgYmUgaW52b2tlZCB3aXRoIG9iamVjdHMgb3IgYXJyYXlzLCBub3QgXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBJbW11dGFibGUubWVyZ2UodGhpcywgdmFsdWUsIHtkZWVwOiBkZWVwLCBtb2RlOiAncmVwbGFjZSd9KTtcbiAgfVxuXG4gIHZhciBpbW11dGFibGVFbXB0eU9iamVjdCA9IEltbXV0YWJsZSh7fSk7XG5cbiAgZnVuY3Rpb24gb2JqZWN0U2V0SW4ocGF0aCwgdmFsdWUsIGNvbmZpZykge1xuICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBBcnJheSkgfHwgcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgdG8gSW1tdXRhYmxlI3NldEluIG11c3QgYmUgYW4gYXJyYXkgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgXFxcImtleVxcXCIgc3RyaW5nLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgaGVhZCA9IHBhdGhbMF07XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gb2JqZWN0U2V0LmNhbGwodGhpcywgaGVhZCwgdmFsdWUsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgdmFyIHRhaWwgPSBwYXRoLnNsaWNlKDEpO1xuICAgIHZhciBuZXdWYWx1ZTtcbiAgICB2YXIgdGhpc0hlYWQgPSB0aGlzW2hlYWRdO1xuXG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoaGVhZCkgJiYgdHlwZW9mKHRoaXNIZWFkKSA9PT0gXCJvYmplY3RcIiAmJiB0aGlzSGVhZCAhPT0gbnVsbCkge1xuICAgICAgLy8gTWlnaHQgKHZhbGlkbHkpIGJlIG9iamVjdCBvciBhcnJheVxuICAgICAgbmV3VmFsdWUgPSBJbW11dGFibGUuc2V0SW4odGhpc0hlYWQsIHRhaWwsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUgPSBvYmplY3RTZXRJbi5jYWxsKGltbXV0YWJsZUVtcHR5T2JqZWN0LCB0YWlsLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoaGVhZCkgJiYgdGhpc0hlYWQgPT09IG5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IHF1aWNrQ29weSh0aGlzLCBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KHRoaXMpKTtcbiAgICBtdXRhYmxlW2hlYWRdID0gbmV3VmFsdWU7XG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QobXV0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvYmplY3RTZXQocHJvcGVydHksIHZhbHVlLCBjb25maWcpIHtcbiAgICB2YXIgZGVlcCAgICAgICAgICA9IGNvbmZpZyAmJiBjb25maWcuZGVlcDtcblxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgaWYgKGRlZXAgJiYgdGhpc1twcm9wZXJ0eV0gIT09IHZhbHVlICYmIGlzTWVyZ2FibGVPYmplY3QodmFsdWUpICYmIGlzTWVyZ2FibGVPYmplY3QodGhpc1twcm9wZXJ0eV0pKSB7XG4gICAgICAgIHZhbHVlID0gSW1tdXRhYmxlLm1lcmdlKHRoaXNbcHJvcGVydHldLCB2YWx1ZSwge2RlZXA6IHRydWUsIG1vZGU6ICdyZXBsYWNlJ30pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRXF1YWwodGhpc1twcm9wZXJ0eV0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IHF1aWNrQ29weSh0aGlzLCBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KHRoaXMpKTtcbiAgICBtdXRhYmxlW3Byb3BlcnR5XSA9IEltbXV0YWJsZSh2YWx1ZSk7XG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QobXV0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUocHJvcGVydHksIHVwZGF0ZXIpIHtcbiAgICB2YXIgcmVzdEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHZhciBpbml0aWFsVmFsID0gdGhpc1twcm9wZXJ0eV07XG4gICAgcmV0dXJuIEltbXV0YWJsZS5zZXQodGhpcywgcHJvcGVydHksIHVwZGF0ZXIuYXBwbHkoaW5pdGlhbFZhbCwgW2luaXRpYWxWYWxdLmNvbmNhdChyZXN0QXJncykpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluUGF0aChvYmosIHBhdGgpIHtcbiAgICAvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGF0aC5sZW5ndGg7IG9iaiAhPSBudWxsICYmIGkgPCBsOyBpKyspIHtcbiAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGkgJiYgaSA9PSBsKSA/IG9iaiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUluKHBhdGgsIHVwZGF0ZXIpIHtcbiAgICB2YXIgcmVzdEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHZhciBpbml0aWFsVmFsID0gZ2V0SW5QYXRoKHRoaXMsIHBhdGgpO1xuXG4gICAgcmV0dXJuIEltbXV0YWJsZS5zZXRJbih0aGlzLCBwYXRoLCB1cGRhdGVyLmFwcGx5KGluaXRpYWxWYWwsIFtpbml0aWFsVmFsXS5jb25jYXQocmVzdEFyZ3MpKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJbihwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRJblBhdGgodGhpcywgcGF0aCk7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzTXV0YWJsZU9iamVjdChvcHRzKSB7XG4gICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QodGhpcyksIGtleTtcblxuICAgIGlmKG9wdHMgJiYgb3B0cy5kZWVwKSB7XG4gICAgICBmb3IgKGtleSBpbiB0aGlzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGFzRGVlcE11dGFibGUodGhpc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGtleSBpbiB0aGlzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBDcmVhdGVzIHBsYWluIG9iamVjdCB0byBiZSB1c2VkIGZvciBjbG9uaW5nXG4gIGZ1bmN0aW9uIGluc3RhbnRpYXRlUGxhaW5PYmplY3QoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLy8gRmluYWxpemVzIGFuIG9iamVjdCB3aXRoIGltbXV0YWJsZSBtZXRob2RzLCBmcmVlemVzIGl0LCBhbmQgcmV0dXJucyBpdC5cbiAgZnVuY3Rpb24gbWFrZUltbXV0YWJsZU9iamVjdChvYmopIHtcbiAgICBpZiAoIWdsb2JhbENvbmZpZy51c2Vfc3RhdGljKSB7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJtZXJnZVwiLCBtZXJnZSk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJyZXBsYWNlXCIsIG9iamVjdFJlcGxhY2UpO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwid2l0aG91dFwiLCB3aXRob3V0KTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcImFzTXV0YWJsZVwiLCBhc011dGFibGVPYmplY3QpO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwic2V0XCIsIG9iamVjdFNldCk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJzZXRJblwiLCBvYmplY3RTZXRJbik7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJ1cGRhdGVcIiwgdXBkYXRlKTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcInVwZGF0ZUluXCIsIHVwZGF0ZUluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcImdldEluXCIsIGdldEluKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZShvYmosIG11dGF0aW5nT2JqZWN0TWV0aG9kcyk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgdmFsaWQgcmVhY3QgZWxlbWVudFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MTUuMC4xL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDMyNlxuICBmdW5jdGlvbiBpc1JlYWN0RWxlbWVudChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgb2JqICE9PSBudWxsICYmXG4gICAgICAgICAgIChvYmouJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRV9GQUxMQkFDSyB8fCBvYmouJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0ZpbGVPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBGaWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNQcm9taXNlKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICB0eXBlb2Ygb2JqLnRoZW4gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Vycm9yKG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBFcnJvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIEltbXV0YWJsZShvYmosIG9wdGlvbnMsIHN0YWNrUmVtYWluaW5nKSB7XG4gICAgaWYgKGlzSW1tdXRhYmxlKG9iaikgfHwgaXNSZWFjdEVsZW1lbnQob2JqKSB8fCBpc0ZpbGVPYmplY3Qob2JqKSB8fCBpc0Vycm9yKG9iaikpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSBlbHNlIGlmIChpc1Byb21pc2Uob2JqKSkge1xuICAgICAgcmV0dXJuIG9iai50aGVuKEltbXV0YWJsZSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBtYWtlSW1tdXRhYmxlQXJyYXkob2JqLnNsaWNlKCkpO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIG1ha2VJbW11dGFibGVEYXRlKG5ldyBEYXRlKG9iai5nZXRUaW1lKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRG9uJ3QgZnJlZXplIHRoZSBvYmplY3Qgd2Ugd2VyZSBnaXZlbjsgbWFrZSBhIGNsb25lIGFuZCB1c2UgdGhhdC5cbiAgICAgIHZhciBwcm90b3R5cGUgPSBvcHRpb25zICYmIG9wdGlvbnMucHJvdG90eXBlO1xuICAgICAgdmFyIGluc3RhbnRpYXRlRW1wdHlPYmplY3QgPVxuICAgICAgICAoIXByb3RvdHlwZSB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpID9cbiAgICAgICAgICBpbnN0YW50aWF0ZVBsYWluT2JqZWN0IDogKGZ1bmN0aW9uKCkgeyByZXR1cm4gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpOyB9KTtcbiAgICAgIHZhciBjbG9uZSA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QoKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgICAgICBpZiAoc3RhY2tSZW1haW5pbmcgPT0gbnVsbCkge1xuICAgICAgICAgIHN0YWNrUmVtYWluaW5nID0gNjQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YWNrUmVtYWluaW5nIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW1tdXRhYmxlRXJyb3IoXCJBdHRlbXB0IHRvIGNvbnN0cnVjdCBJbW11dGFibGUgZnJvbSBhIGRlZXBseSBuZXN0ZWQgb2JqZWN0IHdhcyBkZXRlY3RlZC5cIiArXG4gICAgICAgICAgICBcIiBIYXZlIHlvdSB0cmllZCB0byB3cmFwIGFuIG9iamVjdCB3aXRoIGNpcmN1bGFyIHJlZmVyZW5jZXMgKGUuZy4gUmVhY3QgZWxlbWVudCk/XCIgK1xuICAgICAgICAgICAgXCIgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ydGZlbGRtYW4vc2VhbWxlc3MtaW1tdXRhYmxlL3dpa2kvRGVlcGx5LW5lc3RlZC1vYmplY3Qtd2FzLWRldGVjdGVkIGZvciBkZXRhaWxzLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFja1JlbWFpbmluZyAtPSAxO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSkge1xuICAgICAgICAgIGNsb25lW2tleV0gPSBJbW11dGFibGUob2JqW2tleV0sIHVuZGVmaW5lZCwgc3RhY2tSZW1haW5pbmcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYWtlSW1tdXRhYmxlT2JqZWN0KGNsb25lKTtcbiAgICB9XG4gIH1cblxuICAvLyBXcmFwcGVyIHRvIGFsbG93IHRoZSB1c2Ugb2Ygb2JqZWN0IG1ldGhvZHMgYXMgc3RhdGljIG1ldGhvZHMgb2YgSW1tdXRhYmxlLlxuICBmdW5jdGlvbiB0b1N0YXRpYyhmbikge1xuICAgIGZ1bmN0aW9uIHN0YXRpY1dyYXBwZXIoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIHZhciBzZWxmID0gYXJncy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0aWNXcmFwcGVyO1xuICB9XG5cbiAgLy8gV3JhcHBlciB0byBhbGxvdyB0aGUgdXNlIG9mIG9iamVjdCBtZXRob2RzIGFzIHN0YXRpYyBtZXRob2RzIG9mIEltbXV0YWJsZS5cbiAgLy8gd2l0aCB0aGUgYWRkaXRpb25hbCBjb25kaXRpb24gb2YgY2hvb3Npbmcgd2hpY2ggZnVuY3Rpb24gdG8gY2FsbCBkZXBlbmRpbmdcbiAgLy8gaWYgYXJndW1lbnQgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LlxuICBmdW5jdGlvbiB0b1N0YXRpY09iamVjdE9yQXJyYXkoZm5PYmplY3QsIGZuQXJyYXkpIHtcbiAgICBmdW5jdGlvbiBzdGF0aWNXcmFwcGVyKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgc2VsZiA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGYpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXkuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmbk9iamVjdC5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGljV3JhcHBlcjtcbiAgfVxuXG4gIC8vIFdyYXBwZXIgdG8gYWxsb3cgdGhlIHVzZSBvZiBvYmplY3QgbWV0aG9kcyBhcyBzdGF0aWMgbWV0aG9kcyBvZiBJbW11dGFibGUuXG4gIC8vIHdpdGggdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9uIG9mIGNob29zaW5nIHdoaWNoIGZ1bmN0aW9uIHRvIGNhbGwgZGVwZW5kaW5nXG4gIC8vIGlmIGFyZ3VtZW50IGlzIGFuIGFycmF5IG9yIGFuIG9iamVjdCBvciBhIGRhdGUuXG4gIGZ1bmN0aW9uIHRvU3RhdGljT2JqZWN0T3JEYXRlT3JBcnJheShmbk9iamVjdCwgZm5BcnJheSwgZm5EYXRlKSB7XG4gICAgZnVuY3Rpb24gc3RhdGljV3JhcHBlcigpIHtcbiAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgdmFyIHNlbGYgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxmKSkge1xuICAgICAgICAgIHJldHVybiBmbkFycmF5LmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHJldHVybiBmbkRhdGUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmbk9iamVjdC5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGljV3JhcHBlcjtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0aGUgbGlicmFyeVxuICBJbW11dGFibGUuZnJvbSAgICAgICAgICAgPSBJbW11dGFibGU7XG4gIEltbXV0YWJsZS5pc0ltbXV0YWJsZSAgICA9IGlzSW1tdXRhYmxlO1xuICBJbW11dGFibGUuSW1tdXRhYmxlRXJyb3IgPSBJbW11dGFibGVFcnJvcjtcbiAgSW1tdXRhYmxlLm1lcmdlICAgICAgICAgID0gdG9TdGF0aWMobWVyZ2UpO1xuICBJbW11dGFibGUucmVwbGFjZSAgICAgICAgPSB0b1N0YXRpYyhvYmplY3RSZXBsYWNlKTtcbiAgSW1tdXRhYmxlLndpdGhvdXQgICAgICAgID0gdG9TdGF0aWMod2l0aG91dCk7XG4gIEltbXV0YWJsZS5hc011dGFibGUgICAgICA9IHRvU3RhdGljT2JqZWN0T3JEYXRlT3JBcnJheShhc011dGFibGVPYmplY3QsIGFzTXV0YWJsZUFycmF5LCBhc011dGFibGVEYXRlKTtcbiAgSW1tdXRhYmxlLnNldCAgICAgICAgICAgID0gdG9TdGF0aWNPYmplY3RPckFycmF5KG9iamVjdFNldCwgYXJyYXlTZXQpO1xuICBJbW11dGFibGUuc2V0SW4gICAgICAgICAgPSB0b1N0YXRpY09iamVjdE9yQXJyYXkob2JqZWN0U2V0SW4sIGFycmF5U2V0SW4pO1xuICBJbW11dGFibGUudXBkYXRlICAgICAgICAgPSB0b1N0YXRpYyh1cGRhdGUpO1xuICBJbW11dGFibGUudXBkYXRlSW4gICAgICAgPSB0b1N0YXRpYyh1cGRhdGVJbik7XG4gIEltbXV0YWJsZS5nZXRJbiAgICAgICAgICA9IHRvU3RhdGljKGdldEluKTtcbiAgSW1tdXRhYmxlLmZsYXRNYXAgICAgICAgID0gdG9TdGF0aWMoZmxhdE1hcCk7XG4gIEltbXV0YWJsZS5hc09iamVjdCAgICAgICA9IHRvU3RhdGljKGFzT2JqZWN0KTtcbiAgaWYgKCFnbG9iYWxDb25maWcudXNlX3N0YXRpYykge1xuICAgICAgSW1tdXRhYmxlLnN0YXRpYyA9IGltbXV0YWJsZUluaXQoe1xuICAgICAgICAgIHVzZV9zdGF0aWM6IHRydWVcbiAgICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LmZyZWV6ZShJbW11dGFibGUpO1xuXG4gIHJldHVybiBJbW11dGFibGU7XG59XG5cbiAgdmFyIEltbXV0YWJsZSA9IGltbXV0YWJsZUluaXQoKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gSW1tdXRhYmxlO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEltbXV0YWJsZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIGV4cG9ydHMuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIHtcbiAgICB3aW5kb3cuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIpIHtcbiAgICBnbG9iYWwuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9XG59KSgpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tIFwic2VhbWxlc3MtaW1tdXRhYmxlXCI7XG5cbi8vIFRoaXMgbWlkZGxld2FyZSB3aWxsIGp1c3QgYWRkIHRoZSBwcm9wZXJ0eSBcImFzeW5jIGRpc3BhdGNoXCJcbi8vIHRvIGFjdGlvbnMgd2l0aCB0aGUgXCJhc3luY1wiIHByb3BwZXJ0eSBzZXQgdG8gdHJ1ZVxuY29uc3QgYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmUgPSBzdG9yZSA9PiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gIGxldCBzeW5jQWN0aXZpdHlGaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgYWN0aW9uUXVldWUgPSBbXTtcblxuICBmdW5jdGlvbiBmbHVzaFF1ZXVlKCkge1xuICAgIGFjdGlvblF1ZXVlLmZvckVhY2goYSA9PiBzdG9yZS5kaXNwYXRjaChhKSk7IC8vIGZsdXNoIHF1ZXVlXG4gICAgYWN0aW9uUXVldWUgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzeW5jRGlzcGF0Y2goYXN5bmNBY3Rpb24pIHtcbiAgICBhY3Rpb25RdWV1ZSA9IGFjdGlvblF1ZXVlLmNvbmNhdChbYXN5bmNBY3Rpb25dKTtcblxuICAgIGlmIChzeW5jQWN0aXZpdHlGaW5pc2hlZCkge1xuICAgICAgZmx1c2hRdWV1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdGlvbldpdGhBc3luY0Rpc3BhdGNoID1cbiAgICAgIEltbXV0YWJsZShhY3Rpb24pLm1lcmdlKHsgYXN5bmNEaXNwYXRjaCB9KTtcblxuICBuZXh0KGFjdGlvbldpdGhBc3luY0Rpc3BhdGNoKTtcbiAgc3luY0FjdGl2aXR5RmluaXNoZWQgPSB0cnVlO1xuICBmbHVzaFF1ZXVlKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhc3luY0Rpc3BhdGNoTWlkZGxld2FyZTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuaW1wb3J0IGFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlIGZyb20gXCIuLi9qcy91dGlscy9hc3luY0Rpc3BhdGNoTWlkZGxld2FyZVwiO1xuXG5jb25zdCBmYWtlQWN0aW9uID0geyB0eXBlOiBcImZha2UgYWN0aW9uXCIgfTtcblxuZGVzY3JpYmUoXCJUaGUgYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmVcIiwgKCkgPT4ge1xuICBpdChcImNhbGxzIG5leHQgd2l0aCBhc3luY0Rpc3BhdGNoIHByb3BlcnR5XCIsIChkb25lKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHJldHVybmVkQWN0aW9uID0+IHtcbiAgICAgIGV4cGVjdChyZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KHR5cGVvZiByZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKS50b0VxdWFsKFwiZnVuY3Rpb25cIik7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlKFwiZmFrZVN0b3JlXCIpKG5leHQpKGZha2VBY3Rpb24pO1xuICB9KTtcblxuXG4gIGl0KFwiYXN5bmNEaXNwYXRjaCB0cmlnZ2VycyBhIHN0b3JlIGRpc3BhdGNoXCIsIChkb25lKSA9PiB7XG4gICAgY29uc3QgZmFrZUFzeW5jQWN0aW9uID0geyB0eXBlOiBcImZha2VBc3luY0FjdGlvblwiIH07XG5cbiAgICBjb25zdCBmYWtlU3RvcmUgPSB7XG4gICAgICBkaXNwYXRjaDogYWN0aW9uID0+IHtcbiAgICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKGZha2VBc3luY0FjdGlvbi50eXBlKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgbmV4dCA9IHJldHVybmVkQWN0aW9uID0+XG4gICAgICByZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKGZha2VBc3luY0FjdGlvbik7XG5cbiAgICBhc3luY0Rpc3BhdGNoTWlkZGxld2FyZShmYWtlU3RvcmUpKG5leHQpKGZha2VBY3Rpb24pO1xuICB9KTtcbn0pO1xuIiwiLy8gQnVnIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuZXZlclxuLy8gdGhlIGNvbmRpdGlvbiBzZW50IHRvIGl0IGlzIGV2YWx1YXRlZCB0byBmYWxzZVxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgYW5kIG91dHB1dHMgdGhlIGNvcnJlY3QgbWVzc2FnZSBpZiB0aGUgY29uZGl0aW9uXG4gKiBpcyBmYWxzZS4gT3RoZXJ3aXNlIGl0IG91dHB1dHMgbnVsbC5cbiAqIEBhcGkgcHJpdmF0ZVxuICogQG1ldGhvZCBwcm9jZXNzQ29uZGl0aW9uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHtTdHJpbmcgfCBudWxsfSAgLSBFcnJvciBtZXNzYWdlIGlmIHRoZXJlIGlzIGFuIGVycm9yLCBudWwgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGNvbXBsZXRlRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdmFyIHJlID0gL2F0IChbXlxcc10rKVxcc1xcKC9nO1xuICAgIHZhciBzdGFja1RyYWNlID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gICAgdmFyIHN0YWNrRnVuY3Rpb25zID0gW107XG5cbiAgICB2YXIgZnVuY05hbWUgPSByZS5leGVjKHN0YWNrVHJhY2UpO1xuICAgIHdoaWxlIChmdW5jTmFtZSAmJiBmdW5jTmFtZVsxXSkge1xuICAgICAgc3RhY2tGdW5jdGlvbnMucHVzaChmdW5jTmFtZVsxXSk7XG4gICAgICBmdW5jTmFtZSA9IHJlLmV4ZWMoc3RhY2tUcmFjZSk7XG4gICAgfVxuXG4gICAgLy8gTnVtYmVyIDAgaXMgcHJvY2Vzc0NvbmRpdGlvbiBpdHNlbGYsXG4gICAgLy8gTnVtYmVyIDEgaXMgYXNzZXJ0LFxuICAgIC8vIE51bWJlciAyIGlzIHRoZSBjYWxsZXIgZnVuY3Rpb24uXG4gICAgaWYgKHN0YWNrRnVuY3Rpb25zWzJdKSB7XG4gICAgICBjb21wbGV0ZUVycm9yTWVzc2FnZSA9IHN0YWNrRnVuY3Rpb25zWzJdICsgJzogJyArIGNvbXBsZXRlRXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbXBsZXRlRXJyb3JNZXNzYWdlICs9IGVycm9yTWVzc2FnZTtcbiAgICByZXR1cm4gY29tcGxldGVFcnJvck1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGJvb2xlYW4gcGFzc2VkIHRvIGl0IGV2YWx1YXRlcyB0byBmYWxzZS5cbiAqIFRvIGJlIHVzZWQgbGlrZSB0aGlzOlxuICogXHRcdGFzc2VydChteURhdGUgIT09IHVuZGVmaW5lZCwgXCJEYXRlIGNhbm5vdCBiZSB1bmRlZmluZWQuXCIpO1xuICogQGFwaSBwdWJsaWNcbiAqIEBtZXRob2QgYXNzZXJ0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIHZhciBlcnJvciA9IHByb2Nlc3NDb25kaXRpb24oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpO1xuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2dzIGEgd2FybmluZyBpZiB0aGUgYm9vbGVhbiBwYXNzZWQgdG8gaXQgZXZhbHVhdGVzIHRvIGZhbHNlLlxuICogVG8gYmUgdXNlZCBsaWtlIHRoaXM6XG4gKiBcdFx0YXNzZXJ0Lndhcm4obXlEYXRlICE9PSB1bmRlZmluZWQsIFwiTm8gZGF0ZSBwcm92aWRlZC5cIik7XG4gKiBAYXBpIHB1YmxpY1xuICogQG1ldGhvZCB3YXJuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuYXNzZXJ0Lndhcm4gPSBmdW5jdGlvbiB3YXJuKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIHZhciBlcnJvciA9IHByb2Nlc3NDb25kaXRpb24oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpO1xuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFzc2VydDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pSWl3aWMyOTFjbU5sY3lJNld5SmhjM05sY25RdWFuTWlYU3dpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHk4Z1FuVm5JR05vWldOcmFXNW5JR1oxYm1OMGFXOXVJSFJvWVhRZ2QybHNiQ0IwYUhKdmR5QmhiaUJsY25KdmNpQjNhR1Z1WlhabGNseHVMeThnZEdobElHTnZibVJwZEdsdmJpQnpaVzUwSUhSdklHbDBJR2x6SUdWMllXeDFZWFJsWkNCMGJ5Qm1ZV3h6WlZ4dUx5b3FYRzRnS2lCUWNtOWpaWE56WlhNZ2RHaGxJRzFsYzNOaFoyVWdZVzVrSUc5MWRIQjFkSE1nZEdobElHTnZjbkpsWTNRZ2JXVnpjMkZuWlNCcFppQjBhR1VnWTI5dVpHbDBhVzl1WEc0Z0tpQnBjeUJtWVd4elpTNGdUM1JvWlhKM2FYTmxJR2wwSUc5MWRIQjFkSE1nYm5Wc2JDNWNiaUFxSUVCaGNHa2djSEpwZG1GMFpWeHVJQ29nUUcxbGRHaHZaQ0J3Y205alpYTnpRMjl1WkdsMGFXOXVYRzRnS2lCQWNHRnlZVzBnSUh0Q2IyOXNaV0Z1ZlNCamIyNWthWFJwYjI0Z0xTQlNaWE4xYkhRZ2IyWWdkR2hsSUdWMllXeDFZWFJsWkNCamIyNWthWFJwYjI1Y2JpQXFJRUJ3WVhKaGJTQWdlMU4wY21sdVozMGdaWEp5YjNKTlpYTnpZV2RsSUMwZ1RXVnpjMkZuWlNCbGVIQnNZV2x1YVdjZ2RHaGxJR1Z5Y205eUlHbHVJR05oYzJVZ2FYUWdhWE1nZEdoeWIzZHVYRzRnS2lCQWNtVjBkWEp1SUh0VGRISnBibWNnZkNCdWRXeHNmU0FnTFNCRmNuSnZjaUJ0WlhOellXZGxJR2xtSUhSb1pYSmxJR2x6SUdGdUlHVnljbTl5TENCdWRXd2diM1JvWlhKM2FYTmxMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQndjbTlqWlhOelEyOXVaR2wwYVc5dUtHTnZibVJwZEdsdmJpd2daWEp5YjNKTlpYTnpZV2RsS1NCN1hHNGdJR2xtSUNnaFkyOXVaR2wwYVc5dUtTQjdYRzRnSUNBZ2JHVjBJR052YlhCc1pYUmxSWEp5YjNKTlpYTnpZV2RsSUQwZ0p5YzdYRzRnSUNBZ1kyOXVjM1FnY21VZ1BTQXZZWFFnS0Z0ZVhGeHpYU3NwWEZ4elhGd29MMmM3WEc0Z0lDQWdZMjl1YzNRZ2MzUmhZMnRVY21GalpTQTlJRzVsZHlCRmNuSnZjaWdwTG5OMFlXTnJPMXh1SUNBZ0lHTnZibk4wSUhOMFlXTnJSblZ1WTNScGIyNXpJRDBnVzEwN1hHNWNiaUFnSUNCc1pYUWdablZ1WTA1aGJXVWdQU0J5WlM1bGVHVmpLSE4wWVdOclZISmhZMlVwTzF4dUlDQWdJSGRvYVd4bElDaG1kVzVqVG1GdFpTQW1KaUJtZFc1alRtRnRaVnN4WFNrZ2UxeHVJQ0FnSUNBZ2MzUmhZMnRHZFc1amRHbHZibk11Y0hWemFDaG1kVzVqVG1GdFpWc3hYU2s3WEc0Z0lDQWdJQ0JtZFc1alRtRnRaU0E5SUhKbExtVjRaV01vYzNSaFkydFVjbUZqWlNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnTHk4Z1RuVnRZbVZ5SURBZ2FYTWdjSEp2WTJWemMwTnZibVJwZEdsdmJpQnBkSE5sYkdZc1hHNGdJQ0FnTHk4Z1RuVnRZbVZ5SURFZ2FYTWdZWE56WlhKMExGeHVJQ0FnSUM4dklFNTFiV0psY2lBeUlHbHpJSFJvWlNCallXeHNaWElnWm5WdVkzUnBiMjR1WEc0Z0lDQWdhV1lnS0hOMFlXTnJSblZ1WTNScGIyNXpXekpkS1NCN1hHNGdJQ0FnSUNCamIyMXdiR1YwWlVWeWNtOXlUV1Z6YzJGblpTQTlJR0FrZTNOMFlXTnJSblZ1WTNScGIyNXpXekpkZlRvZ0pIdGpiMjF3YkdWMFpVVnljbTl5VFdWemMyRm5aWDFnTzF4dUlDQWdJSDFjYmx4dUlDQWdJR052YlhCc1pYUmxSWEp5YjNKTlpYTnpZV2RsSUNzOUlHVnljbTl5VFdWemMyRm5aVHRjYmlBZ0lDQnlaWFIxY200Z1kyOXRjR3hsZEdWRmNuSnZjazFsYzNOaFoyVTdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdiblZzYkR0Y2JuMWNibHh1THlvcVhHNGdLaUJVYUhKdmQzTWdZVzRnWlhKeWIzSWdhV1lnZEdobElHSnZiMnhsWVc0Z2NHRnpjMlZrSUhSdklHbDBJR1YyWVd4MVlYUmxjeUIwYnlCbVlXeHpaUzVjYmlBcUlGUnZJR0psSUhWelpXUWdiR2xyWlNCMGFHbHpPbHh1SUNvZ1hIUmNkR0Z6YzJWeWRDaHRlVVJoZEdVZ0lUMDlJSFZ1WkdWbWFXNWxaQ3dnWENKRVlYUmxJR05oYm01dmRDQmlaU0IxYm1SbFptbHVaV1F1WENJcE8xeHVJQ29nUUdGd2FTQndkV0pzYVdOY2JpQXFJRUJ0WlhSb2IyUWdZWE56WlhKMFhHNGdLaUJBY0dGeVlXMGdJSHRDYjI5c1pXRnVmU0JqYjI1a2FYUnBiMjRnTFNCU1pYTjFiSFFnYjJZZ2RHaGxJR1YyWVd4MVlYUmxaQ0JqYjI1a2FYUnBiMjVjYmlBcUlFQndZWEpoYlNBZ2UxTjBjbWx1WjMwZ1pYSnliM0pOWlhOellXZGxJQzBnVFdWemMyRm5aU0JsZUhCc1lXbHVhV2NnZEdobElHVnljbTl5SUdsdUlHTmhjMlVnYVhRZ2FYTWdkR2h5YjNkdVhHNGdLaUJBY21WMGRYSnVJSFp2YVdSY2JpQXFMMXh1Wm5WdVkzUnBiMjRnWVhOelpYSjBLR052Ym1ScGRHbHZiaXdnWlhKeWIzSk5aWE56WVdkbEtTQjdYRzRnSUdOdmJuTjBJR1Z5Y205eUlEMGdjSEp2WTJWemMwTnZibVJwZEdsdmJpaGpiMjVrYVhScGIyNHNJR1Z5Y205eVRXVnpjMkZuWlNrN1hHNGdJR2xtSUNoMGVYQmxiMllnWlhKeWIzSWdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR1Z5Y205eUtUdGNiaUFnZlZ4dWZWeHVYRzR2S2lwY2JpQXFJRXh2WjNNZ1lTQjNZWEp1YVc1bklHbG1JSFJvWlNCaWIyOXNaV0Z1SUhCaGMzTmxaQ0IwYnlCcGRDQmxkbUZzZFdGMFpYTWdkRzhnWm1Gc2MyVXVYRzRnS2lCVWJ5QmlaU0IxYzJWa0lHeHBhMlVnZEdocGN6cGNiaUFxSUZ4MFhIUmhjM05sY25RdWQyRnliaWh0ZVVSaGRHVWdJVDA5SUhWdVpHVm1hVzVsWkN3Z1hDSk9ieUJrWVhSbElIQnliM1pwWkdWa0xsd2lLVHRjYmlBcUlFQmhjR2tnY0hWaWJHbGpYRzRnS2lCQWJXVjBhRzlrSUhkaGNtNWNiaUFxSUVCd1lYSmhiU0FnZTBKdmIyeGxZVzU5SUdOdmJtUnBkR2x2YmlBdElGSmxjM1ZzZENCdlppQjBhR1VnWlhaaGJIVmhkR1ZrSUdOdmJtUnBkR2x2Ymx4dUlDb2dRSEJoY21GdElDQjdVM1J5YVc1bmZTQmxjbkp2Y2sxbGMzTmhaMlVnTFNCTlpYTnpZV2RsSUdWNGNHeGhhVzVwWnlCMGFHVWdaWEp5YjNJZ2FXNGdZMkZ6WlNCcGRDQnBjeUIwYUhKdmQyNWNiaUFxSUVCeVpYUjFjbTRnZG05cFpGeHVJQ292WEc1aGMzTmxjblF1ZDJGeWJpQTlJR1oxYm1OMGFXOXVJSGRoY200b1kyOXVaR2wwYVc5dUxDQmxjbkp2Y2sxbGMzTmhaMlVwSUh0Y2JpQWdZMjl1YzNRZ1pYSnliM0lnUFNCd2NtOWpaWE56UTI5dVpHbDBhVzl1S0dOdmJtUnBkR2x2Yml3Z1pYSnliM0pOWlhOellXZGxLVHRjYmlBZ2FXWWdLSFI1Y0dWdlppQmxjbkp2Y2lBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQmpiMjV6YjJ4bExuZGhjbTRvWlhKeWIzSXBPMXh1SUNCOVhHNTlPMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JoYzNObGNuUTdYRzRpWFN3aVptbHNaU0k2SW1GemMyVnlkQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUl2YzI5MWNtTmxMeUo5XG4iLCIvKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGFuIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIF9pc0FycmF5KHZhbCkge1xuICByZXR1cm4gKHZhbCAhPSBudWxsICYmXG4gICAgICAgICAgdmFsLmxlbmd0aCA+PSAwICYmXG4gICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XScpO1xufTtcbiIsIi8qKlxuICogQW4gb3B0aW1pemVkLCBwcml2YXRlIGFycmF5IGBzbGljZWAgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJndW1lbnRzfEFycmF5fSBhcmdzIFRoZSBhcnJheSBvciBhcmd1bWVudHMgb2JqZWN0IHRvIGNvbnNpZGVyLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtmcm9tPTBdIFRoZSBhcnJheSBpbmRleCB0byBzbGljZSBmcm9tLCBpbmNsdXNpdmUuXG4gKiBAcGFyYW0ge051bWJlcn0gW3RvPWFyZ3MubGVuZ3RoXSBUaGUgYXJyYXkgaW5kZXggdG8gc2xpY2UgdG8sIGV4Y2x1c2l2ZS5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldywgc2xpY2VkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9zbGljZShbMSwgMiwgMywgNCwgNV0sIDEsIDMpOyAvLz0+IFsyLCAzXVxuICpcbiAqICAgICAgdmFyIGZpcnN0VGhyZWVBcmdzID0gZnVuY3Rpb24oYSwgYiwgYywgZCkge1xuICogICAgICAgIHJldHVybiBfc2xpY2UoYXJndW1lbnRzLCAwLCAzKTtcbiAqICAgICAgfTtcbiAqICAgICAgZmlyc3RUaHJlZUFyZ3MoMSwgMiwgMywgNCk7IC8vPT4gWzEsIDIsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX3NsaWNlKGFyZ3MsIGZyb20sIHRvKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIF9zbGljZShhcmdzLCAwLCBhcmdzLmxlbmd0aCk7XG4gICAgY2FzZSAyOiByZXR1cm4gX3NsaWNlKGFyZ3MsIGZyb20sIGFyZ3MubGVuZ3RoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGxpc3QgPSBbXTtcbiAgICAgIHZhciBpZHggPSAwO1xuICAgICAgdmFyIGxlbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKGFyZ3MubGVuZ3RoLCB0bykgLSBmcm9tKTtcbiAgICAgIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICAgICAgbGlzdFtpZHhdID0gYXJnc1tmcm9tICsgaWR4XTtcbiAgICAgICAgaWR4ICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdDtcbiAgfVxufTtcbiIsInZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzQXJyYXknKTtcbnZhciBfc2xpY2UgPSByZXF1aXJlKCcuL19zbGljZScpO1xuXG5cbi8qKlxuICogU2ltaWxhciB0byBoYXNNZXRob2QsIHRoaXMgY2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBoYXMgYSBbbWV0aG9kbmFtZV1cbiAqIGZ1bmN0aW9uLiBJZiBpdCBpc24ndCBhbiBhcnJheSBpdCB3aWxsIGV4ZWN1dGUgdGhhdCBmdW5jdGlvbiBvdGhlcndpc2UgaXRcbiAqIHdpbGwgZGVmYXVsdCB0byB0aGUgcmFtZGEgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHJhbWRhIGltcGxlbXRhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZG5hbWUgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFdoYXRldmVyIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpcy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY2hlY2tGb3JNZXRob2QobWV0aG9kbmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdO1xuICAgIHJldHVybiAoX2lzQXJyYXkob2JqKSB8fCB0eXBlb2Ygb2JqW21ldGhvZG5hbWVdICE9PSAnZnVuY3Rpb24nKSA/XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDpcbiAgICAgIG9ialttZXRob2RuYW1lXS5hcHBseShvYmosIF9zbGljZShhcmd1bWVudHMsIDAsIGxlbmd0aCAtIDEpKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9pc1BsYWNlaG9sZGVyKGEpIHtcbiAgcmV0dXJuIGEgIT0gbnVsbCAmJlxuICAgICAgICAgdHlwZW9mIGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgICBhWydAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInXSA9PT0gdHJ1ZTtcbn07XG4iLCJ2YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgb25lLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY3VycnkxKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMShhKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgX2lzUGxhY2Vob2xkZXIoYSkpIHtcbiAgICAgIHJldHVybiBmMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9fY3VycnkxJyk7XG52YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgdHdvLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY3VycnkyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMihhLCBiKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMjtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjJcbiAgICAgICAgICAgICA6IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iKTsgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBmMlxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uKF9hKSB7IHJldHVybiBmbihfYSwgYik7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iKTsgfSlcbiAgICAgICAgICAgICA6IGZuKGEsIGIpO1xuICAgIH1cbiAgfTtcbn07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vX2N1cnJ5MScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfaXNQbGFjZWhvbGRlciA9IHJlcXVpcmUoJy4vX2lzUGxhY2Vob2xkZXInKTtcblxuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0aHJlZS1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2N1cnJ5Myhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjMoYSwgYiwgYykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjM7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYzXG4gICAgICAgICAgICAgOiBfY3VycnkyKGZ1bmN0aW9uKF9iLCBfYykgeyByZXR1cm4gZm4oYSwgX2IsIF9jKTsgfSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYzXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTIoZnVuY3Rpb24oX2EsIF9jKSB7IHJldHVybiBmbihfYSwgYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uKF9iLCBfYykgeyByZXR1cm4gZm4oYSwgX2IsIF9jKTsgfSlcbiAgICAgICAgICAgICA6IF9jdXJyeTEoZnVuY3Rpb24oX2MpIHsgcmV0dXJuIGZuKGEsIGIsIF9jKTsgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBmM1xuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uKF9hLCBfYikgeyByZXR1cm4gZm4oX2EsIF9iLCBjKTsgfSlcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbihfYSwgX2MpIHsgcmV0dXJuIGZuKF9hLCBiLCBfYyk7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTIoZnVuY3Rpb24oX2IsIF9jKSB7IHJldHVybiBmbihhLCBfYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uKF9hKSB7IHJldHVybiBmbihfYSwgYiwgYyk7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iLCBjKTsgfSlcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MShmdW5jdGlvbihfYykgeyByZXR1cm4gZm4oYSwgYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogZm4oYSwgYiwgYyk7XG4gICAgfVxuICB9O1xufTtcbiIsInZhciBfY2hlY2tGb3JNZXRob2QgPSByZXF1aXJlKCcuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZCcpO1xudmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhfY2hlY2tGb3JNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2UoZnJvbUluZGV4LCB0b0luZGV4LCBsaXN0KSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xufSkpO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG9cbiAqIHRoZSBmb2N1c2VkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IChhIC0+IGEpIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5wcm9wLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBoZWFkTGVucyA9IFIubGVuc0luZGV4KDApO1xuICpcbiAqICAgICAgUi5vdmVyKGhlYWRMZW5zLCBSLnRvVXBwZXIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydGT08nLCAnYmFyJywgJ2JheiddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICAvLyBgSWRlbnRpdHlgIGlzIGEgZnVuY3RvciB0aGF0IGhvbGRzIGEgc2luZ2xlIHZhbHVlLCB3aGVyZSBgbWFwYCBzaW1wbHlcbiAgLy8gdHJhbnNmb3JtcyB0aGUgaGVsZCB2YWx1ZSB3aXRoIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAgdmFyIElkZW50aXR5ID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB7dmFsdWU6IHgsIG1hcDogZnVuY3Rpb24oZikgeyByZXR1cm4gSWRlbnRpdHkoZih4KSk7IH19O1xuICB9O1xuXG4gIHJldHVybiBfY3VycnkzKGZ1bmN0aW9uIG92ZXIobGVucywgZiwgeCkge1xuICAgIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGlzIGZpcnN0IHRyYW5zZm9ybWVkIHdpdGggYGZgLFxuICAgIC8vIHRoZW4gc2V0IGFzIHRoZSB2YWx1ZSBvZiBhbiBgSWRlbnRpdHlgLiBUaGlzIGlzIHRoZW4gbWFwcGVkIG92ZXIgd2l0aCB0aGVcbiAgICAvLyBzZXR0ZXIgZnVuY3Rpb24gb2YgdGhlIGxlbnMuXG4gICAgcmV0dXJuIGxlbnMoZnVuY3Rpb24oeSkgeyByZXR1cm4gSWRlbnRpdHkoZih5KSk7IH0pKHgpLnZhbHVlO1xuICB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgZm9yXG4gKiBub24tcHJpbWl0aXZlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMga25vd24gYXMgYGNvbnN0YCwgYGNvbnN0YW50YCwgb3IgYEtgIChmb3IgSyBjb21iaW5hdG9yKSBpblxuICogb3RoZXIgbGFuZ3VhZ2VzIGFuZCBsaWJyYXJpZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogKiAtPiB2YWwuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHQgPSBSLmFsd2F5cygnVGVlJyk7XG4gKiAgICAgIHQoKTsgLy89PiAnVGVlJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gYWx3YXlzKHZhbCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBhbHdheXMgPSByZXF1aXJlKCcuL2Fsd2F5cycpO1xudmFyIG92ZXIgPSByZXF1aXJlKCcuL292ZXInKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IGEgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnByb3AsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLnNldCh4TGVucywgOCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDgsIHk6IDJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBzZXQobGVucywgdiwgeCkge1xuICByZXR1cm4gb3ZlcihsZW5zLCBhbHdheXModiksIHgpO1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9hcml0eShuLCBmbikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYTApIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYTAsIGExKSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA0OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA1OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgNjogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA3OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA4OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgOTogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAxMDogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gX2FyaXR5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gdGVuJyk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9waXBlKGYsIGcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBnLmNhbGwodGhpcywgZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWFdyYXAoZm4pIHtcbiAgICB0aGlzLmYgPSBmbjtcbiAgfVxuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2luaXQgbm90IGltcGxlbWVudGVkIG9uIFhXcmFwJyk7XG4gIH07XG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24oYWNjKSB7IHJldHVybiBhY2M7IH07XG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKGFjYywgeCkge1xuICAgIHJldHVybiB0aGlzLmYoYWNjLCB4KTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gX3h3cmFwKGZuKSB7IHJldHVybiBuZXcgWFdyYXAoZm4pOyB9O1xufSgpKTtcbiIsInZhciBfYXJpdHkgPSByZXF1aXJlKCcuL2ludGVybmFsL19hcml0eScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGJvdW5kIHRvIGEgY29udGV4dC5cbiAqIE5vdGU6IGBSLmJpbmRgIGRvZXMgbm90IHByb3ZpZGUgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQtYmluZGluZyBjYXBhYmlsaXRpZXMgb2ZcbiAqIFtGdW5jdGlvbi5wcm90b3R5cGUuYmluZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCogLT4gKikgLT4geyp9IC0+ICgqIC0+ICopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmluZCB0byBjb250ZXh0XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc09iaiBUaGUgY29udGV4dCB0byBiaW5kIGBmbmAgdG9cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIGluIHRoZSBjb250ZXh0IG9mIGB0aGlzT2JqYC5cbiAqIEBzZWUgUi5wYXJ0aWFsXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGxvZyA9IFIuYmluZChjb25zb2xlLmxvZywgY29uc29sZSk7XG4gKiAgICAgIFIucGlwZShSLmFzc29jKCdhJywgMiksIFIudGFwKGxvZyksIFIuYXNzb2MoJ2EnLCAzKSkoe2E6IDF9KTsgLy89PiB7YTogM31cbiAqICAgICAgLy8gbG9ncyB7YTogMn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNPYmopIHtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzT2JqLCBhcmd1bWVudHMpO1xuICB9KTtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNTdHJpbmcoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBTdHJpbmddJztcbn07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9pc0FycmF5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNBcnJheScpO1xudmFyIF9pc1N0cmluZyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzU3RyaW5nJyk7XG5cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgc2ltaWxhciB0byBhbiBhcnJheS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC41LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGhhcyBhIG51bWVyaWMgbGVuZ3RoIHByb3BlcnR5IGFuZCBleHRyZW1lIGluZGljZXMgZGVmaW5lZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc0FycmF5TGlrZShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzQXJyYXlMaWtlKHRydWUpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNBcnJheUxpa2Uoe30pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNBcnJheUxpa2Uoe2xlbmd0aDogMTB9KTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzQXJyYXlMaWtlKHswOiAnemVybycsIDk6ICduaW5lJywgbGVuZ3RoOiAxMH0pOyAvLz0+IHRydWVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgaWYgKF9pc0FycmF5KHgpKSB7IHJldHVybiB0cnVlOyB9XG4gIGlmICgheCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKF9pc1N0cmluZyh4KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHgubm9kZVR5cGUgPT09IDEpIHsgcmV0dXJuICEheC5sZW5ndGg7IH1cbiAgaWYgKHgubGVuZ3RoID09PSAwKSB7IHJldHVybiB0cnVlOyB9XG4gIGlmICh4Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geC5oYXNPd25Qcm9wZXJ0eSgwKSAmJiB4Lmhhc093blByb3BlcnR5KHgubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG4iLCJ2YXIgX3h3cmFwID0gcmVxdWlyZSgnLi9feHdyYXAnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vYmluZCcpO1xudmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaXNBcnJheUxpa2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gX2FycmF5UmVkdWNlKHhmLCBhY2MsIGxpc3QpIHtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBsaXN0W2lkeF0pO1xuICAgICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9pdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBpdGVyKSB7XG4gICAgdmFyIHN0ZXAgPSBpdGVyLm5leHQoKTtcbiAgICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBzdGVwLnZhbHVlKTtcbiAgICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShhY2MpO1xuICB9XG5cbiAgZnVuY3Rpb24gX21ldGhvZFJlZHVjZSh4ZiwgYWNjLCBvYmopIHtcbiAgICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShvYmoucmVkdWNlKGJpbmQoeGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10sIHhmKSwgYWNjKSk7XG4gIH1cblxuICB2YXIgc3ltSXRlcmF0b3IgPSAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpID8gU3ltYm9sLml0ZXJhdG9yIDogJ0BAaXRlcmF0b3InO1xuICByZXR1cm4gZnVuY3Rpb24gX3JlZHVjZShmbiwgYWNjLCBsaXN0KSB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm4gPSBfeHdyYXAoZm4pO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2UobGlzdCkpIHtcbiAgICAgIHJldHVybiBfYXJyYXlSZWR1Y2UoZm4sIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5yZWR1Y2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBfbWV0aG9kUmVkdWNlKGZuLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICBpZiAobGlzdFtzeW1JdGVyYXRvcl0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIF9pdGVyYWJsZVJlZHVjZShmbiwgYWNjLCBsaXN0W3N5bUl0ZXJhdG9yXSgpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsaXN0Lm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBfaXRlcmFibGVSZWR1Y2UoZm4sIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZHVjZTogbGlzdCBtdXN0IGJlIGFycmF5IG9yIGl0ZXJhYmxlJyk7XG4gIH07XG59KCkpO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBgUi5yZWR1Y2VkYCB0byBzaG9ydGN1dCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZWAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kLiBGb3IgbW9yZSBkZXRhaWxzXG4gKiBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9yZWR1Y2UjRGVzY3JpcHRpb25cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgcmVkdWNlYCBtZXRob2Qgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IFtiXSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5LlxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHsqfSBUaGUgZmluYWwsIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBSLnJlZHVjZWQsIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbnVtYmVycyA9IFsxLCAyLCAzXTtcbiAqICAgICAgdmFyIHBsdXMgPSAoYSwgYikgPT4gYSArIGI7XG4gKlxuICogICAgICBSLnJlZHVjZShwbHVzLCAxMCwgbnVtYmVycyk7IC8vPT4gMTZcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKF9yZWR1Y2UpO1xuIiwidmFyIF9jaGVja0Zvck1ldGhvZCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kJyk7XG52YXIgc2xpY2UgPSByZXF1aXJlKCcuL3NsaWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGxpc3Qgb3Igc3RyaW5nIChvciBvYmplY3RcbiAqIHdpdGggYSBgdGFpbGAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgc2xpY2VgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5oZWFkLCBSLmluaXQsIFIubGFzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGFpbChbMSwgMiwgM10pOyAgLy89PiBbMiwgM11cbiAqICAgICAgUi50YWlsKFsxLCAyXSk7ICAgICAvLz0+IFsyXVxuICogICAgICBSLnRhaWwoWzFdKTsgICAgICAgIC8vPT4gW11cbiAqICAgICAgUi50YWlsKFtdKTsgICAgICAgICAvLz0+IFtdXG4gKlxuICogICAgICBSLnRhaWwoJ2FiYycpOyAgLy89PiAnYmMnXG4gKiAgICAgIFIudGFpbCgnYWInKTsgICAvLz0+ICdiJ1xuICogICAgICBSLnRhaWwoJ2EnKTsgICAgLy89PiAnJ1xuICogICAgICBSLnRhaWwoJycpOyAgICAgLy89PiAnJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jaGVja0Zvck1ldGhvZCgndGFpbCcsIHNsaWNlKDEsIEluZmluaXR5KSk7XG4iLCJ2YXIgX2FyaXR5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fYXJpdHknKTtcbnZhciBfcGlwZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3BpcGUnKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpO1xudmFyIHRhaWwgPSByZXF1aXJlKCcuL3RhaWwnKTtcblxuXG4vKipcbiAqIFBlcmZvcm1zIGxlZnQtdG8tcmlnaHQgZnVuY3Rpb24gY29tcG9zaXRpb24uIFRoZSBsZWZ0bW9zdCBmdW5jdGlvbiBtYXkgaGF2ZVxuICogYW55IGFyaXR5OyB0aGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBtdXN0IGJlIHVuYXJ5LlxuICpcbiAqIEluIHNvbWUgbGlicmFyaWVzIHRoaXMgZnVuY3Rpb24gaXMgbmFtZWQgYHNlcXVlbmNlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIHJlc3VsdCBvZiBwaXBlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGN1cnJpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCgoYSwgYiwgLi4uLCBuKSAtPiBvKSwgKG8gLT4gcCksIC4uLiwgKHggLT4geSksICh5IC0+IHopKSAtPiAoKGEsIGIsIC4uLiwgbikgLT4geilcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIuY29tcG9zZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBmID0gUi5waXBlKE1hdGgucG93LCBSLm5lZ2F0ZSwgUi5pbmMpO1xuICpcbiAqICAgICAgZigzLCA0KTsgLy8gLSgzXjQpICsgMVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBpcGUoKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwaXBlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBfYXJpdHkoYXJndW1lbnRzWzBdLmxlbmd0aCxcbiAgICAgICAgICAgICAgICByZWR1Y2UoX3BpcGUsIGFyZ3VtZW50c1swXSwgdGFpbChhcmd1bWVudHMpKSk7XG59O1xuIiwiLyoqXG4gKiBQcml2YXRlIGBjb25jYXRgIGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBhcnJheS1saWtlIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0MT1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDI9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3LCBtZXJnZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2NvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2NvbmNhdChzZXQxLCBzZXQyKSB7XG4gIHNldDEgPSBzZXQxIHx8IFtdO1xuICBzZXQyID0gc2V0MiB8fCBbXTtcbiAgdmFyIGlkeDtcbiAgdmFyIGxlbjEgPSBzZXQxLmxlbmd0aDtcbiAgdmFyIGxlbjIgPSBzZXQyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4xKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MVtpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4yKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MltpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gcHJlcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChbZWxdLCBsaXN0KTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gc3VwcGxpZWQgYW4gb2JqZWN0IHJldHVybnMgdGhlIGluZGljYXRlZFxuICogcHJvcGVydHkgb2YgdGhhdCBvYmplY3QsIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgcyAtPiB7czogYX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtTdHJpbmd9IHAgVGhlIHByb3BlcnR5IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGF0IGBvYmoucGAuXG4gKiBAc2VlIFIucGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcCgneCcsIHt4OiAxMDB9KTsgLy89PiAxMDBcbiAqICAgICAgUi5wcm9wKCd4Jywge30pOyAvLz0+IHVuZGVmaW5lZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gcHJvcChwLCBvYmopIHsgcmV0dXJuIG9ialtwXTsgfSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9pc1RyYW5zZm9ybWVyKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9ialsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgX2lzQXJyYXkgPSByZXF1aXJlKCcuL19pc0FycmF5Jyk7XG52YXIgX2lzVHJhbnNmb3JtZXIgPSByZXF1aXJlKCcuL19pc1RyYW5zZm9ybWVyJyk7XG52YXIgX3NsaWNlID0gcmVxdWlyZSgnLi9fc2xpY2UnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgd2l0aCBkaWZmZXJlbnQgc3RyYXRlZ2llcyBiYXNlZCBvbiB0aGVcbiAqIG9iamVjdCBpbiBsaXN0IHBvc2l0aW9uIChsYXN0IGFyZ3VtZW50KS4gSWYgaXQgaXMgYW4gYXJyYXksIGV4ZWN1dGVzIFtmbl0uXG4gKiBPdGhlcndpc2UsIGlmIGl0IGhhcyBhIGZ1bmN0aW9uIHdpdGggW21ldGhvZG5hbWVdLCBpdCB3aWxsIGV4ZWN1dGUgdGhhdFxuICogZnVuY3Rpb24gKGZ1bmN0b3IgY2FzZSkuIE90aGVyd2lzZSwgaWYgaXQgaXMgYSB0cmFuc2Zvcm1lciwgdXNlcyB0cmFuc2R1Y2VyXG4gKiBbeGZdIHRvIHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lciAodHJhbnNkdWNlciBjYXNlKS4gT3RoZXJ3aXNlLCBpdCB3aWxsXG4gKiBkZWZhdWx0IHRvIGV4ZWN1dGluZyBbZm5dLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kbmFtZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHhmIHRyYW5zZHVjZXIgdG8gaW5pdGlhbGl6ZSBpZiBvYmplY3QgaXMgdHJhbnNmb3JtZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIGRlZmF1bHQgcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvbiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvblxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9kaXNwYXRjaGFibGUobWV0aG9kbmFtZSwgeGYsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1tsZW5ndGggLSAxXTtcbiAgICBpZiAoIV9pc0FycmF5KG9iaikpIHtcbiAgICAgIHZhciBhcmdzID0gX3NsaWNlKGFyZ3VtZW50cywgMCwgbGVuZ3RoIC0gMSk7XG4gICAgICBpZiAodHlwZW9mIG9ialttZXRob2RuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gb2JqW21ldGhvZG5hbWVdLmFwcGx5KG9iaiwgYXJncyk7XG4gICAgICB9XG4gICAgICBpZiAoX2lzVHJhbnNmb3JtZXIob2JqKSkge1xuICAgICAgICB2YXIgdHJhbnNkdWNlciA9IHhmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gdHJhbnNkdWNlcihvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9tYXAoZm4sIGZ1bmN0b3IpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBmdW5jdG9yLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbik7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICByZXN1bHRbaWR4XSA9IGZuKGZ1bmN0b3JbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9pbml0J10oKTtcbiAgfSxcbiAgcmVzdWx0OiBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH1cbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWE1hcChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYTWFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5mKGlucHV0KSk7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3htYXAoZiwgeGYpIHsgcmV0dXJuIG5ldyBYTWFwKGYsIHhmKTsgfSk7XG59KCkpO1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vX2FyaXR5Jyk7XG52YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBJbnRlcm5hbCBjdXJyeU4gZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgb2YgdGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSByZWNlaXZlZCBBbiBhcnJheSBvZiBhcmd1bWVudHMgcmVjZWl2ZWQgdGh1cyBmYXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2N1cnJ5TihsZW5ndGgsIHJlY2VpdmVkLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvbWJpbmVkID0gW107XG4gICAgdmFyIGFyZ3NJZHggPSAwO1xuICAgIHZhciBsZWZ0ID0gbGVuZ3RoO1xuICAgIHZhciBjb21iaW5lZElkeCA9IDA7XG4gICAgd2hpbGUgKGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoIHx8IGFyZ3NJZHggPCBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoICYmXG4gICAgICAgICAgKCFfaXNQbGFjZWhvbGRlcihyZWNlaXZlZFtjb21iaW5lZElkeF0pIHx8XG4gICAgICAgICAgIGFyZ3NJZHggPj0gYXJndW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZWRbY29tYmluZWRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzW2FyZ3NJZHhdO1xuICAgICAgICBhcmdzSWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBjb21iaW5lZFtjb21iaW5lZElkeF0gPSByZXN1bHQ7XG4gICAgICBpZiAoIV9pc1BsYWNlaG9sZGVyKHJlc3VsdCkpIHtcbiAgICAgICAgbGVmdCAtPSAxO1xuICAgICAgfVxuICAgICAgY29tYmluZWRJZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQgPD0gMCA/IGZuLmFwcGx5KHRoaXMsIGNvbWJpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgOiBfYXJpdHkobGVmdCwgX2N1cnJ5TihsZW5ndGgsIGNvbWJpbmVkLCBmbikpO1xuICB9O1xufTtcbiIsInZhciBfYXJpdHkgPSByZXF1aXJlKCcuL2ludGVybmFsL19hcml0eScpO1xudmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2N1cnJ5TiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5TicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZXF1aXZhbGVudCBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24sIHdpdGggdGhlIHNwZWNpZmllZFxuICogYXJpdHkuIFRoZSBjdXJyaWVkIGZ1bmN0aW9uIGhhcyB0d28gdW51c3VhbCBjYXBhYmlsaXRpZXMuIEZpcnN0LCBpdHNcbiAqIGFyZ3VtZW50cyBuZWVkbid0IGJlIHByb3ZpZGVkIG9uZSBhdCBhIHRpbWUuIElmIGBnYCBpcyBgUi5jdXJyeU4oMywgZilgLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSkoMikoMylgXG4gKiAgIC0gYGcoMSkoMiwgMylgXG4gKiAgIC0gYGcoMSwgMikoMylgXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKlxuICogU2Vjb25kbHksIHRoZSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIGBSLl9fYCBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIGBSLl9fYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBzdW1BcmdzID0gKC4uLmFyZ3MpID0+IFIuc3VtKGFyZ3MpO1xuICpcbiAqICAgICAgdmFyIGN1cnJpZWRBZGRGb3VyTnVtYmVycyA9IFIuY3VycnlOKDQsIHN1bUFyZ3MpO1xuICogICAgICB2YXIgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgdmFyIGcgPSBmKDMpO1xuICogICAgICBnKDQpOyAvLz0+IDEwXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBjdXJyeU4obGVuZ3RoLCBmbikge1xuICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIF9jdXJyeTEoZm4pO1xuICB9XG4gIHJldHVybiBfYXJpdHkobGVuZ3RoLCBfY3VycnlOKGxlbmd0aCwgW10sIGZuKSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2hhcyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufTtcbiIsInZhciBfaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFyZ3VtZW50cykgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nID9cbiAgICBmdW5jdGlvbiBfaXNBcmd1bWVudHMoeCkgeyByZXR1cm4gdG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7IH0gOlxuICAgIGZ1bmN0aW9uIF9pc0FyZ3VtZW50cyh4KSB7IHJldHVybiBfaGFzKCdjYWxsZWUnLCB4KTsgfTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL2ludGVybmFsL19oYXMnKTtcbnZhciBfaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc0FyZ3VtZW50cycpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mXG4gKiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW2tdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5rZXlzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWydhJywgJ2InLCAnYyddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICAvLyBjb3ZlciBJRSA8IDkga2V5cyBpc3N1ZXNcbiAgdmFyIGhhc0VudW1CdWcgPSAhKHt0b1N0cmluZzogbnVsbH0pLnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xuICB2YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWydjb25zdHJ1Y3RvcicsICd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuICAvLyBTYWZhcmkgYnVnXG4gIHZhciBoYXNBcmdzRW51bUJ1ZyA9IChmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5wcm9wZXJ0eUlzRW51bWVyYWJsZSgnbGVuZ3RoJyk7XG4gIH0oKSk7XG5cbiAgdmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMobGlzdCwgaXRlbSkge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgaWYgKGxpc3RbaWR4XSA9PT0gaXRlbSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcmV0dXJuIHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiAhaGFzQXJnc0VudW1CdWcgP1xuICAgIF9jdXJyeTEoZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgICAgIHJldHVybiBPYmplY3Qob2JqKSAhPT0gb2JqID8gW10gOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIH0pIDpcbiAgICBfY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gICAgICBpZiAoT2JqZWN0KG9iaikgIT09IG9iaikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgcHJvcCwgbklkeDtcbiAgICAgIHZhciBrcyA9IFtdO1xuICAgICAgdmFyIGNoZWNrQXJnc0xlbmd0aCA9IGhhc0FyZ3NFbnVtQnVnICYmIF9pc0FyZ3VtZW50cyhvYmopO1xuICAgICAgZm9yIChwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoX2hhcyhwcm9wLCBvYmopICYmICghY2hlY2tBcmdzTGVuZ3RoIHx8IHByb3AgIT09ICdsZW5ndGgnKSkge1xuICAgICAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGFzRW51bUJ1Zykge1xuICAgICAgICBuSWR4ID0gbm9uRW51bWVyYWJsZVByb3BzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChuSWR4ID49IDApIHtcbiAgICAgICAgICBwcm9wID0gbm9uRW51bWVyYWJsZVByb3BzW25JZHhdO1xuICAgICAgICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgIWNvbnRhaW5zKGtzLCBwcm9wKSkge1xuICAgICAgICAgICAga3Nba3MubGVuZ3RoXSA9IHByb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5JZHggLT0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGtzO1xuICAgIH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF9tYXAgPSByZXF1aXJlKCcuL2ludGVybmFsL19tYXAnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3htYXAgPSByZXF1aXJlKCcuL2ludGVybmFsL194bWFwJyk7XG52YXIgY3VycnlOID0gcmVxdWlyZSgnLi9jdXJyeU4nKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cblxuLyoqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uIGFuZFxuICogYSBbZnVuY3Rvcl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNmdW5jdG9yKSxcbiAqIGFwcGxpZXMgdGhlIGZ1bmN0aW9uIHRvIGVhY2ggb2YgdGhlIGZ1bmN0b3IncyB2YWx1ZXMsIGFuZCByZXR1cm5zXG4gKiBhIGZ1bmN0b3Igb2YgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogUmFtZGEgcHJvdmlkZXMgc3VpdGFibGUgYG1hcGAgaW1wbGVtZW50YXRpb25zIGZvciBgQXJyYXlgIGFuZCBgT2JqZWN0YCxcbiAqIHNvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGFwcGxpZWQgdG8gYFsxLCAyLCAzXWAgb3IgYHt4OiAxLCB5OiAyLCB6OiAzfWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYG1hcGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEFsc28gdHJlYXRzIGZ1bmN0aW9ucyBhcyBmdW5jdG9ycyBhbmQgd2lsbCBjb21wb3NlIHRoZW0gdG9nZXRoZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGdW5jdG9yIGYgPT4gKGEgLT4gYikgLT4gZiBhIC0+IGYgYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBldmVyeSBlbGVtZW50IG9mIHRoZSBpbnB1dCBgbGlzdGAuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGJlIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG5ldyBsaXN0LlxuICogQHNlZSBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkb3VibGUgPSB4ID0+IHggKiAyO1xuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCBbMSwgMiwgM10pOyAvLz0+IFsyLCA0LCA2XVxuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCB7eDogMSwgeTogMiwgejogM30pOyAvLz0+IHt4OiAyLCB5OiA0LCB6OiA2fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZSgnbWFwJywgX3htYXAsIGZ1bmN0aW9uIG1hcChmbiwgZnVuY3Rvcikge1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jdG9yKSkge1xuICAgIGNhc2UgJ1tvYmplY3QgRnVuY3Rpb25dJzpcbiAgICAgIHJldHVybiBjdXJyeU4oZnVuY3Rvci5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBmdW5jdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgfSk7XG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzpcbiAgICAgIHJldHVybiBfcmVkdWNlKGZ1bmN0aW9uKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gZm4oZnVuY3RvcltrZXldKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9LCBrZXlzKGZ1bmN0b3IpKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIF9tYXAoZm4sIGZ1bmN0b3IpO1xuICB9XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyBmb3IgdGhlIGdpdmVuIGdldHRlciBhbmQgc2V0dGVyIGZ1bmN0aW9ucy4gVGhlIGdldHRlciBcImdldHNcIlxuICogdGhlIHZhbHVlIG9mIHRoZSBmb2N1czsgdGhlIHNldHRlciBcInNldHNcIiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzLiBUaGUgc2V0dGVyXG4gKiBzaG91bGQgbm90IG11dGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyAocyAtPiBhKSAtPiAoKGEsIHMpIC0+IHMpIC0+IExlbnMgcyBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlclxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB4TGVucyA9IFIubGVucyhSLnByb3AoJ3gnKSwgUi5hc3NvYygneCcpKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgICAvLz0+IDFcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIub3Zlcih4TGVucywgUi5uZWdhdGUsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiAtMSwgeTogMn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGxlbnMoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRvRnVuY3RvckZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgcmV0dXJuIG1hcChcbiAgICAgICAgZnVuY3Rpb24oZm9jdXMpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKGZvY3VzLCB0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICB0b0Z1bmN0b3JGbihnZXR0ZXIodGFyZ2V0KSlcbiAgICAgICk7XG4gICAgfTtcbiAgfTtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBjdXJyeU4gPSByZXF1aXJlKCcuL2N1cnJ5TicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZXF1aXZhbGVudCBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIFRoZSBjdXJyaWVkIGZ1bmN0aW9uXG4gKiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzIGFyZ3VtZW50cyBuZWVkbid0IGJlIHByb3ZpZGVkIG9uZVxuICogYXQgYSB0aW1lLiBJZiBgZmAgaXMgYSB0ZXJuYXJ5IGZ1bmN0aW9uIGFuZCBgZ2AgaXMgYFIuY3VycnkoZilgLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSkoMikoMylgXG4gKiAgIC0gYGcoMSkoMiwgMylgXG4gKiAgIC0gYGcoMSwgMikoMylgXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKlxuICogU2Vjb25kbHksIHRoZSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIGBSLl9fYCBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIGBSLl9fYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqIC0+IGEpIC0+ICgqIC0+IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcsIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY3VycnlOXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGFkZEZvdXJOdW1iZXJzID0gKGEsIGIsIGMsIGQpID0+IGEgKyBiICsgYyArIGQ7XG4gKlxuICogICAgICB2YXIgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeShhZGRGb3VyTnVtYmVycyk7XG4gKiAgICAgIHZhciBmID0gY3VycmllZEFkZEZvdXJOdW1iZXJzKDEsIDIpO1xuICogICAgICB2YXIgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGN1cnJ5KGZuKSB7XG4gIHJldHVybiBjdXJyeU4oZm4ubGVuZ3RoLCBmbik7XG59KTtcbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLyoqXG4gKiBAbW9kdWxlIGxpYi9laXRoZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBFaXRoZXJcblxuLy8gLS0gQWxpYXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgY2xvbmUgICAgICAgICA9IE9iamVjdC5jcmVhdGVcbnZhciB1bmltcGxlbWVudGVkID0gZnVuY3Rpb24oKXsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJykgfVxudmFyIG5vb3AgICAgICAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblxuLy8gLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVGhlIGBFaXRoZXIoYSwgYilgIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBsb2dpY2FsIGRpc2p1bmN0aW9uIGJldHdlZW4gYGFgXG4gKiBhbmQgYGJgLiBJbiBvdGhlciB3b3JkcywgYEVpdGhlcmAgbWF5IGNvbnRhaW4gZWl0aGVyIGEgdmFsdWUgb2YgdHlwZSBgYWAgb3JcbiAqIGEgdmFsdWUgb2YgdHlwZSBgYmAsIGF0IGFueSBnaXZlbiB0aW1lLiBUaGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gaXNcbiAqIGJpYXNlZCBvbiB0aGUgcmlnaHQgdmFsdWUgKGBiYCksIHRodXMgcHJvamVjdGlvbnMgd2lsbCB0YWtlIHRoZSByaWdodCB2YWx1ZVxuICogb3ZlciB0aGUgbGVmdCBvbmUuXG4gKlxuICogVGhpcyBjbGFzcyBtb2RlbHMgdHdvIGRpZmZlcmVudCBjYXNlczogYExlZnQgYWAgYW5kIGBSaWdodCBiYCwgYW5kIGNhbiBob2xkXG4gKiBvbmUgb2YgdGhlIGNhc2VzIGF0IGFueSBnaXZlbiB0aW1lLiBUaGUgcHJvamVjdGlvbnMgYXJlLCBub25lIHRoZSBsZXNzLFxuICogYmlhc2VkIGZvciB0aGUgYFJpZ2h0YCBjYXNlLCB0aHVzIGEgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIHN0cnVjdHVyZSBpcyB0b1xuICogaG9sZCB0aGUgcmVzdWx0cyBvZiBjb21wdXRhdGlvbnMgdGhhdCBtYXkgZmFpbCwgd2hlbiB5b3Ugd2FudCB0byBzdG9yZVxuICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgZmFpbHVyZSAoaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24pLlxuICpcbiAqIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWVzIG9mIGBFaXRoZXIoYSwgYilgIGNhbiBiZSBjb21iaW5lZCBhbmQgbWFuaXB1bGF0ZWQgYnlcbiAqIHVzaW5nIHRoZSBleHByZXNzaXZlIG1vbmFkaWMgb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3Mgc2FmZWx5IHNlcXVlbmNpbmdcbiAqIG9wZXJhdGlvbnMgdGhhdCBtYXkgZmFpbCwgYW5kIHNhZmVseSBjb21wb3NpbmcgdmFsdWVzIHRoYXQgeW91IGRvbid0IGtub3dcbiAqIHdoZXRoZXIgdGhleSdyZSBwcmVzZW50IG9yIG5vdCwgZmFpbGluZyBlYXJseSAocmV0dXJuaW5nIGEgYExlZnQgYWApIGlmIGFueVxuICogb2YgdGhlIG9wZXJhdGlvbnMgZmFpbC5cbiAqXG4gKiBXaGlsZSB0aGlzIGNsYXNzIGNhbiBjZXJ0YWlubHkgbW9kZWwgaW5wdXQgdmFsaWRhdGlvbnMsIHRoZSBbVmFsaWRhdGlvbl1bXVxuICogc3RydWN0dXJlIGxlbmRzIGl0c2VsZiBiZXR0ZXIgdG8gdGhhdCB1c2UgY2FzZSwgc2luY2UgaXQgY2FuIG5hdHVyYWxseVxuICogYWdncmVnYXRlIGZhaWx1cmVzIOKAlCBtb25hZHMgc2hvcnRjdXQgb24gdGhlIGZpcnN0IGZhaWx1cmUuXG4gKlxuICogW1ZhbGlkYXRpb25dOiBodHRwczovL2dpdGh1Yi5jb20vZm9sa3RhbGUvZGF0YS52YWxpZGF0aW9uXG4gKlxuICpcbiAqIEBjbGFzc1xuICogQHN1bW1hcnlcbiAqIEVpdGhlclvOsSwgzrJdIDw6IEFwcGxpY2F0aXZlW86yXVxuICogICAgICAgICAgICAgICAsIEZ1bmN0b3JbzrJdXG4gKiAgICAgICAgICAgICAgICwgQ2hhaW5bzrJdXG4gKiAgICAgICAgICAgICAgICwgU2hvd1xuICogICAgICAgICAgICAgICAsIEVxXG4gKi9cbmZ1bmN0aW9uIEVpdGhlcigpIHsgfVxuXG5MZWZ0LnByb3RvdHlwZSA9IGNsb25lKEVpdGhlci5wcm90b3R5cGUpXG5mdW5jdGlvbiBMZWZ0KGEpIHtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuUmlnaHQucHJvdG90eXBlID0gY2xvbmUoRWl0aGVyLnByb3RvdHlwZSlcbmZ1bmN0aW9uIFJpZ2h0KGEpIHtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuLy8gLS0gQ29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBob2xkaW5nIGEgYExlZnRgIHZhbHVlLiBUaGlzXG4gKiB1c3VhbGx5IHJlcHJlc2VudHMgYSBmYWlsdXJlIGR1ZSB0byB0aGUgcmlnaHQtYmlhcyBvZiB0aGlzIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBhIOKGkiBFaXRoZXJbzrEsIM6yXVxuICovXG5FaXRoZXIuTGVmdCA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBMZWZ0KGEpXG59XG5FaXRoZXIucHJvdG90eXBlLkxlZnQgPSBFaXRoZXIuTGVmdFxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgaG9sZGluZyBhIGBSaWdodGAgdmFsdWUuIFRoaXNcbiAqIHVzdWFsbHkgcmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgdmFsdWUgZHVlIHRvIHRoZSByaWdodCBiaWFzIG9mIHRoaXNcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsiDihpIgRWl0aGVyW86xLCDOsl1cbiAqL1xuRWl0aGVyLlJpZ2h0ID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gbmV3IFJpZ2h0KGEpXG59XG5FaXRoZXIucHJvdG90eXBlLlJpZ2h0ID0gRWl0aGVyLlJpZ2h0XG5cblxuLy8gLS0gQ29udmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBmcm9tIGEgbnVsbGFibGUgdHlwZS5cbiAqXG4gKiBUYWtlcyB0aGUgYExlZnRgIGNhc2UgaWYgdGhlIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC4gVGFrZXMgdGhlXG4gKiBgUmlnaHRgIGNhc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBzdW1tYXJ5IM6xIOKGkiBFaXRoZXJbzrEsIM6xXVxuICovXG5FaXRoZXIuZnJvbU51bGxhYmxlID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gYSAhPSBudWxsPyAgICAgICBuZXcgUmlnaHQoYSlcbiAgOiAgICAgIC8qIG90aGVyd2lzZSAqLyAgbmV3IExlZnQoYSlcbn1cbkVpdGhlci5wcm90b3R5cGUuZnJvbU51bGxhYmxlID0gRWl0aGVyLmZyb21OdWxsYWJsZVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgZnJvbSBhIGBWYWxpZGF0aW9uW86xLCDOsl1gIHR5cGUuXG4gKlxuICogQHN1bW1hcnkgVmFsaWRhdGlvblvOsSwgzrJdIOKGkiBFaXRoZXJbzrEsIM6yXVxuICovXG5FaXRoZXIuZnJvbVZhbGlkYXRpb24gPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmZvbGQoRWl0aGVyLkxlZnQsIEVpdGhlci5SaWdodClcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIHN5bmNocm9ub3VzIGNvbXB1dGF0aW9uIHRoYXQgbWF5IHRocm93IGFuZCBjb252ZXJ0cyBpdCB0byBhblxuICogRWl0aGVyIHR5cGUuXG4gKlxuICogQHN1bW1hcnkgKM6x4oKBLCDOseKCgiwgLi4uLCDOseKCmSAtPiDOsiA6OiB0aHJvd3MgzrMpIC0+ICjOseKCgSwgzrHigoIsIC4uLiwgzrHigpkgLT4gRWl0aGVyW86zLCDOsl0pXG4gKi9cbkVpdGhlci50cnkgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBSaWdodChmLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpXG4gICAgfSBjYXRjaChlKSB7XG4gICAgICByZXR1cm4gbmV3IExlZnQoZSlcbiAgICB9XG4gIH1cbn1cblxuXG4vLyAtLSBQcmVkaWNhdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBgRWl0aGVyW86xLCDOsl1gIGNvbnRhaW5zIGEgYExlZnRgIHZhbHVlLlxuICpcbiAqIEBzdW1tYXJ5IEJvb2xlYW5cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5pc0xlZnQgPSBmYWxzZVxuTGVmdC5wcm90b3R5cGUuaXNMZWZ0ICAgPSB0cnVlXG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBjb250YWlucyBhIGBSaWdodGAgdmFsdWUuXG4gKlxuICogQHN1bW1hcnkgQm9vbGVhblxuICovXG5FaXRoZXIucHJvdG90eXBlLmlzUmlnaHQgPSBmYWxzZVxuUmlnaHQucHJvdG90eXBlLmlzUmlnaHQgID0gdHJ1ZVxuXG5cbi8vIC0tIEFwcGxpY2F0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBpbnN0YW5jZSBob2xkaW5nIHRoZSBgUmlnaHRgIHZhbHVlIGBiYC5cbiAqXG4gKiBgYmAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYW5vdGhlclxuICogYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrIg4oaSIEVpdGhlclvOsSwgzrJdXG4gKi9cbkVpdGhlci5vZiA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBSaWdodChhKVxufVxuRWl0aGVyLnByb3RvdHlwZS5vZiA9IEVpdGhlci5vZlxuXG5cbi8qKlxuICogQXBwbGllcyB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoZSBgUmlnaHRgIGNhc2Ugb2YgdGhlIGBFaXRoZXJbzrEsIM6yXWAgc3RydWN0dXJlXG4gKiB0byBhbm90aGVyIGFwcGxpY2F0aXZlIHR5cGUuXG4gKlxuICogVGhlIGBFaXRoZXJbzrEsIM6yXWAgc2hvdWxkIGNvbnRhaW4gYSBmdW5jdGlvbiB2YWx1ZSwgb3RoZXJ3aXNlIGEgYFR5cGVFcnJvcmBcbiAqIGlzIHRocm93bi5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrIg4oaSIM6zXSwgZjpBcHBsaWNhdGl2ZVtfXSkgPT4gZlvOsl0g4oaSIGZbzrNdXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuYXAgPSB1bmltcGxlbWVudGVkXG5cbkxlZnQucHJvdG90eXBlLmFwID0gZnVuY3Rpb24oYikge1xuICByZXR1cm4gdGhpc1xufVxuXG5SaWdodC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiBiLm1hcCh0aGlzLnZhbHVlKVxufVxuXG5cbi8vIC0tIEZ1bmN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIGBSaWdodGAgdmFsdWUgb2YgdGhlIGBFaXRoZXJbzrEsIM6yXWAgc3RydWN0dXJlIHVzaW5nIGEgcmVndWxhclxuICogdW5hcnkgZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gKM6yIOKGkiDOsykg4oaSIEVpdGhlclvOsSwgzrNdXG4gKi9cbkVpdGhlci5wcm90b3R5cGUubWFwID0gdW5pbXBsZW1lbnRlZFxuTGVmdC5wcm90b3R5cGUubWFwICAgPSBub29wXG5cblJpZ2h0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLm9mKGYodGhpcy52YWx1ZSkpXG59XG5cblxuLy8gLS0gQ2hhaW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgYFJpZ2h0YCB2YWx1ZSBvZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgdXNpbmcgYW4gdW5hcnlcbiAqIGZ1bmN0aW9uIHRvIG1vbmFkcy5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdLCBtOk1vbmFkW19dKSA9PiAozrIg4oaSIG1bzrNdKSDihpIgbVvOs11cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5jaGFpbiA9IHVuaW1wbGVtZW50ZWRcbkxlZnQucHJvdG90eXBlLmNoYWluICAgPSBub29wXG5cblJpZ2h0LnByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uKGYpIHtcbiAgcmV0dXJuIGYodGhpcy52YWx1ZSlcbn1cblxuLy8gLS0gU2VtaWdyb3VwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb25jYXRzIHRoZSBgUmlnaHRgIHZhbHVlIG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSB3aXRoIGFub3RoZXIgYFJpZ2h0YCBvciBrZWVwcyB0aGUgYExlZnRgIG9uIGVpdGhlciBzaWRlXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIG06TW9ub2lkXSkgPT4gRWl0aGVyW86yLCBtXSDihpIgRWl0aGVyW86xLCBtXVxuICovXG5FaXRoZXIucHJvdG90eXBlLmNvbmNhdCA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXNcbn1cblxuUmlnaHQucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gIHZhciB0aGF0ID0gdGhpc1xuICByZXR1cm4gb3RoZXIuZm9sZChmdW5jdGlvbihfKXtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LlJpZ2h0KHRoYXQudmFsdWUuY29uY2F0KHkpKVxuICAgICAgICAgICAgICAgICAgICB9KVxufVxuXG5cbi8vIC0tIFNob3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiBWb2lkIOKGkiBTdHJpbmdcbiAqL1xuRWl0aGVyLnByb3RvdHlwZS50b1N0cmluZyA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdFaXRoZXIuTGVmdCgnICsgdGhpcy52YWx1ZSArICcpJ1xufVxuXG5SaWdodC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdFaXRoZXIuUmlnaHQoJyArIHRoaXMudmFsdWUgKyAnKSdcbn1cblxuXG4vLyAtLSBFcSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUZXN0cyBpZiBhbiBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBpcyBlcXVhbCB0byBhbm90aGVyIGBFaXRoZXJbzrEsIM6yXWBcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiBFaXRoZXJbzrEsIM6yXSDihpIgQm9vbGVhblxuICovXG5FaXRoZXIucHJvdG90eXBlLmlzRXF1YWwgPSB1bmltcGxlbWVudGVkXG5cbkxlZnQucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmlzTGVmdCAmJiAoYS52YWx1ZSA9PT0gdGhpcy52YWx1ZSlcbn1cblxuUmlnaHQucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmlzUmlnaHQgJiYgKGEudmFsdWUgPT09IHRoaXMudmFsdWUpXG59XG5cblxuLy8gLS0gRXh0cmFjdGluZyBhbmQgcmVjb3ZlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGBSaWdodGAgdmFsdWUgb3V0IG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSwgaWYgaXRcbiAqIGV4aXN0cy4gT3RoZXJ3aXNlIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+IFZvaWQg4oaSIM6yICAgICAgICAgOjogcGFydGlhbCwgdGhyb3dzXG4gKiBAc2VlIHtAbGluayBtb2R1bGU6bGliL2VpdGhlcn5FaXRoZXIjZ2V0T3JFbHNlfSDigJQgQSBnZXR0ZXIgdGhhdCBjYW4gaGFuZGxlIGZhaWx1cmVzLlxuICogQHNlZSB7QGxpbmsgbW9kdWxlOmxpYi9laXRoZXJ+RWl0aGVyI21lcmdlfSDigJQgVGhlIGNvbnZlcmdlbmNlIG9mIGJvdGggdmFsdWVzLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBpZiB0aGUgc3RydWN0dXJlIGhhcyBubyBgUmlnaHRgIHZhbHVlLlxuICovXG5FaXRoZXIucHJvdG90eXBlLmdldCA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW4ndCBleHRyYWN0IHRoZSB2YWx1ZSBvZiBhIExlZnQoYSkuXCIpXG59XG5cblJpZ2h0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWVcbn1cblxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBgUmlnaHRgIHZhbHVlIG91dCBvZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuIElmIHRoZVxuICogc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSBhIGBSaWdodGAgdmFsdWUsIHJldHVybnMgdGhlIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gzrIg4oaSIM6yXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuZ2V0T3JFbHNlID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhXG59XG5cblJpZ2h0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihfKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgYExlZnRgIHZhbHVlIGludG8gYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuIERvZXMgbm90aGluZ1xuICogaWYgdGhlIHN0cnVjdHVyZSBjb250YWluIGEgYFJpZ2h0YCB2YWx1ZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiAozrEg4oaSIEVpdGhlclvOsywgzrJdKSDihpIgRWl0aGVyW86zLCDOsl1cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5vckVsc2UgPSB1bmltcGxlbWVudGVkXG5SaWdodC5wcm90b3R5cGUub3JFbHNlICA9IG5vb3BcblxuTGVmdC5wcm90b3R5cGUub3JFbHNlID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygd2hpY2hldmVyIHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uIHRoYXQgaXMgcHJlc2VudC5cbiAqXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrFdKSA9PiBWb2lkIOKGkiDOsVxuICovXG5FaXRoZXIucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLy8gLS0gRm9sZHMgYW5kIEV4dGVuZGVkIFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bmN0aW9uIHRvIGVhY2ggY2FzZSBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+ICjOsSDihpIgzrMpLCAozrIg4oaSIM6zKSDihpIgzrNcbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5mb2xkID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24oZiwgXykge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5SaWdodC5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uKF8sIGcpIHtcbiAgcmV0dXJuIGcodGhpcy52YWx1ZSlcbn1cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+IHsgTGVmdDogzrEg4oaSIM6zLCBSaWdodDogzrIg4oaSIM6zIH0g4oaSIM6zXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuY2F0YSA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uTGVmdCh0aGlzLnZhbHVlKVxufVxuXG5SaWdodC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uUmlnaHQodGhpcy52YWx1ZSlcbn1cblxuXG4vKipcbiAqIFN3YXBzIHRoZSBkaXNqdW5jdGlvbiB2YWx1ZXMuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gVm9pZCDihpIgRWl0aGVyW86yLCDOsV1cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5zd2FwID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLlJpZ2h0KHRoaXMudmFsdWUpXG59XG5cblJpZ2h0LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLkxlZnQodGhpcy52YWx1ZSlcbn1cblxuXG4vKipcbiAqIE1hcHMgYm90aCBzaWRlcyBvZiB0aGUgZGlzanVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gKM6xIOKGkiDOsyksICjOsiDihpIgzrQpIOKGkiBFaXRoZXJbzrMsIM60XVxuICovXG5FaXRoZXIucHJvdG90eXBlLmJpbWFwID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5iaW1hcCA9IGZ1bmN0aW9uKGYsIF8pIHtcbiAgcmV0dXJuIHRoaXMuTGVmdChmKHRoaXMudmFsdWUpKVxufVxuXG5SaWdodC5wcm90b3R5cGUuYmltYXAgPSBmdW5jdGlvbihfLCBnKSB7XG4gIHJldHVybiB0aGlzLlJpZ2h0KGcodGhpcy52YWx1ZSkpXG59XG5cblxuLyoqXG4gKiBNYXBzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+ICjOsSDihpIgzrMpIOKGkiBFaXRoZXJbzrMsIM6yXVxuICovXG5FaXRoZXIucHJvdG90eXBlLmxlZnRNYXAgPSB1bmltcGxlbWVudGVkXG5SaWdodC5wcm90b3R5cGUubGVmdE1hcCAgPSBub29wXG5cbkxlZnQucHJvdG90eXBlLmxlZnRNYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLkxlZnQoZih0aGlzLnZhbHVlKSlcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2VpdGhlcicpIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuXG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IGN1cnJ5LCBsZW5zLCBwcm9wLCBwcmVwZW5kLCBvdmVyLCBzZXQsIHBpcGUgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBFaXRoZXIgZnJvbSBcImRhdGEuZWl0aGVyXCI7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBdCA9IGN1cnJ5KChrZXlBcnJheSwgbmV3VmFsLCBvYmopID0+IHtcbiAgY29uc3QgZGVlcE5ld1ZhbCA9IGtleUFycmF5LnJlZHVjZVJpZ2h0KFxuICAgIChyZXN1bHQsIGtleSkgPT4gKHsgW2tleV06IHJlc3VsdCB9KVxuICAgICwgbmV3VmFsXG4gICk7XG5cbiAgcmV0dXJuIEltbXV0YWJsZShvYmopLm1lcmdlKGRlZXBOZXdWYWwsIHsgZGVlcDogdHJ1ZSB9KTtcbn0pO1xuXG4vLyBTdGF0ZSBsZW5zZXNcbmV4cG9ydCBjb25zdCBTdGF0ZUxlbnNlcyA9IHtcbiAgZmllbGRUeXBlczogbGVucyhwcm9wKFwiZmllbGRUeXBlc1wiKSwgdXBkYXRlQXQoW1wiZmllbGRUeXBlc1wiXSkpLFxuICBmaWVsZHNTdGF0ZTogbGVucyhwcm9wKFwiZmllbGRzU3RhdGVcIiksIHVwZGF0ZUF0KFtcImZpZWxkc1N0YXRlXCJdKSksXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbGVucyhwcm9wKFwiZmllbGRzU3RhdGVIaXN0b3J5XCIpLCB1cGRhdGVBdChbXCJmaWVsZHNTdGF0ZUhpc3RvcnlcIl0pKSxcbn07XG5cbi8vIF8gPT4gU3RyaW5nXG5leHBvcnQgY29uc3QgY3JlYXRlSWQgPSBfID0+XG4gIChEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoKTtcblxuLy8gU3RhdGUgLT4gW2ZpZWxkc1N0YXRlXSAtPiBTdGF0ZVxuZXhwb3J0IGNvbnN0IHB1c2hIaXN0b3J5U3RhdGUgPSBjdXJyeSgoc3RhdGUsIG5ld0hpc3RvcnlTdGF0ZSkgPT4gcGlwZShcbiAgLy8gQWRkIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeVxuICBvdmVyKFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlSGlzdG9yeSwgcHJlcGVuZChzdGF0ZS5maWVsZHNTdGF0ZSkpLFxuICAvLyBNYWtlIG5ldyBTdGF0ZSB0aGUgY3VycmVudFxuICBzZXQoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIG5ld0hpc3RvcnlTdGF0ZSlcbikoc3RhdGUpKTtcblxuXG4vLyBTdGF0ZSAtPiBTdGF0ZVxuZXhwb3J0IGNvbnN0IGhpZGVDb25maWdzID0gc3RhdGUgPT5cbiAgc2V0KFxuICAgIFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlLFxuICAgIHN0YXRlLmZpZWxkc1N0YXRlLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMsIHsgY29uZmlnU2hvd2luZzogZmFsc2UgfSkpLFxuICAgIHN0YXRlXG4gICk7XG5cblxuLy8gU3RyaW5nIC0+IFN0cmluZyAtPiBPYmplY3QgLT4gRWl0aGVyIFN0cmluZyBPYmplY3RcbmV4cG9ydCBjb25zdCBwcm9wZXJ0eVR5cGVDaGVjayA9IGN1cnJ5KChwcm9wZXJ0eU5hbWUsIHR5cGUsIG9iaikgPT5cbiAgdHlwZW9mIG9ialtwcm9wZXJ0eU5hbWVdID09PSB0eXBlXG4gICAgPyBFaXRoZXIuUmlnaHQob2JqKVxuICAgIDogRWl0aGVyLkxlZnQoYFByb3BlcnR5ICcke3Byb3BlcnR5TmFtZX0nIGNhbm5vdCBiZSBvZiB0eXBlICR7dHlwZW9mIG9ialtwcm9wZXJ0eU5hbWVdfWApXG4pO1xuXG4vLyBDaGVja3MgdGhhdCBhIGZpZWxkIGhhcyBpdHMgZXNzZW50aWFsIHByb3BlcnRpZXNcbi8vIE9iamVjdCAtPiBFaXRoZXIgU3RyaW5nIE9iamVjdFxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRmllbGQgPSBmaWVsZFN0YXRlID0+XG4gIEVpdGhlci5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgICAubGVmdE1hcChmcyA9PiBgQSBmaWVsZCBTdGF0ZSBjYW5ub3QgYmUgZW1wdHkgJHt0eXBlb2YgZnN9YClcbiAgICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJyZXF1aXJlZFwiLCBcImJvb2xlYW5cIikpXG4gICAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiY29uZmlnU2hvd2luZ1wiLCBcImJvb2xlYW5cIikpXG4gICAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiaWRcIiwgXCJzdHJpbmdcIikpO1xuIiwiaW1wb3J0IHsgU3RhdGVMZW5zZXMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgc2V0LCBvdmVyLCBzbGljZSwgcGlwZSB9IGZyb20gXCJyYW1kYVwiO1xuXG5jb25zdCBsYXN0SGlzdG9yeVN0YXRlID0gc3RhdGUgPT5cbiAgc3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdIHx8IFtdO1xuXG5jb25zdCB1bmRvID0gKHN0YXRlLCBfKSA9PiBwaXBlKFxuICAvLyBNYWtlIGxhc3QgaGlzdG9yeSBsYXN0IHN0YXRlIHRoZSBjdXJyZW50IG9uZVxuICBzZXQoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIGxhc3RIaXN0b3J5U3RhdGUoc3RhdGUpKSxcbiAgLy8gUmVtb3ZlIGxhc3QgaGlzdG9yeSBzdGF0ZSBmcm9tIHRoZSBoaXN0b3J5IGFycmF5XG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGVIaXN0b3J5LCBzbGljZSgxLCBJbmZpbml0eSkpXG4pKHN0YXRlKTtcblxuZXhwb3J0IGRlZmF1bHQgdW5kbztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2lkZW50aXR5KHgpIHsgcmV0dXJuIHg7IH07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9pZGVudGl0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lkZW50aXR5Jyk7XG5cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZXR1cm4gdGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBpdC4gR29vZFxuICogYXMgYSBkZWZhdWx0IG9yIHBsYWNlaG9sZGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJuIHsqfSBUaGUgaW5wdXQgdmFsdWUsIGB4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlkZW50aXR5KDEpOyAvLz0+IDFcbiAqXG4gKiAgICAgIHZhciBvYmogPSB7fTtcbiAqICAgICAgUi5pZGVudGl0eShvYmopID09PSBvYmo7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoX2lkZW50aXR5KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdmFsdWUgYXQgYSBnaXZlbiBwYXRoLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBbU3RyaW5nXSAtPiB7azogdn0gLT4gdiB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgLlxuICogQHNlZSBSLnByb3BcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhdGgoWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHtjOiB7YjogMn19KTsgLy89PiB1bmRlZmluZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHBhdGgocGF0aHMsIG9iaikge1xuICB2YXIgdmFsID0gb2JqO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IHBhdGhzLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWwgPSB2YWxbcGF0aHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn0pO1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX3JlZHVjZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3JlZHVjZScpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG5cblxuLyoqXG4gKiBhcCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBBbHNvXG4gKiB0cmVhdHMgY3VycmllZCBmdW5jdGlvbnMgYXMgYXBwbGljYXRpdmVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIFthIC0+IGJdIC0+IFthXSAtPiBbYl1cbiAqIEBzaWcgQXBwbHkgZiA9PiBmIChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7QXJyYXl9IGZucyBBbiBhcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXl9IHZzIEFuIGFycmF5IG9mIHZhbHVlc1xuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHJlc3VsdHMgb2YgYXBwbHlpbmcgZWFjaCBvZiBgZm5zYCB0byBhbGwgb2YgYHZzYCBpbiB0dXJuLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXAoW1IubXVsdGlwbHkoMiksIFIuYWRkKDMpXSwgWzEsMiwzXSk7IC8vPT4gWzIsIDQsIDYsIDQsIDUsIDZdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBhcChhcHBsaWNhdGl2ZSwgZm4pIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgYXBwbGljYXRpdmUuYXAgPT09ICdmdW5jdGlvbicgP1xuICAgICAgYXBwbGljYXRpdmUuYXAoZm4pIDpcbiAgICB0eXBlb2YgYXBwbGljYXRpdmUgPT09ICdmdW5jdGlvbicgP1xuICAgICAgZnVuY3Rpb24oeCkgeyByZXR1cm4gYXBwbGljYXRpdmUoeCkoZm4oeCkpOyB9IDpcbiAgICAvLyBlbHNlXG4gICAgICBfcmVkdWNlKGZ1bmN0aW9uKGFjYywgZikgeyByZXR1cm4gX2NvbmNhdChhY2MsIG1hcChmLCBmbikpOyB9LCBbXSwgYXBwbGljYXRpdmUpXG4gICk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogU2ltaWxhciB0byBgcmVkdWNlYCwgZXhjZXB0IG1vdmVzIHRocm91Z2ggdGhlIGlucHV0IGxpc3QgZnJvbSB0aGUgcmlnaHQgdG9cbiAqIHRoZSBsZWZ0LlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZVJpZ2h0YCBkb2VzIG5vdCBza2lwIGRlbGV0ZWQgb3IgdW5hc3NpZ25lZCBpbmRpY2VzIChzcGFyc2VcbiAqIGFycmF5cyksIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBtZXRob2QuIEZvciBtb3JlIGRldGFpbHNcbiAqIG9uIHRoaXMgYmVoYXZpb3IsIHNlZTpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0I0Rlc2NyaXB0aW9uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSxiIC0+IGEpIC0+IGEgLT4gW2JdIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgdGhlIGFjY3VtdWxhdG9yIGFuZCB0aGVcbiAqICAgICAgICBjdXJyZW50IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4geyp9IFRoZSBmaW5hbCwgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgcGFpcnMgPSBbIFsnYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM10gXTtcbiAqICAgICAgdmFyIGZsYXR0ZW5QYWlycyA9IChhY2MsIHBhaXIpID0+IGFjYy5jb25jYXQocGFpcik7XG4gKlxuICogICAgICBSLnJlZHVjZVJpZ2h0KGZsYXR0ZW5QYWlycywgW10sIHBhaXJzKTsgLy89PiBbICdjJywgMywgJ2InLCAyLCAnYScsIDEgXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gcmVkdWNlUmlnaHQoZm4sIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBhY2MgPSBmbihhY2MsIGxpc3RbaWR4XSk7XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBhcCA9IHJlcXVpcmUoJy4vYXAnKTtcbnZhciBtYXAgPSByZXF1aXJlKCcuL21hcCcpO1xudmFyIHByZXBlbmQgPSByZXF1aXJlKCcuL3ByZXBlbmQnKTtcbnZhciByZWR1Y2VSaWdodCA9IHJlcXVpcmUoJy4vcmVkdWNlUmlnaHQnKTtcblxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBbVHJhdmVyc2FibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjdHJhdmVyc2FibGUpXG4gKiBvZiBbQXBwbGljYXRpdmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjYXBwbGljYXRpdmUpIGludG8gYW5cbiAqIEFwcGxpY2F0aXZlIG9mIFRyYXZlcnNhYmxlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzZXF1ZW5jZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKEFwcGxpY2F0aXZlIGYsIFRyYXZlcnNhYmxlIHQpID0+IChhIC0+IGYgYSkgLT4gdCAoZiBhKSAtPiBmICh0IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvZlxuICogQHBhcmFtIHsqfSB0cmF2ZXJzYWJsZVxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi50cmF2ZXJzZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc2VxdWVuY2UoTWF5YmUub2YsIFtKdXN0KDEpLCBKdXN0KDIpLCBKdXN0KDMpXSk7ICAgLy89PiBKdXN0KFsxLCAyLCAzXSlcbiAqICAgICAgUi5zZXF1ZW5jZShNYXliZS5vZiwgW0p1c3QoMSksIEp1c3QoMiksIE5vdGhpbmcoKV0pOyAvLz0+IE5vdGhpbmcoKVxuICpcbiAqICAgICAgUi5zZXF1ZW5jZShSLm9mLCBKdXN0KFsxLCAyLCAzXSkpOyAvLz0+IFtKdXN0KDEpLCBKdXN0KDIpLCBKdXN0KDMpXVxuICogICAgICBSLnNlcXVlbmNlKFIub2YsIE5vdGhpbmcoKSk7ICAgICAgIC8vPT4gW05vdGhpbmcoKV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHNlcXVlbmNlKG9mLCB0cmF2ZXJzYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHRyYXZlcnNhYmxlLnNlcXVlbmNlID09PSAnZnVuY3Rpb24nID9cbiAgICB0cmF2ZXJzYWJsZS5zZXF1ZW5jZShvZikgOlxuICAgIHJlZHVjZVJpZ2h0KGZ1bmN0aW9uKGFjYywgeCkgeyByZXR1cm4gYXAobWFwKHByZXBlbmQsIHgpLCBhY2MpOyB9LFxuICAgICAgICAgICAgICAgIG9mKFtdKSxcbiAgICAgICAgICAgICAgICB0cmF2ZXJzYWJsZSk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG52YXIgbWFwID0gcmVxdWlyZSgnLi9tYXAnKTtcbnZhciBzZXF1ZW5jZSA9IHJlcXVpcmUoJy4vc2VxdWVuY2UnKTtcblxuXG4vKipcbiAqIE1hcHMgYW4gW0FwcGxpY2F0aXZlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGxpY2F0aXZlKS1yZXR1cm5pbmdcbiAqIGZ1bmN0aW9uIG92ZXIgYSBbVHJhdmVyc2FibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjdHJhdmVyc2FibGUpLFxuICogdGhlbiB1c2VzIFtgc2VxdWVuY2VgXSgjc2VxdWVuY2UpIHRvIHRyYW5zZm9ybSB0aGUgcmVzdWx0aW5nIFRyYXZlcnNhYmxlIG9mIEFwcGxpY2F0aXZlXG4gKiBpbnRvIGFuIEFwcGxpY2F0aXZlIG9mIFRyYXZlcnNhYmxlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzZXF1ZW5jZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoQXBwbGljYXRpdmUgZiwgVHJhdmVyc2FibGUgdCkgPT4gKGEgLT4gZiBhKSAtPiAoYSAtPiBmIGIpIC0+IHQgYSAtPiBmICh0IGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHBhcmFtIHsqfSB0cmF2ZXJzYWJsZVxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIFJldHVybnMgYE5vdGhpbmdgIGlmIHRoZSBnaXZlbiBkaXZpc29yIGlzIGAwYFxuICogICAgICBzYWZlRGl2ID0gbiA9PiBkID0+IGQgPT09IDAgPyBOb3RoaW5nKCkgOiBKdXN0KG4gLyBkKVxuICpcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCA0LCA1XSk7IC8vPT4gSnVzdChbNSwgMi41LCAyXSlcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCAwLCA1XSk7IC8vPT4gTm90aGluZ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gdHJhdmVyc2Uob2YsIGYsIHRyYXZlcnNhYmxlKSB7XG4gIHJldHVybiBzZXF1ZW5jZShvZiwgbWFwKGYsIHRyYXZlcnNhYmxlKSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2FycmF5RnJvbUl0ZXJhdG9yKGl0ZXIpIHtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIG5leHQ7XG4gIHdoaWxlICghKG5leHQgPSBpdGVyLm5leHQoKSkuZG9uZSkge1xuICAgIGxpc3QucHVzaChuZXh0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUoZikge1xuICAvLyBTdHJpbmcoeCA9PiB4KSBldmFsdWF0ZXMgdG8gXCJ4ID0+IHhcIiwgc28gdGhlIHBhdHRlcm4gbWF5IG5vdCBtYXRjaC5cbiAgdmFyIG1hdGNoID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb24gKFxcdyopLyk7XG4gIHJldHVybiBtYXRjaCA9PSBudWxsID8gJycgOiBtYXRjaFsxXTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGl0cyBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBWYWx1ZXMgYXJlXG4gKiBpZGVudGljYWwgaWYgdGhleSByZWZlcmVuY2UgdGhlIHNhbWUgbWVtb3J5LiBgTmFOYCBpcyBpZGVudGljYWwgdG8gYE5hTmA7XG4gKiBgMGAgYW5kIGAtMGAgYXJlIG5vdCBpZGVudGljYWwuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbyA9IHt9O1xuICogICAgICBSLmlkZW50aWNhbChvLCBvKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pZGVudGljYWwoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbChbXSwgW10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDAsIC0wKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbChOYU4sIE5hTik7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gaWRlbnRpY2FsKGEsIGIpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoYSA9PT0gYikgeyAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG4gIH1cbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxuXG4vKipcbiAqIEdpdmVzIGEgc2luZ2xlLXdvcmQgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSAobmF0aXZlKSB0eXBlIG9mIGEgdmFsdWUsXG4gKiByZXR1cm5pbmcgc3VjaCBhbnN3ZXJzIGFzICdPYmplY3QnLCAnTnVtYmVyJywgJ0FycmF5Jywgb3IgJ051bGwnLiBEb2VzIG5vdFxuICogYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB1c2VyIE9iamVjdCB0eXBlcyBhbnkgZnVydGhlciwgcmVwb3J0aW5nIHRoZW0gYWxsIGFzXG4gKiAnT2JqZWN0Jy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICgqIC0+IHsqfSkgLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudHlwZSh7fSk7IC8vPT4gXCJPYmplY3RcIlxuICogICAgICBSLnR5cGUoMSk7IC8vPT4gXCJOdW1iZXJcIlxuICogICAgICBSLnR5cGUoZmFsc2UpOyAvLz0+IFwiQm9vbGVhblwiXG4gKiAgICAgIFIudHlwZSgncycpOyAvLz0+IFwiU3RyaW5nXCJcbiAqICAgICAgUi50eXBlKG51bGwpOyAvLz0+IFwiTnVsbFwiXG4gKiAgICAgIFIudHlwZShbXSk7IC8vPT4gXCJBcnJheVwiXG4gKiAgICAgIFIudHlwZSgvW0Etel0vKTsgLy89PiBcIlJlZ0V4cFwiXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB0eXBlKHZhbCkge1xuICByZXR1cm4gdmFsID09PSBudWxsICAgICAgPyAnTnVsbCcgICAgICA6XG4gICAgICAgICB2YWwgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDpcbiAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKTtcbn0pO1xuIiwidmFyIF9hcnJheUZyb21JdGVyYXRvciA9IHJlcXVpcmUoJy4vX2FycmF5RnJvbUl0ZXJhdG9yJyk7XG52YXIgX2Z1bmN0aW9uTmFtZSA9IHJlcXVpcmUoJy4vX2Z1bmN0aW9uTmFtZScpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBpZGVudGljYWwgPSByZXF1aXJlKCcuLi9pZGVudGljYWwnKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnLi4va2V5cycpO1xudmFyIHR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfZXF1YWxzKGEsIGIsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIGlmIChpZGVudGljYWwoYSwgYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlKGEpICE9PSB0eXBlKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlb2YgYS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiYgYS5lcXVhbHMoYikgJiZcbiAgICAgICAgICAgdHlwZW9mIGIuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGIuZXF1YWxzKGEpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGlmICh0eXBlb2YgYS5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgIF9mdW5jdGlvbk5hbWUoYS5jb25zdHJ1Y3RvcikgPT09ICdQcm9taXNlJykge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIGlmICghKHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBpZGVudGljYWwoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICBpZiAoIWlkZW50aWNhbChhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIHJldHVybiBhLm5hbWUgPT09IGIubmFtZSAmJiBhLm1lc3NhZ2UgPT09IGIubWVzc2FnZTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgaWYgKCEoYS5zb3VyY2UgPT09IGIuc291cmNlICYmXG4gICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiZcbiAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmXG4gICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJlxuICAgICAgICAgICAgYS51bmljb2RlID09PSBiLnVuaWNvZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIGlmICghX2VxdWFscyhfYXJyYXlGcm9tSXRlcmF0b3IoYS5lbnRyaWVzKCkpLCBfYXJyYXlGcm9tSXRlcmF0b3IoYi5lbnRyaWVzKCkpLCBzdGFja0EsIHN0YWNrQikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgICBicmVhaztcbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVmFsdWVzIG9mIG90aGVyIHR5cGVzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IGtleXMoYSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGlkeCA9IHN0YWNrQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cblxuICBzdGFja0EucHVzaChhKTtcbiAgc3RhY2tCLnB1c2goYik7XG4gIGlkeCA9IGtleXNBLmxlbmd0aCAtIDE7XG4gIHdoaWxlIChpZHggPj0gMCkge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuICAgIGlmICghKF9oYXMoa2V5LCBiKSAmJiBfZXF1YWxzKGJba2V5XSwgYVtrZXldLCBzdGFja0EsIHN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHN0YWNrQS5wb3AoKTtcbiAgc3RhY2tCLnBvcCgpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9lcXVhbHMgPSByZXF1aXJlKCcuL2ludGVybmFsL19lcXVhbHMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGl0cyBhcmd1bWVudHMgYXJlIGVxdWl2YWxlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBIYW5kbGVzXG4gKiBjeWNsaWNhbCBkYXRhIHN0cnVjdHVyZXMuXG4gKlxuICogRGlzcGF0Y2hlcyBzeW1tZXRyaWNhbGx5IHRvIHRoZSBgZXF1YWxzYCBtZXRob2RzIG9mIGJvdGggYXJndW1lbnRzLCBpZlxuICogcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgYSAtPiBiIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZXF1YWxzKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5lcXVhbHMoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmVxdWFscyhbMSwgMiwgM10sIFsxLCAyLCAzXSk7IC8vPT4gdHJ1ZVxuICpcbiAqICAgICAgdmFyIGEgPSB7fTsgYS52ID0gYTtcbiAqICAgICAgdmFyIGIgPSB7fTsgYi52ID0gYjtcbiAqICAgICAgUi5lcXVhbHMoYSwgYik7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIF9lcXVhbHMoYSwgYiwgW10sIFtdKTtcbn0pO1xuIiwiLyogQGZsb3cgd2VhayAqL1xuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgcHVzaEhpc3RvcnlTdGF0ZSwgY3JlYXRlSWQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgY3VycnksIGVxdWFscywgdHJhdmVyc2UsIGlkZW50aXR5LCBwYXRoIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgRWl0aGVyIGZyb20gXCJkYXRhLmVpdGhlclwiO1xuXG4vLyBbYV0gPT4gRWl0aGVyIFN0cmluZyBbYV1cbmNvbnN0IGlzQXJyYXkgPSBhcnIgPT5cbiAgQXJyYXkuaXNBcnJheShhcnIpXG4gICAgPyBFaXRoZXIuUmlnaHQoYXJyKVxuICAgIDogRWl0aGVyLkxlZnQoYEludmFsaWQgc3RhdGVzIHNlbnQgd2l0aCBpbXBvcnRTdGF0ZS4gRXhwZWN0ZWQgQXJyYXkgYnV0IHJlY2VpdmVkICR7dHlwZW9mIGFycn1gKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBtYXgtbGVuXG5cbmNvbnN0IGZpZWxkVHlwZUlzVmFsaWQgPSBjdXJyeSgodmFsaWRUeXBlcywgZmllbGQpID0+XG4gIHZhbGlkVHlwZXMuZmluZChlcXVhbHMoZmllbGQudHlwZSkpXG4gICAgPyBFaXRoZXIuUmlnaHQoZmllbGQpXG4gICAgOiBFaXRoZXIuTGVmdChgSW52YWxpZCBmaWVsZCB0eXBlICR7ZmllbGQudHlwZX1gKVxuKTtcblxuY29uc3QgdmFsaWRGaWVsZFR5cGVzID0gY3VycnkoKHZhbGlkVHlwZXMsIGZpZWxkc1N0YXRlKSA9PlxuICB0cmF2ZXJzZShFaXRoZXIub2YsIGZpZWxkVHlwZUlzVmFsaWQodmFsaWRUeXBlcyksIGZpZWxkc1N0YXRlKVxuKTtcblxuXG4vLyBbYV0gLT4gW2FdIC0+IEVpdGhlciBTdHJpbmcgW2FdXG5jb25zdCB2YWxpZGF0ZUZpZWxkc1N0YXRlID0gY3VycnkoKGZpZWxkc1N0YXRlLCBzdGF0ZSkgPT5cbiAgRWl0aGVyLm9mKGZpZWxkc1N0YXRlKVxuICAgIC5jaGFpbihpc0FycmF5KVxuICAgIC5jaGFpbih2YWxpZEZpZWxkVHlwZXMoc3RhdGUuZmllbGRUeXBlcy5tYXAocGF0aChbXCJpbmZvXCIsIFwidHlwZVwiXSkpKSlcbik7XG5cblxuLy8gQWRkIHJlcXVpcmVkIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IG1hbmFnZWQgYnkgdGhlIGZpZWxkXG4vLyBjb21wb25lbnQgYnV0IGJ5IHRoZSBGb3JtQnVpbGRlciBjb21wb25lbnQgaXRzZWxmLCBzbyBtYXlcbi8vIG5vdCBiZSB0aGVyZS5cbi8vIFthXSA9PiBbYV1cbmNvbnN0IGFkZFJlcXVpcmVkUHJvcGVydGllcyA9IGZpZWxkU3RhdGVzID0+XG4gIGZpZWxkU3RhdGVzXG4gICAgLm1hcChzID0+IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgcyxcbiAgICAgIHsgaWQ6IGNyZWF0ZUlkKCkgfVxuICAgICkpO1xuXG5cbi8vIElmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgaW1wb3J0LCB0aGUgc2FtZSBzdGF0ZVxuLy8gd2lsbCBiZSByZXR1cm5lZFxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IG5ld0ZpZWxkc1N0YXRlIH0pID0+XG4gIHZhbGlkYXRlRmllbGRzU3RhdGUobmV3RmllbGRzU3RhdGUsIHN0YXRlKVxuICAgIC5tYXAoYWRkUmVxdWlyZWRQcm9wZXJ0aWVzKVxuICAgIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gICAgLmJpbWFwKGNvbnNvbGUuZXJyb3IsIGlkZW50aXR5KVxuICAgIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfcmVkdWNlZCh4KSB7XG4gIHJldHVybiB4ICYmIHhbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10gPyB4IDpcbiAgICB7XG4gICAgICAnQEB0cmFuc2R1Y2VyL3ZhbHVlJzogeCxcbiAgICAgICdAQHRyYW5zZHVjZXIvcmVkdWNlZCc6IHRydWVcbiAgICB9O1xufTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3JlZHVjZWQgPSByZXF1aXJlKCcuL19yZWR1Y2VkJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYRmluZChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdm9pZCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuZm91bmQgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hmaW5kKGYsIHhmKSB7IHJldHVybiBuZXcgWEZpbmQoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfeGZpbmQgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmluZCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbmRgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBhIHwgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogICAgICAgIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGZvdW5kLCBvciBgdW5kZWZpbmVkYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgeHMgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDIpKSh4cyk7IC8vPT4ge2E6IDJ9XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDQpKSh4cyk7IC8vPT4gdW5kZWZpbmVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKCdmaW5kJywgX3hmaW5kLCBmdW5jdGlvbiBmaW5kKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbn0pKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIEEgaGVscGVyIGZvciBkZWxheWluZyB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHN1bW1hcnkgKEFueS4uLiAtPiBBbnkpIC0+IFZvaWRcbiAqL1xudmFyIGRlbGF5ZWQgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJz8gIHNldEltbWVkaWF0ZVxuICAgICAgICAgICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCc/ICAgICAgIHByb2Nlc3MubmV4dFRpY2tcbiAgICAgICAgICAgIDogLyogb3RoZXJ3aXNlICovICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0XG5cbi8qKlxuICogQG1vZHVsZSBsaWIvdGFza1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IFRhc2s7XG5cbi8vIC0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBgVGFza1vOsSwgzrJdYCBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gdGltZS4gVGhpc1xuICogYWxsb3dzIG9uZSB0byBtb2RlbCB0aW1lLWJhc2VkIGVmZmVjdHMgZXhwbGljaXRseSwgc3VjaCB0aGF0IG9uZSBjYW4gaGF2ZVxuICogZnVsbCBrbm93bGVkZ2Ugb2Ygd2hlbiB0aGV5J3JlIGRlYWxpbmcgd2l0aCBkZWxheWVkIGNvbXB1dGF0aW9ucywgbGF0ZW5jeSxcbiAqIG9yIGFueXRoaW5nIHRoYXQgY2FuIG5vdCBiZSBjb21wdXRlZCBpbW1lZGlhdGVseS5cbiAqXG4gKiBBIGNvbW1vbiB1c2UgZm9yIHRoaXMgc3RydWN0dXJlIGlzIHRvIHJlcGxhY2UgdGhlIHVzdWFsIENvbnRpbnVhdGlvbi1QYXNzaW5nXG4gKiBTdHlsZSBmb3JtIG9mIHByb2dyYW1taW5nLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbXBvc2UgYW5kIHNlcXVlbmNlXG4gKiB0aW1lLWRlcGVuZGVudCBlZmZlY3RzIHVzaW5nIHRoZSBnZW5lcmljIGFuZCBwb3dlcmZ1bCBtb25hZGljIG9wZXJhdGlvbnMuXG4gKlxuICogQGNsYXNzXG4gKiBAc3VtbWFyeVxuICogKCjOsSDihpIgVm9pZCksICjOsiDihpIgVm9pZCkg4oaSIFZvaWQpLCAoVm9pZCDihpIgVm9pZCkg4oaSIFRhc2tbzrEsIM6yXVxuICpcbiAqIFRhc2tbzrEsIM6yXSA8OiBDaGFpblvOsl1cbiAqICAgICAgICAgICAgICAgLCBNb25hZFvOsl1cbiAqICAgICAgICAgICAgICAgLCBGdW5jdG9yW86yXVxuICogICAgICAgICAgICAgICAsIEFwcGxpY2F0aXZlW86yXVxuICogICAgICAgICAgICAgICAsIFNlbWlncm91cFvOsl1cbiAqICAgICAgICAgICAgICAgLCBNb25vaWRbzrJdXG4gKiAgICAgICAgICAgICAgICwgU2hvd1xuICovXG5mdW5jdGlvbiBUYXNrKGNvbXB1dGF0aW9uLCBjbGVhbnVwKSB7XG4gIHRoaXMuZm9yayA9IGNvbXB1dGF0aW9uO1xuXG4gIHRoaXMuY2xlYW51cCA9IGNsZWFudXAgfHwgZnVuY3Rpb24oKSB7fTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBUYXNrW86xLCDOsl1gIGNvbnRhaW5pbmcgdGhlIHNpbmdsZSB2YWx1ZSBgzrJgLlxuICpcbiAqIGDOsmAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIGFub3RoZXJcbiAqIGBUYXNrW86xLCDOsl1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsiDihpIgVGFza1vOsSwgzrJdXG4gKi9cblRhc2sucHJvdG90eXBlLm9mID0gZnVuY3Rpb24gX29mKGIpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKF8sIHJlc29sdmUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZShiKTtcbiAgfSk7XG59O1xuXG5UYXNrLm9mID0gVGFzay5wcm90b3R5cGUub2Y7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgVGFza1vOsSwgzrJdYCBjb250YWluaW5nIHRoZSBzaW5nbGUgdmFsdWUgYM6xYC5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbm90aGVyXG4gKiBgVGFza1vOsSwgzrJdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIFRhc2tbzrEsIM6yXVxuICovXG5UYXNrLnByb3RvdHlwZS5yZWplY3RlZCA9IGZ1bmN0aW9uIF9yZWplY3RlZChhKSB7XG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QpIHtcbiAgICByZXR1cm4gcmVqZWN0KGEpO1xuICB9KTtcbn07XG5cblRhc2sucmVqZWN0ZWQgPSBUYXNrLnByb3RvdHlwZS5yZWplY3RlZDtcblxuLy8gLS0gRnVuY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgc3VjY2Vzc2Z1bCB2YWx1ZSBvZiB0aGUgYFRhc2tbzrEsIM6yXWAgdXNpbmcgYSByZWd1bGFyIHVuYXJ5XG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsiDihpIgzrMpIOKGkiBUYXNrW86xLCDOs11cbiAqL1xuVGFzay5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gX21hcChmKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlamVjdChhKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShmKGIpKTtcbiAgICB9KTtcbiAgfSwgY2xlYW51cCk7XG59O1xuXG4vLyAtLSBDaGFpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBzdWNjZXNmdWwgdmFsdWUgb2YgdGhlIGBUYXNrW86xLCDOsl1gIHVzaW5nIGEgZnVuY3Rpb24gdG8gYVxuICogbW9uYWQuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiAozrIg4oaSIFRhc2tbzrEsIM6zXSkg4oaSIFRhc2tbzrEsIM6zXVxuICovXG5UYXNrLnByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uIF9jaGFpbihmKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlamVjdChhKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gZihiKS5mb3JrKHJlamVjdCwgcmVzb2x2ZSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLy8gLS0gQXBwbHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQXBwbHlzIHRoZSBzdWNjZXNzZnVsIHZhbHVlIG9mIHRoZSBgVGFza1vOsSwgKM6yIOKGkiDOsyldYCB0byB0aGUgc3VjY2Vzc2Z1bFxuICogdmFsdWUgb2YgdGhlIGBUYXNrW86xLCDOsl1gXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsICjOsiDihpIgzrMpXSA9PiBUYXNrW86xLCDOsl0g4oaSIFRhc2tbzrEsIM6zXVxuICovXG5cblRhc2sucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gX2FwKHRoYXQpIHtcbiAgdmFyIGZvcmtUaGlzID0gdGhpcy5mb3JrO1xuICB2YXIgZm9ya1RoYXQgPSB0aGF0LmZvcms7XG4gIHZhciBjbGVhbnVwVGhpcyA9IHRoaXMuY2xlYW51cDtcbiAgdmFyIGNsZWFudXBUaGF0ID0gdGhhdC5jbGVhbnVwO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXBCb3RoKHN0YXRlKSB7XG4gICAgY2xlYW51cFRoaXMoc3RhdGVbMF0pO1xuICAgIGNsZWFudXBUaGF0KHN0YXRlWzFdKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICB2YXIgZnVuYywgZnVuY0xvYWRlZCA9IGZhbHNlO1xuICAgIHZhciB2YWwsIHZhbExvYWRlZCA9IGZhbHNlO1xuICAgIHZhciByZWplY3RlZCA9IGZhbHNlO1xuICAgIHZhciBhbGxTdGF0ZTtcblxuICAgIHZhciB0aGlzU3RhdGUgPSBmb3JrVGhpcyhndWFyZFJlamVjdCwgZ3VhcmRSZXNvbHZlKGZ1bmN0aW9uKHgpIHtcbiAgICAgIGZ1bmNMb2FkZWQgPSB0cnVlO1xuICAgICAgZnVuYyA9IHg7XG4gICAgfSkpO1xuXG4gICAgdmFyIHRoYXRTdGF0ZSA9IGZvcmtUaGF0KGd1YXJkUmVqZWN0LCBndWFyZFJlc29sdmUoZnVuY3Rpb24oeCkge1xuICAgICAgdmFsTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHZhbCA9IHg7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gZ3VhcmRSZXNvbHZlKHNldHRlcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGVyKHgpO1xuICAgICAgICBpZiAoZnVuY0xvYWRlZCAmJiB2YWxMb2FkZWQpIHtcbiAgICAgICAgICBkZWxheWVkKGZ1bmN0aW9uKCl7IGNsZWFudXBCb3RoKGFsbFN0YXRlKSB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShmdW5jKHZhbCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ3VhcmRSZWplY3QoeCkge1xuICAgICAgaWYgKCFyZWplY3RlZCkge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiByZWplY3QoeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFN0YXRlID0gW3RoaXNTdGF0ZSwgdGhhdFN0YXRlXTtcbiAgfSwgY2xlYW51cEJvdGgpO1xufTtcblxuLy8gLS0gU2VtaWdyb3VwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIGVhcmxpZXIgb2YgdGhlIHR3byB0YXNrcyBgVGFza1vOsSwgzrJdYFxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4gVGFza1vOsSwgzrJdIOKGkiBUYXNrW86xLCDOsl1cbiAqL1xuXG5UYXNrLnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiBfY29uY2F0KHRoYXQpIHtcbiAgdmFyIGZvcmtUaGlzID0gdGhpcy5mb3JrO1xuICB2YXIgZm9ya1RoYXQgPSB0aGF0LmZvcms7XG4gIHZhciBjbGVhbnVwVGhpcyA9IHRoaXMuY2xlYW51cDtcbiAgdmFyIGNsZWFudXBUaGF0ID0gdGhhdC5jbGVhbnVwO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXBCb3RoKHN0YXRlKSB7XG4gICAgY2xlYW51cFRoaXMoc3RhdGVbMF0pO1xuICAgIGNsZWFudXBUaGF0KHN0YXRlWzFdKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgIHZhciBhbGxTdGF0ZTtcbiAgICB2YXIgdGhpc1N0YXRlID0gZm9ya1RoaXMoZ3VhcmQocmVqZWN0KSwgZ3VhcmQocmVzb2x2ZSkpO1xuICAgIHZhciB0aGF0U3RhdGUgPSBmb3JrVGhhdChndWFyZChyZWplY3QpLCBndWFyZChyZXNvbHZlKSk7XG5cbiAgICByZXR1cm4gYWxsU3RhdGUgPSBbdGhpc1N0YXRlLCB0aGF0U3RhdGVdO1xuXG4gICAgZnVuY3Rpb24gZ3VhcmQoZikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgZGVsYXllZChmdW5jdGlvbigpeyBjbGVhbnVwQm90aChhbGxTdGF0ZSkgfSlcbiAgICAgICAgICByZXR1cm4gZih4KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sIGNsZWFudXBCb3RoKTtcblxufTtcblxuLy8gLS0gTW9ub2lkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSBUYXNrIHRoYXQgd2lsbCBuZXZlciByZXNvbHZlXG4gKlxuICogQHN1bW1hcnkgVm9pZCDihpIgVGFza1vOsSwgX11cbiAqL1xuVGFzay5lbXB0eSA9IGZ1bmN0aW9uIF9lbXB0eSgpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKCkge30pO1xufTtcblxuVGFzay5wcm90b3R5cGUuZW1wdHkgPSBUYXNrLmVtcHR5O1xuXG4vLyAtLSBTaG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYFRhc2tbzrEsIM6yXWBcbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+IFZvaWQg4oaSIFN0cmluZ1xuICovXG5UYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIF90b1N0cmluZygpIHtcbiAgcmV0dXJuICdUYXNrJztcbn07XG5cbi8vIC0tIEV4dHJhY3RpbmcgYW5kIHJlY292ZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBmYWlsdXJlIHZhbHVlIGludG8gYSBuZXcgYFRhc2tbzrEsIM6yXWAuIERvZXMgbm90aGluZyBpZiB0aGVcbiAqIHN0cnVjdHVyZSBhbHJlYWR5IGNvbnRhaW5zIGEgc3VjY2Vzc2Z1bCB2YWx1ZS5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgVGFza1vOsywgzrJdKSDihpIgVGFza1vOsywgzrJdXG4gKi9cblRhc2sucHJvdG90eXBlLm9yRWxzZSA9IGZ1bmN0aW9uIF9vckVsc2UoZikge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiBmKGEpLmZvcmsocmVqZWN0LCByZXNvbHZlKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShiKTtcbiAgICB9KTtcbiAgfSwgY2xlYW51cCk7XG59O1xuXG4vLyAtLSBGb2xkcyBhbmQgZXh0ZW5kZWQgdHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uIFRha2VzIHR3byBmdW5jdGlvbnMsIGFwcGxpZXMgdGhlIGxlZnRtb3N0IG9uZSB0byB0aGUgZmFpbHVyZVxuICogdmFsdWUsIGFuZCB0aGUgcmlnaHRtb3N0IG9uZSB0byB0aGUgc3VjY2Vzc2Z1bCB2YWx1ZSwgZGVwZW5kaW5nIG9uIHdoaWNoIG9uZVxuICogaXMgcHJlc2VudC5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgzrMpLCAozrIg4oaSIM6zKSDihpIgVGFza1vOtCwgzrNdXG4gKi9cblRhc2sucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiBfZm9sZChmLCBnKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZyhiKSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiB7IFJlamVjdGVkOiDOsSDihpIgzrMsIFJlc29sdmVkOiDOsiDihpIgzrMgfSDihpIgVGFza1vOtCwgzrNdXG4gKi9cblRhc2sucHJvdG90eXBlLmNhdGEgPSBmdW5jdGlvbiBfY2F0YShwYXR0ZXJuKSB7XG4gIHJldHVybiB0aGlzLmZvbGQocGF0dGVybi5SZWplY3RlZCwgcGF0dGVybi5SZXNvbHZlZCk7XG59O1xuXG4vKipcbiAqIFN3YXBzIHRoZSBkaXNqdW5jdGlvbiB2YWx1ZXMuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiBWb2lkIOKGkiBUYXNrW86yLCDOsV1cbiAqL1xuVGFzay5wcm90b3R5cGUuc3dhcCA9IGZ1bmN0aW9uIF9zd2FwKCkge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGEpO1xuICAgIH0sIGZ1bmN0aW9uKGIpIHtcbiAgICAgIHJldHVybiByZWplY3QoYik7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBNYXBzIGJvdGggc2lkZXMgb2YgdGhlIGRpc2p1bmN0aW9uLlxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4gKM6xIOKGkiDOsyksICjOsiDihpIgzrQpIOKGkiBUYXNrW86zLCDOtF1cbiAqL1xuVGFzay5wcm90b3R5cGUuYmltYXAgPSBmdW5jdGlvbiBfYmltYXAoZiwgZykge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZWplY3QoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZyhiKSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBNYXBzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uIChmYWlsdXJlKS5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgzrMpIOKGkiBUYXNrW86zLCDOsl1cbiAqL1xuVGFzay5wcm90b3R5cGUucmVqZWN0ZWRNYXAgPSBmdW5jdGlvbiBfcmVqZWN0ZWRNYXAoZikge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZWplY3QoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoYik7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi90YXNrJyk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBwcm9wLCBmaW5kLCBpZGVudGl0eSwgcGlwZSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IHsgY3JlYXRlSWQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcbmltcG9ydCBUYXNrIGZyb20gXCJkYXRhLnRhc2tcIjtcbmltcG9ydCBJbW11dGFibGUgZnJvbSBcInNlYW1sZXNzLWltbXV0YWJsZVwiO1xuaW1wb3J0IHsgZmllbGRDcmVhdGVkIH0gZnJvbSBcIi4uL0FjdGlvbnNcIjtcblxuLy8gU3RhdGUgLT4gU3RyaW5nIC0+IEVpdGhlciBTdHJpbmcgRnVuY3Rpb25cbmNvbnN0IHR5cGVDb25zdHJ1Y3RvciA9IChzdGF0ZSwgZmllbGRUeXBlKSA9PiB7XG4gIHJldHVybiBFaXRoZXIub2Yoc3RhdGUpXG4gICAgLm1hcChwcm9wKFwiZmllbGRUeXBlc1wiKSlcbiAgICAubWFwKGZpbmQodiA9PiB2LmluZm8udHlwZSA9PT0gZmllbGRUeXBlKSlcbiAgICAuY2hhaW4oRWl0aGVyLmZyb21OdWxsYWJsZSlcbiAgICAuYmltYXAoXyA9PiBgRmllbGQgXCIke2ZpZWxkVHlwZX1cIiBkb2VzIG5vdCBleGlzdC5gLCBpZGVudGl0eSk7XG59O1xuXG4vLyB7IGluaXRpYWxTdGF0ZTogRnVuY3Rpb24gfSAtPiBUYXNrIFN0cmluZyBPYmplY3RcbmNvbnN0IGNyZWF0ZUZpZWxkID0gY29uc3RyID0+XG4gIG5ldyBUYXNrKChyZWplY3QsIHJlc29sdmUpID0+IHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIHByb21pc2UgaXMgb25seSByZXNvbHZlZCBvbmNlXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSBjb25zdHIuaW5pdGlhbFN0YXRlKCk7XG5cbiAgICBpZiAoIShmaWVsZFN0YXRlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgIHJlc29sdmUoZmllbGRTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkU3RhdGVcbiAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKSB7IHJldHVybjsgfVxuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCh2ID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZCkgeyB0aHJvdyB2OyB9XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdCh2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbi8vIE9iamVjdCAtPiBPYmplY3RcbmNvbnN0IGluc2VydFJlcXVpcmVkUHJvcHMgPSBmaWVsZCA9PlxuICBJbW11dGFibGUoZmllbGQpLm1lcmdlKHtcbiAgICBpZDogY3JlYXRlSWQoKSxcbiAgICBjb25maWdTaG93aW5nOiB0cnVlLFxuICB9LCB7XG4gICAgZGVlcDogdHJ1ZSxcbiAgfSk7XG5cbmNvbnN0IGNyZWF0ZUZpZWxkQXN5bmNocm9ub3VzbHkgPSAoc3RhdGUsIGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCkgPT5cbiAgdHlwZUNvbnN0cnVjdG9yKHN0YXRlLCBmaWVsZFR5cGUpXG4gIC5tYXAoY3JlYXRlRmllbGQpIC8vIEVpdGhlciBTdHJpbmcgKFRhc2sgU3RyaW5nIE9iamVjdClcbiAgLmxlZnRNYXAoVGFzay5yZWplY3RlZClcbiAgLm1lcmdlKCkgLy8gVGFzayBTdHJpbmcgT2JqZWN0XG4gIC5tYXAoaW5zZXJ0UmVxdWlyZWRQcm9wcylcbiAgLmZvcmsoIC8vIGV4ZWN1dGUgdGFza1xuICAgIGVyciA9PiBjb25zb2xlLmVycm9yKFwiVGFzayByZWplY3RlZFwiLCBlcnIpLFxuICAgIHBpcGUoZmllbGRDcmVhdGVkLCBhc3luY0Rpc3BhdGNoKVxuICApO1xuXG4vLyBUaGlzIGlzIGFuIGFzeW5jIGFjdGlvbi4gV2hlbiBpdCBpcyBmaW5pc2hlZCBpdCB3aWxsIHRyaWdnZXIgdGhlXG4vLyBmaWVsZCBjcmVhdGVkIGFjdGlvblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCB9KSA9PiB7XG4gIGNyZWF0ZUZpZWxkQXN5bmNocm9ub3VzbHkoc3RhdGUsIGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCk7XG4gIHJldHVybiBzdGF0ZTtcbn07XG4iLCJ2YXIgX2NvbmNhdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbmNhdCcpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgZm9sbG93ZWQgYnlcbiAqIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IGVsIFRoZSBlbGVtZW50IHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3Qgd2hvc2UgY29udGVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXRcbiAqICAgICAgICBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIG9sZCBsaXN0IGZvbGxvd2VkIGJ5IGBlbGAuXG4gKiBAc2VlIFIucHJlcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCAndGVzdHMnXVxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbXSk7IC8vPT4gWyd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKFsndGVzdHMnXSwgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsIFsndGVzdHMnXV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGFwcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChsaXN0LCBbZWxdKTtcbn0pO1xuIiwiLy8gQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUXVpbGRyZWVuIE1vdHRhIDxxdWlsZHJlZW5AZ21haWwuY29tPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uXG4vLyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlc1xuLy8gKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLFxuLy8gaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSxcbi8vIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsXG4vLyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuLy8gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbi8vIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG4vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG4vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbi8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vKipcbiAqIEBtb2R1bGUgbGliL21heWJlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF5YmVcblxuLy8gLS0gQWxpYXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgY2xvbmUgICAgICAgICA9IE9iamVjdC5jcmVhdGVcbnZhciB1bmltcGxlbWVudGVkID0gZnVuY3Rpb24oKXsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJykgfVxudmFyIG5vb3AgICAgICAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vIC0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEEgc3RydWN0dXJlIGZvciB2YWx1ZXMgdGhhdCBtYXkgbm90IGJlIHByZXNlbnQsIG9yIGNvbXB1dGF0aW9ucyB0aGF0IG1heVxuICogZmFpbC4gYE1heWJlKGEpYCBleHBsaWNpdGx5IG1vZGVscyB0aGUgZWZmZWN0cyB0aGF0IGFyZSBpbXBsaWNpdCBpblxuICogYE51bGxhYmxlYCB0eXBlcywgdGh1cyBoYXMgbm9uZSBvZiB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoXG4gKiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAg4oCUIGxpa2UgYE51bGxQb2ludGVyRXhjZXB0aW9uc2AuXG4gKlxuICogVGhlIGNsYXNzIG1vZGVscyB0d28gZGlmZmVyZW50IGNhc2VzOlxuICpcbiAqICArIGBKdXN0IGFgIOKAlCByZXByZXNlbnRzIGEgYE1heWJlKGEpYCB0aGF0IGNvbnRhaW5zIGEgdmFsdWUuIGBhYCBtYXlcbiAqICAgICBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogICsgYE5vdGhpbmdgIOKAlCByZXByZXNlbnRzIGEgYE1heWJlKGEpYCB0aGF0IGhhcyBubyB2YWx1ZXMuIE9yIGFcbiAqICAgICBmYWlsdXJlIHRoYXQgbmVlZHMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBDb21tb24gdXNlcyBvZiB0aGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBtb2RlbGxpbmcgdmFsdWVzIHRoYXQgbWF5IG9yIG1heVxuICogbm90IGJlIHByZXNlbnQgaW4gYSBjb2xsZWN0aW9uLCB0aHVzIGluc3RlYWQgb2YgbmVlZGluZyBhXG4gKiBgY29sbGVjdGlvbi5oYXMoYSlgLCB0aGUgYGNvbGxlY3Rpb24uZ2V0KGEpYCBvcGVyYXRpb24gZ2l2ZXMgeW91IGFsbFxuICogdGhlIGluZm9ybWF0aW9uIHlvdSBuZWVkIOKAlCBgY29sbGVjdGlvbi5nZXQoYSkuaXMtbm90aGluZ2AgYmVpbmdcbiAqIGVxdWl2YWxlbnQgdG8gYGNvbGxlY3Rpb24uaGFzKGEpYDsgU2ltaWxhcmx5IHRoZSBzYW1lIHJlYXNvbmluZyBtYXlcbiAqIGJlIGFwcGxpZWQgdG8gY29tcHV0YXRpb25zIHRoYXQgbWF5IGZhaWwgdG8gcHJvdmlkZSBhIHZhbHVlLCBlLmcuOlxuICogYGNvbGxlY3Rpb24uZmluZChwcmVkaWNhdGUpYCBjYW4gc2FmZWx5IHJldHVybiBhIGBNYXliZShhKWAgaW5zdGFuY2UsXG4gKiBldmVuIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIG51bGxhYmxlIHZhbHVlcy5cbiAqXG4gKiBGdXJ0aGVybW9yZSwgdGhlIHZhbHVlcyBvZiBgTWF5YmUoYSlgIGNhbiBiZSBjb21iaW5lZCBhbmQgbWFuaXB1bGF0ZWRcbiAqIGJ5IHVzaW5nIHRoZSBleHByZXNzaXZlIG1vbmFkaWMgb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3Mgc2FmZWx5XG4gKiBzZXF1ZW5jaW5nIG9wZXJhdGlvbnMgdGhhdCBtYXkgZmFpbCwgYW5kIHNhZmVseSBjb21wb3NpbmcgdmFsdWVzIHRoYXRcbiAqIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgdGhleSdyZSBwcmVzZW50IG9yIG5vdCwgZmFpbGluZyBlYXJseVxuICogKHJldHVybmluZyBhIGBOb3RoaW5nYCkgaWYgYW55IG9mIHRoZSBvcGVyYXRpb25zIGZhaWwuXG4gKlxuICogSWYgb25lIHdhbnRzIHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgZmFpbHVyZXMsIHRoZVxuICogW0VpdGhlcl1bXSBhbmQgW1ZhbGlkYXRpb25dW10gc3RydWN0dXJlcyBwcm92aWRlIHN1Y2ggYSBjYXBhYmlsaXR5LCBhbmRcbiAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBNYXliZShhKWAgc3RydWN0dXJlLlxuICpcbiAqIFtFaXRoZXJdOiBodHRwczovL2dpdGh1Yi5jb20vZm9sa3RhbGUvZGF0YS5laXRoZXJcbiAqIFtWYWxpZGF0aW9uXTogaHR0cHM6Ly9naXRodWIuY29tL2ZvbGt0YWxlL2RhdGEudmFsaWRhdGlvblxuICpcbiAqXG4gKiBAY2xhc3NcbiAqL1xuZnVuY3Rpb24gTWF5YmUoKSB7fVxuXG4vLyBUaGUgY2FzZSBmb3Igc3VjY2Vzc2Z1bCB2YWx1ZXNcbkp1c3QucHJvdG90eXBlID0gY2xvbmUoTWF5YmUucHJvdG90eXBlKVxuZnVuY3Rpb24gSnVzdChhKXtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuLy8gVGhlIGNhc2UgZm9yIGZhaWx1cmUgdmFsdWVzXG5Ob3RoaW5nLnByb3RvdHlwZSA9IGNsb25lKE1heWJlLnByb3RvdHlwZSlcbmZ1bmN0aW9uIE5vdGhpbmcoKXt9XG5cblxuLy8gLS0gQ29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgd2l0aCBhbiBhYnNlbnQgdmFsdWUuIENvbW1vbmx5IHVzZWRcbiAqIHRvIHJlcHJlc2VudCBhIGZhaWx1cmUuXG4gKlxuICogQHN1bW1hcnkgVm9pZCDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLk5vdGhpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBOb3RoaW5nXG59XG5NYXliZS5wcm90b3R5cGUuTm90aGluZyA9IE1heWJlLk5vdGhpbmdcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBzaW5nbGUgdmFsdWVcbiAqIGDOsWAuIENvbW1vbmx5IHVzZWQgdG8gcmVwcmVzZW50IGEgc3VjY2Vzcy5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGFub3RoZXJcbiAqIGBNYXliZVvOsV1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsSDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLkp1c3QgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBuZXcgSnVzdChhKVxufVxuTWF5YmUucHJvdG90eXBlLkp1c3QgPSBNYXliZS5KdXN0XG5cblxuLy8gLS0gQ29udmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgZnJvbSBhIG51bGxhYmxlIHR5cGUuXG4gKlxuICogSWYgdGhlIHZhbHVlIGlzIGVpdGhlciBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhXG4gKiBgTm90aGluZ2AsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6xKWAuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIE1heWJlW86xXVxuICovXG5NYXliZS5mcm9tTnVsbGFibGUgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhICE9IG51bGw/ICAgICAgIG5ldyBKdXN0KGEpXG4gIDogICAgICAvKiBvdGhlcndpc2UgKi8gIG5ldyBOb3RoaW5nXG59XG5NYXliZS5wcm90b3R5cGUuZnJvbU51bGxhYmxlID0gTWF5YmUuZnJvbU51bGxhYmxlXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrJdYCBzdHJ1Y3R1cmUgZnJvbSBhbiBgRWl0aGVyW86xLCDOsl1gIHR5cGUuXG4gKlxuICogVGhlIGxlZnQgc2lkZSBvZiB0aGUgYEVpdGhlcmAgYmVjb21lcyBgTm90aGluZ2AsIGFuZCB0aGUgcmlnaHQgc2lkZVxuICogaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6yKWAuXG4gKlxuICogQHN1bW1hcnkgRWl0aGVyW86xLCDOsl0g4oaSIE1heWJlW86yXVxuICovXG5NYXliZS5mcm9tRWl0aGVyID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gYS5mb2xkKE1heWJlLk5vdGhpbmcsIE1heWJlLkp1c3QpXG59XG5NYXliZS5wcm90b3R5cGUuZnJvbUVpdGhlciA9IE1heWJlLmZyb21FaXRoZXJcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsl1gIHN0cnVjdHVyZSBmcm9tIGEgYFZhbGlkYXRpb25bzrEsIM6yXWAgdHlwZS5cbiAqXG4gKiBUaGUgZmFpbHVyZSBzaWRlIG9mIHRoZSBgVmFsaWRhdGlvbmAgYmVjb21lcyBgTm90aGluZ2AsIGFuZCB0aGUgcmlnaHRcbiAqIHNpZGUgaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6yKWAuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgVmFsaWRhdGlvblvOsSwgzrJdIOKGkiBNYXliZVvOsl1cbiAqL1xuTWF5YmUuZnJvbVZhbGlkYXRpb24gICAgICAgICAgID0gTWF5YmUuZnJvbUVpdGhlclxuTWF5YmUucHJvdG90eXBlLmZyb21WYWxpZGF0aW9uID0gTWF5YmUuZnJvbUVpdGhlclxuXG5cbi8vIC0tIFByZWRpY2F0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZSBjb250YWlucyBhIGZhaWx1cmUgKGkuZS46IGBOb3RoaW5nYCkuXG4gKlxuICogQHN1bW1hcnkgQm9vbGVhblxuICovXG5NYXliZS5wcm90b3R5cGUuaXNOb3RoaW5nICAgPSBmYWxzZVxuTm90aGluZy5wcm90b3R5cGUuaXNOb3RoaW5nID0gdHJ1ZVxuXG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlIGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlIChpLmUuOiBgSnVzdCjOsSlgKS5cbiAqXG4gKiBAc3VtbWFyeSBCb29sZWFuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5pc0p1c3QgPSBmYWxzZVxuSnVzdC5wcm90b3R5cGUuaXNKdXN0ICA9IHRydWVcblxuXG4vLyAtLSBBcHBsaWNhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBzaW5nbGUgdmFsdWUgYM6xYC5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbm90aGVyXG4gKiBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIE1heWJlW86xXVxuICovXG5NYXliZS5vZiA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBKdXN0KGEpXG59XG5NYXliZS5wcm90b3R5cGUub2YgPSBNYXliZS5vZlxuXG5cbi8qKlxuICogQXBwbGllcyB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgdG8gYW5vdGhlclxuICogYXBwbGljYXRpdmUgdHlwZS5cbiAqXG4gKiBUaGUgYE1heWJlW86xXWAgc3RydWN0dXJlIHNob3VsZCBjb250YWluIGEgZnVuY3Rpb24gdmFsdWUsIG90aGVyd2lzZSBhXG4gKiBgVHlwZUVycm9yYCBpcyB0aHJvd24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBNYXliZVvOsSDihpIgzrJdLCBmOkFwcGxpY2F0aXZlW19dKSA9PiBmW86xXSDihpIgZlvOsl1cbiAqL1xuTWF5YmUucHJvdG90eXBlLmFwID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5hcCA9IG5vb3BcblxuSnVzdC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiBiLm1hcCh0aGlzLnZhbHVlKVxufVxuXG5cblxuXG4vLyAtLSBGdW5jdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2YWx1ZSBvZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlIHVzaW5nIGEgcmVndWxhciB1bmFyeVxuICogZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiAozrEg4oaSIM6yKSDihpIgTWF5YmVbzrJdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5tYXAgICA9IHVuaW1wbGVtZW50ZWRcbk5vdGhpbmcucHJvdG90eXBlLm1hcCA9IG5vb3BcblxuSnVzdC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gdGhpcy5vZihmKHRoaXMudmFsdWUpKVxufVxuXG5cbi8vIC0tIENoYWluIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZhbHVlIG9mIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgdXNpbmcgYW4gdW5hcnkgZnVuY3Rpb25cbiAqIHRvIG1vbmFkcy5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQE1heWJlW86xXSwgbTpNb25hZFtfXSkgPT4gKM6xIOKGkiBtW86yXSkg4oaSIG1bzrJdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5jaGFpbiAgID0gdW5pbXBsZW1lbnRlZFxuTm90aGluZy5wcm90b3R5cGUuY2hhaW4gPSBub29wXG5cbkp1c3QucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5cbi8vIC0tIFNob3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiBWb2lkIOKGkiBTdHJpbmdcbiAqL1xuTWF5YmUucHJvdG90eXBlLnRvU3RyaW5nID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ01heWJlLk5vdGhpbmcnXG59XG5cbkp1c3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnTWF5YmUuSnVzdCgnICsgdGhpcy52YWx1ZSArICcpJ1xufVxuXG5cbi8vIC0tIEVxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRlc3RzIGlmIGEgYE1heWJlW86xXWAgc3RydWN0dXJlIGlzIGVxdWFsIHRvIGFub3RoZXIgYE1heWJlW86xXWAgc3RydWN0dXJlLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gTWF5YmVbzrFdIOKGkiBCb29sZWFuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5pc0VxdWFsID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24oYikge1xuICByZXR1cm4gYi5pc05vdGhpbmdcbn1cblxuSnVzdC5wcm90b3R5cGUuaXNFcXVhbCA9IGZ1bmN0aW9uKGIpIHtcbiAgcmV0dXJuIGIuaXNKdXN0XG4gICYmICAgICBiLnZhbHVlID09PSB0aGlzLnZhbHVlXG59XG5cblxuLy8gLS0gRXh0cmFjdGluZyBhbmQgcmVjb3ZlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHZhbHVlIG91dCBvZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlLCBpZiBpdFxuICogZXhpc3RzLiBPdGhlcndpc2UgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiBWb2lkIOKGkiBhLCAgICAgIDo6IHBhcnRpYWwsIHRocm93c1xuICogQHNlZSB7QGxpbmsgbW9kdWxlOmxpYi9tYXliZX5NYXliZSNnZXRPckVsc2V9IOKAlCBBIGdldHRlciB0aGF0IGNhbiBoYW5kbGUgZmFpbHVyZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gaWYgdGhlIHN0cnVjdHVyZSBoYXMgbm8gdmFsdWUgKGBOb3RoaW5nYCkuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5nZXQgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuJ3QgZXh0cmFjdCB0aGUgdmFsdWUgb2YgYSBOb3RoaW5nLlwiKVxufVxuXG5KdXN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWVcbn1cblxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2YWx1ZSBvdXQgb2YgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZS4gSWYgdGhlcmUgaXMgbm8gdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0LlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gzrEg4oaSIM6xXG4gKi9cbk1heWJlLnByb3RvdHlwZS5nZXRPckVsc2UgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmdldE9yRWxzZSA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIGFcbn1cblxuSnVzdC5wcm90b3R5cGUuZ2V0T3JFbHNlID0gZnVuY3Rpb24oXykge1xuICByZXR1cm4gdGhpcy52YWx1ZVxufVxuXG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIGZhaWx1cmUgaW50byBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuIERvZXMgbm90aGluZyBpZiB0aGVcbiAqIHN0cnVjdHVyZSBhbHJlYWR5IGNvbnRhaW5zIGEgdmFsdWUuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiAoVm9pZCDihpIgTWF5YmVbzrFdKSDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5vckVsc2UgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLm9yRWxzZSA9IGZ1bmN0aW9uKGYpIHtcbiAgcmV0dXJuIGYoKVxufVxuXG5KdXN0LnByb3RvdHlwZS5vckVsc2UgPSBmdW5jdGlvbihfKSB7XG4gIHJldHVybiB0aGlzXG59XG5cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4geyBOb3RoaW5nOiBWb2lkIOKGkiDOsiwgSnVzdDogzrEg4oaSIM6yIH0g4oaSIM6yXG4gKi9cbk1heWJlLnByb3RvdHlwZS5jYXRhID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5jYXRhID0gZnVuY3Rpb24ocGF0dGVybikge1xuICByZXR1cm4gcGF0dGVybi5Ob3RoaW5nKClcbn1cblxuSnVzdC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uSnVzdCh0aGlzLnZhbHVlKTtcbn1cblxuXG4vKipcbiAqIEpTT04gc2VyaWFsaXNhdGlvblxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gVm9pZCDihpIgT2JqZWN0XG4gKi9cbk1heWJlLnByb3RvdHlwZS50b0pTT04gPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4geyAnI3R5cGUnOiAnZm9sa3RhbGU6TWF5YmUuTm90aGluZycgfVxufVxuXG5KdXN0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHsgJyN0eXBlJzogJ2ZvbGt0YWxlOk1heWJlLkp1c3QnXG4gICAgICAgICAsIHZhbHVlOiB0aGlzLnZhbHVlIH1cbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21heWJlJykiLCJpbXBvcnQgeyBjdXJyeSwgcGlwZSwgcHJvcCwgb3ZlciwgYXBwZW5kIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBoaWRlQ29uZmlncywgU3RhdGVMZW5zZXMsIHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IE1heWJlIGZyb20gXCJkYXRhLm1heWJlXCI7XG5cbi8vIFN0YXRlIC0+IE9iamVjdCAtPiBTdGF0ZVxuY29uc3QgaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkID0gY3VycnkoKHN0YXRlLCBuZXdGaWVsZCkgPT4gcGlwZShcbiAgaGlkZUNvbmZpZ3MsXG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIGFwcGVuZChuZXdGaWVsZCkpXG4pKHN0YXRlKSk7XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBjcmVhdGVkRmllbGRTdGF0ZSB9KSA9PlxuICBNYXliZS5mcm9tTnVsbGFibGUoY3JlYXRlZEZpZWxkU3RhdGUpXG4gIC5tYXAoaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkKHN0YXRlKSlcbiAgLm1hcChwcm9wKFwiZmllbGRzU3RhdGVcIikpXG4gIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgY3VycnkgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBNYXliZSBmcm9tIFwiZGF0YS5tYXliZVwiO1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tIFwic2VhbWxlc3MtaW1tdXRhYmxlXCI7XG5pbXBvcnQgeyBwdXNoSGlzdG9yeVN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgdG9nZ2xlQ29uZmlnID0gZmllbGRTdGF0ZSA9PlxuICBJbW11dGFibGUoZmllbGRTdGF0ZSkuc2V0KFwiY29uZmlnU2hvd2luZ1wiLCAhZmllbGRTdGF0ZS5jb25maWdTaG93aW5nKTtcblxuY29uc3QgcmVwbGFjZUZpZWxkU3RhdGUgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIHN0YXRlXG4gICAgLmZpZWxkc1N0YXRlXG4gICAgLm1hcChhRmllbGQgPT4gYUZpZWxkLmlkID09PSBmaWVsZFN0YXRlLmlkXG4gICAgICA/IGZpZWxkU3RhdGVcbiAgICAgIDogYUZpZWxkXG4gICAgKVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkU3RhdGUgfSkgPT5cbiAgTWF5YmUuZnJvbU51bGxhYmxlKGZpZWxkU3RhdGUpXG4gIC5tYXAodG9nZ2xlQ29uZmlnKVxuICAubWFwKHJlcGxhY2VGaWVsZFN0YXRlKHN0YXRlKSlcbiAgLm1hcChwdXNoSGlzdG9yeVN0YXRlKHN0YXRlKSlcbiAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBjdXJyeSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IE1heWJlIGZyb20gXCJkYXRhLm1heWJlXCI7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCB0b2dnbGVSZXF1aXJlZCA9IGZpZWxkU3RhdGUgPT5cbiAgSW1tdXRhYmxlKGZpZWxkU3RhdGUpLnNldChcInJlcXVpcmVkXCIsICFmaWVsZFN0YXRlLnJlcXVpcmVkKTtcblxuY29uc3QgcmVwbGFjZUZpZWxkU3RhdGUgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIHN0YXRlXG4gICAgLmZpZWxkc1N0YXRlXG4gICAgLm1hcChhRmllbGQgPT4gYUZpZWxkLmlkID09PSBmaWVsZFN0YXRlLmlkXG4gICAgICA/IGZpZWxkU3RhdGVcbiAgICAgIDogYUZpZWxkXG4gICAgKVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkU3RhdGUgfSkgPT5cbiAgTWF5YmUuZnJvbU51bGxhYmxlKGZpZWxkU3RhdGUpXG4gIC5tYXAodG9nZ2xlUmVxdWlyZWQpXG4gIC5tYXAocmVwbGFjZUZpZWxkU3RhdGUoc3RhdGUpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2ZpbHRlcihmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBsaXN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNPYmplY3QoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBPYmplY3RdJztcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWEZpbHRlcihmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5MihmdW5jdGlvbiBfeGZpbHRlcihmLCB4ZikgeyByZXR1cm4gbmV3IFhGaWx0ZXIoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfZmlsdGVyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZmlsdGVyJyk7XG52YXIgX2lzT2JqZWN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNPYmplY3QnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3hmaWx0ZXIgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmlsdGVyJyk7XG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUgYW5kIGEgXCJmaWx0ZXJhYmxlXCIsIGFuZCByZXR1cm5zIGEgbmV3IGZpbHRlcmFibGUgb2YgdGhlXG4gKiBzYW1lIHR5cGUgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gZmlsdGVyYWJsZSB3aGljaCBzYXRpc2Z5IHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBmaWx0ZXJgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gZiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXJhYmxlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5yZWplY3QsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGlzRXZlbiA9IG4gPT4gbiAlIDIgPT09IDA7XG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKCdmaWx0ZXInLCBfeGZpbHRlciwgZnVuY3Rpb24ocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gKFxuICAgIF9pc09iamVjdChmaWx0ZXJhYmxlKSA/XG4gICAgICBfcmVkdWNlKGZ1bmN0aW9uKGFjYywga2V5KSB7XG4gICAgICAgIGlmIChwcmVkKGZpbHRlcmFibGVba2V5XSkpIHtcbiAgICAgICAgICBhY2Nba2V5XSA9IGZpbHRlcmFibGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZmlsdGVyYWJsZSkpIDpcbiAgICAvLyBlbHNlXG4gICAgICBfZmlsdGVyKHByZWQsIGZpbHRlcmFibGUpXG4gICk7XG59KSk7XG4iLCJpbXBvcnQgeyBjdXJyeSwgcHJvcCwgb3ZlciwgZmlsdGVyIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBTdGF0ZUxlbnNlcywgcHVzaEhpc3RvcnlTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgTWF5YmUgZnJvbSBcImRhdGEubWF5YmVcIjtcblxuLy8gU3RhdGUgLT4gT2JqZWN0IC0+IFN0YXRlXG5jb25zdCBoaXN0b3J5U3RhdGVXaXRob3V0RmllbGQgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIG92ZXIoXG4gICAgU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsXG4gICAgZmlsdGVyKGZzID0+IGZzLmlkICE9PSBmaWVsZFN0YXRlLmlkKSxcbiAgICBzdGF0ZVxuICApXG4pO1xuXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUsIHsgZmllbGRTdGF0ZSB9KSA9PlxuICBNYXliZS5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgLm1hcChoaXN0b3J5U3RhdGVXaXRob3V0RmllbGQoc3RhdGUpKVxuICAubWFwKHByb3AoXCJmaWVsZHNTdGF0ZVwiKSlcbiAgLm1hcChwdXNoSGlzdG9yeVN0YXRlKHN0YXRlKSlcbiAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCJpbXBvcnQgeyBjdXJyeSwgcHJvcCwgb3ZlciwgbWFwIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBTdGF0ZUxlbnNlcywgcHVzaEhpc3RvcnlTdGF0ZSwgdmFsaWRhdGVGaWVsZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8vIFN0YXRlIC0+IE9iamVjdCAtPiBTdGF0ZVxuY29uc3QgdXBkYXRlRmllbGRTdGF0ZSA9IGN1cnJ5KChzdGF0ZSwgbmV3RmllbGRTdGF0ZSkgPT5cbiAgb3ZlcihcbiAgICBTdGF0ZUxlbnNlcy5maWVsZHNTdGF0ZSxcbiAgICBtYXAoZnMgPT4gZnMuaWQgPT09IG5ld0ZpZWxkU3RhdGUuaWQgPyBuZXdGaWVsZFN0YXRlIDogZnMpLFxuICAgIHN0YXRlXG4gIClcbik7XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBuZXdGaWVsZFN0YXRlIH0pID0+XG4gIHZhbGlkYXRlRmllbGQobmV3RmllbGRTdGF0ZSkgLy8gRWl0aGVyXG4gIC5tYXAodXBkYXRlRmllbGRTdGF0ZShzdGF0ZSkpXG4gIC5tYXAocHJvcChcImZpZWxkc1N0YXRlXCIpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAubGVmdE1hcChjb25zb2xlLmVycm9yKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX3NsaWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fc2xpY2UnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0LCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLFxuICogd2hpY2ggc2hvdWxkIGFjY2VwdCB0d28gdmFsdWVzIGF0IGEgdGltZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZVxuICogZmlyc3QgdmFsdWUgaXMgc21hbGxlciwgYSBwb3NpdGl2ZSBudW1iZXIgaWYgaXQncyBsYXJnZXIsIGFuZCB6ZXJvIGlmIHRoZXlcbiAqIGFyZSBlcXVhbC4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGEgKipjb3B5Kiogb2YgdGhlIGxpc3QuIEl0IGRvZXMgbm90XG4gKiBtb2RpZnkgdGhlIG9yaWdpbmFsLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEsYSAtPiBOdW1iZXIpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgQSBzb3J0aW5nIGZ1bmN0aW9uIDo6IGEgLT4gYiAtPiBJbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gc29ydFxuICogQHJldHVybiB7QXJyYXl9IGEgbmV3IGFycmF5IHdpdGggaXRzIGVsZW1lbnRzIHNvcnRlZCBieSB0aGUgY29tcGFyYXRvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZGlmZiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9O1xuICogICAgICBSLnNvcnQoZGlmZiwgWzQsMiw3LDVdKTsgLy89PiBbMiwgNCwgNSwgN11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHNvcnQoY29tcGFyYXRvciwgbGlzdCkge1xuICByZXR1cm4gX3NsaWNlKGxpc3QpLnNvcnQoY29tcGFyYXRvcik7XG59KTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbmltcG9ydCB7IGN1cnJ5LCBwaXBlLCBwcm9wLCBvdmVyLCBzb3J0IH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBoaWRlQ29uZmlncywgU3RhdGVMZW5zZXMsIHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcblxuLy8gU3RhdGUgLT4gT2JqZWN0IC0+IFN0YXRlXG5jb25zdCBoaXN0b3J5U3RhdGVXaXRoTmV3T3JkZXIgPSBjdXJyeSgoc3RhdGUsIG5ld09yZGVyKSA9PiBwaXBlKFxuICBoaWRlQ29uZmlncyxcbiAgb3ZlcihcbiAgICBTdGF0ZUxlbnNlcy5maWVsZHNTdGF0ZSxcbiAgICBzb3J0KChmMSwgZjIpID0+IG5ld09yZGVyLmluZGV4T2YoZjEuaWQpIC0gbmV3T3JkZXIuaW5kZXhPZihmMi5pZCkpXG4gIClcbikoc3RhdGUpKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IG5ld0ZpZWxkc09yZGVyIH0pID0+XG4gIChuZXdGaWVsZHNPcmRlciAmJiBBcnJheS5pc0FycmF5KG5ld0ZpZWxkc09yZGVyKVxuICAgID8gRWl0aGVyLlJpZ2h0KG5ld0ZpZWxkc09yZGVyKVxuICAgIDogRWl0aGVyLkxlZnQoYG5ld0ZpZWxkc09yZGVyIG11c3QgYmUgYW4gYXJyYXkgYnV0IHJlY2VpdmVkICR7dHlwZW9mIG5ld0ZpZWxkc09yZGVyfWApXG4gIClcbiAgLmNoYWluKG8gPT5cbiAgICBvLmxlbmd0aCA9PT0gc3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoXG4gICAgICA/IEVpdGhlci5SaWdodChvKVxuICAgICAgOiBFaXRoZXIuTGVmdChgbmV3RmllbGRzT3JkZXIgaGFzICR7by5sZW5ndGh9IGVsZW1lbnRzLCBidXQgdGhlIGN1cnJlbnQgc3RhdGUgaGFzICR7c3RhdGUuZmllbGRzU3RhdGUubGVuZ3RofSBlbGVtZW50c2ApIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxlblxuICApXG4gIC5jaGFpbihvID0+IHtcbiAgICBjb25zdCBzdGF0ZUlkcyA9IHN0YXRlLmZpZWxkc1N0YXRlLm1hcChwcm9wKFwiaWRcIikpO1xuICAgIGNvbnN0IG5vTWlzc2luZ0lkID0gc3RhdGVJZHMucmVkdWNlKChhY2MsIGZJZCkgPT4gYWNjICYmIG8uaW5jbHVkZXMoZklkKSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG5vTWlzc2luZ0lkXG4gICAgICA/IEVpdGhlci5SaWdodChvKVxuICAgICAgOiBFaXRoZXIuTGVmdChcIk5vdCBhbGwgaWRzIGluIHRoZSBuZXcgb3JkZXIgYXJlIG1hdGNoZWQgaW4gdGhlIGV4aXN0aW5nIHN0YXRlIGlkcy5cIik7XG4gIH0pXG4gIC5tYXAoaGlzdG9yeVN0YXRlV2l0aE5ld09yZGVyKHN0YXRlKSlcbiAgLm1hcChwcm9wKFwiZmllbGRzU3RhdGVcIikpXG4gIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gIC5sZWZ0TWFwKGVyciA9PiBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gcmVvcmRlcjogJHtlcnJ9YCkpXG4gIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwiLyogQGZsb3cgd2VhayAqL1xuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgU3RhdGVMZW5zZXMsIHByb3BlcnR5VHlwZUNoZWNrIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IG92ZXIsIHRyYXZlcnNlLCBjdXJyeSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcblxuLy8gW2FdID0+IEVpdGhlciBTdHJpbmcgW2FdXG5jb25zdCBpc0FycmF5ID0gYXJyID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyKVxuICAgID8gRWl0aGVyLlJpZ2h0KGFycilcbiAgICA6IEVpdGhlci5MZWZ0KGBFeHBlY3RlZCBBcnJheSBidXQgcmVjZWl2ZWQgJHt0eXBlb2YgYXJyfWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cblxuLy8gT2JqZWN0IC0+IEVpdGhlciBTdHJpbmcgT2JqZWN0XG5jb25zdCBoYXNSZXF1aXJlZEluZm8gPSBjb21wb25lbnQgPT5cbiAgcHJvcGVydHlUeXBlQ2hlY2soXCJpbml0aWFsU3RhdGVcIiwgXCJmdW5jdGlvblwiLCBjb21wb25lbnQpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcIlJlbmRlckVkaXRvclwiLCBcImZ1bmN0aW9uXCIpKVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJpbmZvXCIsIFwib2JqZWN0XCIpKVxuICAuY2hhaW4oYyA9PiBFaXRoZXIuZnJvbU51bGxhYmxlKGMuaW5mbykpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcInR5cGVcIiwgXCJzdHJpbmdcIikpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcImRpc3BsYXlOYW1lXCIsIFwic3RyaW5nXCIpKVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJncm91cFwiLCBcInN0cmluZ1wiKSlcbiAgLmNoYWluKF8gPT4gRWl0aGVyLlJpZ2h0KGNvbXBvbmVudCkpO1xuXG5jb25zdCBpc0NvbXBvbmVudFZhbGlkID0gY3VzdG9tQ29tcG9uZW50cyA9PlxuICB0cmF2ZXJzZShFaXRoZXIub2YsIGhhc1JlcXVpcmVkSW5mbywgY3VzdG9tQ29tcG9uZW50cyk7XG5cbi8vIFthXSAtPiBbYV0gLT4gRWl0aGVyIFN0cmluZyBbYV1cbmNvbnN0IHZhbGlkYXRlQ29tcG9uZW50cyA9IGN1c3RvbUNvbXBvbmVudHMgPT5cbiAgRWl0aGVyLlJpZ2h0KGN1c3RvbUNvbXBvbmVudHMpXG4gICAgLmNoYWluKGlzQXJyYXkpXG4gICAgLmNoYWluKGlzQ29tcG9uZW50VmFsaWQpO1xuXG5jb25zdCBhZGRUb0ZpZWxkVHlwZXMgPSBjdXJyeSgoc3RhdGUsIGN1c3RvbUNvbXBvbmVudHMpID0+XG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRUeXBlcywgcyA9PiBzLmNvbmNhdChjdXN0b21Db21wb25lbnRzKSwgc3RhdGUpXG4pO1xuXG4vLyBJZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zIHdpdGggdGhlIGltcG9ydCwgdGhlIHNhbWUgc3RhdGVcbi8vIHdpbGwgYmUgcmV0dXJuZWRcbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBjdXN0b21Db21wb25lbnRzIH0pID0+XG4gIChjdXN0b21Db21wb25lbnRzXG4gICAgPyBFaXRoZXIuUmlnaHQoY3VzdG9tQ29tcG9uZW50cylcbiAgICA6IEVpdGhlci5MZWZ0KFwiRW1wdHkgY3VzdG9tIGNvbXBvbmVudHNcIilcbiAgKVxuICAgIC5jaGFpbih2YWxpZGF0ZUNvbXBvbmVudHMpXG4gICAgLmxlZnRNYXAoZXJyID0+IGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIGN1c3RvbSBjb21wb25lbnRzOlwiLCBlcnIpKVxuICAgIC5tYXAoYWRkVG9GaWVsZFR5cGVzKHN0YXRlKSlcbiAgICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJmbC1hc3NlcnRcIjtcbmltcG9ydCB1bmRvIGZyb20gXCIuL3VuZG9cIjtcbmltcG9ydCBpbXBvcnRTdGF0ZSBmcm9tIFwiLi9pbXBvcnRTdGF0ZVwiO1xuaW1wb3J0IGNyZWF0ZUZpZWxkIGZyb20gXCIuL2NyZWF0ZUZpZWxkXCI7XG5pbXBvcnQgZmllbGRDcmVhdGVkIGZyb20gXCIuL2ZpZWxkQ3JlYXRlZFwiO1xuaW1wb3J0IHRvZ2dsZUNvbmZpZyBmcm9tIFwiLi9maWVsZC50b2dnbGVDb25maWdcIjtcbmltcG9ydCB0b2dnbGVSZXF1aXJlZCBmcm9tIFwiLi9maWVsZC50b2dnbGVSZXF1aXJlZFwiO1xuaW1wb3J0IGRlbGV0ZUZpZWxkIGZyb20gXCIuL2ZpZWxkLmRlbGV0ZUZpZWxkXCI7XG5pbXBvcnQgdXBkYXRlRmllbGQgZnJvbSBcIi4vZmllbGQudXBkYXRlRmllbGRcIjtcbmltcG9ydCByZW9yZGVyRmllbGRzIGZyb20gXCIuL3Jlb3JkZXJGaWVsZHNcIjtcbmltcG9ydCBpbXBvcnRDdXN0b21Db21wb25lbnRzIGZyb20gXCIuL2ltcG9ydEN1c3RvbUNvbXBvbmVudHNcIjtcblxuY29uc3QgYWN0aW9uSGFuZGxlcnMgPSB7XG4gIHVuZG8sXG4gIGltcG9ydFN0YXRlLFxuICBjcmVhdGVGaWVsZCxcbiAgZmllbGRDcmVhdGVkLFxuICB0b2dnbGVDb25maWcsXG4gIHRvZ2dsZVJlcXVpcmVkLFxuICBkZWxldGVGaWVsZCxcbiAgdXBkYXRlRmllbGQsXG4gIHJlb3JkZXJGaWVsZHMsXG4gIGltcG9ydEN1c3RvbUNvbXBvbmVudHMsXG59O1xuXG5jb25zdCBpc0V4cGVjdGVkQWN0aW9uID0gYSA9PiBhICYmIGEudHlwZSAmJiBhY3Rpb25IYW5kbGVyc1thLnR5cGVdO1xuY29uc3QgaXNSZWR1eEFjdGlvbiA9IGEgPT4gYSAmJiBhLnR5cGUgJiYgYS50eXBlLmluY2x1ZGVzKFwiQEByZWR1eFwiKTtcblxuXG5jb25zdCB1cGRhdGUgPSAoc3RhdGUsIGFjdGlvbikgPT5cbiAgaXNFeHBlY3RlZEFjdGlvbihhY3Rpb24pXG4gICAgPyBhY3Rpb25IYW5kbGVyc1thY3Rpb24udHlwZV0oc3RhdGUsIGFjdGlvbilcbiAgOiBpc1JlZHV4QWN0aW9uKGFjdGlvbilcbiAgICA/IHN0YXRlXG4gIDogYXNzZXJ0KGZhbHNlLCBgSW52YWxpZCBhY3Rpb24gdHlwZTogJHthY3Rpb24udHlwZX1gKTtcblxuZXhwb3J0IGRlZmF1bHQgdXBkYXRlO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG5cbmltcG9ydCB7IHVuZG8gYXMgdW5kb0FjdGlvbiB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgY3VycmVudEZpZWxkc1N0YXRlID0gW1wiY3VycmVudFwiXTtcbmNvbnN0IG9sZEZpZWxkc1N0YXRlID0gW1wib2xkXCJdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IGN1cnJlbnRGaWVsZHNTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBbb2xkRmllbGRzU3RhdGVdLFxufTtcblxuY29uc3QgZW1wdHlNb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IFtdLFxuICBmaWVsZHNTdGF0ZTogW10sXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogW10sXG59O1xuXG5jb25zdCBlbXB0eUhpc3RvcnlNb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IFtdLFxuICBmaWVsZHNTdGF0ZTogY3VycmVudEZpZWxkc1N0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudW5kb1wiLCAoKSA9PiB7XG4gIGl0KFwicmVtb3ZlcyBmaXJzdCBvbGQgc3RhdGUgZnJvbSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdW5kb0FjdGlvbigpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDApO1xuICB9KTtcblxuICBpdChcInNldHMgZmlyc3Qgb2xkIHN0YXRlIGFzIGN1cnJlbnQgc3RhdGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB1bmRvQWN0aW9uKCkpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlKS50b0VxdWFsKG9sZEZpZWxkc1N0YXRlKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2Vzbid0IG1vZGlmeSB0aGUgc3RhdGUgaWYgdGhlcmUgYXJlbid0IG1vcmUgaGlzdG9yeSBzdGF0ZXMgdG8gdW5kb1wiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShlbXB0eU1vY2tTdGF0ZSwgdW5kb0FjdGlvbigpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZSkudG9FcXVhbChlbXB0eU1vY2tTdGF0ZSk7XG4gIH0pO1xuXG4gIGl0KFwic2V0J3MgdGhlIGN1cnJlbnQgc3RhdGUgdG8gZW1wdHkgaWYgdGhlcmUgYXJlIG5vIG1vcmUgaGlzdG9yeSBzdGF0ZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUoZW1wdHlIaXN0b3J5TW9ja1N0YXRlLCB1bmRvQWN0aW9uKCkpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgaW1wb3J0U3RhdGUgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IHR5cGVzQXJyYXkgPSBbe1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlJhZGlvQnV0dG9uc1wiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIkNoZWNrYm94ZXNcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJEcm9wZG93blwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRleHRCb3hcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJFbWFpbEJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRlbGVwaG9uZUJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIk51bWJlckJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRleHRBcmVhXCIsXG4gIH0sXG59LCB7XG4gIFwiaW5mb1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiRGF0ZUZpZWxkXCIsXG4gIH0sXG59XTtcblxuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtcImFcIiwgXCJiXCJdO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogdHlwZXNBcnJheSxcbiAgZmllbGRzU3RhdGU6IG1vY2tDdXJyZW50U3RhdGUsXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbW9ja0hpc3RvcnksXG59O1xuXG5jb25zdCBuZXdWYWxpZFN0YXRlID0gW3tcbiAgXCJ0eXBlXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImRpc3BsYXlOYW1lXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImdyb3VwXCI6IFwiT3B0aW9ucyBDb21wb25lbnRzXCIsXG4gIFwiaHRtbElucHV0VHlwZVwiOiBcImNoZWNrYm94XCIsXG4gIFwidGl0bGVcIjogXCJBZGQgYSB0aXRsZVwiLFxuICBcImlkXCI6IDIsXG4gIFwib3B0aW9uc1wiOiBbe1xuICAgIFwiY2FwdGlvblwiOiBcIkluc2VydCBhbiBvcHRpb25cIixcbiAgfV0sXG4gIFwibmV3T3B0aW9uQ2FwdGlvblwiOiBcIlwiLFxufV07XG5cbmNvbnN0IG5ld0ludmFsaWRTdGF0ZSA9IFt7XG4gIFwidHlwZVwiOiBcIkludmFsaWQgdHlwZVwiLFxuICBcImRpc3BsYXlOYW1lXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImdyb3VwXCI6IFwiT3B0aW9ucyBDb21wb25lbnRzXCIsXG4gIFwiaHRtbElucHV0VHlwZVwiOiBcImNoZWNrYm94XCIsXG4gIFwidGl0bGVcIjogXCJBZGQgYSB0aXRsZVwiLFxuICBcIm9wdGlvbnNcIjogW3tcbiAgICBcImNhcHRpb25cIjogXCJJbnNlcnQgYW4gb3B0aW9uXCIsXG4gIH1dLFxuICBcIm5ld09wdGlvbkNhcHRpb25cIjogXCJcIixcbn1dO1xuXG5kZXNjcmliZShcIlVwZGF0ZS5pbXBvcnRTdGF0ZVwiLCAoKSA9PiB7XG4gIGl0KFwiUmV0dXJucyBhbiB1bmNoYW5nZWQgYXJyYXkgaWYgdGhlIG5ldyBzdGF0ZSBpcyBpbnZhbGlkXCIsICgpID0+IHtcbiAgICBleHBlY3QodXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUoe30pKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShudWxsKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIGFuIHVuY2hhbmdlZCBhcnJheSBpZiB0aGUgYSBmaWVsZCdzIHR5cGUgaXMgbm90IGluIGZpZWxkVHlwZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShuZXdJbnZhbGlkU3RhdGUpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICB9KTtcblxuICBpdChcIlNlbmRzIHRoZSBsYXN0IGN1cnJlbnQgc3RhdGUgdG8gdGhlIGhpc3RvcnlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShuZXdWYWxpZFN0YXRlKSk7XG4gICAgZXhwZWN0KHVwZGF0ZWQuZmllbGRzU3RhdGVIaXN0b3J5WzBdLnRvU3RyaW5nKCkpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZS50b1N0cmluZygpKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKG1vY2tIaXN0b3J5Lmxlbmd0aCArIDEpO1xuICB9KTtcblxuICBpdChcIlNldHMgdGhlIG5ldyBzdGF0ZSBhcyBjdXJyZW50XCIsICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkID0gdXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUobmV3VmFsaWRTdGF0ZSkpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLnR5cGUpLnRvRXF1YWwobmV3VmFsaWRTdGF0ZVswXS50eXBlKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZVswXS50eXBlKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmRpc3BsYXlOYW1lKS50b0VxdWFsKG5ld1ZhbGlkU3RhdGVbMF0uZGlzcGxheU5hbWUpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmRpc3BsYXlOYW1lKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmdyb3VwKS50b0VxdWFsKG5ld1ZhbGlkU3RhdGVbMF0uZ3JvdXApO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmdyb3VwKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdChcIk1ha2VzIHN1cmUgYWxsIGlkcyBhcmUgc3RyaW5nc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRTdGF0ZTIgPSBuZXdWYWxpZFN0YXRlXG4gICAgICAubWFwKCh2LCBpZHgpID0+IGlkeCAhPT0gMCA/IHYgOiBPYmplY3QuYXNzaWduKHt9LCB2LCB7IGlkOiAyIH0pKTtcbiAgICBjb25zdCB1cGRhdGVkID0gdXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUodmFsaWRTdGF0ZTIpKTtcbiAgICBleHBlY3QodHlwZW9mIHVwZGF0ZWQuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoXCJzdHJpbmdcIik7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5cbmltcG9ydCB7IGNyZWF0ZUZpZWxkIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCBwcm9taXNlVHlwZUluc3RhbmNlID0geyB0eXBlOiBcInByb21pc2UtaW5zdGFuY2VcIiB9O1xuY29uc3QgcHJvbWlzZVR5cGUgPSB7XG4gIGluZm86IHsgdHlwZTogXCJQcm9taXNlVHlwZVwiIH0sXG4gIGluaXRpYWxTdGF0ZTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHByb21pc2VUeXBlSW5zdGFuY2UpLFxufTtcblxuY29uc3Qgc3luY1R5cGVJbnN0YW5jZSA9IHsgdHlwZTogXCJzeW5jLWluc3RhbmNlXCIgfTtcbmNvbnN0IHN5bmNUeXBlID0ge1xuICBpbmZvOiB7IHR5cGU6IFwiU3luY1R5cGVcIiB9LFxuICBpbml0aWFsU3RhdGU6ICgpID0+IHN5bmNUeXBlSW5zdGFuY2UsXG59O1xuXG5jb25zdCB0eXBlc0FycmF5ID0gW3Byb21pc2VUeXBlLCBzeW5jVHlwZV07XG5jb25zdCBtb2NrQ3VycmVudFN0YXRlID0gW1wiYVwiLCBcImJcIl07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiB0eXBlc0FycmF5LFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmNyZWF0ZUZpZWxkXCIsICgpID0+IHtcbiAgaXQoXCJjcmVhdGVzIGZpZWxkcyBhc3luY2hyb25vdXNseVwiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gdiA9PiB7XG4gICAgICBleHBlY3Qodikubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKHN5bmNUeXBlLmluZm8udHlwZSlcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhICdmaWVsZENyZWF0ZWQnIGFjdGlvbiB3aGVuIGZpZWxkIGlzIGNyZWF0ZWRcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IGFjdGlvbiA9PiB7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJmaWVsZENyZWF0ZWRcIik7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChzeW5jVHlwZS5pbmZvLnR5cGUpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuICB9KTtcblxuICBpdChcImNyZWF0ZXMgdHlwZXMgd2l0aCBjb25zdHJ1Y3RvcnMgdGhhdCByZXR1cm4gYSBwbGFpbiBvYmplY3RcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IGFjdGlvbiA9PiB7XG4gICAgICBleHBlY3QoYWN0aW9uLmNyZWF0ZWRGaWVsZFN0YXRlKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZS50eXBlKS50b0VxdWFsKHN5bmNUeXBlSW5zdGFuY2UudHlwZSk7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChzeW5jVHlwZS5pbmZvLnR5cGUpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuICB9KTtcblxuICBpdChcImNyZWF0ZXMgdHlwZXMgd2l0aCBjb25zdHJ1Y3RvcnMgdGhhdCByZXR1cm4gYSBwcm9taXNlXCIsIGRvbmUgPT4ge1xuICAgIGNvbnN0IGFzeW5jRGlzcGF0Y2ggPSBhY3Rpb24gPT4ge1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZSkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUudHlwZSkudG9FcXVhbChwcm9taXNlVHlwZUluc3RhbmNlLnR5cGUpO1xuICAgICAgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBhc3luY0FjaW9uID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHsgYXN5bmNEaXNwYXRjaCB9LFxuICAgICAgY3JlYXRlRmllbGQocHJvbWlzZVR5cGUuaW5mby50eXBlKVxuICAgICk7XG5cbiAgICB1cGRhdGUobW9ja1N0YXRlLCBhc3luY0FjaW9uKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHJlcXVpcmVkIGZpZWxkcyB0byBpbnN0YW5jZVwiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gYWN0aW9uID0+IHtcbiAgICAgIGV4cGVjdChhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUuaWQpLm5vdC50b0VxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QodHlwZW9mIGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZS5jb25maWdTaG93aW5nKS50b0VxdWFsKFwiYm9vbGVhblwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKHByb21pc2VUeXBlLmluZm8udHlwZSlcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgY3JlYXRlIGEgZmllbGQgaWYgdHlwZSBpcyBub3QgaW4gbW9kZWwuZmllbGRUeXBlc1wiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gamFzbWluZS5jcmVhdGVTcHkoXCJhc3luY0Rpc3BhdGNoXCIpO1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKFwibm9uLWV4aXN0aW5nLXR5cGVcIilcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG5cbiAgICBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4geyBleHBlY3QoYXN5bmNEaXNwYXRjaCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTsgZG9uZSgpOyB9LFxuICAgICAgNTBcbiAgICApO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyBmaWVsZENyZWF0ZWQgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IGNyZWF0ZWRGaWVsZFN0YXRlID0geyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9O1xuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtcImFcIiwgXCJiXCJdO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW3sgaW5mbzogeyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9IH1dLFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmNvbnN0IGZpZWxkQ3JlYXRlZEFjdGlvbiA9IGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSk7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGZpZWxkQ3JlYXRlZEFjdGlvbik7XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmZpZWxkQ3JlYXRlZFwiLCAoKSA9PiB7XG4gIGl0KFwib3V0cHV0cyBhIHN0YXRlIHdpdGggdGhlIG5ldyBmaWVsZCBpbmNsdWRlZFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoICsgMSk7XG4gICAgZXhwZWN0KFxuICAgICAgbmV3U3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKHYgPT4gdi50eXBlID09PSBjcmVhdGVkRmllbGRTdGF0ZS50eXBlKVxuICAgICkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzBdKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0pO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0pLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVsxXSk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBpZiBubyBuZXcgZmllbGQgaXMgZ2l2ZW4gdG8gaXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNhbWVTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGZpZWxkQ3JlYXRlZChudWxsKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgYnJlYWsgdGhlIHN0YXRlIGFmdGVyIGNyZWF0aW5nIG9uZSBvYmplY3RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZSwgZmllbGRDcmVhdGVkKGNyZWF0ZWRGaWVsZFN0YXRlKSk7XG4gICAgY29uc3QgY2hhbmdlZDIgPSB1cGRhdGUoY2hhbmdlZDEsIGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSkpO1xuICAgIGNvbnN0IGNoYW5nZWQzID0gdXBkYXRlKGNoYW5nZWQyLCBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGUubGVuZ3RoICsgMyk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwoMyk7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cblxuaW1wb3J0IHsgdG9nZ2xlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5cbmNvbnN0IGZpZWxkU3RhdGVDb25maWdTaG93aW5nID0ge1xuICBpZDogMTIzLFxuICBjb25maWdTaG93aW5nOiB0cnVlLFxufTtcblxuY29uc3QgZmllbGRTdGF0ZUNvbmZpZ05vdFNob3dpbmcgPSB7XG4gIGlkOiAzMjEsXG4gIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxufTtcblxuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IFtmaWVsZFN0YXRlQ29uZmlnU2hvd2luZywgZmllbGRTdGF0ZUNvbmZpZ05vdFNob3dpbmddLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudG9nZ2xlQ29uZmlnXCIsICgpID0+IHtcbiAgaXQoXCJ0dXJucyB0aGUgY29uZmlnIG9wdGlvbiB0byBmYWxzZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZUNvbmZpZyhmaWVsZFN0YXRlQ29uZmlnU2hvd2luZykpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUNvbmZpZ1Nob3dpbmcuaWQpXG4gICAgICAuY29uZmlnU2hvd2luZ1xuICAgICkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KFwidHVybnMgdGhlIGNvbmZpZyBvcHRpb24gdG8gdHJ1ZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZUNvbmZpZyhmaWVsZFN0YXRlQ29uZmlnTm90U2hvd2luZykpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUNvbmZpZ1Nob3dpbmcuaWQpXG4gICAgICAuY29uZmlnU2hvd2luZ1xuICAgICkudG9FcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHRoZSBsYXN0IHN0YXRlIHRvIHRoZSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdG9nZ2xlQ29uZmlnKGZpZWxkU3RhdGVDb25maWdTaG93aW5nKSk7XG4gICAgZXhwZWN0KG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuXG5pbXBvcnQgeyB0b2dnbGVSZXF1aXJlZCB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuXG5jb25zdCBmaWVsZFN0YXRlSXNSZXF1aXJlZCA9IHtcbiAgaWQ6IDEyMyxcbiAgcmVxdWlyZWQ6IHRydWUsXG59O1xuXG5jb25zdCBmaWVsZFN0YXRlSXNOb3RSZXF1aXJlZCA9IHtcbiAgaWQ6IDMyMSxcbiAgcmVxdWlyZWQ6IGZhbHNlLFxufTtcblxuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IFtmaWVsZFN0YXRlSXNSZXF1aXJlZCwgZmllbGRTdGF0ZUlzTm90UmVxdWlyZWRdLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudG9nZ2xlUmVxdWlyZWRcIiwgKCkgPT4ge1xuICBpdChcInR1cm5zIHRoZSByZXF1aXJlZCBvcHRpb24gdG8gZmFsc2Ugd2hlbiBuZWVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlSXNSZXF1aXJlZCkpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUlzUmVxdWlyZWQuaWQpXG4gICAgICAucmVxdWlyZWRcbiAgICApLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdChcInR1cm5zIHRoZSByZXF1aXJlZCBvcHRpb24gdG8gdHJ1ZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZVJlcXVpcmVkKGZpZWxkU3RhdGVJc05vdFJlcXVpcmVkKSk7XG4gICAgZXhwZWN0KFxuICAgICAgbW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZVxuICAgICAgLmZpbmQoZiA9PiBmLmlkID09PSBmaWVsZFN0YXRlSXNSZXF1aXJlZC5pZClcbiAgICAgIC5yZXF1aXJlZFxuICAgICkudG9FcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHRoZSBsYXN0IHN0YXRlIHRvIHRoZSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdG9nZ2xlUmVxdWlyZWQoZmllbGRTdGF0ZUlzUmVxdWlyZWQpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVswXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVsxXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMV0uaWQpO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyBkZWxldGVGaWVsZCB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgdG9CZURlbGV0ZWRGaWVsZFN0YXRlID0geyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiwgaWQ6IDAgfTtcbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbdG9CZURlbGV0ZWRGaWVsZFN0YXRlLCB7IGlkOiAxIH0sIHsgaWQ6IDIgfV07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgZmllbGREZWxldGVBY3Rpb24gPSBkZWxldGVGaWVsZCh0b0JlRGVsZXRlZEZpZWxkU3RhdGUpO1xuY29uc3QgbmV3U3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCBmaWVsZERlbGV0ZUFjdGlvbik7XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmRlbGV0ZUZpZWxkXCIsICgpID0+IHtcbiAgaXQoXCJvdXRwdXRzIGEgc3RhdGUgd2l0aG91dCB0aGUgZmllbGQgaW5jbHVkZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCAtIDEpO1xuICAgIGV4cGVjdChcbiAgICAgIG5ld1N0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZCh2ID0+IHYuaWQgPT09IHRvQmVEZWxldGVkRmllbGRTdGF0ZS5pZClcbiAgICApLnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCByZWNlbnRIaXN0b3J5U3RhdGUgPSBuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF07XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChyZWNlbnRIaXN0b3J5U3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZVsxXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzFdLmlkKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGlmIG5vIG5ldyBmaWVsZCBpcyBnaXZlbiB0byBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FtZVN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgZGVsZXRlRmllbGQobnVsbCkpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGJyZWFrIHRoZSBzdGF0ZSBhZnRlciBkZWxldGluZyBhIGZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2NrRmllbGQxID0gT2JqZWN0LmFzc2lnbih7fSwgdG9CZURlbGV0ZWRGaWVsZFN0YXRlLCB7IGlkOiA1IH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDIgPSBPYmplY3QuYXNzaWduKHt9LCB0b0JlRGVsZXRlZEZpZWxkU3RhdGUsIHsgaWQ6IDYgfSk7XG4gICAgY29uc3QgbW9ja0ZpZWxkMyA9IE9iamVjdC5hc3NpZ24oe30sIHRvQmVEZWxldGVkRmllbGRTdGF0ZSwgeyBpZDogNyB9KTtcblxuICAgIGNvbnN0IG1vY2tTdGF0ZTIgPSBPYmplY3QuYXNzaWduKHt9LCBtb2NrU3RhdGUsIHtcbiAgICAgIGZpZWxkc1N0YXRlOiBbXG4gICAgICAgIG1vY2tGaWVsZDEsXG4gICAgICAgIG1vY2tGaWVsZDIsXG4gICAgICAgIG1vY2tGaWVsZDMsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZTIsIGRlbGV0ZUZpZWxkKG1vY2tGaWVsZDEpKTtcbiAgICBjb25zdCBjaGFuZ2VkMiA9IHVwZGF0ZShjaGFuZ2VkMSwgZGVsZXRlRmllbGQobW9ja0ZpZWxkMikpO1xuICAgIGNvbnN0IGNoYW5nZWQzID0gdXBkYXRlKGNoYW5nZWQyLCBkZWxldGVGaWVsZChtb2NrRmllbGQzKSk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZTIuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlMi5maWVsZHNTdGF0ZS5sZW5ndGggLSAzKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgzKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgdXBkYXRlRmllbGQgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IG9sZEZpZWxkU3RhdGUgPSB7XG4gIHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiLFxuICBpZDogXCIwXCIsXG4gIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxuICByZXF1aXJlZDogZmFsc2UsXG4gIGNvbG9yOiBcImJsdWVcIixcbn07XG5jb25zdCBuZXdGaWVsZFN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgb2xkRmllbGRTdGF0ZSwgeyBjb2xvcjogXCJncmVlblwiIH0pO1xuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtvbGRGaWVsZFN0YXRlLCB7IGlkOiAxIH0sIHsgaWQ6IDIgfV07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgZmllbGRVcGRhdGVBY3Rpb24gPSB1cGRhdGVGaWVsZChuZXdGaWVsZFN0YXRlKTtcbmNvbnN0IG5ld1N0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgZmllbGRVcGRhdGVBY3Rpb24pO1xuXG5kZXNjcmliZShcIlVwZGF0ZS51cGRhdGVGaWVsZFwiLCAoKSA9PiB7XG4gIGl0KFwib3V0cHV0cyBhIHN0YXRlIHRoZSBmaWVsZCB1cGRhdGVkXCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChcbiAgICAgIG5ld1N0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZCh2ID0+IHYuY29sb3IgPT09IG5ld0ZpZWxkU3RhdGUuY29sb3IpXG4gICAgKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdChcIm91dHB1dHMgYSBzdGF0ZSB0aGUgdXBkYXRlZCBmaWVsZCBpbiB0aGUgY29ycmVjdCBvcmRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG5ld0ZpZWxkU3RhdGUuY29sb3IpO1xuICB9KTtcblxuICBpdChcInNlbmRzIHRoZSBjdXJyZW50IHN0YXRlIHRvIGhpc3RvcnlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHJlY2VudEhpc3RvcnlTdGF0ZSA9IG5ld1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXTtcbiAgICBleHBlY3QocmVjZW50SGlzdG9yeVN0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZVswXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzBdLmlkKTtcbiAgICBleHBlY3QocmVjZW50SGlzdG9yeVN0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0uY29sb3IpO1xuICB9KTtcblxuICBpdChcIlJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgaWYgYW4gaW52YWxpZCBmaWVsZCBzdGF0ZSBpcyBnaXZlbiB0byBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3QgaXNTYW1lID0gKHN0YXRlMSwgc3RhdGUyKSA9PiB7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKHN0YXRlMi5maWVsZFR5cGVzLmxlbmd0aCk7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChzdGF0ZTIuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVbMF0uY29sb3IpLnRvRXF1YWwoc3RhdGUyLmZpZWxkc1N0YXRlWzBdLmNvbG9yKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoc3RhdGUyLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChzdGF0ZTIuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNhbWVTdGF0ZTEgPSB1cGRhdGUobW9ja1N0YXRlLCB1cGRhdGVGaWVsZChudWxsKSk7XG4gICAgaXNTYW1lKG1vY2tTdGF0ZSwgc2FtZVN0YXRlMSk7XG5cbiAgICBjb25zdCBzYW1lU3RhdGUyID0gdXBkYXRlKFxuICAgICAgbW9ja1N0YXRlLFxuICAgICAgdXBkYXRlRmllbGQoT2JqZWN0LmFzc2lnbih7fSwgbmV3RmllbGRTdGF0ZSwgeyBpZDogbnVsbCB9KSlcbiAgICApO1xuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTIpO1xuXG4gICAgY29uc3Qgc2FtZVN0YXRlMyA9IHVwZGF0ZShcbiAgICAgIG1vY2tTdGF0ZSxcbiAgICAgIHVwZGF0ZUZpZWxkKE9iamVjdC5hc3NpZ24oe30sIG5ld0ZpZWxkU3RhdGUsIHsgY29uZmlnU2hvd2luZzogbnVsbCB9KSlcbiAgICApO1xuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTMpO1xuXG4gICAgY29uc3Qgc2FtZVN0YXRlNCA9IHVwZGF0ZShcbiAgICAgIG1vY2tTdGF0ZSxcbiAgICAgIHVwZGF0ZUZpZWxkKE9iamVjdC5hc3NpZ24oe30sIG5ld0ZpZWxkU3RhdGUsIHsgcmVxdWlyZWQ6IG51bGwgfSkpXG4gICAgKTtcblxuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTQpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGJyZWFrIHRoZSBzdGF0ZSBhZnRlciB1cGRhdGluZyBhIGZpZWxkIG11bHRpcGxlIHRpbWVzIGEgZmllbGRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tGaWVsZDEgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcInllbGxvd1wiIH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDIgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcIm9yYW5nZVwiIH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDMgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcInB1cnBsZVwiIH0pO1xuXG4gICAgY29uc3QgY2hhbmdlZDEgPSB1cGRhdGUobW9ja1N0YXRlLCB1cGRhdGVGaWVsZChtb2NrRmllbGQxKSk7XG4gICAgY29uc3QgY2hhbmdlZDIgPSB1cGRhdGUoY2hhbmdlZDEsIHVwZGF0ZUZpZWxkKG1vY2tGaWVsZDIpKTtcbiAgICBjb25zdCBjaGFuZ2VkMyA9IHVwZGF0ZShjaGFuZ2VkMiwgdXBkYXRlRmllbGQobW9ja0ZpZWxkMykpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG1vY2tGaWVsZDMuY29sb3IpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDMpO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyByZW9yZGVyRmllbGRzIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCB0ZW1wbGF0ZUZpZWxkID0ge1xuICB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIixcbiAgcmVxdWlyZWQ6IGZhbHNlLFxuICBjb25maWdTaG93aW5nOiBmYWxzZSxcbiAgaWQ6IFwiMFwiLFxufTtcbmNvbnN0IGZpZWxkMSA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXBsYXRlRmllbGQsIHsgaWQ6IFwiMVwiIH0pO1xuY29uc3QgZmllbGQyID0gT2JqZWN0LmFzc2lnbih7fSwgdGVtcGxhdGVGaWVsZCwgeyBpZDogXCIyXCIgfSk7XG5jb25zdCBmaWVsZDMgPSBPYmplY3QuYXNzaWduKHt9LCB0ZW1wbGF0ZUZpZWxkLCB7IGlkOiBcIjNcIiB9KTtcbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbZmllbGQxLCBmaWVsZDIsIGZpZWxkM107XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgbmV3T3JkZXIgPSBbXCIyXCIsIFwiM1wiLCBcIjFcIl07XG5jb25zdCByZW9yZGVyRmllbGRzQWN0aW9uID0gcmVvcmRlckZpZWxkcyhuZXdPcmRlcik7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHJlb3JkZXJGaWVsZHNBY3Rpb24pO1xuXG5kZXNjcmliZShcIlVwZGF0ZS5yZW9yZGVyRmllbGRzXCIsICgpID0+IHtcbiAgaXQoXCJvdXRwdXRzIGEgc3RhdGUgd2l0aCBmaWVsZHMgaW4gdGhlIG5ldyBvcmRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobmV3T3JkZXJbMF0pO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCkudG9FcXVhbChuZXdPcmRlclsxXSk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzJdLmlkKS50b0VxdWFsKG5ld09yZGVyWzJdKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzBdLmlkKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVsyXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzJdLmlkKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGlmIGFueSBmaWVsZCBpZCBpcyBtaXNzaW5nXCIsICgpID0+IHtcbiAgICBjb25zdCBzYW1lU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCByZW9yZGVyRmllbGRzKFtcIjFcIiwgXCIyXCJdKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZVsyXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMl0uaWQpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBpZiB0aGUgcmVvcmRlciBhcnJheSBoYXMgbW9yZSBlbGVtZW50cyB0aGFuIGl0IHNob3VsZFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FtZVN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgcmVvcmRlckZpZWxkcyhbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZVsyXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMl0uaWQpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgYnJlYWsgdGhlIHN0YXRlIGFmdGVyIGNyZWF0aW5nIG9uZSBvYmplY3RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZSwgcmVvcmRlckZpZWxkcyhbXCIxXCIsIFwiMlwiLCBcIjNcIl0pKTtcbiAgICBjb25zdCBjaGFuZ2VkMiA9IHVwZGF0ZShjaGFuZ2VkMSwgcmVvcmRlckZpZWxkcyhbXCIzXCIsIFwiMVwiLCBcIjJcIl0pKTtcbiAgICBjb25zdCBjaGFuZ2VkMyA9IHVwZGF0ZShjaGFuZ2VkMiwgcmVvcmRlckZpZWxkcyhbXCIzXCIsIFwiMlwiLCBcIjFcIl0pKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoXCIzXCIpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZVsxXS5pZCkudG9FcXVhbChcIjJcIik7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzJdLmlkKS50b0VxdWFsKFwiMVwiKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgY3JlYXRlVHlwZSA9IG5hbWUgPT4gKHtcbiAgaW5pdGlhbFN0YXRlOiBfID0+IF8sXG4gIFJlbmRlckVkaXRvcjogXyA9PiBfLFxuICBpbmZvOiB7IHR5cGU6IG5hbWUsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogbmFtZSB9LFxufSk7XG5cbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW2NyZWF0ZVR5cGUoXCJmaWN0aXRpb3VzLWluc3RhbmNlXCIpXSxcbiAgZmllbGRzU3RhdGU6IFtdLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuY29uc3QgY3VzdG9tVHlwZXMgPSBbXG4gIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgY3JlYXRlVHlwZShcImN1c3RvbS0yXCIpLFxuICBjcmVhdGVUeXBlKFwiY3VzdG9tLTNcIiksXG5dO1xuXG5jb25zdCBpbXBvcnRDdXN0b21Db21wb25lbnRzQWN0aW9uID0gaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyhjdXN0b21UeXBlcyk7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHNBY3Rpb24pO1xuXG5cbmRlc2NyaWJlKFwiVXBkYXRlLmltcG9ydEN1c3RvbUNvbXBvbmVudHNcIiwgKCkgPT4ge1xuICBpdChcIkFwcGVuZHMgdGhlIG5ldyB2YWxpZCBjdXN0b20gdHlwZXMgdG8gdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgdHlwZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGggKyBjdXN0b21UeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzFdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1swXS5pbmZvLnR5cGUpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzJdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1sxXS5pbmZvLnR5cGUpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzNdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1syXS5pbmZvLnR5cGUpO1xuICB9KTtcblxuICBpdChcIlJldHVybnMgYW4gdW5jaGFuZ2VkIGFycmF5IGlmIGN1c3RvbVR5cGVzIGlzIGludmFsaWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKG51bGwpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDEgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBjcmVhdGVUeXBlKFwiY3VzdG9tLTFcIiksIHsgaW5mbzogbnVsbCB9KSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQxKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQyID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBpbmZvOiB7IHR5cGU6IG51bGwsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogXCJjdXN0b21cIiB9IH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDIpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDMgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IGluZm86IHsgdHlwZTogXCJjdXN0b21cIiwgZ3JvdXA6IG51bGwsIGRpc3BsYXlOYW1lOiBcImN1c3RvbVwiIH0gfVxuICAgICAgKSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQzKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQ0ID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBpbmZvOiB7IHR5cGU6IFwiY3VzdG9tXCIsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogbnVsbCB9IH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDQpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDUgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IFJlbmRlckVkaXRvcjogXCJub3QgYSBmdW5jdGlvblwiIH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDUpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDYgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IGluaXRpYWxTdGF0ZTogXCJub3QgYSBmdW5jdGlvblwiIH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDYpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICB9KTtcbn0pO1xuIl0sIm5hbWVzIjpbInVuZG8iLCJpbXBvcnRDdXN0b21Db21wb25lbnRzIiwiaW1wb3J0U3RhdGUiLCJjcmVhdGVGaWVsZCIsImZpZWxkQ3JlYXRlZCIsInRvZ2dsZUNvbmZpZyIsInRvZ2dsZVJlcXVpcmVkIiwiZGVsZXRlRmllbGQiLCJ1cGRhdGVGaWVsZCIsInJlb3JkZXJGaWVsZHMiLCJkZXNjcmliZSIsImFjdGlvbiIsInR5cGUiLCJ0b0VxdWFsIiwibW9ja1N0YXRlVG9JbXBvcnQiLCJuZXdGaWVsZHNTdGF0ZSIsImZpZWxkVHlwZSIsImNyZWF0ZWRGaWVsZFN0YXRlIiwiZmllbGRTdGF0ZSIsIm5ld0ZpZWxkU3RhdGUiLCJuZXdGaWVsZHNPcmRlciIsImN1c3RvbUNvbXBvbmVudHMiLCJkZWZpbmUiLCJhc3luY0Rpc3BhdGNoTWlkZGxld2FyZSIsInN5bmNBY3Rpdml0eUZpbmlzaGVkIiwiYWN0aW9uUXVldWUiLCJmbHVzaFF1ZXVlIiwiZm9yRWFjaCIsInN0b3JlIiwiZGlzcGF0Y2giLCJhIiwiYXN5bmNEaXNwYXRjaCIsImFzeW5jQWN0aW9uIiwiY29uY2F0IiwiYWN0aW9uV2l0aEFzeW5jRGlzcGF0Y2giLCJJbW11dGFibGUiLCJtZXJnZSIsImZha2VBY3Rpb24iLCJkb25lIiwibmV4dCIsInJldHVybmVkQWN0aW9uIiwibm90IiwidW5kZWZpbmVkIiwiZmFrZUFzeW5jQWN0aW9uIiwiZmFrZVN0b3JlIiwiRWl0aGVyIiwicmVxdWlyZSQkMCIsInVwZGF0ZUF0IiwiX2RlZmF1bHQiLCJrZXlBcnJheSIsIm5ld1ZhbCIsIm9iaiIsImRlZXBOZXdWYWwiLCJyZWR1Y2VSaWdodCIsInJlc3VsdCIsImtleSIsImRlZXAiLCJTdGF0ZUxlbnNlcyIsIl9kZWZhdWx0MiIsIl9kZWZhdWx0MyIsImNyZWF0ZUlkIiwiRGF0ZSIsIm5vdyIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInB1c2hIaXN0b3J5U3RhdGUiLCJzdGF0ZSIsIm5ld0hpc3RvcnlTdGF0ZSIsIl9kZWZhdWx0NCIsImZpZWxkc1N0YXRlSGlzdG9yeSIsIl9kZWZhdWx0NiIsImZpZWxkc1N0YXRlIiwiaGlkZUNvbmZpZ3MiLCJfZGVmYXVsdDciLCJtYXAiLCJPYmplY3QiLCJhc3NpZ24iLCJzIiwiY29uZmlnU2hvd2luZyIsInByb3BlcnR5VHlwZUNoZWNrIiwicHJvcGVydHlOYW1lIiwiYmFiZWxIZWxwZXJzLnR5cGVvZiIsIlJpZ2h0IiwiTGVmdCIsInZhbGlkYXRlRmllbGQiLCJmcm9tTnVsbGFibGUiLCJsZWZ0TWFwIiwiZnMiLCJjaGFpbiIsImxhc3RIaXN0b3J5U3RhdGUiLCJfIiwiSW5maW5pdHkiLCJpc0FycmF5IiwiQXJyYXkiLCJhcnIiLCJmaWVsZFR5cGVJc1ZhbGlkIiwidmFsaWRUeXBlcyIsImZpZWxkIiwiZmluZCIsInZhbGlkRmllbGRUeXBlcyIsIm9mIiwidmFsaWRhdGVGaWVsZHNTdGF0ZSIsImZpZWxkVHlwZXMiLCJhZGRSZXF1aXJlZFByb3BlcnRpZXMiLCJmaWVsZFN0YXRlcyIsImlkIiwiYmltYXAiLCJjb25zb2xlIiwiZXJyb3IiLCJnZXRPckVsc2UiLCJUYXNrIiwidHlwZUNvbnN0cnVjdG9yIiwidiIsImluZm8iLCJyZWplY3QiLCJyZXNvbHZlIiwiY2FsbGVkIiwiY29uc3RyIiwiaW5pdGlhbFN0YXRlIiwiUHJvbWlzZSIsInRoZW4iLCJjYXRjaCIsImluc2VydFJlcXVpcmVkUHJvcHMiLCJjcmVhdGVGaWVsZEFzeW5jaHJvbm91c2x5IiwicmVqZWN0ZWQiLCJmb3JrIiwiZXJyIiwiTWF5YmUiLCJjbG9uZSIsInVuaW1wbGVtZW50ZWQiLCJub29wIiwiaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkIiwibmV3RmllbGQiLCJfZGVmYXVsdDUiLCJzZXQiLCJyZXBsYWNlRmllbGRTdGF0ZSIsImFGaWVsZCIsInJlcXVpcmVkIiwiaGlzdG9yeVN0YXRlV2l0aG91dEZpZWxkIiwidXBkYXRlRmllbGRTdGF0ZSIsImhpc3RvcnlTdGF0ZVdpdGhOZXdPcmRlciIsIm5ld09yZGVyIiwiZjEiLCJmMiIsImluZGV4T2YiLCJvIiwibGVuZ3RoIiwic3RhdGVJZHMiLCJub01pc3NpbmdJZCIsInJlZHVjZSIsImFjYyIsImZJZCIsImluY2x1ZGVzIiwiaGFzUmVxdWlyZWRJbmZvIiwiY29tcG9uZW50IiwiYyIsImlzQ29tcG9uZW50VmFsaWQiLCJ2YWxpZGF0ZUNvbXBvbmVudHMiLCJhZGRUb0ZpZWxkVHlwZXMiLCJhY3Rpb25IYW5kbGVycyIsImlzRXhwZWN0ZWRBY3Rpb24iLCJpc1JlZHV4QWN0aW9uIiwidXBkYXRlIiwiYXNzZXJ0IiwiY3VycmVudEZpZWxkc1N0YXRlIiwib2xkRmllbGRzU3RhdGUiLCJtb2NrU3RhdGUiLCJlbXB0eU1vY2tTdGF0ZSIsImVtcHR5SGlzdG9yeU1vY2tTdGF0ZSIsIm1vZGlmaWVkU3RhdGUiLCJ1bmRvQWN0aW9uIiwidHlwZXNBcnJheSIsIm1vY2tDdXJyZW50U3RhdGUiLCJtb2NrSGlzdG9yeSIsIm5ld1ZhbGlkU3RhdGUiLCJuZXdJbnZhbGlkU3RhdGUiLCJ1cGRhdGVkIiwiZGlzcGxheU5hbWUiLCJncm91cCIsInZhbGlkU3RhdGUyIiwiaWR4IiwicHJvbWlzZVR5cGVJbnN0YW5jZSIsInByb21pc2VUeXBlIiwic3luY1R5cGVJbnN0YW5jZSIsInN5bmNUeXBlIiwiYXN5bmNBY2lvbiIsImphc21pbmUiLCJjcmVhdGVTcHkiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiZmllbGRDcmVhdGVkQWN0aW9uIiwibmV3U3RhdGUiLCJzYW1lU3RhdGUiLCJjaGFuZ2VkMSIsImNoYW5nZWQyIiwiY2hhbmdlZDMiLCJmaWVsZFN0YXRlQ29uZmlnU2hvd2luZyIsImZpZWxkU3RhdGVDb25maWdOb3RTaG93aW5nIiwiZiIsImZpZWxkU3RhdGVJc1JlcXVpcmVkIiwiZmllbGRTdGF0ZUlzTm90UmVxdWlyZWQiLCJ0b0JlRGVsZXRlZEZpZWxkU3RhdGUiLCJmaWVsZERlbGV0ZUFjdGlvbiIsInJlY2VudEhpc3RvcnlTdGF0ZSIsIm1vY2tGaWVsZDEiLCJtb2NrRmllbGQyIiwibW9ja0ZpZWxkMyIsIm1vY2tTdGF0ZTIiLCJvbGRGaWVsZFN0YXRlIiwiY29sb3IiLCJmaWVsZFVwZGF0ZUFjdGlvbiIsImlzU2FtZSIsInN0YXRlMSIsInN0YXRlMiIsInNhbWVTdGF0ZTEiLCJzYW1lU3RhdGUyIiwic2FtZVN0YXRlMyIsInNhbWVTdGF0ZTQiLCJ0ZW1wbGF0ZUZpZWxkIiwiZmllbGQxIiwiZmllbGQyIiwiZmllbGQzIiwicmVvcmRlckZpZWxkc0FjdGlvbiIsImNyZWF0ZVR5cGUiLCJuYW1lIiwiY3VzdG9tVHlwZXMiLCJpbXBvcnRDdXN0b21Db21wb25lbnRzQWN0aW9uIiwiaW52YWxpZDEiLCJpbnZhbGlkMiIsImludmFsaWQzIiwiaW52YWxpZDQiLCJpbnZhbGlkNSIsIlJlbmRlckVkaXRvciIsImludmFsaWQ2Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUlBLEFBQU8sSUFBTUEsT0FBTyxTQUFQQSxJQUFPO1NBQ25CO1VBQ087R0FGWTtDQUFiOztBQUtQLEFBQU8sSUFBTUMseUJBQXlCLFNBQXpCQSxzQkFBeUI7U0FDckM7VUFDTyx3QkFEUDs7R0FEcUM7Q0FBL0I7O0FBT1AsQUFBTyxJQUFNQyxjQUFjLFNBQWRBLFdBQWM7U0FDMUI7VUFDTyxhQURQOztHQUQwQjtDQUFwQjs7QUFNUCxBQUFPLElBQU1DLGNBQWMsU0FBZEEsV0FBYztTQUMxQjtVQUNPLGFBRFA7O0dBRDBCO0NBQXBCOztBQU1QLEFBQU8sSUFBTUMsZUFBZSxTQUFmQSxZQUFlO1NBQzNCO1VBQ08sY0FEUDs7R0FEMkI7Q0FBckI7O0FBTVAsQUFBTyxJQUFNQyxlQUFlLFNBQWZBLFlBQWU7U0FDM0I7VUFDTyxjQURQOztHQUQyQjtDQUFyQjs7QUFNUCxBQUFPLElBQU1DLGlCQUFpQixTQUFqQkEsY0FBaUI7U0FDN0I7VUFDTyxnQkFEUDs7R0FENkI7Q0FBdkI7O0FBTVAsQUFBTyxJQUFNQyxjQUFjLFNBQWRBLFdBQWM7U0FDMUI7VUFDTyxhQURQOztHQUQwQjtDQUFwQjs7QUFNUCxBQUFPLElBQU1DLGNBQWMsU0FBZEEsV0FBYztTQUMxQjtVQUNPLGFBRFA7O0dBRDBCO0NBQXBCOztBQU1QLEFBQU8sSUFBTUMsZ0JBQWdCLFNBQWhCQSxhQUFnQjtTQUM1QjtVQUNPLGVBRFA7O0dBRDRCO0NBQXRCOztBQzFEUDs7QUFFQSxBQWFBQyxTQUFTLFFBQVQsRUFBbUIsWUFBTTtXQUNkLE1BQVQsRUFBaUIsWUFBTTtPQUNsQixpQ0FBSCxFQUFzQyxZQUFNO1VBQ3BDQyxTQUFTWCxNQUFmO2FBQ09XLE9BQU9DLElBQWQsRUFBb0JDLE9BQXBCLENBQTRCLE1BQTVCO0tBRkY7R0FERjs7V0FPUyxhQUFULEVBQXdCLFlBQU07UUFDdEJDLG9CQUFvQixDQUFDLEdBQUQsRUFBTSxHQUFOLENBQTFCOztPQUVHLGlDQUFILEVBQXNDLFlBQU07VUFDcENILFNBQVNULFlBQVlZLGlCQUFaLENBQWY7YUFDT0gsT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsYUFBNUI7S0FGRjs7T0FLRywrQkFBSCxFQUFvQyxZQUFNO1VBQ2xDRixTQUFTVCxZQUFZWSxpQkFBWixDQUFmO2FBQ09ILE9BQU9JLGNBQWQsRUFBOEJGLE9BQTlCLENBQXNDQyxpQkFBdEM7S0FGRjtHQVJGOztXQWNTLGFBQVQsRUFBd0IsWUFBTTtRQUN0QkUsWUFBWSxXQUFsQjs7T0FFRyxpQ0FBSCxFQUFzQyxZQUFNO1VBQ3BDTCxTQUFTUixZQUFZYSxTQUFaLENBQWY7YUFDT0wsT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsYUFBNUI7S0FGRjs7T0FLRywrQkFBSCxFQUFvQyxZQUFNO1VBQ2xDRixTQUFTUixZQUFZYSxTQUFaLENBQWY7YUFDT0wsT0FBT0ssU0FBZCxFQUF5QkgsT0FBekIsQ0FBaUNHLFNBQWpDO0tBRkY7R0FSRjs7V0FjUyxjQUFULEVBQXlCLFlBQU07UUFDdkJDLG9CQUFvQixFQUExQjs7T0FFRyxpQ0FBSCxFQUFzQyxZQUFNO1VBQ3BDTixTQUFTUCxhQUFhYSxpQkFBYixDQUFmO2FBQ09OLE9BQU9DLElBQWQsRUFBb0JDLE9BQXBCLENBQTRCLGNBQTVCO0tBRkY7O09BS0csK0JBQUgsRUFBb0MsWUFBTTtVQUNsQ0YsU0FBU1AsYUFBYWEsaUJBQWIsQ0FBZjthQUNPTixPQUFPTSxpQkFBZCxFQUFpQ0osT0FBakMsQ0FBeUNJLGlCQUF6QztLQUZGO0dBUkY7O1dBY1MsY0FBVCxFQUF5QixZQUFNO1FBQ3ZCQyxhQUFhLEVBQW5COztPQUVHLGlDQUFILEVBQXNDLFlBQU07VUFDcENQLFNBQVNOLGFBQWFhLFVBQWIsQ0FBZjthQUNPUCxPQUFPQyxJQUFkLEVBQW9CQyxPQUFwQixDQUE0QixjQUE1QjtLQUZGOztPQUtHLCtCQUFILEVBQW9DLFlBQU07VUFDbENGLFNBQVNOLGFBQWFhLFVBQWIsQ0FBZjthQUNPUCxPQUFPTyxVQUFkLEVBQTBCTCxPQUExQixDQUFrQ0ssVUFBbEM7S0FGRjtHQVJGOztXQWNTLGdCQUFULEVBQTJCLFlBQU07UUFDekJBLGFBQWEsRUFBbkI7O09BRUcsaUNBQUgsRUFBc0MsWUFBTTtVQUNwQ1AsU0FBU0wsZUFBZVksVUFBZixDQUFmO2FBQ09QLE9BQU9DLElBQWQsRUFBb0JDLE9BQXBCLENBQTRCLGdCQUE1QjtLQUZGOztPQUtHLCtCQUFILEVBQW9DLFlBQU07VUFDbENGLFNBQVNMLGVBQWVZLFVBQWYsQ0FBZjthQUNPUCxPQUFPTyxVQUFkLEVBQTBCTCxPQUExQixDQUFrQ0ssVUFBbEM7S0FGRjtHQVJGOztXQWNTLGFBQVQsRUFBd0IsWUFBTTtRQUN0QkEsYUFBYSxFQUFuQjs7T0FFRyxpQ0FBSCxFQUFzQyxZQUFNO1VBQ3BDUCxTQUFTSixZQUFZVyxVQUFaLENBQWY7YUFDT1AsT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsYUFBNUI7S0FGRjs7T0FLRywrQkFBSCxFQUFvQyxZQUFNO1VBQ2xDRixTQUFTSixZQUFZVyxVQUFaLENBQWY7YUFDT1AsT0FBT08sVUFBZCxFQUEwQkwsT0FBMUIsQ0FBa0NLLFVBQWxDO0tBRkY7R0FSRjs7V0FjUyxhQUFULEVBQXdCLFlBQU07UUFDdEJDLGdCQUFnQixFQUF0Qjs7T0FFRyxpQ0FBSCxFQUFzQyxZQUFNO1VBQ3BDUixTQUFTSCxZQUFZVyxhQUFaLENBQWY7YUFDT1IsT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsYUFBNUI7S0FGRjs7T0FLRywrQkFBSCxFQUFvQyxZQUFNO1VBQ2xDRixTQUFTSCxZQUFZVyxhQUFaLENBQWY7YUFDT1IsT0FBT1EsYUFBZCxFQUE2Qk4sT0FBN0IsQ0FBcUNNLGFBQXJDO0tBRkY7R0FSRjs7V0FjUyxlQUFULEVBQTBCLFlBQU07UUFDeEJDLGlCQUFpQixFQUF2Qjs7T0FFRyxpQ0FBSCxFQUFzQyxZQUFNO1VBQ3BDVCxTQUFTRixjQUFjVyxjQUFkLENBQWY7YUFDT1QsT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsZUFBNUI7S0FGRjs7T0FLRywrQkFBSCxFQUFvQyxZQUFNO1VBQ2xDRixTQUFTRixjQUFjVyxjQUFkLENBQWY7YUFDT1QsT0FBT1MsY0FBZCxFQUE4QlAsT0FBOUIsQ0FBc0NPLGNBQXRDO0tBRkY7R0FSRjs7V0FjUyx3QkFBVCxFQUFtQyxZQUFNO1FBQ2pDQyxtQkFBbUIsRUFBekI7O09BRUcsaUNBQUgsRUFBc0MsWUFBTTtVQUNwQ1YsU0FBU1YsdUJBQXVCb0IsZ0JBQXZCLENBQWY7YUFDT1YsT0FBT0MsSUFBZCxFQUFvQkMsT0FBcEIsQ0FBNEIsd0JBQTVCO0tBRkY7O09BS0csK0JBQUgsRUFBb0MsWUFBTTtVQUNsQ0YsU0FBU1YsdUJBQXVCb0IsZ0JBQXZCLENBQWY7YUFDT1YsT0FBT1UsZ0JBQWQsRUFBZ0NSLE9BQWhDLENBQXdDUSxnQkFBeEM7S0FGRjtHQVJGO0NBeEhGOzs7Ozs7O0FDZkEsQ0FBQyxXQUFXO0VBQ1YsWUFBWSxDQUFDOztBQUVmLFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRTs7O0VBRzdCLElBQUksa0JBQWtCLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztFQUNuRyxJQUFJLDJCQUEyQixHQUFHLE1BQU0sQ0FBQzs7RUFFekMsSUFBSSxZQUFZLEdBQUc7SUFDakIsVUFBVSxFQUFFLEtBQUs7R0FDbEIsQ0FBQztFQUNGLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO01BQ2xCLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7VUFDakMsWUFBWSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO09BQ3hEO0dBQ0o7O0VBRUQsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFO0lBQ3RCO01BQ0UsT0FBTyxJQUFJLEtBQUssUUFBUTtNQUN4QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO01BQ3BCLElBQUksS0FBSyxJQUFJO01BQ2I7R0FDSDs7RUFFRCxTQUFTLHNCQUFzQixDQUFDLEdBQUcsRUFBRTtNQUNqQyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQzNDLElBQUksQ0FBQyxTQUFTLEVBQUU7VUFDWixPQUFPLEVBQUUsQ0FBQztPQUNiLE1BQU07VUFDSCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7T0FDbkM7R0FDSjs7RUFFRCxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtJQUNoRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUU7TUFDeEMsVUFBVSxFQUFFLEtBQUs7TUFDakIsWUFBWSxFQUFFLEtBQUs7TUFDbkIsUUFBUSxFQUFFLEtBQUs7TUFDZixLQUFLLEVBQUUsS0FBSztLQUNiLENBQUMsQ0FBQztHQUNKOztFQUVELFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUU7SUFDdkMsYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVztNQUMzQyxNQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxVQUFVO1FBQzFDLDJEQUEyRCxDQUFDLENBQUM7S0FDaEUsQ0FBQyxDQUFDO0dBQ0o7O0VBRUQsSUFBSSxlQUFlLEdBQUcsNkJBQTZCLENBQUM7O0VBRXBELFNBQVMsa0JBQWtCLENBQUMsTUFBTSxFQUFFO0lBQ2xDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0dBQzlDOztFQUVELFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRTtJQUMzQixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtNQUM5QixPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTztRQUMvQixNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQztPQUN6RCxDQUFDO0tBQ0gsTUFBTTs7O01BR0wsT0FBTyxJQUFJLENBQUM7S0FDYjtHQUNGOztFQUVELFNBQVMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7O0lBRXJCLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtHQUMxQzs7RUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtJQUNoQyxPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxZQUFZLElBQUksQ0FBQyxDQUFDO0dBQy9HOztFQUVELElBQUkscUJBQXFCLEdBQUc7SUFDMUIsZ0JBQWdCO0dBQ2pCLENBQUM7O0VBRUYsSUFBSSx3QkFBd0IsR0FBRztJQUM3QixNQUFNO0dBQ1AsQ0FBQzs7RUFFRixJQUFJLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztJQUN0RCxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTO0dBQy9ELENBQUMsQ0FBQzs7RUFFSCxJQUFJLHVCQUF1QixHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQztJQUM1RCxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWE7R0FDNUQsQ0FBQyxDQUFDOztFQUVILElBQUksbUJBQW1CLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDO0lBQ3JELFNBQVMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWTtJQUMvRixTQUFTLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxlQUFlO0lBQy9GLGFBQWEsRUFBRSxlQUFlLEVBQUUsU0FBUztHQUMxQyxDQUFDLENBQUM7O0VBRUgsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFO0lBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO0lBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQztHQUNsQztFQUNELGNBQWMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztFQUN2QyxjQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O0VBRTdDLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUU7O0lBRXpDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUV4QixBQUEyQzs7TUFFekMsS0FBSyxJQUFJLEtBQUssSUFBSSxhQUFhLEVBQUU7UUFDL0IsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ3ZDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDeEM7T0FDRjs7O01BR0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNwQjs7SUFFRCxPQUFPLEdBQUcsQ0FBQztHQUNaOztFQUVELFNBQVMseUJBQXlCLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRTtJQUNsRCxJQUFJLGFBQWEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7O0lBRXBDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVc7TUFDeEMsT0FBTyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztLQUN2RCxDQUFDLENBQUM7R0FDSjs7RUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtJQUNwQyxJQUFJLElBQUksWUFBWSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQzs7SUFFMUMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO01BQ2YsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUN6RixLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztPQUMxRTtNQUNELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtRQUM3QixPQUFPLElBQUksQ0FBQztPQUNiO0tBQ0Y7O0lBRUQsSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7R0FDcEM7O0VBRUQsSUFBSSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7O0VBRXhDLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQ3RDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFbEIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNwQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDakQsTUFBTTtNQUNMLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDeEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO01BQzFCLElBQUksUUFBUSxDQUFDOztNQUViLElBQUksT0FBTyxRQUFRLENBQUMsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTs7UUFFdEQsUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztPQUNuRCxNQUFNO1FBQ0wsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUV2QixJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1VBQ3pDLFFBQVEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5RCxNQUFNO1VBQ0wsUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2hFO09BQ0Y7O01BRUQsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDekMsT0FBTyxJQUFJLENBQUM7T0FDYjs7TUFFRCxJQUFJLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO01BQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7TUFDekIsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNwQztHQUNGOztFQUVELFNBQVMsa0JBQWtCLENBQUMsS0FBSyxFQUFFOzs7SUFHakMsS0FBSyxJQUFJLEtBQUssSUFBSSx1QkFBdUIsRUFBRTtNQUN6QyxJQUFJLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNqRCxJQUFJLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7T0FDOUM7S0FDRjs7SUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRTtNQUM1QixhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQztNQUMxQyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztNQUMzQyxhQUFhLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztNQUNsRCxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztNQUN0QyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztNQUMxQyxhQUFhLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztNQUN2QyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztNQUMzQyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztLQUN0Qzs7SUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3JELEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEM7O0lBRUQsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7R0FDbkQ7O0VBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7SUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUU7TUFDNUIsYUFBYSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7S0FDakQ7O0lBRUQsT0FBTyxhQUFhLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7R0FDakQ7O0VBRUQsU0FBUyxhQUFhLEdBQUc7SUFDdkIsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztHQUNqQzs7Ozs7Ozs7O0VBU0QsU0FBUyxPQUFPLENBQUMsUUFBUSxFQUFFOztJQUV6QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzFCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7O0lBRUQsSUFBSSxNQUFNLEdBQUcsRUFBRTtRQUNYLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTTtRQUNwQixLQUFLLENBQUM7O0lBRVYsS0FBSyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7TUFDdkMsSUFBSSxjQUFjLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7O01BRXhELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTs7UUFFakMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO09BQzNDLE1BQU07O1FBRUwsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztPQUM3QjtLQUNGOztJQUVELE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7R0FDbkM7Ozs7Ozs7RUFPRCxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUU7O0lBRXZCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzNELE9BQU8sSUFBSSxDQUFDO0tBQ2I7O0lBRUQsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUU7O01BRWhDLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUMzQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7O01BSTFELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1FBQy9DLEdBQUcsT0FBTyxFQUFFLENBQUMsS0FBSyxRQUFRLEVBQUU7VUFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUMxQjtPQUNGLENBQUMsQ0FBQzs7TUFFSCxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFO1FBQzFCLE9BQU8saUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO09BQzlDLENBQUM7S0FDSDs7SUFFRCxJQUFJLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7SUFFMUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7TUFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ2hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7T0FDekI7S0FDRjs7SUFFRCxPQUFPLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0dBQ3BDOztFQUVELFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRTtJQUM1QixJQUFJLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQzs7SUFFM0IsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtNQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ3JDO0tBQ0YsTUFBTTtNQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDdEI7S0FDRjs7SUFFRCxPQUFPLE1BQU0sQ0FBQztHQUNmOzs7Ozs7Ozs7RUFTRCxTQUFTLFFBQVEsQ0FBQyxRQUFRLEVBQUU7OztJQUcxQixJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRTtNQUNsQyxRQUFRLEdBQUcsU0FBUyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7S0FDOUM7O0lBRUQsSUFBSSxNQUFNLEdBQUcsRUFBRTtRQUNYLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTTtRQUNwQixLQUFLLENBQUM7O0lBRVYsS0FBSyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7TUFDdkMsSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO1VBQzFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1VBQ2YsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7TUFFcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztLQUNyQjs7SUFFRCxPQUFPLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0dBQ3BDOztFQUVELFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRTtJQUMxQjtNQUNFLENBQUMsQ0FBQyxHQUFHO09BQ0osT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDO09BQ3hCLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztPQUN2RCxHQUFHLFlBQVksSUFBSSxDQUFDO01BQ3JCLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRTtJQUNqQixPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7R0FDL0M7O0VBRUQsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtJQUM1QixLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtNQUNuQixJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUN0QjtLQUNGOztJQUVELE9BQU8sSUFBSSxDQUFDO0dBQ2I7Ozs7Ozs7Ozs7O0VBV0QsU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTs7SUFFNUIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUMxQixPQUFPLElBQUksQ0FBQztLQUNiOztJQUVELElBQUksS0FBSyxLQUFLLElBQUksS0FBSyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsRUFBRTtNQUNqRCxNQUFNLElBQUksU0FBUyxDQUFDLGtFQUFrRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNqSDs7SUFFRCxJQUFJLGFBQWEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksWUFBWSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUk7UUFDckMsSUFBSSxZQUFZLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU87UUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTTtRQUN2QyxNQUFNLENBQUM7Ozs7O0lBS1gsU0FBUyxXQUFXLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7TUFDOUMsSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQzlDLElBQUksWUFBWSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztNQUM3RSxJQUFJLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7O01BRW5DLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUztTQUN0QixZQUFZLEtBQUssU0FBUyxDQUFDO1NBQzNCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUU7O1FBRXhDLElBQUksUUFBUSxDQUFDOztRQUViLElBQUksWUFBWSxFQUFFO1VBQ2hCLFFBQVEsR0FBRyxZQUFZLENBQUM7U0FDekIsTUFBTSxJQUFJLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsRUFBRTtVQUNyRixRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2xFLE1BQU07VUFDTCxRQUFRLEdBQUcsY0FBYyxDQUFDO1NBQzNCOztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUN2RSxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7O1lBRXhCLE1BQU0sR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7V0FDcEU7O1VBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQztTQUN4QjtPQUNGO0tBQ0Y7O0lBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFO01BQzlDLEtBQUssSUFBSSxHQUFHLElBQUksVUFBVSxFQUFFO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQ2pDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTs7WUFFeEIsTUFBTSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztXQUNwRTtVQUNELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO09BQ0Y7S0FDRjs7SUFFRCxJQUFJLEdBQUcsQ0FBQzs7O0lBR1IsSUFBSSxDQUFDLGFBQWEsRUFBRTs7TUFFbEIsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFO1FBQ2pCLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtVQUMvQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztTQUMvQjtPQUNGO01BQ0QsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQ3RCLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztPQUMvQjtLQUNGLE1BQU07O01BRUwsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNsRSxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7O1FBRWxDLEtBQUssR0FBRyxJQUFJLGNBQWMsRUFBRTtVQUMxQixJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEMsV0FBVyxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7V0FDeEU7U0FDRjtPQUNGO0tBQ0Y7O0lBRUQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO01BQ3hCLE9BQU8sSUFBSSxDQUFDO0tBQ2IsTUFBTTtNQUNMLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDcEM7R0FDRjs7RUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQ3BDLElBQUksSUFBSSxZQUFZLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDOzs7SUFHMUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUMxQixPQUFPLElBQUksQ0FBQztLQUNiOztJQUVELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7TUFDL0MsTUFBTSxJQUFJLFNBQVMsQ0FBQyxvRUFBb0UsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDbkg7O0lBRUQsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0dBQ3BFOztFQUVELElBQUksb0JBQW9CLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztFQUV6QyxTQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtJQUN4QyxJQUFJLEVBQUUsSUFBSSxZQUFZLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ2pELE1BQU0sSUFBSSxTQUFTLENBQUMsZ0dBQWdHLENBQUMsQ0FBQztLQUN2SDs7SUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNyQixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDbEQ7O0lBRUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7SUFFMUIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sUUFBUSxDQUFDLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7O01BRW5GLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDbkQsTUFBTTtNQUNMLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNoRTs7SUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTtNQUN0RCxPQUFPLElBQUksQ0FBQztLQUNiOztJQUVELElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQ3pCLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7R0FDckM7O0VBRUQsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7SUFDMUMsSUFBSSxJQUFJLFlBQVksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7O0lBRTFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtNQUNqQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO1FBQ25HLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO09BQy9FO01BQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO09BQ2I7S0FDRjs7SUFFRCxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0dBQ3JDOztFQUVELFNBQVMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDakMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2hHOztFQUVELFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7O0lBRTVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUMxRCxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BCOztJQUVELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDO0dBQ3hDOztFQUVELFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7SUFDL0IsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztJQUV2QyxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDOUY7O0VBRUQsU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtJQUNqQyxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sS0FBSyxLQUFLLFNBQVMsR0FBRyxZQUFZLEdBQUcsS0FBSyxDQUFDO0dBQ25EOztFQUVELFNBQVMsZUFBZSxDQUFDLElBQUksRUFBRTtJQUM3QixJQUFJLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUM7O0lBRS9DLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7TUFDcEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ2hCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO09BQ0Y7S0FDRixNQUFNO01BQ0wsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ2hCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO09BQ0Y7S0FDRjs7SUFFRCxPQUFPLE1BQU0sQ0FBQztHQUNmOzs7RUFHRCxTQUFTLHNCQUFzQixHQUFHO0lBQ2hDLE9BQU8sRUFBRSxDQUFDO0dBQ1g7OztFQUdELFNBQVMsbUJBQW1CLENBQUMsR0FBRyxFQUFFO0lBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFO01BQzVCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO01BQ25DLGFBQWEsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO01BQzdDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO01BQ3ZDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO01BQ2pELGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO01BQ3JDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO01BQ3pDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO01BQ3JDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO01BQ3pDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3BDOztJQUVELE9BQU8sYUFBYSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0dBQ2xEOzs7O0VBSUQsU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFO0lBQzNCLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUTtXQUN2QixHQUFHLEtBQUssSUFBSTtZQUNYLEdBQUcsQ0FBQyxRQUFRLEtBQUssMkJBQTJCLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO0dBQzlGOztFQUVELFNBQVMsWUFBWSxDQUFDLEdBQUcsRUFBRTtJQUN6QixPQUFPLE9BQU8sSUFBSSxLQUFLLFdBQVc7V0FDM0IsR0FBRyxZQUFZLElBQUksQ0FBQztHQUM1Qjs7RUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUU7SUFDdEIsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRO1dBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7R0FDdkM7O0VBRUQsU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFO0lBQ3BCLE9BQU8sR0FBRyxZQUFZLEtBQUssQ0FBQztHQUM3Qjs7RUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRTtJQUMvQyxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUNoRixPQUFPLEdBQUcsQ0FBQztLQUNaLE1BQU0sSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDekIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQzdCLE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDeEMsTUFBTSxJQUFJLEdBQUcsWUFBWSxJQUFJLEVBQUU7TUFDOUIsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ25ELE1BQU07O01BRUwsSUFBSSxTQUFTLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUM7TUFDN0MsSUFBSSxzQkFBc0I7UUFDeEIsQ0FBQyxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVM7VUFDM0Msc0JBQXNCLElBQUksV0FBVyxFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUMvRSxJQUFJLEtBQUssR0FBRyxzQkFBc0IsRUFBRSxDQUFDOztNQUVyQyxBQUEyQzs7UUFFekMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO1VBQzFCLGNBQWMsR0FBRyxFQUFFLENBQUM7U0FDckI7UUFDRCxJQUFJLGNBQWMsSUFBSSxDQUFDLEVBQUU7VUFDdkIsTUFBTSxJQUFJLGNBQWMsQ0FBQywwRUFBMEU7WUFDakcsa0ZBQWtGO1lBQ2xGLDBHQUEwRyxDQUFDLENBQUM7U0FDL0c7UUFDRCxjQUFjLElBQUksQ0FBQyxDQUFDO09BQ3JCOztNQUVELEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtVQUM3QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDN0Q7T0FDRjs7TUFFRCxPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ25DO0dBQ0Y7OztFQUdELFNBQVMsUUFBUSxDQUFDLEVBQUUsRUFBRTtJQUNwQixTQUFTLGFBQWEsR0FBRztNQUN2QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztNQUNwQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7TUFDeEIsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM3Qjs7SUFFRCxPQUFPLGFBQWEsQ0FBQztHQUN0Qjs7Ozs7RUFLRCxTQUFTLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDaEQsU0FBUyxhQUFhLEdBQUc7TUFDdkIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7TUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO01BQ3hCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtVQUNyQixPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ3BDLE1BQU07VUFDSCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ3JDO0tBQ0Y7O0lBRUQsT0FBTyxhQUFhLENBQUM7R0FDdEI7Ozs7O0VBS0QsU0FBUywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtJQUM5RCxTQUFTLGFBQWEsR0FBRztNQUN2QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztNQUNwQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7TUFDeEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1VBQ3JCLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDcEMsTUFBTSxJQUFJLElBQUksWUFBWSxJQUFJLEVBQUU7VUFDN0IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztPQUNuQyxNQUFNO1VBQ0gsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztPQUNyQztLQUNGOztJQUVELE9BQU8sYUFBYSxDQUFDO0dBQ3RCOzs7RUFHRCxTQUFTLENBQUMsSUFBSSxhQUFhLFNBQVMsQ0FBQztFQUNyQyxTQUFTLENBQUMsV0FBVyxNQUFNLFdBQVcsQ0FBQztFQUN2QyxTQUFTLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztFQUMxQyxTQUFTLENBQUMsS0FBSyxZQUFZLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztFQUMzQyxTQUFTLENBQUMsT0FBTyxVQUFVLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztFQUNuRCxTQUFTLENBQUMsT0FBTyxVQUFVLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztFQUM3QyxTQUFTLENBQUMsU0FBUyxRQUFRLDJCQUEyQixDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7RUFDdkcsU0FBUyxDQUFDLEdBQUcsY0FBYyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7RUFDdEUsU0FBUyxDQUFDLEtBQUssWUFBWSxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7RUFDMUUsU0FBUyxDQUFDLE1BQU0sV0FBVyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7RUFDNUMsU0FBUyxDQUFDLFFBQVEsU0FBUyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7RUFDOUMsU0FBUyxDQUFDLEtBQUssWUFBWSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7RUFDM0MsU0FBUyxDQUFDLE9BQU8sVUFBVSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7RUFDN0MsU0FBUyxDQUFDLFFBQVEsU0FBUyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7RUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUU7TUFDMUIsU0FBUyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7VUFDN0IsVUFBVSxFQUFFLElBQUk7T0FDbkIsQ0FBQyxDQUFDO0dBQ047O0VBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7RUFFekIsT0FBTyxTQUFTLENBQUM7Q0FDbEI7O0VBRUMsSUFBSSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7O0VBRWhDLElBQUksT0FBT0MsU0FBTSxLQUFLLFVBQVUsSUFBSUEsU0FBTSxDQUFDLEdBQUcsRUFBRTtJQUM5Q0EsU0FBTSxDQUFDLFdBQVc7TUFDaEIsT0FBTyxTQUFTLENBQUM7S0FDbEIsQ0FBQyxDQUFDO0dBQ0osTUFBTSxBQUFnQztJQUNyQyxjQUFjLEdBQUcsU0FBUyxDQUFDO0dBQzVCLEFBTUE7Q0FDRixHQUFHLENBQUM7OztBQy91Qkw7QUFDQSxBQUVBOztBQUVBLElBQU1DLDBCQUEwQixTQUExQkEsdUJBQTBCO1NBQVM7V0FBUSxrQkFBVTtVQUNyREMsdUJBQXVCLEtBQTNCO1VBQ0lDLGNBQWMsRUFBbEI7O2VBRVNDLFVBQVQsR0FBc0I7b0JBQ1JDLE9BQVosQ0FBb0I7aUJBQUtDLE1BQU1DLFFBQU4sQ0FBZUMsQ0FBZixDQUFMO1NBQXBCLEVBRG9CO3NCQUVOLEVBQWQ7OztlQUdPQyxhQUFULENBQXVCQyxXQUF2QixFQUFvQztzQkFDcEJQLFlBQVlRLE1BQVosQ0FBbUIsQ0FBQ0QsV0FBRCxDQUFuQixDQUFkOztZQUVJUixvQkFBSixFQUEwQjs7Ozs7VUFLdEJVLDBCQUNGQyxrQkFBVXhCLE1BQVYsRUFBa0J5QixLQUFsQixDQUF3QixFQUFFTCw0QkFBRixFQUF4QixDQURKOztXQUdLRyx1QkFBTDs2QkFDdUIsSUFBdkI7O0tBckJ1QztHQUFUO0NBQWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0EsQUFFQSxJQUFNRyxhQUFhLEVBQUV6QixNQUFNLGFBQVIsRUFBbkI7O0FBRUFGLFNBQVMsNkJBQVQsRUFBd0MsWUFBTTtLQUN6Qyx3Q0FBSCxFQUE2QyxVQUFDNEIsSUFBRCxFQUFVO1FBQy9DQyxPQUFPLFNBQVBBLElBQU8saUJBQWtCO2FBQ3RCQyxlQUFlVCxhQUF0QixFQUFxQ1UsR0FBckMsQ0FBeUM1QixPQUF6QyxDQUFpRDZCLFNBQWpEO3FCQUNjRixlQUFlVCxhQUE3QixHQUE0Q2xCLE9BQTVDLENBQW9ELFVBQXBEOztLQUZGOzs0QkFNd0IsV0FBeEIsRUFBcUMwQixJQUFyQyxFQUEyQ0YsVUFBM0M7R0FQRjs7S0FXRyx5Q0FBSCxFQUE4QyxVQUFDQyxJQUFELEVBQVU7UUFDaERLLGtCQUFrQixFQUFFL0IsTUFBTSxpQkFBUixFQUF4Qjs7UUFFTWdDLFlBQVk7Z0JBQ04sMEJBQVU7ZUFDWGpDLE9BQU9DLElBQWQsRUFBb0JDLE9BQXBCLENBQTRCOEIsZ0JBQWdCL0IsSUFBNUM7OztLQUZKOztRQU9NMkIsT0FBTyxTQUFQQSxJQUFPO2FBQ1hDLGVBQWVULGFBQWYsQ0FBNkJZLGVBQTdCLENBRFc7S0FBYjs7NEJBR3dCQyxTQUF4QixFQUFtQ0wsSUFBbkMsRUFBeUNGLFVBQXpDO0dBYkY7Q0FaRjs7QUNMQTs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUU7RUFDakQsSUFBSSxDQUFDLFNBQVMsRUFBRTtJQUNkLElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0lBQzlCLElBQUksRUFBRSxHQUFHLGtCQUFrQixDQUFDO0lBQzVCLElBQUksVUFBVSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ25DLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQzs7SUFFeEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxPQUFPLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDOUIsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNqQyxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUNoQzs7Ozs7SUFLRCxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUNyQixvQkFBb0IsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0tBQ3hFOztJQUVELG9CQUFvQixJQUFJLFlBQVksQ0FBQztJQUNyQyxPQUFPLG9CQUFvQixDQUFDO0dBQzdCOztFQUVELE9BQU8sSUFBSSxDQUFDO0NBQ2I7Ozs7Ozs7Ozs7OztBQVlELFNBQVMsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUU7RUFDdkMsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0VBQ3RELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7R0FDeEI7Q0FDRjs7Ozs7Ozs7Ozs7O0FBWUQsTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFO0VBQ25ELElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztFQUN0RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtJQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ3JCO0NBQ0YsQ0FBQzs7QUN0RUY7Ozs7Ozs7Ozs7OztBQVlBLFlBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtFQUN2RCxRQUFRLEdBQUcsSUFBSSxJQUFJO1VBQ1gsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDO1VBQ2YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLGdCQUFnQixFQUFFO0NBQ25FOztBQ2hCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkEsVUFBYyxHQUFHLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO0VBQy9DLFFBQVEsU0FBUyxDQUFDLE1BQU07SUFDdEIsS0FBSyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0M7TUFDRSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7TUFDZCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7TUFDWixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7TUFDeEQsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLEdBQUcsSUFBSSxDQUFDLENBQUM7T0FDVjtNQUNELE9BQU8sSUFBSSxDQUFDO0dBQ2Y7Q0FDRjs7QUMzQkQ7Ozs7Ozs7Ozs7QUFVQSxtQkFBYyxHQUFHLFNBQVMsZUFBZSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUU7RUFDeEQsT0FBTyxXQUFXO0lBQ2hCLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDOUIsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ2hCLE9BQU8sRUFBRSxFQUFFLENBQUM7S0FDYjtJQUNELElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxVQUFVO01BQzVELEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztNQUN6QixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUNoRSxDQUFDO0NBQ0g7O0FDekJELGtCQUFjLEdBQUcsU0FBUyxjQUFjLENBQUMsQ0FBQyxFQUFFO0VBQzFDLE9BQU8sQ0FBQyxJQUFJLElBQUk7U0FDVCxPQUFPLENBQUMsS0FBSyxRQUFRO1NBQ3JCLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLElBQUksQ0FBQztDQUMvQzs7QUNERDs7Ozs7Ozs7QUFRQSxXQUFjLEdBQUcsU0FBUyxPQUFPLENBQUMsRUFBRSxFQUFFO0VBQ3BDLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ3BCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQy9DLE9BQU8sRUFBRSxDQUFDO0tBQ1gsTUFBTTtNQUNMLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDbEM7R0FDRixDQUFDO0NBQ0g7O0FDZkQ7Ozs7Ozs7O0FBUUEsV0FBYyxHQUFHLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtFQUNwQyxPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDdkIsUUFBUSxTQUFTLENBQUMsTUFBTTtNQUN0QixLQUFLLENBQUM7UUFDSixPQUFPLEVBQUUsQ0FBQztNQUNaLEtBQUssQ0FBQztRQUNKLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7ZUFDdEIsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3JEO1FBQ0UsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7ZUFDM0MsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7ZUFDL0QsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7ZUFDL0QsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNuQjtHQUNGLENBQUM7Q0FDSDs7QUN0QkQ7Ozs7Ozs7O0FBUUEsV0FBYyxHQUFHLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtFQUNwQyxPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzFCLFFBQVEsU0FBUyxDQUFDLE1BQU07TUFDdEIsS0FBSyxDQUFDO1FBQ0osT0FBTyxFQUFFLENBQUM7TUFDWixLQUFLLENBQUM7UUFDSixPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO2VBQ3RCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQzdELEtBQUssQ0FBQztRQUNKLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO2VBQzNDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7ZUFDdkUsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztlQUN2RSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3hEO1FBQ0UsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO2VBQ2hFLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2VBQzVGLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2VBQzVGLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENB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LENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdEUsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlFLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEYsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdEYsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFGLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FB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SUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEVBQUU7RUFDbEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUNyQjs7Ozs7Ozs7QUFRREEsUUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsV0FBVztFQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLO0VBQ2xCOzs7Ozs7Ozs7OztBQVdEQSxRQUFNLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxjQUFhOztBQUVyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbkMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUNyQjs7QUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUNyQjs7Ozs7Ozs7QUFRREEsUUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsY0FBYTs7QUFFckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxPQUFPLEVBQUU7RUFDdEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDaEM7O0FBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxPQUFPLEVBQUU7RUFDdkMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDakM7Ozs7Ozs7OztBQVNEQSxRQUFNLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxjQUFhOztBQUVyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXO0VBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0VBQzlCOztBQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVc7RUFDaEMs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"} \ No newline at end of file +{"version":3,"file":"fl-form-builder-tests.js","sources":["src/js/Actions.js","src/tests/actions.js","node_modules/seamless-immutable/src/seamless-immutable.js","src/js/utils/asyncDispatchMiddleware.js","src/tests/utils.asyncDispatchMiddleware.js","node_modules/fl-assert/dist/assert.js","node_modules/ramda/src/internal/_isArray.js","node_modules/ramda/src/internal/_slice.js","node_modules/ramda/src/internal/_checkForMethod.js","node_modules/ramda/src/internal/_isPlaceholder.js","node_modules/ramda/src/internal/_curry1.js","node_modules/ramda/src/internal/_curry2.js","node_modules/ramda/src/internal/_curry3.js","node_modules/ramda/src/slice.js","node_modules/ramda/src/over.js","node_modules/ramda/src/always.js","node_modules/ramda/src/set.js","node_modules/ramda/src/internal/_arity.js","node_modules/ramda/src/internal/_pipe.js","node_modules/ramda/src/internal/_xwrap.js","node_modules/ramda/src/bind.js","node_modules/ramda/src/internal/_isString.js","node_modules/ramda/src/isArrayLike.js","node_modules/ramda/src/internal/_reduce.js","node_modules/ramda/src/reduce.js","node_modules/ramda/src/tail.js","node_modules/ramda/src/pipe.js","node_modules/ramda/src/internal/_concat.js","node_modules/ramda/src/prepend.js","node_modules/ramda/src/prop.js","node_modules/ramda/src/internal/_isTransformer.js","node_modules/ramda/src/internal/_dispatchable.js","node_modules/ramda/src/internal/_map.js","node_modules/ramda/src/internal/_xfBase.js","node_modules/ramda/src/internal/_xmap.js","node_modules/ramda/src/internal/_curryN.js","node_modules/ramda/src/curryN.js","node_modules/ramda/src/internal/_has.js","node_modules/ramda/src/internal/_isArguments.js","node_modules/ramda/src/keys.js","node_modules/ramda/src/map.js","node_modules/ramda/src/lens.js","node_modules/ramda/src/curry.js","node_modules/data.either/lib/either.js","node_modules/data.either/lib/index.js","src/js/Update/utils.js","src/js/Update/undo.js","node_modules/ramda/src/internal/_identity.js","node_modules/ramda/src/identity.js","node_modules/ramda/src/path.js","node_modules/ramda/src/ap.js","node_modules/ramda/src/reduceRight.js","node_modules/ramda/src/sequence.js","node_modules/ramda/src/traverse.js","node_modules/ramda/src/internal/_arrayFromIterator.js","node_modules/ramda/src/internal/_functionName.js","node_modules/ramda/src/identical.js","node_modules/ramda/src/type.js","node_modules/ramda/src/internal/_equals.js","node_modules/ramda/src/equals.js","src/js/Update/importState.js","node_modules/ramda/src/internal/_reduced.js","node_modules/ramda/src/internal/_xfind.js","node_modules/ramda/src/find.js","node_modules/data.task/lib/task.js","node_modules/data.task/lib/index.js","src/js/Update/createField.js","node_modules/ramda/src/append.js","node_modules/data.maybe/lib/maybe.js","node_modules/data.maybe/lib/index.js","src/js/Update/fieldCreated.js","src/js/Update/field.toggleConfig.js","src/js/Update/field.toggleRequired.js","node_modules/ramda/src/internal/_filter.js","node_modules/ramda/src/internal/_isObject.js","node_modules/ramda/src/internal/_xfilter.js","node_modules/ramda/src/filter.js","src/js/Update/field.deleteField.js","src/js/Update/field.updateField.js","node_modules/ramda/src/sort.js","src/js/Update/reorderFields.js","src/js/Update/importCustomComponents.js","src/js/Update/index.js","src/tests/update/undo.js","src/tests/update/importState.js","src/tests/update/createField.js","src/tests/update/fieldCreated.js","src/tests/update/field.toggleConfig.js","src/tests/update/field.toggleRequired.js","src/tests/update/field.deleteField.js","src/tests/update/field.updateField.js","src/tests/update/reorderFields.js","src/tests/update/importCustomComponents.js"],"sourcesContent":["//\n// ACTION CREATORS\n//\n\nexport const undo = _ =>\n({\n type: \"undo\",\n});\n\nexport const importCustomComponents = customComponents =>\n({\n type: \"importCustomComponents\",\n customComponents,\n});\n\n\nexport const importState = newFieldsState =>\n({\n type: \"importState\",\n newFieldsState,\n});\n\nexport const createField = fieldType =>\n({\n type: \"createField\",\n fieldType,\n});\n\nexport const fieldCreated = createdFieldState =>\n({\n type: \"fieldCreated\",\n createdFieldState,\n});\n\nexport const toggleConfig = fieldState =>\n({\n type: \"toggleConfig\",\n fieldState,\n});\n\nexport const toggleRequired = fieldState =>\n({\n type: \"toggleRequired\",\n fieldState,\n});\n\nexport const deleteField = fieldState =>\n({\n type: \"deleteField\",\n fieldState,\n});\n\nexport const updateField = newFieldState =>\n({\n type: \"updateField\",\n newFieldState,\n});\n\nexport const reorderFields = newFieldsOrder =>\n({\n type: \"reorderFields\",\n newFieldsOrder,\n});\n","/* eslint-env jasmine */\n\nimport {\n undo,\n importState,\n createField,\n fieldCreated,\n toggleConfig,\n toggleRequired,\n deleteField,\n updateField,\n reorderFields,\n importCustomComponents,\n} from \"../js/Actions\";\n\ndescribe(\"Action\", () => {\n describe(\"undo\", () => {\n it(\"returns the correct action type\", () => {\n const action = undo();\n expect(action.type).toEqual(\"undo\");\n });\n });\n\n describe(\"importState\", () => {\n const mockStateToImport = [\"a\", \"b\"];\n\n it(\"returns the correct action type\", () => {\n const action = importState(mockStateToImport);\n expect(action.type).toEqual(\"importState\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = importState(mockStateToImport);\n expect(action.newFieldsState).toEqual(mockStateToImport);\n });\n });\n\n describe(\"createField\", () => {\n const fieldType = \"testField\";\n\n it(\"returns the correct action type\", () => {\n const action = createField(fieldType);\n expect(action.type).toEqual(\"createField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = createField(fieldType);\n expect(action.fieldType).toEqual(fieldType);\n });\n });\n\n describe(\"fieldCreated\", () => {\n const createdFieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = fieldCreated(createdFieldState);\n expect(action.type).toEqual(\"fieldCreated\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = fieldCreated(createdFieldState);\n expect(action.createdFieldState).toEqual(createdFieldState);\n });\n });\n\n describe(\"toggleConfig\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = toggleConfig(fieldState);\n expect(action.type).toEqual(\"toggleConfig\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = toggleConfig(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"toggleRequired\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = toggleRequired(fieldState);\n expect(action.type).toEqual(\"toggleRequired\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = toggleRequired(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"deleteField\", () => {\n const fieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = deleteField(fieldState);\n expect(action.type).toEqual(\"deleteField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = deleteField(fieldState);\n expect(action.fieldState).toEqual(fieldState);\n });\n });\n\n describe(\"updateField\", () => {\n const newFieldState = {};\n\n it(\"returns the correct action type\", () => {\n const action = updateField(newFieldState);\n expect(action.type).toEqual(\"updateField\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = updateField(newFieldState);\n expect(action.newFieldState).toEqual(newFieldState);\n });\n });\n\n describe(\"reorderFields\", () => {\n const newFieldsOrder = {};\n\n it(\"returns the correct action type\", () => {\n const action = reorderFields(newFieldsOrder);\n expect(action.type).toEqual(\"reorderFields\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = reorderFields(newFieldsOrder);\n expect(action.newFieldsOrder).toEqual(newFieldsOrder);\n });\n });\n\n describe(\"importCustomComponents\", () => {\n const customComponents = [];\n\n it(\"returns the correct action type\", () => {\n const action = importCustomComponents(customComponents);\n expect(action.type).toEqual(\"importCustomComponents\");\n });\n\n it(\"Creates the correct variables\", () => {\n const action = importCustomComponents(customComponents);\n expect(action.customComponents).toEqual(customComponents);\n });\n });\n});\n","(function() {\n \"use strict\";\n\nfunction immutableInit(config) {\n\n // https://github.com/facebook/react/blob/v15.0.1/src/isomorphic/classic/element/ReactElement.js#L21\n var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element');\n var REACT_ELEMENT_TYPE_FALLBACK = 0xeac7;\n\n var globalConfig = {\n use_static: false\n };\n if (isObject(config)) {\n if (config.use_static !== undefined) {\n globalConfig.use_static = Boolean(config.use_static);\n }\n }\n\n function isObject(data) {\n return (\n typeof data === 'object' &&\n !Array.isArray(data) &&\n data !== null\n );\n }\n\n function instantiateEmptyObject(obj) {\n var prototype = Object.getPrototypeOf(obj);\n if (!prototype) {\n return {};\n } else {\n return Object.create(prototype);\n }\n }\n\n function addPropertyTo(target, methodName, value) {\n Object.defineProperty(target, methodName, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: value\n });\n }\n\n function banProperty(target, methodName) {\n addPropertyTo(target, methodName, function() {\n throw new ImmutableError(\"The \" + methodName +\n \" method cannot be invoked on an Immutable data structure.\");\n });\n }\n\n var immutabilityTag = \"__immutable_invariants_hold\";\n\n function addImmutabilityTag(target) {\n addPropertyTo(target, immutabilityTag, true);\n }\n\n function isImmutable(target) {\n if (typeof target === \"object\") {\n return target === null || Boolean(\n Object.getOwnPropertyDescriptor(target, immutabilityTag)\n );\n } else {\n // In JavaScript, only objects are even potentially mutable.\n // strings, numbers, null, and undefined are all naturally immutable.\n return true;\n }\n }\n\n function isEqual(a, b) {\n // Avoid false positives due to (NaN !== NaN) evaluating to true\n return (a === b || (a !== a && b !== b));\n }\n\n function isMergableObject(target) {\n return target !== null && typeof target === \"object\" && !(Array.isArray(target)) && !(target instanceof Date);\n }\n\n var mutatingObjectMethods = [\n \"setPrototypeOf\"\n ];\n\n var nonMutatingObjectMethods = [\n \"keys\"\n ];\n\n var mutatingArrayMethods = mutatingObjectMethods.concat([\n \"push\", \"pop\", \"sort\", \"splice\", \"shift\", \"unshift\", \"reverse\"\n ]);\n\n var nonMutatingArrayMethods = nonMutatingObjectMethods.concat([\n \"map\", \"filter\", \"slice\", \"concat\", \"reduce\", \"reduceRight\"\n ]);\n\n var mutatingDateMethods = mutatingObjectMethods.concat([\n \"setDate\", \"setFullYear\", \"setHours\", \"setMilliseconds\", \"setMinutes\", \"setMonth\", \"setSeconds\",\n \"setTime\", \"setUTCDate\", \"setUTCFullYear\", \"setUTCHours\", \"setUTCMilliseconds\", \"setUTCMinutes\",\n \"setUTCMonth\", \"setUTCSeconds\", \"setYear\"\n ]);\n\n function ImmutableError(message) {\n this.name = 'MyError';\n this.message = message;\n this.stack = (new Error()).stack;\n }\n ImmutableError.prototype = new Error();\n ImmutableError.prototype.constructor = Error;\n\n function makeImmutable(obj, bannedMethods) {\n // Tag it so we can quickly tell it's immutable later.\n addImmutabilityTag(obj);\n\n if (process.env.NODE_ENV !== \"production\") {\n // Make all mutating methods throw exceptions.\n for (var index in bannedMethods) {\n if (bannedMethods.hasOwnProperty(index)) {\n banProperty(obj, bannedMethods[index]);\n }\n }\n\n // Freeze it and return it.\n Object.freeze(obj);\n }\n\n return obj;\n }\n\n function makeMethodReturnImmutable(obj, methodName) {\n var currentMethod = obj[methodName];\n\n addPropertyTo(obj, methodName, function() {\n return Immutable(currentMethod.apply(obj, arguments));\n });\n }\n\n function arraySet(idx, value, config) {\n var deep = config && config.deep;\n\n if (idx in this) {\n if (deep && this[idx] !== value && isMergableObject(value) && isMergableObject(this[idx])) {\n value = Immutable.merge(this[idx], value, {deep: true, mode: 'replace'});\n }\n if (isEqual(this[idx], value)) {\n return this;\n }\n }\n\n var mutable = asMutableArray.call(this);\n mutable[idx] = Immutable(value);\n return makeImmutableArray(mutable);\n }\n\n var immutableEmptyArray = Immutable([]);\n\n function arraySetIn(pth, value, config) {\n var head = pth[0];\n\n if (pth.length === 1) {\n return arraySet.call(this, head, value, config);\n } else {\n var tail = pth.slice(1);\n var thisHead = this[head];\n var newValue;\n\n if (typeof(thisHead) === \"object\" && thisHead !== null) {\n // Might (validly) be object or array\n newValue = Immutable.setIn(thisHead, tail, value);\n } else {\n var nextHead = tail[0];\n // If the next path part is a number, then we are setting into an array, else an object.\n if (nextHead !== '' && isFinite(nextHead)) {\n newValue = arraySetIn.call(immutableEmptyArray, tail, value);\n } else {\n newValue = objectSetIn.call(immutableEmptyObject, tail, value);\n }\n }\n\n if (head in this && thisHead === newValue) {\n return this;\n }\n\n var mutable = asMutableArray.call(this);\n mutable[head] = newValue;\n return makeImmutableArray(mutable);\n }\n }\n\n function makeImmutableArray(array) {\n // Don't change their implementations, but wrap these functions to make sure\n // they always return an immutable value.\n for (var index in nonMutatingArrayMethods) {\n if (nonMutatingArrayMethods.hasOwnProperty(index)) {\n var methodName = nonMutatingArrayMethods[index];\n makeMethodReturnImmutable(array, methodName);\n }\n }\n\n if (!globalConfig.use_static) {\n addPropertyTo(array, \"flatMap\", flatMap);\n addPropertyTo(array, \"asObject\", asObject);\n addPropertyTo(array, \"asMutable\", asMutableArray);\n addPropertyTo(array, \"set\", arraySet);\n addPropertyTo(array, \"setIn\", arraySetIn);\n addPropertyTo(array, \"update\", update);\n addPropertyTo(array, \"updateIn\", updateIn);\n addPropertyTo(array, \"getIn\", getIn);\n }\n\n for(var i = 0, length = array.length; i < length; i++) {\n array[i] = Immutable(array[i]);\n }\n\n return makeImmutable(array, mutatingArrayMethods);\n }\n\n function makeImmutableDate(date) {\n if (!globalConfig.use_static) {\n addPropertyTo(date, \"asMutable\", asMutableDate);\n }\n\n return makeImmutable(date, mutatingDateMethods);\n }\n\n function asMutableDate() {\n return new Date(this.getTime());\n }\n\n /**\n * Effectively performs a map() over the elements in the array, using the\n * provided iterator, except that whenever the iterator returns an array, that\n * array's elements are added to the final result instead of the array itself.\n *\n * @param {function} iterator - The iterator function that will be invoked on each element in the array. It will receive three arguments: the current value, the current index, and the current object.\n */\n function flatMap(iterator) {\n // Calling .flatMap() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n var result = [],\n length = this.length,\n index;\n\n for (index = 0; index < length; index++) {\n var iteratorResult = iterator(this[index], index, this);\n\n if (Array.isArray(iteratorResult)) {\n // Concatenate Array results into the return value we're building up.\n result.push.apply(result, iteratorResult);\n } else {\n // Handle non-Array results the same way map() does.\n result.push(iteratorResult);\n }\n }\n\n return makeImmutableArray(result);\n }\n\n /**\n * Returns an Immutable copy of the object without the given keys included.\n *\n * @param {array} keysToRemove - A list of strings representing the keys to exclude in the return value. Instead of providing a single array, this method can also be called by passing multiple strings as separate arguments.\n */\n function without(remove) {\n // Calling .without() with no arguments is a no-op. Don't bother cloning.\n if (typeof remove === \"undefined\" && arguments.length === 0) {\n return this;\n }\n\n if (typeof remove !== \"function\") {\n // If we weren't given an array, use the arguments list.\n var keysToRemoveArray = (Array.isArray(remove)) ?\n remove.slice() : Array.prototype.slice.call(arguments);\n\n // Convert numeric keys to strings since that's how they'll\n // come from the enumeration of the object.\n keysToRemoveArray.forEach(function(el, idx, arr) {\n if(typeof(el) === \"number\") {\n arr[idx] = el.toString();\n }\n });\n\n remove = function(val, key) {\n return keysToRemoveArray.indexOf(key) !== -1;\n };\n }\n\n var result = instantiateEmptyObject(this);\n\n for (var key in this) {\n if (this.hasOwnProperty(key) && remove(this[key], key) === false) {\n result[key] = this[key];\n }\n }\n\n return makeImmutableObject(result);\n }\n\n function asMutableArray(opts) {\n var result = [], i, length;\n\n if(opts && opts.deep) {\n for(i = 0, length = this.length; i < length; i++) {\n result.push(asDeepMutable(this[i]));\n }\n } else {\n for(i = 0, length = this.length; i < length; i++) {\n result.push(this[i]);\n }\n }\n\n return result;\n }\n\n /**\n * Effectively performs a [map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) over the elements in the array, expecting that the iterator function\n * will return an array of two elements - the first representing a key, the other\n * a value. Then returns an Immutable Object constructed of those keys and values.\n *\n * @param {function} iterator - A function which should return an array of two elements - the first representing the desired key, the other the desired value.\n */\n function asObject(iterator) {\n // If no iterator was provided, assume the identity function\n // (suggesting this array is already a list of key/value pairs.)\n if (typeof iterator !== \"function\") {\n iterator = function(value) { return value; };\n }\n\n var result = {},\n length = this.length,\n index;\n\n for (index = 0; index < length; index++) {\n var pair = iterator(this[index], index, this),\n key = pair[0],\n value = pair[1];\n\n result[key] = value;\n }\n\n return makeImmutableObject(result);\n }\n\n function asDeepMutable(obj) {\n if (\n (!obj) ||\n (typeof obj !== 'object') ||\n (!Object.getOwnPropertyDescriptor(obj, immutabilityTag)) ||\n (obj instanceof Date)\n ) { return obj; }\n return Immutable.asMutable(obj, {deep: true});\n }\n\n function quickCopy(src, dest) {\n for (var key in src) {\n if (Object.getOwnPropertyDescriptor(src, key)) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n }\n\n /**\n * Returns an Immutable Object containing the properties and values of both\n * this object and the provided object, prioritizing the provided object's\n * values whenever the same key is present in both objects.\n *\n * @param {object} other - The other object to merge. Multiple objects can be passed as an array. In such a case, the later an object appears in that list, the higher its priority.\n * @param {object} config - Optional config object that contains settings. Supported settings are: {deep: true} for deep merge and {merger: mergerFunc} where mergerFunc is a function\n * that takes a property from both objects. If anything is returned it overrides the normal merge behaviour.\n */\n function merge(other, config) {\n // Calling .merge() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n if (other === null || (typeof other !== \"object\")) {\n throw new TypeError(\"Immutable#merge can only be invoked with objects or arrays, not \" + JSON.stringify(other));\n }\n\n var receivedArray = (Array.isArray(other)),\n deep = config && config.deep,\n mode = config && config.mode || 'merge',\n merger = config && config.merger,\n result;\n\n // Use the given key to extract a value from the given object, then place\n // that value in the result object under the same key. If that resulted\n // in a change from this object's value at that key, set anyChanges = true.\n function addToResult(currentObj, otherObj, key) {\n var immutableValue = Immutable(otherObj[key]);\n var mergerResult = merger && merger(currentObj[key], immutableValue, config);\n var currentValue = currentObj[key];\n\n if ((result !== undefined) ||\n (mergerResult !== undefined) ||\n (!currentObj.hasOwnProperty(key)) ||\n !isEqual(immutableValue, currentValue)) {\n\n var newValue;\n\n if (mergerResult) {\n newValue = mergerResult;\n } else if (deep && isMergableObject(currentValue) && isMergableObject(immutableValue)) {\n newValue = Immutable.merge(currentValue, immutableValue, config);\n } else {\n newValue = immutableValue;\n }\n\n if (!isEqual(currentValue, newValue) || !currentObj.hasOwnProperty(key)) {\n if (result === undefined) {\n // Make a shallow clone of the current object.\n result = quickCopy(currentObj, instantiateEmptyObject(currentObj));\n }\n\n result[key] = newValue;\n }\n }\n }\n\n function clearDroppedKeys(currentObj, otherObj) {\n for (var key in currentObj) {\n if (!otherObj.hasOwnProperty(key)) {\n if (result === undefined) {\n // Make a shallow clone of the current object.\n result = quickCopy(currentObj, instantiateEmptyObject(currentObj));\n }\n delete result[key];\n }\n }\n }\n\n var key;\n\n // Achieve prioritization by overriding previous values that get in the way.\n if (!receivedArray) {\n // The most common use case: just merge one object into the existing one.\n for (key in other) {\n if (Object.getOwnPropertyDescriptor(other, key)) {\n addToResult(this, other, key);\n }\n }\n if (mode === 'replace') {\n clearDroppedKeys(this, other);\n }\n } else {\n // We also accept an Array\n for (var index = 0, length = other.length; index < length; index++) {\n var otherFromArray = other[index];\n\n for (key in otherFromArray) {\n if (otherFromArray.hasOwnProperty(key)) {\n addToResult(result !== undefined ? result : this, otherFromArray, key);\n }\n }\n }\n }\n\n if (result === undefined) {\n return this;\n } else {\n return makeImmutableObject(result);\n }\n }\n\n function objectReplace(value, config) {\n var deep = config && config.deep;\n\n // Calling .replace() with no arguments is a no-op. Don't bother cloning.\n if (arguments.length === 0) {\n return this;\n }\n\n if (value === null || typeof value !== \"object\") {\n throw new TypeError(\"Immutable#replace can only be invoked with objects or arrays, not \" + JSON.stringify(value));\n }\n\n return Immutable.merge(this, value, {deep: deep, mode: 'replace'});\n }\n\n var immutableEmptyObject = Immutable({});\n\n function objectSetIn(path, value, config) {\n if (!(path instanceof Array) || path.length === 0) {\n throw new TypeError(\"The first argument to Immutable#setIn must be an array containing at least one \\\"key\\\" string.\");\n }\n\n var head = path[0];\n if (path.length === 1) {\n return objectSet.call(this, head, value, config);\n }\n\n var tail = path.slice(1);\n var newValue;\n var thisHead = this[head];\n\n if (this.hasOwnProperty(head) && typeof(thisHead) === \"object\" && thisHead !== null) {\n // Might (validly) be object or array\n newValue = Immutable.setIn(thisHead, tail, value);\n } else {\n newValue = objectSetIn.call(immutableEmptyObject, tail, value);\n }\n\n if (this.hasOwnProperty(head) && thisHead === newValue) {\n return this;\n }\n\n var mutable = quickCopy(this, instantiateEmptyObject(this));\n mutable[head] = newValue;\n return makeImmutableObject(mutable);\n }\n\n function objectSet(property, value, config) {\n var deep = config && config.deep;\n\n if (this.hasOwnProperty(property)) {\n if (deep && this[property] !== value && isMergableObject(value) && isMergableObject(this[property])) {\n value = Immutable.merge(this[property], value, {deep: true, mode: 'replace'});\n }\n if (isEqual(this[property], value)) {\n return this;\n }\n }\n\n var mutable = quickCopy(this, instantiateEmptyObject(this));\n mutable[property] = Immutable(value);\n return makeImmutableObject(mutable);\n }\n\n function update(property, updater) {\n var restArgs = Array.prototype.slice.call(arguments, 2);\n var initialVal = this[property];\n return Immutable.set(this, property, updater.apply(initialVal, [initialVal].concat(restArgs)));\n }\n\n function getInPath(obj, path) {\n /*jshint eqnull:true */\n for (var i = 0, l = path.length; obj != null && i < l; i++) {\n obj = obj[path[i]];\n }\n\n return (i && i == l) ? obj : undefined;\n }\n\n function updateIn(path, updater) {\n var restArgs = Array.prototype.slice.call(arguments, 2);\n var initialVal = getInPath(this, path);\n\n return Immutable.setIn(this, path, updater.apply(initialVal, [initialVal].concat(restArgs)));\n }\n\n function getIn(path, defaultValue) {\n var value = getInPath(this, path);\n return value === undefined ? defaultValue : value;\n }\n\n function asMutableObject(opts) {\n var result = instantiateEmptyObject(this), key;\n\n if(opts && opts.deep) {\n for (key in this) {\n if (this.hasOwnProperty(key)) {\n result[key] = asDeepMutable(this[key]);\n }\n }\n } else {\n for (key in this) {\n if (this.hasOwnProperty(key)) {\n result[key] = this[key];\n }\n }\n }\n\n return result;\n }\n\n // Creates plain object to be used for cloning\n function instantiatePlainObject() {\n return {};\n }\n\n // Finalizes an object with immutable methods, freezes it, and returns it.\n function makeImmutableObject(obj) {\n if (!globalConfig.use_static) {\n addPropertyTo(obj, \"merge\", merge);\n addPropertyTo(obj, \"replace\", objectReplace);\n addPropertyTo(obj, \"without\", without);\n addPropertyTo(obj, \"asMutable\", asMutableObject);\n addPropertyTo(obj, \"set\", objectSet);\n addPropertyTo(obj, \"setIn\", objectSetIn);\n addPropertyTo(obj, \"update\", update);\n addPropertyTo(obj, \"updateIn\", updateIn);\n addPropertyTo(obj, \"getIn\", getIn);\n }\n\n return makeImmutable(obj, mutatingObjectMethods);\n }\n\n // Returns true if object is a valid react element\n // https://github.com/facebook/react/blob/v15.0.1/src/isomorphic/classic/element/ReactElement.js#L326\n function isReactElement(obj) {\n return typeof obj === 'object' &&\n obj !== null &&\n (obj.$$typeof === REACT_ELEMENT_TYPE_FALLBACK || obj.$$typeof === REACT_ELEMENT_TYPE);\n }\n\n function isFileObject(obj) {\n return typeof File !== 'undefined' &&\n obj instanceof File;\n }\n\n function isPromise(obj) {\n return typeof obj === 'object' &&\n typeof obj.then === 'function';\n }\n\n function isError(obj) {\n return obj instanceof Error;\n }\n\n function Immutable(obj, options, stackRemaining) {\n if (isImmutable(obj) || isReactElement(obj) || isFileObject(obj) || isError(obj)) {\n return obj;\n } else if (isPromise(obj)) {\n return obj.then(Immutable);\n } else if (Array.isArray(obj)) {\n return makeImmutableArray(obj.slice());\n } else if (obj instanceof Date) {\n return makeImmutableDate(new Date(obj.getTime()));\n } else {\n // Don't freeze the object we were given; make a clone and use that.\n var prototype = options && options.prototype;\n var instantiateEmptyObject =\n (!prototype || prototype === Object.prototype) ?\n instantiatePlainObject : (function() { return Object.create(prototype); });\n var clone = instantiateEmptyObject();\n\n if (process.env.NODE_ENV !== \"production\") {\n /*jshint eqnull:true */\n if (stackRemaining == null) {\n stackRemaining = 64;\n }\n if (stackRemaining <= 0) {\n throw new ImmutableError(\"Attempt to construct Immutable from a deeply nested object was detected.\" +\n \" Have you tried to wrap an object with circular references (e.g. React element)?\" +\n \" See https://github.com/rtfeldman/seamless-immutable/wiki/Deeply-nested-object-was-detected for details.\");\n }\n stackRemaining -= 1;\n }\n\n for (var key in obj) {\n if (Object.getOwnPropertyDescriptor(obj, key)) {\n clone[key] = Immutable(obj[key], undefined, stackRemaining);\n }\n }\n\n return makeImmutableObject(clone);\n }\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n function toStatic(fn) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n return fn.apply(self, args);\n }\n\n return staticWrapper;\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n // with the additional condition of choosing which function to call depending\n // if argument is an array or an object.\n function toStaticObjectOrArray(fnObject, fnArray) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n if (Array.isArray(self)) {\n return fnArray.apply(self, args);\n } else {\n return fnObject.apply(self, args);\n }\n }\n\n return staticWrapper;\n }\n\n // Wrapper to allow the use of object methods as static methods of Immutable.\n // with the additional condition of choosing which function to call depending\n // if argument is an array or an object or a date.\n function toStaticObjectOrDateOrArray(fnObject, fnArray, fnDate) {\n function staticWrapper() {\n var args = [].slice.call(arguments);\n var self = args.shift();\n if (Array.isArray(self)) {\n return fnArray.apply(self, args);\n } else if (self instanceof Date) {\n return fnDate.apply(self, args);\n } else {\n return fnObject.apply(self, args);\n }\n }\n\n return staticWrapper;\n }\n\n // Export the library\n Immutable.from = Immutable;\n Immutable.isImmutable = isImmutable;\n Immutable.ImmutableError = ImmutableError;\n Immutable.merge = toStatic(merge);\n Immutable.replace = toStatic(objectReplace);\n Immutable.without = toStatic(without);\n Immutable.asMutable = toStaticObjectOrDateOrArray(asMutableObject, asMutableArray, asMutableDate);\n Immutable.set = toStaticObjectOrArray(objectSet, arraySet);\n Immutable.setIn = toStaticObjectOrArray(objectSetIn, arraySetIn);\n Immutable.update = toStatic(update);\n Immutable.updateIn = toStatic(updateIn);\n Immutable.getIn = toStatic(getIn);\n Immutable.flatMap = toStatic(flatMap);\n Immutable.asObject = toStatic(asObject);\n if (!globalConfig.use_static) {\n Immutable.static = immutableInit({\n use_static: true\n });\n }\n\n Object.freeze(Immutable);\n\n return Immutable;\n}\n\n var Immutable = immutableInit();\n /* istanbul ignore if */\n if (typeof define === 'function' && define.amd) {\n define(function() {\n return Immutable;\n });\n } else if (typeof module === \"object\") {\n module.exports = Immutable;\n } else if (typeof exports === \"object\") {\n exports.Immutable = Immutable;\n } else if (typeof window === \"object\") {\n window.Immutable = Immutable;\n } else if (typeof global === \"object\") {\n global.Immutable = Immutable;\n }\n})();\n","/* eslint-disable new-cap */\nimport Immutable from \"seamless-immutable\";\n\n// This middleware will just add the property \"async dispatch\"\n// to actions with the \"async\" propperty set to true\nconst asyncDispatchMiddleware = store => next => action => {\n let syncActivityFinished = false;\n let actionQueue = [];\n\n function flushQueue() {\n actionQueue.forEach(a => store.dispatch(a)); // flush queue\n actionQueue = [];\n }\n\n function asyncDispatch(asyncAction) {\n actionQueue = actionQueue.concat([asyncAction]);\n\n if (syncActivityFinished) {\n flushQueue();\n }\n }\n\n const actionWithAsyncDispatch =\n Immutable(action).merge({ asyncDispatch });\n\n next(actionWithAsyncDispatch);\n syncActivityFinished = true;\n flushQueue();\n};\n\nexport default asyncDispatchMiddleware;\n","/* eslint-env jasmine */\nimport asyncDispatchMiddleware from \"../js/utils/asyncDispatchMiddleware\";\n\nconst fakeAction = { type: \"fake action\" };\n\ndescribe(\"The asyncDispatchMiddleware\", () => {\n it(\"calls next with asyncDispatch property\", (done) => {\n const next = returnedAction => {\n expect(returnedAction.asyncDispatch).not.toEqual(undefined);\n expect(typeof returnedAction.asyncDispatch).toEqual(\"function\");\n done();\n };\n\n asyncDispatchMiddleware(\"fakeStore\")(next)(fakeAction);\n });\n\n\n it(\"asyncDispatch triggers a store dispatch\", (done) => {\n const fakeAsyncAction = { type: \"fakeAsyncAction\" };\n\n const fakeStore = {\n dispatch: action => {\n expect(action.type).toEqual(fakeAsyncAction.type);\n done();\n },\n };\n\n const next = returnedAction =>\n returnedAction.asyncDispatch(fakeAsyncAction);\n\n asyncDispatchMiddleware(fakeStore)(next)(fakeAction);\n });\n});\n","// Bug checking function that will throw an error whenever\n// the condition sent to it is evaluated to false\n/**\n * Processes the message and outputs the correct message if the condition\n * is false. Otherwise it outputs null.\n * @api private\n * @method processCondition\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return {String | null} - Error message if there is an error, nul otherwise.\n */\nfunction processCondition(condition, errorMessage) {\n if (!condition) {\n var completeErrorMessage = '';\n var re = /at ([^\\s]+)\\s\\(/g;\n var stackTrace = new Error().stack;\n var stackFunctions = [];\n\n var funcName = re.exec(stackTrace);\n while (funcName && funcName[1]) {\n stackFunctions.push(funcName[1]);\n funcName = re.exec(stackTrace);\n }\n\n // Number 0 is processCondition itself,\n // Number 1 is assert,\n // Number 2 is the caller function.\n if (stackFunctions[2]) {\n completeErrorMessage = stackFunctions[2] + ': ' + completeErrorMessage;\n }\n\n completeErrorMessage += errorMessage;\n return completeErrorMessage;\n }\n\n return null;\n}\n\n/**\n * Throws an error if the boolean passed to it evaluates to false.\n * To be used like this:\n * \t\tassert(myDate !== undefined, \"Date cannot be undefined.\");\n * @api public\n * @method assert\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return void\n */\nfunction assert(condition, errorMessage) {\n var error = processCondition(condition, errorMessage);\n if (typeof error === 'string') {\n throw new Error(error);\n }\n}\n\n/**\n * Logs a warning if the boolean passed to it evaluates to false.\n * To be used like this:\n * \t\tassert.warn(myDate !== undefined, \"No date provided.\");\n * @api public\n * @method warn\n * @param {Boolean} condition - Result of the evaluated condition\n * @param {String} errorMessage - Message explainig the error in case it is thrown\n * @return void\n */\nassert.warn = function warn(condition, errorMessage) {\n var error = processCondition(condition, errorMessage);\n if (typeof error === 'string') {\n console.warn(error);\n }\n};\n\nexport default assert;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJhc3NlcnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQnVnIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuZXZlclxuLy8gdGhlIGNvbmRpdGlvbiBzZW50IHRvIGl0IGlzIGV2YWx1YXRlZCB0byBmYWxzZVxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgYW5kIG91dHB1dHMgdGhlIGNvcnJlY3QgbWVzc2FnZSBpZiB0aGUgY29uZGl0aW9uXG4gKiBpcyBmYWxzZS4gT3RoZXJ3aXNlIGl0IG91dHB1dHMgbnVsbC5cbiAqIEBhcGkgcHJpdmF0ZVxuICogQG1ldGhvZCBwcm9jZXNzQ29uZGl0aW9uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHtTdHJpbmcgfCBudWxsfSAgLSBFcnJvciBtZXNzYWdlIGlmIHRoZXJlIGlzIGFuIGVycm9yLCBudWwgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgbGV0IGNvbXBsZXRlRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgY29uc3QgcmUgPSAvYXQgKFteXFxzXSspXFxzXFwoL2c7XG4gICAgY29uc3Qgc3RhY2tUcmFjZSA9IG5ldyBFcnJvcigpLnN0YWNrO1xuICAgIGNvbnN0IHN0YWNrRnVuY3Rpb25zID0gW107XG5cbiAgICBsZXQgZnVuY05hbWUgPSByZS5leGVjKHN0YWNrVHJhY2UpO1xuICAgIHdoaWxlIChmdW5jTmFtZSAmJiBmdW5jTmFtZVsxXSkge1xuICAgICAgc3RhY2tGdW5jdGlvbnMucHVzaChmdW5jTmFtZVsxXSk7XG4gICAgICBmdW5jTmFtZSA9IHJlLmV4ZWMoc3RhY2tUcmFjZSk7XG4gICAgfVxuXG4gICAgLy8gTnVtYmVyIDAgaXMgcHJvY2Vzc0NvbmRpdGlvbiBpdHNlbGYsXG4gICAgLy8gTnVtYmVyIDEgaXMgYXNzZXJ0LFxuICAgIC8vIE51bWJlciAyIGlzIHRoZSBjYWxsZXIgZnVuY3Rpb24uXG4gICAgaWYgKHN0YWNrRnVuY3Rpb25zWzJdKSB7XG4gICAgICBjb21wbGV0ZUVycm9yTWVzc2FnZSA9IGAke3N0YWNrRnVuY3Rpb25zWzJdfTogJHtjb21wbGV0ZUVycm9yTWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGNvbXBsZXRlRXJyb3JNZXNzYWdlICs9IGVycm9yTWVzc2FnZTtcbiAgICByZXR1cm4gY29tcGxldGVFcnJvck1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGJvb2xlYW4gcGFzc2VkIHRvIGl0IGV2YWx1YXRlcyB0byBmYWxzZS5cbiAqIFRvIGJlIHVzZWQgbGlrZSB0aGlzOlxuICogXHRcdGFzc2VydChteURhdGUgIT09IHVuZGVmaW5lZCwgXCJEYXRlIGNhbm5vdCBiZSB1bmRlZmluZWQuXCIpO1xuICogQGFwaSBwdWJsaWNcbiAqIEBtZXRob2QgYXNzZXJ0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGNvbnN0IGVycm9yID0gcHJvY2Vzc0NvbmRpdGlvbihjb25kaXRpb24sIGVycm9yTWVzc2FnZSk7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIExvZ3MgYSB3YXJuaW5nIGlmIHRoZSBib29sZWFuIHBhc3NlZCB0byBpdCBldmFsdWF0ZXMgdG8gZmFsc2UuXG4gKiBUbyBiZSB1c2VkIGxpa2UgdGhpczpcbiAqIFx0XHRhc3NlcnQud2FybihteURhdGUgIT09IHVuZGVmaW5lZCwgXCJObyBkYXRlIHByb3ZpZGVkLlwiKTtcbiAqIEBhcGkgcHVibGljXG4gKiBAbWV0aG9kIHdhcm5cbiAqIEBwYXJhbSAge0Jvb2xlYW59IGNvbmRpdGlvbiAtIFJlc3VsdCBvZiB0aGUgZXZhbHVhdGVkIGNvbmRpdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBNZXNzYWdlIGV4cGxhaW5pZyB0aGUgZXJyb3IgaW4gY2FzZSBpdCBpcyB0aHJvd25cbiAqIEByZXR1cm4gdm9pZFxuICovXG5hc3NlcnQud2FybiA9IGZ1bmN0aW9uIHdhcm4oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpIHtcbiAgY29uc3QgZXJyb3IgPSBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKTtcbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhc3NlcnQ7XG4iXSwiZmlsZSI6ImFzc2VydC5qcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9\n","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nmodule.exports = Array.isArray || function _isArray(val) {\n return (val != null &&\n val.length >= 0 &&\n Object.prototype.toString.call(val) === '[object Array]');\n};\n","/**\n * An optimized, private array `slice` implementation.\n *\n * @private\n * @param {Arguments|Array} args The array or arguments object to consider.\n * @param {Number} [from=0] The array index to slice from, inclusive.\n * @param {Number} [to=args.length] The array index to slice to, exclusive.\n * @return {Array} A new, sliced array.\n * @example\n *\n * _slice([1, 2, 3, 4, 5], 1, 3); //=> [2, 3]\n *\n * var firstThreeArgs = function(a, b, c, d) {\n * return _slice(arguments, 0, 3);\n * };\n * firstThreeArgs(1, 2, 3, 4); //=> [1, 2, 3]\n */\nmodule.exports = function _slice(args, from, to) {\n switch (arguments.length) {\n case 1: return _slice(args, 0, args.length);\n case 2: return _slice(args, from, args.length);\n default:\n var list = [];\n var idx = 0;\n var len = Math.max(0, Math.min(args.length, to) - from);\n while (idx < len) {\n list[idx] = args[from + idx];\n idx += 1;\n }\n return list;\n }\n};\n","var _isArray = require('./_isArray');\nvar _slice = require('./_slice');\n\n\n/**\n * Similar to hasMethod, this checks whether a function has a [methodname]\n * function. If it isn't an array it will execute that function otherwise it\n * will default to the ramda implementation.\n *\n * @private\n * @param {Function} fn ramda implemtation\n * @param {String} methodname property to check for a custom implementation\n * @return {Object} Whatever the return value of the method is.\n */\nmodule.exports = function _checkForMethod(methodname, fn) {\n return function() {\n var length = arguments.length;\n if (length === 0) {\n return fn();\n }\n var obj = arguments[length - 1];\n return (_isArray(obj) || typeof obj[methodname] !== 'function') ?\n fn.apply(this, arguments) :\n obj[methodname].apply(obj, _slice(arguments, 0, length - 1));\n };\n};\n","module.exports = function _isPlaceholder(a) {\n return a != null &&\n typeof a === 'object' &&\n a['@@functional/placeholder'] === true;\n};\n","var _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n};\n","var _curry1 = require('./_curry1');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2\n : _curry1(function(_b) { return fn(a, _b); });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2\n : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b); })\n : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b); })\n : fn(a, b);\n }\n };\n};\n","var _curry1 = require('./_curry1');\nvar _curry2 = require('./_curry2');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3\n : _curry2(function(_b, _c) { return fn(a, _b, _c); });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3\n : _isPlaceholder(a) ? _curry2(function(_a, _c) { return fn(_a, b, _c); })\n : _isPlaceholder(b) ? _curry2(function(_b, _c) { return fn(a, _b, _c); })\n : _curry1(function(_c) { return fn(a, b, _c); });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3\n : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function(_a, _b) { return fn(_a, _b, c); })\n : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function(_a, _c) { return fn(_a, b, _c); })\n : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function(_b, _c) { return fn(a, _b, _c); })\n : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b, c); })\n : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b, c); })\n : _isPlaceholder(c) ? _curry1(function(_c) { return fn(a, b, _c); })\n : fn(a, b, c);\n }\n };\n};\n","var _checkForMethod = require('./internal/_checkForMethod');\nvar _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns the elements of the given list or string (or object with a `slice`\n * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).\n *\n * Dispatches to the `slice` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.4\n * @category List\n * @sig Number -> Number -> [a] -> [a]\n * @sig Number -> Number -> String -> String\n * @param {Number} fromIndex The start index (inclusive).\n * @param {Number} toIndex The end index (exclusive).\n * @param {*} list\n * @return {*}\n * @example\n *\n * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']\n * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c']\n * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(0, 3, 'ramda'); //=> 'ram'\n */\nmodule.exports = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) {\n return Array.prototype.slice.call(list, fromIndex, toIndex);\n}));\n","var _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns the result of \"setting\" the portion of the given data structure\n * focused by the given lens to the result of applying the given function to\n * the focused value.\n *\n * @func\n * @memberOf R\n * @since v0.16.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig Lens s a -> (a -> a) -> s -> s\n * @param {Lens} lens\n * @param {*} v\n * @param {*} x\n * @return {*}\n * @see R.prop, R.lensIndex, R.lensProp\n * @example\n *\n * var headLens = R.lensIndex(0);\n *\n * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']\n */\nmodule.exports = (function() {\n // `Identity` is a functor that holds a single value, where `map` simply\n // transforms the held value with the provided function.\n var Identity = function(x) {\n return {value: x, map: function(f) { return Identity(f(x)); }};\n };\n\n return _curry3(function over(lens, f, x) {\n // The value returned by the getter function is first transformed with `f`,\n // then set as the value of an `Identity`. This is then mapped over with the\n // setter function of the lens.\n return lens(function(y) { return Identity(f(y)); })(x).value;\n });\n}());\n","var _curry1 = require('./internal/_curry1');\n\n\n/**\n * Returns a function that always returns the given value. Note that for\n * non-primitives the value returned is a reference to the original value.\n *\n * This function is known as `const`, `constant`, or `K` (for K combinator) in\n * other languages and libraries.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig a -> (* -> a)\n * @param {*} val The value to wrap in a function\n * @return {Function} A Function :: * -> val.\n * @example\n *\n * var t = R.always('Tee');\n * t(); //=> 'Tee'\n */\nmodule.exports = _curry1(function always(val) {\n return function() {\n return val;\n };\n});\n","var _curry3 = require('./internal/_curry3');\nvar always = require('./always');\nvar over = require('./over');\n\n\n/**\n * Returns the result of \"setting\" the portion of the given data structure\n * focused by the given lens to the given value.\n *\n * @func\n * @memberOf R\n * @since v0.16.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig Lens s a -> a -> s -> s\n * @param {Lens} lens\n * @param {*} v\n * @param {*} x\n * @return {*}\n * @see R.prop, R.lensIndex, R.lensProp\n * @example\n *\n * var xLens = R.lensProp('x');\n *\n * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}\n * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2}\n */\nmodule.exports = _curry3(function set(lens, v, x) {\n return over(lens, always(v), x);\n});\n","module.exports = function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0: return function() { return fn.apply(this, arguments); };\n case 1: return function(a0) { return fn.apply(this, arguments); };\n case 2: return function(a0, a1) { return fn.apply(this, arguments); };\n case 3: return function(a0, a1, a2) { return fn.apply(this, arguments); };\n case 4: return function(a0, a1, a2, a3) { return fn.apply(this, arguments); };\n case 5: return function(a0, a1, a2, a3, a4) { return fn.apply(this, arguments); };\n case 6: return function(a0, a1, a2, a3, a4, a5) { return fn.apply(this, arguments); };\n case 7: return function(a0, a1, a2, a3, a4, a5, a6) { return fn.apply(this, arguments); };\n case 8: return function(a0, a1, a2, a3, a4, a5, a6, a7) { return fn.apply(this, arguments); };\n case 9: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8) { return fn.apply(this, arguments); };\n case 10: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { return fn.apply(this, arguments); };\n default: throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n};\n","module.exports = function _pipe(f, g) {\n return function() {\n return g.call(this, f.apply(this, arguments));\n };\n};\n","module.exports = (function() {\n function XWrap(fn) {\n this.f = fn;\n }\n XWrap.prototype['@@transducer/init'] = function() {\n throw new Error('init not implemented on XWrap');\n };\n XWrap.prototype['@@transducer/result'] = function(acc) { return acc; };\n XWrap.prototype['@@transducer/step'] = function(acc, x) {\n return this.f(acc, x);\n };\n\n return function _xwrap(fn) { return new XWrap(fn); };\n}());\n","var _arity = require('./internal/_arity');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Creates a function that is bound to a context.\n * Note: `R.bind` does not provide the additional argument-binding capabilities of\n * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\n *\n * @func\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @category Object\n * @sig (* -> *) -> {*} -> (* -> *)\n * @param {Function} fn The function to bind to context\n * @param {Object} thisObj The context to bind `fn` to\n * @return {Function} A function that will execute in the context of `thisObj`.\n * @see R.partial\n * @example\n *\n * var log = R.bind(console.log, console);\n * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}\n * // logs {a: 2}\n */\nmodule.exports = _curry2(function bind(fn, thisObj) {\n return _arity(fn.length, function() {\n return fn.apply(thisObj, arguments);\n });\n});\n","module.exports = function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n};\n","var _curry1 = require('./internal/_curry1');\nvar _isArray = require('./internal/_isArray');\nvar _isString = require('./internal/_isString');\n\n\n/**\n * Tests whether or not an object is similar to an array.\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Type\n * @category List\n * @sig * -> Boolean\n * @param {*} x The object to test.\n * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.\n * @example\n *\n * R.isArrayLike([]); //=> true\n * R.isArrayLike(true); //=> false\n * R.isArrayLike({}); //=> false\n * R.isArrayLike({length: 10}); //=> false\n * R.isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true\n */\nmodule.exports = _curry1(function isArrayLike(x) {\n if (_isArray(x)) { return true; }\n if (!x) { return false; }\n if (typeof x !== 'object') { return false; }\n if (_isString(x)) { return false; }\n if (x.nodeType === 1) { return !!x.length; }\n if (x.length === 0) { return true; }\n if (x.length > 0) {\n return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);\n }\n return false;\n});\n","var _xwrap = require('./_xwrap');\nvar bind = require('../bind');\nvar isArrayLike = require('../isArrayLike');\n\n\nmodule.exports = (function() {\n function _arrayReduce(xf, acc, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n acc = xf['@@transducer/step'](acc, list[idx]);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n idx += 1;\n }\n return xf['@@transducer/result'](acc);\n }\n\n function _iterableReduce(xf, acc, iter) {\n var step = iter.next();\n while (!step.done) {\n acc = xf['@@transducer/step'](acc, step.value);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n step = iter.next();\n }\n return xf['@@transducer/result'](acc);\n }\n\n function _methodReduce(xf, acc, obj) {\n return xf['@@transducer/result'](obj.reduce(bind(xf['@@transducer/step'], xf), acc));\n }\n\n var symIterator = (typeof Symbol !== 'undefined') ? Symbol.iterator : '@@iterator';\n return function _reduce(fn, acc, list) {\n if (typeof fn === 'function') {\n fn = _xwrap(fn);\n }\n if (isArrayLike(list)) {\n return _arrayReduce(fn, acc, list);\n }\n if (typeof list.reduce === 'function') {\n return _methodReduce(fn, acc, list);\n }\n if (list[symIterator] != null) {\n return _iterableReduce(fn, acc, list[symIterator]());\n }\n if (typeof list.next === 'function') {\n return _iterableReduce(fn, acc, list);\n }\n throw new TypeError('reduce: list must be array or iterable');\n };\n}());\n","var _curry3 = require('./internal/_curry3');\nvar _reduce = require('./internal/_reduce');\n\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * The iterator function receives two values: *(acc, value)*. It may use\n * `R.reduced` to shortcut the iteration.\n *\n * Note: `R.reduce` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description\n *\n * Dispatches to the `reduce` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.reduced, R.addIndex\n * @example\n *\n * var numbers = [1, 2, 3];\n * var plus = (a, b) => a + b;\n *\n * R.reduce(plus, 10, numbers); //=> 16\n */\nmodule.exports = _curry3(_reduce);\n","var _checkForMethod = require('./internal/_checkForMethod');\nvar slice = require('./slice');\n\n\n/**\n * Returns all but the first element of the given list or string (or object\n * with a `tail` method).\n *\n * Dispatches to the `slice` method of the first argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig [a] -> [a]\n * @sig String -> String\n * @param {*} list\n * @return {*}\n * @see R.head, R.init, R.last\n * @example\n *\n * R.tail([1, 2, 3]); //=> [2, 3]\n * R.tail([1, 2]); //=> [2]\n * R.tail([1]); //=> []\n * R.tail([]); //=> []\n *\n * R.tail('abc'); //=> 'bc'\n * R.tail('ab'); //=> 'b'\n * R.tail('a'); //=> ''\n * R.tail(''); //=> ''\n */\nmodule.exports = _checkForMethod('tail', slice(1, Infinity));\n","var _arity = require('./internal/_arity');\nvar _pipe = require('./internal/_pipe');\nvar reduce = require('./reduce');\nvar tail = require('./tail');\n\n\n/**\n * Performs left-to-right function composition. The leftmost function may have\n * any arity; the remaining functions must be unary.\n *\n * In some libraries this function is named `sequence`.\n *\n * **Note:** The result of pipe is not automatically curried.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)\n * @param {...Function} functions\n * @return {Function}\n * @see R.compose\n * @example\n *\n * var f = R.pipe(Math.pow, R.negate, R.inc);\n *\n * f(3, 4); // -(3^4) + 1\n */\nmodule.exports = function pipe() {\n if (arguments.length === 0) {\n throw new Error('pipe requires at least one argument');\n }\n return _arity(arguments[0].length,\n reduce(_pipe, arguments[0], tail(arguments)));\n};\n","/**\n * Private `concat` function to merge two array-like objects.\n *\n * @private\n * @param {Array|Arguments} [set1=[]] An array-like object.\n * @param {Array|Arguments} [set2=[]] An array-like object.\n * @return {Array} A new, merged array.\n * @example\n *\n * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]\n */\nmodule.exports = function _concat(set1, set2) {\n set1 = set1 || [];\n set2 = set2 || [];\n var idx;\n var len1 = set1.length;\n var len2 = set2.length;\n var result = [];\n\n idx = 0;\n while (idx < len1) {\n result[result.length] = set1[idx];\n idx += 1;\n }\n idx = 0;\n while (idx < len2) {\n result[result.length] = set2[idx];\n idx += 1;\n }\n return result;\n};\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a new list with the given element at the front, followed by the\n * contents of the list.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The item to add to the head of the output list.\n * @param {Array} list The array to add to the tail of the output list.\n * @return {Array} A new array.\n * @see R.append\n * @example\n *\n * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']\n */\nmodule.exports = _curry2(function prepend(el, list) {\n return _concat([el], list);\n});\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a function that when supplied an object returns the indicated\n * property of that object, if it exists.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig s -> {s: a} -> a | Undefined\n * @param {String} p The property name\n * @param {Object} obj The object to query\n * @return {*} The value at `obj.p`.\n * @see R.path\n * @example\n *\n * R.prop('x', {x: 100}); //=> 100\n * R.prop('x', {}); //=> undefined\n */\nmodule.exports = _curry2(function prop(p, obj) { return obj[p]; });\n","module.exports = function _isTransformer(obj) {\n return typeof obj['@@transducer/step'] === 'function';\n};\n","var _isArray = require('./_isArray');\nvar _isTransformer = require('./_isTransformer');\nvar _slice = require('./_slice');\n\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with [methodname], it will execute that\n * function (functor case). Otherwise, if it is a transformer, uses transducer\n * [xf] to return a new transformer (transducer case). Otherwise, it will\n * default to executing [fn].\n *\n * @private\n * @param {String} methodname property to check for a custom implementation\n * @param {Function} xf transducer to initialize if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\nmodule.exports = function _dispatchable(methodname, xf, fn) {\n return function() {\n var length = arguments.length;\n if (length === 0) {\n return fn();\n }\n var obj = arguments[length - 1];\n if (!_isArray(obj)) {\n var args = _slice(arguments, 0, length - 1);\n if (typeof obj[methodname] === 'function') {\n return obj[methodname].apply(obj, args);\n }\n if (_isTransformer(obj)) {\n var transducer = xf.apply(null, args);\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n};\n","module.exports = function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n};\n","module.exports = {\n init: function() {\n return this.xf['@@transducer/init']();\n },\n result: function(result) {\n return this.xf['@@transducer/result'](result);\n }\n};\n","var _curry2 = require('./_curry2');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XMap(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XMap.prototype['@@transducer/init'] = _xfBase.init;\n XMap.prototype['@@transducer/result'] = _xfBase.result;\n XMap.prototype['@@transducer/step'] = function(result, input) {\n return this.xf['@@transducer/step'](result, this.f(input));\n };\n\n return _curry2(function _xmap(f, xf) { return new XMap(f, xf); });\n}());\n","var _arity = require('./_arity');\nvar _isPlaceholder = require('./_isPlaceholder');\n\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nmodule.exports = function _curryN(length, received, fn) {\n return function() {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length &&\n (!_isPlaceholder(received[combinedIdx]) ||\n argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n }\n combinedIdx += 1;\n }\n return left <= 0 ? fn.apply(this, combined)\n : _arity(left, _curryN(length, combined, fn));\n };\n};\n","var _arity = require('./internal/_arity');\nvar _curry1 = require('./internal/_curry1');\nvar _curry2 = require('./internal/_curry2');\nvar _curryN = require('./internal/_curryN');\n\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value `R.__` may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is `R.__`, the\n * following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * var sumArgs = (...args) => R.sum(args);\n *\n * var curriedAddFourNumbers = R.curryN(4, sumArgs);\n * var f = curriedAddFourNumbers(1, 2);\n * var g = f(3);\n * g(4); //=> 10\n */\nmodule.exports = _curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\n","module.exports = function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n};\n","var _has = require('./_has');\n\n\nmodule.exports = (function() {\n var toString = Object.prototype.toString;\n return toString.call(arguments) === '[object Arguments]' ?\n function _isArguments(x) { return toString.call(x) === '[object Arguments]'; } :\n function _isArguments(x) { return _has('callee', x); };\n}());\n","var _curry1 = require('./internal/_curry1');\nvar _has = require('./internal/_has');\nvar _isArguments = require('./internal/_isArguments');\n\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nmodule.exports = (function() {\n // cover IE < 9 keys issues\n var hasEnumBug = !({toString: null}).propertyIsEnumerable('toString');\n var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n // Safari bug\n var hasArgsEnumBug = (function() {\n 'use strict';\n return arguments.propertyIsEnumerable('length');\n }());\n\n var contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n };\n\n return typeof Object.keys === 'function' && !hasArgsEnumBug ?\n _curry1(function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n }) :\n _curry1(function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _map = require('./internal/_map');\nvar _reduce = require('./internal/_reduce');\nvar _xmap = require('./internal/_xmap');\nvar curryN = require('./curryN');\nvar keys = require('./keys');\n\n\n/**\n * Takes a function and\n * a [functor](https://github.com/fantasyland/fantasy-land#functor),\n * applies the function to each of the functor's values, and returns\n * a functor of the same shape.\n *\n * Ramda provides suitable `map` implementations for `Array` and `Object`,\n * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.\n *\n * Dispatches to the `map` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * Also treats functions as functors and will compose them together.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Functor f => (a -> b) -> f a -> f b\n * @param {Function} fn The function to be called on every element of the input `list`.\n * @param {Array} list The list to be iterated over.\n * @return {Array} The new list.\n * @see R.transduce, R.addIndex\n * @example\n *\n * var double = x => x * 2;\n *\n * R.map(double, [1, 2, 3]); //=> [2, 4, 6]\n *\n * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}\n */\nmodule.exports = _curry2(_dispatchable('map', _xmap, function map(fn, functor) {\n switch (Object.prototype.toString.call(functor)) {\n case '[object Function]':\n return curryN(functor.length, function() {\n return fn.call(this, functor.apply(this, arguments));\n });\n case '[object Object]':\n return _reduce(function(acc, key) {\n acc[key] = fn(functor[key]);\n return acc;\n }, {}, keys(functor));\n default:\n return _map(fn, functor);\n }\n}));\n","var _curry2 = require('./internal/_curry2');\nvar map = require('./map');\n\n\n/**\n * Returns a lens for the given getter and setter functions. The getter \"gets\"\n * the value of the focus; the setter \"sets\" the value of the focus. The setter\n * should not mutate the data structure.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Object\n * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s\n * @sig (s -> a) -> ((a, s) -> s) -> Lens s a\n * @param {Function} getter\n * @param {Function} setter\n * @return {Lens}\n * @see R.view, R.set, R.over, R.lensIndex, R.lensProp\n * @example\n *\n * var xLens = R.lens(R.prop('x'), R.assoc('x'));\n *\n * R.view(xLens, {x: 1, y: 2}); //=> 1\n * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}\n * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2}\n */\nmodule.exports = _curry2(function lens(getter, setter) {\n return function(toFunctorFn) {\n return function(target) {\n return map(\n function(focus) {\n return setter(focus, target);\n },\n toFunctorFn(getter(target))\n );\n };\n };\n});\n","var _curry1 = require('./internal/_curry1');\nvar curryN = require('./curryN');\n\n\n/**\n * Returns a curried equivalent of the provided function. The curried function\n * has two unusual capabilities. First, its arguments needn't be provided one\n * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value `R.__` may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is `R.__`, the\n * following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (* -> a) -> (* -> a)\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curryN\n * @example\n *\n * var addFourNumbers = (a, b, c, d) => a + b + c + d;\n *\n * var curriedAddFourNumbers = R.curry(addFourNumbers);\n * var f = curriedAddFourNumbers(1, 2);\n * var g = f(3);\n * g(4); //=> 10\n */\nmodule.exports = _curry1(function curry(fn) {\n return curryN(fn.length, fn);\n});\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n * @module lib/either\n */\nmodule.exports = Either\n\n// -- Aliases ----------------------------------------------------------\nvar clone = Object.create\nvar unimplemented = function(){ throw new Error('Not implemented.') }\nvar noop = function(){ return this }\n\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * The `Either(a, b)` structure represents the logical disjunction between `a`\n * and `b`. In other words, `Either` may contain either a value of type `a` or\n * a value of type `b`, at any given time. This particular implementation is\n * biased on the right value (`b`), thus projections will take the right value\n * over the left one.\n *\n * This class models two different cases: `Left a` and `Right b`, and can hold\n * one of the cases at any given time. The projections are, none the less,\n * biased for the `Right` case, thus a common use case for this structure is to\n * hold the results of computations that may fail, when you want to store\n * additional information on the failure (instead of throwing an exception).\n *\n * Furthermore, the values of `Either(a, b)` can be combined and manipulated by\n * using the expressive monadic operations. This allows safely sequencing\n * operations that may fail, and safely composing values that you don't know\n * whether they're present or not, failing early (returning a `Left a`) if any\n * of the operations fail.\n *\n * While this class can certainly model input validations, the [Validation][]\n * structure lends itself better to that use case, since it can naturally\n * aggregate failures — monads shortcut on the first failure.\n *\n * [Validation]: https://github.com/folktale/data.validation\n *\n *\n * @class\n * @summary\n * Either[α, β] <: Applicative[β]\n * , Functor[β]\n * , Chain[β]\n * , Show\n * , Eq\n */\nfunction Either() { }\n\nLeft.prototype = clone(Either.prototype)\nfunction Left(a) {\n this.value = a\n}\n\nRight.prototype = clone(Either.prototype)\nfunction Right(a) {\n this.value = a\n}\n\n// -- Constructors -----------------------------------------------------\n\n/**\n * Constructs a new `Either[α, β]` structure holding a `Left` value. This\n * usually represents a failure due to the right-bias of this structure.\n *\n * @summary a → Either[α, β]\n */\nEither.Left = function(a) {\n return new Left(a)\n}\nEither.prototype.Left = Either.Left\n\n/**\n * Constructs a new `Either[α, β]` structure holding a `Right` value. This\n * usually represents a successful value due to the right bias of this\n * structure.\n *\n * @summary β → Either[α, β]\n */\nEither.Right = function(a) {\n return new Right(a)\n}\nEither.prototype.Right = Either.Right\n\n\n// -- Conversions ------------------------------------------------------\n\n/**\n * Constructs a new `Either[α, β]` structure from a nullable type.\n *\n * Takes the `Left` case if the value is `null` or `undefined`. Takes the\n * `Right` case otherwise.\n *\n * @summary α → Either[α, α]\n */\nEither.fromNullable = function(a) {\n return a != null? new Right(a)\n : /* otherwise */ new Left(a)\n}\nEither.prototype.fromNullable = Either.fromNullable\n\n/**\n * Constructs a new `Either[α, β]` structure from a `Validation[α, β]` type.\n *\n * @summary Validation[α, β] → Either[α, β]\n */\nEither.fromValidation = function(a) {\n return a.fold(Either.Left, Either.Right)\n}\n\n/**\n * Executes a synchronous computation that may throw and converts it to an\n * Either type.\n *\n * @summary (α₁, α₂, ..., αₙ -> β :: throws γ) -> (α₁, α₂, ..., αₙ -> Either[γ, β])\n */\nEither.try = function(f) {\n return function() {\n try {\n return new Right(f.apply(null, arguments))\n } catch(e) {\n return new Left(e)\n }\n }\n}\n\n\n// -- Predicates -------------------------------------------------------\n\n/**\n * True if the `Either[α, β]` contains a `Left` value.\n *\n * @summary Boolean\n */\nEither.prototype.isLeft = false\nLeft.prototype.isLeft = true\n\n/**\n * True if the `Either[α, β]` contains a `Right` value.\n *\n * @summary Boolean\n */\nEither.prototype.isRight = false\nRight.prototype.isRight = true\n\n\n// -- Applicative ------------------------------------------------------\n\n/**\n * Creates a new `Either[α, β]` instance holding the `Right` value `b`.\n *\n * `b` can be any value, including `null`, `undefined` or another\n * `Either[α, β]` structure.\n *\n * @summary β → Either[α, β]\n */\nEither.of = function(a) {\n return new Right(a)\n}\nEither.prototype.of = Either.of\n\n\n/**\n * Applies the function inside the `Right` case of the `Either[α, β]` structure\n * to another applicative type.\n *\n * The `Either[α, β]` should contain a function value, otherwise a `TypeError`\n * is thrown.\n *\n * @method\n * @summary (@Either[α, β → γ], f:Applicative[_]) => f[β] → f[γ]\n */\nEither.prototype.ap = unimplemented\n\nLeft.prototype.ap = function(b) {\n return this\n}\n\nRight.prototype.ap = function(b) {\n return b.map(this.value)\n}\n\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the `Right` value of the `Either[α, β]` structure using a regular\n * unary function.\n *\n * @method\n * @summary (@Either[α, β]) => (β → γ) → Either[α, γ]\n */\nEither.prototype.map = unimplemented\nLeft.prototype.map = noop\n\nRight.prototype.map = function(f) {\n return this.of(f(this.value))\n}\n\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the `Right` value of the `Either[α, β]` structure using an unary\n * function to monads.\n *\n * @method\n * @summary (@Either[α, β], m:Monad[_]) => (β → m[γ]) → m[γ]\n */\nEither.prototype.chain = unimplemented\nLeft.prototype.chain = noop\n\nRight.prototype.chain = function(f) {\n return f(this.value)\n}\n\n// -- Semigroup ----------------------------------------------------------\n\n/**\n * Concats the `Right` value of the `Either[α, β]` structure with another `Right` or keeps the `Left` on either side\n *\n * @method\n * @summary (@Either[α, m:Monoid]) => Either[β, m] → Either[α, m]\n */\nEither.prototype.concat = unimplemented\n\nLeft.prototype.concat = function(other) {\n return this\n}\n\nRight.prototype.concat = function(other) {\n var that = this\n return other.fold(function(_){\n return other\n },\n function(y) {\n return that.Right(that.value.concat(y))\n })\n}\n\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Either[α, β]` structure.\n *\n * @method\n * @summary (@Either[α, β]) => Void → String\n */\nEither.prototype.toString = unimplemented\n\nLeft.prototype.toString = function() {\n return 'Either.Left(' + this.value + ')'\n}\n\nRight.prototype.toString = function() {\n return 'Either.Right(' + this.value + ')'\n}\n\n\n// -- Eq ---------------------------------------------------------------\n\n/**\n * Tests if an `Either[α, β]` structure is equal to another `Either[α, β]`\n * structure.\n *\n * @method\n * @summary (@Either[α, β]) => Either[α, β] → Boolean\n */\nEither.prototype.isEqual = unimplemented\n\nLeft.prototype.isEqual = function(a) {\n return a.isLeft && (a.value === this.value)\n}\n\nRight.prototype.isEqual = function(a) {\n return a.isRight && (a.value === this.value)\n}\n\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Extracts the `Right` value out of the `Either[α, β]` structure, if it\n * exists. Otherwise throws a `TypeError`.\n *\n * @method\n * @summary (@Either[α, β]) => Void → β :: partial, throws\n * @see {@link module:lib/either~Either#getOrElse} — A getter that can handle failures.\n * @see {@link module:lib/either~Either#merge} — The convergence of both values.\n * @throws {TypeError} if the structure has no `Right` value.\n */\nEither.prototype.get = unimplemented\n\nLeft.prototype.get = function() {\n throw new TypeError(\"Can't extract the value of a Left(a).\")\n}\n\nRight.prototype.get = function() {\n return this.value\n}\n\n\n/**\n * Extracts the `Right` value out of the `Either[α, β]` structure. If the\n * structure doesn't have a `Right` value, returns the given default.\n *\n * @method\n * @summary (@Either[α, β]) => β → β\n */\nEither.prototype.getOrElse = unimplemented\n\nLeft.prototype.getOrElse = function(a) {\n return a\n}\n\nRight.prototype.getOrElse = function(_) {\n return this.value\n}\n\n\n/**\n * Transforms a `Left` value into a new `Either[α, β]` structure. Does nothing\n * if the structure contain a `Right` value.\n *\n * @method\n * @summary (@Either[α, β]) => (α → Either[γ, β]) → Either[γ, β]\n */\nEither.prototype.orElse = unimplemented\nRight.prototype.orElse = noop\n\nLeft.prototype.orElse = function(f) {\n return f(this.value)\n}\n\n\n/**\n * Returns the value of whichever side of the disjunction that is present.\n *\n * @summary (@Either[α, α]) => Void → α\n */\nEither.prototype.merge = function() {\n return this.value\n}\n\n\n// -- Folds and Extended Transformations -------------------------------\n\n/**\n * Applies a function to each case in this data structure.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ), (β → γ) → γ\n */\nEither.prototype.fold = unimplemented\n\nLeft.prototype.fold = function(f, _) {\n return f(this.value)\n}\n\nRight.prototype.fold = function(_, g) {\n return g(this.value)\n}\n\n/**\n * Catamorphism.\n * \n * @method\n * @summary (@Either[α, β]) => { Left: α → γ, Right: β → γ } → γ\n */\nEither.prototype.cata = unimplemented\n\nLeft.prototype.cata = function(pattern) {\n return pattern.Left(this.value)\n}\n\nRight.prototype.cata = function(pattern) {\n return pattern.Right(this.value)\n}\n\n\n/**\n * Swaps the disjunction values.\n *\n * @method\n * @summary (@Either[α, β]) => Void → Either[β, α]\n */\nEither.prototype.swap = unimplemented\n\nLeft.prototype.swap = function() {\n return this.Right(this.value)\n}\n\nRight.prototype.swap = function() {\n return this.Left(this.value)\n}\n\n\n/**\n * Maps both sides of the disjunction.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ), (β → δ) → Either[γ, δ]\n */\nEither.prototype.bimap = unimplemented\n\nLeft.prototype.bimap = function(f, _) {\n return this.Left(f(this.value))\n}\n\nRight.prototype.bimap = function(_, g) {\n return this.Right(g(this.value))\n}\n\n\n/**\n * Maps the left side of the disjunction.\n *\n * @method\n * @summary (@Either[α, β]) => (α → γ) → Either[γ, β]\n */\nEither.prototype.leftMap = unimplemented\nRight.prototype.leftMap = noop\n\nLeft.prototype.leftMap = function(f) {\n return this.Left(f(this.value))\n}\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = require('./either')","/* eslint-disable new-cap */\n\nimport Immutable from \"seamless-immutable\";\nimport { curry, lens, prop, prepend, over, set, pipe } from \"ramda\";\nimport Either from \"data.either\";\n\nexport const updateAt = curry((keyArray, newVal, obj) => {\n const deepNewVal = keyArray.reduceRight(\n (result, key) => ({ [key]: result })\n , newVal\n );\n\n return Immutable(obj).merge(deepNewVal, { deep: true });\n});\n\n// State lenses\nexport const StateLenses = {\n fieldTypes: lens(prop(\"fieldTypes\"), updateAt([\"fieldTypes\"])),\n fieldsState: lens(prop(\"fieldsState\"), updateAt([\"fieldsState\"])),\n fieldsStateHistory: lens(prop(\"fieldsStateHistory\"), updateAt([\"fieldsStateHistory\"])),\n};\n\n// _ => String\nexport const createId = _ =>\n (Date.now() + Math.random()).toString();\n\n// State -> [fieldsState] -> State\nexport const pushHistoryState = curry((state, newHistoryState) => pipe(\n // Add current state to history\n over(StateLenses.fieldsStateHistory, prepend(state.fieldsState)),\n // Make new State the current\n set(StateLenses.fieldsState, newHistoryState)\n)(state));\n\n\n// State -> State\nexport const hideConfigs = state =>\n set(\n StateLenses.fieldsState,\n state.fieldsState.map(s => Object.assign({}, s, { configShowing: false })),\n state\n );\n\n\n// String -> String -> Object -> Either String Object\nexport const propertyTypeCheck = curry((propertyName, type, obj) =>\n typeof obj[propertyName] === type\n ? Either.Right(obj)\n : Either.Left(`Property '${propertyName}' cannot be of type ${typeof obj[propertyName]}`)\n);\n\n// Checks that a field has its essential properties\n// Object -> Either String Object\nexport const validateField = fieldState =>\n Either.fromNullable(fieldState)\n .leftMap(fs => `A field State cannot be empty ${typeof fs}`)\n .chain(propertyTypeCheck(\"required\", \"boolean\"))\n .chain(propertyTypeCheck(\"configShowing\", \"boolean\"))\n .chain(propertyTypeCheck(\"id\", \"string\"));\n","import { StateLenses } from \"./utils\";\nimport { set, over, slice, pipe } from \"ramda\";\n\nconst lastHistoryState = state =>\n state.fieldsStateHistory[0] || [];\n\nconst undo = (state, _) => pipe(\n // Make last history last state the current one\n set(StateLenses.fieldsState, lastHistoryState(state)),\n // Remove last history state from the history array\n over(StateLenses.fieldsStateHistory, slice(1, Infinity))\n)(state);\n\nexport default undo;\n","module.exports = function _identity(x) { return x; };\n","var _curry1 = require('./internal/_curry1');\nvar _identity = require('./internal/_identity');\n\n\n/**\n * A function that does nothing but return the parameter supplied to it. Good\n * as a default or placeholder function.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig a -> a\n * @param {*} x The value to return.\n * @return {*} The input value, `x`.\n * @example\n *\n * R.identity(1); //=> 1\n *\n * var obj = {};\n * R.identity(obj) === obj; //=> true\n */\nmodule.exports = _curry1(_identity);\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Retrieve the value at a given path.\n *\n * @func\n * @memberOf R\n * @since v0.2.0\n * @category Object\n * @sig [String] -> {k: v} -> v | Undefined\n * @param {Array} path The path to use.\n * @param {Object} obj The object to retrieve the nested property from.\n * @return {*} The data at `path`.\n * @see R.prop\n * @example\n *\n * R.path(['a', 'b'], {a: {b: 2}}); //=> 2\n * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined\n */\nmodule.exports = _curry2(function path(paths, obj) {\n var val = obj;\n var idx = 0;\n while (idx < paths.length) {\n if (val == null) {\n return;\n }\n val = val[paths[idx]];\n idx += 1;\n }\n return val;\n});\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\nvar _reduce = require('./internal/_reduce');\nvar map = require('./map');\n\n\n/**\n * ap applies a list of functions to a list of values.\n *\n * Dispatches to the `ap` method of the second argument, if present. Also\n * treats curried functions as applicatives.\n *\n * @func\n * @memberOf R\n * @since v0.3.0\n * @category Function\n * @sig [a -> b] -> [a] -> [b]\n * @sig Apply f => f (a -> b) -> f a -> f b\n * @param {Array} fns An array of functions\n * @param {Array} vs An array of values\n * @return {Array} An array of results of applying each of `fns` to all of `vs` in turn.\n * @example\n *\n * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]\n */\nmodule.exports = _curry2(function ap(applicative, fn) {\n return (\n typeof applicative.ap === 'function' ?\n applicative.ap(fn) :\n typeof applicative === 'function' ?\n function(x) { return applicative(x)(fn(x)); } :\n // else\n _reduce(function(acc, f) { return _concat(acc, map(f, fn)); }, [], applicative)\n );\n});\n","var _curry3 = require('./internal/_curry3');\n\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * Similar to `reduce`, except moves through the input list from the right to\n * the left.\n *\n * The iterator function receives two values: *(acc, value)*\n *\n * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a,b -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.addIndex\n * @example\n *\n * var pairs = [ ['a', 1], ['b', 2], ['c', 3] ];\n * var flattenPairs = (acc, pair) => acc.concat(pair);\n *\n * R.reduceRight(flattenPairs, [], pairs); //=> [ 'c', 3, 'b', 2, 'a', 1 ]\n */\nmodule.exports = _curry3(function reduceRight(fn, acc, list) {\n var idx = list.length - 1;\n while (idx >= 0) {\n acc = fn(acc, list[idx]);\n idx -= 1;\n }\n return acc;\n});\n","var _curry2 = require('./internal/_curry2');\nvar ap = require('./ap');\nvar map = require('./map');\nvar prepend = require('./prepend');\nvar reduceRight = require('./reduceRight');\n\n\n/**\n * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)\n * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an\n * Applicative of Traversable.\n *\n * Dispatches to the `sequence` method of the second argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)\n * @param {Function} of\n * @param {*} traversable\n * @return {*}\n * @see R.traverse\n * @example\n *\n * R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3])\n * R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()\n *\n * R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]\n * R.sequence(R.of, Nothing()); //=> [Nothing()]\n */\nmodule.exports = _curry2(function sequence(of, traversable) {\n return typeof traversable.sequence === 'function' ?\n traversable.sequence(of) :\n reduceRight(function(acc, x) { return ap(map(prepend, x), acc); },\n of([]),\n traversable);\n});\n","var _curry3 = require('./internal/_curry3');\nvar map = require('./map');\nvar sequence = require('./sequence');\n\n\n/**\n * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning\n * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),\n * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative\n * into an Applicative of Traversable.\n *\n * Dispatches to the `sequence` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)\n * @param {Function} of\n * @param {Function} f\n * @param {*} traversable\n * @return {*}\n * @see R.sequence\n * @example\n *\n * // Returns `Nothing` if the given divisor is `0`\n * safeDiv = n => d => d === 0 ? Nothing() : Just(n / d)\n *\n * R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Just([5, 2.5, 2])\n * R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Nothing\n */\nmodule.exports = _curry3(function traverse(of, f, traversable) {\n return sequence(of, map(f, traversable));\n});\n","module.exports = function _arrayFromIterator(iter) {\n var list = [];\n var next;\n while (!(next = iter.next()).done) {\n list.push(next.value);\n }\n return list;\n};\n","module.exports = function _functionName(f) {\n // String(x => x) evaluates to \"x => x\", so the pattern may not match.\n var match = String(f).match(/^function (\\w*)/);\n return match == null ? '' : match[1];\n};\n","var _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns true if its arguments are identical, false otherwise. Values are\n * identical if they reference the same memory. `NaN` is identical to `NaN`;\n * `0` and `-0` are not identical.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> a -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * var o = {};\n * R.identical(o, o); //=> true\n * R.identical(1, 1); //=> true\n * R.identical(1, '1'); //=> false\n * R.identical([], []); //=> false\n * R.identical(0, -0); //=> false\n * R.identical(NaN, NaN); //=> true\n */\nmodule.exports = _curry2(function identical(a, b) {\n // SameValue algorithm\n if (a === b) { // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return a !== 0 || 1 / a === 1 / b;\n } else {\n // Step 6.a: NaN == NaN\n return a !== a && b !== b;\n }\n});\n","var _curry1 = require('./internal/_curry1');\n\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig (* -> {*}) -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n */\nmodule.exports = _curry1(function type(val) {\n return val === null ? 'Null' :\n val === undefined ? 'Undefined' :\n Object.prototype.toString.call(val).slice(8, -1);\n});\n","var _arrayFromIterator = require('./_arrayFromIterator');\nvar _functionName = require('./_functionName');\nvar _has = require('./_has');\nvar identical = require('../identical');\nvar keys = require('../keys');\nvar type = require('../type');\n\n\nmodule.exports = function _equals(a, b, stackA, stackB) {\n if (identical(a, b)) {\n return true;\n }\n\n if (type(a) !== type(b)) {\n return false;\n }\n\n if (a == null || b == null) {\n return false;\n }\n\n if (typeof a.equals === 'function' || typeof b.equals === 'function') {\n return typeof a.equals === 'function' && a.equals(b) &&\n typeof b.equals === 'function' && b.equals(a);\n }\n\n switch (type(a)) {\n case 'Arguments':\n case 'Array':\n case 'Object':\n if (typeof a.constructor === 'function' &&\n _functionName(a.constructor) === 'Promise') {\n return a === b;\n }\n break;\n case 'Boolean':\n case 'Number':\n case 'String':\n if (!(typeof a === typeof b && identical(a.valueOf(), b.valueOf()))) {\n return false;\n }\n break;\n case 'Date':\n if (!identical(a.valueOf(), b.valueOf())) {\n return false;\n }\n break;\n case 'Error':\n return a.name === b.name && a.message === b.message;\n case 'RegExp':\n if (!(a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.sticky === b.sticky &&\n a.unicode === b.unicode)) {\n return false;\n }\n break;\n case 'Map':\n case 'Set':\n if (!_equals(_arrayFromIterator(a.entries()), _arrayFromIterator(b.entries()), stackA, stackB)) {\n return false;\n }\n break;\n case 'Int8Array':\n case 'Uint8Array':\n case 'Uint8ClampedArray':\n case 'Int16Array':\n case 'Uint16Array':\n case 'Int32Array':\n case 'Uint32Array':\n case 'Float32Array':\n case 'Float64Array':\n break;\n case 'ArrayBuffer':\n break;\n default:\n // Values of other types are only equal if identical.\n return false;\n }\n\n var keysA = keys(a);\n if (keysA.length !== keys(b).length) {\n return false;\n }\n\n var idx = stackA.length - 1;\n while (idx >= 0) {\n if (stackA[idx] === a) {\n return stackB[idx] === b;\n }\n idx -= 1;\n }\n\n stackA.push(a);\n stackB.push(b);\n idx = keysA.length - 1;\n while (idx >= 0) {\n var key = keysA[idx];\n if (!(_has(key, b) && _equals(b[key], a[key], stackA, stackB))) {\n return false;\n }\n idx -= 1;\n }\n stackA.pop();\n stackB.pop();\n return true;\n};\n","var _curry2 = require('./internal/_curry2');\nvar _equals = require('./internal/_equals');\n\n\n/**\n * Returns `true` if its arguments are equivalent, `false` otherwise. Handles\n * cyclical data structures.\n *\n * Dispatches symmetrically to the `equals` methods of both arguments, if\n * present.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> b -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * R.equals(1, 1); //=> true\n * R.equals(1, '1'); //=> false\n * R.equals([1, 2, 3], [1, 2, 3]); //=> true\n *\n * var a = {}; a.v = a;\n * var b = {}; b.v = b;\n * R.equals(a, b); //=> true\n */\nmodule.exports = _curry2(function equals(a, b) {\n return _equals(a, b, [], []);\n});\n","/* @flow weak */\n/* eslint-disable new-cap */\nimport { pushHistoryState, createId } from \"./utils\";\nimport { curry, equals, traverse, identity, path } from \"ramda\";\nimport Either from \"data.either\";\n\n// [a] => Either String [a]\nconst isArray = arr =>\n Array.isArray(arr)\n ? Either.Right(arr)\n : Either.Left(`Invalid states sent with importState. Expected Array but received ${typeof arr}`); // eslint-disable-line max-len\n\nconst fieldTypeIsValid = curry((validTypes, field) =>\n validTypes.find(equals(field.type))\n ? Either.Right(field)\n : Either.Left(`Invalid field type ${field.type}`)\n);\n\nconst validFieldTypes = curry((validTypes, fieldsState) =>\n traverse(Either.of, fieldTypeIsValid(validTypes), fieldsState)\n);\n\n\n// [a] -> [a] -> Either String [a]\nconst validateFieldsState = curry((fieldsState, state) =>\n Either.of(fieldsState)\n .chain(isArray)\n .chain(validFieldTypes(state.fieldTypes.map(path([\"info\", \"type\"]))))\n);\n\n\n// Add required properties that are not managed by the field\n// component but by the FormBuilder component itself, so may\n// not be there.\n// [a] => [a]\nconst addRequiredProperties = fieldStates =>\n fieldStates\n .map(s => Object.assign(\n {\n configShowing: false,\n required: false,\n },\n s,\n { id: createId() }\n ));\n\n\n// If there are any problems with the import, the same state\n// will be returned\nexport default (state, { newFieldsState }) =>\n validateFieldsState(newFieldsState, state)\n .map(addRequiredProperties)\n .map(pushHistoryState(state))\n .bimap(console.error, identity)\n .getOrElse(state);\n","module.exports = function _reduced(x) {\n return x && x['@@transducer/reduced'] ? x :\n {\n '@@transducer/value': x,\n '@@transducer/reduced': true\n };\n};\n","var _curry2 = require('./_curry2');\nvar _reduced = require('./_reduced');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XFind(f, xf) {\n this.xf = xf;\n this.f = f;\n this.found = false;\n }\n XFind.prototype['@@transducer/init'] = _xfBase.init;\n XFind.prototype['@@transducer/result'] = function(result) {\n if (!this.found) {\n result = this.xf['@@transducer/step'](result, void 0);\n }\n return this.xf['@@transducer/result'](result);\n };\n XFind.prototype['@@transducer/step'] = function(result, input) {\n if (this.f(input)) {\n this.found = true;\n result = _reduced(this.xf['@@transducer/step'](result, input));\n }\n return result;\n };\n\n return _curry2(function _xfind(f, xf) { return new XFind(f, xf); });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _xfind = require('./internal/_xfind');\n\n\n/**\n * Returns the first element of the list which matches the predicate, or\n * `undefined` if no element matches.\n *\n * Dispatches to the `find` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a -> Boolean) -> [a] -> a | undefined\n * @param {Function} fn The predicate function used to determine if the element is the\n * desired one.\n * @param {Array} list The array to consider.\n * @return {Object} The element found, or `undefined`.\n * @see R.transduce\n * @example\n *\n * var xs = [{a: 1}, {a: 2}, {a: 3}];\n * R.find(R.propEq('a', 2))(xs); //=> {a: 2}\n * R.find(R.propEq('a', 4))(xs); //=> undefined\n */\nmodule.exports = _curry2(_dispatchable('find', _xfind, function find(fn, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n if (fn(list[idx])) {\n return list[idx];\n }\n idx += 1;\n }\n}));\n","'use strict';\n\n\n/**\n * A helper for delaying the execution of a function.\n * @private\n * @summary (Any... -> Any) -> Void\n */\nvar delayed = typeof setImmediate !== 'undefined'? setImmediate\n : typeof process !== 'undefined'? process.nextTick\n : /* otherwise */ setTimeout\n\n/**\n * @module lib/task\n */\nmodule.exports = Task;\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * The `Task[α, β]` structure represents values that depend on time. This\n * allows one to model time-based effects explicitly, such that one can have\n * full knowledge of when they're dealing with delayed computations, latency,\n * or anything that can not be computed immediately.\n *\n * A common use for this structure is to replace the usual Continuation-Passing\n * Style form of programming, in order to be able to compose and sequence\n * time-dependent effects using the generic and powerful monadic operations.\n *\n * @class\n * @summary\n * ((α → Void), (β → Void) → Void), (Void → Void) → Task[α, β]\n *\n * Task[α, β] <: Chain[β]\n * , Monad[β]\n * , Functor[β]\n * , Applicative[β]\n * , Semigroup[β]\n * , Monoid[β]\n * , Show\n */\nfunction Task(computation, cleanup) {\n this.fork = computation;\n\n this.cleanup = cleanup || function() {};\n}\n\n/**\n * Constructs a new `Task[α, β]` containing the single value `β`.\n *\n * `β` can be any value, including `null`, `undefined`, or another\n * `Task[α, β]` structure.\n *\n * @summary β → Task[α, β]\n */\nTask.prototype.of = function _of(b) {\n return new Task(function(_, resolve) {\n return resolve(b);\n });\n};\n\nTask.of = Task.prototype.of;\n\n/**\n * Constructs a new `Task[α, β]` containing the single value `α`.\n *\n * `α` can be any value, including `null`, `undefined`, or another\n * `Task[α, β]` structure.\n *\n * @summary α → Task[α, β]\n */\nTask.prototype.rejected = function _rejected(a) {\n return new Task(function(reject) {\n return reject(a);\n });\n};\n\nTask.rejected = Task.prototype.rejected;\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the successful value of the `Task[α, β]` using a regular unary\n * function.\n *\n * @summary @Task[α, β] => (β → γ) → Task[α, γ]\n */\nTask.prototype.map = function _map(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(a);\n }, function(b) {\n return resolve(f(b));\n });\n }, cleanup);\n};\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the succesful value of the `Task[α, β]` using a function to a\n * monad.\n *\n * @summary @Task[α, β] => (β → Task[α, γ]) → Task[α, γ]\n */\nTask.prototype.chain = function _chain(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(a);\n }, function(b) {\n return f(b).fork(reject, resolve);\n });\n }, cleanup);\n};\n\n// -- Apply ------------------------------------------------------------\n\n/**\n * Applys the successful value of the `Task[α, (β → γ)]` to the successful\n * value of the `Task[α, β]`\n *\n * @summary @Task[α, (β → γ)] => Task[α, β] → Task[α, γ]\n */\n\nTask.prototype.ap = function _ap(that) {\n var forkThis = this.fork;\n var forkThat = that.fork;\n var cleanupThis = this.cleanup;\n var cleanupThat = that.cleanup;\n\n function cleanupBoth(state) {\n cleanupThis(state[0]);\n cleanupThat(state[1]);\n }\n\n return new Task(function(reject, resolve) {\n var func, funcLoaded = false;\n var val, valLoaded = false;\n var rejected = false;\n var allState;\n\n var thisState = forkThis(guardReject, guardResolve(function(x) {\n funcLoaded = true;\n func = x;\n }));\n\n var thatState = forkThat(guardReject, guardResolve(function(x) {\n valLoaded = true;\n val = x;\n }));\n\n function guardResolve(setter) {\n return function(x) {\n if (rejected) {\n return;\n }\n\n setter(x);\n if (funcLoaded && valLoaded) {\n delayed(function(){ cleanupBoth(allState) });\n return resolve(func(val));\n } else {\n return x;\n }\n }\n }\n\n function guardReject(x) {\n if (!rejected) {\n rejected = true;\n return reject(x);\n }\n }\n\n return allState = [thisState, thatState];\n }, cleanupBoth);\n};\n\n// -- Semigroup ------------------------------------------------------------\n\n/**\n * Selects the earlier of the two tasks `Task[α, β]`\n *\n * @summary @Task[α, β] => Task[α, β] → Task[α, β]\n */\n\nTask.prototype.concat = function _concat(that) {\n var forkThis = this.fork;\n var forkThat = that.fork;\n var cleanupThis = this.cleanup;\n var cleanupThat = that.cleanup;\n\n function cleanupBoth(state) {\n cleanupThis(state[0]);\n cleanupThat(state[1]);\n }\n\n return new Task(function(reject, resolve) {\n var done = false;\n var allState;\n var thisState = forkThis(guard(reject), guard(resolve));\n var thatState = forkThat(guard(reject), guard(resolve));\n\n return allState = [thisState, thatState];\n\n function guard(f) {\n return function(x) {\n if (!done) {\n done = true;\n delayed(function(){ cleanupBoth(allState) })\n return f(x);\n }\n };\n }\n }, cleanupBoth);\n\n};\n\n// -- Monoid ------------------------------------------------------------\n\n/**\n * Returns a Task that will never resolve\n *\n * @summary Void → Task[α, _]\n */\nTask.empty = function _empty() {\n return new Task(function() {});\n};\n\nTask.prototype.empty = Task.empty;\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Task[α, β]`\n *\n * @summary @Task[α, β] => Void → String\n */\nTask.prototype.toString = function _toString() {\n return 'Task';\n};\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Transforms a failure value into a new `Task[α, β]`. Does nothing if the\n * structure already contains a successful value.\n *\n * @summary @Task[α, β] => (α → Task[γ, β]) → Task[γ, β]\n */\nTask.prototype.orElse = function _orElse(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return f(a).fork(reject, resolve);\n }, function(b) {\n return resolve(b);\n });\n }, cleanup);\n};\n\n// -- Folds and extended transformations -------------------------------\n\n/**\n * Catamorphism. Takes two functions, applies the leftmost one to the failure\n * value, and the rightmost one to the successful value, depending on which one\n * is present.\n *\n * @summary @Task[α, β] => (α → γ), (β → γ) → Task[δ, γ]\n */\nTask.prototype.fold = function _fold(f, g) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return resolve(f(a));\n }, function(b) {\n return resolve(g(b));\n });\n }, cleanup);\n};\n\n/**\n * Catamorphism.\n *\n * @summary @Task[α, β] => { Rejected: α → γ, Resolved: β → γ } → Task[δ, γ]\n */\nTask.prototype.cata = function _cata(pattern) {\n return this.fold(pattern.Rejected, pattern.Resolved);\n};\n\n/**\n * Swaps the disjunction values.\n *\n * @summary @Task[α, β] => Void → Task[β, α]\n */\nTask.prototype.swap = function _swap() {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return resolve(a);\n }, function(b) {\n return reject(b);\n });\n }, cleanup);\n};\n\n/**\n * Maps both sides of the disjunction.\n *\n * @summary @Task[α, β] => (α → γ), (β → δ) → Task[γ, δ]\n */\nTask.prototype.bimap = function _bimap(f, g) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(f(a));\n }, function(b) {\n return resolve(g(b));\n });\n }, cleanup);\n};\n\n/**\n * Maps the left side of the disjunction (failure).\n *\n * @summary @Task[α, β] => (α → γ) → Task[γ, β]\n */\nTask.prototype.rejectedMap = function _rejectedMap(f) {\n var fork = this.fork;\n var cleanup = this.cleanup;\n\n return new Task(function(reject, resolve) {\n return fork(function(a) {\n return reject(f(a));\n }, function(b) {\n return resolve(b);\n });\n }, cleanup);\n};\n","module.exports = require('./task');\n","/* eslint-disable new-cap */\nimport { prop, find, identity, pipe } from \"ramda\";\nimport { createId } from \"./utils\";\nimport Either from \"data.either\";\nimport Task from \"data.task\";\nimport Immutable from \"seamless-immutable\";\nimport { fieldCreated } from \"../Actions\";\n\n// State -> String -> Either String Function\nconst typeConstructor = (state, fieldType) => {\n return Either.of(state)\n .map(prop(\"fieldTypes\"))\n .map(find(v => v.info.type === fieldType))\n .chain(Either.fromNullable)\n .bimap(_ => `Field \"${fieldType}\" does not exist.`, identity);\n};\n\n// { initialState: Function } -> Task String Object\nconst createField = constr =>\n new Task((reject, resolve) => {\n // Make sure the promise is only resolved once\n let called = false;\n const fieldState = constr.initialState();\n\n if (!(fieldState instanceof Promise)) {\n resolve(fieldState);\n } else {\n fieldState\n .then(v => {\n if (called) { return; }\n called = true;\n resolve(v);\n })\n .catch(v => {\n if (called) { throw v; }\n called = true;\n reject(v);\n });\n }\n });\n\n// Object -> Object\nconst insertRequiredProps = field =>\n Immutable(field).merge({\n id: createId(),\n configShowing: true,\n }, {\n deep: true,\n });\n\nconst createFieldAsynchronously = (state, fieldType, asyncDispatch) =>\n typeConstructor(state, fieldType)\n .map(createField) // Either String (Task String Object)\n .leftMap(Task.rejected)\n .merge() // Task String Object\n .map(insertRequiredProps)\n .fork( // execute task\n err => console.error(\"Task rejected\", err),\n pipe(fieldCreated, asyncDispatch)\n );\n\n// This is an async action. When it is finished it will trigger the\n// field created action\nexport default (state, { fieldType, asyncDispatch }) => {\n createFieldAsynchronously(state, fieldType, asyncDispatch);\n return state;\n};\n","var _concat = require('./internal/_concat');\nvar _curry2 = require('./internal/_curry2');\n\n\n/**\n * Returns a new list containing the contents of the given list, followed by\n * the given element.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The element to add to the end of the new list.\n * @param {Array} list The list whose contents will be added to the beginning of the output\n * list.\n * @return {Array} A new list containing the contents of the old list followed by `el`.\n * @see R.prepend\n * @example\n *\n * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']\n * R.append('tests', []); //=> ['tests']\n * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]\n */\nmodule.exports = _curry2(function append(el, list) {\n return _concat(list, [el]);\n});\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n * @module lib/maybe\n */\nmodule.exports = Maybe\n\n// -- Aliases ----------------------------------------------------------\nvar clone = Object.create\nvar unimplemented = function(){ throw new Error('Not implemented.') }\nvar noop = function(){ return this }\n\n// -- Implementation ---------------------------------------------------\n\n/**\n * A structure for values that may not be present, or computations that may\n * fail. `Maybe(a)` explicitly models the effects that are implicit in\n * `Nullable` types, thus has none of the problems associated with\n * `null` or `undefined` — like `NullPointerExceptions`.\n *\n * The class models two different cases:\n *\n * + `Just a` — represents a `Maybe(a)` that contains a value. `a` may\n * be any value, including `null` or `undefined`.\n *\n * + `Nothing` — represents a `Maybe(a)` that has no values. Or a\n * failure that needs no additional information.\n *\n * Common uses of this structure includes modelling values that may or may\n * not be present in a collection, thus instead of needing a\n * `collection.has(a)`, the `collection.get(a)` operation gives you all\n * the information you need — `collection.get(a).is-nothing` being\n * equivalent to `collection.has(a)`; Similarly the same reasoning may\n * be applied to computations that may fail to provide a value, e.g.:\n * `collection.find(predicate)` can safely return a `Maybe(a)` instance,\n * even if the collection contains nullable values.\n *\n * Furthermore, the values of `Maybe(a)` can be combined and manipulated\n * by using the expressive monadic operations. This allows safely\n * sequencing operations that may fail, and safely composing values that\n * you don't know whether they're present or not, failing early\n * (returning a `Nothing`) if any of the operations fail.\n *\n * If one wants to store additional information about failures, the\n * [Either][] and [Validation][] structures provide such a capability, and\n * should be used instead of the `Maybe(a)` structure.\n *\n * [Either]: https://github.com/folktale/data.either\n * [Validation]: https://github.com/folktale/data.validation\n *\n *\n * @class\n */\nfunction Maybe() {}\n\n// The case for successful values\nJust.prototype = clone(Maybe.prototype)\nfunction Just(a){\n this.value = a\n}\n\n// The case for failure values\nNothing.prototype = clone(Maybe.prototype)\nfunction Nothing(){}\n\n\n// -- Constructors -----------------------------------------------------\n\n/**\n * Constructs a new `Maybe[α]` structure with an absent value. Commonly used\n * to represent a failure.\n *\n * @summary Void → Maybe[α]\n */\nMaybe.Nothing = function() {\n return new Nothing\n}\nMaybe.prototype.Nothing = Maybe.Nothing\n\n/**\n * Constructs a new `Maybe[α]` structure that holds the single value\n * `α`. Commonly used to represent a success.\n *\n * `α` can be any value, including `null`, `undefined` or another\n * `Maybe[α]` structure.\n *\n * @summary α → Maybe[α]\n */\nMaybe.Just = function(a) {\n return new Just(a)\n}\nMaybe.prototype.Just = Maybe.Just\n\n\n// -- Conversions ------------------------------------------------------\n\n/**\n * Constructs a new `Maybe[α]` structure from a nullable type.\n *\n * If the value is either `null` or `undefined`, this function returns a\n * `Nothing`, otherwise the value is wrapped in a `Just(α)`.\n *\n * @summary α → Maybe[α]\n */\nMaybe.fromNullable = function(a) {\n return a != null? new Just(a)\n : /* otherwise */ new Nothing\n}\nMaybe.prototype.fromNullable = Maybe.fromNullable\n\n/**\n * Constructs a new `Maybe[β]` structure from an `Either[α, β]` type.\n *\n * The left side of the `Either` becomes `Nothing`, and the right side\n * is wrapped in a `Just(β)`.\n *\n * @summary Either[α, β] → Maybe[β]\n */\nMaybe.fromEither = function(a) {\n return a.fold(Maybe.Nothing, Maybe.Just)\n}\nMaybe.prototype.fromEither = Maybe.fromEither\n\n/**\n * Constructs a new `Maybe[β]` structure from a `Validation[α, β]` type.\n *\n * The failure side of the `Validation` becomes `Nothing`, and the right\n * side is wrapped in a `Just(β)`.\n *\n * @method\n * @summary Validation[α, β] → Maybe[β]\n */\nMaybe.fromValidation = Maybe.fromEither\nMaybe.prototype.fromValidation = Maybe.fromEither\n\n\n// -- Predicates -------------------------------------------------------\n\n/**\n * True if the `Maybe[α]` structure contains a failure (i.e.: `Nothing`).\n *\n * @summary Boolean\n */\nMaybe.prototype.isNothing = false\nNothing.prototype.isNothing = true\n\n\n/**\n * True if the `Maybe[α]` structure contains a single value (i.e.: `Just(α)`).\n *\n * @summary Boolean\n */\nMaybe.prototype.isJust = false\nJust.prototype.isJust = true\n\n\n// -- Applicative ------------------------------------------------------\n\n/**\n * Creates a new `Maybe[α]` structure holding the single value `α`.\n *\n * `α` can be any value, including `null`, `undefined`, or another\n * `Maybe[α]` structure.\n *\n * @summary α → Maybe[α]\n */\nMaybe.of = function(a) {\n return new Just(a)\n}\nMaybe.prototype.of = Maybe.of\n\n\n/**\n * Applies the function inside the `Maybe[α]` structure to another\n * applicative type.\n *\n * The `Maybe[α]` structure should contain a function value, otherwise a\n * `TypeError` is thrown.\n *\n * @method\n * @summary (@Maybe[α → β], f:Applicative[_]) => f[α] → f[β]\n */\nMaybe.prototype.ap = unimplemented\n\nNothing.prototype.ap = noop\n\nJust.prototype.ap = function(b) {\n return b.map(this.value)\n}\n\n\n\n\n// -- Functor ----------------------------------------------------------\n\n/**\n * Transforms the value of the `Maybe[α]` structure using a regular unary\n * function.\n *\n * @method\n * @summary @Maybe[α] => (α → β) → Maybe[β]\n */\nMaybe.prototype.map = unimplemented\nNothing.prototype.map = noop\n\nJust.prototype.map = function(f) {\n return this.of(f(this.value))\n}\n\n\n// -- Chain ------------------------------------------------------------\n\n/**\n * Transforms the value of the `Maybe[α]` structure using an unary function\n * to monads.\n *\n * @method\n * @summary (@Maybe[α], m:Monad[_]) => (α → m[β]) → m[β]\n */\nMaybe.prototype.chain = unimplemented\nNothing.prototype.chain = noop\n\nJust.prototype.chain = function(f) {\n return f(this.value)\n}\n\n\n// -- Show -------------------------------------------------------------\n\n/**\n * Returns a textual representation of the `Maybe[α]` structure.\n *\n * @method\n * @summary @Maybe[α] => Void → String\n */\nMaybe.prototype.toString = unimplemented\n\nNothing.prototype.toString = function() {\n return 'Maybe.Nothing'\n}\n\nJust.prototype.toString = function() {\n return 'Maybe.Just(' + this.value + ')'\n}\n\n\n// -- Eq ---------------------------------------------------------------\n\n/**\n * Tests if a `Maybe[α]` structure is equal to another `Maybe[α]` structure.\n *\n * @method\n * @summary @Maybe[α] => Maybe[α] → Boolean\n */\nMaybe.prototype.isEqual = unimplemented\n\nNothing.prototype.isEqual = function(b) {\n return b.isNothing\n}\n\nJust.prototype.isEqual = function(b) {\n return b.isJust\n && b.value === this.value\n}\n\n\n// -- Extracting and recovering ----------------------------------------\n\n/**\n * Extracts the value out of the `Maybe[α]` structure, if it\n * exists. Otherwise throws a `TypeError`.\n *\n * @method\n * @summary @Maybe[α] => Void → a, :: partial, throws\n * @see {@link module:lib/maybe~Maybe#getOrElse} — A getter that can handle failures\n * @throws {TypeError} if the structure has no value (`Nothing`).\n */\nMaybe.prototype.get = unimplemented\n\nNothing.prototype.get = function() {\n throw new TypeError(\"Can't extract the value of a Nothing.\")\n}\n\nJust.prototype.get = function() {\n return this.value\n}\n\n\n/**\n * Extracts the value out of the `Maybe[α]` structure. If there is no value,\n * returns the given default.\n *\n * @method\n * @summary @Maybe[α] => α → α\n */\nMaybe.prototype.getOrElse = unimplemented\n\nNothing.prototype.getOrElse = function(a) {\n return a\n}\n\nJust.prototype.getOrElse = function(_) {\n return this.value\n}\n\n\n/**\n * Transforms a failure into a new `Maybe[α]` structure. Does nothing if the\n * structure already contains a value.\n *\n * @method\n * @summary @Maybe[α] => (Void → Maybe[α]) → Maybe[α]\n */\nMaybe.prototype.orElse = unimplemented\n\nNothing.prototype.orElse = function(f) {\n return f()\n}\n\nJust.prototype.orElse = function(_) {\n return this\n}\n\n\n/**\n * Catamorphism.\n * \n * @method\n * @summary @Maybe[α] => { Nothing: Void → β, Just: α → β } → β\n */\nMaybe.prototype.cata = unimplemented\n\nNothing.prototype.cata = function(pattern) {\n return pattern.Nothing()\n}\n\nJust.prototype.cata = function(pattern) {\n return pattern.Just(this.value);\n}\n\n\n/**\n * JSON serialisation\n *\n * @method\n * @summary @Maybe[α] => Void → Object\n */\nMaybe.prototype.toJSON = unimplemented\n\nNothing.prototype.toJSON = function() {\n return { '#type': 'folktale:Maybe.Nothing' }\n}\n\nJust.prototype.toJSON = function() {\n return { '#type': 'folktale:Maybe.Just'\n , value: this.value }\n}\n","// Copyright (c) 2013-2014 Quildreen Motta \n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation files\n// (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge,\n// publish, distribute, sublicense, and/or sell copies of the Software,\n// and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = require('./maybe')","import { curry, pipe, prop, over, append } from \"ramda\";\nimport { hideConfigs, StateLenses, pushHistoryState } from \"./utils\";\nimport Maybe from \"data.maybe\";\n\n// State -> Object -> State\nconst historyStateWithNewField = curry((state, newField) => pipe(\n hideConfigs,\n over(StateLenses.fieldsState, append(newField))\n)(state));\n\nexport default (state, { createdFieldState }) =>\n Maybe.fromNullable(createdFieldState)\n .map(historyStateWithNewField(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","/* eslint-disable new-cap */\nimport { curry } from \"ramda\";\nimport Maybe from \"data.maybe\";\nimport Immutable from \"seamless-immutable\";\nimport { pushHistoryState } from \"./utils\";\n\nconst toggleConfig = fieldState =>\n Immutable(fieldState).set(\"configShowing\", !fieldState.configShowing);\n\nconst replaceFieldState = curry((state, fieldState) =>\n state\n .fieldsState\n .map(aField => aField.id === fieldState.id\n ? fieldState\n : aField\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(toggleConfig)\n .map(replaceFieldState(state))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","/* eslint-disable new-cap */\nimport { curry } from \"ramda\";\nimport Maybe from \"data.maybe\";\nimport Immutable from \"seamless-immutable\";\nimport { pushHistoryState } from \"./utils\";\n\nconst toggleRequired = fieldState =>\n Immutable(fieldState).set(\"required\", !fieldState.required);\n\nconst replaceFieldState = curry((state, fieldState) =>\n state\n .fieldsState\n .map(aField => aField.id === fieldState.id\n ? fieldState\n : aField\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(toggleRequired)\n .map(replaceFieldState(state))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","module.exports = function _filter(fn, list) {\n var idx = 0;\n var len = list.length;\n var result = [];\n\n while (idx < len) {\n if (fn(list[idx])) {\n result[result.length] = list[idx];\n }\n idx += 1;\n }\n return result;\n};\n","module.exports = function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n};\n","var _curry2 = require('./_curry2');\nvar _xfBase = require('./_xfBase');\n\n\nmodule.exports = (function() {\n function XFilter(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XFilter.prototype['@@transducer/init'] = _xfBase.init;\n XFilter.prototype['@@transducer/result'] = _xfBase.result;\n XFilter.prototype['@@transducer/step'] = function(result, input) {\n return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;\n };\n\n return _curry2(function _xfilter(f, xf) { return new XFilter(f, xf); });\n}());\n","var _curry2 = require('./internal/_curry2');\nvar _dispatchable = require('./internal/_dispatchable');\nvar _filter = require('./internal/_filter');\nvar _isObject = require('./internal/_isObject');\nvar _reduce = require('./internal/_reduce');\nvar _xfilter = require('./internal/_xfilter');\nvar keys = require('./keys');\n\n\n/**\n * Takes a predicate and a \"filterable\", and returns a new filterable of the\n * same type containing the members of the given filterable which satisfy the\n * given predicate.\n *\n * Dispatches to the `filter` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array}\n * @see R.reject, R.transduce, R.addIndex\n * @example\n *\n * var isEven = n => n % 2 === 0;\n *\n * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nmodule.exports = _curry2(_dispatchable('filter', _xfilter, function(pred, filterable) {\n return (\n _isObject(filterable) ?\n _reduce(function(acc, key) {\n if (pred(filterable[key])) {\n acc[key] = filterable[key];\n }\n return acc;\n }, {}, keys(filterable)) :\n // else\n _filter(pred, filterable)\n );\n}));\n","import { curry, prop, over, filter } from \"ramda\";\nimport { StateLenses, pushHistoryState } from \"./utils\";\nimport Maybe from \"data.maybe\";\n\n// State -> Object -> State\nconst historyStateWithoutField = curry((state, fieldState) =>\n over(\n StateLenses.fieldsState,\n filter(fs => fs.id !== fieldState.id),\n state\n )\n);\n\nexport default (state, { fieldState }) =>\n Maybe.fromNullable(fieldState)\n .map(historyStateWithoutField(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .getOrElse(state);\n","import { curry, prop, over, map } from \"ramda\";\nimport { StateLenses, pushHistoryState, validateField } from \"./utils\";\n\n// State -> Object -> State\nconst updateFieldState = curry((state, newFieldState) =>\n over(\n StateLenses.fieldsState,\n map(fs => fs.id === newFieldState.id ? newFieldState : fs),\n state\n )\n);\n\nexport default (state, { newFieldState }) =>\n validateField(newFieldState) // Either\n .map(updateFieldState(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .leftMap(console.error)\n .getOrElse(state);\n","var _curry2 = require('./internal/_curry2');\nvar _slice = require('./internal/_slice');\n\n\n/**\n * Returns a copy of the list, sorted according to the comparator function,\n * which should accept two values at a time and return a negative number if the\n * first value is smaller, a positive number if it's larger, and zero if they\n * are equal. Please note that this is a **copy** of the list. It does not\n * modify the original.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a,a -> Number) -> [a] -> [a]\n * @param {Function} comparator A sorting function :: a -> b -> Int\n * @param {Array} list The list to sort\n * @return {Array} a new array with its elements sorted by the comparator function.\n * @example\n *\n * var diff = function(a, b) { return a - b; };\n * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]\n */\nmodule.exports = _curry2(function sort(comparator, list) {\n return _slice(list).sort(comparator);\n});\n","/* eslint-disable new-cap */\nimport { curry, pipe, prop, over, sort } from \"ramda\";\nimport { hideConfigs, StateLenses, pushHistoryState } from \"./utils\";\nimport Either from \"data.either\";\n\n// State -> Object -> State\nconst historyStateWithNewOrder = curry((state, newOrder) => pipe(\n hideConfigs,\n over(\n StateLenses.fieldsState,\n sort((f1, f2) => newOrder.indexOf(f1.id) - newOrder.indexOf(f2.id))\n )\n)(state));\n\nexport default (state, { newFieldsOrder }) =>\n (newFieldsOrder && Array.isArray(newFieldsOrder)\n ? Either.Right(newFieldsOrder)\n : Either.Left(`newFieldsOrder must be an array but received ${typeof newFieldsOrder}`)\n )\n .chain(o =>\n o.length === state.fieldsState.length\n ? Either.Right(o)\n : Either.Left(`newFieldsOrder has ${o.length} elements, but the current state has ${state.fieldsState.length} elements`) // eslint-disable-line max-len\n )\n .chain(o => {\n const stateIds = state.fieldsState.map(prop(\"id\"));\n const noMissingId = stateIds.reduce((acc, fId) => acc && o.includes(fId), true);\n return noMissingId\n ? Either.Right(o)\n : Either.Left(\"Not all ids in the new order are matched in the existing state ids.\");\n })\n .map(historyStateWithNewOrder(state))\n .map(prop(\"fieldsState\"))\n .map(pushHistoryState(state))\n .leftMap(err => console.error(`Unable to reorder: ${err}`))\n .getOrElse(state);\n","/* @flow weak */\n/* eslint-disable new-cap */\nimport { StateLenses, propertyTypeCheck } from \"./utils\";\nimport { over, traverse, curry } from \"ramda\";\nimport Either from \"data.either\";\n\n// [a] => Either String [a]\nconst isArray = arr =>\n Array.isArray(arr)\n ? Either.Right(arr)\n : Either.Left(`Expected Array but received ${typeof arr}`); // eslint-disable-line max-len\n\n// Object -> Either String Object\nconst hasRequiredInfo = component =>\n propertyTypeCheck(\"initialState\", \"function\", component)\n .chain(propertyTypeCheck(\"RenderEditor\", \"function\"))\n .chain(propertyTypeCheck(\"info\", \"object\"))\n .chain(c => Either.fromNullable(c.info))\n .chain(propertyTypeCheck(\"type\", \"string\"))\n .chain(propertyTypeCheck(\"displayName\", \"string\"))\n .chain(propertyTypeCheck(\"group\", \"string\"))\n .chain(_ => Either.Right(component));\n\nconst isComponentValid = customComponents =>\n traverse(Either.of, hasRequiredInfo, customComponents);\n\n// [a] -> [a] -> Either String [a]\nconst validateComponents = customComponents =>\n Either.Right(customComponents)\n .chain(isArray)\n .chain(isComponentValid);\n\nconst addToFieldTypes = curry((state, customComponents) =>\n over(StateLenses.fieldTypes, s => s.concat(customComponents), state)\n);\n\n// If there are any problems with the import, the same state\n// will be returned\nexport default (state, { customComponents }) =>\n (customComponents\n ? Either.Right(customComponents)\n : Either.Left(\"Empty custom components\")\n )\n .chain(validateComponents)\n .leftMap(err => console.error(\"Invalid custom components:\", err))\n .map(addToFieldTypes(state))\n .getOrElse(state);\n","/* eslint-disable no-nested-ternary */\nimport assert from \"fl-assert\";\nimport undo from \"./undo\";\nimport importState from \"./importState\";\nimport createField from \"./createField\";\nimport fieldCreated from \"./fieldCreated\";\nimport toggleConfig from \"./field.toggleConfig\";\nimport toggleRequired from \"./field.toggleRequired\";\nimport deleteField from \"./field.deleteField\";\nimport updateField from \"./field.updateField\";\nimport reorderFields from \"./reorderFields\";\nimport importCustomComponents from \"./importCustomComponents\";\n\nconst actionHandlers = {\n undo,\n importState,\n createField,\n fieldCreated,\n toggleConfig,\n toggleRequired,\n deleteField,\n updateField,\n reorderFields,\n importCustomComponents,\n};\n\nconst isExpectedAction = a => a && a.type && actionHandlers[a.type];\nconst isReduxAction = a => a && a.type && a.type.includes(\"@@redux\");\n\n\nconst update = (state, action) =>\n isExpectedAction(action)\n ? actionHandlers[action.type](state, action)\n : isReduxAction(action)\n ? state\n : assert(false, `Invalid action type: ${action.type}`);\n\nexport default update;\n","/* eslint-env jasmine */\n\nimport { undo as undoAction } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst currentFieldsState = [\"current\"];\nconst oldFieldsState = [\"old\"];\nconst mockState = {\n fieldTypes: [],\n fieldsState: currentFieldsState,\n fieldsStateHistory: [oldFieldsState],\n};\n\nconst emptyMockState = {\n fieldTypes: [],\n fieldsState: [],\n fieldsStateHistory: [],\n};\n\nconst emptyHistoryMockState = {\n fieldTypes: [],\n fieldsState: currentFieldsState,\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.undo\", () => {\n it(\"removes first old state from history\", () => {\n const modifiedState = update(mockState, undoAction());\n expect(modifiedState.fieldsStateHistory.length).toEqual(0);\n });\n\n it(\"sets first old state as current state\", () => {\n const modifiedState = update(mockState, undoAction());\n expect(modifiedState.fieldsState).toEqual(oldFieldsState);\n });\n\n it(\"doesn't modify the state if there aren't more history states to undo\", () => {\n const modifiedState = update(emptyMockState, undoAction());\n expect(modifiedState).toEqual(emptyMockState);\n });\n\n it(\"set's the current state to empty if there are no more history states\", () => {\n const modifiedState = update(emptyHistoryMockState, undoAction());\n expect(modifiedState.fieldsState.length).toEqual(0);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { importState } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst typesArray = [{\n \"info\": {\n \"type\": \"RadioButtons\",\n },\n}, {\n \"info\": {\n \"type\": \"Checkboxes\",\n },\n}, {\n \"info\": {\n \"type\": \"Dropdown\",\n },\n}, {\n \"info\": {\n \"type\": \"TextBox\",\n },\n}, {\n \"info\": {\n \"type\": \"EmailBox\",\n },\n}, {\n \"info\": {\n \"type\": \"TelephoneBox\",\n },\n}, {\n \"info\": {\n \"type\": \"NumberBox\",\n },\n}, {\n \"info\": {\n \"type\": \"TextArea\",\n },\n}, {\n \"info\": {\n \"type\": \"DateField\",\n },\n}];\n\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: typesArray,\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst newValidState = [{\n \"type\": \"Checkboxes\",\n \"displayName\": \"Checkboxes\",\n \"group\": \"Options Components\",\n \"htmlInputType\": \"checkbox\",\n \"title\": \"Add a title\",\n \"id\": 2,\n \"options\": [{\n \"caption\": \"Insert an option\",\n }],\n \"newOptionCaption\": \"\",\n}];\n\nconst newInvalidState = [{\n \"type\": \"Invalid type\",\n \"displayName\": \"Checkboxes\",\n \"group\": \"Options Components\",\n \"htmlInputType\": \"checkbox\",\n \"title\": \"Add a title\",\n \"options\": [{\n \"caption\": \"Insert an option\",\n }],\n \"newOptionCaption\": \"\",\n}];\n\ndescribe(\"Update.importState\", () => {\n it(\"Returns an unchanged array if the new state is invalid\", () => {\n expect(update(mockState, importState({}))).toEqual(mockState);\n expect(update(mockState, importState(null))).toEqual(mockState);\n });\n\n it(\"Returns an unchanged array if the a field's type is not in fieldTypes\", () => {\n expect(update(mockState, importState(newInvalidState))).toEqual(mockState);\n });\n\n it(\"Sends the last current state to the history\", () => {\n const updated = update(mockState, importState(newValidState));\n expect(updated.fieldsStateHistory[0].toString()).toEqual(mockCurrentState.toString());\n expect(updated.fieldsStateHistory.length).toEqual(mockHistory.length + 1);\n });\n\n it(\"Sets the new state as current\", () => {\n const updated = update(mockState, importState(newValidState));\n expect(updated.fieldsState[0].type).toEqual(newValidState[0].type);\n expect(updated.fieldsState[0].type).not.toEqual(undefined);\n expect(updated.fieldsState[0].displayName).toEqual(newValidState[0].displayName);\n expect(updated.fieldsState[0].displayName).not.toEqual(undefined);\n expect(updated.fieldsState[0].group).toEqual(newValidState[0].group);\n expect(updated.fieldsState[0].group).not.toEqual(undefined);\n });\n\n it(\"Makes sure all ids are strings\", () => {\n const validState2 = newValidState\n .map((v, idx) => idx !== 0 ? v : Object.assign({}, v, { id: 2 }));\n const updated = update(mockState, importState(validState2));\n expect(typeof updated.fieldsState[0].id).toEqual(\"string\");\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { createField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst promiseTypeInstance = { type: \"promise-instance\" };\nconst promiseType = {\n info: { type: \"PromiseType\" },\n initialState: () => Promise.resolve(promiseTypeInstance),\n};\n\nconst syncTypeInstance = { type: \"sync-instance\" };\nconst syncType = {\n info: { type: \"SyncType\" },\n initialState: () => syncTypeInstance,\n};\n\nconst typesArray = [promiseType, syncType];\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: typesArray,\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\ndescribe(\"Update.createField\", () => {\n it(\"creates fields asynchronously\", done => {\n const asyncDispatch = v => {\n expect(v).not.toEqual(undefined);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"returns a 'fieldCreated' action when field is created\", done => {\n const asyncDispatch = action => {\n expect(action.type).toEqual(\"fieldCreated\");\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"creates types with constructors that return a plain object\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState).not.toEqual(undefined);\n expect(action.createdFieldState.type).toEqual(syncTypeInstance.type);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(syncType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"creates types with constructors that return a promise\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState).not.toEqual(undefined);\n expect(action.createdFieldState.type).toEqual(promiseTypeInstance.type);\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(promiseType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"adds required fields to instance\", done => {\n const asyncDispatch = action => {\n expect(action.createdFieldState.id).not.toEqual(undefined);\n expect(typeof action.createdFieldState.configShowing).toEqual(\"boolean\");\n done();\n };\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(promiseType.info.type)\n );\n\n update(mockState, asyncAcion);\n });\n\n it(\"does not create a field if type is not in model.fieldTypes\", done => {\n const asyncDispatch = jasmine.createSpy(\"asyncDispatch\");\n\n const asyncAcion = Object.assign(\n { asyncDispatch },\n createField(\"non-existing-type\")\n );\n\n update(mockState, asyncAcion);\n\n setTimeout(\n () => { expect(asyncDispatch).not.toHaveBeenCalled(); done(); },\n 50\n );\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { fieldCreated } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst createdFieldState = { type: \"fictitious-instance\" };\nconst mockCurrentState = [\"a\", \"b\"];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldCreatedAction = fieldCreated(createdFieldState);\nconst newState = update(mockState, fieldCreatedAction);\n\ndescribe(\"Update.fieldCreated\", () => {\n it(\"outputs a state with the new field included\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length + 1);\n expect(\n newState.fieldsState\n .find(v => v.type === createdFieldState.type)\n ).not.toEqual(undefined);\n });\n\n it(\"sends the current state to history\", () => {\n expect(newState.fieldsStateHistory[0][0]).toEqual(mockCurrentState[0]);\n expect(newState.fieldsStateHistory[0][1]).toEqual(mockCurrentState[1]);\n });\n\n it(\"Returns the current state if no new field is given to it\", () => {\n const sameState = update(mockState, fieldCreated(null));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after creating one object\", () => {\n const changed1 = update(mockState, fieldCreated(createdFieldState));\n const changed2 = update(changed1, fieldCreated(createdFieldState));\n const changed3 = update(changed2, fieldCreated(createdFieldState));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockCurrentState.length + 3);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n\nimport { toggleConfig } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\n\nconst fieldStateConfigShowing = {\n id: 123,\n configShowing: true,\n};\n\nconst fieldStateConfigNotShowing = {\n id: 321,\n configShowing: false,\n};\n\nconst mockState = {\n fieldTypes: [],\n fieldsState: [fieldStateConfigShowing, fieldStateConfigNotShowing],\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.toggleConfig\", () => {\n it(\"turns the config option to false when needed\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigShowing));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateConfigShowing.id)\n .configShowing\n ).toEqual(false);\n });\n\n it(\"turns the config option to true when needed\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigNotShowing));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateConfigShowing.id)\n .configShowing\n ).toEqual(true);\n });\n\n it(\"adds the last state to the history\", () => {\n const modifiedState = update(mockState, toggleConfig(fieldStateConfigShowing));\n expect(modifiedState.fieldsStateHistory.length).toEqual(1);\n expect(modifiedState.fieldsStateHistory[0][0].id).toEqual(mockState.fieldsState[0].id);\n expect(modifiedState.fieldsStateHistory[0][1].id).toEqual(mockState.fieldsState[1].id);\n });\n});\n","/* eslint-env jasmine */\n\nimport { toggleRequired } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\n\nconst fieldStateIsRequired = {\n id: 123,\n required: true,\n};\n\nconst fieldStateIsNotRequired = {\n id: 321,\n required: false,\n};\n\nconst mockState = {\n fieldTypes: [],\n fieldsState: [fieldStateIsRequired, fieldStateIsNotRequired],\n fieldsStateHistory: [],\n};\n\ndescribe(\"Update.toggleRequired\", () => {\n it(\"turns the required option to false when needed\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsRequired));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateIsRequired.id)\n .required\n ).toEqual(false);\n });\n\n it(\"turns the required option to true when needed\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsNotRequired));\n expect(\n modifiedState.fieldsState\n .find(f => f.id === fieldStateIsRequired.id)\n .required\n ).toEqual(true);\n });\n\n it(\"adds the last state to the history\", () => {\n const modifiedState = update(mockState, toggleRequired(fieldStateIsRequired));\n expect(modifiedState.fieldsStateHistory.length).toEqual(1);\n expect(modifiedState.fieldsStateHistory[0][0].id).toEqual(mockState.fieldsState[0].id);\n expect(modifiedState.fieldsStateHistory[0][1].id).toEqual(mockState.fieldsState[1].id);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { deleteField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst toBeDeletedFieldState = { type: \"fictitious-instance\", id: 0 };\nconst mockCurrentState = [toBeDeletedFieldState, { id: 1 }, { id: 2 }];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldDeleteAction = deleteField(toBeDeletedFieldState);\nconst newState = update(mockState, fieldDeleteAction);\n\ndescribe(\"Update.deleteField\", () => {\n it(\"outputs a state without the field included\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length - 1);\n expect(\n newState.fieldsState\n .find(v => v.id === toBeDeletedFieldState.id)\n ).toEqual(undefined);\n });\n\n it(\"sends the current state to history\", () => {\n const recentHistoryState = newState.fieldsStateHistory[0];\n expect(recentHistoryState.length).toEqual(mockCurrentState.length);\n expect(recentHistoryState[0].id).toEqual(mockCurrentState[0].id);\n expect(recentHistoryState[1].id).toEqual(mockCurrentState[1].id);\n });\n\n it(\"Returns the current state if no new field is given to it\", () => {\n const sameState = update(mockState, deleteField(null));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after deleting a field\", () => {\n const mockField1 = Object.assign({}, toBeDeletedFieldState, { id: 5 });\n const mockField2 = Object.assign({}, toBeDeletedFieldState, { id: 6 });\n const mockField3 = Object.assign({}, toBeDeletedFieldState, { id: 7 });\n\n const mockState2 = Object.assign({}, mockState, {\n fieldsState: [\n mockField1,\n mockField2,\n mockField3,\n ],\n });\n const changed1 = update(mockState2, deleteField(mockField1));\n const changed2 = update(changed1, deleteField(mockField2));\n const changed3 = update(changed2, deleteField(mockField3));\n expect(changed3.fieldTypes.length).toEqual(mockState2.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockState2.fieldsState.length - 3);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { updateField } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst oldFieldState = {\n type: \"fictitious-instance\",\n id: \"0\",\n configShowing: false,\n required: false,\n color: \"blue\",\n};\nconst newFieldState = Object.assign({}, oldFieldState, { color: \"green\" });\nconst mockCurrentState = [oldFieldState, { id: 1 }, { id: 2 }];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst fieldUpdateAction = updateField(newFieldState);\nconst newState = update(mockState, fieldUpdateAction);\n\ndescribe(\"Update.updateField\", () => {\n it(\"outputs a state the field updated\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(\n newState.fieldsState\n .find(v => v.color === newFieldState.color)\n ).not.toEqual(undefined);\n });\n\n it(\"outputs a state the updated field in the correct order\", () => {\n expect(newState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(newState.fieldsState[0].color).toEqual(newFieldState.color);\n });\n\n it(\"sends the current state to history\", () => {\n const recentHistoryState = newState.fieldsStateHistory[0];\n expect(recentHistoryState.length).toEqual(mockCurrentState.length);\n expect(recentHistoryState[0].id).toEqual(mockCurrentState[0].id);\n expect(recentHistoryState[0].color).toEqual(mockCurrentState[0].color);\n });\n\n it(\"Returns the current state if an invalid field state is given to it\", () => {\n const isSame = (state1, state2) => {\n expect(state1.fieldTypes.length).toEqual(state2.fieldTypes.length);\n expect(state1.fieldsState.length).toEqual(state2.fieldsState.length);\n expect(state1.fieldsState[0].color).toEqual(state2.fieldsState[0].color);\n expect(state1.fieldsState[0].id).toEqual(state2.fieldsState[0].id);\n expect(state1.fieldsStateHistory.length).toEqual(state2.fieldsStateHistory.length);\n };\n\n const sameState1 = update(mockState, updateField(null));\n isSame(mockState, sameState1);\n\n const sameState2 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { id: null }))\n );\n isSame(mockState, sameState2);\n\n const sameState3 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { configShowing: null }))\n );\n isSame(mockState, sameState3);\n\n const sameState4 = update(\n mockState,\n updateField(Object.assign({}, newFieldState, { required: null }))\n );\n\n isSame(mockState, sameState4);\n });\n\n it(\"does not break the state after updating a field multiple times a field\", () => {\n const mockField1 = Object.assign({}, oldFieldState, { color: \"yellow\" });\n const mockField2 = Object.assign({}, oldFieldState, { color: \"orange\" });\n const mockField3 = Object.assign({}, oldFieldState, { color: \"purple\" });\n\n const changed1 = update(mockState, updateField(mockField1));\n const changed2 = update(changed1, updateField(mockField2));\n const changed3 = update(changed2, updateField(mockField3));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(changed3.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(changed3.fieldsState[0].color).toEqual(mockField3.color);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { reorderFields } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst templateField = {\n type: \"fictitious-instance\",\n required: false,\n configShowing: false,\n id: \"0\",\n};\nconst field1 = Object.assign({}, templateField, { id: \"1\" });\nconst field2 = Object.assign({}, templateField, { id: \"2\" });\nconst field3 = Object.assign({}, templateField, { id: \"3\" });\nconst mockCurrentState = [field1, field2, field3];\nconst mockHistory = [];\nconst mockState = {\n fieldTypes: [{ info: { type: \"fictitious-instance\" } }],\n fieldsState: mockCurrentState,\n fieldsStateHistory: mockHistory,\n};\n\nconst newOrder = [\"2\", \"3\", \"1\"];\nconst reorderFieldsAction = reorderFields(newOrder);\nconst newState = update(mockState, reorderFieldsAction);\n\ndescribe(\"Update.reorderFields\", () => {\n it(\"outputs a state with fields in the new order\", () => {\n expect(newState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(newState.fieldsState[0].id).toEqual(newOrder[0]);\n expect(newState.fieldsState[1].id).toEqual(newOrder[1]);\n expect(newState.fieldsState[2].id).toEqual(newOrder[2]);\n });\n\n it(\"sends the current state to history\", () => {\n expect(newState.fieldsStateHistory[0][0].id).toEqual(mockCurrentState[0].id);\n expect(newState.fieldsStateHistory[0][1].id).toEqual(mockCurrentState[1].id);\n expect(newState.fieldsStateHistory[0][2].id).toEqual(mockCurrentState[2].id);\n });\n\n it(\"Returns the current state if any field id is missing\", () => {\n const sameState = update(mockState, reorderFields([\"1\", \"2\"]));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(sameState.fieldsState[1].id).toEqual(mockState.fieldsState[1].id);\n expect(sameState.fieldsState[2].id).toEqual(mockState.fieldsState[2].id);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"Returns the current state if the reorder array has more elements than it should\", () => {\n const sameState = update(mockState, reorderFields([\"1\", \"2\", \"3\", \"4\"]));\n expect(sameState.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(sameState.fieldsState[0].id).toEqual(mockState.fieldsState[0].id);\n expect(sameState.fieldsState[1].id).toEqual(mockState.fieldsState[1].id);\n expect(sameState.fieldsState[2].id).toEqual(mockState.fieldsState[2].id);\n expect(sameState.fieldsState.length).toEqual(mockState.fieldsState.length);\n expect(sameState.fieldsStateHistory.length).toEqual(mockState.fieldsStateHistory.length);\n });\n\n it(\"does not break the state after creating one object\", () => {\n const changed1 = update(mockState, reorderFields([\"1\", \"2\", \"3\"]));\n const changed2 = update(changed1, reorderFields([\"3\", \"1\", \"2\"]));\n const changed3 = update(changed2, reorderFields([\"3\", \"2\", \"1\"]));\n expect(changed3.fieldTypes.length).toEqual(mockState.fieldTypes.length);\n expect(changed3.fieldsState.length).toEqual(mockCurrentState.length);\n expect(changed3.fieldsStateHistory.length).toEqual(3);\n expect(changed3.fieldsState[0].id).toEqual(\"3\");\n expect(changed3.fieldsState[1].id).toEqual(\"2\");\n expect(changed3.fieldsState[2].id).toEqual(\"1\");\n });\n});\n","/* eslint-env jasmine */\n/* eslint-disable quote-props */\n\nimport { importCustomComponents } from \"../../js/Actions\";\nimport update from \"../../js/Update\";\n\nconst createType = name => ({\n initialState: _ => _,\n RenderEditor: _ => _,\n info: { type: name, group: \"custom\", displayName: name },\n});\n\nconst mockState = {\n fieldTypes: [createType(\"fictitious-instance\")],\n fieldsState: [],\n fieldsStateHistory: [],\n};\n\nconst customTypes = [\n createType(\"custom-1\"),\n createType(\"custom-2\"),\n createType(\"custom-3\"),\n];\n\nconst importCustomComponentsAction = importCustomComponents(customTypes);\nconst newState = update(mockState, importCustomComponentsAction);\n\n\ndescribe(\"Update.importCustomComponents\", () => {\n it(\"Appends the new valid custom types to the end of the existing types\", () => {\n expect(newState.fieldTypes.length).toEqual(mockState.fieldTypes.length + customTypes.length);\n expect(newState.fieldTypes[1].info.type).toEqual(customTypes[0].info.type);\n expect(newState.fieldTypes[2].info.type).toEqual(customTypes[1].info.type);\n expect(newState.fieldTypes[3].info.type).toEqual(customTypes[2].info.type);\n });\n\n it(\"Returns an unchanged array if customTypes is invalid\", () => {\n expect(update(mockState, importCustomComponents(null))).toEqual(mockState);\n\n const invalid1 = [\n Object.assign({}, createType(\"custom-1\"), { info: null }),\n ];\n expect(update(mockState, importCustomComponents(invalid1))).toEqual(mockState);\n\n const invalid2 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: null, group: \"custom\", displayName: \"custom\" } }),\n ];\n expect(update(mockState, importCustomComponents(invalid2))).toEqual(mockState);\n\n const invalid3 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: \"custom\", group: null, displayName: \"custom\" } }\n ),\n ];\n expect(update(mockState, importCustomComponents(invalid3))).toEqual(mockState);\n\n const invalid4 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { info: { type: \"custom\", group: \"custom\", displayName: null } }),\n ];\n expect(update(mockState, importCustomComponents(invalid4))).toEqual(mockState);\n\n const invalid5 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { RenderEditor: \"not a function\" }),\n ];\n expect(update(mockState, importCustomComponents(invalid5))).toEqual(mockState);\n\n const invalid6 = [\n Object.assign(\n {},\n createType(\"custom-1\"),\n { initialState: \"not a function\" }),\n ];\n expect(update(mockState, importCustomComponents(invalid6))).toEqual(mockState);\n });\n});\n"],"names":["undo","importCustomComponents","importState","createField","fieldCreated","toggleConfig","toggleRequired","deleteField","updateField","reorderFields","describe","action","type","toEqual","mockStateToImport","newFieldsState","fieldType","createdFieldState","fieldState","newFieldState","newFieldsOrder","customComponents","define","asyncDispatchMiddleware","syncActivityFinished","actionQueue","flushQueue","forEach","store","dispatch","a","asyncDispatch","asyncAction","concat","actionWithAsyncDispatch","Immutable","merge","fakeAction","done","next","returnedAction","not","undefined","fakeAsyncAction","fakeStore","Either","require$$0","updateAt","_default","keyArray","newVal","obj","deepNewVal","reduceRight","result","key","deep","StateLenses","_default2","_default3","createId","Date","now","Math","random","toString","pushHistoryState","state","newHistoryState","_default4","fieldsStateHistory","_default6","fieldsState","hideConfigs","_default7","map","Object","assign","s","configShowing","propertyTypeCheck","propertyName","babelHelpers.typeof","Right","Left","validateField","fromNullable","leftMap","fs","chain","lastHistoryState","_","Infinity","isArray","Array","arr","fieldTypeIsValid","validTypes","field","find","validFieldTypes","of","validateFieldsState","fieldTypes","addRequiredProperties","fieldStates","id","bimap","console","error","getOrElse","Task","typeConstructor","v","info","reject","resolve","called","constr","initialState","Promise","then","catch","insertRequiredProps","createFieldAsynchronously","rejected","fork","err","Maybe","clone","unimplemented","noop","historyStateWithNewField","newField","_default5","set","replaceFieldState","aField","required","historyStateWithoutField","updateFieldState","historyStateWithNewOrder","newOrder","f1","f2","indexOf","o","length","stateIds","noMissingId","reduce","acc","fId","includes","hasRequiredInfo","component","c","isComponentValid","validateComponents","addToFieldTypes","actionHandlers","isExpectedAction","isReduxAction","update","assert","currentFieldsState","oldFieldsState","mockState","emptyMockState","emptyHistoryMockState","modifiedState","undoAction","typesArray","mockCurrentState","mockHistory","newValidState","newInvalidState","updated","displayName","group","validState2","idx","promiseTypeInstance","promiseType","syncTypeInstance","syncType","asyncAcion","jasmine","createSpy","toHaveBeenCalled","fieldCreatedAction","newState","sameState","changed1","changed2","changed3","fieldStateConfigShowing","fieldStateConfigNotShowing","f","fieldStateIsRequired","fieldStateIsNotRequired","toBeDeletedFieldState","fieldDeleteAction","recentHistoryState","mockField1","mockField2","mockField3","mockState2","oldFieldState","color","fieldUpdateAction","isSame","state1","state2","sameState1","sameState2","sameState3","sameState4","templateField","field1","field2","field3","reorderFieldsAction","createType","name","customTypes","importCustomComponentsAction","invalid1","invalid2","invalid3","invalid4","invalid5","RenderEditor","invalid6"],"mappings":"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","preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvQWN0aW9ucy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvYWN0aW9ucy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvc2VhbWxlc3MtaW1tdXRhYmxlL3NyYy9zZWFtbGVzcy1pbW11dGFibGUuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL3V0aWxzL2FzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91dGlscy5hc3luY0Rpc3BhdGNoTWlkZGxld2FyZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZmwtYXNzZXJ0L2Rpc3QvYXNzZXJ0LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzQXJyYXkuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fc2xpY2UuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNQbGFjZWhvbGRlci5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeTEuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY3VycnkyLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2N1cnJ5My5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NsaWNlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvb3Zlci5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2Fsd2F5cy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NldC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19hcml0eS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19waXBlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3h3cmFwLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYmluZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc1N0cmluZy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2lzQXJyYXlMaWtlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3JlZHVjZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3JlZHVjZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3RhaWwuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9waXBlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2NvbmNhdC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3ByZXBlbmQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcm9wLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzVHJhbnNmb3JtZXIuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX21hcC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZkJhc2UuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feG1hcC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeU4uanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jdXJyeU4uanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faGFzLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMva2V5cy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21hcC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2xlbnMuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jdXJyeS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS5laXRoZXIvbGliL2VpdGhlci5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS5laXRoZXIvbGliL2luZGV4LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvdXRpbHMuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS91bmRvLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lkZW50aXR5LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaWRlbnRpdHkuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wYXRoLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXAuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9yZWR1Y2VSaWdodC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NlcXVlbmNlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdHJhdmVyc2UuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fYXJyYXlGcm9tSXRlcmF0b3IuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZnVuY3Rpb25OYW1lLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaWRlbnRpY2FsLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdHlwZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19lcXVhbHMuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9lcXVhbHMuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9pbXBvcnRTdGF0ZS5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19yZWR1Y2VkLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3hmaW5kLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZmluZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvZGF0YS50YXNrL2xpYi90YXNrLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLnRhc2svbGliL2luZGV4LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvY3JlYXRlRmllbGQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9hcHBlbmQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvbm9kZV9tb2R1bGVzL2RhdGEubWF5YmUvbGliL21heWJlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9kYXRhLm1heWJlL2xpYi9pbmRleC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ZpZWxkQ3JlYXRlZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ZpZWxkLnRvZ2dsZUNvbmZpZy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2ZpZWxkLnRvZ2dsZVJlcXVpcmVkLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2ZpbHRlci5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc09iamVjdC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZmlsdGVyLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZmlsdGVyLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvZmllbGQuZGVsZXRlRmllbGQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9maWVsZC51cGRhdGVGaWVsZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NvcnQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL2pzL1VwZGF0ZS9yZW9yZGVyRmllbGRzLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy9qcy9VcGRhdGUvaW1wb3J0Q3VzdG9tQ29tcG9uZW50cy5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvanMvVXBkYXRlL2luZGV4LmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvdW5kby5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ltcG9ydFN0YXRlLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvY3JlYXRlRmllbGQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9maWVsZENyZWF0ZWQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9maWVsZC50b2dnbGVDb25maWcuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9maWVsZC50b2dnbGVSZXF1aXJlZC5qcyIsIi9ob21lL21hcmNlbG8vUHJvZ3JhbXMvRm91ckxhYnMvVXRpbGl0aWVzL2ZsLWZvcm0tYnVpbGRlci9zcmMvdGVzdHMvdXBkYXRlL2ZpZWxkLmRlbGV0ZUZpZWxkLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvZmllbGQudXBkYXRlRmllbGQuanMiLCIvaG9tZS9tYXJjZWxvL1Byb2dyYW1zL0ZvdXJMYWJzL1V0aWxpdGllcy9mbC1mb3JtLWJ1aWxkZXIvc3JjL3Rlc3RzL3VwZGF0ZS9yZW9yZGVyRmllbGRzLmpzIiwiL2hvbWUvbWFyY2Vsby9Qcm9ncmFtcy9Gb3VyTGFicy9VdGlsaXRpZXMvZmwtZm9ybS1idWlsZGVyL3NyYy90ZXN0cy91cGRhdGUvaW1wb3J0Q3VzdG9tQ29tcG9uZW50cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvL1xuLy8gICAgQUNUSU9OIENSRUFUT1JTXG4vL1xuXG5leHBvcnQgY29uc3QgdW5kbyA9IF8gPT5cbih7XG4gIHR5cGU6IFwidW5kb1wiLFxufSk7XG5cbmV4cG9ydCBjb25zdCBpbXBvcnRDdXN0b21Db21wb25lbnRzID0gY3VzdG9tQ29tcG9uZW50cyA9PlxuKHtcbiAgdHlwZTogXCJpbXBvcnRDdXN0b21Db21wb25lbnRzXCIsXG4gIGN1c3RvbUNvbXBvbmVudHMsXG59KTtcblxuXG5leHBvcnQgY29uc3QgaW1wb3J0U3RhdGUgPSBuZXdGaWVsZHNTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJpbXBvcnRTdGF0ZVwiLFxuICBuZXdGaWVsZHNTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRmllbGQgPSBmaWVsZFR5cGUgPT5cbih7XG4gIHR5cGU6IFwiY3JlYXRlRmllbGRcIixcbiAgZmllbGRUeXBlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBmaWVsZENyZWF0ZWQgPSBjcmVhdGVkRmllbGRTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJmaWVsZENyZWF0ZWRcIixcbiAgY3JlYXRlZEZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHRvZ2dsZUNvbmZpZyA9IGZpZWxkU3RhdGUgPT5cbih7XG4gIHR5cGU6IFwidG9nZ2xlQ29uZmlnXCIsXG4gIGZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHRvZ2dsZVJlcXVpcmVkID0gZmllbGRTdGF0ZSA9PlxuKHtcbiAgdHlwZTogXCJ0b2dnbGVSZXF1aXJlZFwiLFxuICBmaWVsZFN0YXRlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBkZWxldGVGaWVsZCA9IGZpZWxkU3RhdGUgPT5cbih7XG4gIHR5cGU6IFwiZGVsZXRlRmllbGRcIixcbiAgZmllbGRTdGF0ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlRmllbGQgPSBuZXdGaWVsZFN0YXRlID0+XG4oe1xuICB0eXBlOiBcInVwZGF0ZUZpZWxkXCIsXG4gIG5ld0ZpZWxkU3RhdGUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHJlb3JkZXJGaWVsZHMgPSBuZXdGaWVsZHNPcmRlciA9PlxuKHtcbiAgdHlwZTogXCJyZW9yZGVyRmllbGRzXCIsXG4gIG5ld0ZpZWxkc09yZGVyLFxufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cblxuaW1wb3J0IHtcbiAgdW5kbyxcbiAgaW1wb3J0U3RhdGUsXG4gIGNyZWF0ZUZpZWxkLFxuICBmaWVsZENyZWF0ZWQsXG4gIHRvZ2dsZUNvbmZpZyxcbiAgdG9nZ2xlUmVxdWlyZWQsXG4gIGRlbGV0ZUZpZWxkLFxuICB1cGRhdGVGaWVsZCxcbiAgcmVvcmRlckZpZWxkcyxcbiAgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyxcbn0gZnJvbSBcIi4uL2pzL0FjdGlvbnNcIjtcblxuZGVzY3JpYmUoXCJBY3Rpb25cIiwgKCkgPT4ge1xuICBkZXNjcmliZShcInVuZG9cIiwgKCkgPT4ge1xuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB1bmRvKCk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJ1bmRvXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImltcG9ydFN0YXRlXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2NrU3RhdGVUb0ltcG9ydCA9IFtcImFcIiwgXCJiXCJdO1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGltcG9ydFN0YXRlKG1vY2tTdGF0ZVRvSW1wb3J0KTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcImltcG9ydFN0YXRlXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpbXBvcnRTdGF0ZShtb2NrU3RhdGVUb0ltcG9ydCk7XG4gICAgICBleHBlY3QoYWN0aW9uLm5ld0ZpZWxkc1N0YXRlKS50b0VxdWFsKG1vY2tTdGF0ZVRvSW1wb3J0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJjcmVhdGVGaWVsZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGRUeXBlID0gXCJ0ZXN0RmllbGRcIjtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVGaWVsZChmaWVsZFR5cGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiY3JlYXRlRmllbGRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZpZWxkKGZpZWxkVHlwZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLmZpZWxkVHlwZSkudG9FcXVhbChmaWVsZFR5cGUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImZpZWxkQ3JlYXRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZEZpZWxkU3RhdGUgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiZmllbGRDcmVhdGVkXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZSkudG9FcXVhbChjcmVhdGVkRmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwidG9nZ2xlQ29uZmlnXCIsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZFN0YXRlID0ge307XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdG9nZ2xlQ29uZmlnKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwidG9nZ2xlQ29uZmlnXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVDb25maWcoZmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLmZpZWxkU3RhdGUpLnRvRXF1YWwoZmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwidG9nZ2xlUmVxdWlyZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcInRvZ2dsZVJlcXVpcmVkXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uZmllbGRTdGF0ZSkudG9FcXVhbChmaWVsZFN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJkZWxldGVGaWVsZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGRTdGF0ZSA9IHt9O1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGRlbGV0ZUZpZWxkKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKFwiZGVsZXRlRmllbGRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGRlbGV0ZUZpZWxkKGZpZWxkU3RhdGUpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5maWVsZFN0YXRlKS50b0VxdWFsKGZpZWxkU3RhdGUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcInVwZGF0ZUZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBuZXdGaWVsZFN0YXRlID0ge307XG5cbiAgICBpdChcInJldHVybnMgdGhlIGNvcnJlY3QgYWN0aW9uIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdXBkYXRlRmllbGQobmV3RmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJ1cGRhdGVGaWVsZFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiQ3JlYXRlcyB0aGUgY29ycmVjdCB2YXJpYWJsZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdXBkYXRlRmllbGQobmV3RmllbGRTdGF0ZSk7XG4gICAgICBleHBlY3QoYWN0aW9uLm5ld0ZpZWxkU3RhdGUpLnRvRXF1YWwobmV3RmllbGRTdGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwicmVvcmRlckZpZWxkc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgbmV3RmllbGRzT3JkZXIgPSB7fTtcblxuICAgIGl0KFwicmV0dXJucyB0aGUgY29ycmVjdCBhY3Rpb24gdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSByZW9yZGVyRmllbGRzKG5ld0ZpZWxkc09yZGVyKTtcbiAgICAgIGV4cGVjdChhY3Rpb24udHlwZSkudG9FcXVhbChcInJlb3JkZXJGaWVsZHNcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIkNyZWF0ZXMgdGhlIGNvcnJlY3QgdmFyaWFibGVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHJlb3JkZXJGaWVsZHMobmV3RmllbGRzT3JkZXIpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5uZXdGaWVsZHNPcmRlcikudG9FcXVhbChuZXdGaWVsZHNPcmRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiaW1wb3J0Q3VzdG9tQ29tcG9uZW50c1wiLCAoKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tQ29tcG9uZW50cyA9IFtdO1xuXG4gICAgaXQoXCJyZXR1cm5zIHRoZSBjb3JyZWN0IGFjdGlvbiB0eXBlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGltcG9ydEN1c3RvbUNvbXBvbmVudHMoY3VzdG9tQ29tcG9uZW50cyk7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJpbXBvcnRDdXN0b21Db21wb25lbnRzXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJDcmVhdGVzIHRoZSBjb3JyZWN0IHZhcmlhYmxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpbXBvcnRDdXN0b21Db21wb25lbnRzKGN1c3RvbUNvbXBvbmVudHMpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jdXN0b21Db21wb25lbnRzKS50b0VxdWFsKGN1c3RvbUNvbXBvbmVudHMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIiwiKGZ1bmN0aW9uKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gaW1tdXRhYmxlSW5pdChjb25maWcpIHtcblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MTUuMC4xL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDIxXG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xuICB2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFX0ZBTExCQUNLID0gMHhlYWM3O1xuXG4gIHZhciBnbG9iYWxDb25maWcgPSB7XG4gICAgdXNlX3N0YXRpYzogZmFsc2VcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KGNvbmZpZykpIHtcbiAgICAgIGlmIChjb25maWcudXNlX3N0YXRpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZ2xvYmFsQ29uZmlnLnVzZV9zdGF0aWMgPSBCb29sZWFuKGNvbmZpZy51c2Vfc3RhdGljKTtcbiAgICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgZGF0YSAhPT0gbnVsbFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KG9iaikge1xuICAgICAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAgICAgaWYgKCFwcm90b3R5cGUpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRQcm9wZXJ0eVRvKHRhcmdldCwgbWV0aG9kTmFtZSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBtZXRob2ROYW1lLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhblByb3BlcnR5KHRhcmdldCwgbWV0aG9kTmFtZSkge1xuICAgIGFkZFByb3BlcnR5VG8odGFyZ2V0LCBtZXRob2ROYW1lLCBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBJbW11dGFibGVFcnJvcihcIlRoZSBcIiArIG1ldGhvZE5hbWUgK1xuICAgICAgICBcIiBtZXRob2QgY2Fubm90IGJlIGludm9rZWQgb24gYW4gSW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlLlwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBpbW11dGFiaWxpdHlUYWcgPSBcIl9faW1tdXRhYmxlX2ludmFyaWFudHNfaG9sZFwiO1xuXG4gIGZ1bmN0aW9uIGFkZEltbXV0YWJpbGl0eVRhZyh0YXJnZXQpIHtcbiAgICBhZGRQcm9wZXJ0eVRvKHRhcmdldCwgaW1tdXRhYmlsaXR5VGFnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW1tdXRhYmxlKHRhcmdldCkge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0ID09PSBudWxsIHx8IEJvb2xlYW4oXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBpbW11dGFiaWxpdHlUYWcpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBKYXZhU2NyaXB0LCBvbmx5IG9iamVjdHMgYXJlIGV2ZW4gcG90ZW50aWFsbHkgbXV0YWJsZS5cbiAgICAgIC8vIHN0cmluZ3MsIG51bWJlcnMsIG51bGwsIGFuZCB1bmRlZmluZWQgYXJlIGFsbCBuYXR1cmFsbHkgaW1tdXRhYmxlLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gICAgLy8gQXZvaWQgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byAoTmFOICE9PSBOYU4pIGV2YWx1YXRpbmcgdG8gdHJ1ZVxuICAgIHJldHVybiAoYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc01lcmdhYmxlT2JqZWN0KHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQgIT09IG51bGwgJiYgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIiAmJiAhKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBEYXRlKTtcbiAgfVxuXG4gIHZhciBtdXRhdGluZ09iamVjdE1ldGhvZHMgPSBbXG4gICAgXCJzZXRQcm90b3R5cGVPZlwiXG4gIF07XG5cbiAgdmFyIG5vbk11dGF0aW5nT2JqZWN0TWV0aG9kcyA9IFtcbiAgICBcImtleXNcIlxuICBdO1xuXG4gIHZhciBtdXRhdGluZ0FycmF5TWV0aG9kcyA9IG11dGF0aW5nT2JqZWN0TWV0aG9kcy5jb25jYXQoW1xuICAgIFwicHVzaFwiLCBcInBvcFwiLCBcInNvcnRcIiwgXCJzcGxpY2VcIiwgXCJzaGlmdFwiLCBcInVuc2hpZnRcIiwgXCJyZXZlcnNlXCJcbiAgXSk7XG5cbiAgdmFyIG5vbk11dGF0aW5nQXJyYXlNZXRob2RzID0gbm9uTXV0YXRpbmdPYmplY3RNZXRob2RzLmNvbmNhdChbXG4gICAgXCJtYXBcIiwgXCJmaWx0ZXJcIiwgXCJzbGljZVwiLCBcImNvbmNhdFwiLCBcInJlZHVjZVwiLCBcInJlZHVjZVJpZ2h0XCJcbiAgXSk7XG5cbiAgdmFyIG11dGF0aW5nRGF0ZU1ldGhvZHMgPSBtdXRhdGluZ09iamVjdE1ldGhvZHMuY29uY2F0KFtcbiAgICBcInNldERhdGVcIiwgXCJzZXRGdWxsWWVhclwiLCBcInNldEhvdXJzXCIsIFwic2V0TWlsbGlzZWNvbmRzXCIsIFwic2V0TWludXRlc1wiLCBcInNldE1vbnRoXCIsIFwic2V0U2Vjb25kc1wiLFxuICAgIFwic2V0VGltZVwiLCBcInNldFVUQ0RhdGVcIiwgXCJzZXRVVENGdWxsWWVhclwiLCBcInNldFVUQ0hvdXJzXCIsIFwic2V0VVRDTWlsbGlzZWNvbmRzXCIsIFwic2V0VVRDTWludXRlc1wiLFxuICAgIFwic2V0VVRDTW9udGhcIiwgXCJzZXRVVENTZWNvbmRzXCIsIFwic2V0WWVhclwiXG4gIF0pO1xuXG4gIGZ1bmN0aW9uIEltbXV0YWJsZUVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm5hbWUgPSAnTXlFcnJvcic7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuICBJbW11dGFibGVFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbiAgSW1tdXRhYmxlRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXJyb3I7XG5cbiAgZnVuY3Rpb24gbWFrZUltbXV0YWJsZShvYmosIGJhbm5lZE1ldGhvZHMpIHtcbiAgICAvLyBUYWcgaXQgc28gd2UgY2FuIHF1aWNrbHkgdGVsbCBpdCdzIGltbXV0YWJsZSBsYXRlci5cbiAgICBhZGRJbW11dGFiaWxpdHlUYWcob2JqKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIC8vIE1ha2UgYWxsIG11dGF0aW5nIG1ldGhvZHMgdGhyb3cgZXhjZXB0aW9ucy5cbiAgICAgIGZvciAodmFyIGluZGV4IGluIGJhbm5lZE1ldGhvZHMpIHtcbiAgICAgICAgaWYgKGJhbm5lZE1ldGhvZHMuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XG4gICAgICAgICAgYmFuUHJvcGVydHkob2JqLCBiYW5uZWRNZXRob2RzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRnJlZXplIGl0IGFuZCByZXR1cm4gaXQuXG4gICAgICBPYmplY3QuZnJlZXplKG9iaik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VNZXRob2RSZXR1cm5JbW11dGFibGUob2JqLCBtZXRob2ROYW1lKSB7XG4gICAgdmFyIGN1cnJlbnRNZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07XG5cbiAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgbWV0aG9kTmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gSW1tdXRhYmxlKGN1cnJlbnRNZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5U2V0KGlkeCwgdmFsdWUsIGNvbmZpZykge1xuICAgIHZhciBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwO1xuXG4gICAgaWYgKGlkeCBpbiB0aGlzKSB7XG4gICAgICBpZiAoZGVlcCAmJiB0aGlzW2lkeF0gIT09IHZhbHVlICYmIGlzTWVyZ2FibGVPYmplY3QodmFsdWUpICYmIGlzTWVyZ2FibGVPYmplY3QodGhpc1tpZHhdKSkge1xuICAgICAgICB2YWx1ZSA9IEltbXV0YWJsZS5tZXJnZSh0aGlzW2lkeF0sIHZhbHVlLCB7ZGVlcDogdHJ1ZSwgbW9kZTogJ3JlcGxhY2UnfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNFcXVhbCh0aGlzW2lkeF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IGFzTXV0YWJsZUFycmF5LmNhbGwodGhpcyk7XG4gICAgbXV0YWJsZVtpZHhdID0gSW1tdXRhYmxlKHZhbHVlKTtcbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZUFycmF5KG11dGFibGUpO1xuICB9XG5cbiAgdmFyIGltbXV0YWJsZUVtcHR5QXJyYXkgPSBJbW11dGFibGUoW10pO1xuXG4gIGZ1bmN0aW9uIGFycmF5U2V0SW4ocHRoLCB2YWx1ZSwgY29uZmlnKSB7XG4gICAgdmFyIGhlYWQgPSBwdGhbMF07XG5cbiAgICBpZiAocHRoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGFycmF5U2V0LmNhbGwodGhpcywgaGVhZCwgdmFsdWUsIGNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWlsID0gcHRoLnNsaWNlKDEpO1xuICAgICAgdmFyIHRoaXNIZWFkID0gdGhpc1toZWFkXTtcbiAgICAgIHZhciBuZXdWYWx1ZTtcblxuICAgICAgaWYgKHR5cGVvZih0aGlzSGVhZCkgPT09IFwib2JqZWN0XCIgJiYgdGhpc0hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWlnaHQgKHZhbGlkbHkpIGJlIG9iamVjdCBvciBhcnJheVxuICAgICAgICBuZXdWYWx1ZSA9IEltbXV0YWJsZS5zZXRJbih0aGlzSGVhZCwgdGFpbCwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5leHRIZWFkID0gdGFpbFswXTtcbiAgICAgICAgLy8gSWYgdGhlIG5leHQgcGF0aCBwYXJ0IGlzIGEgbnVtYmVyLCB0aGVuIHdlIGFyZSBzZXR0aW5nIGludG8gYW4gYXJyYXksIGVsc2UgYW4gb2JqZWN0LlxuICAgICAgICBpZiAobmV4dEhlYWQgIT09ICcnICYmIGlzRmluaXRlKG5leHRIZWFkKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gYXJyYXlTZXRJbi5jYWxsKGltbXV0YWJsZUVtcHR5QXJyYXksIHRhaWwsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG9iamVjdFNldEluLmNhbGwoaW1tdXRhYmxlRW1wdHlPYmplY3QsIHRhaWwsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaGVhZCBpbiB0aGlzICYmIHRoaXNIZWFkID09PSBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG11dGFibGUgPSBhc011dGFibGVBcnJheS5jYWxsKHRoaXMpO1xuICAgICAgbXV0YWJsZVtoZWFkXSA9IG5ld1ZhbHVlO1xuICAgICAgcmV0dXJuIG1ha2VJbW11dGFibGVBcnJheShtdXRhYmxlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlSW1tdXRhYmxlQXJyYXkoYXJyYXkpIHtcbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlaXIgaW1wbGVtZW50YXRpb25zLCBidXQgd3JhcCB0aGVzZSBmdW5jdGlvbnMgdG8gbWFrZSBzdXJlXG4gICAgLy8gdGhleSBhbHdheXMgcmV0dXJuIGFuIGltbXV0YWJsZSB2YWx1ZS5cbiAgICBmb3IgKHZhciBpbmRleCBpbiBub25NdXRhdGluZ0FycmF5TWV0aG9kcykge1xuICAgICAgaWYgKG5vbk11dGF0aW5nQXJyYXlNZXRob2RzLmhhc093blByb3BlcnR5KGluZGV4KSkge1xuICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IG5vbk11dGF0aW5nQXJyYXlNZXRob2RzW2luZGV4XTtcbiAgICAgICAgbWFrZU1ldGhvZFJldHVybkltbXV0YWJsZShhcnJheSwgbWV0aG9kTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFnbG9iYWxDb25maWcudXNlX3N0YXRpYykge1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJmbGF0TWFwXCIsICBmbGF0TWFwKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwiYXNPYmplY3RcIiwgYXNPYmplY3QpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJhc011dGFibGVcIiwgYXNNdXRhYmxlQXJyYXkpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJzZXRcIiwgYXJyYXlTZXQpO1xuICAgICAgYWRkUHJvcGVydHlUbyhhcnJheSwgXCJzZXRJblwiLCBhcnJheVNldEluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwidXBkYXRlXCIsIHVwZGF0ZSk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGFycmF5LCBcInVwZGF0ZUluXCIsIHVwZGF0ZUluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8oYXJyYXksIFwiZ2V0SW5cIiwgZ2V0SW4pO1xuICAgIH1cblxuICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheVtpXSA9IEltbXV0YWJsZShhcnJheVtpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGUoYXJyYXksIG11dGF0aW5nQXJyYXlNZXRob2RzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VJbW11dGFibGVEYXRlKGRhdGUpIHtcbiAgICBpZiAoIWdsb2JhbENvbmZpZy51c2Vfc3RhdGljKSB7XG4gICAgICBhZGRQcm9wZXJ0eVRvKGRhdGUsIFwiYXNNdXRhYmxlXCIsIGFzTXV0YWJsZURhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlKGRhdGUsIG11dGF0aW5nRGF0ZU1ldGhvZHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNNdXRhYmxlRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVmZmVjdGl2ZWx5IHBlcmZvcm1zIGEgbWFwKCkgb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LCB1c2luZyB0aGVcbiAgICogcHJvdmlkZWQgaXRlcmF0b3IsIGV4Y2VwdCB0aGF0IHdoZW5ldmVyIHRoZSBpdGVyYXRvciByZXR1cm5zIGFuIGFycmF5LCB0aGF0XG4gICAqIGFycmF5J3MgZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBmaW5hbCByZXN1bHQgaW5zdGVhZCBvZiB0aGUgYXJyYXkgaXRzZWxmLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBpdGVyYXRvciAtIFRoZSBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5LiBJdCB3aWxsIHJlY2VpdmUgdGhyZWUgYXJndW1lbnRzOiB0aGUgY3VycmVudCB2YWx1ZSwgdGhlIGN1cnJlbnQgaW5kZXgsIGFuZCB0aGUgY3VycmVudCBvYmplY3QuXG4gICAqL1xuICBmdW5jdGlvbiBmbGF0TWFwKGl0ZXJhdG9yKSB7XG4gICAgLy8gQ2FsbGluZyAuZmxhdE1hcCgpIHdpdGggbm8gYXJndW1lbnRzIGlzIGEgbm8tb3AuIERvbid0IGJvdGhlciBjbG9uaW5nLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gW10sXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBpbmRleDtcblxuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGl0ZXJhdG9yUmVzdWx0ID0gaXRlcmF0b3IodGhpc1tpbmRleF0sIGluZGV4LCB0aGlzKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlcmF0b3JSZXN1bHQpKSB7XG4gICAgICAgIC8vIENvbmNhdGVuYXRlIEFycmF5IHJlc3VsdHMgaW50byB0aGUgcmV0dXJuIHZhbHVlIHdlJ3JlIGJ1aWxkaW5nIHVwLlxuICAgICAgICByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIGl0ZXJhdG9yUmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBub24tQXJyYXkgcmVzdWx0cyB0aGUgc2FtZSB3YXkgbWFwKCkgZG9lcy5cbiAgICAgICAgcmVzdWx0LnB1c2goaXRlcmF0b3JSZXN1bHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSW1tdXRhYmxlQXJyYXkocmVzdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEltbXV0YWJsZSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cyBpbmNsdWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0ga2V5c1RvUmVtb3ZlIC0gQSBsaXN0IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBrZXlzIHRvIGV4Y2x1ZGUgaW4gdGhlIHJldHVybiB2YWx1ZS4gSW5zdGVhZCBvZiBwcm92aWRpbmcgYSBzaW5nbGUgYXJyYXksIHRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIGNhbGxlZCBieSBwYXNzaW5nIG11bHRpcGxlIHN0cmluZ3MgYXMgc2VwYXJhdGUgYXJndW1lbnRzLlxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aG91dChyZW1vdmUpIHtcbiAgICAvLyBDYWxsaW5nIC53aXRob3V0KCkgd2l0aCBubyBhcmd1bWVudHMgaXMgYSBuby1vcC4gRG9uJ3QgYm90aGVyIGNsb25pbmcuXG4gICAgaWYgKHR5cGVvZiByZW1vdmUgPT09IFwidW5kZWZpbmVkXCIgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZW1vdmUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSWYgd2Ugd2VyZW4ndCBnaXZlbiBhbiBhcnJheSwgdXNlIHRoZSBhcmd1bWVudHMgbGlzdC5cbiAgICAgIHZhciBrZXlzVG9SZW1vdmVBcnJheSA9IChBcnJheS5pc0FycmF5KHJlbW92ZSkpID9cbiAgICAgICAgIHJlbW92ZS5zbGljZSgpIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgICAgLy8gQ29udmVydCBudW1lcmljIGtleXMgdG8gc3RyaW5ncyBzaW5jZSB0aGF0J3MgaG93IHRoZXknbGxcbiAgICAgIC8vIGNvbWUgZnJvbSB0aGUgZW51bWVyYXRpb24gb2YgdGhlIG9iamVjdC5cbiAgICAgIGtleXNUb1JlbW92ZUFycmF5LmZvckVhY2goZnVuY3Rpb24oZWwsIGlkeCwgYXJyKSB7XG4gICAgICAgIGlmKHR5cGVvZihlbCkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBhcnJbaWR4XSA9IGVsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZW1vdmUgPSBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgICByZXR1cm4ga2V5c1RvUmVtb3ZlQXJyYXkuaW5kZXhPZihrZXkpICE9PSAtMTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QodGhpcyk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiByZW1vdmUodGhpc1trZXldLCBrZXkpID09PSBmYWxzZSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChyZXN1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNNdXRhYmxlQXJyYXkob3B0cykge1xuICAgIHZhciByZXN1bHQgPSBbXSwgaSwgbGVuZ3RoO1xuXG4gICAgaWYob3B0cyAmJiBvcHRzLmRlZXApIHtcbiAgICAgIGZvcihpID0gMCwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChhc0RlZXBNdXRhYmxlKHRoaXNbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRWZmZWN0aXZlbHkgcGVyZm9ybXMgYSBbbWFwXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9tYXApIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSwgZXhwZWN0aW5nIHRoYXQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gICAqIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIHR3byBlbGVtZW50cyAtIHRoZSBmaXJzdCByZXByZXNlbnRpbmcgYSBrZXksIHRoZSBvdGhlclxuICAgKiBhIHZhbHVlLiBUaGVuIHJldHVybnMgYW4gSW1tdXRhYmxlIE9iamVjdCBjb25zdHJ1Y3RlZCBvZiB0aG9zZSBrZXlzIGFuZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGl0ZXJhdG9yIC0gQSBmdW5jdGlvbiB3aGljaCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIHR3byBlbGVtZW50cyAtIHRoZSBmaXJzdCByZXByZXNlbnRpbmcgdGhlIGRlc2lyZWQga2V5LCB0aGUgb3RoZXIgdGhlIGRlc2lyZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhc09iamVjdChpdGVyYXRvcikge1xuICAgIC8vIElmIG5vIGl0ZXJhdG9yIHdhcyBwcm92aWRlZCwgYXNzdW1lIHRoZSBpZGVudGl0eSBmdW5jdGlvblxuICAgIC8vIChzdWdnZXN0aW5nIHRoaXMgYXJyYXkgaXMgYWxyZWFkeSBhIGxpc3Qgb2Yga2V5L3ZhbHVlIHBhaXJzLilcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGl0ZXJhdG9yID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSB7fSxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGluZGV4O1xuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgcGFpciAgPSBpdGVyYXRvcih0aGlzW2luZGV4XSwgaW5kZXgsIHRoaXMpLFxuICAgICAgICAgIGtleSAgID0gcGFpclswXSxcbiAgICAgICAgICB2YWx1ZSA9IHBhaXJbMV07XG5cbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QocmVzdWx0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzRGVlcE11dGFibGUob2JqKSB7XG4gICAgaWYgKFxuICAgICAgKCFvYmopIHx8XG4gICAgICAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHx8XG4gICAgICAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBpbW11dGFiaWxpdHlUYWcpKSB8fFxuICAgICAgKG9iaiBpbnN0YW5jZW9mIERhdGUpXG4gICAgKSB7IHJldHVybiBvYmo7IH1cbiAgICByZXR1cm4gSW1tdXRhYmxlLmFzTXV0YWJsZShvYmosIHtkZWVwOiB0cnVlfSk7XG4gIH1cblxuICBmdW5jdGlvbiBxdWlja0NvcHkoc3JjLCBkZXN0KSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3JjLCBrZXkpKSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSW1tdXRhYmxlIE9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgb2YgYm90aFxuICAgKiB0aGlzIG9iamVjdCBhbmQgdGhlIHByb3ZpZGVkIG9iamVjdCwgcHJpb3JpdGl6aW5nIHRoZSBwcm92aWRlZCBvYmplY3Qnc1xuICAgKiB2YWx1ZXMgd2hlbmV2ZXIgdGhlIHNhbWUga2V5IGlzIHByZXNlbnQgaW4gYm90aCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3RoZXIgLSBUaGUgb3RoZXIgb2JqZWN0IHRvIG1lcmdlLiBNdWx0aXBsZSBvYmplY3RzIGNhbiBiZSBwYXNzZWQgYXMgYW4gYXJyYXkuIEluIHN1Y2ggYSBjYXNlLCB0aGUgbGF0ZXIgYW4gb2JqZWN0IGFwcGVhcnMgaW4gdGhhdCBsaXN0LCB0aGUgaGlnaGVyIGl0cyBwcmlvcml0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZyBvYmplY3QgdGhhdCBjb250YWlucyBzZXR0aW5ncy4gU3VwcG9ydGVkIHNldHRpbmdzIGFyZToge2RlZXA6IHRydWV9IGZvciBkZWVwIG1lcmdlIGFuZCB7bWVyZ2VyOiBtZXJnZXJGdW5jfSB3aGVyZSBtZXJnZXJGdW5jIGlzIGEgZnVuY3Rpb25cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGFrZXMgYSBwcm9wZXJ0eSBmcm9tIGJvdGggb2JqZWN0cy4gSWYgYW55dGhpbmcgaXMgcmV0dXJuZWQgaXQgb3ZlcnJpZGVzIHRoZSBub3JtYWwgbWVyZ2UgYmVoYXZpb3VyLlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2Uob3RoZXIsIGNvbmZpZykge1xuICAgIC8vIENhbGxpbmcgLm1lcmdlKCkgd2l0aCBubyBhcmd1bWVudHMgaXMgYSBuby1vcC4gRG9uJ3QgYm90aGVyIGNsb25pbmcuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChvdGhlciA9PT0gbnVsbCB8fCAodHlwZW9mIG90aGVyICE9PSBcIm9iamVjdFwiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkltbXV0YWJsZSNtZXJnZSBjYW4gb25seSBiZSBpbnZva2VkIHdpdGggb2JqZWN0cyBvciBhcnJheXMsIG5vdCBcIiArIEpTT04uc3RyaW5naWZ5KG90aGVyKSk7XG4gICAgfVxuXG4gICAgdmFyIHJlY2VpdmVkQXJyYXkgPSAoQXJyYXkuaXNBcnJheShvdGhlcikpLFxuICAgICAgICBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwLFxuICAgICAgICBtb2RlICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5tb2RlIHx8ICdtZXJnZScsXG4gICAgICAgIG1lcmdlciAgICAgICAgPSBjb25maWcgJiYgY29uZmlnLm1lcmdlcixcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgLy8gVXNlIHRoZSBnaXZlbiBrZXkgdG8gZXh0cmFjdCBhIHZhbHVlIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgdGhlbiBwbGFjZVxuICAgIC8vIHRoYXQgdmFsdWUgaW4gdGhlIHJlc3VsdCBvYmplY3QgdW5kZXIgdGhlIHNhbWUga2V5LiBJZiB0aGF0IHJlc3VsdGVkXG4gICAgLy8gaW4gYSBjaGFuZ2UgZnJvbSB0aGlzIG9iamVjdCdzIHZhbHVlIGF0IHRoYXQga2V5LCBzZXQgYW55Q2hhbmdlcyA9IHRydWUuXG4gICAgZnVuY3Rpb24gYWRkVG9SZXN1bHQoY3VycmVudE9iaiwgb3RoZXJPYmosIGtleSkge1xuICAgICAgdmFyIGltbXV0YWJsZVZhbHVlID0gSW1tdXRhYmxlKG90aGVyT2JqW2tleV0pO1xuICAgICAgdmFyIG1lcmdlclJlc3VsdCA9IG1lcmdlciAmJiBtZXJnZXIoY3VycmVudE9ialtrZXldLCBpbW11dGFibGVWYWx1ZSwgY29uZmlnKTtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBjdXJyZW50T2JqW2tleV07XG5cbiAgICAgIGlmICgocmVzdWx0ICE9PSB1bmRlZmluZWQpIHx8XG4gICAgICAgIChtZXJnZXJSZXN1bHQgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICAgKCFjdXJyZW50T2JqLmhhc093blByb3BlcnR5KGtleSkpIHx8XG4gICAgICAgICFpc0VxdWFsKGltbXV0YWJsZVZhbHVlLCBjdXJyZW50VmFsdWUpKSB7XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlO1xuXG4gICAgICAgIGlmIChtZXJnZXJSZXN1bHQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG1lcmdlclJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmIChkZWVwICYmIGlzTWVyZ2FibGVPYmplY3QoY3VycmVudFZhbHVlKSAmJiBpc01lcmdhYmxlT2JqZWN0KGltbXV0YWJsZVZhbHVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gSW1tdXRhYmxlLm1lcmdlKGN1cnJlbnRWYWx1ZSwgaW1tdXRhYmxlVmFsdWUsIGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBpbW11dGFibGVWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNFcXVhbChjdXJyZW50VmFsdWUsIG5ld1ZhbHVlKSB8fCAhY3VycmVudE9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBNYWtlIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGUgY3VycmVudCBvYmplY3QuXG4gICAgICAgICAgICByZXN1bHQgPSBxdWlja0NvcHkoY3VycmVudE9iaiwgaW5zdGFudGlhdGVFbXB0eU9iamVjdChjdXJyZW50T2JqKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyRHJvcHBlZEtleXMoY3VycmVudE9iaiwgb3RoZXJPYmopIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBjdXJyZW50T2JqKSB7XG4gICAgICAgIGlmICghb3RoZXJPYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gTWFrZSBhIHNoYWxsb3cgY2xvbmUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LlxuICAgICAgICAgICAgcmVzdWx0ID0gcXVpY2tDb3B5KGN1cnJlbnRPYmosIGluc3RhbnRpYXRlRW1wdHlPYmplY3QoY3VycmVudE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgcmVzdWx0W2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5O1xuXG4gICAgLy8gQWNoaWV2ZSBwcmlvcml0aXphdGlvbiBieSBvdmVycmlkaW5nIHByZXZpb3VzIHZhbHVlcyB0aGF0IGdldCBpbiB0aGUgd2F5LlxuICAgIGlmICghcmVjZWl2ZWRBcnJheSkge1xuICAgICAgLy8gVGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlOiBqdXN0IG1lcmdlIG9uZSBvYmplY3QgaW50byB0aGUgZXhpc3Rpbmcgb25lLlxuICAgICAgZm9yIChrZXkgaW4gb3RoZXIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3RoZXIsIGtleSkpIHtcbiAgICAgICAgICBhZGRUb1Jlc3VsdCh0aGlzLCBvdGhlciwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1vZGUgPT09ICdyZXBsYWNlJykge1xuICAgICAgICBjbGVhckRyb3BwZWRLZXlzKHRoaXMsIG90aGVyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgYWxzbyBhY2NlcHQgYW4gQXJyYXlcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0gb3RoZXIubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgb3RoZXJGcm9tQXJyYXkgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgZm9yIChrZXkgaW4gb3RoZXJGcm9tQXJyYXkpIHtcbiAgICAgICAgICBpZiAob3RoZXJGcm9tQXJyYXkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgYWRkVG9SZXN1bHQocmVzdWx0ICE9PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0aGlzLCBvdGhlckZyb21BcnJheSwga2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWFrZUltbXV0YWJsZU9iamVjdChyZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9iamVjdFJlcGxhY2UodmFsdWUsIGNvbmZpZykge1xuICAgIHZhciBkZWVwICAgICAgICAgID0gY29uZmlnICYmIGNvbmZpZy5kZWVwO1xuXG4gICAgLy8gQ2FsbGluZyAucmVwbGFjZSgpIHdpdGggbm8gYXJndW1lbnRzIGlzIGEgbm8tb3AuIERvbid0IGJvdGhlciBjbG9uaW5nLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW1tdXRhYmxlI3JlcGxhY2UgY2FuIG9ubHkgYmUgaW52b2tlZCB3aXRoIG9iamVjdHMgb3IgYXJyYXlzLCBub3QgXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBJbW11dGFibGUubWVyZ2UodGhpcywgdmFsdWUsIHtkZWVwOiBkZWVwLCBtb2RlOiAncmVwbGFjZSd9KTtcbiAgfVxuXG4gIHZhciBpbW11dGFibGVFbXB0eU9iamVjdCA9IEltbXV0YWJsZSh7fSk7XG5cbiAgZnVuY3Rpb24gb2JqZWN0U2V0SW4ocGF0aCwgdmFsdWUsIGNvbmZpZykge1xuICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBBcnJheSkgfHwgcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgdG8gSW1tdXRhYmxlI3NldEluIG11c3QgYmUgYW4gYXJyYXkgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgXFxcImtleVxcXCIgc3RyaW5nLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgaGVhZCA9IHBhdGhbMF07XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gb2JqZWN0U2V0LmNhbGwodGhpcywgaGVhZCwgdmFsdWUsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgdmFyIHRhaWwgPSBwYXRoLnNsaWNlKDEpO1xuICAgIHZhciBuZXdWYWx1ZTtcbiAgICB2YXIgdGhpc0hlYWQgPSB0aGlzW2hlYWRdO1xuXG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoaGVhZCkgJiYgdHlwZW9mKHRoaXNIZWFkKSA9PT0gXCJvYmplY3RcIiAmJiB0aGlzSGVhZCAhPT0gbnVsbCkge1xuICAgICAgLy8gTWlnaHQgKHZhbGlkbHkpIGJlIG9iamVjdCBvciBhcnJheVxuICAgICAgbmV3VmFsdWUgPSBJbW11dGFibGUuc2V0SW4odGhpc0hlYWQsIHRhaWwsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUgPSBvYmplY3RTZXRJbi5jYWxsKGltbXV0YWJsZUVtcHR5T2JqZWN0LCB0YWlsLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoaGVhZCkgJiYgdGhpc0hlYWQgPT09IG5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IHF1aWNrQ29weSh0aGlzLCBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KHRoaXMpKTtcbiAgICBtdXRhYmxlW2hlYWRdID0gbmV3VmFsdWU7XG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QobXV0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvYmplY3RTZXQocHJvcGVydHksIHZhbHVlLCBjb25maWcpIHtcbiAgICB2YXIgZGVlcCAgICAgICAgICA9IGNvbmZpZyAmJiBjb25maWcuZGVlcDtcblxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgaWYgKGRlZXAgJiYgdGhpc1twcm9wZXJ0eV0gIT09IHZhbHVlICYmIGlzTWVyZ2FibGVPYmplY3QodmFsdWUpICYmIGlzTWVyZ2FibGVPYmplY3QodGhpc1twcm9wZXJ0eV0pKSB7XG4gICAgICAgIHZhbHVlID0gSW1tdXRhYmxlLm1lcmdlKHRoaXNbcHJvcGVydHldLCB2YWx1ZSwge2RlZXA6IHRydWUsIG1vZGU6ICdyZXBsYWNlJ30pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRXF1YWwodGhpc1twcm9wZXJ0eV0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbXV0YWJsZSA9IHF1aWNrQ29weSh0aGlzLCBpbnN0YW50aWF0ZUVtcHR5T2JqZWN0KHRoaXMpKTtcbiAgICBtdXRhYmxlW3Byb3BlcnR5XSA9IEltbXV0YWJsZSh2YWx1ZSk7XG4gICAgcmV0dXJuIG1ha2VJbW11dGFibGVPYmplY3QobXV0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUocHJvcGVydHksIHVwZGF0ZXIpIHtcbiAgICB2YXIgcmVzdEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHZhciBpbml0aWFsVmFsID0gdGhpc1twcm9wZXJ0eV07XG4gICAgcmV0dXJuIEltbXV0YWJsZS5zZXQodGhpcywgcHJvcGVydHksIHVwZGF0ZXIuYXBwbHkoaW5pdGlhbFZhbCwgW2luaXRpYWxWYWxdLmNvbmNhdChyZXN0QXJncykpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluUGF0aChvYmosIHBhdGgpIHtcbiAgICAvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGF0aC5sZW5ndGg7IG9iaiAhPSBudWxsICYmIGkgPCBsOyBpKyspIHtcbiAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGkgJiYgaSA9PSBsKSA/IG9iaiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUluKHBhdGgsIHVwZGF0ZXIpIHtcbiAgICB2YXIgcmVzdEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHZhciBpbml0aWFsVmFsID0gZ2V0SW5QYXRoKHRoaXMsIHBhdGgpO1xuXG4gICAgcmV0dXJuIEltbXV0YWJsZS5zZXRJbih0aGlzLCBwYXRoLCB1cGRhdGVyLmFwcGx5KGluaXRpYWxWYWwsIFtpbml0aWFsVmFsXS5jb25jYXQocmVzdEFyZ3MpKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJbihwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRJblBhdGgodGhpcywgcGF0aCk7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzTXV0YWJsZU9iamVjdChvcHRzKSB7XG4gICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QodGhpcyksIGtleTtcblxuICAgIGlmKG9wdHMgJiYgb3B0cy5kZWVwKSB7XG4gICAgICBmb3IgKGtleSBpbiB0aGlzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGFzRGVlcE11dGFibGUodGhpc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGtleSBpbiB0aGlzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBDcmVhdGVzIHBsYWluIG9iamVjdCB0byBiZSB1c2VkIGZvciBjbG9uaW5nXG4gIGZ1bmN0aW9uIGluc3RhbnRpYXRlUGxhaW5PYmplY3QoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLy8gRmluYWxpemVzIGFuIG9iamVjdCB3aXRoIGltbXV0YWJsZSBtZXRob2RzLCBmcmVlemVzIGl0LCBhbmQgcmV0dXJucyBpdC5cbiAgZnVuY3Rpb24gbWFrZUltbXV0YWJsZU9iamVjdChvYmopIHtcbiAgICBpZiAoIWdsb2JhbENvbmZpZy51c2Vfc3RhdGljKSB7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJtZXJnZVwiLCBtZXJnZSk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJyZXBsYWNlXCIsIG9iamVjdFJlcGxhY2UpO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwid2l0aG91dFwiLCB3aXRob3V0KTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcImFzTXV0YWJsZVwiLCBhc011dGFibGVPYmplY3QpO1xuICAgICAgYWRkUHJvcGVydHlUbyhvYmosIFwic2V0XCIsIG9iamVjdFNldCk7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJzZXRJblwiLCBvYmplY3RTZXRJbik7XG4gICAgICBhZGRQcm9wZXJ0eVRvKG9iaiwgXCJ1cGRhdGVcIiwgdXBkYXRlKTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcInVwZGF0ZUluXCIsIHVwZGF0ZUluKTtcbiAgICAgIGFkZFByb3BlcnR5VG8ob2JqLCBcImdldEluXCIsIGdldEluKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUltbXV0YWJsZShvYmosIG11dGF0aW5nT2JqZWN0TWV0aG9kcyk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgdmFsaWQgcmVhY3QgZWxlbWVudFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MTUuMC4xL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDMyNlxuICBmdW5jdGlvbiBpc1JlYWN0RWxlbWVudChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgb2JqICE9PSBudWxsICYmXG4gICAgICAgICAgIChvYmouJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRV9GQUxMQkFDSyB8fCBvYmouJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0ZpbGVPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBGaWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNQcm9taXNlKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICB0eXBlb2Ygb2JqLnRoZW4gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Vycm9yKG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBFcnJvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIEltbXV0YWJsZShvYmosIG9wdGlvbnMsIHN0YWNrUmVtYWluaW5nKSB7XG4gICAgaWYgKGlzSW1tdXRhYmxlKG9iaikgfHwgaXNSZWFjdEVsZW1lbnQob2JqKSB8fCBpc0ZpbGVPYmplY3Qob2JqKSB8fCBpc0Vycm9yKG9iaikpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSBlbHNlIGlmIChpc1Byb21pc2Uob2JqKSkge1xuICAgICAgcmV0dXJuIG9iai50aGVuKEltbXV0YWJsZSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBtYWtlSW1tdXRhYmxlQXJyYXkob2JqLnNsaWNlKCkpO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIG1ha2VJbW11dGFibGVEYXRlKG5ldyBEYXRlKG9iai5nZXRUaW1lKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRG9uJ3QgZnJlZXplIHRoZSBvYmplY3Qgd2Ugd2VyZSBnaXZlbjsgbWFrZSBhIGNsb25lIGFuZCB1c2UgdGhhdC5cbiAgICAgIHZhciBwcm90b3R5cGUgPSBvcHRpb25zICYmIG9wdGlvbnMucHJvdG90eXBlO1xuICAgICAgdmFyIGluc3RhbnRpYXRlRW1wdHlPYmplY3QgPVxuICAgICAgICAoIXByb3RvdHlwZSB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpID9cbiAgICAgICAgICBpbnN0YW50aWF0ZVBsYWluT2JqZWN0IDogKGZ1bmN0aW9uKCkgeyByZXR1cm4gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpOyB9KTtcbiAgICAgIHZhciBjbG9uZSA9IGluc3RhbnRpYXRlRW1wdHlPYmplY3QoKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgICAgICBpZiAoc3RhY2tSZW1haW5pbmcgPT0gbnVsbCkge1xuICAgICAgICAgIHN0YWNrUmVtYWluaW5nID0gNjQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YWNrUmVtYWluaW5nIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW1tdXRhYmxlRXJyb3IoXCJBdHRlbXB0IHRvIGNvbnN0cnVjdCBJbW11dGFibGUgZnJvbSBhIGRlZXBseSBuZXN0ZWQgb2JqZWN0IHdhcyBkZXRlY3RlZC5cIiArXG4gICAgICAgICAgICBcIiBIYXZlIHlvdSB0cmllZCB0byB3cmFwIGFuIG9iamVjdCB3aXRoIGNpcmN1bGFyIHJlZmVyZW5jZXMgKGUuZy4gUmVhY3QgZWxlbWVudCk/XCIgK1xuICAgICAgICAgICAgXCIgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ydGZlbGRtYW4vc2VhbWxlc3MtaW1tdXRhYmxlL3dpa2kvRGVlcGx5LW5lc3RlZC1vYmplY3Qtd2FzLWRldGVjdGVkIGZvciBkZXRhaWxzLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFja1JlbWFpbmluZyAtPSAxO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSkge1xuICAgICAgICAgIGNsb25lW2tleV0gPSBJbW11dGFibGUob2JqW2tleV0sIHVuZGVmaW5lZCwgc3RhY2tSZW1haW5pbmcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYWtlSW1tdXRhYmxlT2JqZWN0KGNsb25lKTtcbiAgICB9XG4gIH1cblxuICAvLyBXcmFwcGVyIHRvIGFsbG93IHRoZSB1c2Ugb2Ygb2JqZWN0IG1ldGhvZHMgYXMgc3RhdGljIG1ldGhvZHMgb2YgSW1tdXRhYmxlLlxuICBmdW5jdGlvbiB0b1N0YXRpYyhmbikge1xuICAgIGZ1bmN0aW9uIHN0YXRpY1dyYXBwZXIoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIHZhciBzZWxmID0gYXJncy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0aWNXcmFwcGVyO1xuICB9XG5cbiAgLy8gV3JhcHBlciB0byBhbGxvdyB0aGUgdXNlIG9mIG9iamVjdCBtZXRob2RzIGFzIHN0YXRpYyBtZXRob2RzIG9mIEltbXV0YWJsZS5cbiAgLy8gd2l0aCB0aGUgYWRkaXRpb25hbCBjb25kaXRpb24gb2YgY2hvb3Npbmcgd2hpY2ggZnVuY3Rpb24gdG8gY2FsbCBkZXBlbmRpbmdcbiAgLy8gaWYgYXJndW1lbnQgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LlxuICBmdW5jdGlvbiB0b1N0YXRpY09iamVjdE9yQXJyYXkoZm5PYmplY3QsIGZuQXJyYXkpIHtcbiAgICBmdW5jdGlvbiBzdGF0aWNXcmFwcGVyKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgc2VsZiA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGYpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuQXJyYXkuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmbk9iamVjdC5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGljV3JhcHBlcjtcbiAgfVxuXG4gIC8vIFdyYXBwZXIgdG8gYWxsb3cgdGhlIHVzZSBvZiBvYmplY3QgbWV0aG9kcyBhcyBzdGF0aWMgbWV0aG9kcyBvZiBJbW11dGFibGUuXG4gIC8vIHdpdGggdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9uIG9mIGNob29zaW5nIHdoaWNoIGZ1bmN0aW9uIHRvIGNhbGwgZGVwZW5kaW5nXG4gIC8vIGlmIGFyZ3VtZW50IGlzIGFuIGFycmF5IG9yIGFuIG9iamVjdCBvciBhIGRhdGUuXG4gIGZ1bmN0aW9uIHRvU3RhdGljT2JqZWN0T3JEYXRlT3JBcnJheShmbk9iamVjdCwgZm5BcnJheSwgZm5EYXRlKSB7XG4gICAgZnVuY3Rpb24gc3RhdGljV3JhcHBlcigpIHtcbiAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgdmFyIHNlbGYgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxmKSkge1xuICAgICAgICAgIHJldHVybiBmbkFycmF5LmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHJldHVybiBmbkRhdGUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmbk9iamVjdC5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGljV3JhcHBlcjtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0aGUgbGlicmFyeVxuICBJbW11dGFibGUuZnJvbSAgICAgICAgICAgPSBJbW11dGFibGU7XG4gIEltbXV0YWJsZS5pc0ltbXV0YWJsZSAgICA9IGlzSW1tdXRhYmxlO1xuICBJbW11dGFibGUuSW1tdXRhYmxlRXJyb3IgPSBJbW11dGFibGVFcnJvcjtcbiAgSW1tdXRhYmxlLm1lcmdlICAgICAgICAgID0gdG9TdGF0aWMobWVyZ2UpO1xuICBJbW11dGFibGUucmVwbGFjZSAgICAgICAgPSB0b1N0YXRpYyhvYmplY3RSZXBsYWNlKTtcbiAgSW1tdXRhYmxlLndpdGhvdXQgICAgICAgID0gdG9TdGF0aWMod2l0aG91dCk7XG4gIEltbXV0YWJsZS5hc011dGFibGUgICAgICA9IHRvU3RhdGljT2JqZWN0T3JEYXRlT3JBcnJheShhc011dGFibGVPYmplY3QsIGFzTXV0YWJsZUFycmF5LCBhc011dGFibGVEYXRlKTtcbiAgSW1tdXRhYmxlLnNldCAgICAgICAgICAgID0gdG9TdGF0aWNPYmplY3RPckFycmF5KG9iamVjdFNldCwgYXJyYXlTZXQpO1xuICBJbW11dGFibGUuc2V0SW4gICAgICAgICAgPSB0b1N0YXRpY09iamVjdE9yQXJyYXkob2JqZWN0U2V0SW4sIGFycmF5U2V0SW4pO1xuICBJbW11dGFibGUudXBkYXRlICAgICAgICAgPSB0b1N0YXRpYyh1cGRhdGUpO1xuICBJbW11dGFibGUudXBkYXRlSW4gICAgICAgPSB0b1N0YXRpYyh1cGRhdGVJbik7XG4gIEltbXV0YWJsZS5nZXRJbiAgICAgICAgICA9IHRvU3RhdGljKGdldEluKTtcbiAgSW1tdXRhYmxlLmZsYXRNYXAgICAgICAgID0gdG9TdGF0aWMoZmxhdE1hcCk7XG4gIEltbXV0YWJsZS5hc09iamVjdCAgICAgICA9IHRvU3RhdGljKGFzT2JqZWN0KTtcbiAgaWYgKCFnbG9iYWxDb25maWcudXNlX3N0YXRpYykge1xuICAgICAgSW1tdXRhYmxlLnN0YXRpYyA9IGltbXV0YWJsZUluaXQoe1xuICAgICAgICAgIHVzZV9zdGF0aWM6IHRydWVcbiAgICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LmZyZWV6ZShJbW11dGFibGUpO1xuXG4gIHJldHVybiBJbW11dGFibGU7XG59XG5cbiAgdmFyIEltbXV0YWJsZSA9IGltbXV0YWJsZUluaXQoKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gSW1tdXRhYmxlO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEltbXV0YWJsZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIGV4cG9ydHMuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIHtcbiAgICB3aW5kb3cuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIpIHtcbiAgICBnbG9iYWwuSW1tdXRhYmxlID0gSW1tdXRhYmxlO1xuICB9XG59KSgpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tIFwic2VhbWxlc3MtaW1tdXRhYmxlXCI7XG5cbi8vIFRoaXMgbWlkZGxld2FyZSB3aWxsIGp1c3QgYWRkIHRoZSBwcm9wZXJ0eSBcImFzeW5jIGRpc3BhdGNoXCJcbi8vIHRvIGFjdGlvbnMgd2l0aCB0aGUgXCJhc3luY1wiIHByb3BwZXJ0eSBzZXQgdG8gdHJ1ZVxuY29uc3QgYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmUgPSBzdG9yZSA9PiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gIGxldCBzeW5jQWN0aXZpdHlGaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgYWN0aW9uUXVldWUgPSBbXTtcblxuICBmdW5jdGlvbiBmbHVzaFF1ZXVlKCkge1xuICAgIGFjdGlvblF1ZXVlLmZvckVhY2goYSA9PiBzdG9yZS5kaXNwYXRjaChhKSk7IC8vIGZsdXNoIHF1ZXVlXG4gICAgYWN0aW9uUXVldWUgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzeW5jRGlzcGF0Y2goYXN5bmNBY3Rpb24pIHtcbiAgICBhY3Rpb25RdWV1ZSA9IGFjdGlvblF1ZXVlLmNvbmNhdChbYXN5bmNBY3Rpb25dKTtcblxuICAgIGlmIChzeW5jQWN0aXZpdHlGaW5pc2hlZCkge1xuICAgICAgZmx1c2hRdWV1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdGlvbldpdGhBc3luY0Rpc3BhdGNoID1cbiAgICAgIEltbXV0YWJsZShhY3Rpb24pLm1lcmdlKHsgYXN5bmNEaXNwYXRjaCB9KTtcblxuICBuZXh0KGFjdGlvbldpdGhBc3luY0Rpc3BhdGNoKTtcbiAgc3luY0FjdGl2aXR5RmluaXNoZWQgPSB0cnVlO1xuICBmbHVzaFF1ZXVlKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhc3luY0Rpc3BhdGNoTWlkZGxld2FyZTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuaW1wb3J0IGFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlIGZyb20gXCIuLi9qcy91dGlscy9hc3luY0Rpc3BhdGNoTWlkZGxld2FyZVwiO1xuXG5jb25zdCBmYWtlQWN0aW9uID0geyB0eXBlOiBcImZha2UgYWN0aW9uXCIgfTtcblxuZGVzY3JpYmUoXCJUaGUgYXN5bmNEaXNwYXRjaE1pZGRsZXdhcmVcIiwgKCkgPT4ge1xuICBpdChcImNhbGxzIG5leHQgd2l0aCBhc3luY0Rpc3BhdGNoIHByb3BlcnR5XCIsIChkb25lKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHJldHVybmVkQWN0aW9uID0+IHtcbiAgICAgIGV4cGVjdChyZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KHR5cGVvZiByZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKS50b0VxdWFsKFwiZnVuY3Rpb25cIik7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGFzeW5jRGlzcGF0Y2hNaWRkbGV3YXJlKFwiZmFrZVN0b3JlXCIpKG5leHQpKGZha2VBY3Rpb24pO1xuICB9KTtcblxuXG4gIGl0KFwiYXN5bmNEaXNwYXRjaCB0cmlnZ2VycyBhIHN0b3JlIGRpc3BhdGNoXCIsIChkb25lKSA9PiB7XG4gICAgY29uc3QgZmFrZUFzeW5jQWN0aW9uID0geyB0eXBlOiBcImZha2VBc3luY0FjdGlvblwiIH07XG5cbiAgICBjb25zdCBmYWtlU3RvcmUgPSB7XG4gICAgICBkaXNwYXRjaDogYWN0aW9uID0+IHtcbiAgICAgICAgZXhwZWN0KGFjdGlvbi50eXBlKS50b0VxdWFsKGZha2VBc3luY0FjdGlvbi50eXBlKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgbmV4dCA9IHJldHVybmVkQWN0aW9uID0+XG4gICAgICByZXR1cm5lZEFjdGlvbi5hc3luY0Rpc3BhdGNoKGZha2VBc3luY0FjdGlvbik7XG5cbiAgICBhc3luY0Rpc3BhdGNoTWlkZGxld2FyZShmYWtlU3RvcmUpKG5leHQpKGZha2VBY3Rpb24pO1xuICB9KTtcbn0pO1xuIiwiLy8gQnVnIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuZXZlclxuLy8gdGhlIGNvbmRpdGlvbiBzZW50IHRvIGl0IGlzIGV2YWx1YXRlZCB0byBmYWxzZVxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgYW5kIG91dHB1dHMgdGhlIGNvcnJlY3QgbWVzc2FnZSBpZiB0aGUgY29uZGl0aW9uXG4gKiBpcyBmYWxzZS4gT3RoZXJ3aXNlIGl0IG91dHB1dHMgbnVsbC5cbiAqIEBhcGkgcHJpdmF0ZVxuICogQG1ldGhvZCBwcm9jZXNzQ29uZGl0aW9uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHtTdHJpbmcgfCBudWxsfSAgLSBFcnJvciBtZXNzYWdlIGlmIHRoZXJlIGlzIGFuIGVycm9yLCBudWwgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29uZGl0aW9uKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGNvbXBsZXRlRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdmFyIHJlID0gL2F0IChbXlxcc10rKVxcc1xcKC9nO1xuICAgIHZhciBzdGFja1RyYWNlID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gICAgdmFyIHN0YWNrRnVuY3Rpb25zID0gW107XG5cbiAgICB2YXIgZnVuY05hbWUgPSByZS5leGVjKHN0YWNrVHJhY2UpO1xuICAgIHdoaWxlIChmdW5jTmFtZSAmJiBmdW5jTmFtZVsxXSkge1xuICAgICAgc3RhY2tGdW5jdGlvbnMucHVzaChmdW5jTmFtZVsxXSk7XG4gICAgICBmdW5jTmFtZSA9IHJlLmV4ZWMoc3RhY2tUcmFjZSk7XG4gICAgfVxuXG4gICAgLy8gTnVtYmVyIDAgaXMgcHJvY2Vzc0NvbmRpdGlvbiBpdHNlbGYsXG4gICAgLy8gTnVtYmVyIDEgaXMgYXNzZXJ0LFxuICAgIC8vIE51bWJlciAyIGlzIHRoZSBjYWxsZXIgZnVuY3Rpb24uXG4gICAgaWYgKHN0YWNrRnVuY3Rpb25zWzJdKSB7XG4gICAgICBjb21wbGV0ZUVycm9yTWVzc2FnZSA9IHN0YWNrRnVuY3Rpb25zWzJdICsgJzogJyArIGNvbXBsZXRlRXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbXBsZXRlRXJyb3JNZXNzYWdlICs9IGVycm9yTWVzc2FnZTtcbiAgICByZXR1cm4gY29tcGxldGVFcnJvck1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGJvb2xlYW4gcGFzc2VkIHRvIGl0IGV2YWx1YXRlcyB0byBmYWxzZS5cbiAqIFRvIGJlIHVzZWQgbGlrZSB0aGlzOlxuICogXHRcdGFzc2VydChteURhdGUgIT09IHVuZGVmaW5lZCwgXCJEYXRlIGNhbm5vdCBiZSB1bmRlZmluZWQuXCIpO1xuICogQGFwaSBwdWJsaWNcbiAqIEBtZXRob2QgYXNzZXJ0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIHZhciBlcnJvciA9IHByb2Nlc3NDb25kaXRpb24oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpO1xuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2dzIGEgd2FybmluZyBpZiB0aGUgYm9vbGVhbiBwYXNzZWQgdG8gaXQgZXZhbHVhdGVzIHRvIGZhbHNlLlxuICogVG8gYmUgdXNlZCBsaWtlIHRoaXM6XG4gKiBcdFx0YXNzZXJ0Lndhcm4obXlEYXRlICE9PSB1bmRlZmluZWQsIFwiTm8gZGF0ZSBwcm92aWRlZC5cIik7XG4gKiBAYXBpIHB1YmxpY1xuICogQG1ldGhvZCB3YXJuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBjb25kaXRpb24gLSBSZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb25kaXRpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gZXJyb3JNZXNzYWdlIC0gTWVzc2FnZSBleHBsYWluaWcgdGhlIGVycm9yIGluIGNhc2UgaXQgaXMgdGhyb3duXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuYXNzZXJ0Lndhcm4gPSBmdW5jdGlvbiB3YXJuKGNvbmRpdGlvbiwgZXJyb3JNZXNzYWdlKSB7XG4gIHZhciBlcnJvciA9IHByb2Nlc3NDb25kaXRpb24oY29uZGl0aW9uLCBlcnJvck1lc3NhZ2UpO1xuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFzc2VydDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pSWl3aWMyOTFjbU5sY3lJNld5SmhjM05sY25RdWFuTWlYU3dpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHk4Z1FuVm5JR05vWldOcmFXNW5JR1oxYm1OMGFXOXVJSFJvWVhRZ2QybHNiQ0IwYUhKdmR5QmhiaUJsY25KdmNpQjNhR1Z1WlhabGNseHVMeThnZEdobElHTnZibVJwZEdsdmJpQnpaVzUwSUhSdklHbDBJR2x6SUdWMllXeDFZWFJsWkNCMGJ5Qm1ZV3h6WlZ4dUx5b3FYRzRnS2lCUWNtOWpaWE56WlhNZ2RHaGxJRzFsYzNOaFoyVWdZVzVrSUc5MWRIQjFkSE1nZEdobElHTnZjbkpsWTNRZ2JXVnpjMkZuWlNCcFppQjBhR1VnWTI5dVpHbDBhVzl1WEc0Z0tpQnBjeUJtWVd4elpTNGdUM1JvWlhKM2FYTmxJR2wwSUc5MWRIQjFkSE1nYm5Wc2JDNWNiaUFxSUVCaGNHa2djSEpwZG1GMFpWeHVJQ29nUUcxbGRHaHZaQ0J3Y205alpYTnpRMjl1WkdsMGFXOXVYRzRnS2lCQWNHRnlZVzBnSUh0Q2IyOXNaV0Z1ZlNCamIyNWthWFJwYjI0Z0xTQlNaWE4xYkhRZ2IyWWdkR2hsSUdWMllXeDFZWFJsWkNCamIyNWthWFJwYjI1Y2JpQXFJRUJ3WVhKaGJTQWdlMU4wY21sdVozMGdaWEp5YjNKTlpYTnpZV2RsSUMwZ1RXVnpjMkZuWlNCbGVIQnNZV2x1YVdjZ2RHaGxJR1Z5Y205eUlHbHVJR05oYzJVZ2FYUWdhWE1nZEdoeWIzZHVYRzRnS2lCQWNtVjBkWEp1SUh0VGRISnBibWNnZkNCdWRXeHNmU0FnTFNCRmNuSnZjaUJ0WlhOellXZGxJR2xtSUhSb1pYSmxJR2x6SUdGdUlHVnljbTl5TENCdWRXd2diM1JvWlhKM2FYTmxMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQndjbTlqWlhOelEyOXVaR2wwYVc5dUtHTnZibVJwZEdsdmJpd2daWEp5YjNKTlpYTnpZV2RsS1NCN1hHNGdJR2xtSUNnaFkyOXVaR2wwYVc5dUtTQjdYRzRnSUNBZ2JHVjBJR052YlhCc1pYUmxSWEp5YjNKTlpYTnpZV2RsSUQwZ0p5YzdYRzRnSUNBZ1kyOXVjM1FnY21VZ1BTQXZZWFFnS0Z0ZVhGeHpYU3NwWEZ4elhGd29MMmM3WEc0Z0lDQWdZMjl1YzNRZ2MzUmhZMnRVY21GalpTQTlJRzVsZHlCRmNuSnZjaWdwTG5OMFlXTnJPMXh1SUNBZ0lHTnZibk4wSUhOMFlXTnJSblZ1WTNScGIyNXpJRDBnVzEwN1hHNWNiaUFnSUNCc1pYUWdablZ1WTA1aGJXVWdQU0J5WlM1bGVHVmpLSE4wWVdOclZISmhZMlVwTzF4dUlDQWdJSGRvYVd4bElDaG1kVzVqVG1GdFpTQW1KaUJtZFc1alRtRnRaVnN4WFNrZ2UxeHVJQ0FnSUNBZ2MzUmhZMnRHZFc1amRHbHZibk11Y0hWemFDaG1kVzVqVG1GdFpWc3hYU2s3WEc0Z0lDQWdJQ0JtZFc1alRtRnRaU0E5SUhKbExtVjRaV01vYzNSaFkydFVjbUZqWlNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnTHk4Z1RuVnRZbVZ5SURBZ2FYTWdjSEp2WTJWemMwTnZibVJwZEdsdmJpQnBkSE5sYkdZc1hHNGdJQ0FnTHk4Z1RuVnRZbVZ5SURFZ2FYTWdZWE56WlhKMExGeHVJQ0FnSUM4dklFNTFiV0psY2lBeUlHbHpJSFJvWlNCallXeHNaWElnWm5WdVkzUnBiMjR1WEc0Z0lDQWdhV1lnS0hOMFlXTnJSblZ1WTNScGIyNXpXekpkS1NCN1hHNGdJQ0FnSUNCamIyMXdiR1YwWlVWeWNtOXlUV1Z6YzJGblpTQTlJR0FrZTNOMFlXTnJSblZ1WTNScGIyNXpXekpkZlRvZ0pIdGpiMjF3YkdWMFpVVnljbTl5VFdWemMyRm5aWDFnTzF4dUlDQWdJSDFjYmx4dUlDQWdJR052YlhCc1pYUmxSWEp5YjNKTlpYTnpZV2RsSUNzOUlHVnljbTl5VFdWemMyRm5aVHRjYmlBZ0lDQnlaWFIxY200Z1kyOXRjR3hsZEdWRmNuSnZjazFsYzNOaFoyVTdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdiblZzYkR0Y2JuMWNibHh1THlvcVhHNGdLaUJVYUhKdmQzTWdZVzRnWlhKeWIzSWdhV1lnZEdobElHSnZiMnhsWVc0Z2NHRnpjMlZrSUhSdklHbDBJR1YyWVd4MVlYUmxjeUIwYnlCbVlXeHpaUzVjYmlBcUlGUnZJR0psSUhWelpXUWdiR2xyWlNCMGFHbHpPbHh1SUNvZ1hIUmNkR0Z6YzJWeWRDaHRlVVJoZEdVZ0lUMDlJSFZ1WkdWbWFXNWxaQ3dnWENKRVlYUmxJR05oYm01dmRDQmlaU0IxYm1SbFptbHVaV1F1WENJcE8xeHVJQ29nUUdGd2FTQndkV0pzYVdOY2JpQXFJRUJ0WlhSb2IyUWdZWE56WlhKMFhHNGdLaUJBY0dGeVlXMGdJSHRDYjI5c1pXRnVmU0JqYjI1a2FYUnBiMjRnTFNCU1pYTjFiSFFnYjJZZ2RHaGxJR1YyWVd4MVlYUmxaQ0JqYjI1a2FYUnBiMjVjYmlBcUlFQndZWEpoYlNBZ2UxTjBjbWx1WjMwZ1pYSnliM0pOWlhOellXZGxJQzBnVFdWemMyRm5aU0JsZUhCc1lXbHVhV2NnZEdobElHVnljbTl5SUdsdUlHTmhjMlVnYVhRZ2FYTWdkR2h5YjNkdVhHNGdLaUJBY21WMGRYSnVJSFp2YVdSY2JpQXFMMXh1Wm5WdVkzUnBiMjRnWVhOelpYSjBLR052Ym1ScGRHbHZiaXdnWlhKeWIzSk5aWE56WVdkbEtTQjdYRzRnSUdOdmJuTjBJR1Z5Y205eUlEMGdjSEp2WTJWemMwTnZibVJwZEdsdmJpaGpiMjVrYVhScGIyNHNJR1Z5Y205eVRXVnpjMkZuWlNrN1hHNGdJR2xtSUNoMGVYQmxiMllnWlhKeWIzSWdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR1Z5Y205eUtUdGNiaUFnZlZ4dWZWeHVYRzR2S2lwY2JpQXFJRXh2WjNNZ1lTQjNZWEp1YVc1bklHbG1JSFJvWlNCaWIyOXNaV0Z1SUhCaGMzTmxaQ0IwYnlCcGRDQmxkbUZzZFdGMFpYTWdkRzhnWm1Gc2MyVXVYRzRnS2lCVWJ5QmlaU0IxYzJWa0lHeHBhMlVnZEdocGN6cGNiaUFxSUZ4MFhIUmhjM05sY25RdWQyRnliaWh0ZVVSaGRHVWdJVDA5SUhWdVpHVm1hVzVsWkN3Z1hDSk9ieUJrWVhSbElIQnliM1pwWkdWa0xsd2lLVHRjYmlBcUlFQmhjR2tnY0hWaWJHbGpYRzRnS2lCQWJXVjBhRzlrSUhkaGNtNWNiaUFxSUVCd1lYSmhiU0FnZTBKdmIyeGxZVzU5SUdOdmJtUnBkR2x2YmlBdElGSmxjM1ZzZENCdlppQjBhR1VnWlhaaGJIVmhkR1ZrSUdOdmJtUnBkR2x2Ymx4dUlDb2dRSEJoY21GdElDQjdVM1J5YVc1bmZTQmxjbkp2Y2sxbGMzTmhaMlVnTFNCTlpYTnpZV2RsSUdWNGNHeGhhVzVwWnlCMGFHVWdaWEp5YjNJZ2FXNGdZMkZ6WlNCcGRDQnBjeUIwYUhKdmQyNWNiaUFxSUVCeVpYUjFjbTRnZG05cFpGeHVJQ292WEc1aGMzTmxjblF1ZDJGeWJpQTlJR1oxYm1OMGFXOXVJSGRoY200b1kyOXVaR2wwYVc5dUxDQmxjbkp2Y2sxbGMzTmhaMlVwSUh0Y2JpQWdZMjl1YzNRZ1pYSnliM0lnUFNCd2NtOWpaWE56UTI5dVpHbDBhVzl1S0dOdmJtUnBkR2x2Yml3Z1pYSnliM0pOWlhOellXZGxLVHRjYmlBZ2FXWWdLSFI1Y0dWdlppQmxjbkp2Y2lBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQmpiMjV6YjJ4bExuZGhjbTRvWlhKeWIzSXBPMXh1SUNCOVhHNTlPMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JoYzNObGNuUTdYRzRpWFN3aVptbHNaU0k2SW1GemMyVnlkQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUl2YzI5MWNtTmxMeUo5XG4iLCIvKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGFuIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIF9pc0FycmF5KHZhbCkge1xuICByZXR1cm4gKHZhbCAhPSBudWxsICYmXG4gICAgICAgICAgdmFsLmxlbmd0aCA+PSAwICYmXG4gICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XScpO1xufTtcbiIsIi8qKlxuICogQW4gb3B0aW1pemVkLCBwcml2YXRlIGFycmF5IGBzbGljZWAgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJndW1lbnRzfEFycmF5fSBhcmdzIFRoZSBhcnJheSBvciBhcmd1bWVudHMgb2JqZWN0IHRvIGNvbnNpZGVyLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtmcm9tPTBdIFRoZSBhcnJheSBpbmRleCB0byBzbGljZSBmcm9tLCBpbmNsdXNpdmUuXG4gKiBAcGFyYW0ge051bWJlcn0gW3RvPWFyZ3MubGVuZ3RoXSBUaGUgYXJyYXkgaW5kZXggdG8gc2xpY2UgdG8sIGV4Y2x1c2l2ZS5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldywgc2xpY2VkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9zbGljZShbMSwgMiwgMywgNCwgNV0sIDEsIDMpOyAvLz0+IFsyLCAzXVxuICpcbiAqICAgICAgdmFyIGZpcnN0VGhyZWVBcmdzID0gZnVuY3Rpb24oYSwgYiwgYywgZCkge1xuICogICAgICAgIHJldHVybiBfc2xpY2UoYXJndW1lbnRzLCAwLCAzKTtcbiAqICAgICAgfTtcbiAqICAgICAgZmlyc3RUaHJlZUFyZ3MoMSwgMiwgMywgNCk7IC8vPT4gWzEsIDIsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX3NsaWNlKGFyZ3MsIGZyb20sIHRvKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIF9zbGljZShhcmdzLCAwLCBhcmdzLmxlbmd0aCk7XG4gICAgY2FzZSAyOiByZXR1cm4gX3NsaWNlKGFyZ3MsIGZyb20sIGFyZ3MubGVuZ3RoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGxpc3QgPSBbXTtcbiAgICAgIHZhciBpZHggPSAwO1xuICAgICAgdmFyIGxlbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKGFyZ3MubGVuZ3RoLCB0bykgLSBmcm9tKTtcbiAgICAgIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICAgICAgbGlzdFtpZHhdID0gYXJnc1tmcm9tICsgaWR4XTtcbiAgICAgICAgaWR4ICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdDtcbiAgfVxufTtcbiIsInZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzQXJyYXknKTtcbnZhciBfc2xpY2UgPSByZXF1aXJlKCcuL19zbGljZScpO1xuXG5cbi8qKlxuICogU2ltaWxhciB0byBoYXNNZXRob2QsIHRoaXMgY2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBoYXMgYSBbbWV0aG9kbmFtZV1cbiAqIGZ1bmN0aW9uLiBJZiBpdCBpc24ndCBhbiBhcnJheSBpdCB3aWxsIGV4ZWN1dGUgdGhhdCBmdW5jdGlvbiBvdGhlcndpc2UgaXRcbiAqIHdpbGwgZGVmYXVsdCB0byB0aGUgcmFtZGEgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHJhbWRhIGltcGxlbXRhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZG5hbWUgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFdoYXRldmVyIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpcy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY2hlY2tGb3JNZXRob2QobWV0aG9kbmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdO1xuICAgIHJldHVybiAoX2lzQXJyYXkob2JqKSB8fCB0eXBlb2Ygb2JqW21ldGhvZG5hbWVdICE9PSAnZnVuY3Rpb24nKSA/XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDpcbiAgICAgIG9ialttZXRob2RuYW1lXS5hcHBseShvYmosIF9zbGljZShhcmd1bWVudHMsIDAsIGxlbmd0aCAtIDEpKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9pc1BsYWNlaG9sZGVyKGEpIHtcbiAgcmV0dXJuIGEgIT0gbnVsbCAmJlxuICAgICAgICAgdHlwZW9mIGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgICBhWydAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInXSA9PT0gdHJ1ZTtcbn07XG4iLCJ2YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgb25lLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY3VycnkxKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMShhKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgX2lzUGxhY2Vob2xkZXIoYSkpIHtcbiAgICAgIHJldHVybiBmMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9fY3VycnkxJyk7XG52YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBPcHRpbWl6ZWQgaW50ZXJuYWwgdHdvLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY3VycnkyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMihhLCBiKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMjtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjJcbiAgICAgICAgICAgICA6IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iKTsgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBmMlxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uKF9hKSB7IHJldHVybiBmbihfYSwgYik7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iKTsgfSlcbiAgICAgICAgICAgICA6IGZuKGEsIGIpO1xuICAgIH1cbiAgfTtcbn07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vX2N1cnJ5MScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfaXNQbGFjZWhvbGRlciA9IHJlcXVpcmUoJy4vX2lzUGxhY2Vob2xkZXInKTtcblxuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0aHJlZS1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2N1cnJ5Myhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjMoYSwgYiwgYykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjM7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYzXG4gICAgICAgICAgICAgOiBfY3VycnkyKGZ1bmN0aW9uKF9iLCBfYykgeyByZXR1cm4gZm4oYSwgX2IsIF9jKTsgfSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYzXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTIoZnVuY3Rpb24oX2EsIF9jKSB7IHJldHVybiBmbihfYSwgYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uKF9iLCBfYykgeyByZXR1cm4gZm4oYSwgX2IsIF9jKTsgfSlcbiAgICAgICAgICAgICA6IF9jdXJyeTEoZnVuY3Rpb24oX2MpIHsgcmV0dXJuIGZuKGEsIGIsIF9jKTsgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBmM1xuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uKF9hLCBfYikgeyByZXR1cm4gZm4oX2EsIF9iLCBjKTsgfSlcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbihfYSwgX2MpIHsgcmV0dXJuIGZuKF9hLCBiLCBfYyk7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTIoZnVuY3Rpb24oX2IsIF9jKSB7IHJldHVybiBmbihhLCBfYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uKF9hKSB7IHJldHVybiBmbihfYSwgYiwgYyk7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iLCBjKTsgfSlcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MShmdW5jdGlvbihfYykgeyByZXR1cm4gZm4oYSwgYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogZm4oYSwgYiwgYyk7XG4gICAgfVxuICB9O1xufTtcbiIsInZhciBfY2hlY2tGb3JNZXRob2QgPSByZXF1aXJlKCcuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZCcpO1xudmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhfY2hlY2tGb3JNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2UoZnJvbUluZGV4LCB0b0luZGV4LCBsaXN0KSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xufSkpO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG9cbiAqIHRoZSBmb2N1c2VkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IChhIC0+IGEpIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5wcm9wLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBoZWFkTGVucyA9IFIubGVuc0luZGV4KDApO1xuICpcbiAqICAgICAgUi5vdmVyKGhlYWRMZW5zLCBSLnRvVXBwZXIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydGT08nLCAnYmFyJywgJ2JheiddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICAvLyBgSWRlbnRpdHlgIGlzIGEgZnVuY3RvciB0aGF0IGhvbGRzIGEgc2luZ2xlIHZhbHVlLCB3aGVyZSBgbWFwYCBzaW1wbHlcbiAgLy8gdHJhbnNmb3JtcyB0aGUgaGVsZCB2YWx1ZSB3aXRoIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAgdmFyIElkZW50aXR5ID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB7dmFsdWU6IHgsIG1hcDogZnVuY3Rpb24oZikgeyByZXR1cm4gSWRlbnRpdHkoZih4KSk7IH19O1xuICB9O1xuXG4gIHJldHVybiBfY3VycnkzKGZ1bmN0aW9uIG92ZXIobGVucywgZiwgeCkge1xuICAgIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGlzIGZpcnN0IHRyYW5zZm9ybWVkIHdpdGggYGZgLFxuICAgIC8vIHRoZW4gc2V0IGFzIHRoZSB2YWx1ZSBvZiBhbiBgSWRlbnRpdHlgLiBUaGlzIGlzIHRoZW4gbWFwcGVkIG92ZXIgd2l0aCB0aGVcbiAgICAvLyBzZXR0ZXIgZnVuY3Rpb24gb2YgdGhlIGxlbnMuXG4gICAgcmV0dXJuIGxlbnMoZnVuY3Rpb24oeSkgeyByZXR1cm4gSWRlbnRpdHkoZih5KSk7IH0pKHgpLnZhbHVlO1xuICB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgZm9yXG4gKiBub24tcHJpbWl0aXZlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMga25vd24gYXMgYGNvbnN0YCwgYGNvbnN0YW50YCwgb3IgYEtgIChmb3IgSyBjb21iaW5hdG9yKSBpblxuICogb3RoZXIgbGFuZ3VhZ2VzIGFuZCBsaWJyYXJpZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogKiAtPiB2YWwuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHQgPSBSLmFsd2F5cygnVGVlJyk7XG4gKiAgICAgIHQoKTsgLy89PiAnVGVlJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gYWx3YXlzKHZhbCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBhbHdheXMgPSByZXF1aXJlKCcuL2Fsd2F5cycpO1xudmFyIG92ZXIgPSByZXF1aXJlKCcuL292ZXInKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IGEgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnByb3AsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLnNldCh4TGVucywgOCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDgsIHk6IDJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBzZXQobGVucywgdiwgeCkge1xuICByZXR1cm4gb3ZlcihsZW5zLCBhbHdheXModiksIHgpO1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9hcml0eShuLCBmbikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYTApIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYTAsIGExKSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA0OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA1OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgNjogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA3OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA4OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgOTogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAxMDogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gX2FyaXR5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gdGVuJyk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9waXBlKGYsIGcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBnLmNhbGwodGhpcywgZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWFdyYXAoZm4pIHtcbiAgICB0aGlzLmYgPSBmbjtcbiAgfVxuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2luaXQgbm90IGltcGxlbWVudGVkIG9uIFhXcmFwJyk7XG4gIH07XG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24oYWNjKSB7IHJldHVybiBhY2M7IH07XG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKGFjYywgeCkge1xuICAgIHJldHVybiB0aGlzLmYoYWNjLCB4KTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gX3h3cmFwKGZuKSB7IHJldHVybiBuZXcgWFdyYXAoZm4pOyB9O1xufSgpKTtcbiIsInZhciBfYXJpdHkgPSByZXF1aXJlKCcuL2ludGVybmFsL19hcml0eScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGJvdW5kIHRvIGEgY29udGV4dC5cbiAqIE5vdGU6IGBSLmJpbmRgIGRvZXMgbm90IHByb3ZpZGUgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQtYmluZGluZyBjYXBhYmlsaXRpZXMgb2ZcbiAqIFtGdW5jdGlvbi5wcm90b3R5cGUuYmluZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCogLT4gKikgLT4geyp9IC0+ICgqIC0+ICopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmluZCB0byBjb250ZXh0XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc09iaiBUaGUgY29udGV4dCB0byBiaW5kIGBmbmAgdG9cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIGluIHRoZSBjb250ZXh0IG9mIGB0aGlzT2JqYC5cbiAqIEBzZWUgUi5wYXJ0aWFsXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGxvZyA9IFIuYmluZChjb25zb2xlLmxvZywgY29uc29sZSk7XG4gKiAgICAgIFIucGlwZShSLmFzc29jKCdhJywgMiksIFIudGFwKGxvZyksIFIuYXNzb2MoJ2EnLCAzKSkoe2E6IDF9KTsgLy89PiB7YTogM31cbiAqICAgICAgLy8gbG9ncyB7YTogMn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNPYmopIHtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzT2JqLCBhcmd1bWVudHMpO1xuICB9KTtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNTdHJpbmcoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBTdHJpbmddJztcbn07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9pc0FycmF5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNBcnJheScpO1xudmFyIF9pc1N0cmluZyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzU3RyaW5nJyk7XG5cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgc2ltaWxhciB0byBhbiBhcnJheS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC41LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGhhcyBhIG51bWVyaWMgbGVuZ3RoIHByb3BlcnR5IGFuZCBleHRyZW1lIGluZGljZXMgZGVmaW5lZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc0FycmF5TGlrZShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzQXJyYXlMaWtlKHRydWUpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNBcnJheUxpa2Uoe30pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNBcnJheUxpa2Uoe2xlbmd0aDogMTB9KTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzQXJyYXlMaWtlKHswOiAnemVybycsIDk6ICduaW5lJywgbGVuZ3RoOiAxMH0pOyAvLz0+IHRydWVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgaWYgKF9pc0FycmF5KHgpKSB7IHJldHVybiB0cnVlOyB9XG4gIGlmICgheCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKF9pc1N0cmluZyh4KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKHgubm9kZVR5cGUgPT09IDEpIHsgcmV0dXJuICEheC5sZW5ndGg7IH1cbiAgaWYgKHgubGVuZ3RoID09PSAwKSB7IHJldHVybiB0cnVlOyB9XG4gIGlmICh4Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geC5oYXNPd25Qcm9wZXJ0eSgwKSAmJiB4Lmhhc093blByb3BlcnR5KHgubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG4iLCJ2YXIgX3h3cmFwID0gcmVxdWlyZSgnLi9feHdyYXAnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vYmluZCcpO1xudmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaXNBcnJheUxpa2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gX2FycmF5UmVkdWNlKHhmLCBhY2MsIGxpc3QpIHtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBsaXN0W2lkeF0pO1xuICAgICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9pdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBpdGVyKSB7XG4gICAgdmFyIHN0ZXAgPSBpdGVyLm5leHQoKTtcbiAgICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuICAgICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBzdGVwLnZhbHVlKTtcbiAgICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RlcCA9IGl0ZXIubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShhY2MpO1xuICB9XG5cbiAgZnVuY3Rpb24gX21ldGhvZFJlZHVjZSh4ZiwgYWNjLCBvYmopIHtcbiAgICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShvYmoucmVkdWNlKGJpbmQoeGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10sIHhmKSwgYWNjKSk7XG4gIH1cblxuICB2YXIgc3ltSXRlcmF0b3IgPSAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpID8gU3ltYm9sLml0ZXJhdG9yIDogJ0BAaXRlcmF0b3InO1xuICByZXR1cm4gZnVuY3Rpb24gX3JlZHVjZShmbiwgYWNjLCBsaXN0KSB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm4gPSBfeHdyYXAoZm4pO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2UobGlzdCkpIHtcbiAgICAgIHJldHVybiBfYXJyYXlSZWR1Y2UoZm4sIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5yZWR1Y2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBfbWV0aG9kUmVkdWNlKGZuLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICBpZiAobGlzdFtzeW1JdGVyYXRvcl0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIF9pdGVyYWJsZVJlZHVjZShmbiwgYWNjLCBsaXN0W3N5bUl0ZXJhdG9yXSgpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsaXN0Lm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBfaXRlcmFibGVSZWR1Y2UoZm4sIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZHVjZTogbGlzdCBtdXN0IGJlIGFycmF5IG9yIGl0ZXJhYmxlJyk7XG4gIH07XG59KCkpO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBgUi5yZWR1Y2VkYCB0byBzaG9ydGN1dCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZWAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kLiBGb3IgbW9yZSBkZXRhaWxzXG4gKiBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9yZWR1Y2UjRGVzY3JpcHRpb25cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgcmVkdWNlYCBtZXRob2Qgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IFtiXSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5LlxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHsqfSBUaGUgZmluYWwsIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBSLnJlZHVjZWQsIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbnVtYmVycyA9IFsxLCAyLCAzXTtcbiAqICAgICAgdmFyIHBsdXMgPSAoYSwgYikgPT4gYSArIGI7XG4gKlxuICogICAgICBSLnJlZHVjZShwbHVzLCAxMCwgbnVtYmVycyk7IC8vPT4gMTZcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKF9yZWR1Y2UpO1xuIiwidmFyIF9jaGVja0Zvck1ldGhvZCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kJyk7XG52YXIgc2xpY2UgPSByZXF1aXJlKCcuL3NsaWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGxpc3Qgb3Igc3RyaW5nIChvciBvYmplY3RcbiAqIHdpdGggYSBgdGFpbGAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgc2xpY2VgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5oZWFkLCBSLmluaXQsIFIubGFzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGFpbChbMSwgMiwgM10pOyAgLy89PiBbMiwgM11cbiAqICAgICAgUi50YWlsKFsxLCAyXSk7ICAgICAvLz0+IFsyXVxuICogICAgICBSLnRhaWwoWzFdKTsgICAgICAgIC8vPT4gW11cbiAqICAgICAgUi50YWlsKFtdKTsgICAgICAgICAvLz0+IFtdXG4gKlxuICogICAgICBSLnRhaWwoJ2FiYycpOyAgLy89PiAnYmMnXG4gKiAgICAgIFIudGFpbCgnYWInKTsgICAvLz0+ICdiJ1xuICogICAgICBSLnRhaWwoJ2EnKTsgICAgLy89PiAnJ1xuICogICAgICBSLnRhaWwoJycpOyAgICAgLy89PiAnJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jaGVja0Zvck1ldGhvZCgndGFpbCcsIHNsaWNlKDEsIEluZmluaXR5KSk7XG4iLCJ2YXIgX2FyaXR5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fYXJpdHknKTtcbnZhciBfcGlwZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3BpcGUnKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpO1xudmFyIHRhaWwgPSByZXF1aXJlKCcuL3RhaWwnKTtcblxuXG4vKipcbiAqIFBlcmZvcm1zIGxlZnQtdG8tcmlnaHQgZnVuY3Rpb24gY29tcG9zaXRpb24uIFRoZSBsZWZ0bW9zdCBmdW5jdGlvbiBtYXkgaGF2ZVxuICogYW55IGFyaXR5OyB0aGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBtdXN0IGJlIHVuYXJ5LlxuICpcbiAqIEluIHNvbWUgbGlicmFyaWVzIHRoaXMgZnVuY3Rpb24gaXMgbmFtZWQgYHNlcXVlbmNlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIHJlc3VsdCBvZiBwaXBlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGN1cnJpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCgoYSwgYiwgLi4uLCBuKSAtPiBvKSwgKG8gLT4gcCksIC4uLiwgKHggLT4geSksICh5IC0+IHopKSAtPiAoKGEsIGIsIC4uLiwgbikgLT4geilcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIuY29tcG9zZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBmID0gUi5waXBlKE1hdGgucG93LCBSLm5lZ2F0ZSwgUi5pbmMpO1xuICpcbiAqICAgICAgZigzLCA0KTsgLy8gLSgzXjQpICsgMVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBpcGUoKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwaXBlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBfYXJpdHkoYXJndW1lbnRzWzBdLmxlbmd0aCxcbiAgICAgICAgICAgICAgICByZWR1Y2UoX3BpcGUsIGFyZ3VtZW50c1swXSwgdGFpbChhcmd1bWVudHMpKSk7XG59O1xuIiwiLyoqXG4gKiBQcml2YXRlIGBjb25jYXRgIGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBhcnJheS1saWtlIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0MT1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDI9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3LCBtZXJnZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2NvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2NvbmNhdChzZXQxLCBzZXQyKSB7XG4gIHNldDEgPSBzZXQxIHx8IFtdO1xuICBzZXQyID0gc2V0MiB8fCBbXTtcbiAgdmFyIGlkeDtcbiAgdmFyIGxlbjEgPSBzZXQxLmxlbmd0aDtcbiAgdmFyIGxlbjIgPSBzZXQyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4xKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MVtpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4yKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gc2V0MltpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gcHJlcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChbZWxdLCBsaXN0KTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gc3VwcGxpZWQgYW4gb2JqZWN0IHJldHVybnMgdGhlIGluZGljYXRlZFxuICogcHJvcGVydHkgb2YgdGhhdCBvYmplY3QsIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgcyAtPiB7czogYX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtTdHJpbmd9IHAgVGhlIHByb3BlcnR5IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGF0IGBvYmoucGAuXG4gKiBAc2VlIFIucGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcCgneCcsIHt4OiAxMDB9KTsgLy89PiAxMDBcbiAqICAgICAgUi5wcm9wKCd4Jywge30pOyAvLz0+IHVuZGVmaW5lZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gcHJvcChwLCBvYmopIHsgcmV0dXJuIG9ialtwXTsgfSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9pc1RyYW5zZm9ybWVyKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9ialsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgX2lzQXJyYXkgPSByZXF1aXJlKCcuL19pc0FycmF5Jyk7XG52YXIgX2lzVHJhbnNmb3JtZXIgPSByZXF1aXJlKCcuL19pc1RyYW5zZm9ybWVyJyk7XG52YXIgX3NsaWNlID0gcmVxdWlyZSgnLi9fc2xpY2UnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgd2l0aCBkaWZmZXJlbnQgc3RyYXRlZ2llcyBiYXNlZCBvbiB0aGVcbiAqIG9iamVjdCBpbiBsaXN0IHBvc2l0aW9uIChsYXN0IGFyZ3VtZW50KS4gSWYgaXQgaXMgYW4gYXJyYXksIGV4ZWN1dGVzIFtmbl0uXG4gKiBPdGhlcndpc2UsIGlmIGl0IGhhcyBhIGZ1bmN0aW9uIHdpdGggW21ldGhvZG5hbWVdLCBpdCB3aWxsIGV4ZWN1dGUgdGhhdFxuICogZnVuY3Rpb24gKGZ1bmN0b3IgY2FzZSkuIE90aGVyd2lzZSwgaWYgaXQgaXMgYSB0cmFuc2Zvcm1lciwgdXNlcyB0cmFuc2R1Y2VyXG4gKiBbeGZdIHRvIHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lciAodHJhbnNkdWNlciBjYXNlKS4gT3RoZXJ3aXNlLCBpdCB3aWxsXG4gKiBkZWZhdWx0IHRvIGV4ZWN1dGluZyBbZm5dLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kbmFtZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHhmIHRyYW5zZHVjZXIgdG8gaW5pdGlhbGl6ZSBpZiBvYmplY3QgaXMgdHJhbnNmb3JtZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIGRlZmF1bHQgcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvbiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvblxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9kaXNwYXRjaGFibGUobWV0aG9kbmFtZSwgeGYsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1tsZW5ndGggLSAxXTtcbiAgICBpZiAoIV9pc0FycmF5KG9iaikpIHtcbiAgICAgIHZhciBhcmdzID0gX3NsaWNlKGFyZ3VtZW50cywgMCwgbGVuZ3RoIC0gMSk7XG4gICAgICBpZiAodHlwZW9mIG9ialttZXRob2RuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gb2JqW21ldGhvZG5hbWVdLmFwcGx5KG9iaiwgYXJncyk7XG4gICAgICB9XG4gICAgICBpZiAoX2lzVHJhbnNmb3JtZXIob2JqKSkge1xuICAgICAgICB2YXIgdHJhbnNkdWNlciA9IHhmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gdHJhbnNkdWNlcihvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9tYXAoZm4sIGZ1bmN0b3IpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBmdW5jdG9yLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbik7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICByZXN1bHRbaWR4XSA9IGZuKGZ1bmN0b3JbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9pbml0J10oKTtcbiAgfSxcbiAgcmVzdWx0OiBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH1cbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWE1hcChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYTWFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5mKGlucHV0KSk7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3htYXAoZiwgeGYpIHsgcmV0dXJuIG5ldyBYTWFwKGYsIHhmKTsgfSk7XG59KCkpO1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vX2FyaXR5Jyk7XG52YXIgX2lzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL19pc1BsYWNlaG9sZGVyJyk7XG5cblxuLyoqXG4gKiBJbnRlcm5hbCBjdXJyeU4gZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgb2YgdGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSByZWNlaXZlZCBBbiBhcnJheSBvZiBhcmd1bWVudHMgcmVjZWl2ZWQgdGh1cyBmYXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2N1cnJ5TihsZW5ndGgsIHJlY2VpdmVkLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvbWJpbmVkID0gW107XG4gICAgdmFyIGFyZ3NJZHggPSAwO1xuICAgIHZhciBsZWZ0ID0gbGVuZ3RoO1xuICAgIHZhciBjb21iaW5lZElkeCA9IDA7XG4gICAgd2hpbGUgKGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoIHx8IGFyZ3NJZHggPCBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoICYmXG4gICAgICAgICAgKCFfaXNQbGFjZWhvbGRlcihyZWNlaXZlZFtjb21iaW5lZElkeF0pIHx8XG4gICAgICAgICAgIGFyZ3NJZHggPj0gYXJndW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZWRbY29tYmluZWRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzW2FyZ3NJZHhdO1xuICAgICAgICBhcmdzSWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBjb21iaW5lZFtjb21iaW5lZElkeF0gPSByZXN1bHQ7XG4gICAgICBpZiAoIV9pc1BsYWNlaG9sZGVyKHJlc3VsdCkpIHtcbiAgICAgICAgbGVmdCAtPSAxO1xuICAgICAgfVxuICAgICAgY29tYmluZWRJZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQgPD0gMCA/IGZuLmFwcGx5KHRoaXMsIGNvbWJpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgOiBfYXJpdHkobGVmdCwgX2N1cnJ5TihsZW5ndGgsIGNvbWJpbmVkLCBmbikpO1xuICB9O1xufTtcbiIsInZhciBfYXJpdHkgPSByZXF1aXJlKCcuL2ludGVybmFsL19hcml0eScpO1xudmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2N1cnJ5TiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5TicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZXF1aXZhbGVudCBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24sIHdpdGggdGhlIHNwZWNpZmllZFxuICogYXJpdHkuIFRoZSBjdXJyaWVkIGZ1bmN0aW9uIGhhcyB0d28gdW51c3VhbCBjYXBhYmlsaXRpZXMuIEZpcnN0LCBpdHNcbiAqIGFyZ3VtZW50cyBuZWVkbid0IGJlIHByb3ZpZGVkIG9uZSBhdCBhIHRpbWUuIElmIGBnYCBpcyBgUi5jdXJyeU4oMywgZilgLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSkoMikoMylgXG4gKiAgIC0gYGcoMSkoMiwgMylgXG4gKiAgIC0gYGcoMSwgMikoMylgXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKlxuICogU2Vjb25kbHksIHRoZSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIGBSLl9fYCBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIGBSLl9fYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBzdW1BcmdzID0gKC4uLmFyZ3MpID0+IFIuc3VtKGFyZ3MpO1xuICpcbiAqICAgICAgdmFyIGN1cnJpZWRBZGRGb3VyTnVtYmVycyA9IFIuY3VycnlOKDQsIHN1bUFyZ3MpO1xuICogICAgICB2YXIgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgdmFyIGcgPSBmKDMpO1xuICogICAgICBnKDQpOyAvLz0+IDEwXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBjdXJyeU4obGVuZ3RoLCBmbikge1xuICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIF9jdXJyeTEoZm4pO1xuICB9XG4gIHJldHVybiBfYXJpdHkobGVuZ3RoLCBfY3VycnlOKGxlbmd0aCwgW10sIGZuKSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2hhcyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufTtcbiIsInZhciBfaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFyZ3VtZW50cykgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nID9cbiAgICBmdW5jdGlvbiBfaXNBcmd1bWVudHMoeCkgeyByZXR1cm4gdG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7IH0gOlxuICAgIGZ1bmN0aW9uIF9pc0FyZ3VtZW50cyh4KSB7IHJldHVybiBfaGFzKCdjYWxsZWUnLCB4KTsgfTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL2ludGVybmFsL19oYXMnKTtcbnZhciBfaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc0FyZ3VtZW50cycpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mXG4gKiB0aGUgc3VwcGxpZWQgb2JqZWN0LlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW2tdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5rZXlzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWydhJywgJ2InLCAnYyddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICAvLyBjb3ZlciBJRSA8IDkga2V5cyBpc3N1ZXNcbiAgdmFyIGhhc0VudW1CdWcgPSAhKHt0b1N0cmluZzogbnVsbH0pLnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xuICB2YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWydjb25zdHJ1Y3RvcicsICd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuICAvLyBTYWZhcmkgYnVnXG4gIHZhciBoYXNBcmdzRW51bUJ1ZyA9IChmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5wcm9wZXJ0eUlzRW51bWVyYWJsZSgnbGVuZ3RoJyk7XG4gIH0oKSk7XG5cbiAgdmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMobGlzdCwgaXRlbSkge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgaWYgKGxpc3RbaWR4XSA9PT0gaXRlbSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcmV0dXJuIHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiAhaGFzQXJnc0VudW1CdWcgP1xuICAgIF9jdXJyeTEoZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgICAgIHJldHVybiBPYmplY3Qob2JqKSAhPT0gb2JqID8gW10gOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIH0pIDpcbiAgICBfY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gICAgICBpZiAoT2JqZWN0KG9iaikgIT09IG9iaikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgcHJvcCwgbklkeDtcbiAgICAgIHZhciBrcyA9IFtdO1xuICAgICAgdmFyIGNoZWNrQXJnc0xlbmd0aCA9IGhhc0FyZ3NFbnVtQnVnICYmIF9pc0FyZ3VtZW50cyhvYmopO1xuICAgICAgZm9yIChwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoX2hhcyhwcm9wLCBvYmopICYmICghY2hlY2tBcmdzTGVuZ3RoIHx8IHByb3AgIT09ICdsZW5ndGgnKSkge1xuICAgICAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGFzRW51bUJ1Zykge1xuICAgICAgICBuSWR4ID0gbm9uRW51bWVyYWJsZVByb3BzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChuSWR4ID49IDApIHtcbiAgICAgICAgICBwcm9wID0gbm9uRW51bWVyYWJsZVByb3BzW25JZHhdO1xuICAgICAgICAgIGlmIChfaGFzKHByb3AsIG9iaikgJiYgIWNvbnRhaW5zKGtzLCBwcm9wKSkge1xuICAgICAgICAgICAga3Nba3MubGVuZ3RoXSA9IHByb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5JZHggLT0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGtzO1xuICAgIH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF9tYXAgPSByZXF1aXJlKCcuL2ludGVybmFsL19tYXAnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3htYXAgPSByZXF1aXJlKCcuL2ludGVybmFsL194bWFwJyk7XG52YXIgY3VycnlOID0gcmVxdWlyZSgnLi9jdXJyeU4nKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cblxuLyoqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uIGFuZFxuICogYSBbZnVuY3Rvcl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNmdW5jdG9yKSxcbiAqIGFwcGxpZXMgdGhlIGZ1bmN0aW9uIHRvIGVhY2ggb2YgdGhlIGZ1bmN0b3IncyB2YWx1ZXMsIGFuZCByZXR1cm5zXG4gKiBhIGZ1bmN0b3Igb2YgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogUmFtZGEgcHJvdmlkZXMgc3VpdGFibGUgYG1hcGAgaW1wbGVtZW50YXRpb25zIGZvciBgQXJyYXlgIGFuZCBgT2JqZWN0YCxcbiAqIHNvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGFwcGxpZWQgdG8gYFsxLCAyLCAzXWAgb3IgYHt4OiAxLCB5OiAyLCB6OiAzfWAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYG1hcGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEFsc28gdHJlYXRzIGZ1bmN0aW9ucyBhcyBmdW5jdG9ycyBhbmQgd2lsbCBjb21wb3NlIHRoZW0gdG9nZXRoZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGdW5jdG9yIGYgPT4gKGEgLT4gYikgLT4gZiBhIC0+IGYgYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBldmVyeSBlbGVtZW50IG9mIHRoZSBpbnB1dCBgbGlzdGAuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGJlIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG5ldyBsaXN0LlxuICogQHNlZSBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkb3VibGUgPSB4ID0+IHggKiAyO1xuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCBbMSwgMiwgM10pOyAvLz0+IFsyLCA0LCA2XVxuICpcbiAqICAgICAgUi5tYXAoZG91YmxlLCB7eDogMSwgeTogMiwgejogM30pOyAvLz0+IHt4OiAyLCB5OiA0LCB6OiA2fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZSgnbWFwJywgX3htYXAsIGZ1bmN0aW9uIG1hcChmbiwgZnVuY3Rvcikge1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jdG9yKSkge1xuICAgIGNhc2UgJ1tvYmplY3QgRnVuY3Rpb25dJzpcbiAgICAgIHJldHVybiBjdXJyeU4oZnVuY3Rvci5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBmdW5jdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgfSk7XG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzpcbiAgICAgIHJldHVybiBfcmVkdWNlKGZ1bmN0aW9uKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gZm4oZnVuY3RvcltrZXldKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9LCBrZXlzKGZ1bmN0b3IpKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIF9tYXAoZm4sIGZ1bmN0b3IpO1xuICB9XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyBmb3IgdGhlIGdpdmVuIGdldHRlciBhbmQgc2V0dGVyIGZ1bmN0aW9ucy4gVGhlIGdldHRlciBcImdldHNcIlxuICogdGhlIHZhbHVlIG9mIHRoZSBmb2N1czsgdGhlIHNldHRlciBcInNldHNcIiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzLiBUaGUgc2V0dGVyXG4gKiBzaG91bGQgbm90IG11dGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyAocyAtPiBhKSAtPiAoKGEsIHMpIC0+IHMpIC0+IExlbnMgcyBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlclxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB4TGVucyA9IFIubGVucyhSLnByb3AoJ3gnKSwgUi5hc3NvYygneCcpKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgICAvLz0+IDFcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIub3Zlcih4TGVucywgUi5uZWdhdGUsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiAtMSwgeTogMn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGxlbnMoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRvRnVuY3RvckZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgcmV0dXJuIG1hcChcbiAgICAgICAgZnVuY3Rpb24oZm9jdXMpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKGZvY3VzLCB0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICB0b0Z1bmN0b3JGbihnZXR0ZXIodGFyZ2V0KSlcbiAgICAgICk7XG4gICAgfTtcbiAgfTtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBjdXJyeU4gPSByZXF1aXJlKCcuL2N1cnJ5TicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZXF1aXZhbGVudCBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIFRoZSBjdXJyaWVkIGZ1bmN0aW9uXG4gKiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzIGFyZ3VtZW50cyBuZWVkbid0IGJlIHByb3ZpZGVkIG9uZVxuICogYXQgYSB0aW1lLiBJZiBgZmAgaXMgYSB0ZXJuYXJ5IGZ1bmN0aW9uIGFuZCBgZ2AgaXMgYFIuY3VycnkoZilgLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSkoMikoMylgXG4gKiAgIC0gYGcoMSkoMiwgMylgXG4gKiAgIC0gYGcoMSwgMikoMylgXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKlxuICogU2Vjb25kbHksIHRoZSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIGBSLl9fYCBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIGBSLl9fYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqIC0+IGEpIC0+ICgqIC0+IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcsIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY3VycnlOXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGFkZEZvdXJOdW1iZXJzID0gKGEsIGIsIGMsIGQpID0+IGEgKyBiICsgYyArIGQ7XG4gKlxuICogICAgICB2YXIgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeShhZGRGb3VyTnVtYmVycyk7XG4gKiAgICAgIHZhciBmID0gY3VycmllZEFkZEZvdXJOdW1iZXJzKDEsIDIpO1xuICogICAgICB2YXIgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGN1cnJ5KGZuKSB7XG4gIHJldHVybiBjdXJyeU4oZm4ubGVuZ3RoLCBmbik7XG59KTtcbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLyoqXG4gKiBAbW9kdWxlIGxpYi9laXRoZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBFaXRoZXJcblxuLy8gLS0gQWxpYXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgY2xvbmUgICAgICAgICA9IE9iamVjdC5jcmVhdGVcbnZhciB1bmltcGxlbWVudGVkID0gZnVuY3Rpb24oKXsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJykgfVxudmFyIG5vb3AgICAgICAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblxuLy8gLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVGhlIGBFaXRoZXIoYSwgYilgIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBsb2dpY2FsIGRpc2p1bmN0aW9uIGJldHdlZW4gYGFgXG4gKiBhbmQgYGJgLiBJbiBvdGhlciB3b3JkcywgYEVpdGhlcmAgbWF5IGNvbnRhaW4gZWl0aGVyIGEgdmFsdWUgb2YgdHlwZSBgYWAgb3JcbiAqIGEgdmFsdWUgb2YgdHlwZSBgYmAsIGF0IGFueSBnaXZlbiB0aW1lLiBUaGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gaXNcbiAqIGJpYXNlZCBvbiB0aGUgcmlnaHQgdmFsdWUgKGBiYCksIHRodXMgcHJvamVjdGlvbnMgd2lsbCB0YWtlIHRoZSByaWdodCB2YWx1ZVxuICogb3ZlciB0aGUgbGVmdCBvbmUuXG4gKlxuICogVGhpcyBjbGFzcyBtb2RlbHMgdHdvIGRpZmZlcmVudCBjYXNlczogYExlZnQgYWAgYW5kIGBSaWdodCBiYCwgYW5kIGNhbiBob2xkXG4gKiBvbmUgb2YgdGhlIGNhc2VzIGF0IGFueSBnaXZlbiB0aW1lLiBUaGUgcHJvamVjdGlvbnMgYXJlLCBub25lIHRoZSBsZXNzLFxuICogYmlhc2VkIGZvciB0aGUgYFJpZ2h0YCBjYXNlLCB0aHVzIGEgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIHN0cnVjdHVyZSBpcyB0b1xuICogaG9sZCB0aGUgcmVzdWx0cyBvZiBjb21wdXRhdGlvbnMgdGhhdCBtYXkgZmFpbCwgd2hlbiB5b3Ugd2FudCB0byBzdG9yZVxuICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgZmFpbHVyZSAoaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24pLlxuICpcbiAqIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWVzIG9mIGBFaXRoZXIoYSwgYilgIGNhbiBiZSBjb21iaW5lZCBhbmQgbWFuaXB1bGF0ZWQgYnlcbiAqIHVzaW5nIHRoZSBleHByZXNzaXZlIG1vbmFkaWMgb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3Mgc2FmZWx5IHNlcXVlbmNpbmdcbiAqIG9wZXJhdGlvbnMgdGhhdCBtYXkgZmFpbCwgYW5kIHNhZmVseSBjb21wb3NpbmcgdmFsdWVzIHRoYXQgeW91IGRvbid0IGtub3dcbiAqIHdoZXRoZXIgdGhleSdyZSBwcmVzZW50IG9yIG5vdCwgZmFpbGluZyBlYXJseSAocmV0dXJuaW5nIGEgYExlZnQgYWApIGlmIGFueVxuICogb2YgdGhlIG9wZXJhdGlvbnMgZmFpbC5cbiAqXG4gKiBXaGlsZSB0aGlzIGNsYXNzIGNhbiBjZXJ0YWlubHkgbW9kZWwgaW5wdXQgdmFsaWRhdGlvbnMsIHRoZSBbVmFsaWRhdGlvbl1bXVxuICogc3RydWN0dXJlIGxlbmRzIGl0c2VsZiBiZXR0ZXIgdG8gdGhhdCB1c2UgY2FzZSwgc2luY2UgaXQgY2FuIG5hdHVyYWxseVxuICogYWdncmVnYXRlIGZhaWx1cmVzIOKAlCBtb25hZHMgc2hvcnRjdXQgb24gdGhlIGZpcnN0IGZhaWx1cmUuXG4gKlxuICogW1ZhbGlkYXRpb25dOiBodHRwczovL2dpdGh1Yi5jb20vZm9sa3RhbGUvZGF0YS52YWxpZGF0aW9uXG4gKlxuICpcbiAqIEBjbGFzc1xuICogQHN1bW1hcnlcbiAqIEVpdGhlclvOsSwgzrJdIDw6IEFwcGxpY2F0aXZlW86yXVxuICogICAgICAgICAgICAgICAsIEZ1bmN0b3JbzrJdXG4gKiAgICAgICAgICAgICAgICwgQ2hhaW5bzrJdXG4gKiAgICAgICAgICAgICAgICwgU2hvd1xuICogICAgICAgICAgICAgICAsIEVxXG4gKi9cbmZ1bmN0aW9uIEVpdGhlcigpIHsgfVxuXG5MZWZ0LnByb3RvdHlwZSA9IGNsb25lKEVpdGhlci5wcm90b3R5cGUpXG5mdW5jdGlvbiBMZWZ0KGEpIHtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuUmlnaHQucHJvdG90eXBlID0gY2xvbmUoRWl0aGVyLnByb3RvdHlwZSlcbmZ1bmN0aW9uIFJpZ2h0KGEpIHtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuLy8gLS0gQ29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBob2xkaW5nIGEgYExlZnRgIHZhbHVlLiBUaGlzXG4gKiB1c3VhbGx5IHJlcHJlc2VudHMgYSBmYWlsdXJlIGR1ZSB0byB0aGUgcmlnaHQtYmlhcyBvZiB0aGlzIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSBhIOKGkiBFaXRoZXJbzrEsIM6yXVxuICovXG5FaXRoZXIuTGVmdCA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBMZWZ0KGEpXG59XG5FaXRoZXIucHJvdG90eXBlLkxlZnQgPSBFaXRoZXIuTGVmdFxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgaG9sZGluZyBhIGBSaWdodGAgdmFsdWUuIFRoaXNcbiAqIHVzdWFsbHkgcmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgdmFsdWUgZHVlIHRvIHRoZSByaWdodCBiaWFzIG9mIHRoaXNcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsiDihpIgRWl0aGVyW86xLCDOsl1cbiAqL1xuRWl0aGVyLlJpZ2h0ID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gbmV3IFJpZ2h0KGEpXG59XG5FaXRoZXIucHJvdG90eXBlLlJpZ2h0ID0gRWl0aGVyLlJpZ2h0XG5cblxuLy8gLS0gQ29udmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBmcm9tIGEgbnVsbGFibGUgdHlwZS5cbiAqXG4gKiBUYWtlcyB0aGUgYExlZnRgIGNhc2UgaWYgdGhlIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC4gVGFrZXMgdGhlXG4gKiBgUmlnaHRgIGNhc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBzdW1tYXJ5IM6xIOKGkiBFaXRoZXJbzrEsIM6xXVxuICovXG5FaXRoZXIuZnJvbU51bGxhYmxlID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gYSAhPSBudWxsPyAgICAgICBuZXcgUmlnaHQoYSlcbiAgOiAgICAgIC8qIG90aGVyd2lzZSAqLyAgbmV3IExlZnQoYSlcbn1cbkVpdGhlci5wcm90b3R5cGUuZnJvbU51bGxhYmxlID0gRWl0aGVyLmZyb21OdWxsYWJsZVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgZnJvbSBhIGBWYWxpZGF0aW9uW86xLCDOsl1gIHR5cGUuXG4gKlxuICogQHN1bW1hcnkgVmFsaWRhdGlvblvOsSwgzrJdIOKGkiBFaXRoZXJbzrEsIM6yXVxuICovXG5FaXRoZXIuZnJvbVZhbGlkYXRpb24gPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmZvbGQoRWl0aGVyLkxlZnQsIEVpdGhlci5SaWdodClcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIHN5bmNocm9ub3VzIGNvbXB1dGF0aW9uIHRoYXQgbWF5IHRocm93IGFuZCBjb252ZXJ0cyBpdCB0byBhblxuICogRWl0aGVyIHR5cGUuXG4gKlxuICogQHN1bW1hcnkgKM6x4oKBLCDOseKCgiwgLi4uLCDOseKCmSAtPiDOsiA6OiB0aHJvd3MgzrMpIC0+ICjOseKCgSwgzrHigoIsIC4uLiwgzrHigpkgLT4gRWl0aGVyW86zLCDOsl0pXG4gKi9cbkVpdGhlci50cnkgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBSaWdodChmLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpXG4gICAgfSBjYXRjaChlKSB7XG4gICAgICByZXR1cm4gbmV3IExlZnQoZSlcbiAgICB9XG4gIH1cbn1cblxuXG4vLyAtLSBQcmVkaWNhdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBgRWl0aGVyW86xLCDOsl1gIGNvbnRhaW5zIGEgYExlZnRgIHZhbHVlLlxuICpcbiAqIEBzdW1tYXJ5IEJvb2xlYW5cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5pc0xlZnQgPSBmYWxzZVxuTGVmdC5wcm90b3R5cGUuaXNMZWZ0ICAgPSB0cnVlXG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBjb250YWlucyBhIGBSaWdodGAgdmFsdWUuXG4gKlxuICogQHN1bW1hcnkgQm9vbGVhblxuICovXG5FaXRoZXIucHJvdG90eXBlLmlzUmlnaHQgPSBmYWxzZVxuUmlnaHQucHJvdG90eXBlLmlzUmlnaHQgID0gdHJ1ZVxuXG5cbi8vIC0tIEFwcGxpY2F0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBpbnN0YW5jZSBob2xkaW5nIHRoZSBgUmlnaHRgIHZhbHVlIGBiYC5cbiAqXG4gKiBgYmAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYW5vdGhlclxuICogYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrIg4oaSIEVpdGhlclvOsSwgzrJdXG4gKi9cbkVpdGhlci5vZiA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBSaWdodChhKVxufVxuRWl0aGVyLnByb3RvdHlwZS5vZiA9IEVpdGhlci5vZlxuXG5cbi8qKlxuICogQXBwbGllcyB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoZSBgUmlnaHRgIGNhc2Ugb2YgdGhlIGBFaXRoZXJbzrEsIM6yXWAgc3RydWN0dXJlXG4gKiB0byBhbm90aGVyIGFwcGxpY2F0aXZlIHR5cGUuXG4gKlxuICogVGhlIGBFaXRoZXJbzrEsIM6yXWAgc2hvdWxkIGNvbnRhaW4gYSBmdW5jdGlvbiB2YWx1ZSwgb3RoZXJ3aXNlIGEgYFR5cGVFcnJvcmBcbiAqIGlzIHRocm93bi5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrIg4oaSIM6zXSwgZjpBcHBsaWNhdGl2ZVtfXSkgPT4gZlvOsl0g4oaSIGZbzrNdXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuYXAgPSB1bmltcGxlbWVudGVkXG5cbkxlZnQucHJvdG90eXBlLmFwID0gZnVuY3Rpb24oYikge1xuICByZXR1cm4gdGhpc1xufVxuXG5SaWdodC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiBiLm1hcCh0aGlzLnZhbHVlKVxufVxuXG5cbi8vIC0tIEZ1bmN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIGBSaWdodGAgdmFsdWUgb2YgdGhlIGBFaXRoZXJbzrEsIM6yXWAgc3RydWN0dXJlIHVzaW5nIGEgcmVndWxhclxuICogdW5hcnkgZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gKM6yIOKGkiDOsykg4oaSIEVpdGhlclvOsSwgzrNdXG4gKi9cbkVpdGhlci5wcm90b3R5cGUubWFwID0gdW5pbXBsZW1lbnRlZFxuTGVmdC5wcm90b3R5cGUubWFwICAgPSBub29wXG5cblJpZ2h0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLm9mKGYodGhpcy52YWx1ZSkpXG59XG5cblxuLy8gLS0gQ2hhaW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgYFJpZ2h0YCB2YWx1ZSBvZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUgdXNpbmcgYW4gdW5hcnlcbiAqIGZ1bmN0aW9uIHRvIG1vbmFkcy5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdLCBtOk1vbmFkW19dKSA9PiAozrIg4oaSIG1bzrNdKSDihpIgbVvOs11cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5jaGFpbiA9IHVuaW1wbGVtZW50ZWRcbkxlZnQucHJvdG90eXBlLmNoYWluICAgPSBub29wXG5cblJpZ2h0LnByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uKGYpIHtcbiAgcmV0dXJuIGYodGhpcy52YWx1ZSlcbn1cblxuLy8gLS0gU2VtaWdyb3VwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb25jYXRzIHRoZSBgUmlnaHRgIHZhbHVlIG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSB3aXRoIGFub3RoZXIgYFJpZ2h0YCBvciBrZWVwcyB0aGUgYExlZnRgIG9uIGVpdGhlciBzaWRlXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIG06TW9ub2lkXSkgPT4gRWl0aGVyW86yLCBtXSDihpIgRWl0aGVyW86xLCBtXVxuICovXG5FaXRoZXIucHJvdG90eXBlLmNvbmNhdCA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXNcbn1cblxuUmlnaHQucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gIHZhciB0aGF0ID0gdGhpc1xuICByZXR1cm4gb3RoZXIuZm9sZChmdW5jdGlvbihfKXtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LlJpZ2h0KHRoYXQudmFsdWUuY29uY2F0KHkpKVxuICAgICAgICAgICAgICAgICAgICB9KVxufVxuXG5cbi8vIC0tIFNob3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiBWb2lkIOKGkiBTdHJpbmdcbiAqL1xuRWl0aGVyLnByb3RvdHlwZS50b1N0cmluZyA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdFaXRoZXIuTGVmdCgnICsgdGhpcy52YWx1ZSArICcpJ1xufVxuXG5SaWdodC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICdFaXRoZXIuUmlnaHQoJyArIHRoaXMudmFsdWUgKyAnKSdcbn1cblxuXG4vLyAtLSBFcSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUZXN0cyBpZiBhbiBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSBpcyBlcXVhbCB0byBhbm90aGVyIGBFaXRoZXJbzrEsIM6yXWBcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiBFaXRoZXJbzrEsIM6yXSDihpIgQm9vbGVhblxuICovXG5FaXRoZXIucHJvdG90eXBlLmlzRXF1YWwgPSB1bmltcGxlbWVudGVkXG5cbkxlZnQucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmlzTGVmdCAmJiAoYS52YWx1ZSA9PT0gdGhpcy52YWx1ZSlcbn1cblxuUmlnaHQucHJvdG90eXBlLmlzRXF1YWwgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhLmlzUmlnaHQgJiYgKGEudmFsdWUgPT09IHRoaXMudmFsdWUpXG59XG5cblxuLy8gLS0gRXh0cmFjdGluZyBhbmQgcmVjb3ZlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGBSaWdodGAgdmFsdWUgb3V0IG9mIHRoZSBgRWl0aGVyW86xLCDOsl1gIHN0cnVjdHVyZSwgaWYgaXRcbiAqIGV4aXN0cy4gT3RoZXJ3aXNlIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+IFZvaWQg4oaSIM6yICAgICAgICAgOjogcGFydGlhbCwgdGhyb3dzXG4gKiBAc2VlIHtAbGluayBtb2R1bGU6bGliL2VpdGhlcn5FaXRoZXIjZ2V0T3JFbHNlfSDigJQgQSBnZXR0ZXIgdGhhdCBjYW4gaGFuZGxlIGZhaWx1cmVzLlxuICogQHNlZSB7QGxpbmsgbW9kdWxlOmxpYi9laXRoZXJ+RWl0aGVyI21lcmdlfSDigJQgVGhlIGNvbnZlcmdlbmNlIG9mIGJvdGggdmFsdWVzLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBpZiB0aGUgc3RydWN0dXJlIGhhcyBubyBgUmlnaHRgIHZhbHVlLlxuICovXG5FaXRoZXIucHJvdG90eXBlLmdldCA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW4ndCBleHRyYWN0IHRoZSB2YWx1ZSBvZiBhIExlZnQoYSkuXCIpXG59XG5cblJpZ2h0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWVcbn1cblxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBgUmlnaHRgIHZhbHVlIG91dCBvZiB0aGUgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuIElmIHRoZVxuICogc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSBhIGBSaWdodGAgdmFsdWUsIHJldHVybnMgdGhlIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gzrIg4oaSIM6yXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuZ2V0T3JFbHNlID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhXG59XG5cblJpZ2h0LnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbihfKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgYExlZnRgIHZhbHVlIGludG8gYSBuZXcgYEVpdGhlclvOsSwgzrJdYCBzdHJ1Y3R1cmUuIERvZXMgbm90aGluZ1xuICogaWYgdGhlIHN0cnVjdHVyZSBjb250YWluIGEgYFJpZ2h0YCB2YWx1ZS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrJdKSA9PiAozrEg4oaSIEVpdGhlclvOsywgzrJdKSDihpIgRWl0aGVyW86zLCDOsl1cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5vckVsc2UgPSB1bmltcGxlbWVudGVkXG5SaWdodC5wcm90b3R5cGUub3JFbHNlICA9IG5vb3BcblxuTGVmdC5wcm90b3R5cGUub3JFbHNlID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygd2hpY2hldmVyIHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uIHRoYXQgaXMgcHJlc2VudC5cbiAqXG4gKiBAc3VtbWFyeSAoQEVpdGhlclvOsSwgzrFdKSA9PiBWb2lkIOKGkiDOsVxuICovXG5FaXRoZXIucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlXG59XG5cblxuLy8gLS0gRm9sZHMgYW5kIEV4dGVuZGVkIFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bmN0aW9uIHRvIGVhY2ggY2FzZSBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+ICjOsSDihpIgzrMpLCAozrIg4oaSIM6zKSDihpIgzrNcbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5mb2xkID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24oZiwgXykge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5SaWdodC5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uKF8sIGcpIHtcbiAgcmV0dXJuIGcodGhpcy52YWx1ZSlcbn1cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+IHsgTGVmdDogzrEg4oaSIM6zLCBSaWdodDogzrIg4oaSIM6zIH0g4oaSIM6zXG4gKi9cbkVpdGhlci5wcm90b3R5cGUuY2F0YSA9IHVuaW1wbGVtZW50ZWRcblxuTGVmdC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uTGVmdCh0aGlzLnZhbHVlKVxufVxuXG5SaWdodC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uUmlnaHQodGhpcy52YWx1ZSlcbn1cblxuXG4vKipcbiAqIFN3YXBzIHRoZSBkaXNqdW5jdGlvbiB2YWx1ZXMuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gVm9pZCDihpIgRWl0aGVyW86yLCDOsV1cbiAqL1xuRWl0aGVyLnByb3RvdHlwZS5zd2FwID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLlJpZ2h0KHRoaXMudmFsdWUpXG59XG5cblJpZ2h0LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLkxlZnQodGhpcy52YWx1ZSlcbn1cblxuXG4vKipcbiAqIE1hcHMgYm90aCBzaWRlcyBvZiB0aGUgZGlzanVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBFaXRoZXJbzrEsIM6yXSkgPT4gKM6xIOKGkiDOsyksICjOsiDihpIgzrQpIOKGkiBFaXRoZXJbzrMsIM60XVxuICovXG5FaXRoZXIucHJvdG90eXBlLmJpbWFwID0gdW5pbXBsZW1lbnRlZFxuXG5MZWZ0LnByb3RvdHlwZS5iaW1hcCA9IGZ1bmN0aW9uKGYsIF8pIHtcbiAgcmV0dXJuIHRoaXMuTGVmdChmKHRoaXMudmFsdWUpKVxufVxuXG5SaWdodC5wcm90b3R5cGUuYmltYXAgPSBmdW5jdGlvbihfLCBnKSB7XG4gIHJldHVybiB0aGlzLlJpZ2h0KGcodGhpcy52YWx1ZSkpXG59XG5cblxuLyoqXG4gKiBNYXBzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IChARWl0aGVyW86xLCDOsl0pID0+ICjOsSDihpIgzrMpIOKGkiBFaXRoZXJbzrMsIM6yXVxuICovXG5FaXRoZXIucHJvdG90eXBlLmxlZnRNYXAgPSB1bmltcGxlbWVudGVkXG5SaWdodC5wcm90b3R5cGUubGVmdE1hcCAgPSBub29wXG5cbkxlZnQucHJvdG90eXBlLmxlZnRNYXAgPSBmdW5jdGlvbihmKSB7XG4gIHJldHVybiB0aGlzLkxlZnQoZih0aGlzLnZhbHVlKSlcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2VpdGhlcicpIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuXG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IGN1cnJ5LCBsZW5zLCBwcm9wLCBwcmVwZW5kLCBvdmVyLCBzZXQsIHBpcGUgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBFaXRoZXIgZnJvbSBcImRhdGEuZWl0aGVyXCI7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBdCA9IGN1cnJ5KChrZXlBcnJheSwgbmV3VmFsLCBvYmopID0+IHtcbiAgY29uc3QgZGVlcE5ld1ZhbCA9IGtleUFycmF5LnJlZHVjZVJpZ2h0KFxuICAgIChyZXN1bHQsIGtleSkgPT4gKHsgW2tleV06IHJlc3VsdCB9KVxuICAgICwgbmV3VmFsXG4gICk7XG5cbiAgcmV0dXJuIEltbXV0YWJsZShvYmopLm1lcmdlKGRlZXBOZXdWYWwsIHsgZGVlcDogdHJ1ZSB9KTtcbn0pO1xuXG4vLyBTdGF0ZSBsZW5zZXNcbmV4cG9ydCBjb25zdCBTdGF0ZUxlbnNlcyA9IHtcbiAgZmllbGRUeXBlczogbGVucyhwcm9wKFwiZmllbGRUeXBlc1wiKSwgdXBkYXRlQXQoW1wiZmllbGRUeXBlc1wiXSkpLFxuICBmaWVsZHNTdGF0ZTogbGVucyhwcm9wKFwiZmllbGRzU3RhdGVcIiksIHVwZGF0ZUF0KFtcImZpZWxkc1N0YXRlXCJdKSksXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbGVucyhwcm9wKFwiZmllbGRzU3RhdGVIaXN0b3J5XCIpLCB1cGRhdGVBdChbXCJmaWVsZHNTdGF0ZUhpc3RvcnlcIl0pKSxcbn07XG5cbi8vIF8gPT4gU3RyaW5nXG5leHBvcnQgY29uc3QgY3JlYXRlSWQgPSBfID0+XG4gIChEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoKTtcblxuLy8gU3RhdGUgLT4gW2ZpZWxkc1N0YXRlXSAtPiBTdGF0ZVxuZXhwb3J0IGNvbnN0IHB1c2hIaXN0b3J5U3RhdGUgPSBjdXJyeSgoc3RhdGUsIG5ld0hpc3RvcnlTdGF0ZSkgPT4gcGlwZShcbiAgLy8gQWRkIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeVxuICBvdmVyKFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlSGlzdG9yeSwgcHJlcGVuZChzdGF0ZS5maWVsZHNTdGF0ZSkpLFxuICAvLyBNYWtlIG5ldyBTdGF0ZSB0aGUgY3VycmVudFxuICBzZXQoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIG5ld0hpc3RvcnlTdGF0ZSlcbikoc3RhdGUpKTtcblxuXG4vLyBTdGF0ZSAtPiBTdGF0ZVxuZXhwb3J0IGNvbnN0IGhpZGVDb25maWdzID0gc3RhdGUgPT5cbiAgc2V0KFxuICAgIFN0YXRlTGVuc2VzLmZpZWxkc1N0YXRlLFxuICAgIHN0YXRlLmZpZWxkc1N0YXRlLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMsIHsgY29uZmlnU2hvd2luZzogZmFsc2UgfSkpLFxuICAgIHN0YXRlXG4gICk7XG5cblxuLy8gU3RyaW5nIC0+IFN0cmluZyAtPiBPYmplY3QgLT4gRWl0aGVyIFN0cmluZyBPYmplY3RcbmV4cG9ydCBjb25zdCBwcm9wZXJ0eVR5cGVDaGVjayA9IGN1cnJ5KChwcm9wZXJ0eU5hbWUsIHR5cGUsIG9iaikgPT5cbiAgdHlwZW9mIG9ialtwcm9wZXJ0eU5hbWVdID09PSB0eXBlXG4gICAgPyBFaXRoZXIuUmlnaHQob2JqKVxuICAgIDogRWl0aGVyLkxlZnQoYFByb3BlcnR5ICcke3Byb3BlcnR5TmFtZX0nIGNhbm5vdCBiZSBvZiB0eXBlICR7dHlwZW9mIG9ialtwcm9wZXJ0eU5hbWVdfWApXG4pO1xuXG4vLyBDaGVja3MgdGhhdCBhIGZpZWxkIGhhcyBpdHMgZXNzZW50aWFsIHByb3BlcnRpZXNcbi8vIE9iamVjdCAtPiBFaXRoZXIgU3RyaW5nIE9iamVjdFxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRmllbGQgPSBmaWVsZFN0YXRlID0+XG4gIEVpdGhlci5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgICAubGVmdE1hcChmcyA9PiBgQSBmaWVsZCBTdGF0ZSBjYW5ub3QgYmUgZW1wdHkgJHt0eXBlb2YgZnN9YClcbiAgICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJyZXF1aXJlZFwiLCBcImJvb2xlYW5cIikpXG4gICAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiY29uZmlnU2hvd2luZ1wiLCBcImJvb2xlYW5cIikpXG4gICAgLmNoYWluKHByb3BlcnR5VHlwZUNoZWNrKFwiaWRcIiwgXCJzdHJpbmdcIikpO1xuIiwiaW1wb3J0IHsgU3RhdGVMZW5zZXMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgc2V0LCBvdmVyLCBzbGljZSwgcGlwZSB9IGZyb20gXCJyYW1kYVwiO1xuXG5jb25zdCBsYXN0SGlzdG9yeVN0YXRlID0gc3RhdGUgPT5cbiAgc3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdIHx8IFtdO1xuXG5jb25zdCB1bmRvID0gKHN0YXRlLCBfKSA9PiBwaXBlKFxuICAvLyBNYWtlIGxhc3QgaGlzdG9yeSBsYXN0IHN0YXRlIHRoZSBjdXJyZW50IG9uZVxuICBzZXQoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIGxhc3RIaXN0b3J5U3RhdGUoc3RhdGUpKSxcbiAgLy8gUmVtb3ZlIGxhc3QgaGlzdG9yeSBzdGF0ZSBmcm9tIHRoZSBoaXN0b3J5IGFycmF5XG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGVIaXN0b3J5LCBzbGljZSgxLCBJbmZpbml0eSkpXG4pKHN0YXRlKTtcblxuZXhwb3J0IGRlZmF1bHQgdW5kbztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2lkZW50aXR5KHgpIHsgcmV0dXJuIHg7IH07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9pZGVudGl0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lkZW50aXR5Jyk7XG5cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZXR1cm4gdGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBpdC4gR29vZFxuICogYXMgYSBkZWZhdWx0IG9yIHBsYWNlaG9sZGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJuIHsqfSBUaGUgaW5wdXQgdmFsdWUsIGB4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlkZW50aXR5KDEpOyAvLz0+IDFcbiAqXG4gKiAgICAgIHZhciBvYmogPSB7fTtcbiAqICAgICAgUi5pZGVudGl0eShvYmopID09PSBvYmo7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoX2lkZW50aXR5KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdmFsdWUgYXQgYSBnaXZlbiBwYXRoLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBbU3RyaW5nXSAtPiB7azogdn0gLT4gdiB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgLlxuICogQHNlZSBSLnByb3BcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhdGgoWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHtjOiB7YjogMn19KTsgLy89PiB1bmRlZmluZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHBhdGgocGF0aHMsIG9iaikge1xuICB2YXIgdmFsID0gb2JqO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IHBhdGhzLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWwgPSB2YWxbcGF0aHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn0pO1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX3JlZHVjZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3JlZHVjZScpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG5cblxuLyoqXG4gKiBhcCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBBbHNvXG4gKiB0cmVhdHMgY3VycmllZCBmdW5jdGlvbnMgYXMgYXBwbGljYXRpdmVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIFthIC0+IGJdIC0+IFthXSAtPiBbYl1cbiAqIEBzaWcgQXBwbHkgZiA9PiBmIChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7QXJyYXl9IGZucyBBbiBhcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXl9IHZzIEFuIGFycmF5IG9mIHZhbHVlc1xuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHJlc3VsdHMgb2YgYXBwbHlpbmcgZWFjaCBvZiBgZm5zYCB0byBhbGwgb2YgYHZzYCBpbiB0dXJuLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXAoW1IubXVsdGlwbHkoMiksIFIuYWRkKDMpXSwgWzEsMiwzXSk7IC8vPT4gWzIsIDQsIDYsIDQsIDUsIDZdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBhcChhcHBsaWNhdGl2ZSwgZm4pIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgYXBwbGljYXRpdmUuYXAgPT09ICdmdW5jdGlvbicgP1xuICAgICAgYXBwbGljYXRpdmUuYXAoZm4pIDpcbiAgICB0eXBlb2YgYXBwbGljYXRpdmUgPT09ICdmdW5jdGlvbicgP1xuICAgICAgZnVuY3Rpb24oeCkgeyByZXR1cm4gYXBwbGljYXRpdmUoeCkoZm4oeCkpOyB9IDpcbiAgICAvLyBlbHNlXG4gICAgICBfcmVkdWNlKGZ1bmN0aW9uKGFjYywgZikgeyByZXR1cm4gX2NvbmNhdChhY2MsIG1hcChmLCBmbikpOyB9LCBbXSwgYXBwbGljYXRpdmUpXG4gICk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogU2ltaWxhciB0byBgcmVkdWNlYCwgZXhjZXB0IG1vdmVzIHRocm91Z2ggdGhlIGlucHV0IGxpc3QgZnJvbSB0aGUgcmlnaHQgdG9cbiAqIHRoZSBsZWZ0LlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZVJpZ2h0YCBkb2VzIG5vdCBza2lwIGRlbGV0ZWQgb3IgdW5hc3NpZ25lZCBpbmRpY2VzIChzcGFyc2VcbiAqIGFycmF5cyksIHVubGlrZSB0aGUgbmF0aXZlIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBtZXRob2QuIEZvciBtb3JlIGRldGFpbHNcbiAqIG9uIHRoaXMgYmVoYXZpb3IsIHNlZTpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0I0Rlc2NyaXB0aW9uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSxiIC0+IGEpIC0+IGEgLT4gW2JdIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgdGhlIGFjY3VtdWxhdG9yIGFuZCB0aGVcbiAqICAgICAgICBjdXJyZW50IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4geyp9IFRoZSBmaW5hbCwgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgcGFpcnMgPSBbIFsnYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM10gXTtcbiAqICAgICAgdmFyIGZsYXR0ZW5QYWlycyA9IChhY2MsIHBhaXIpID0+IGFjYy5jb25jYXQocGFpcik7XG4gKlxuICogICAgICBSLnJlZHVjZVJpZ2h0KGZsYXR0ZW5QYWlycywgW10sIHBhaXJzKTsgLy89PiBbICdjJywgMywgJ2InLCAyLCAnYScsIDEgXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gcmVkdWNlUmlnaHQoZm4sIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBhY2MgPSBmbihhY2MsIGxpc3RbaWR4XSk7XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBhcCA9IHJlcXVpcmUoJy4vYXAnKTtcbnZhciBtYXAgPSByZXF1aXJlKCcuL21hcCcpO1xudmFyIHByZXBlbmQgPSByZXF1aXJlKCcuL3ByZXBlbmQnKTtcbnZhciByZWR1Y2VSaWdodCA9IHJlcXVpcmUoJy4vcmVkdWNlUmlnaHQnKTtcblxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBbVHJhdmVyc2FibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjdHJhdmVyc2FibGUpXG4gKiBvZiBbQXBwbGljYXRpdmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjYXBwbGljYXRpdmUpIGludG8gYW5cbiAqIEFwcGxpY2F0aXZlIG9mIFRyYXZlcnNhYmxlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzZXF1ZW5jZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKEFwcGxpY2F0aXZlIGYsIFRyYXZlcnNhYmxlIHQpID0+IChhIC0+IGYgYSkgLT4gdCAoZiBhKSAtPiBmICh0IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvZlxuICogQHBhcmFtIHsqfSB0cmF2ZXJzYWJsZVxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi50cmF2ZXJzZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc2VxdWVuY2UoTWF5YmUub2YsIFtKdXN0KDEpLCBKdXN0KDIpLCBKdXN0KDMpXSk7ICAgLy89PiBKdXN0KFsxLCAyLCAzXSlcbiAqICAgICAgUi5zZXF1ZW5jZShNYXliZS5vZiwgW0p1c3QoMSksIEp1c3QoMiksIE5vdGhpbmcoKV0pOyAvLz0+IE5vdGhpbmcoKVxuICpcbiAqICAgICAgUi5zZXF1ZW5jZShSLm9mLCBKdXN0KFsxLCAyLCAzXSkpOyAvLz0+IFtKdXN0KDEpLCBKdXN0KDIpLCBKdXN0KDMpXVxuICogICAgICBSLnNlcXVlbmNlKFIub2YsIE5vdGhpbmcoKSk7ICAgICAgIC8vPT4gW05vdGhpbmcoKV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHNlcXVlbmNlKG9mLCB0cmF2ZXJzYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHRyYXZlcnNhYmxlLnNlcXVlbmNlID09PSAnZnVuY3Rpb24nID9cbiAgICB0cmF2ZXJzYWJsZS5zZXF1ZW5jZShvZikgOlxuICAgIHJlZHVjZVJpZ2h0KGZ1bmN0aW9uKGFjYywgeCkgeyByZXR1cm4gYXAobWFwKHByZXBlbmQsIHgpLCBhY2MpOyB9LFxuICAgICAgICAgICAgICAgIG9mKFtdKSxcbiAgICAgICAgICAgICAgICB0cmF2ZXJzYWJsZSk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG52YXIgbWFwID0gcmVxdWlyZSgnLi9tYXAnKTtcbnZhciBzZXF1ZW5jZSA9IHJlcXVpcmUoJy4vc2VxdWVuY2UnKTtcblxuXG4vKipcbiAqIE1hcHMgYW4gW0FwcGxpY2F0aXZlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGxpY2F0aXZlKS1yZXR1cm5pbmdcbiAqIGZ1bmN0aW9uIG92ZXIgYSBbVHJhdmVyc2FibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjdHJhdmVyc2FibGUpLFxuICogdGhlbiB1c2VzIFtgc2VxdWVuY2VgXSgjc2VxdWVuY2UpIHRvIHRyYW5zZm9ybSB0aGUgcmVzdWx0aW5nIFRyYXZlcnNhYmxlIG9mIEFwcGxpY2F0aXZlXG4gKiBpbnRvIGFuIEFwcGxpY2F0aXZlIG9mIFRyYXZlcnNhYmxlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzZXF1ZW5jZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoQXBwbGljYXRpdmUgZiwgVHJhdmVyc2FibGUgdCkgPT4gKGEgLT4gZiBhKSAtPiAoYSAtPiBmIGIpIC0+IHQgYSAtPiBmICh0IGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHBhcmFtIHsqfSB0cmF2ZXJzYWJsZVxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIFJldHVybnMgYE5vdGhpbmdgIGlmIHRoZSBnaXZlbiBkaXZpc29yIGlzIGAwYFxuICogICAgICBzYWZlRGl2ID0gbiA9PiBkID0+IGQgPT09IDAgPyBOb3RoaW5nKCkgOiBKdXN0KG4gLyBkKVxuICpcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCA0LCA1XSk7IC8vPT4gSnVzdChbNSwgMi41LCAyXSlcbiAqICAgICAgUi50cmF2ZXJzZShNYXliZS5vZiwgc2FmZURpdigxMCksIFsyLCAwLCA1XSk7IC8vPT4gTm90aGluZ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gdHJhdmVyc2Uob2YsIGYsIHRyYXZlcnNhYmxlKSB7XG4gIHJldHVybiBzZXF1ZW5jZShvZiwgbWFwKGYsIHRyYXZlcnNhYmxlKSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2FycmF5RnJvbUl0ZXJhdG9yKGl0ZXIpIHtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIG5leHQ7XG4gIHdoaWxlICghKG5leHQgPSBpdGVyLm5leHQoKSkuZG9uZSkge1xuICAgIGxpc3QucHVzaChuZXh0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUoZikge1xuICAvLyBTdHJpbmcoeCA9PiB4KSBldmFsdWF0ZXMgdG8gXCJ4ID0+IHhcIiwgc28gdGhlIHBhdHRlcm4gbWF5IG5vdCBtYXRjaC5cbiAgdmFyIG1hdGNoID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb24gKFxcdyopLyk7XG4gIHJldHVybiBtYXRjaCA9PSBudWxsID8gJycgOiBtYXRjaFsxXTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGl0cyBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBWYWx1ZXMgYXJlXG4gKiBpZGVudGljYWwgaWYgdGhleSByZWZlcmVuY2UgdGhlIHNhbWUgbWVtb3J5LiBgTmFOYCBpcyBpZGVudGljYWwgdG8gYE5hTmA7XG4gKiBgMGAgYW5kIGAtMGAgYXJlIG5vdCBpZGVudGljYWwuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbyA9IHt9O1xuICogICAgICBSLmlkZW50aWNhbChvLCBvKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pZGVudGljYWwoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbChbXSwgW10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDAsIC0wKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbChOYU4sIE5hTik7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gaWRlbnRpY2FsKGEsIGIpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoYSA9PT0gYikgeyAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG4gIH1cbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxuXG4vKipcbiAqIEdpdmVzIGEgc2luZ2xlLXdvcmQgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSAobmF0aXZlKSB0eXBlIG9mIGEgdmFsdWUsXG4gKiByZXR1cm5pbmcgc3VjaCBhbnN3ZXJzIGFzICdPYmplY3QnLCAnTnVtYmVyJywgJ0FycmF5Jywgb3IgJ051bGwnLiBEb2VzIG5vdFxuICogYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB1c2VyIE9iamVjdCB0eXBlcyBhbnkgZnVydGhlciwgcmVwb3J0aW5nIHRoZW0gYWxsIGFzXG4gKiAnT2JqZWN0Jy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBUeXBlXG4gKiBAc2lnICgqIC0+IHsqfSkgLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudHlwZSh7fSk7IC8vPT4gXCJPYmplY3RcIlxuICogICAgICBSLnR5cGUoMSk7IC8vPT4gXCJOdW1iZXJcIlxuICogICAgICBSLnR5cGUoZmFsc2UpOyAvLz0+IFwiQm9vbGVhblwiXG4gKiAgICAgIFIudHlwZSgncycpOyAvLz0+IFwiU3RyaW5nXCJcbiAqICAgICAgUi50eXBlKG51bGwpOyAvLz0+IFwiTnVsbFwiXG4gKiAgICAgIFIudHlwZShbXSk7IC8vPT4gXCJBcnJheVwiXG4gKiAgICAgIFIudHlwZSgvW0Etel0vKTsgLy89PiBcIlJlZ0V4cFwiXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB0eXBlKHZhbCkge1xuICByZXR1cm4gdmFsID09PSBudWxsICAgICAgPyAnTnVsbCcgICAgICA6XG4gICAgICAgICB2YWwgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDpcbiAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKTtcbn0pO1xuIiwidmFyIF9hcnJheUZyb21JdGVyYXRvciA9IHJlcXVpcmUoJy4vX2FycmF5RnJvbUl0ZXJhdG9yJyk7XG52YXIgX2Z1bmN0aW9uTmFtZSA9IHJlcXVpcmUoJy4vX2Z1bmN0aW9uTmFtZScpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBpZGVudGljYWwgPSByZXF1aXJlKCcuLi9pZGVudGljYWwnKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnLi4va2V5cycpO1xudmFyIHR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfZXF1YWxzKGEsIGIsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIGlmIChpZGVudGljYWwoYSwgYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlKGEpICE9PSB0eXBlKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlb2YgYS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiYgYS5lcXVhbHMoYikgJiZcbiAgICAgICAgICAgdHlwZW9mIGIuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGIuZXF1YWxzKGEpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGlmICh0eXBlb2YgYS5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgIF9mdW5jdGlvbk5hbWUoYS5jb25zdHJ1Y3RvcikgPT09ICdQcm9taXNlJykge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIGlmICghKHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBpZGVudGljYWwoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICBpZiAoIWlkZW50aWNhbChhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIHJldHVybiBhLm5hbWUgPT09IGIubmFtZSAmJiBhLm1lc3NhZ2UgPT09IGIubWVzc2FnZTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgaWYgKCEoYS5zb3VyY2UgPT09IGIuc291cmNlICYmXG4gICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiZcbiAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmXG4gICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJlxuICAgICAgICAgICAgYS51bmljb2RlID09PSBiLnVuaWNvZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIGlmICghX2VxdWFscyhfYXJyYXlGcm9tSXRlcmF0b3IoYS5lbnRyaWVzKCkpLCBfYXJyYXlGcm9tSXRlcmF0b3IoYi5lbnRyaWVzKCkpLCBzdGFja0EsIHN0YWNrQikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgICBicmVhaztcbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVmFsdWVzIG9mIG90aGVyIHR5cGVzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IGtleXMoYSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGlkeCA9IHN0YWNrQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cblxuICBzdGFja0EucHVzaChhKTtcbiAgc3RhY2tCLnB1c2goYik7XG4gIGlkeCA9IGtleXNBLmxlbmd0aCAtIDE7XG4gIHdoaWxlIChpZHggPj0gMCkge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuICAgIGlmICghKF9oYXMoa2V5LCBiKSAmJiBfZXF1YWxzKGJba2V5XSwgYVtrZXldLCBzdGFja0EsIHN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHN0YWNrQS5wb3AoKTtcbiAgc3RhY2tCLnBvcCgpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9lcXVhbHMgPSByZXF1aXJlKCcuL2ludGVybmFsL19lcXVhbHMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGl0cyBhcmd1bWVudHMgYXJlIGVxdWl2YWxlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBIYW5kbGVzXG4gKiBjeWNsaWNhbCBkYXRhIHN0cnVjdHVyZXMuXG4gKlxuICogRGlzcGF0Y2hlcyBzeW1tZXRyaWNhbGx5IHRvIHRoZSBgZXF1YWxzYCBtZXRob2RzIG9mIGJvdGggYXJndW1lbnRzLCBpZlxuICogcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgYSAtPiBiIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZXF1YWxzKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5lcXVhbHMoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmVxdWFscyhbMSwgMiwgM10sIFsxLCAyLCAzXSk7IC8vPT4gdHJ1ZVxuICpcbiAqICAgICAgdmFyIGEgPSB7fTsgYS52ID0gYTtcbiAqICAgICAgdmFyIGIgPSB7fTsgYi52ID0gYjtcbiAqICAgICAgUi5lcXVhbHMoYSwgYik7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIF9lcXVhbHMoYSwgYiwgW10sIFtdKTtcbn0pO1xuIiwiLyogQGZsb3cgd2VhayAqL1xuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgcHVzaEhpc3RvcnlTdGF0ZSwgY3JlYXRlSWQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgY3VycnksIGVxdWFscywgdHJhdmVyc2UsIGlkZW50aXR5LCBwYXRoIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgRWl0aGVyIGZyb20gXCJkYXRhLmVpdGhlclwiO1xuXG4vLyBbYV0gPT4gRWl0aGVyIFN0cmluZyBbYV1cbmNvbnN0IGlzQXJyYXkgPSBhcnIgPT5cbiAgQXJyYXkuaXNBcnJheShhcnIpXG4gICAgPyBFaXRoZXIuUmlnaHQoYXJyKVxuICAgIDogRWl0aGVyLkxlZnQoYEludmFsaWQgc3RhdGVzIHNlbnQgd2l0aCBpbXBvcnRTdGF0ZS4gRXhwZWN0ZWQgQXJyYXkgYnV0IHJlY2VpdmVkICR7dHlwZW9mIGFycn1gKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBtYXgtbGVuXG5cbmNvbnN0IGZpZWxkVHlwZUlzVmFsaWQgPSBjdXJyeSgodmFsaWRUeXBlcywgZmllbGQpID0+XG4gIHZhbGlkVHlwZXMuZmluZChlcXVhbHMoZmllbGQudHlwZSkpXG4gICAgPyBFaXRoZXIuUmlnaHQoZmllbGQpXG4gICAgOiBFaXRoZXIuTGVmdChgSW52YWxpZCBmaWVsZCB0eXBlICR7ZmllbGQudHlwZX1gKVxuKTtcblxuY29uc3QgdmFsaWRGaWVsZFR5cGVzID0gY3VycnkoKHZhbGlkVHlwZXMsIGZpZWxkc1N0YXRlKSA9PlxuICB0cmF2ZXJzZShFaXRoZXIub2YsIGZpZWxkVHlwZUlzVmFsaWQodmFsaWRUeXBlcyksIGZpZWxkc1N0YXRlKVxuKTtcblxuXG4vLyBbYV0gLT4gW2FdIC0+IEVpdGhlciBTdHJpbmcgW2FdXG5jb25zdCB2YWxpZGF0ZUZpZWxkc1N0YXRlID0gY3VycnkoKGZpZWxkc1N0YXRlLCBzdGF0ZSkgPT5cbiAgRWl0aGVyLm9mKGZpZWxkc1N0YXRlKVxuICAgIC5jaGFpbihpc0FycmF5KVxuICAgIC5jaGFpbih2YWxpZEZpZWxkVHlwZXMoc3RhdGUuZmllbGRUeXBlcy5tYXAocGF0aChbXCJpbmZvXCIsIFwidHlwZVwiXSkpKSlcbik7XG5cblxuLy8gQWRkIHJlcXVpcmVkIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IG1hbmFnZWQgYnkgdGhlIGZpZWxkXG4vLyBjb21wb25lbnQgYnV0IGJ5IHRoZSBGb3JtQnVpbGRlciBjb21wb25lbnQgaXRzZWxmLCBzbyBtYXlcbi8vIG5vdCBiZSB0aGVyZS5cbi8vIFthXSA9PiBbYV1cbmNvbnN0IGFkZFJlcXVpcmVkUHJvcGVydGllcyA9IGZpZWxkU3RhdGVzID0+XG4gIGZpZWxkU3RhdGVzXG4gICAgLm1hcChzID0+IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgcyxcbiAgICAgIHsgaWQ6IGNyZWF0ZUlkKCkgfVxuICAgICkpO1xuXG5cbi8vIElmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgaW1wb3J0LCB0aGUgc2FtZSBzdGF0ZVxuLy8gd2lsbCBiZSByZXR1cm5lZFxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IG5ld0ZpZWxkc1N0YXRlIH0pID0+XG4gIHZhbGlkYXRlRmllbGRzU3RhdGUobmV3RmllbGRzU3RhdGUsIHN0YXRlKVxuICAgIC5tYXAoYWRkUmVxdWlyZWRQcm9wZXJ0aWVzKVxuICAgIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gICAgLmJpbWFwKGNvbnNvbGUuZXJyb3IsIGlkZW50aXR5KVxuICAgIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfcmVkdWNlZCh4KSB7XG4gIHJldHVybiB4ICYmIHhbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10gPyB4IDpcbiAgICB7XG4gICAgICAnQEB0cmFuc2R1Y2VyL3ZhbHVlJzogeCxcbiAgICAgICdAQHRyYW5zZHVjZXIvcmVkdWNlZCc6IHRydWVcbiAgICB9O1xufTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3JlZHVjZWQgPSByZXF1aXJlKCcuL19yZWR1Y2VkJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYRmluZChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdm9pZCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuZm91bmQgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hmaW5kKGYsIHhmKSB7IHJldHVybiBuZXcgWEZpbmQoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfeGZpbmQgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmluZCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbmRgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBhIHwgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogICAgICAgIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGZvdW5kLCBvciBgdW5kZWZpbmVkYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgeHMgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDIpKSh4cyk7IC8vPT4ge2E6IDJ9XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDQpKSh4cyk7IC8vPT4gdW5kZWZpbmVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKCdmaW5kJywgX3hmaW5kLCBmdW5jdGlvbiBmaW5kKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbn0pKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIEEgaGVscGVyIGZvciBkZWxheWluZyB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHN1bW1hcnkgKEFueS4uLiAtPiBBbnkpIC0+IFZvaWRcbiAqL1xudmFyIGRlbGF5ZWQgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJz8gIHNldEltbWVkaWF0ZVxuICAgICAgICAgICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCc/ICAgICAgIHByb2Nlc3MubmV4dFRpY2tcbiAgICAgICAgICAgIDogLyogb3RoZXJ3aXNlICovICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0XG5cbi8qKlxuICogQG1vZHVsZSBsaWIvdGFza1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IFRhc2s7XG5cbi8vIC0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBgVGFza1vOsSwgzrJdYCBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gdGltZS4gVGhpc1xuICogYWxsb3dzIG9uZSB0byBtb2RlbCB0aW1lLWJhc2VkIGVmZmVjdHMgZXhwbGljaXRseSwgc3VjaCB0aGF0IG9uZSBjYW4gaGF2ZVxuICogZnVsbCBrbm93bGVkZ2Ugb2Ygd2hlbiB0aGV5J3JlIGRlYWxpbmcgd2l0aCBkZWxheWVkIGNvbXB1dGF0aW9ucywgbGF0ZW5jeSxcbiAqIG9yIGFueXRoaW5nIHRoYXQgY2FuIG5vdCBiZSBjb21wdXRlZCBpbW1lZGlhdGVseS5cbiAqXG4gKiBBIGNvbW1vbiB1c2UgZm9yIHRoaXMgc3RydWN0dXJlIGlzIHRvIHJlcGxhY2UgdGhlIHVzdWFsIENvbnRpbnVhdGlvbi1QYXNzaW5nXG4gKiBTdHlsZSBmb3JtIG9mIHByb2dyYW1taW5nLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbXBvc2UgYW5kIHNlcXVlbmNlXG4gKiB0aW1lLWRlcGVuZGVudCBlZmZlY3RzIHVzaW5nIHRoZSBnZW5lcmljIGFuZCBwb3dlcmZ1bCBtb25hZGljIG9wZXJhdGlvbnMuXG4gKlxuICogQGNsYXNzXG4gKiBAc3VtbWFyeVxuICogKCjOsSDihpIgVm9pZCksICjOsiDihpIgVm9pZCkg4oaSIFZvaWQpLCAoVm9pZCDihpIgVm9pZCkg4oaSIFRhc2tbzrEsIM6yXVxuICpcbiAqIFRhc2tbzrEsIM6yXSA8OiBDaGFpblvOsl1cbiAqICAgICAgICAgICAgICAgLCBNb25hZFvOsl1cbiAqICAgICAgICAgICAgICAgLCBGdW5jdG9yW86yXVxuICogICAgICAgICAgICAgICAsIEFwcGxpY2F0aXZlW86yXVxuICogICAgICAgICAgICAgICAsIFNlbWlncm91cFvOsl1cbiAqICAgICAgICAgICAgICAgLCBNb25vaWRbzrJdXG4gKiAgICAgICAgICAgICAgICwgU2hvd1xuICovXG5mdW5jdGlvbiBUYXNrKGNvbXB1dGF0aW9uLCBjbGVhbnVwKSB7XG4gIHRoaXMuZm9yayA9IGNvbXB1dGF0aW9uO1xuXG4gIHRoaXMuY2xlYW51cCA9IGNsZWFudXAgfHwgZnVuY3Rpb24oKSB7fTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBUYXNrW86xLCDOsl1gIGNvbnRhaW5pbmcgdGhlIHNpbmdsZSB2YWx1ZSBgzrJgLlxuICpcbiAqIGDOsmAgY2FuIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIGFub3RoZXJcbiAqIGBUYXNrW86xLCDOsl1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsiDihpIgVGFza1vOsSwgzrJdXG4gKi9cblRhc2sucHJvdG90eXBlLm9mID0gZnVuY3Rpb24gX29mKGIpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKF8sIHJlc29sdmUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZShiKTtcbiAgfSk7XG59O1xuXG5UYXNrLm9mID0gVGFzay5wcm90b3R5cGUub2Y7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgVGFza1vOsSwgzrJdYCBjb250YWluaW5nIHRoZSBzaW5nbGUgdmFsdWUgYM6xYC5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbm90aGVyXG4gKiBgVGFza1vOsSwgzrJdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIFRhc2tbzrEsIM6yXVxuICovXG5UYXNrLnByb3RvdHlwZS5yZWplY3RlZCA9IGZ1bmN0aW9uIF9yZWplY3RlZChhKSB7XG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QpIHtcbiAgICByZXR1cm4gcmVqZWN0KGEpO1xuICB9KTtcbn07XG5cblRhc2sucmVqZWN0ZWQgPSBUYXNrLnByb3RvdHlwZS5yZWplY3RlZDtcblxuLy8gLS0gRnVuY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgc3VjY2Vzc2Z1bCB2YWx1ZSBvZiB0aGUgYFRhc2tbzrEsIM6yXWAgdXNpbmcgYSByZWd1bGFyIHVuYXJ5XG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsiDihpIgzrMpIOKGkiBUYXNrW86xLCDOs11cbiAqL1xuVGFzay5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gX21hcChmKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlamVjdChhKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShmKGIpKTtcbiAgICB9KTtcbiAgfSwgY2xlYW51cCk7XG59O1xuXG4vLyAtLSBDaGFpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBzdWNjZXNmdWwgdmFsdWUgb2YgdGhlIGBUYXNrW86xLCDOsl1gIHVzaW5nIGEgZnVuY3Rpb24gdG8gYVxuICogbW9uYWQuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiAozrIg4oaSIFRhc2tbzrEsIM6zXSkg4oaSIFRhc2tbzrEsIM6zXVxuICovXG5UYXNrLnByb3RvdHlwZS5jaGFpbiA9IGZ1bmN0aW9uIF9jaGFpbihmKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlamVjdChhKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gZihiKS5mb3JrKHJlamVjdCwgcmVzb2x2ZSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLy8gLS0gQXBwbHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQXBwbHlzIHRoZSBzdWNjZXNzZnVsIHZhbHVlIG9mIHRoZSBgVGFza1vOsSwgKM6yIOKGkiDOsyldYCB0byB0aGUgc3VjY2Vzc2Z1bFxuICogdmFsdWUgb2YgdGhlIGBUYXNrW86xLCDOsl1gXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsICjOsiDihpIgzrMpXSA9PiBUYXNrW86xLCDOsl0g4oaSIFRhc2tbzrEsIM6zXVxuICovXG5cblRhc2sucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gX2FwKHRoYXQpIHtcbiAgdmFyIGZvcmtUaGlzID0gdGhpcy5mb3JrO1xuICB2YXIgZm9ya1RoYXQgPSB0aGF0LmZvcms7XG4gIHZhciBjbGVhbnVwVGhpcyA9IHRoaXMuY2xlYW51cDtcbiAgdmFyIGNsZWFudXBUaGF0ID0gdGhhdC5jbGVhbnVwO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXBCb3RoKHN0YXRlKSB7XG4gICAgY2xlYW51cFRoaXMoc3RhdGVbMF0pO1xuICAgIGNsZWFudXBUaGF0KHN0YXRlWzFdKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICB2YXIgZnVuYywgZnVuY0xvYWRlZCA9IGZhbHNlO1xuICAgIHZhciB2YWwsIHZhbExvYWRlZCA9IGZhbHNlO1xuICAgIHZhciByZWplY3RlZCA9IGZhbHNlO1xuICAgIHZhciBhbGxTdGF0ZTtcblxuICAgIHZhciB0aGlzU3RhdGUgPSBmb3JrVGhpcyhndWFyZFJlamVjdCwgZ3VhcmRSZXNvbHZlKGZ1bmN0aW9uKHgpIHtcbiAgICAgIGZ1bmNMb2FkZWQgPSB0cnVlO1xuICAgICAgZnVuYyA9IHg7XG4gICAgfSkpO1xuXG4gICAgdmFyIHRoYXRTdGF0ZSA9IGZvcmtUaGF0KGd1YXJkUmVqZWN0LCBndWFyZFJlc29sdmUoZnVuY3Rpb24oeCkge1xuICAgICAgdmFsTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHZhbCA9IHg7XG4gICAgfSkpO1xuXG4gICAgZnVuY3Rpb24gZ3VhcmRSZXNvbHZlKHNldHRlcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGVyKHgpO1xuICAgICAgICBpZiAoZnVuY0xvYWRlZCAmJiB2YWxMb2FkZWQpIHtcbiAgICAgICAgICBkZWxheWVkKGZ1bmN0aW9uKCl7IGNsZWFudXBCb3RoKGFsbFN0YXRlKSB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShmdW5jKHZhbCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ3VhcmRSZWplY3QoeCkge1xuICAgICAgaWYgKCFyZWplY3RlZCkge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiByZWplY3QoeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFN0YXRlID0gW3RoaXNTdGF0ZSwgdGhhdFN0YXRlXTtcbiAgfSwgY2xlYW51cEJvdGgpO1xufTtcblxuLy8gLS0gU2VtaWdyb3VwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIGVhcmxpZXIgb2YgdGhlIHR3byB0YXNrcyBgVGFza1vOsSwgzrJdYFxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4gVGFza1vOsSwgzrJdIOKGkiBUYXNrW86xLCDOsl1cbiAqL1xuXG5UYXNrLnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiBfY29uY2F0KHRoYXQpIHtcbiAgdmFyIGZvcmtUaGlzID0gdGhpcy5mb3JrO1xuICB2YXIgZm9ya1RoYXQgPSB0aGF0LmZvcms7XG4gIHZhciBjbGVhbnVwVGhpcyA9IHRoaXMuY2xlYW51cDtcbiAgdmFyIGNsZWFudXBUaGF0ID0gdGhhdC5jbGVhbnVwO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXBCb3RoKHN0YXRlKSB7XG4gICAgY2xlYW51cFRoaXMoc3RhdGVbMF0pO1xuICAgIGNsZWFudXBUaGF0KHN0YXRlWzFdKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVGFzayhmdW5jdGlvbihyZWplY3QsIHJlc29sdmUpIHtcbiAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgIHZhciBhbGxTdGF0ZTtcbiAgICB2YXIgdGhpc1N0YXRlID0gZm9ya1RoaXMoZ3VhcmQocmVqZWN0KSwgZ3VhcmQocmVzb2x2ZSkpO1xuICAgIHZhciB0aGF0U3RhdGUgPSBmb3JrVGhhdChndWFyZChyZWplY3QpLCBndWFyZChyZXNvbHZlKSk7XG5cbiAgICByZXR1cm4gYWxsU3RhdGUgPSBbdGhpc1N0YXRlLCB0aGF0U3RhdGVdO1xuXG4gICAgZnVuY3Rpb24gZ3VhcmQoZikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgZGVsYXllZChmdW5jdGlvbigpeyBjbGVhbnVwQm90aChhbGxTdGF0ZSkgfSlcbiAgICAgICAgICByZXR1cm4gZih4KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sIGNsZWFudXBCb3RoKTtcblxufTtcblxuLy8gLS0gTW9ub2lkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSBUYXNrIHRoYXQgd2lsbCBuZXZlciByZXNvbHZlXG4gKlxuICogQHN1bW1hcnkgVm9pZCDihpIgVGFza1vOsSwgX11cbiAqL1xuVGFzay5lbXB0eSA9IGZ1bmN0aW9uIF9lbXB0eSgpIHtcbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKCkge30pO1xufTtcblxuVGFzay5wcm90b3R5cGUuZW1wdHkgPSBUYXNrLmVtcHR5O1xuXG4vLyAtLSBTaG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYFRhc2tbzrEsIM6yXWBcbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+IFZvaWQg4oaSIFN0cmluZ1xuICovXG5UYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIF90b1N0cmluZygpIHtcbiAgcmV0dXJuICdUYXNrJztcbn07XG5cbi8vIC0tIEV4dHJhY3RpbmcgYW5kIHJlY292ZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBmYWlsdXJlIHZhbHVlIGludG8gYSBuZXcgYFRhc2tbzrEsIM6yXWAuIERvZXMgbm90aGluZyBpZiB0aGVcbiAqIHN0cnVjdHVyZSBhbHJlYWR5IGNvbnRhaW5zIGEgc3VjY2Vzc2Z1bCB2YWx1ZS5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgVGFza1vOsywgzrJdKSDihpIgVGFza1vOsywgzrJdXG4gKi9cblRhc2sucHJvdG90eXBlLm9yRWxzZSA9IGZ1bmN0aW9uIF9vckVsc2UoZikge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiBmKGEpLmZvcmsocmVqZWN0LCByZXNvbHZlKTtcbiAgICB9LCBmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShiKTtcbiAgICB9KTtcbiAgfSwgY2xlYW51cCk7XG59O1xuXG4vLyAtLSBGb2xkcyBhbmQgZXh0ZW5kZWQgdHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uIFRha2VzIHR3byBmdW5jdGlvbnMsIGFwcGxpZXMgdGhlIGxlZnRtb3N0IG9uZSB0byB0aGUgZmFpbHVyZVxuICogdmFsdWUsIGFuZCB0aGUgcmlnaHRtb3N0IG9uZSB0byB0aGUgc3VjY2Vzc2Z1bCB2YWx1ZSwgZGVwZW5kaW5nIG9uIHdoaWNoIG9uZVxuICogaXMgcHJlc2VudC5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgzrMpLCAozrIg4oaSIM6zKSDihpIgVGFza1vOtCwgzrNdXG4gKi9cblRhc2sucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiBfZm9sZChmLCBnKSB7XG4gIHZhciBmb3JrID0gdGhpcy5mb3JrO1xuICB2YXIgY2xlYW51cCA9IHRoaXMuY2xlYW51cDtcblxuICByZXR1cm4gbmV3IFRhc2soZnVuY3Rpb24ocmVqZWN0LCByZXNvbHZlKSB7XG4gICAgcmV0dXJuIGZvcmsoZnVuY3Rpb24oYSkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZyhiKSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiB7IFJlamVjdGVkOiDOsSDihpIgzrMsIFJlc29sdmVkOiDOsiDihpIgzrMgfSDihpIgVGFza1vOtCwgzrNdXG4gKi9cblRhc2sucHJvdG90eXBlLmNhdGEgPSBmdW5jdGlvbiBfY2F0YShwYXR0ZXJuKSB7XG4gIHJldHVybiB0aGlzLmZvbGQocGF0dGVybi5SZWplY3RlZCwgcGF0dGVybi5SZXNvbHZlZCk7XG59O1xuXG4vKipcbiAqIFN3YXBzIHRoZSBkaXNqdW5jdGlvbiB2YWx1ZXMuXG4gKlxuICogQHN1bW1hcnkgQFRhc2tbzrEsIM6yXSA9PiBWb2lkIOKGkiBUYXNrW86yLCDOsV1cbiAqL1xuVGFzay5wcm90b3R5cGUuc3dhcCA9IGZ1bmN0aW9uIF9zd2FwKCkge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGEpO1xuICAgIH0sIGZ1bmN0aW9uKGIpIHtcbiAgICAgIHJldHVybiByZWplY3QoYik7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBNYXBzIGJvdGggc2lkZXMgb2YgdGhlIGRpc2p1bmN0aW9uLlxuICpcbiAqIEBzdW1tYXJ5IEBUYXNrW86xLCDOsl0gPT4gKM6xIOKGkiDOsyksICjOsiDihpIgzrQpIOKGkiBUYXNrW86zLCDOtF1cbiAqL1xuVGFzay5wcm90b3R5cGUuYmltYXAgPSBmdW5jdGlvbiBfYmltYXAoZiwgZykge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZWplY3QoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoZyhiKSk7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcblxuLyoqXG4gKiBNYXBzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRpc2p1bmN0aW9uIChmYWlsdXJlKS5cbiAqXG4gKiBAc3VtbWFyeSBAVGFza1vOsSwgzrJdID0+ICjOsSDihpIgzrMpIOKGkiBUYXNrW86zLCDOsl1cbiAqL1xuVGFzay5wcm90b3R5cGUucmVqZWN0ZWRNYXAgPSBmdW5jdGlvbiBfcmVqZWN0ZWRNYXAoZikge1xuICB2YXIgZm9yayA9IHRoaXMuZm9yaztcbiAgdmFyIGNsZWFudXAgPSB0aGlzLmNsZWFudXA7XG5cbiAgcmV0dXJuIG5ldyBUYXNrKGZ1bmN0aW9uKHJlamVjdCwgcmVzb2x2ZSkge1xuICAgIHJldHVybiBmb3JrKGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiByZWplY3QoZihhKSk7XG4gICAgfSwgZnVuY3Rpb24oYikge1xuICAgICAgcmV0dXJuIHJlc29sdmUoYik7XG4gICAgfSk7XG4gIH0sIGNsZWFudXApO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi90YXNrJyk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBwcm9wLCBmaW5kLCBpZGVudGl0eSwgcGlwZSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IHsgY3JlYXRlSWQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcbmltcG9ydCBUYXNrIGZyb20gXCJkYXRhLnRhc2tcIjtcbmltcG9ydCBJbW11dGFibGUgZnJvbSBcInNlYW1sZXNzLWltbXV0YWJsZVwiO1xuaW1wb3J0IHsgZmllbGRDcmVhdGVkIH0gZnJvbSBcIi4uL0FjdGlvbnNcIjtcblxuLy8gU3RhdGUgLT4gU3RyaW5nIC0+IEVpdGhlciBTdHJpbmcgRnVuY3Rpb25cbmNvbnN0IHR5cGVDb25zdHJ1Y3RvciA9IChzdGF0ZSwgZmllbGRUeXBlKSA9PiB7XG4gIHJldHVybiBFaXRoZXIub2Yoc3RhdGUpXG4gICAgLm1hcChwcm9wKFwiZmllbGRUeXBlc1wiKSlcbiAgICAubWFwKGZpbmQodiA9PiB2LmluZm8udHlwZSA9PT0gZmllbGRUeXBlKSlcbiAgICAuY2hhaW4oRWl0aGVyLmZyb21OdWxsYWJsZSlcbiAgICAuYmltYXAoXyA9PiBgRmllbGQgXCIke2ZpZWxkVHlwZX1cIiBkb2VzIG5vdCBleGlzdC5gLCBpZGVudGl0eSk7XG59O1xuXG4vLyB7IGluaXRpYWxTdGF0ZTogRnVuY3Rpb24gfSAtPiBUYXNrIFN0cmluZyBPYmplY3RcbmNvbnN0IGNyZWF0ZUZpZWxkID0gY29uc3RyID0+XG4gIG5ldyBUYXNrKChyZWplY3QsIHJlc29sdmUpID0+IHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIHByb21pc2UgaXMgb25seSByZXNvbHZlZCBvbmNlXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSBjb25zdHIuaW5pdGlhbFN0YXRlKCk7XG5cbiAgICBpZiAoIShmaWVsZFN0YXRlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgIHJlc29sdmUoZmllbGRTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkU3RhdGVcbiAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKSB7IHJldHVybjsgfVxuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCh2ID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZCkgeyB0aHJvdyB2OyB9XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdCh2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbi8vIE9iamVjdCAtPiBPYmplY3RcbmNvbnN0IGluc2VydFJlcXVpcmVkUHJvcHMgPSBmaWVsZCA9PlxuICBJbW11dGFibGUoZmllbGQpLm1lcmdlKHtcbiAgICBpZDogY3JlYXRlSWQoKSxcbiAgICBjb25maWdTaG93aW5nOiB0cnVlLFxuICB9LCB7XG4gICAgZGVlcDogdHJ1ZSxcbiAgfSk7XG5cbmNvbnN0IGNyZWF0ZUZpZWxkQXN5bmNocm9ub3VzbHkgPSAoc3RhdGUsIGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCkgPT5cbiAgdHlwZUNvbnN0cnVjdG9yKHN0YXRlLCBmaWVsZFR5cGUpXG4gIC5tYXAoY3JlYXRlRmllbGQpIC8vIEVpdGhlciBTdHJpbmcgKFRhc2sgU3RyaW5nIE9iamVjdClcbiAgLmxlZnRNYXAoVGFzay5yZWplY3RlZClcbiAgLm1lcmdlKCkgLy8gVGFzayBTdHJpbmcgT2JqZWN0XG4gIC5tYXAoaW5zZXJ0UmVxdWlyZWRQcm9wcylcbiAgLmZvcmsoIC8vIGV4ZWN1dGUgdGFza1xuICAgIGVyciA9PiBjb25zb2xlLmVycm9yKFwiVGFzayByZWplY3RlZFwiLCBlcnIpLFxuICAgIHBpcGUoZmllbGRDcmVhdGVkLCBhc3luY0Rpc3BhdGNoKVxuICApO1xuXG4vLyBUaGlzIGlzIGFuIGFzeW5jIGFjdGlvbi4gV2hlbiBpdCBpcyBmaW5pc2hlZCBpdCB3aWxsIHRyaWdnZXIgdGhlXG4vLyBmaWVsZCBjcmVhdGVkIGFjdGlvblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCB9KSA9PiB7XG4gIGNyZWF0ZUZpZWxkQXN5bmNocm9ub3VzbHkoc3RhdGUsIGZpZWxkVHlwZSwgYXN5bmNEaXNwYXRjaCk7XG4gIHJldHVybiBzdGF0ZTtcbn07XG4iLCJ2YXIgX2NvbmNhdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbmNhdCcpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgZm9sbG93ZWQgYnlcbiAqIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0geyp9IGVsIFRoZSBlbGVtZW50IHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3Qgd2hvc2UgY29udGVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXRcbiAqICAgICAgICBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIG9sZCBsaXN0IGZvbGxvd2VkIGJ5IGBlbGAuXG4gKiBAc2VlIFIucHJlcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCAndGVzdHMnXVxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbXSk7IC8vPT4gWyd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKFsndGVzdHMnXSwgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsIFsndGVzdHMnXV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGFwcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChsaXN0LCBbZWxdKTtcbn0pO1xuIiwiLy8gQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgUXVpbGRyZWVuIE1vdHRhIDxxdWlsZHJlZW5AZ21haWwuY29tPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uXG4vLyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlc1xuLy8gKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLFxuLy8gaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSxcbi8vIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsXG4vLyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuLy8gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbi8vIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG4vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG4vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbi8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vKipcbiAqIEBtb2R1bGUgbGliL21heWJlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF5YmVcblxuLy8gLS0gQWxpYXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgY2xvbmUgICAgICAgICA9IE9iamVjdC5jcmVhdGVcbnZhciB1bmltcGxlbWVudGVkID0gZnVuY3Rpb24oKXsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJykgfVxudmFyIG5vb3AgICAgICAgICAgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpcyAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vIC0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEEgc3RydWN0dXJlIGZvciB2YWx1ZXMgdGhhdCBtYXkgbm90IGJlIHByZXNlbnQsIG9yIGNvbXB1dGF0aW9ucyB0aGF0IG1heVxuICogZmFpbC4gYE1heWJlKGEpYCBleHBsaWNpdGx5IG1vZGVscyB0aGUgZWZmZWN0cyB0aGF0IGFyZSBpbXBsaWNpdCBpblxuICogYE51bGxhYmxlYCB0eXBlcywgdGh1cyBoYXMgbm9uZSBvZiB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoXG4gKiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAg4oCUIGxpa2UgYE51bGxQb2ludGVyRXhjZXB0aW9uc2AuXG4gKlxuICogVGhlIGNsYXNzIG1vZGVscyB0d28gZGlmZmVyZW50IGNhc2VzOlxuICpcbiAqICArIGBKdXN0IGFgIOKAlCByZXByZXNlbnRzIGEgYE1heWJlKGEpYCB0aGF0IGNvbnRhaW5zIGEgdmFsdWUuIGBhYCBtYXlcbiAqICAgICBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogICsgYE5vdGhpbmdgIOKAlCByZXByZXNlbnRzIGEgYE1heWJlKGEpYCB0aGF0IGhhcyBubyB2YWx1ZXMuIE9yIGFcbiAqICAgICBmYWlsdXJlIHRoYXQgbmVlZHMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBDb21tb24gdXNlcyBvZiB0aGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBtb2RlbGxpbmcgdmFsdWVzIHRoYXQgbWF5IG9yIG1heVxuICogbm90IGJlIHByZXNlbnQgaW4gYSBjb2xsZWN0aW9uLCB0aHVzIGluc3RlYWQgb2YgbmVlZGluZyBhXG4gKiBgY29sbGVjdGlvbi5oYXMoYSlgLCB0aGUgYGNvbGxlY3Rpb24uZ2V0KGEpYCBvcGVyYXRpb24gZ2l2ZXMgeW91IGFsbFxuICogdGhlIGluZm9ybWF0aW9uIHlvdSBuZWVkIOKAlCBgY29sbGVjdGlvbi5nZXQoYSkuaXMtbm90aGluZ2AgYmVpbmdcbiAqIGVxdWl2YWxlbnQgdG8gYGNvbGxlY3Rpb24uaGFzKGEpYDsgU2ltaWxhcmx5IHRoZSBzYW1lIHJlYXNvbmluZyBtYXlcbiAqIGJlIGFwcGxpZWQgdG8gY29tcHV0YXRpb25zIHRoYXQgbWF5IGZhaWwgdG8gcHJvdmlkZSBhIHZhbHVlLCBlLmcuOlxuICogYGNvbGxlY3Rpb24uZmluZChwcmVkaWNhdGUpYCBjYW4gc2FmZWx5IHJldHVybiBhIGBNYXliZShhKWAgaW5zdGFuY2UsXG4gKiBldmVuIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIG51bGxhYmxlIHZhbHVlcy5cbiAqXG4gKiBGdXJ0aGVybW9yZSwgdGhlIHZhbHVlcyBvZiBgTWF5YmUoYSlgIGNhbiBiZSBjb21iaW5lZCBhbmQgbWFuaXB1bGF0ZWRcbiAqIGJ5IHVzaW5nIHRoZSBleHByZXNzaXZlIG1vbmFkaWMgb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3Mgc2FmZWx5XG4gKiBzZXF1ZW5jaW5nIG9wZXJhdGlvbnMgdGhhdCBtYXkgZmFpbCwgYW5kIHNhZmVseSBjb21wb3NpbmcgdmFsdWVzIHRoYXRcbiAqIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgdGhleSdyZSBwcmVzZW50IG9yIG5vdCwgZmFpbGluZyBlYXJseVxuICogKHJldHVybmluZyBhIGBOb3RoaW5nYCkgaWYgYW55IG9mIHRoZSBvcGVyYXRpb25zIGZhaWwuXG4gKlxuICogSWYgb25lIHdhbnRzIHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgZmFpbHVyZXMsIHRoZVxuICogW0VpdGhlcl1bXSBhbmQgW1ZhbGlkYXRpb25dW10gc3RydWN0dXJlcyBwcm92aWRlIHN1Y2ggYSBjYXBhYmlsaXR5LCBhbmRcbiAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBNYXliZShhKWAgc3RydWN0dXJlLlxuICpcbiAqIFtFaXRoZXJdOiBodHRwczovL2dpdGh1Yi5jb20vZm9sa3RhbGUvZGF0YS5laXRoZXJcbiAqIFtWYWxpZGF0aW9uXTogaHR0cHM6Ly9naXRodWIuY29tL2ZvbGt0YWxlL2RhdGEudmFsaWRhdGlvblxuICpcbiAqXG4gKiBAY2xhc3NcbiAqL1xuZnVuY3Rpb24gTWF5YmUoKSB7fVxuXG4vLyBUaGUgY2FzZSBmb3Igc3VjY2Vzc2Z1bCB2YWx1ZXNcbkp1c3QucHJvdG90eXBlID0gY2xvbmUoTWF5YmUucHJvdG90eXBlKVxuZnVuY3Rpb24gSnVzdChhKXtcbiAgdGhpcy52YWx1ZSA9IGFcbn1cblxuLy8gVGhlIGNhc2UgZm9yIGZhaWx1cmUgdmFsdWVzXG5Ob3RoaW5nLnByb3RvdHlwZSA9IGNsb25lKE1heWJlLnByb3RvdHlwZSlcbmZ1bmN0aW9uIE5vdGhpbmcoKXt9XG5cblxuLy8gLS0gQ29uc3RydWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgd2l0aCBhbiBhYnNlbnQgdmFsdWUuIENvbW1vbmx5IHVzZWRcbiAqIHRvIHJlcHJlc2VudCBhIGZhaWx1cmUuXG4gKlxuICogQHN1bW1hcnkgVm9pZCDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLk5vdGhpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBOb3RoaW5nXG59XG5NYXliZS5wcm90b3R5cGUuTm90aGluZyA9IE1heWJlLk5vdGhpbmdcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBzaW5nbGUgdmFsdWVcbiAqIGDOsWAuIENvbW1vbmx5IHVzZWQgdG8gcmVwcmVzZW50IGEgc3VjY2Vzcy5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGFub3RoZXJcbiAqIGBNYXliZVvOsV1gIHN0cnVjdHVyZS5cbiAqXG4gKiBAc3VtbWFyeSDOsSDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLkp1c3QgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBuZXcgSnVzdChhKVxufVxuTWF5YmUucHJvdG90eXBlLkp1c3QgPSBNYXliZS5KdXN0XG5cblxuLy8gLS0gQ29udmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgZnJvbSBhIG51bGxhYmxlIHR5cGUuXG4gKlxuICogSWYgdGhlIHZhbHVlIGlzIGVpdGhlciBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhXG4gKiBgTm90aGluZ2AsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6xKWAuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIE1heWJlW86xXVxuICovXG5NYXliZS5mcm9tTnVsbGFibGUgPSBmdW5jdGlvbihhKSB7XG4gIHJldHVybiBhICE9IG51bGw/ICAgICAgIG5ldyBKdXN0KGEpXG4gIDogICAgICAvKiBvdGhlcndpc2UgKi8gIG5ldyBOb3RoaW5nXG59XG5NYXliZS5wcm90b3R5cGUuZnJvbU51bGxhYmxlID0gTWF5YmUuZnJvbU51bGxhYmxlXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBgTWF5YmVbzrJdYCBzdHJ1Y3R1cmUgZnJvbSBhbiBgRWl0aGVyW86xLCDOsl1gIHR5cGUuXG4gKlxuICogVGhlIGxlZnQgc2lkZSBvZiB0aGUgYEVpdGhlcmAgYmVjb21lcyBgTm90aGluZ2AsIGFuZCB0aGUgcmlnaHQgc2lkZVxuICogaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6yKWAuXG4gKlxuICogQHN1bW1hcnkgRWl0aGVyW86xLCDOsl0g4oaSIE1heWJlW86yXVxuICovXG5NYXliZS5mcm9tRWl0aGVyID0gZnVuY3Rpb24oYSkge1xuICByZXR1cm4gYS5mb2xkKE1heWJlLk5vdGhpbmcsIE1heWJlLkp1c3QpXG59XG5NYXliZS5wcm90b3R5cGUuZnJvbUVpdGhlciA9IE1heWJlLmZyb21FaXRoZXJcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGBNYXliZVvOsl1gIHN0cnVjdHVyZSBmcm9tIGEgYFZhbGlkYXRpb25bzrEsIM6yXWAgdHlwZS5cbiAqXG4gKiBUaGUgZmFpbHVyZSBzaWRlIG9mIHRoZSBgVmFsaWRhdGlvbmAgYmVjb21lcyBgTm90aGluZ2AsIGFuZCB0aGUgcmlnaHRcbiAqIHNpZGUgaXMgd3JhcHBlZCBpbiBhIGBKdXN0KM6yKWAuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgVmFsaWRhdGlvblvOsSwgzrJdIOKGkiBNYXliZVvOsl1cbiAqL1xuTWF5YmUuZnJvbVZhbGlkYXRpb24gICAgICAgICAgID0gTWF5YmUuZnJvbUVpdGhlclxuTWF5YmUucHJvdG90eXBlLmZyb21WYWxpZGF0aW9uID0gTWF5YmUuZnJvbUVpdGhlclxuXG5cbi8vIC0tIFByZWRpY2F0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZSBjb250YWlucyBhIGZhaWx1cmUgKGkuZS46IGBOb3RoaW5nYCkuXG4gKlxuICogQHN1bW1hcnkgQm9vbGVhblxuICovXG5NYXliZS5wcm90b3R5cGUuaXNOb3RoaW5nICAgPSBmYWxzZVxuTm90aGluZy5wcm90b3R5cGUuaXNOb3RoaW5nID0gdHJ1ZVxuXG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlIGNvbnRhaW5zIGEgc2luZ2xlIHZhbHVlIChpLmUuOiBgSnVzdCjOsSlgKS5cbiAqXG4gKiBAc3VtbWFyeSBCb29sZWFuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5pc0p1c3QgPSBmYWxzZVxuSnVzdC5wcm90b3R5cGUuaXNKdXN0ICA9IHRydWVcblxuXG4vLyAtLSBBcHBsaWNhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBNYXliZVvOsV1gIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBzaW5nbGUgdmFsdWUgYM6xYC5cbiAqXG4gKiBgzrFgIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBhbm90aGVyXG4gKiBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQHN1bW1hcnkgzrEg4oaSIE1heWJlW86xXVxuICovXG5NYXliZS5vZiA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIG5ldyBKdXN0KGEpXG59XG5NYXliZS5wcm90b3R5cGUub2YgPSBNYXliZS5vZlxuXG5cbi8qKlxuICogQXBwbGllcyB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgdG8gYW5vdGhlclxuICogYXBwbGljYXRpdmUgdHlwZS5cbiAqXG4gKiBUaGUgYE1heWJlW86xXWAgc3RydWN0dXJlIHNob3VsZCBjb250YWluIGEgZnVuY3Rpb24gdmFsdWUsIG90aGVyd2lzZSBhXG4gKiBgVHlwZUVycm9yYCBpcyB0aHJvd24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgKEBNYXliZVvOsSDihpIgzrJdLCBmOkFwcGxpY2F0aXZlW19dKSA9PiBmW86xXSDihpIgZlvOsl1cbiAqL1xuTWF5YmUucHJvdG90eXBlLmFwID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5hcCA9IG5vb3BcblxuSnVzdC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiBiLm1hcCh0aGlzLnZhbHVlKVxufVxuXG5cblxuXG4vLyAtLSBGdW5jdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2YWx1ZSBvZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlIHVzaW5nIGEgcmVndWxhciB1bmFyeVxuICogZnVuY3Rpb24uXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiAozrEg4oaSIM6yKSDihpIgTWF5YmVbzrJdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5tYXAgICA9IHVuaW1wbGVtZW50ZWRcbk5vdGhpbmcucHJvdG90eXBlLm1hcCA9IG5vb3BcblxuSnVzdC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gdGhpcy5vZihmKHRoaXMudmFsdWUpKVxufVxuXG5cbi8vIC0tIENoYWluIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZhbHVlIG9mIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUgdXNpbmcgYW4gdW5hcnkgZnVuY3Rpb25cbiAqIHRvIG1vbmFkcy5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAc3VtbWFyeSAoQE1heWJlW86xXSwgbTpNb25hZFtfXSkgPT4gKM6xIOKGkiBtW86yXSkg4oaSIG1bzrJdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5jaGFpbiAgID0gdW5pbXBsZW1lbnRlZFxuTm90aGluZy5wcm90b3R5cGUuY2hhaW4gPSBub29wXG5cbkp1c3QucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24oZikge1xuICByZXR1cm4gZih0aGlzLnZhbHVlKVxufVxuXG5cbi8vIC0tIFNob3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiBWb2lkIOKGkiBTdHJpbmdcbiAqL1xuTWF5YmUucHJvdG90eXBlLnRvU3RyaW5nID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ01heWJlLk5vdGhpbmcnXG59XG5cbkp1c3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnTWF5YmUuSnVzdCgnICsgdGhpcy52YWx1ZSArICcpJ1xufVxuXG5cbi8vIC0tIEVxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRlc3RzIGlmIGEgYE1heWJlW86xXWAgc3RydWN0dXJlIGlzIGVxdWFsIHRvIGFub3RoZXIgYE1heWJlW86xXWAgc3RydWN0dXJlLlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gTWF5YmVbzrFdIOKGkiBCb29sZWFuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5pc0VxdWFsID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24oYikge1xuICByZXR1cm4gYi5pc05vdGhpbmdcbn1cblxuSnVzdC5wcm90b3R5cGUuaXNFcXVhbCA9IGZ1bmN0aW9uKGIpIHtcbiAgcmV0dXJuIGIuaXNKdXN0XG4gICYmICAgICBiLnZhbHVlID09PSB0aGlzLnZhbHVlXG59XG5cblxuLy8gLS0gRXh0cmFjdGluZyBhbmQgcmVjb3ZlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHZhbHVlIG91dCBvZiB0aGUgYE1heWJlW86xXWAgc3RydWN0dXJlLCBpZiBpdFxuICogZXhpc3RzLiBPdGhlcndpc2UgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiBWb2lkIOKGkiBhLCAgICAgIDo6IHBhcnRpYWwsIHRocm93c1xuICogQHNlZSB7QGxpbmsgbW9kdWxlOmxpYi9tYXliZX5NYXliZSNnZXRPckVsc2V9IOKAlCBBIGdldHRlciB0aGF0IGNhbiBoYW5kbGUgZmFpbHVyZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gaWYgdGhlIHN0cnVjdHVyZSBoYXMgbm8gdmFsdWUgKGBOb3RoaW5nYCkuXG4gKi9cbk1heWJlLnByb3RvdHlwZS5nZXQgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuJ3QgZXh0cmFjdCB0aGUgdmFsdWUgb2YgYSBOb3RoaW5nLlwiKVxufVxuXG5KdXN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWVcbn1cblxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2YWx1ZSBvdXQgb2YgdGhlIGBNYXliZVvOsV1gIHN0cnVjdHVyZS4gSWYgdGhlcmUgaXMgbm8gdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBnaXZlbiBkZWZhdWx0LlxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gzrEg4oaSIM6xXG4gKi9cbk1heWJlLnByb3RvdHlwZS5nZXRPckVsc2UgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLmdldE9yRWxzZSA9IGZ1bmN0aW9uKGEpIHtcbiAgcmV0dXJuIGFcbn1cblxuSnVzdC5wcm90b3R5cGUuZ2V0T3JFbHNlID0gZnVuY3Rpb24oXykge1xuICByZXR1cm4gdGhpcy52YWx1ZVxufVxuXG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIGZhaWx1cmUgaW50byBhIG5ldyBgTWF5YmVbzrFdYCBzdHJ1Y3R1cmUuIERvZXMgbm90aGluZyBpZiB0aGVcbiAqIHN0cnVjdHVyZSBhbHJlYWR5IGNvbnRhaW5zIGEgdmFsdWUuXG4gKlxuICogQG1ldGhvZFxuICogQHN1bW1hcnkgQE1heWJlW86xXSA9PiAoVm9pZCDihpIgTWF5YmVbzrFdKSDihpIgTWF5YmVbzrFdXG4gKi9cbk1heWJlLnByb3RvdHlwZS5vckVsc2UgPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLm9yRWxzZSA9IGZ1bmN0aW9uKGYpIHtcbiAgcmV0dXJuIGYoKVxufVxuXG5KdXN0LnByb3RvdHlwZS5vckVsc2UgPSBmdW5jdGlvbihfKSB7XG4gIHJldHVybiB0aGlzXG59XG5cblxuLyoqXG4gKiBDYXRhbW9ycGhpc20uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4geyBOb3RoaW5nOiBWb2lkIOKGkiDOsiwgSnVzdDogzrEg4oaSIM6yIH0g4oaSIM6yXG4gKi9cbk1heWJlLnByb3RvdHlwZS5jYXRhID0gdW5pbXBsZW1lbnRlZFxuXG5Ob3RoaW5nLnByb3RvdHlwZS5jYXRhID0gZnVuY3Rpb24ocGF0dGVybikge1xuICByZXR1cm4gcGF0dGVybi5Ob3RoaW5nKClcbn1cblxuSnVzdC5wcm90b3R5cGUuY2F0YSA9IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgcmV0dXJuIHBhdHRlcm4uSnVzdCh0aGlzLnZhbHVlKTtcbn1cblxuXG4vKipcbiAqIEpTT04gc2VyaWFsaXNhdGlvblxuICpcbiAqIEBtZXRob2RcbiAqIEBzdW1tYXJ5IEBNYXliZVvOsV0gPT4gVm9pZCDihpIgT2JqZWN0XG4gKi9cbk1heWJlLnByb3RvdHlwZS50b0pTT04gPSB1bmltcGxlbWVudGVkXG5cbk5vdGhpbmcucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4geyAnI3R5cGUnOiAnZm9sa3RhbGU6TWF5YmUuTm90aGluZycgfVxufVxuXG5KdXN0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHsgJyN0eXBlJzogJ2ZvbGt0YWxlOk1heWJlLkp1c3QnXG4gICAgICAgICAsIHZhbHVlOiB0aGlzLnZhbHVlIH1cbn1cbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFF1aWxkcmVlbiBNb3R0YSA8cXVpbGRyZWVuQGdtYWlsLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvblxuLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXNcbi8vICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbi8vIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXG4vLyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLFxuLy8gYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4vLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21heWJlJykiLCJpbXBvcnQgeyBjdXJyeSwgcGlwZSwgcHJvcCwgb3ZlciwgYXBwZW5kIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBoaWRlQ29uZmlncywgU3RhdGVMZW5zZXMsIHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IE1heWJlIGZyb20gXCJkYXRhLm1heWJlXCI7XG5cbi8vIFN0YXRlIC0+IE9iamVjdCAtPiBTdGF0ZVxuY29uc3QgaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkID0gY3VycnkoKHN0YXRlLCBuZXdGaWVsZCkgPT4gcGlwZShcbiAgaGlkZUNvbmZpZ3MsXG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsIGFwcGVuZChuZXdGaWVsZCkpXG4pKHN0YXRlKSk7XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBjcmVhdGVkRmllbGRTdGF0ZSB9KSA9PlxuICBNYXliZS5mcm9tTnVsbGFibGUoY3JlYXRlZEZpZWxkU3RhdGUpXG4gIC5tYXAoaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkKHN0YXRlKSlcbiAgLm1hcChwcm9wKFwiZmllbGRzU3RhdGVcIikpXG4gIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgY3VycnkgfSBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCBNYXliZSBmcm9tIFwiZGF0YS5tYXliZVwiO1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tIFwic2VhbWxlc3MtaW1tdXRhYmxlXCI7XG5pbXBvcnQgeyBwdXNoSGlzdG9yeVN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgdG9nZ2xlQ29uZmlnID0gZmllbGRTdGF0ZSA9PlxuICBJbW11dGFibGUoZmllbGRTdGF0ZSkuc2V0KFwiY29uZmlnU2hvd2luZ1wiLCAhZmllbGRTdGF0ZS5jb25maWdTaG93aW5nKTtcblxuY29uc3QgcmVwbGFjZUZpZWxkU3RhdGUgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIHN0YXRlXG4gICAgLmZpZWxkc1N0YXRlXG4gICAgLm1hcChhRmllbGQgPT4gYUZpZWxkLmlkID09PSBmaWVsZFN0YXRlLmlkXG4gICAgICA/IGZpZWxkU3RhdGVcbiAgICAgIDogYUZpZWxkXG4gICAgKVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkU3RhdGUgfSkgPT5cbiAgTWF5YmUuZnJvbU51bGxhYmxlKGZpZWxkU3RhdGUpXG4gIC5tYXAodG9nZ2xlQ29uZmlnKVxuICAubWFwKHJlcGxhY2VGaWVsZFN0YXRlKHN0YXRlKSlcbiAgLm1hcChwdXNoSGlzdG9yeVN0YXRlKHN0YXRlKSlcbiAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5pbXBvcnQgeyBjdXJyeSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IE1heWJlIGZyb20gXCJkYXRhLm1heWJlXCI7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gXCJzZWFtbGVzcy1pbW11dGFibGVcIjtcbmltcG9ydCB7IHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCB0b2dnbGVSZXF1aXJlZCA9IGZpZWxkU3RhdGUgPT5cbiAgSW1tdXRhYmxlKGZpZWxkU3RhdGUpLnNldChcInJlcXVpcmVkXCIsICFmaWVsZFN0YXRlLnJlcXVpcmVkKTtcblxuY29uc3QgcmVwbGFjZUZpZWxkU3RhdGUgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIHN0YXRlXG4gICAgLmZpZWxkc1N0YXRlXG4gICAgLm1hcChhRmllbGQgPT4gYUZpZWxkLmlkID09PSBmaWVsZFN0YXRlLmlkXG4gICAgICA/IGZpZWxkU3RhdGVcbiAgICAgIDogYUZpZWxkXG4gICAgKVxuKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IGZpZWxkU3RhdGUgfSkgPT5cbiAgTWF5YmUuZnJvbU51bGxhYmxlKGZpZWxkU3RhdGUpXG4gIC5tYXAodG9nZ2xlUmVxdWlyZWQpXG4gIC5tYXAocmVwbGFjZUZpZWxkU3RhdGUoc3RhdGUpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2ZpbHRlcihmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBsaXN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNPYmplY3QoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBPYmplY3RdJztcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWEZpbHRlcihmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5MihmdW5jdGlvbiBfeGZpbHRlcihmLCB4ZikgeyByZXR1cm4gbmV3IFhGaWx0ZXIoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfZmlsdGVyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZmlsdGVyJyk7XG52YXIgX2lzT2JqZWN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNPYmplY3QnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3hmaWx0ZXIgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmlsdGVyJyk7XG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUgYW5kIGEgXCJmaWx0ZXJhYmxlXCIsIGFuZCByZXR1cm5zIGEgbmV3IGZpbHRlcmFibGUgb2YgdGhlXG4gKiBzYW1lIHR5cGUgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gZmlsdGVyYWJsZSB3aGljaCBzYXRpc2Z5IHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBmaWx0ZXJgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gZiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXJhYmxlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5yZWplY3QsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGlzRXZlbiA9IG4gPT4gbiAlIDIgPT09IDA7XG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKCdmaWx0ZXInLCBfeGZpbHRlciwgZnVuY3Rpb24ocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gKFxuICAgIF9pc09iamVjdChmaWx0ZXJhYmxlKSA/XG4gICAgICBfcmVkdWNlKGZ1bmN0aW9uKGFjYywga2V5KSB7XG4gICAgICAgIGlmIChwcmVkKGZpbHRlcmFibGVba2V5XSkpIHtcbiAgICAgICAgICBhY2Nba2V5XSA9IGZpbHRlcmFibGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZmlsdGVyYWJsZSkpIDpcbiAgICAvLyBlbHNlXG4gICAgICBfZmlsdGVyKHByZWQsIGZpbHRlcmFibGUpXG4gICk7XG59KSk7XG4iLCJpbXBvcnQgeyBjdXJyeSwgcHJvcCwgb3ZlciwgZmlsdGVyIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBTdGF0ZUxlbnNlcywgcHVzaEhpc3RvcnlTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgTWF5YmUgZnJvbSBcImRhdGEubWF5YmVcIjtcblxuLy8gU3RhdGUgLT4gT2JqZWN0IC0+IFN0YXRlXG5jb25zdCBoaXN0b3J5U3RhdGVXaXRob3V0RmllbGQgPSBjdXJyeSgoc3RhdGUsIGZpZWxkU3RhdGUpID0+XG4gIG92ZXIoXG4gICAgU3RhdGVMZW5zZXMuZmllbGRzU3RhdGUsXG4gICAgZmlsdGVyKGZzID0+IGZzLmlkICE9PSBmaWVsZFN0YXRlLmlkKSxcbiAgICBzdGF0ZVxuICApXG4pO1xuXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUsIHsgZmllbGRTdGF0ZSB9KSA9PlxuICBNYXliZS5mcm9tTnVsbGFibGUoZmllbGRTdGF0ZSlcbiAgLm1hcChoaXN0b3J5U3RhdGVXaXRob3V0RmllbGQoc3RhdGUpKVxuICAubWFwKHByb3AoXCJmaWVsZHNTdGF0ZVwiKSlcbiAgLm1hcChwdXNoSGlzdG9yeVN0YXRlKHN0YXRlKSlcbiAgLmdldE9yRWxzZShzdGF0ZSk7XG4iLCJpbXBvcnQgeyBjdXJyeSwgcHJvcCwgb3ZlciwgbWFwIH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBTdGF0ZUxlbnNlcywgcHVzaEhpc3RvcnlTdGF0ZSwgdmFsaWRhdGVGaWVsZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8vIFN0YXRlIC0+IE9iamVjdCAtPiBTdGF0ZVxuY29uc3QgdXBkYXRlRmllbGRTdGF0ZSA9IGN1cnJ5KChzdGF0ZSwgbmV3RmllbGRTdGF0ZSkgPT5cbiAgb3ZlcihcbiAgICBTdGF0ZUxlbnNlcy5maWVsZHNTdGF0ZSxcbiAgICBtYXAoZnMgPT4gZnMuaWQgPT09IG5ld0ZpZWxkU3RhdGUuaWQgPyBuZXdGaWVsZFN0YXRlIDogZnMpLFxuICAgIHN0YXRlXG4gIClcbik7XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBuZXdGaWVsZFN0YXRlIH0pID0+XG4gIHZhbGlkYXRlRmllbGQobmV3RmllbGRTdGF0ZSkgLy8gRWl0aGVyXG4gIC5tYXAodXBkYXRlRmllbGRTdGF0ZShzdGF0ZSkpXG4gIC5tYXAocHJvcChcImZpZWxkc1N0YXRlXCIpKVxuICAubWFwKHB1c2hIaXN0b3J5U3RhdGUoc3RhdGUpKVxuICAubGVmdE1hcChjb25zb2xlLmVycm9yKVxuICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX3NsaWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fc2xpY2UnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0LCBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLFxuICogd2hpY2ggc2hvdWxkIGFjY2VwdCB0d28gdmFsdWVzIGF0IGEgdGltZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZVxuICogZmlyc3QgdmFsdWUgaXMgc21hbGxlciwgYSBwb3NpdGl2ZSBudW1iZXIgaWYgaXQncyBsYXJnZXIsIGFuZCB6ZXJvIGlmIHRoZXlcbiAqIGFyZSBlcXVhbC4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGEgKipjb3B5Kiogb2YgdGhlIGxpc3QuIEl0IGRvZXMgbm90XG4gKiBtb2RpZnkgdGhlIG9yaWdpbmFsLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEsYSAtPiBOdW1iZXIpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgQSBzb3J0aW5nIGZ1bmN0aW9uIDo6IGEgLT4gYiAtPiBJbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gc29ydFxuICogQHJldHVybiB7QXJyYXl9IGEgbmV3IGFycmF5IHdpdGggaXRzIGVsZW1lbnRzIHNvcnRlZCBieSB0aGUgY29tcGFyYXRvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZGlmZiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9O1xuICogICAgICBSLnNvcnQoZGlmZiwgWzQsMiw3LDVdKTsgLy89PiBbMiwgNCwgNSwgN11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHNvcnQoY29tcGFyYXRvciwgbGlzdCkge1xuICByZXR1cm4gX3NsaWNlKGxpc3QpLnNvcnQoY29tcGFyYXRvcik7XG59KTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbmltcG9ydCB7IGN1cnJ5LCBwaXBlLCBwcm9wLCBvdmVyLCBzb3J0IH0gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgeyBoaWRlQ29uZmlncywgU3RhdGVMZW5zZXMsIHB1c2hIaXN0b3J5U3RhdGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcblxuLy8gU3RhdGUgLT4gT2JqZWN0IC0+IFN0YXRlXG5jb25zdCBoaXN0b3J5U3RhdGVXaXRoTmV3T3JkZXIgPSBjdXJyeSgoc3RhdGUsIG5ld09yZGVyKSA9PiBwaXBlKFxuICBoaWRlQ29uZmlncyxcbiAgb3ZlcihcbiAgICBTdGF0ZUxlbnNlcy5maWVsZHNTdGF0ZSxcbiAgICBzb3J0KChmMSwgZjIpID0+IG5ld09yZGVyLmluZGV4T2YoZjEuaWQpIC0gbmV3T3JkZXIuaW5kZXhPZihmMi5pZCkpXG4gIClcbikoc3RhdGUpKTtcblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlLCB7IG5ld0ZpZWxkc09yZGVyIH0pID0+XG4gIChuZXdGaWVsZHNPcmRlciAmJiBBcnJheS5pc0FycmF5KG5ld0ZpZWxkc09yZGVyKVxuICAgID8gRWl0aGVyLlJpZ2h0KG5ld0ZpZWxkc09yZGVyKVxuICAgIDogRWl0aGVyLkxlZnQoYG5ld0ZpZWxkc09yZGVyIG11c3QgYmUgYW4gYXJyYXkgYnV0IHJlY2VpdmVkICR7dHlwZW9mIG5ld0ZpZWxkc09yZGVyfWApXG4gIClcbiAgLmNoYWluKG8gPT5cbiAgICBvLmxlbmd0aCA9PT0gc3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoXG4gICAgICA/IEVpdGhlci5SaWdodChvKVxuICAgICAgOiBFaXRoZXIuTGVmdChgbmV3RmllbGRzT3JkZXIgaGFzICR7by5sZW5ndGh9IGVsZW1lbnRzLCBidXQgdGhlIGN1cnJlbnQgc3RhdGUgaGFzICR7c3RhdGUuZmllbGRzU3RhdGUubGVuZ3RofSBlbGVtZW50c2ApIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxlblxuICApXG4gIC5jaGFpbihvID0+IHtcbiAgICBjb25zdCBzdGF0ZUlkcyA9IHN0YXRlLmZpZWxkc1N0YXRlLm1hcChwcm9wKFwiaWRcIikpO1xuICAgIGNvbnN0IG5vTWlzc2luZ0lkID0gc3RhdGVJZHMucmVkdWNlKChhY2MsIGZJZCkgPT4gYWNjICYmIG8uaW5jbHVkZXMoZklkKSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG5vTWlzc2luZ0lkXG4gICAgICA/IEVpdGhlci5SaWdodChvKVxuICAgICAgOiBFaXRoZXIuTGVmdChcIk5vdCBhbGwgaWRzIGluIHRoZSBuZXcgb3JkZXIgYXJlIG1hdGNoZWQgaW4gdGhlIGV4aXN0aW5nIHN0YXRlIGlkcy5cIik7XG4gIH0pXG4gIC5tYXAoaGlzdG9yeVN0YXRlV2l0aE5ld09yZGVyKHN0YXRlKSlcbiAgLm1hcChwcm9wKFwiZmllbGRzU3RhdGVcIikpXG4gIC5tYXAocHVzaEhpc3RvcnlTdGF0ZShzdGF0ZSkpXG4gIC5sZWZ0TWFwKGVyciA9PiBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gcmVvcmRlcjogJHtlcnJ9YCkpXG4gIC5nZXRPckVsc2Uoc3RhdGUpO1xuIiwiLyogQGZsb3cgd2VhayAqL1xuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuaW1wb3J0IHsgU3RhdGVMZW5zZXMsIHByb3BlcnR5VHlwZUNoZWNrIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IG92ZXIsIHRyYXZlcnNlLCBjdXJyeSB9IGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IEVpdGhlciBmcm9tIFwiZGF0YS5laXRoZXJcIjtcblxuLy8gW2FdID0+IEVpdGhlciBTdHJpbmcgW2FdXG5jb25zdCBpc0FycmF5ID0gYXJyID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyKVxuICAgID8gRWl0aGVyLlJpZ2h0KGFycilcbiAgICA6IEVpdGhlci5MZWZ0KGBFeHBlY3RlZCBBcnJheSBidXQgcmVjZWl2ZWQgJHt0eXBlb2YgYXJyfWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cblxuLy8gT2JqZWN0IC0+IEVpdGhlciBTdHJpbmcgT2JqZWN0XG5jb25zdCBoYXNSZXF1aXJlZEluZm8gPSBjb21wb25lbnQgPT5cbiAgcHJvcGVydHlUeXBlQ2hlY2soXCJpbml0aWFsU3RhdGVcIiwgXCJmdW5jdGlvblwiLCBjb21wb25lbnQpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcIlJlbmRlckVkaXRvclwiLCBcImZ1bmN0aW9uXCIpKVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJpbmZvXCIsIFwib2JqZWN0XCIpKVxuICAuY2hhaW4oYyA9PiBFaXRoZXIuZnJvbU51bGxhYmxlKGMuaW5mbykpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcInR5cGVcIiwgXCJzdHJpbmdcIikpXG4gIC5jaGFpbihwcm9wZXJ0eVR5cGVDaGVjayhcImRpc3BsYXlOYW1lXCIsIFwic3RyaW5nXCIpKVxuICAuY2hhaW4ocHJvcGVydHlUeXBlQ2hlY2soXCJncm91cFwiLCBcInN0cmluZ1wiKSlcbiAgLmNoYWluKF8gPT4gRWl0aGVyLlJpZ2h0KGNvbXBvbmVudCkpO1xuXG5jb25zdCBpc0NvbXBvbmVudFZhbGlkID0gY3VzdG9tQ29tcG9uZW50cyA9PlxuICB0cmF2ZXJzZShFaXRoZXIub2YsIGhhc1JlcXVpcmVkSW5mbywgY3VzdG9tQ29tcG9uZW50cyk7XG5cbi8vIFthXSAtPiBbYV0gLT4gRWl0aGVyIFN0cmluZyBbYV1cbmNvbnN0IHZhbGlkYXRlQ29tcG9uZW50cyA9IGN1c3RvbUNvbXBvbmVudHMgPT5cbiAgRWl0aGVyLlJpZ2h0KGN1c3RvbUNvbXBvbmVudHMpXG4gICAgLmNoYWluKGlzQXJyYXkpXG4gICAgLmNoYWluKGlzQ29tcG9uZW50VmFsaWQpO1xuXG5jb25zdCBhZGRUb0ZpZWxkVHlwZXMgPSBjdXJyeSgoc3RhdGUsIGN1c3RvbUNvbXBvbmVudHMpID0+XG4gIG92ZXIoU3RhdGVMZW5zZXMuZmllbGRUeXBlcywgcyA9PiBzLmNvbmNhdChjdXN0b21Db21wb25lbnRzKSwgc3RhdGUpXG4pO1xuXG4vLyBJZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zIHdpdGggdGhlIGltcG9ydCwgdGhlIHNhbWUgc3RhdGVcbi8vIHdpbGwgYmUgcmV0dXJuZWRcbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSwgeyBjdXN0b21Db21wb25lbnRzIH0pID0+XG4gIChjdXN0b21Db21wb25lbnRzXG4gICAgPyBFaXRoZXIuUmlnaHQoY3VzdG9tQ29tcG9uZW50cylcbiAgICA6IEVpdGhlci5MZWZ0KFwiRW1wdHkgY3VzdG9tIGNvbXBvbmVudHNcIilcbiAgKVxuICAgIC5jaGFpbih2YWxpZGF0ZUNvbXBvbmVudHMpXG4gICAgLmxlZnRNYXAoZXJyID0+IGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIGN1c3RvbSBjb21wb25lbnRzOlwiLCBlcnIpKVxuICAgIC5tYXAoYWRkVG9GaWVsZFR5cGVzKHN0YXRlKSlcbiAgICAuZ2V0T3JFbHNlKHN0YXRlKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJmbC1hc3NlcnRcIjtcbmltcG9ydCB1bmRvIGZyb20gXCIuL3VuZG9cIjtcbmltcG9ydCBpbXBvcnRTdGF0ZSBmcm9tIFwiLi9pbXBvcnRTdGF0ZVwiO1xuaW1wb3J0IGNyZWF0ZUZpZWxkIGZyb20gXCIuL2NyZWF0ZUZpZWxkXCI7XG5pbXBvcnQgZmllbGRDcmVhdGVkIGZyb20gXCIuL2ZpZWxkQ3JlYXRlZFwiO1xuaW1wb3J0IHRvZ2dsZUNvbmZpZyBmcm9tIFwiLi9maWVsZC50b2dnbGVDb25maWdcIjtcbmltcG9ydCB0b2dnbGVSZXF1aXJlZCBmcm9tIFwiLi9maWVsZC50b2dnbGVSZXF1aXJlZFwiO1xuaW1wb3J0IGRlbGV0ZUZpZWxkIGZyb20gXCIuL2ZpZWxkLmRlbGV0ZUZpZWxkXCI7XG5pbXBvcnQgdXBkYXRlRmllbGQgZnJvbSBcIi4vZmllbGQudXBkYXRlRmllbGRcIjtcbmltcG9ydCByZW9yZGVyRmllbGRzIGZyb20gXCIuL3Jlb3JkZXJGaWVsZHNcIjtcbmltcG9ydCBpbXBvcnRDdXN0b21Db21wb25lbnRzIGZyb20gXCIuL2ltcG9ydEN1c3RvbUNvbXBvbmVudHNcIjtcblxuY29uc3QgYWN0aW9uSGFuZGxlcnMgPSB7XG4gIHVuZG8sXG4gIGltcG9ydFN0YXRlLFxuICBjcmVhdGVGaWVsZCxcbiAgZmllbGRDcmVhdGVkLFxuICB0b2dnbGVDb25maWcsXG4gIHRvZ2dsZVJlcXVpcmVkLFxuICBkZWxldGVGaWVsZCxcbiAgdXBkYXRlRmllbGQsXG4gIHJlb3JkZXJGaWVsZHMsXG4gIGltcG9ydEN1c3RvbUNvbXBvbmVudHMsXG59O1xuXG5jb25zdCBpc0V4cGVjdGVkQWN0aW9uID0gYSA9PiBhICYmIGEudHlwZSAmJiBhY3Rpb25IYW5kbGVyc1thLnR5cGVdO1xuY29uc3QgaXNSZWR1eEFjdGlvbiA9IGEgPT4gYSAmJiBhLnR5cGUgJiYgYS50eXBlLmluY2x1ZGVzKFwiQEByZWR1eFwiKTtcblxuXG5jb25zdCB1cGRhdGUgPSAoc3RhdGUsIGFjdGlvbikgPT5cbiAgaXNFeHBlY3RlZEFjdGlvbihhY3Rpb24pXG4gICAgPyBhY3Rpb25IYW5kbGVyc1thY3Rpb24udHlwZV0oc3RhdGUsIGFjdGlvbilcbiAgOiBpc1JlZHV4QWN0aW9uKGFjdGlvbilcbiAgICA/IHN0YXRlXG4gIDogYXNzZXJ0KGZhbHNlLCBgSW52YWxpZCBhY3Rpb24gdHlwZTogJHthY3Rpb24udHlwZX1gKTtcblxuZXhwb3J0IGRlZmF1bHQgdXBkYXRlO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG5cbmltcG9ydCB7IHVuZG8gYXMgdW5kb0FjdGlvbiB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgY3VycmVudEZpZWxkc1N0YXRlID0gW1wiY3VycmVudFwiXTtcbmNvbnN0IG9sZEZpZWxkc1N0YXRlID0gW1wib2xkXCJdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IGN1cnJlbnRGaWVsZHNTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBbb2xkRmllbGRzU3RhdGVdLFxufTtcblxuY29uc3QgZW1wdHlNb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IFtdLFxuICBmaWVsZHNTdGF0ZTogW10sXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogW10sXG59O1xuXG5jb25zdCBlbXB0eUhpc3RvcnlNb2NrU3RhdGUgPSB7XG4gIGZpZWxkVHlwZXM6IFtdLFxuICBmaWVsZHNTdGF0ZTogY3VycmVudEZpZWxkc1N0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudW5kb1wiLCAoKSA9PiB7XG4gIGl0KFwicmVtb3ZlcyBmaXJzdCBvbGQgc3RhdGUgZnJvbSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdW5kb0FjdGlvbigpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDApO1xuICB9KTtcblxuICBpdChcInNldHMgZmlyc3Qgb2xkIHN0YXRlIGFzIGN1cnJlbnQgc3RhdGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB1bmRvQWN0aW9uKCkpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlKS50b0VxdWFsKG9sZEZpZWxkc1N0YXRlKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2Vzbid0IG1vZGlmeSB0aGUgc3RhdGUgaWYgdGhlcmUgYXJlbid0IG1vcmUgaGlzdG9yeSBzdGF0ZXMgdG8gdW5kb1wiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShlbXB0eU1vY2tTdGF0ZSwgdW5kb0FjdGlvbigpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZSkudG9FcXVhbChlbXB0eU1vY2tTdGF0ZSk7XG4gIH0pO1xuXG4gIGl0KFwic2V0J3MgdGhlIGN1cnJlbnQgc3RhdGUgdG8gZW1wdHkgaWYgdGhlcmUgYXJlIG5vIG1vcmUgaGlzdG9yeSBzdGF0ZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUoZW1wdHlIaXN0b3J5TW9ja1N0YXRlLCB1bmRvQWN0aW9uKCkpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgaW1wb3J0U3RhdGUgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IHR5cGVzQXJyYXkgPSBbe1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlJhZGlvQnV0dG9uc1wiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIkNoZWNrYm94ZXNcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJEcm9wZG93blwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRleHRCb3hcIixcbiAgfSxcbn0sIHtcbiAgXCJpbmZvXCI6IHtcbiAgICBcInR5cGVcIjogXCJFbWFpbEJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRlbGVwaG9uZUJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIk51bWJlckJveFwiLFxuICB9LFxufSwge1xuICBcImluZm9cIjoge1xuICAgIFwidHlwZVwiOiBcIlRleHRBcmVhXCIsXG4gIH0sXG59LCB7XG4gIFwiaW5mb1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiRGF0ZUZpZWxkXCIsXG4gIH0sXG59XTtcblxuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtcImFcIiwgXCJiXCJdO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogdHlwZXNBcnJheSxcbiAgZmllbGRzU3RhdGU6IG1vY2tDdXJyZW50U3RhdGUsXG4gIGZpZWxkc1N0YXRlSGlzdG9yeTogbW9ja0hpc3RvcnksXG59O1xuXG5jb25zdCBuZXdWYWxpZFN0YXRlID0gW3tcbiAgXCJ0eXBlXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImRpc3BsYXlOYW1lXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImdyb3VwXCI6IFwiT3B0aW9ucyBDb21wb25lbnRzXCIsXG4gIFwiaHRtbElucHV0VHlwZVwiOiBcImNoZWNrYm94XCIsXG4gIFwidGl0bGVcIjogXCJBZGQgYSB0aXRsZVwiLFxuICBcImlkXCI6IDIsXG4gIFwib3B0aW9uc1wiOiBbe1xuICAgIFwiY2FwdGlvblwiOiBcIkluc2VydCBhbiBvcHRpb25cIixcbiAgfV0sXG4gIFwibmV3T3B0aW9uQ2FwdGlvblwiOiBcIlwiLFxufV07XG5cbmNvbnN0IG5ld0ludmFsaWRTdGF0ZSA9IFt7XG4gIFwidHlwZVwiOiBcIkludmFsaWQgdHlwZVwiLFxuICBcImRpc3BsYXlOYW1lXCI6IFwiQ2hlY2tib3hlc1wiLFxuICBcImdyb3VwXCI6IFwiT3B0aW9ucyBDb21wb25lbnRzXCIsXG4gIFwiaHRtbElucHV0VHlwZVwiOiBcImNoZWNrYm94XCIsXG4gIFwidGl0bGVcIjogXCJBZGQgYSB0aXRsZVwiLFxuICBcIm9wdGlvbnNcIjogW3tcbiAgICBcImNhcHRpb25cIjogXCJJbnNlcnQgYW4gb3B0aW9uXCIsXG4gIH1dLFxuICBcIm5ld09wdGlvbkNhcHRpb25cIjogXCJcIixcbn1dO1xuXG5kZXNjcmliZShcIlVwZGF0ZS5pbXBvcnRTdGF0ZVwiLCAoKSA9PiB7XG4gIGl0KFwiUmV0dXJucyBhbiB1bmNoYW5nZWQgYXJyYXkgaWYgdGhlIG5ldyBzdGF0ZSBpcyBpbnZhbGlkXCIsICgpID0+IHtcbiAgICBleHBlY3QodXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUoe30pKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShudWxsKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIGFuIHVuY2hhbmdlZCBhcnJheSBpZiB0aGUgYSBmaWVsZCdzIHR5cGUgaXMgbm90IGluIGZpZWxkVHlwZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShuZXdJbnZhbGlkU3RhdGUpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICB9KTtcblxuICBpdChcIlNlbmRzIHRoZSBsYXN0IGN1cnJlbnQgc3RhdGUgdG8gdGhlIGhpc3RvcnlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRTdGF0ZShuZXdWYWxpZFN0YXRlKSk7XG4gICAgZXhwZWN0KHVwZGF0ZWQuZmllbGRzU3RhdGVIaXN0b3J5WzBdLnRvU3RyaW5nKCkpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZS50b1N0cmluZygpKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKG1vY2tIaXN0b3J5Lmxlbmd0aCArIDEpO1xuICB9KTtcblxuICBpdChcIlNldHMgdGhlIG5ldyBzdGF0ZSBhcyBjdXJyZW50XCIsICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkID0gdXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUobmV3VmFsaWRTdGF0ZSkpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLnR5cGUpLnRvRXF1YWwobmV3VmFsaWRTdGF0ZVswXS50eXBlKTtcbiAgICBleHBlY3QodXBkYXRlZC5maWVsZHNTdGF0ZVswXS50eXBlKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmRpc3BsYXlOYW1lKS50b0VxdWFsKG5ld1ZhbGlkU3RhdGVbMF0uZGlzcGxheU5hbWUpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmRpc3BsYXlOYW1lKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmdyb3VwKS50b0VxdWFsKG5ld1ZhbGlkU3RhdGVbMF0uZ3JvdXApO1xuICAgIGV4cGVjdCh1cGRhdGVkLmZpZWxkc1N0YXRlWzBdLmdyb3VwKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdChcIk1ha2VzIHN1cmUgYWxsIGlkcyBhcmUgc3RyaW5nc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRTdGF0ZTIgPSBuZXdWYWxpZFN0YXRlXG4gICAgICAubWFwKCh2LCBpZHgpID0+IGlkeCAhPT0gMCA/IHYgOiBPYmplY3QuYXNzaWduKHt9LCB2LCB7IGlkOiAyIH0pKTtcbiAgICBjb25zdCB1cGRhdGVkID0gdXBkYXRlKG1vY2tTdGF0ZSwgaW1wb3J0U3RhdGUodmFsaWRTdGF0ZTIpKTtcbiAgICBleHBlY3QodHlwZW9mIHVwZGF0ZWQuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoXCJzdHJpbmdcIik7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5cbmltcG9ydCB7IGNyZWF0ZUZpZWxkIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCBwcm9taXNlVHlwZUluc3RhbmNlID0geyB0eXBlOiBcInByb21pc2UtaW5zdGFuY2VcIiB9O1xuY29uc3QgcHJvbWlzZVR5cGUgPSB7XG4gIGluZm86IHsgdHlwZTogXCJQcm9taXNlVHlwZVwiIH0sXG4gIGluaXRpYWxTdGF0ZTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHByb21pc2VUeXBlSW5zdGFuY2UpLFxufTtcblxuY29uc3Qgc3luY1R5cGVJbnN0YW5jZSA9IHsgdHlwZTogXCJzeW5jLWluc3RhbmNlXCIgfTtcbmNvbnN0IHN5bmNUeXBlID0ge1xuICBpbmZvOiB7IHR5cGU6IFwiU3luY1R5cGVcIiB9LFxuICBpbml0aWFsU3RhdGU6ICgpID0+IHN5bmNUeXBlSW5zdGFuY2UsXG59O1xuXG5jb25zdCB0eXBlc0FycmF5ID0gW3Byb21pc2VUeXBlLCBzeW5jVHlwZV07XG5jb25zdCBtb2NrQ3VycmVudFN0YXRlID0gW1wiYVwiLCBcImJcIl07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiB0eXBlc0FycmF5LFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmNyZWF0ZUZpZWxkXCIsICgpID0+IHtcbiAgaXQoXCJjcmVhdGVzIGZpZWxkcyBhc3luY2hyb25vdXNseVwiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gdiA9PiB7XG4gICAgICBleHBlY3Qodikubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKHN5bmNUeXBlLmluZm8udHlwZSlcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhICdmaWVsZENyZWF0ZWQnIGFjdGlvbiB3aGVuIGZpZWxkIGlzIGNyZWF0ZWRcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IGFjdGlvbiA9PiB7XG4gICAgICBleHBlY3QoYWN0aW9uLnR5cGUpLnRvRXF1YWwoXCJmaWVsZENyZWF0ZWRcIik7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChzeW5jVHlwZS5pbmZvLnR5cGUpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuICB9KTtcblxuICBpdChcImNyZWF0ZXMgdHlwZXMgd2l0aCBjb25zdHJ1Y3RvcnMgdGhhdCByZXR1cm4gYSBwbGFpbiBvYmplY3RcIiwgZG9uZSA9PiB7XG4gICAgY29uc3QgYXN5bmNEaXNwYXRjaCA9IGFjdGlvbiA9PiB7XG4gICAgICBleHBlY3QoYWN0aW9uLmNyZWF0ZWRGaWVsZFN0YXRlKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZS50eXBlKS50b0VxdWFsKHN5bmNUeXBlSW5zdGFuY2UudHlwZSk7XG4gICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzeW5jQWNpb24gPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyBhc3luY0Rpc3BhdGNoIH0sXG4gICAgICBjcmVhdGVGaWVsZChzeW5jVHlwZS5pbmZvLnR5cGUpXG4gICAgKTtcblxuICAgIHVwZGF0ZShtb2NrU3RhdGUsIGFzeW5jQWNpb24pO1xuICB9KTtcblxuICBpdChcImNyZWF0ZXMgdHlwZXMgd2l0aCBjb25zdHJ1Y3RvcnMgdGhhdCByZXR1cm4gYSBwcm9taXNlXCIsIGRvbmUgPT4ge1xuICAgIGNvbnN0IGFzeW5jRGlzcGF0Y2ggPSBhY3Rpb24gPT4ge1xuICAgICAgZXhwZWN0KGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZSkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUudHlwZSkudG9FcXVhbChwcm9taXNlVHlwZUluc3RhbmNlLnR5cGUpO1xuICAgICAgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBhc3luY0FjaW9uID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHsgYXN5bmNEaXNwYXRjaCB9LFxuICAgICAgY3JlYXRlRmllbGQocHJvbWlzZVR5cGUuaW5mby50eXBlKVxuICAgICk7XG5cbiAgICB1cGRhdGUobW9ja1N0YXRlLCBhc3luY0FjaW9uKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHJlcXVpcmVkIGZpZWxkcyB0byBpbnN0YW5jZVwiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gYWN0aW9uID0+IHtcbiAgICAgIGV4cGVjdChhY3Rpb24uY3JlYXRlZEZpZWxkU3RhdGUuaWQpLm5vdC50b0VxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QodHlwZW9mIGFjdGlvbi5jcmVhdGVkRmllbGRTdGF0ZS5jb25maWdTaG93aW5nKS50b0VxdWFsKFwiYm9vbGVhblwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKHByb21pc2VUeXBlLmluZm8udHlwZSlcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgY3JlYXRlIGEgZmllbGQgaWYgdHlwZSBpcyBub3QgaW4gbW9kZWwuZmllbGRUeXBlc1wiLCBkb25lID0+IHtcbiAgICBjb25zdCBhc3luY0Rpc3BhdGNoID0gamFzbWluZS5jcmVhdGVTcHkoXCJhc3luY0Rpc3BhdGNoXCIpO1xuXG4gICAgY29uc3QgYXN5bmNBY2lvbiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7IGFzeW5jRGlzcGF0Y2ggfSxcbiAgICAgIGNyZWF0ZUZpZWxkKFwibm9uLWV4aXN0aW5nLXR5cGVcIilcbiAgICApO1xuXG4gICAgdXBkYXRlKG1vY2tTdGF0ZSwgYXN5bmNBY2lvbik7XG5cbiAgICBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4geyBleHBlY3QoYXN5bmNEaXNwYXRjaCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTsgZG9uZSgpOyB9LFxuICAgICAgNTBcbiAgICApO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyBmaWVsZENyZWF0ZWQgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IGNyZWF0ZWRGaWVsZFN0YXRlID0geyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9O1xuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtcImFcIiwgXCJiXCJdO1xuY29uc3QgbW9ja0hpc3RvcnkgPSBbXTtcbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW3sgaW5mbzogeyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiB9IH1dLFxuICBmaWVsZHNTdGF0ZTogbW9ja0N1cnJlbnRTdGF0ZSxcbiAgZmllbGRzU3RhdGVIaXN0b3J5OiBtb2NrSGlzdG9yeSxcbn07XG5cbmNvbnN0IGZpZWxkQ3JlYXRlZEFjdGlvbiA9IGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSk7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGZpZWxkQ3JlYXRlZEFjdGlvbik7XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmZpZWxkQ3JlYXRlZFwiLCAoKSA9PiB7XG4gIGl0KFwib3V0cHV0cyBhIHN0YXRlIHdpdGggdGhlIG5ldyBmaWVsZCBpbmNsdWRlZFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoICsgMSk7XG4gICAgZXhwZWN0KFxuICAgICAgbmV3U3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKHYgPT4gdi50eXBlID09PSBjcmVhdGVkRmllbGRTdGF0ZS50eXBlKVxuICAgICkubm90LnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzBdKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0pO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0pLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVsxXSk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBpZiBubyBuZXcgZmllbGQgaXMgZ2l2ZW4gdG8gaXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNhbWVTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGZpZWxkQ3JlYXRlZChudWxsKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgYnJlYWsgdGhlIHN0YXRlIGFmdGVyIGNyZWF0aW5nIG9uZSBvYmplY3RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZSwgZmllbGRDcmVhdGVkKGNyZWF0ZWRGaWVsZFN0YXRlKSk7XG4gICAgY29uc3QgY2hhbmdlZDIgPSB1cGRhdGUoY2hhbmdlZDEsIGZpZWxkQ3JlYXRlZChjcmVhdGVkRmllbGRTdGF0ZSkpO1xuICAgIGNvbnN0IGNoYW5nZWQzID0gdXBkYXRlKGNoYW5nZWQyLCBmaWVsZENyZWF0ZWQoY3JlYXRlZEZpZWxkU3RhdGUpKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGUubGVuZ3RoICsgMyk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwoMyk7XG4gIH0pO1xufSk7XG4iLCIvKiBlc2xpbnQtZW52IGphc21pbmUgKi9cblxuaW1wb3J0IHsgdG9nZ2xlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5cbmNvbnN0IGZpZWxkU3RhdGVDb25maWdTaG93aW5nID0ge1xuICBpZDogMTIzLFxuICBjb25maWdTaG93aW5nOiB0cnVlLFxufTtcblxuY29uc3QgZmllbGRTdGF0ZUNvbmZpZ05vdFNob3dpbmcgPSB7XG4gIGlkOiAzMjEsXG4gIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxufTtcblxuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IFtmaWVsZFN0YXRlQ29uZmlnU2hvd2luZywgZmllbGRTdGF0ZUNvbmZpZ05vdFNob3dpbmddLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudG9nZ2xlQ29uZmlnXCIsICgpID0+IHtcbiAgaXQoXCJ0dXJucyB0aGUgY29uZmlnIG9wdGlvbiB0byBmYWxzZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZUNvbmZpZyhmaWVsZFN0YXRlQ29uZmlnU2hvd2luZykpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUNvbmZpZ1Nob3dpbmcuaWQpXG4gICAgICAuY29uZmlnU2hvd2luZ1xuICAgICkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KFwidHVybnMgdGhlIGNvbmZpZyBvcHRpb24gdG8gdHJ1ZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZUNvbmZpZyhmaWVsZFN0YXRlQ29uZmlnTm90U2hvd2luZykpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUNvbmZpZ1Nob3dpbmcuaWQpXG4gICAgICAuY29uZmlnU2hvd2luZ1xuICAgICkudG9FcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHRoZSBsYXN0IHN0YXRlIHRvIHRoZSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdG9nZ2xlQ29uZmlnKGZpZWxkU3RhdGVDb25maWdTaG93aW5nKSk7XG4gICAgZXhwZWN0KG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuXG5pbXBvcnQgeyB0b2dnbGVSZXF1aXJlZCB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuXG5jb25zdCBmaWVsZFN0YXRlSXNSZXF1aXJlZCA9IHtcbiAgaWQ6IDEyMyxcbiAgcmVxdWlyZWQ6IHRydWUsXG59O1xuXG5jb25zdCBmaWVsZFN0YXRlSXNOb3RSZXF1aXJlZCA9IHtcbiAgaWQ6IDMyMSxcbiAgcmVxdWlyZWQ6IGZhbHNlLFxufTtcblxuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbXSxcbiAgZmllbGRzU3RhdGU6IFtmaWVsZFN0YXRlSXNSZXF1aXJlZCwgZmllbGRTdGF0ZUlzTm90UmVxdWlyZWRdLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuZGVzY3JpYmUoXCJVcGRhdGUudG9nZ2xlUmVxdWlyZWRcIiwgKCkgPT4ge1xuICBpdChcInR1cm5zIHRoZSByZXF1aXJlZCBvcHRpb24gdG8gZmFsc2Ugd2hlbiBuZWVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVkU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCB0b2dnbGVSZXF1aXJlZChmaWVsZFN0YXRlSXNSZXF1aXJlZCkpO1xuICAgIGV4cGVjdChcbiAgICAgIG1vZGlmaWVkU3RhdGUuZmllbGRzU3RhdGVcbiAgICAgIC5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRTdGF0ZUlzUmVxdWlyZWQuaWQpXG4gICAgICAucmVxdWlyZWRcbiAgICApLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdChcInR1cm5zIHRoZSByZXF1aXJlZCBvcHRpb24gdG8gdHJ1ZSB3aGVuIG5lZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kaWZpZWRTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHRvZ2dsZVJlcXVpcmVkKGZpZWxkU3RhdGVJc05vdFJlcXVpcmVkKSk7XG4gICAgZXhwZWN0KFxuICAgICAgbW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZVxuICAgICAgLmZpbmQoZiA9PiBmLmlkID09PSBmaWVsZFN0YXRlSXNSZXF1aXJlZC5pZClcbiAgICAgIC5yZXF1aXJlZFxuICAgICkudG9FcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJhZGRzIHRoZSBsYXN0IHN0YXRlIHRvIHRoZSBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCBtb2RpZmllZFN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgdG9nZ2xlUmVxdWlyZWQoZmllbGRTdGF0ZUlzUmVxdWlyZWQpKTtcbiAgICBleHBlY3QobW9kaWZpZWRTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVswXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChtb2RpZmllZFN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVsxXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMV0uaWQpO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyBkZWxldGVGaWVsZCB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgdG9CZURlbGV0ZWRGaWVsZFN0YXRlID0geyB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIiwgaWQ6IDAgfTtcbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbdG9CZURlbGV0ZWRGaWVsZFN0YXRlLCB7IGlkOiAxIH0sIHsgaWQ6IDIgfV07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgZmllbGREZWxldGVBY3Rpb24gPSBkZWxldGVGaWVsZCh0b0JlRGVsZXRlZEZpZWxkU3RhdGUpO1xuY29uc3QgbmV3U3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCBmaWVsZERlbGV0ZUFjdGlvbik7XG5cbmRlc2NyaWJlKFwiVXBkYXRlLmRlbGV0ZUZpZWxkXCIsICgpID0+IHtcbiAgaXQoXCJvdXRwdXRzIGEgc3RhdGUgd2l0aG91dCB0aGUgZmllbGQgaW5jbHVkZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCAtIDEpO1xuICAgIGV4cGVjdChcbiAgICAgIG5ld1N0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZCh2ID0+IHYuaWQgPT09IHRvQmVEZWxldGVkRmllbGRTdGF0ZS5pZClcbiAgICApLnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBjb25zdCByZWNlbnRIaXN0b3J5U3RhdGUgPSBuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF07XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChyZWNlbnRIaXN0b3J5U3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZVsxXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzFdLmlkKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGlmIG5vIG5ldyBmaWVsZCBpcyBnaXZlbiB0byBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FtZVN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgZGVsZXRlRmllbGQobnVsbCkpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeS5sZW5ndGgpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGJyZWFrIHRoZSBzdGF0ZSBhZnRlciBkZWxldGluZyBhIGZpZWxkXCIsICgpID0+IHtcbiAgICBjb25zdCBtb2NrRmllbGQxID0gT2JqZWN0LmFzc2lnbih7fSwgdG9CZURlbGV0ZWRGaWVsZFN0YXRlLCB7IGlkOiA1IH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDIgPSBPYmplY3QuYXNzaWduKHt9LCB0b0JlRGVsZXRlZEZpZWxkU3RhdGUsIHsgaWQ6IDYgfSk7XG4gICAgY29uc3QgbW9ja0ZpZWxkMyA9IE9iamVjdC5hc3NpZ24oe30sIHRvQmVEZWxldGVkRmllbGRTdGF0ZSwgeyBpZDogNyB9KTtcblxuICAgIGNvbnN0IG1vY2tTdGF0ZTIgPSBPYmplY3QuYXNzaWduKHt9LCBtb2NrU3RhdGUsIHtcbiAgICAgIGZpZWxkc1N0YXRlOiBbXG4gICAgICAgIG1vY2tGaWVsZDEsXG4gICAgICAgIG1vY2tGaWVsZDIsXG4gICAgICAgIG1vY2tGaWVsZDMsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZTIsIGRlbGV0ZUZpZWxkKG1vY2tGaWVsZDEpKTtcbiAgICBjb25zdCBjaGFuZ2VkMiA9IHVwZGF0ZShjaGFuZ2VkMSwgZGVsZXRlRmllbGQobW9ja0ZpZWxkMikpO1xuICAgIGNvbnN0IGNoYW5nZWQzID0gdXBkYXRlKGNoYW5nZWQyLCBkZWxldGVGaWVsZChtb2NrRmllbGQzKSk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZTIuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlMi5maWVsZHNTdGF0ZS5sZW5ndGggLSAzKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgzKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgdXBkYXRlRmllbGQgfSBmcm9tIFwiLi4vLi4vanMvQWN0aW9uc1wiO1xuaW1wb3J0IHVwZGF0ZSBmcm9tIFwiLi4vLi4vanMvVXBkYXRlXCI7XG5cbmNvbnN0IG9sZEZpZWxkU3RhdGUgPSB7XG4gIHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiLFxuICBpZDogXCIwXCIsXG4gIGNvbmZpZ1Nob3dpbmc6IGZhbHNlLFxuICByZXF1aXJlZDogZmFsc2UsXG4gIGNvbG9yOiBcImJsdWVcIixcbn07XG5jb25zdCBuZXdGaWVsZFN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgb2xkRmllbGRTdGF0ZSwgeyBjb2xvcjogXCJncmVlblwiIH0pO1xuY29uc3QgbW9ja0N1cnJlbnRTdGF0ZSA9IFtvbGRGaWVsZFN0YXRlLCB7IGlkOiAxIH0sIHsgaWQ6IDIgfV07XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgZmllbGRVcGRhdGVBY3Rpb24gPSB1cGRhdGVGaWVsZChuZXdGaWVsZFN0YXRlKTtcbmNvbnN0IG5ld1N0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgZmllbGRVcGRhdGVBY3Rpb24pO1xuXG5kZXNjcmliZShcIlVwZGF0ZS51cGRhdGVGaWVsZFwiLCAoKSA9PiB7XG4gIGl0KFwib3V0cHV0cyBhIHN0YXRlIHRoZSBmaWVsZCB1cGRhdGVkXCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChcbiAgICAgIG5ld1N0YXRlLmZpZWxkc1N0YXRlXG4gICAgICAuZmluZCh2ID0+IHYuY29sb3IgPT09IG5ld0ZpZWxkU3RhdGUuY29sb3IpXG4gICAgKS5ub3QudG9FcXVhbCh1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdChcIm91dHB1dHMgYSBzdGF0ZSB0aGUgdXBkYXRlZCBmaWVsZCBpbiB0aGUgY29ycmVjdCBvcmRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG5ld0ZpZWxkU3RhdGUuY29sb3IpO1xuICB9KTtcblxuICBpdChcInNlbmRzIHRoZSBjdXJyZW50IHN0YXRlIHRvIGhpc3RvcnlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHJlY2VudEhpc3RvcnlTdGF0ZSA9IG5ld1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXTtcbiAgICBleHBlY3QocmVjZW50SGlzdG9yeVN0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KHJlY2VudEhpc3RvcnlTdGF0ZVswXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzBdLmlkKTtcbiAgICBleHBlY3QocmVjZW50SGlzdG9yeVN0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0uY29sb3IpO1xuICB9KTtcblxuICBpdChcIlJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgaWYgYW4gaW52YWxpZCBmaWVsZCBzdGF0ZSBpcyBnaXZlbiB0byBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3QgaXNTYW1lID0gKHN0YXRlMSwgc3RhdGUyKSA9PiB7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkVHlwZXMubGVuZ3RoKS50b0VxdWFsKHN0YXRlMi5maWVsZFR5cGVzLmxlbmd0aCk7XG4gICAgICBleHBlY3Qoc3RhdGUxLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChzdGF0ZTIuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVbMF0uY29sb3IpLnRvRXF1YWwoc3RhdGUyLmZpZWxkc1N0YXRlWzBdLmNvbG9yKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoc3RhdGUyLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICAgIGV4cGVjdChzdGF0ZTEuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChzdGF0ZTIuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNhbWVTdGF0ZTEgPSB1cGRhdGUobW9ja1N0YXRlLCB1cGRhdGVGaWVsZChudWxsKSk7XG4gICAgaXNTYW1lKG1vY2tTdGF0ZSwgc2FtZVN0YXRlMSk7XG5cbiAgICBjb25zdCBzYW1lU3RhdGUyID0gdXBkYXRlKFxuICAgICAgbW9ja1N0YXRlLFxuICAgICAgdXBkYXRlRmllbGQoT2JqZWN0LmFzc2lnbih7fSwgbmV3RmllbGRTdGF0ZSwgeyBpZDogbnVsbCB9KSlcbiAgICApO1xuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTIpO1xuXG4gICAgY29uc3Qgc2FtZVN0YXRlMyA9IHVwZGF0ZShcbiAgICAgIG1vY2tTdGF0ZSxcbiAgICAgIHVwZGF0ZUZpZWxkKE9iamVjdC5hc3NpZ24oe30sIG5ld0ZpZWxkU3RhdGUsIHsgY29uZmlnU2hvd2luZzogbnVsbCB9KSlcbiAgICApO1xuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTMpO1xuXG4gICAgY29uc3Qgc2FtZVN0YXRlNCA9IHVwZGF0ZShcbiAgICAgIG1vY2tTdGF0ZSxcbiAgICAgIHVwZGF0ZUZpZWxkKE9iamVjdC5hc3NpZ24oe30sIG5ld0ZpZWxkU3RhdGUsIHsgcmVxdWlyZWQ6IG51bGwgfSkpXG4gICAgKTtcblxuICAgIGlzU2FtZShtb2NrU3RhdGUsIHNhbWVTdGF0ZTQpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGJyZWFrIHRoZSBzdGF0ZSBhZnRlciB1cGRhdGluZyBhIGZpZWxkIG11bHRpcGxlIHRpbWVzIGEgZmllbGRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tGaWVsZDEgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcInllbGxvd1wiIH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDIgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcIm9yYW5nZVwiIH0pO1xuICAgIGNvbnN0IG1vY2tGaWVsZDMgPSBPYmplY3QuYXNzaWduKHt9LCBvbGRGaWVsZFN0YXRlLCB7IGNvbG9yOiBcInB1cnBsZVwiIH0pO1xuXG4gICAgY29uc3QgY2hhbmdlZDEgPSB1cGRhdGUobW9ja1N0YXRlLCB1cGRhdGVGaWVsZChtb2NrRmllbGQxKSk7XG4gICAgY29uc3QgY2hhbmdlZDIgPSB1cGRhdGUoY2hhbmdlZDEsIHVwZGF0ZUZpZWxkKG1vY2tGaWVsZDIpKTtcbiAgICBjb25zdCBjaGFuZ2VkMyA9IHVwZGF0ZShjaGFuZ2VkMiwgdXBkYXRlRmllbGQobW9ja0ZpZWxkMykpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZS5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzBdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVswXS5pZCk7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzBdLmNvbG9yKS50b0VxdWFsKG1vY2tGaWVsZDMuY29sb3IpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZUhpc3RvcnkubGVuZ3RoKS50b0VxdWFsKDMpO1xuICB9KTtcbn0pO1xuIiwiLyogZXNsaW50LWVudiBqYXNtaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuXG5pbXBvcnQgeyByZW9yZGVyRmllbGRzIH0gZnJvbSBcIi4uLy4uL2pzL0FjdGlvbnNcIjtcbmltcG9ydCB1cGRhdGUgZnJvbSBcIi4uLy4uL2pzL1VwZGF0ZVwiO1xuXG5jb25zdCB0ZW1wbGF0ZUZpZWxkID0ge1xuICB0eXBlOiBcImZpY3RpdGlvdXMtaW5zdGFuY2VcIixcbiAgcmVxdWlyZWQ6IGZhbHNlLFxuICBjb25maWdTaG93aW5nOiBmYWxzZSxcbiAgaWQ6IFwiMFwiLFxufTtcbmNvbnN0IGZpZWxkMSA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXBsYXRlRmllbGQsIHsgaWQ6IFwiMVwiIH0pO1xuY29uc3QgZmllbGQyID0gT2JqZWN0LmFzc2lnbih7fSwgdGVtcGxhdGVGaWVsZCwgeyBpZDogXCIyXCIgfSk7XG5jb25zdCBmaWVsZDMgPSBPYmplY3QuYXNzaWduKHt9LCB0ZW1wbGF0ZUZpZWxkLCB7IGlkOiBcIjNcIiB9KTtcbmNvbnN0IG1vY2tDdXJyZW50U3RhdGUgPSBbZmllbGQxLCBmaWVsZDIsIGZpZWxkM107XG5jb25zdCBtb2NrSGlzdG9yeSA9IFtdO1xuY29uc3QgbW9ja1N0YXRlID0ge1xuICBmaWVsZFR5cGVzOiBbeyBpbmZvOiB7IHR5cGU6IFwiZmljdGl0aW91cy1pbnN0YW5jZVwiIH0gfV0sXG4gIGZpZWxkc1N0YXRlOiBtb2NrQ3VycmVudFN0YXRlLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IG1vY2tIaXN0b3J5LFxufTtcblxuY29uc3QgbmV3T3JkZXIgPSBbXCIyXCIsIFwiM1wiLCBcIjFcIl07XG5jb25zdCByZW9yZGVyRmllbGRzQWN0aW9uID0gcmVvcmRlckZpZWxkcyhuZXdPcmRlcik7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIHJlb3JkZXJGaWVsZHNBY3Rpb24pO1xuXG5kZXNjcmliZShcIlVwZGF0ZS5yZW9yZGVyRmllbGRzXCIsICgpID0+IHtcbiAgaXQoXCJvdXRwdXRzIGEgc3RhdGUgd2l0aCBmaWVsZHMgaW4gdGhlIG5ldyBvcmRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobmV3T3JkZXJbMF0pO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCkudG9FcXVhbChuZXdPcmRlclsxXSk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlWzJdLmlkKS50b0VxdWFsKG5ld09yZGVyWzJdKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgY3VycmVudCBzdGF0ZSB0byBoaXN0b3J5XCIsICgpID0+IHtcbiAgICBleHBlY3QobmV3U3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5WzBdWzBdLmlkKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGVbMF0uaWQpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZHNTdGF0ZUhpc3RvcnlbMF1bMV0uaWQpLnRvRXF1YWwobW9ja0N1cnJlbnRTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KG5ld1N0YXRlLmZpZWxkc1N0YXRlSGlzdG9yeVswXVsyXS5pZCkudG9FcXVhbChtb2NrQ3VycmVudFN0YXRlWzJdLmlkKTtcbiAgfSk7XG5cbiAgaXQoXCJSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGlmIGFueSBmaWVsZCBpZCBpcyBtaXNzaW5nXCIsICgpID0+IHtcbiAgICBjb25zdCBzYW1lU3RhdGUgPSB1cGRhdGUobW9ja1N0YXRlLCByZW9yZGVyRmllbGRzKFtcIjFcIiwgXCIyXCJdKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZVsyXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMl0uaWQpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBpZiB0aGUgcmVvcmRlciBhcnJheSBoYXMgbW9yZSBlbGVtZW50cyB0aGFuIGl0IHNob3VsZFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FtZVN0YXRlID0gdXBkYXRlKG1vY2tTdGF0ZSwgcmVvcmRlckZpZWxkcyhbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdKSk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkc1N0YXRlWzBdLmlkKTtcbiAgICBleHBlY3Qoc2FtZVN0YXRlLmZpZWxkc1N0YXRlWzFdLmlkKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZVsxXS5pZCk7XG4gICAgZXhwZWN0KHNhbWVTdGF0ZS5maWVsZHNTdGF0ZVsyXS5pZCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVbMl0uaWQpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tTdGF0ZS5maWVsZHNTdGF0ZS5sZW5ndGgpO1xuICAgIGV4cGVjdChzYW1lU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgYnJlYWsgdGhlIHN0YXRlIGFmdGVyIGNyZWF0aW5nIG9uZSBvYmplY3RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNoYW5nZWQxID0gdXBkYXRlKG1vY2tTdGF0ZSwgcmVvcmRlckZpZWxkcyhbXCIxXCIsIFwiMlwiLCBcIjNcIl0pKTtcbiAgICBjb25zdCBjaGFuZ2VkMiA9IHVwZGF0ZShjaGFuZ2VkMSwgcmVvcmRlckZpZWxkcyhbXCIzXCIsIFwiMVwiLCBcIjJcIl0pKTtcbiAgICBjb25zdCBjaGFuZ2VkMyA9IHVwZGF0ZShjaGFuZ2VkMiwgcmVvcmRlckZpZWxkcyhbXCIzXCIsIFwiMlwiLCBcIjFcIl0pKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRUeXBlcy5sZW5ndGgpLnRvRXF1YWwobW9ja1N0YXRlLmZpZWxkVHlwZXMubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGUubGVuZ3RoKS50b0VxdWFsKG1vY2tDdXJyZW50U3RhdGUubGVuZ3RoKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVIaXN0b3J5Lmxlbmd0aCkudG9FcXVhbCgzKTtcbiAgICBleHBlY3QoY2hhbmdlZDMuZmllbGRzU3RhdGVbMF0uaWQpLnRvRXF1YWwoXCIzXCIpO1xuICAgIGV4cGVjdChjaGFuZ2VkMy5maWVsZHNTdGF0ZVsxXS5pZCkudG9FcXVhbChcIjJcIik7XG4gICAgZXhwZWN0KGNoYW5nZWQzLmZpZWxkc1N0YXRlWzJdLmlkKS50b0VxdWFsKFwiMVwiKTtcbiAgfSk7XG59KTtcbiIsIi8qIGVzbGludC1lbnYgamFzbWluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuaW1wb3J0IHsgaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyB9IGZyb20gXCIuLi8uLi9qcy9BY3Rpb25zXCI7XG5pbXBvcnQgdXBkYXRlIGZyb20gXCIuLi8uLi9qcy9VcGRhdGVcIjtcblxuY29uc3QgY3JlYXRlVHlwZSA9IG5hbWUgPT4gKHtcbiAgaW5pdGlhbFN0YXRlOiBfID0+IF8sXG4gIFJlbmRlckVkaXRvcjogXyA9PiBfLFxuICBpbmZvOiB7IHR5cGU6IG5hbWUsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogbmFtZSB9LFxufSk7XG5cbmNvbnN0IG1vY2tTdGF0ZSA9IHtcbiAgZmllbGRUeXBlczogW2NyZWF0ZVR5cGUoXCJmaWN0aXRpb3VzLWluc3RhbmNlXCIpXSxcbiAgZmllbGRzU3RhdGU6IFtdLFxuICBmaWVsZHNTdGF0ZUhpc3Rvcnk6IFtdLFxufTtcblxuY29uc3QgY3VzdG9tVHlwZXMgPSBbXG4gIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgY3JlYXRlVHlwZShcImN1c3RvbS0yXCIpLFxuICBjcmVhdGVUeXBlKFwiY3VzdG9tLTNcIiksXG5dO1xuXG5jb25zdCBpbXBvcnRDdXN0b21Db21wb25lbnRzQWN0aW9uID0gaW1wb3J0Q3VzdG9tQ29tcG9uZW50cyhjdXN0b21UeXBlcyk7XG5jb25zdCBuZXdTdGF0ZSA9IHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHNBY3Rpb24pO1xuXG5cbmRlc2NyaWJlKFwiVXBkYXRlLmltcG9ydEN1c3RvbUNvbXBvbmVudHNcIiwgKCkgPT4ge1xuICBpdChcIkFwcGVuZHMgdGhlIG5ldyB2YWxpZCBjdXN0b20gdHlwZXMgdG8gdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgdHlwZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzLmxlbmd0aCkudG9FcXVhbChtb2NrU3RhdGUuZmllbGRUeXBlcy5sZW5ndGggKyBjdXN0b21UeXBlcy5sZW5ndGgpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzFdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1swXS5pbmZvLnR5cGUpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzJdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1sxXS5pbmZvLnR5cGUpO1xuICAgIGV4cGVjdChuZXdTdGF0ZS5maWVsZFR5cGVzWzNdLmluZm8udHlwZSkudG9FcXVhbChjdXN0b21UeXBlc1syXS5pbmZvLnR5cGUpO1xuICB9KTtcblxuICBpdChcIlJldHVybnMgYW4gdW5jaGFuZ2VkIGFycmF5IGlmIGN1c3RvbVR5cGVzIGlzIGludmFsaWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKG51bGwpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDEgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBjcmVhdGVUeXBlKFwiY3VzdG9tLTFcIiksIHsgaW5mbzogbnVsbCB9KSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQxKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQyID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBpbmZvOiB7IHR5cGU6IG51bGwsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogXCJjdXN0b21cIiB9IH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDIpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDMgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IGluZm86IHsgdHlwZTogXCJjdXN0b21cIiwgZ3JvdXA6IG51bGwsIGRpc3BsYXlOYW1lOiBcImN1c3RvbVwiIH0gfVxuICAgICAgKSxcbiAgICBdO1xuICAgIGV4cGVjdCh1cGRhdGUobW9ja1N0YXRlLCBpbXBvcnRDdXN0b21Db21wb25lbnRzKGludmFsaWQzKSkpLnRvRXF1YWwobW9ja1N0YXRlKTtcblxuICAgIGNvbnN0IGludmFsaWQ0ID0gW1xuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIGNyZWF0ZVR5cGUoXCJjdXN0b20tMVwiKSxcbiAgICAgICAgeyBpbmZvOiB7IHR5cGU6IFwiY3VzdG9tXCIsIGdyb3VwOiBcImN1c3RvbVwiLCBkaXNwbGF5TmFtZTogbnVsbCB9IH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDQpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDUgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IFJlbmRlckVkaXRvcjogXCJub3QgYSBmdW5jdGlvblwiIH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDUpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuXG4gICAgY29uc3QgaW52YWxpZDYgPSBbXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgY3JlYXRlVHlwZShcImN1c3RvbS0xXCIpLFxuICAgICAgICB7IGluaXRpYWxTdGF0ZTogXCJub3QgYSBmdW5jdGlvblwiIH0pLFxuICAgIF07XG4gICAgZXhwZWN0KHVwZGF0ZShtb2NrU3RhdGUsIGltcG9ydEN1c3RvbUNvbXBvbmVudHMoaW52YWxpZDYpKSkudG9FcXVhbChtb2NrU3RhdGUpO1xuICB9KTtcbn0pO1xuIl0sIm5hbWVzIjpbInVuZG8iLCJpbXBvcnRDdXN0b21Db21wb25lbnRzIiwiaW1wb3J0U3RhdGUiLCJjcmVhdGVGaWVsZCIsImZpZWxkQ3JlYXRlZCIsInRvZ2dsZUNvbmZpZyIsInRvZ2dsZVJlcXVpcmVkIiwiZGVsZXRlRmllbGQiLCJ1cGRhdGVGaWVsZCIsInJlb3JkZXJGaWVsZHMiLCJkZXNjcmliZSIsImFjdGlvbiIsInR5cGUiLCJ0b0VxdWFsIiwibW9ja1N0YXRlVG9JbXBvcnQiLCJuZXdGaWVsZHNTdGF0ZSIsImZpZWxkVHlwZSIsImNyZWF0ZWRGaWVsZFN0YXRlIiwiZmllbGRTdGF0ZSIsIm5ld0ZpZWxkU3RhdGUiLCJuZXdGaWVsZHNPcmRlciIsImN1c3RvbUNvbXBvbmVudHMiLCJkZWZpbmUiLCJhc3luY0Rpc3BhdGNoTWlkZGxld2FyZSIsInN5bmNBY3Rpdml0eUZpbmlzaGVkIiwiYWN0aW9uUXVldWUiLCJmbHVzaFF1ZXVlIiwiZm9yRWFjaCIsInN0b3JlIiwiZGlzcGF0Y2giLCJhIiwiYXN5bmNEaXNwYXRjaCIsImFzeW5jQWN0aW9uIiwiY29uY2F0IiwiYWN0aW9uV2l0aEFzeW5jRGlzcGF0Y2giLCJJbW11dGFibGUiLCJtZXJnZSIsImZha2VBY3Rpb24iLCJkb25lIiwibmV4dCIsInJldHVybmVkQWN0aW9uIiwibm90IiwidW5kZWZpbmVkIiwiZmFrZUFzeW5jQWN0aW9uIiwiZmFrZVN0b3JlIiwiRWl0aGVyIiwicmVxdWlyZSQkMCIsInVwZGF0ZUF0IiwiX2RlZmF1bHQiLCJrZXlBcnJheSIsIm5ld1ZhbCIsIm9iaiIsImRlZXBOZXdWYWwiLCJyZWR1Y2VSaWdodCIsInJlc3VsdCIsImtleSIsImRlZXAiLCJTdGF0ZUxlbnNlcyIsIl9kZWZhdWx0MiIsIl9kZWZhdWx0MyIsImNyZWF0ZUlkIiwiRGF0ZSIsIm5vdyIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInB1c2hIaXN0b3J5U3RhdGUiLCJzdGF0ZSIsIm5ld0hpc3RvcnlTdGF0ZSIsIl9kZWZhdWx0NCIsImZpZWxkc1N0YXRlSGlzdG9yeSIsIl9kZWZhdWx0NiIsImZpZWxkc1N0YXRlIiwiaGlkZUNvbmZpZ3MiLCJfZGVmYXVsdDciLCJtYXAiLCJPYmplY3QiLCJhc3NpZ24iLCJzIiwiY29uZmlnU2hvd2luZyIsInByb3BlcnR5VHlwZUNoZWNrIiwicHJvcGVydHlOYW1lIiwiYmFiZWxIZWxwZXJzLnR5cGVvZiIsIlJpZ2h0IiwiTGVmdCIsInZhbGlkYXRlRmllbGQiLCJmcm9tTnVsbGFibGUiLCJsZWZ0TWFwIiwiZnMiLCJjaGFpbiIsImxhc3RIaXN0b3J5U3RhdGUiLCJfIiwiSW5maW5pdHkiLCJpc0FycmF5IiwiQXJyYXkiLCJhcnIiLCJmaWVsZFR5cGVJc1ZhbGlkIiwidmFsaWRUeXBlcyIsImZpZWxkIiwiZmluZCIsInZhbGlkRmllbGRUeXBlcyIsIm9mIiwidmFsaWRhdGVGaWVsZHNTdGF0ZSIsImZpZWxkVHlwZXMiLCJhZGRSZXF1aXJlZFByb3BlcnRpZXMiLCJmaWVsZFN0YXRlcyIsImlkIiwiYmltYXAiLCJjb25zb2xlIiwiZXJyb3IiLCJnZXRPckVsc2UiLCJUYXNrIiwidHlwZUNvbnN0cnVjdG9yIiwidiIsImluZm8iLCJyZWplY3QiLCJyZXNvbHZlIiwiY2FsbGVkIiwiY29uc3RyIiwiaW5pdGlhbFN0YXRlIiwiUHJvbWlzZSIsInRoZW4iLCJjYXRjaCIsImluc2VydFJlcXVpcmVkUHJvcHMiLCJjcmVhdGVGaWVsZEFzeW5jaHJvbm91c2x5IiwicmVqZWN0ZWQiLCJmb3JrIiwiZXJyIiwiTWF5YmUiLCJjbG9uZSIsInVuaW1wbGVtZW50ZWQiLCJub29wIiwiaGlzdG9yeVN0YXRlV2l0aE5ld0ZpZWxkIiwibmV3RmllbGQiLCJfZGVmYXVsdDUiLCJzZXQiLCJyZXBsYWNlRmllbGRTdGF0ZSIsImFGaWVsZCIsInJlcXVpcmVkIiwiaGlzdG9yeVN0YXRlV2l0aG91dEZpZWxkIiwidXBkYXRlRmllbGRTdGF0ZSIsImhpc3RvcnlTdGF0ZVdpdGhOZXdPcmRlciIsIm5ld09yZGVyIiwiZjEiLCJmMiIsImluZGV4T2YiLCJvIiwibGVuZ3RoIiwic3RhdGVJZHMiLCJub01pc3NpbmdJZCIsInJlZHVjZSIsImFjYyIsImZJZCIsImluY2x1ZGVzIiwiaGFzUmVxdWlyZWRJbmZvIiwiY29tcG9uZW50IiwiYyIsImlzQ29tcG9uZW50VmFsaWQiLCJ2YWxpZGF0ZUNvbXBvbmVudHMiLCJhZGRUb0ZpZWxkVHlwZXMiLCJhY3Rpb25IYW5kbGVycyIsImlzRXhwZWN0ZWRBY3Rpb24iLCJpc1JlZHV4QWN0aW9uIiwidXBkYXRlIiwiYXNzZXJ0IiwiY3VycmVudEZpZWxkc1N0YXRlIiwib2xkRmllbGRzU3RhdGUiLCJtb2NrU3RhdGUiLCJlbXB0eU1vY2tTdGF0ZSIsImVtcHR5SGlzdG9yeU1vY2tTdGF0ZSIsIm1vZGlmaWVkU3RhdGUiLCJ1bmRvQWN0aW9uIiwidHlwZXNBcnJheSIsIm1vY2tDdXJyZW50U3RhdGUiLCJtb2NrSGlzdG9yeSIsIm5ld1ZhbGlkU3RhdGUiLCJuZXdJbnZhbGlkU3RhdGUiLCJ1cGRhdGVkIiwiZGlzcGxheU5hbWUiLCJncm91cCIsInZhbGlkU3RhdGUyIiwiaWR4IiwicHJvbWlzZVR5cGVJbnN0YW5jZSIsInByb21pc2VUeXBlIiwic3luY1R5cGVJbnN0YW5jZSIsInN5bmNUeXBlIiwiYXN5bmNBY2lvbiIsImphc21pbmUiLCJjcmVhdGVTcHkiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiZmllbGRDcmVhdGVkQWN0aW9uIiwibmV3U3RhdGUiLCJzYW1lU3RhdGUiLCJjaGFuZ2VkMSIsImNoYW5nZWQyIiwiY2hhbmdlZDMiLCJmaWVsZFN0YXRlQ29uZmlnU2hvd2luZyIsImZpZWxkU3RhdGVDb25maWdOb3RTaG93aW5nIiwiZiIsImZpZWxkU3RhdGVJc1JlcXVpcmVkIiwiZmllbGRTdGF0ZUlzTm90UmVxdWlyZWQiLCJ0b0JlRGVsZXRlZEZpZWxkU3RhdGUiLCJmaWVsZERlbGV0ZUFjdGlvbiIsInJlY2VudEhpc3RvcnlTdGF0ZSIsIm1vY2tGaWVsZDEiLCJtb2NrRmllbGQyIiwibW9ja0ZpZWxkMyIsIm1vY2tTdGF0ZTIiLCJvbGRGaWVsZFN0YXRlIiwiY29sb3IiLCJmaWVsZFVwZGF0ZUFjdGlvbiIsImlzU2FtZSIsInN0YXRlMSIsInN0YXRlMiIsInNhbWVTdGF0ZTEiLCJzYW1lU3RhdGUyIiwic2FtZVN0YXRlMyIsInNhbWVTdGF0ZTQiLCJ0ZW1wbGF0ZUZpZWxkIiwiZmllbGQxIiwiZmllbGQyIiwiZmllbGQzIiwicmVvcmRlckZpZWxkc0FjdGlvbiIsImNyZWF0ZVR5cGUiLCJuYW1lIiwiY3VzdG9tVHlwZXMiLCJpbXBvcnRDdXN0b21Db21wb25lbnRzQWN0aW9uIiwiaW52YWxpZDEiLCJpbnZhbGlkMiIsImludmFsaWQzIiwiaW52YWxpZDQiLCJpbnZhbGlkNSIsIlJlbmRlckVkaXRvciIsImludmFsaWQ2Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUlBLEFBQU8sSUFBTUEsT0FBTyxTQUFQQSxJQUFPO1NBQ25CO1VBQ087R0FGWTtDQUFiOztBQUtQLEFBQU8sSUFBTUMseUJBQXlCLFNBQXpCQSxzQkFBeUI7U0FDckM7VUFDTyx3QkFEUDs7R0FEcUM7Q0FBL0I7O0FBT1AsQUFBTyxJQUFNQyxjQUFjLFNBQWRBLFdBQWM7U0FDMUI7VUFDTyxhQURQOztHQUQwQjtDQUFwQjs7QUFNUCxBQUFPLElBQU1DLGNBQWMsU0FBZEEsV0FBYztTQUMxQjtVQUNPLGFBRFA7O0dBRDBCO0NBQXBCOztBQU1QLEFBQU8sSUFBTUMsZUFBZSxTQUFmQSxZQUFlO1NBQzNCO1VBQ08sY0FEUDs7R0FEMkI7Q0FBckI7O0FBTVAsQUFBTyxJQUFNQyxlQUFlLFNBQWZBLFlBQWU7U0FDM0I7VUFDTyxjQURQOztHQUQyQjtDQUFyQjs7QUFNUCxBQUFPLElBQU1DLGlCQUFpQixTQUFqQkEsY0FBaUI7U0FDN0I7VUFDTyxnQkFEUDs7R0FENkI7Q0FBdkI7O0FBTVAsQUFBTyxJQUFNQyxjQUFjLFNBQWRBLFdBQWM7U0FDMUI7VUFDTyxhQURQOztHQUQwQjtDQUFwQjs7QUFNUCxBQUFPLElBQU1DLGNBQWMsU0FBZEEsV0FBYztTQUMxQjtVQUNPLGFBRFA7O0dBRDBCO0NBQXBCOztBQU1QLEFBQU8sSUFBTUMsZ0JBQWdCLFNBQWhCQSxhQUFnQjtTQUM1QjtVQUNPLGVBRFA7O0dBRDRCO0NBQXRCOztBQzFEUDs7QUFFQSxB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QUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztlQUN2RSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3hEO1FBQ0UsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO2VBQ2hFLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2VBQzVGLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2VBQzVGLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2VBQzVGLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztlQUNsRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFF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QUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlFLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEYsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdEYsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFGLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUYsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxT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QUFhOztBQUVyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbkMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUNyQjs7QUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUNyQjs7Ozs7Ozs7QUFRREEsUUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsY0FBYTs7QUFFckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxPQUFPLEVBQUU7RUFDdEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDaEM7O0FBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxPQUFPLEVBQUU7RUFDdkMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDakM7Ozs7Ozs7OztBQVNEQSxRQUFNLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxjQUFhOztBQUVyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXO0VBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0VBQzlCOztBQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVc7RUFDaEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDN0I7Ozs7Ozs7OztBQVNEQSxRQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxjQUFhOztBQUV0QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxD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"} \ No newline at end of file diff --git a/gulp-tasks/extensions.js b/gulp-tasks/extensions.js new file mode 100644 index 0000000..babcf41 --- /dev/null +++ b/gulp-tasks/extensions.js @@ -0,0 +1,87 @@ +/** + This file contains black magic. Don't overthink it. + + In rollup configuration use it like this: + + const extensions = require("./extensions") + rollup({ + plugins: [ + extensions({ + extensions: [".jsx", ".foobar", ".etc"] + }), + ] + }); + + Most of this file's code was taken from here: https://github.com/rollup/rollup/issues/1052 + */ + +const { basename, dirname, isAbsolute, resolve } = require("path"); +const fs = require("fs"); + +function isFile(file) { + try { + return fs.statSync(file).isFile(); + } catch (err) { + return false; + } +} + +function addExtensionIfNecessary(file, extensions) { + try { + const name = basename(file); + const files = fs.readdirSync(dirname(file)); + + if (~files.indexOf(name) && isFile(file)) return file; + for (const ext of extensions) { + if (~files.indexOf(`${name}${ext}`) && isFile(`${file}${ext}`)) { + return `${file}${ext}`; + } + + // In case `file` is a folder name, we check if there is an + // index file in the folder + const indexPath = `${file}/index${ext}`; + if (isFile(indexPath)) { + return indexPath; + } + } + } catch (err) { + // noop + } + + return null; +} + +module.exports = function extensions({ extensions }) { + if (!extensions || !extensions.length) { + throw new Error( + `Must specify { extensions: [..] } as non-empty array!` + ); + } + + return { + name: "extensions", + + resolveId(importee, importer) { + // absolute paths are left untouched + if (isAbsolute(importee)) { + return addExtensionIfNecessary(resolve(importee), extensions); + } + + // if this is the entry point, resolve against cwd + if (importer === undefined) { + return addExtensionIfNecessary( + resolve(process.cwd(), importee), + extensions + ); + } + + // external modules are skipped at this stage + if (importee[0] !== ".") return null; + + return addExtensionIfNecessary( + resolve(dirname(importer), importee), + extensions + ); + } + }; +}; diff --git a/gulp-tasks/transpile-react.js b/gulp-tasks/transpile-react.js index 1a500e4..febfb2e 100644 --- a/gulp-tasks/transpile-react.js +++ b/gulp-tasks/transpile-react.js @@ -25,6 +25,7 @@ const nodeResolve = require('rollup-plugin-node-resolve'); const organiser = require('gulp-organiser'); const rename = require('gulp-rename'); const { curry } = require('lodash/fp'); +const extensions = require("./extensions"); const DEFAULT_CONFIG = { sourceMap: true, @@ -34,6 +35,8 @@ const DEFAULT_CONFIG = { // Let's use UMD format to serve our files to the front-end format: 'umd', plugins: [ + // Reslver to allow importing .jsx files + extensions({ extensions: [".jsx", ".js"] }), // Import modules with jsnext:main nodeResolve({ jsnext: true, main: true }), // Allow importing commonjs modules diff --git a/src/js/View/ControlBar/ButtonDropdownOption.js b/src/js/View/ControlBar/ButtonDropdownOption.jsx similarity index 100% rename from src/js/View/ControlBar/ButtonDropdownOption.js rename to src/js/View/ControlBar/ButtonDropdownOption.jsx diff --git a/src/js/View/ControlBar/ButtonGroupDropdown.js b/src/js/View/ControlBar/ButtonGroupDropdown.jsx similarity index 100% rename from src/js/View/ControlBar/ButtonGroupDropdown.js rename to src/js/View/ControlBar/ButtonGroupDropdown.jsx diff --git a/src/js/View/ControlBar/index.js b/src/js/View/ControlBar/index.jsx similarity index 100% rename from src/js/View/ControlBar/index.js rename to src/js/View/ControlBar/index.jsx diff --git a/src/js/View/Fields/FieldWrapper.ConfigBar.js b/src/js/View/Fields/FieldWrapper.ConfigBar.jsx similarity index 100% rename from src/js/View/Fields/FieldWrapper.ConfigBar.js rename to src/js/View/Fields/FieldWrapper.ConfigBar.jsx diff --git a/src/js/View/Fields/FieldWrapper.Sidebar.js b/src/js/View/Fields/FieldWrapper.Sidebar.jsx similarity index 100% rename from src/js/View/Fields/FieldWrapper.Sidebar.js rename to src/js/View/Fields/FieldWrapper.Sidebar.jsx diff --git a/src/js/View/Fields/FieldWrapper.js b/src/js/View/Fields/FieldWrapper.jsx similarity index 100% rename from src/js/View/Fields/FieldWrapper.js rename to src/js/View/Fields/FieldWrapper.jsx diff --git a/src/js/View/Fields/index.js b/src/js/View/Fields/index.jsx similarity index 100% rename from src/js/View/Fields/index.js rename to src/js/View/Fields/index.jsx diff --git a/src/js/View/Main.js b/src/js/View/Main.jsx similarity index 100% rename from src/js/View/Main.js rename to src/js/View/Main.jsx diff --git a/src/js/View/index.js b/src/js/View/index.jsx similarity index 100% rename from src/js/View/index.js rename to src/js/View/index.jsx diff --git a/src/js/default-types/options-fields/buildOptionsFieldConstructor.js b/src/js/default-types/options-fields/buildOptionsFieldConstructor.jsx similarity index 100% rename from src/js/default-types/options-fields/buildOptionsFieldConstructor.js rename to src/js/default-types/options-fields/buildOptionsFieldConstructor.jsx diff --git a/src/js/default-types/options-fields/options-utils.js b/src/js/default-types/options-fields/options-utils.jsx similarity index 100% rename from src/js/default-types/options-fields/options-utils.js rename to src/js/default-types/options-fields/options-utils.jsx diff --git a/src/js/default-types/text-fields/buildTextFieldConstructor.js b/src/js/default-types/text-fields/buildTextFieldConstructor.jsx similarity index 100% rename from src/js/default-types/text-fields/buildTextFieldConstructor.js rename to src/js/default-types/text-fields/buildTextFieldConstructor.jsx diff --git a/src/js/index.js b/src/js/index.js deleted file mode 100644 index 087a6be..0000000 --- a/src/js/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import store from "./store"; -import React from "react"; -// This is used to make the store available to all components -import { Provider } from "react-redux"; -import ReactDOM from "react-dom"; -import assert from "fl-assert"; -import View from "./View"; -import { importState, importCustomComponents } from "./Actions"; - -function FormBuilder(container, components = []) { - assert( - container && container.nodeName, - `Invalid contianer: ${container}. Container must be an HTML element.` - ); - - ReactDOM.render(, container); - - store.dispatch(importCustomComponents(components)); - this.exportState = _ => store.getState().fieldsState; - this.importState = s => store.dispatch(importState(s)); -} - -export default FormBuilder; diff --git a/src/js/index.jsx b/src/js/index.jsx new file mode 100644 index 0000000..4c39340 --- /dev/null +++ b/src/js/index.jsx @@ -0,0 +1,28 @@ +import store from "./store"; +import React from "react"; +// This is used to make the store available to all components +import { Provider } from "react-redux"; +import ReactDOM from "react-dom"; +import assert from "fl-assert"; +import View from "./View"; +import { importState, importCustomComponents } from "./Actions"; + +function FormBuilder(container, components = []) { + assert( + container && container.nodeName, + `Invalid contianer: ${container}. Container must be an HTML element.` + ); + + ReactDOM.render( + + + , + container + ); + + store.dispatch(importCustomComponents(components)); + this.exportState = _ => store.getState().fieldsState; + this.importState = s => store.dispatch(importState(s)); +} + +export default FormBuilder; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..c03f117 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4622 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@gulp-sourcemaps/map-sources@1.X": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +accepts@~1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + dependencies: + mime-types "~2.1.16" + negotiator "0.6.1" + +acorn@4.X: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" + +after@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-slice@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" + +array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + +async@1.5.2, async@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.5: + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" + +autoprefixer@^7.1.5: + version "7.1.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.6.tgz#fb933039f74af74a83e71225ce78d9fd58ba84d7" + dependencies: + browserslist "^2.5.1" + caniuse-lite "^1.0.30000748" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.13" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-module-imports@^7.0.0-beta.3: + version "7.0.0-beta.3" + resolved "https://registry.yarnpkg.com/babel-helper-module-imports/-/babel-helper-module-imports-7.0.0-beta.3.tgz#e15764e3af9c8e11810c09f78f498a2bdc71585a" + dependencies: + babel-types "7.0.0-beta.3" + lodash "^4.2.0" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-external-helpers@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-lodash@^3.2.11: + version "3.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.2.tgz#da3a5b49ba27447f54463f6c4fa81396ccdd463f" + dependencies: + babel-helper-module-imports "^7.0.0-beta.3" + babel-types "^6.26.0" + glob "^7.1.1" + lodash "^4.17.4" + require-package-name "^2.0.1" + +babel-plugin-ramda@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-ramda/-/babel-plugin-ramda-1.4.3.tgz#265b54a92f29f5ed56180b95c499d1ae2a8a25a7" + dependencies: + ramda "0.x" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-display-name@^6.23.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-self@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@^1.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^2.1.2" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + +babel-preset-react@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + dependencies: + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-react-display-name "^6.23.0" + babel-plugin-transform-react-jsx "^6.24.1" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + babel-preset-flow "^6.23.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@7.0.0-beta.3: + version "7.0.0-beta.3" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-7.0.0-beta.3.tgz#cd927ca70e0ae8ab05f4aab83778cfb3e6eb20b4" + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64id@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" + +batch@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +binary-extensions@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + +bl@^0.9.1: + version "0.9.5" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" + dependencies: + readable-stream "~1.0.26" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +bootstrap@^3.3.6: + version "3.3.7" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.0: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browser-sync-client@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.5.1.tgz#ec1ad69a49c2e2d4b645b18b1c06c29b3d9af8eb" + dependencies: + etag "^1.7.0" + fresh "^0.3.0" + +browser-sync-ui@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-0.6.3.tgz#640a537c180689303d5be92bc476b9ebc441c0bc" + dependencies: + async-each-series "0.1.1" + connect-history-api-fallback "^1.1.0" + immutable "^3.7.6" + server-destroy "1.0.1" + stream-throttle "^0.1.3" + weinre "^2.0.0-pre-I0Z7U9OV" + +browser-sync@^2.18.5: + version "2.18.13" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.18.13.tgz#c28dc3eb3be67c97a907082b772a37f915c14d7d" + dependencies: + browser-sync-client "2.5.1" + browser-sync-ui "0.6.3" + bs-recipes "1.3.4" + chokidar "1.7.0" + connect "3.5.0" + dev-ip "^1.0.1" + easy-extender "2.3.2" + eazy-logger "3.0.2" + emitter-steward "^1.0.0" + fs-extra "3.0.1" + http-proxy "1.15.2" + immutable "3.8.1" + localtunnel "1.8.3" + micromatch "2.3.11" + opn "4.0.2" + portscanner "2.1.1" + qs "6.2.1" + resp-modifier "6.0.2" + rx "4.1.0" + serve-index "1.8.0" + serve-static "1.12.2" + server-destroy "1.0.1" + socket.io "1.6.0" + socket.io-client "1.6.0" + ua-parser-js "0.7.12" + yargs "6.4.0" + +browserslist@^2.1.2, browserslist@^2.5.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.9.0.tgz#706aca15c53be15610f466e348cbfa0c00a6a379" + dependencies: + caniuse-lite "^1.0.30000760" + electron-to-chromium "^1.3.27" + +bs-recipes@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + +builtin-modules@^1.0.0, builtin-modules@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2, camelcase@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +caniuse-db@^1.0.30000746: + version "1.0.30000764" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000764.tgz#d73ab11ae62f6a9e2f69867d6d9c23ae3f2e5d8d" + +caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000760: + version "1.0.30000764" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000764.tgz#97ea7472f9d3e691eede34f21983cfc219ac7842" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chokidar@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.0.3, cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-stats@^0.0.1, clone-stats@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.2.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +connect-history-api-fallback@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + +connect@1.x: + version "1.9.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" + dependencies: + formidable "1.0.x" + mime ">= 0.0.1" + qs ">= 0.4.0" + +connect@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" + dependencies: + debug "~2.2.0" + finalhandler "0.5.0" + parseurl "~1.3.1" + utils-merge "1.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +convert-source-map@1.X, convert-source-map@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.4.3" + minimist "^1.2.0" + object-assign "^4.1.0" + os-homedir "^1.0.1" + parse-json "^2.2.0" + require-from-string "^1.1.0" + +create-react-class@^15.6.0: + version "15.6.2" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +css@2.X: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.3.0" + urix "^0.1.0" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +data.either@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/data.either/-/data.either-1.5.1.tgz#71f9dbfc8fe3ab0112e52e443470bcd526f50b47" + +data.maybe@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/data.maybe/-/data.maybe-1.2.2.tgz#f955e4b5572b2eb5047eab93d8bb3a1cc76a2dc3" + +data.task@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/data.task/-/data.task-3.1.1.tgz#e985f5bedadd926b2d63c1a5d2076cff917a52ad" + +dateformat@^1.0.7-1.2.3: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +debug-fabulous@0.0.X: + version "0.0.4" + resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz#fa071c5d87484685424807421ca4b16b0b1a0763" + dependencies: + debug "2.X" + lazy-debug-legacy "0.0.X" + object-assign "4.1.0" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0" + dependencies: + ms "0.7.3" + +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@2.X, debug@^2.2.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1, depd@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" + +detect-newline@2.X: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + +diff@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + +document-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/document-offset/-/document-offset-1.0.4.tgz#7345b819cdfef2bb45c63ce13056416063b70085" + dependencies: + dom-support "*" + get-document "1.0.0" + within-element "0.1.0" + +dom-support@*: + version "0.0.2" + resolved "https://registry.yarnpkg.com/dom-support/-/dom-support-0.0.2.tgz#0e129764ffa5e203d8ab5839e2e92dc2ae14ef7c" + dependencies: + domready "*" + +domready@*: + version "1.0.8" + resolved "https://registry.yarnpkg.com/domready/-/domready-1.0.8.tgz#91f252e597b65af77e745ae24dd0185d5e26d58c" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +easy-extender@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.2.tgz#3d3248febe2b159607316d8f9cf491c16648221d" + dependencies: + lodash "^3.10.1" + +eazy-logger@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc" + dependencies: + tfunk "^3.0.1" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.3.27: + version "1.3.27" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" + +emitter-steward@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/emitter-steward/-/emitter-steward-1.0.0.tgz#f3411ade9758a7565df848b2da0cbbd1b46cbd64" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +engine.io-client@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "2.3.3" + engine.io-parser "1.3.1" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + ws "1.1.1" + xmlhttprequest-ssl "1.5.3" + yeast "0.1.2" + +engine.io-parser@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" + dependencies: + after "0.8.1" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.6" + wtf-8 "1.0.0" + +engine.io@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" + dependencies: + accepts "1.3.3" + base64id "0.1.0" + cookie "0.3.1" + debug "2.3.3" + engine.io-parser "1.3.1" + ws "1.1.1" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.6.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + +estree-walker@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" + +estree-walker@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.0.tgz#aae3b57c42deb8010e349c892462f0e71c5dd1aa" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@^1.7.0, etag@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +express@2.5.x: + version "2.5.11" + resolved "https://registry.yarnpkg.com/express/-/express-2.5.11.tgz#4ce8ea1f3635e69e49f0ebb497b6a4b0a51ce6f0" + dependencies: + connect "1.x" + mime "1.2.4" + mkdirp "0.3.0" + qs "0.4.x" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +fancy-log@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +fbjs@^0.8.16, fbjs@^0.8.9: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.0" + unpipe "~1.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +fl-assert@^1.0.0: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fl-assert/-/fl-assert-1.0.10.tgz#d52b222a5fd4f4df09aa695507376cd21d60ca8f" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +formidable@1.0.x: + version "1.0.17" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +fresh@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +gaze@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" + dependencies: + globule "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-document@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-document/-/get-document-1.0.0.tgz#4821bce66f1c24cb0331602be6cb6b12c4f01c4b" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globule@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" + dependencies: + glob "~7.1.1" + lodash "~4.17.4" + minimatch "~3.0.2" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +graceful-fs@4.X, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +gulp-babel@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-7.0.0.tgz#7b93c975159f7a0553e4263b4a55100ccc239b28" + dependencies: + gulp-util "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-flatmap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulp-flatmap/-/gulp-flatmap-1.0.0.tgz#e634e03cffb263aebacfdc22dd8ce2f3d76ffe97" + dependencies: + gulp-util "~2.2.14" + through2 "~0.6.3" + +gulp-jasmine@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/gulp-jasmine/-/gulp-jasmine-2.4.2.tgz#5a7f47e27370c3619ac0a2a442be399671409db3" + dependencies: + arrify "^1.0.0" + gulp-util "^3.0.0" + jasmine "^2.3.0" + jasmine-terminal-reporter "^1.0.0" + through2 "^2.0.0" + +gulp-organiser@^1.0.6: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gulp-organiser/-/gulp-organiser-1.1.0.tgz#f5eda07d9e76559b5a087ffdd9a4c606c07354de" + dependencies: + gulp "^3.9.1" + gulp-shell "^0.6.3" + lodash "^4.15.0" + ramda-fantasy "^0.8.0" + require-dir-all "^0.4.9" + +gulp-postcss@^6.2.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/gulp-postcss/-/gulp-postcss-6.4.0.tgz#78a32e3c87aa6cdcec5ae1c905e196d478e8c5d5" + dependencies: + gulp-util "^3.0.8" + postcss "^5.2.12" + postcss-load-config "^1.2.0" + vinyl-sourcemaps-apply "^0.2.1" + +gulp-rename@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" + +gulp-sass@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-3.1.0.tgz#53dc4b68a1f5ddfe4424ab4c247655269a8b74b7" + dependencies: + gulp-util "^3.0" + lodash.clonedeep "^4.3.2" + node-sass "^4.2.0" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-shell@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.5.2.tgz#a4959ca0651ad1c7bbfe70b2d0adbbb4e1aea98d" + dependencies: + async "^1.5.0" + gulp-util "^3.0.7" + lodash "^4.0.0" + through2 "^2.0.0" + +gulp-shell@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.6.3.tgz#2eaa6edfffa8bdff7a8f0b9f9852876f33331c6b" + dependencies: + async "^2.1.5" + gulp-util "^3.0.8" + lodash "^4.17.4" + through2 "^2.0.3" + +gulp-sourcemaps@^1.9.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.12.0.tgz#786f97c94a0f968492465d70558e04242c679598" + dependencies: + "@gulp-sourcemaps/map-sources" "1.X" + acorn "4.X" + convert-source-map "1.X" + css "2.X" + debug-fabulous "0.0.X" + detect-newline "2.X" + graceful-fs "4.X" + source-map "0.X" + strip-bom "2.X" + through2 "2.X" + vinyl "1.X" + +gulp-uglify@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-2.1.2.tgz#6db85b1d0ee63d18058592b658649d65c2ec4541" + dependencies: + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash "^4.13.1" + make-error-cause "^1.1.1" + through2 "^2.0.0" + uglify-js "~2.8.10" + uglify-save-license "^0.4.1" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.7, gulp-util@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-util@~2.2.14: + version "2.2.20" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" + dependencies: + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" + +gulp@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" + dependencies: + isarray "0.0.1" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoist-non-react-statics@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +http-errors@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" + dependencies: + inherits "2.0.3" + setprototypeof "1.0.2" + statuses ">= 1.3.1 < 2" + +http-errors@~1.6.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-proxy@1.15.2: + version "1.15.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@~0.4.13: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +immutable@3.8.1, immutable@^3.7.6: + version "3.8.1" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +interpret@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" + +invariant@^2.0.0, invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-arrow-function@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-arrow-function/-/is-arrow-function-2.0.3.tgz#29be2c2d8d9450852b8bbafb635ba7b8d8e87ec2" + dependencies: + is-callable "^1.0.4" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-boolean-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.0.4, is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-equal@^1.5.3: + version "1.5.5" + resolved "https://registry.yarnpkg.com/is-equal/-/is-equal-1.5.5.tgz#5e85f1957e052883247feb386965a3bba15fbb3d" + dependencies: + has "^1.0.1" + is-arrow-function "^2.0.3" + is-boolean-object "^1.0.0" + is-callable "^1.1.3" + is-date-object "^1.0.1" + is-generator-function "^1.0.6" + is-number-object "^1.0.3" + is-regex "^1.0.3" + is-string "^1.0.4" + is-symbol "^1.0.1" + object.entries "^1.0.4" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-generator-function@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.6.tgz#9e71653cd15fff341c79c4151460a131d31e9fc4" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + +is-number-like@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + dependencies: + lodash.isfinite "^3.3.2" + +is-number-object@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-plain-object@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-regex@^1.0.3, is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-string@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jasmine-core@^2.8.0, jasmine-core@~2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" + +jasmine-reporters@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.2.1.tgz#de9a9201367846269e7ca8adff5b44221671fcbd" + dependencies: + mkdirp "^0.5.1" + xmldom "^0.1.22" + +jasmine-terminal-reporter@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/jasmine-terminal-reporter/-/jasmine-terminal-reporter-1.0.3.tgz#896f1ec8fdf4bf6aecdd41c503eda7347f61526b" + dependencies: + indent-string "^2.1.0" + pluralize "^1.2.1" + +jasmine@^2.3.0, jasmine@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" + dependencies: + exit "^0.1.2" + glob "^7.0.6" + jasmine-core "~2.8.0" + +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.3.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.4.3: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-debug-legacy@0.0.X: + version "0.0.1" + resolved "https://registry.yarnpkg.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz#537716c0776e4cf79e3ed1b621f7658c2911b1b1" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +liftoff@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +limiter@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.2.tgz#229d8055891c8b11af9e0ee5200e8e09bb3dcbeb" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +localtunnel@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.3.tgz#dcc5922fd85651037d4bde24fd93248d0b24eb05" + dependencies: + debug "2.6.8" + openurl "1.1.1" + request "2.81.0" + yargs "3.29.0" + +lodash-es@^4.2.0, lodash-es@^4.2.1: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isfinite@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.mergewith@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + dependencies: + lodash.keys "~2.4.1" + +lodash@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@~4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +magic-string@^0.22.4: + version "0.22.4" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff" + dependencies: + vlq "^0.2.1" + +make-error-cause@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + dependencies: + make-error "^1.2.0" + +make-error@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +meow@^3.3.0, meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +micromatch@2.3.11, micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.16, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mime@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" + +mime@1.3.4, "mime@>= 0.0.1": + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mini-deep-assign@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mini-deep-assign/-/mini-deep-assign-0.0.8.tgz#14fa4cad93d47cfbb4392796a8b0015e7f60cbcd" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" + +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +module-parent@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/module-parent/-/module-parent-0.0.2.tgz#be1cbb3cb6a55060fc86467d2f2d2cd0a600e199" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" + +ms@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-1.0.0.tgz#59adcd22edc543f7b5381862d31387b1f4bc9473" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multipipe@^0.1.0, multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +nan@^2.3.0, nan@^2.3.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-gyp@^3.3.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "2" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-sass@^4.2.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.6.1.tgz#9b331cf943ee5440f199e858941a90d13bc9bfc5" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.3.2" + node-gyp "^3.3.1" + npmlog "^4.0.0" + request "^2.79.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + +"nopt@2 || 3", nopt@3.0.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-path@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.entries@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parsejson@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path@^0.12.7: + version "0.12.7" + resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + dependencies: + process "^0.11.1" + util "^0.10.3" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +portscanner@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" + dependencies: + async "1.5.2" + is-number-like "^1.0.3" + +postcss-load-config@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + postcss-load-options "^1.2.0" + postcss-load-plugins "^2.3.0" + +postcss-load-options@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + +postcss-load-plugins@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" + dependencies: + cosmiconfig "^2.1.1" + object-assign "^4.1.0" + +postcss-value-parser@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss@^5.2.12: + version "5.2.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.13: + version "6.0.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885" + dependencies: + chalk "^2.3.0" + source-map "^0.6.1" + supports-color "^4.4.0" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +private@^0.1.6, private@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.1: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.5.10: + version "15.6.0" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" + +qs@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" + +"qs@>= 0.4.0", qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +ramda-fantasy@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/ramda-fantasy/-/ramda-fantasy-0.7.0.tgz#ac77a7a5d55dfc1ddc224ac418e9be8900c65d17" + dependencies: + ramda ">=0.15.0" + +ramda-fantasy@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/ramda-fantasy/-/ramda-fantasy-0.8.0.tgz#9e8c37d93ec0a70796cfc10873dd9c50850390f6" + dependencies: + ramda ">=0.15.0" + +ramda@0.x, ramda@>=0.15.0, ramda@^0.22.1: + version "0.22.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.22.1.tgz#031da0c3df417c5b33c96234757eb37033f36a0e" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +rc@^1.1.7: + version "1.2.2" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@<16.0.0: + version "15.6.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.1.0" + object-assign "^4.1.0" + prop-types "^15.5.10" + +react-redux@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.6.tgz#23ed3a4f986359d68b5212eaaa681e60d6574946" + dependencies: + hoist-non-react-statics "^2.2.1" + invariant "^2.0.0" + lodash "^4.2.0" + lodash-es "^4.2.0" + loose-envify "^1.1.0" + prop-types "^15.5.10" + +react-test-renderer@<16.0.0: + version "15.6.2" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.2.tgz#d0333434fc2c438092696ca770da5ed48037efa8" + dependencies: + fbjs "^0.8.9" + object-assign "^4.1.0" + +react@<16.0.0: + version "15.6.2" + resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72" + dependencies: + create-react-class "^15.6.0" + fbjs "^0.8.9" + loose-envify "^1.1.0" + object-assign "^4.1.0" + prop-types "^15.5.10" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17, readable-stream@~1.0.26: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redux@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" + dependencies: + lodash "^4.2.1" + lodash-es "^4.2.1" + loose-envify "^1.1.0" + symbol-observable "^1.0.3" + +regenerate@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +request@2, request@2.81.0, request@^2.79.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-dir-all@^0.4.9: + version "0.4.12" + resolved "https://registry.yarnpkg.com/require-dir-all/-/require-dir-all-0.4.12.tgz#ec7c7215a76e92207920c971f15477699eaf63a7" + dependencies: + mini-deep-assign "0.0.8" + module-parent "0.0.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-url@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rollup-plugin-babel@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.2.tgz#a2765dea0eaa8aece351c983573300d17497495b" + dependencies: + rollup-pluginutils "^1.5.0" + +rollup-plugin-commonjs@^8.2.1: + version "8.2.6" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.6.tgz#27e5b9069ff94005bb01e01bb46a1e4873784677" + dependencies: + acorn "^5.2.1" + estree-walker "^0.5.0" + magic-string "^0.22.4" + resolve "^1.4.0" + rollup-pluginutils "^2.0.1" + +rollup-plugin-node-resolve@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz#8b897c4c3030d5001277b0514b25d2ca09683ee0" + dependencies: + browser-resolve "^1.11.0" + builtin-modules "^1.1.0" + is-module "^1.0.0" + resolve "^1.1.6" + +rollup-plugin-replace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.0.0.tgz#19074089c8ed57184b8cc64e967a03d095119277" + dependencies: + magic-string "^0.22.4" + minimatch "^3.0.2" + rollup-pluginutils "^2.0.1" + +rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + +rollup-pluginutils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" + dependencies: + estree-walker "^0.3.0" + micromatch "^2.3.11" + +rollup-stream@<1.24.0: + version "1.23.1" + resolved "https://registry.yarnpkg.com/rollup-stream/-/rollup-stream-1.23.1.tgz#084b489cc4f8d780a27c187a53cef6598171f102" + dependencies: + rollup "^0.45.1" + +rollup@0.50.0: + version "0.50.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.50.0.tgz#4c158f4e780e6cb33ff0dbfc184a52cc58cd5f3b" + +rollup@^0.45.1: + version "0.45.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.45.2.tgz#63a284c2b31234656f24e9e9717fabb6a7f0fa43" + dependencies: + source-map-support "^0.4.0" + +rx@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +seamless-immutable@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.2.tgz#c87a1eba6767a32455311d76600ac5eddeafbb69" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.2.tgz#f91fab4403bcf87e716f70ceb5db2f578bdc17d6" + dependencies: + debug "2.6.4" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "1.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +serve-index@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b" + dependencies: + accepts "~1.3.3" + batch "0.5.3" + debug "~2.2.0" + escape-html "~1.0.3" + http-errors "~1.5.0" + mime-types "~2.1.11" + parseurl "~1.3.1" + +serve-static@1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.2.tgz#e546e2726081b81b4bcec8e90808ebcdd323afba" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.2" + +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +socket.io-adapter@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + +socket.io-client@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "2.3.3" + engine.io-client "1.8.0" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.5" + socket.io-parser "2.3.1" + to-array "0.1.4" + +socket.io-parser@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" + dependencies: + debug "2.3.3" + engine.io "1.8.0" + has-binary "0.1.7" + object-assign "4.1.0" + socket.io-adapter "0.5.0" + socket.io-client "1.6.0" + socket.io-parser "2.3.1" + +source-map-resolve@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761" + dependencies: + atob "~1.1.0" + resolve-url "~0.2.1" + source-map-url "~0.3.0" + urix "~0.1.0" + +source-map-support@^0.4.0, source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-url@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + +source-map@0.X, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +"statuses@>= 1.3.1 < 2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +statuses@~1.3.0, statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + +stream-consume@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@2.X, strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^4.0.0, supports-color@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +symbol-observable@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" + +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.0.0, tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tfunk@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b" + dependencies: + chalk "^1.1.1" + object-path "^0.9.0" + +through2@2.X, through2@^2.0.0, through2@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through2@^0.6.1, through2@~0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + +tough-cookie@~2.3.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +ua-parser-js@0.7.12, ua-parser-js@^0.7.9: + version "0.7.12" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" + +uglify-js@~2.8.10: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-save-license@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +underscore@1.7.x: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +urix@^0.1.0, urix@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vinyl-buffer/-/vinyl-buffer-1.0.0.tgz#ca067ea08431d507722b1de5083f602616ebc234" + dependencies: + bl "^0.9.1" + through2 "^0.6.1" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-source-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz#44cbe5108205279deb0c5653c094a2887938b1ab" + dependencies: + through2 "^0.6.1" + vinyl "^0.4.3" + +vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@1.X: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" + dependencies: + clone-stats "~0.0.1" + +vinyl@^0.4.0, vinyl@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vlq@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + +weinre@^2.0.0-pre-I0Z7U9OV: + version "2.0.0-pre-I0Z7U9OV" + resolved "https://registry.yarnpkg.com/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz#fef8aa223921f7b40bbbbd4c3ed4302f6fd0a813" + dependencies: + express "2.5.x" + nopt "3.0.x" + underscore "1.7.x" + +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@1, which@^1.2.12, which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +window-size@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + +within-element@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/within-element/-/within-element-0.1.0.tgz#b610be314fb588bf21d7bd733906e437f30e2b95" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +ws@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + +x-div@^1.0.44: + version "1.1.1" + resolved "https://registry.yarnpkg.com/x-div/-/x-div-1.1.1.tgz#8b067cfd763bc5f711e82be80887a960a761a85e" + dependencies: + fl-assert "^1.0.0" + +xmldom@^0.1.22: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + +xmlhttprequest-ssl@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + +"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +y18n@^3.2.0, y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs@3.29.0: + version "3.29.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c" + dependencies: + camelcase "^1.2.1" + cliui "^3.0.3" + decamelize "^1.0.0" + os-locale "^1.4.0" + window-size "^0.1.2" + y18n "^3.2.0" + +yargs@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^4.1.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"