

Nextrek
@ 1348
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "uid": "1BEF7399KDF43A4E3ASA1A1E6EA70E833770", "isLoaded": true, "lastModificationTime": 1428415344176, "items": { "name": "VariableStore", "type": "game_script", "order": 6, "content": "# ===================================================================\n#\n# Script: VariableStore\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass VariableStore\n @objectCodecBlackList = [\"persistentNumbers\", \"persistentStrings\", \"persistentBooleans\", \"persistentLists\"]\n \n ###*\n * <p>A storage for different kind of game variables. The following scopes\n * for variables exist:</p>\n * \n * - Local Variables -> Only valid for the current scene.\n * - Global Variables -> Valid for the whole game but bound to a single save-game.\n * - Persistent Variables -> Valid for the whole game indepentent from the save-games.\n * \n * <p>The following data-types exist:</p>\n * - Strings -> Variables storing text data.\n * - Numbers -> Variables storing integer number values.\n * - Booleans -> Variables storing boolean values. (Called \"Switches\" for easier understanding)\n * - Lists -> Variables storing multiple other variables. Lists can also contain Lists.\n * <p>\n * Local variables are stored by scene UID. For each scene UID a list of local variables is stored.</p>\n * \n * <p>Global and persistent variables are stored and a specific domain. A domain is just a unique name such\n * as <i>com.example.game</i> for example. The default domain is an empty string. Domains are useful to avoid\n * overlapping of variable numbers when sharing content with other users. </p>\n *\n * @module gs\n * @class VariableStore\n * @memberof gs\n * @constructor\n ###\n constructor: () ->\n ###*\n * Current local variable context\n * @property context\n * @type Object\n ###\n @context = null\n \n ###*\n * Current domain for global and persistent variables. Each domain has its own\n * variables. Please use <b>changeDomain</b> method to change the domain.\n * @property domain\n * @type Object\n * @readOnly\n ###\n @domain = \"\"\n \n ###*\n * List of available domains for global and persistent variables.\n * @property domains\n * @type string[]\n ###\n @domains = [\"\"]\n \n ###*\n * The global number variables of the current domain.\n * @property numbers\n * @type number[]\n ###\n @numbers = null\n ###*\n * The global boolean variables of the current domain.\n * @property booleans\n * @type boolean[]\n ###\n @booleans = null\n ###*\n * The global string variables of the current domain.\n * @property strings\n * @type string[]\n ###\n @strings = null\n ###*\n * The global list variables of the current domain.\n * @property lists\n * @type Object[][]\n ###\n @lists = null\n \n ###*\n * The storage of all global variables by domain.\n * @property globalVariablesByDomain\n * @type Object[][]\n ###\n @globalVariablesByDomain = {}\n \n ###*\n * The storage of all persistent variables by domain.\n * @property persistentVariablesByDomain\n * @type Object[][]\n ###\n @persistentVariablesByDomain = {}\n \n ###*\n * The persistent number variables of the current domain.\n * @property persistentNumbers\n * @type number[]\n ###\n @persistentNumbers = []\n ###*\n * The persistent string variables of the current domain.\n * @property persistentStrings\n * @type string[]\n ###\n @persistentStrings = []\n ###*\n * The persistent boolean variables of the current domain.\n * @property persistentBooleans\n * @type boolean[]\n ###\n @persistentBooleans = []\n ###*\n * The persistent list variables of the current domain.\n * @property persistentLists\n * @type Object[][]\n ###\n @persistentLists = []\n ###*\n * The local number variables.\n * @property localNumbers\n * @type Object\n ###\n @localNumbers = {}\n ###*\n * The local string variables.\n * @property localStrings\n * @type Object\n ###\n @localStrings = {}\n ###*\n * The local boolean variables.\n * @property localBooleans\n * @type Object\n ###\n @localBooleans = {}\n ###*\n * The local list variables.\n * @property localLists\n * @type Object\n ###\n @localLists = {}\n ###*\n * @property tempNumbers\n * @type number[]\n ###\n @tempNumbers = null\n ###*\n * @property tempStrings\n * @type string[]\n ###\n @tempStrings = null\n ###*\n * @property localBooleans\n * @type number[]\n ###\n @tempBooleans = null\n ###*\n * @property localLists\n * @type Object[][]\n ###\n @tempLists = null\n \n ###*\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n ###\n onDataBundleRestore: (data, context) ->\n domains = DataManager.getDocumentsByType(\"global_variables\").select (d) -> d.items.domain\n \n for domain, i in domains\n @numbersByDomain[domain] = @numbersByDomain[i]\n @stringsByDomain[domain] = @stringsByDomain[i]\n @booleansByDomain[domain] = @booleansByDomain[i]\n @listsByDomain[domain] = @listsByDomain[i]\n \n return null\n \n setupGlobalDomains: () ->\n @numbersByDomain = []\n @stringsByDomain = []\n @booleansByDomain = []\n @listsByDomain = []\n \n for domain, i in @domains\n @numbersByDomain[i] = new Array(1000)\n @numbersByDomain[domain] = @numbersByDomain[i]\n @stringsByDomain[i] = new Array(1000)\n @stringsByDomain[domain] = @stringsByDomain[i]\n @booleansByDomain[i] = new Array(1000)\n @booleansByDomain[domain] = @booleansByDomain[i]\n @listsByDomain[i] = new Array(1000)\n @listsByDomain[domain] = @listsByDomain[i]\n \n @numbers = @numbersByDomain[0]\n @strings = @stringsByDomain[0]\n @booleans = @booleansByDomain[0]\n @lists = @numbersByDomain[0]\n \n setupPersistentDomains: (domains) ->\n @persistentNumbersByDomain = {}\n @persistentStringsByDomain = {}\n @persistentBooleansByDomain = {}\n @persistentListsByDomain = {}\n \n for domain, i in @domains\n @persistentNumbersByDomain[i] = new Array(10)\n @persistentNumbersByDomain[domain] = @persistentNumbers[i]\n @persistentStringsByDomain[i] = new Array(10)\n @persistentStringsByDomain[domain] = @persistentStrings[i]\n @persistentBooleansByDomain[i] = new Array(10)\n @persistentBooleansByDomain[domain] = @persistentBooleans[i]\n @persistentListsByDomain[i] = new Array(10)\n @persistentListsByDomain[domain] = @persistentLists[i]\n \n @persistentNumbers = @persistentNumbersByDomain[0]\n @persistentStrings = @persistentStringsByDomain[0]\n @persistentBooleans = @persistentBooleansByDomain[0]\n @persistentLists = @persistentListsByDomain[0]\n \n setupDomains: (domains) ->\n @domains = domains\n @setupGlobalDomains()\n @setupPersistentDomains()\n \n \n ###*\n * Changes the current domain.\n *\n * @deprecated\n * @method changeDomain\n * @param {string} domain - The domain to change to.\n ### \n changeDomain: (domain) ->\n @domain = domain\n globalVariables = @globalVariablesByDomain[domain]\n persistentVariables = @persistentVariablesByDomain[domain]\n \n if !globalVariables\n globalVariables = @globalVariablesByDomain[domain] = { numbers: new Array(500), strings: new Array(500), booleans: new Array(500), lists: new Array(500) }\n if !persistentVariables\n persistentVariables = @persistentVariablesByDomain[domain] = { numbers: new Array(500), strings: new Array(500), booleans: new Array(500), lists: new Array(500) } \n \n @numbers = globalVariables.numbers\n @strings = globalVariables.strings\n @booleans = globalVariables.booleans\n @lists = globalVariables.lists\n @persistentNumbers = persistentVariables.numbers\n @persistentBooleans = persistentVariables.booleans\n @persistentStrings = persistentVariables.strings\n @persistentLists = persistentVariables.lists\n \n ###*\n * Clears all global variables\n *\n * @method clearGlobalVariables\n ### \n clearAllGlobalVariables: ->\n @setupGlobalDomains()\n return\n \n globalVariables = @globalVariablesByDomain[@domain]\n @numbersByDomain = new Array(1000)\n globalVariables.booleans = new Array(1000)\n globalVariables.strings = new Array(1000)\n \n @numbers = globalVariables.numbers\n @strings = globalVariables.strings\n @booleans = globalVariables.booleans\n \n ###*\n * Clears all local variables for all contexts/scenes/common-events.\n *\n * @method clearAllLocalVariables\n ### \n clearAllLocalVariables: ->\n @localNumbers = {}\n @localStrings = {}\n @localBooleans = {}\n @localLists = {}\n \n ###*\n * Clears specified variables.\n *\n * @method clearVariables\n * @param {number[]} numbers - The number variables to clear.\n * @param {string[]} strings - The string variables to clear.\n * @param {boolean[]} booleans - The boolean variables to clear.\n * @param {Array[]} lists - The list variables to clear.\n * @param {number} type - Determines what kind of variables should be cleared.\n * <ul>\n * <li>0 = All</li>\n * <li>1 = Switches / Booleans</li>\n * <li>2 = Numbers</li>\n * <li>3 = Texts</li>\n * <li>4 = Lists</li>\n * </ul>\n * @param {Object} range - The variable id-range to clear. If <b>null</b> all specified variables are cleared.\n ### \n clearVariables: (numbers, strings, booleans, lists, type, range) ->\n switch type\n when 0 # All\n numbers?.fill(0, range.start, range.end)\n strings?.fill(\"\", range.start, range.end)\n booleans?.fill(false, range.start, range.end)\n lists?.fill([], range.start, range.end)\n when 1 # Switch\n booleans?.fill(false, range.start, range.end)\n when 2 # Number\n numbers?.fill(0, range.start, range.end)\n when 3 # Text\n strings?.fill(\"\", range.start, range.end)\n when 4 # List\n lists?.fill([], range.start, range.end)\n \n ###*\n * Clears all local variables for a specified context. If the context is not specified, all\n * local variables for all contexts/scenes/common-events are cleared.\n *\n * @method clearLocalVariables\n * @param {Object} context - The context to clear the local variables for. If <b>null</b>, all\n * @param {number} type - Determines what kind of variables should be cleared.\n * <ul>\n * <li>0 = All</li>\n * <li>1 = Switches / Booleans</li>\n * <li>2 = Numbers</li>\n * <li>3 = Texts</li>\n * <li>4 = Lists</li>\n * </ul>\n * @param {Object} range - The variable id-range to clear. If <b>null</b> all variables are cleared.\n ### \n clearLocalVariables: (context, type, range) ->\n if context?\n ids = [context.id]\n else\n ids = Object.keys(@localNumbers)\n \n if range?\n range = start: range.start, end: range.end + 1\n else\n range = start: 0, end: null\n \n for id in ids\n @clearVariables(@localNumbers[id], @localStrings[id], @localBooleans[id], @localLists[id], type, range)\n \n ###*\n * Clears global variables.\n *\n * @method clearGlobalVariables\n * @param {number} type - Determines what kind of variables should be cleared.\n * <ul>\n * <li>0 = All</li>\n * <li>1 = Switches / Booleans</li>\n * <li>2 = Numbers</li>\n * <li>3 = Texts</li>\n * <li>4 = Lists</li>\n * </ul>\n * @param {Object} range - The variable id-range to clear. If <b>null</b> all variables are cleared.\n ### \n clearGlobalVariables: (type, range) ->\n if range?\n range = start: range.start, end: range.end + 1\n else\n range = start: 0, end: null\n \n @clearVariables(@numbers, @strings, @booleans, @lists, type, range)\n \n ###*\n * Clears persistent variables.\n *\n * @method clearPersistentVariables\n * @param {number} type - Determines what kind of variables should be cleared.\n * <ul>\n * <li>0 = All</li>\n * <li>1 = Switches / Booleans</li>\n * <li>2 = Numbers</li>\n * <li>3 = Texts</li>\n * <li>4 = Lists</li>\n * </ul>\n * @param {Object} range - The variable id-range to clear. If <b>null</b> all variables are cleared.\n ### \n clearPersistentVariables: (type, range) ->\n if range?\n range = start: range.start, end: range.end + 1\n else\n range = start: 0, end: null\n \n @clearVariables(@persistentNumbers, @persistentstrings, @persistentBooleans, @persistentLists, type, range)\n \n ###*\n * Initializes the variables. Should be called whenever the context changes. (Like after a scene change)\n *\n * @method setup\n * @param {Object} context - The context(current scene) needed for local variables. Needs have at least an id-property.\n ### \n setup: (context) ->\n @setupLocalVariables(context)\n @setupTempVariables(context)\n \n \n ###*\n * Initializes the local variables for the specified context. Should be called on first time use.\n *\n * @method setupLocalVariables\n * @param {Object} context - The context(current scene). Needs have at least an id-property.\n ###\n setupLocalVariables: (context) ->\n @setupVariables(context, \"localNumbers\", 0)\n @setupVariables(context, \"localStrings\", \"\")\n @setupVariables(context, \"localBooleans\", no)\n @setupVariables(context, \"localLists\", [])\n \n ###*\n * Initializes the specified kind of variables.\n *\n * @method setupVariables \n * @param {Object} context - The context(current scene). Needs have at least an id-property.\n * @param {string} property - The kind of variables (property-name).\n * @param {Object} defaultValue - The default value for each variable.\n ### \n setupVariables: (context, property, defaultValue) ->\n if not this[property][context.id]?\n this[property][context.id] = []\n \n \n ###*\n * Initializes the current temp variables for the specified context. Should be called whenever the context changed.\n *\n * @method setupTempVariables\n * @param {Object} context - The context(current scene). Needs have at least an id-property.\n ### \n setupTempVariables: (context) ->\n @context = context\n if !@localNumbers[context.id]\n @setupLocalVariables(context)\n \n @tempNumbers = @localNumbers[context.id]\n @tempStrings = @localStrings[context.id]\n @tempBooleans = @localBooleans[context.id]\n @tempLists = @localLists[context.id]\n \n clearTempVariables: (context) ->\n \n \n ###*\n * Gets the index for the variable with the specified name. If a variable with that\n * name cannot be found, the index will be 0.\n *\n * @method indexOfTempVariable\n * @param {string} name - The name of the variable to get the index for.\n * @param {string} type - The type name: number, string, boolean or list.\n * @param {number} scope - The variable scope: 0 = local, 1 = global, 2 = persistent.\n * @param {string} domain - The variable domain to search in. If not specified, the default domain will be used.\n ### \n indexOfVariable: (name, type, scope, domain) ->\n result = 0\n \n switch scope\n when 0 # Local\n result = @indexOfTempVariable(name, type)\n when 1 # Global\n result = @indexOfGlobalVariable(name, type, domain)\n when 2 # Persistent\n result = @indexOfPersistentVariable(name, type, domain)\n \n return result\n \n ###*\n * Gets the index for the local variable with the specified name. If a variable with that\n * name cannot be found, the index will be 0.\n *\n * @method indexOfTempVariable\n * @param {string} name - The name of the variable to get the index for.\n * @param {string} type - The type name: number, string, boolean or list.\n ### \n indexOfTempVariable: (name, type) ->\n result = 0\n \n if @context?.owner\n if @context.owner.sceneDocument\n variable = @context.owner.sceneDocument.items[type + \"Variables\"].first (v) -> v.name == name\n result = variable.index if variable?\n else if @context.owner[type + \"Variables\"]\n variable = @context.owner[type + \"Variables\"].first (v) -> v.name == name\n \n if variable?\n result = variable.index\n else\n console.warn(\"Variable referenced by name not found: \" + name +\"(local, \"+type+\")\")\n \n return result\n \n ###*\n * Gets the index for the global variable with the specified name. If a variable with that\n * name cannot be found, the index will be 0.\n *\n * @method indexOfTempVariable\n * @param {string} name - The name of the variable to get the index for.\n * @param {string} type - The type name: number, string, boolean or list.\n * @param {string} domain - The variable domain to search in. If not specified, the default domain will be used.\n ### \n indexOfGlobalVariable: (name, type, domain) ->\n result = 0\n variables = DataManager.getDocumentsByType(\"global_variables\")\n variablesDocument = variables.first (v) -> v.items.domain == domain\n variablesDocument ?= variables[0]\n \n if variablesDocument\n variable = variablesDocument.items[type + \"s\"].first (v) -> v.name == name\n if variable\n result = variable.index \n else\n console.warn(\"Variable referenced by name not found: #{name} (persistent, #{type})\")\n \n return result\n \n ###*\n * Gets the index for the persistent variable with the specified name. If a variable with that\n * name cannot be found, the index will be 0.\n *\n * @method indexOfTempVariable\n * @param {string} name - The name of the variable to get the index for.\n * @param {string} type - The type name: number, string, boolean or list.\n * @param {string} domain - The variable domain to search in. If not specified, the default domain will be used.\n ### \n indexOfPersistentVariable: (name, type, domain) ->\n result = 0\n variables = DataManager.getDocumentsByType(\"persistent_variables\")\n variablesDocument = variables.first (v) -> v.items.domain == domain\n variablesDocument ?= variables[0]\n \n if variablesDocument\n variable = variablesDocument.items[type + \"s\"].first (v) -> v.name == name\n if variable?\n result = variable.index \n else\n console.warn(\"Variable referenced by name not found: #{name} (persistent, #{type})\")\n \n return result \n \n ###*\n * Sets the value of the number variable at the specified index.\n *\n * @method setNumberValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} type - The variable's index.\n * @param {number} value - The value to set.\n ### \n setNumberValueAtIndex: (scope, index, value, domain) ->\n if scope == 2\n @persistentNumbersByDomain[domain][index] = value\n else if scope == 1\n @numbersByDomain[domain||0][index] = value\n else\n @tempNumbers[index] = value\n\n ###*\n * Sets the value of a specified number variable.\n *\n * @method setNumberValueAtIndex\n * @param {number} variable - The variable to set. \n * @param {number} value - The value to set.\n ### \n setNumberValueTo: (variable, value) ->\n if variable.scope == 2\n @persistentNumbersByDomain[variable.domain||0][variable.index] = value\n else if variable.scope == 1\n @numbersByDomain[variable.domain||0][variable.index] = value\n else\n @tempNumbers[variable.index] = value\n\n ###*\n * Sets the value of a specified list variable.\n *\n * @method setListObjectTo\n * @param {Object} variable - The variable to set. \n * @param {Object} value - The value to set.\n ### \n setListObjectTo: (variable, value) ->\n if variable.scope == 2\n @persistentListsByDomain[variable.domain||0][variable.index] = value\n else if variable.scope == 1\n @listsByDomain[variable.domain||0][variable.index] = value\n else\n @tempLists[variable.index] = value\n\n \n ###*\n * Sets the value of a specified boolean variable.\n *\n * @method setBooleanValueTo\n * @param {Object} variable - The variable to set. \n * @param {boolean} value - The value to set.\n ### \n setBooleanValueTo: (variable, value) ->\n if variable.scope == 2\n @persistentBooleansByDomain[variable.domain][variable.index] = value\n else if variable.scope == 1\n @booleansByDomain[variable.domain][variable.index] = value\n else\n @tempBooleans[variable.index] = value\n \n ###*\n * Sets the value of the boolean variable at the specified index.\n *\n * @method setBooleanValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @param {boolean} value - The value to set.\n ### \n setBooleanValueAtIndex: (scope, index, value, domain) ->\n if scope == 2\n @persistentBooleansByDomain[domain][index] = value\n else if scope == 1\n @booleansByDomain[domain][index] = value\n else\n @tempBooleans[index] = value\n\n ###*\n * Sets the value of a specified string variable.\n *\n * @method setStringValueTo\n * @param {Object} variable - The variable to set. \n * @param {string} value - The value to set.\n ### \n setStringValueTo: (variable, value) ->\n if variable.scope == 2\n @persistentStringsByDomain[variable.domain][variable.index] = value\n else if variable.scope == 1\n @stringsByDomain[variable.domain][variable.index] = value\n else\n @tempStrings[variable.index] = value\n \n ###*\n * Sets the value of the string variable at the specified index.\n *\n * @method setStringValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @param {string} value - The value to set.\n ### \n setStringValueAtIndex: (scope, index, value, domain) ->\n if scope == 2\n @persistentStringsByDomain[domain][index] = value\n else if scope == 1\n @stringsByDomain[domain][index] = value\n else\n @tempStrings[index] = value\n\n ###*\n * Gets the value of a specified list variable.\n *\n * @method listObjectOf\n * @param {Object} object - The list-variable/object to get the value from.\n * @return {Object} The list-object.\n ### \n listObjectOf: (object) ->\n result = 0\n if object? and object.index?\n if object.scope == 2\n result = @persistentListsByDomain[object.domain][object.index]\n else if object.scope == 1\n result = @listsByDomain[object.domain][object.index]\n else\n result = @tempLists[object.index]\n else\n result = object\n \n return result || []\n \n ###*\n * Gets the value of a number variable at the specified index.\n *\n * @method numberValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @return {Object} The number value of the variable.\n ### \n numberValueAtIndex: (scope, index, domain) ->\n result = 0\n \n if scope == 2\n result = @persistentNumbersByDomain[domain][index]\n else if scope == 1\n result = @numbersByDomain[domain][index]\n else\n result = @tempNumbers[index]\n\n return result\n \n ###*\n * Gets the value of a specified number variable.\n *\n * @method numberValueOf\n * @param {Object} object - The variable to get the value from.\n * @return {Object} The number value of the variable.\n ### \n numberValueOf: (object) ->\n result = 0\n if object? and object.index?\n if object.scope == 2\n result = @persistentNumbersByDomain[object.domain][object.index]\n else if object.scope == 1\n result = @numbersByDomain[object.domain][object.index]\n else\n result = @tempNumbers[object.index]\n\n else\n result = object\n \n return result || 0\n \n ###*\n * Gets the value of a specified string variable.\n *\n * @method stringValueOf\n * @param {Object} object - The variable to get the value from.\n * @return {string} The string value of the variable.\n ### \n stringValueOf: (object) ->\n result = \"\"\n if object? and object.index?\n if object.scope == 2\n result = @persistentStringsByDomain[object.domain][object.index]\n else if object.scope == 1\n result = @stringsByDomain[object.domain][object.index]\n else\n result = @tempStrings[object.index]\n else\n result = object\n \n return result || \"\"\n \n ###*\n * Gets the value of a string variable at the specified index.\n *\n * @method stringValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @return {string} The string value of the variable.\n ### \n stringValueAtIndex: (scope, index, domain) ->\n result = \"\"\n \n if scope == 2\n result = @persistentStringsByDomain[domain][index]\n else if scope == 1\n result = @stringsByDomain[domain][index]\n else\n result = @tempStrings[index]\n\n return result || \"\"\n \n ###*\n * Gets the value of a specified boolean variable.\n *\n * @method booleanValueOf\n * @param {Object} object - The variable to get the value from.\n * @return {Object} The boolean value of the variable.\n ### \n booleanValueOf: (object) ->\n result = no\n if object? and object.index?\n if object.scope == 2\n result = @persistentBooleansByDomain[object.domain][object.index] || no\n else if object.scope == 1\n result = @booleansByDomain[object.domain][object.index] || no\n else\n result = @tempBooleans[object.index] || no\n\n else\n result = if object then true else false\n \n return result\n \n ###*\n * Gets the value of a boolean variable at the specified index.\n *\n * @method booleanValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @return {boolean} The boolean value of the variable.\n ### \n booleanValueAtIndex: (scope, index, domain) ->\n result = no\n \n if scope == 2\n result = @persistenBooleansByDomain[domain][index] || no\n else if scope == 1\n result = @booleansByDomain[domain][index] || no\n else\n result = @tempBooleans[index] || no\n\n return result\n \ngs.VariableStore = VariableStore", "compiledContent": "var VariableStore;\n\nVariableStore = (function() {\n VariableStore.objectCodecBlackList = [\"persistentNumbers\", \"persistentStrings\", \"persistentBooleans\", \"persistentLists\"];\n\n\n /**\n * <p>A storage for different kind of game variables. The following scopes\n * for variables exist:</p>\n * \n * - Local Variables -> Only valid for the current scene.\n * - Global Variables -> Valid for the whole game but bound to a single save-game.\n * - Persistent Variables -> Valid for the whole game indepentent from the save-games.\n * \n * <p>The following data-types exist:</p>\n * - Strings -> Variables storing text data.\n * - Numbers -> Variables storing integer number values.\n * - Booleans -> Variables storing boolean values. (Called \"Switches\" for easier understanding)\n * - Lists -> Variables storing multiple other variables. Lists can also contain Lists.\n * <p>\n * Local variables are stored by scene UID. For each scene UID a list of local variables is stored.</p>\n * \n * <p>Global and persistent variables are stored and a specific domain. A domain is just a unique name such\n * as <i>com.example.game</i> for example. The default domain is an empty string. Domains are useful to avoid\n * overlapping of variable numbers when sharing content with other users. </p>\n *\n * @module gs\n * @class VariableStore\n * @memberof gs\n * @constructor\n */\n\n function VariableStore() {\n\n /**\n * Current local variable context\n * @property context\n * @type Object\n */\n this.context = null;\n\n /**\n * Current domain for global and persistent variables. Each domain has its own\n * variables. Please use <b>changeDomain</b> method to change the domain.\n * @property domain\n * @type Object\n * @readOnly\n */\n this.domain = \"\";\n\n /**\n * List of available domains for global and persistent variables.\n * @property domains\n * @type string[]\n */\n this.domains = [\"\"];\n\n /**\n * The global number variables of the current domain.\n * @property numbers\n * @type number[]\n */\n this.numbers = null;\n\n /**\n * The global boolean variables of the current domain.\n * @property booleans\n * @type boolean[]\n */\n this.booleans = null;\n\n /**\n * The global string variables of the current domain.\n * @property strings\n * @type string[]\n */\n this.strings = null;\n\n /**\n * The global list variables of the current domain.\n * @property lists\n * @type Object[][]\n */\n this.lists = null;\n\n /**\n * The storage of all global variables by domain.\n * @property globalVariablesByDomain\n * @type Object[][]\n */\n this.globalVariablesByDomain = {};\n\n /**\n * The storage of all persistent variables by domain.\n * @property persistentVariablesByDomain\n * @type Object[][]\n */\n this.persistentVariablesByDomain = {};\n\n /**\n * The persistent number variables of the current domain.\n * @property persistentNumbers\n * @type number[]\n */\n this.persistentNumbers = [];\n\n /**\n * The persistent string variables of the current domain.\n * @property persistentStrings\n * @type string[]\n */\n this.persistentStrings = [];\n\n /**\n * The persistent boolean variables of the current domain.\n * @property persistentBooleans\n * @type boolean[]\n */\n this.persistentBooleans = [];\n\n /**\n * The persistent list variables of the current domain.\n * @property persistentLists\n * @type Object[][]\n */\n this.persistentLists = [];\n\n /**\n * The local number variables.\n * @property localNumbers\n * @type Object\n */\n this.localNumbers = {};\n\n /**\n * The local string variables.\n * @property localStrings\n * @type Object\n */\n this.localStrings = {};\n\n /**\n * The local boolean variables.\n * @property localBooleans\n * @type Object\n */\n this.localBooleans = {};\n\n /**\n * The local list variables.\n * @property localLists\n * @type Object\n */\n this.localLists = {};\n\n /**\n * @property tempNumbers\n * @type number[]\n */\n this.tempNumbers = null;\n\n /**\n * @property tempStrings\n * @type string[]\n */\n this.tempStrings = null;\n\n /**\n * @property localBooleans\n * @type number[]\n */\n this.tempBooleans = null;\n\n /**\n * @property localLists\n * @type Object[][]\n */\n this.tempLists = null;\n }\n\n\n /**\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n */\n\n VariableStore.prototype.onDataBundleRestore = function(data, context) {\n var domain, domains, i, j, len;\n domains = DataManager.getDocumentsByType(\"global_variables\").select(function(d) {\n return d.items.domain;\n });\n for (i = j = 0, len = domains.length; j < len; i = ++j) {\n domain = domains[i];\n this.numbersByDomain[domain] = this.numbersByDomain[i];\n this.stringsByDomain[domain] = this.stringsByDomain[i];\n this.booleansByDomain[domain] = this.booleansByDomain[i];\n this.listsByDomain[domain] = this.listsByDomain[i];\n }\n return null;\n };\n\n VariableStore.prototype.setupGlobalDomains = function() {\n var domain, i, j, len, ref;\n this.numbersByDomain = [];\n this.stringsByDomain = [];\n this.booleansByDomain = [];\n this.listsByDomain = [];\n ref = this.domains;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n domain = ref[i];\n this.numbersByDomain[i] = new Array(1000);\n this.numbersByDomain[domain] = this.numbersByDomain[i];\n this.stringsByDomain[i] = new Array(1000);\n this.stringsByDomain[domain] = this.stringsByDomain[i];\n this.booleansByDomain[i] = new Array(1000);\n this.booleansByDomain[domain] = this.booleansByDomain[i];\n this.listsByDomain[i] = new Array(1000);\n this.listsByDomain[domain] = this.listsByDomain[i];\n }\n this.numbers = this.numbersByDomain[0];\n this.strings = this.stringsByDomain[0];\n this.booleans = this.booleansByDomain[0];\n return this.lists = this.numbersByDomain[0];\n };\n\n VariableStore.prototype.setupPersistentDomains = function(domains) {\n var domain, i, j, len, ref;\n this.persistentNumbersByDomain = {};\n this.persistentStringsByDomain = {};\n this.persistentBooleansByDomain = {};\n this.persistentListsByDomain = {};\n ref = this.domains;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n domain = ref[i];\n this.persistentNumbersByDomain[i] = new Array(10);\n this.persistentNumbersByDomain[domain] = this.persistentNumbers[i];\n this.persistentStringsByDomain[i] = new Array(10);\n this.persistentStringsByDomain[domain] = this.persistentStrings[i];\n this.persistentBooleansByDomain[i] = new Array(10);\n this.persistentBooleansByDomain[domain] = this.persistentBooleans[i];\n this.persistentListsByDomain[i] = new Array(10);\n this.persistentListsByDomain[domain] = this.persistentLists[i];\n }\n this.persistentNumbers = this.persistentNumbersByDomain[0];\n this.persistentStrings = this.persistentStringsByDomain[0];\n this.persistentBooleans = this.persistentBooleansByDomain[0];\n return this.persistentLists = this.persistentListsByDomain[0];\n };\n\n VariableStore.prototype.setupDomains = function(domains) {\n this.domains = domains;\n this.setupGlobalDomains();\n return this.setupPersistentDomains();\n };\n\n\n /**\n * Changes the current domain.\n *\n * @deprecated\n * @method changeDomain\n * @param {string} domain - The domain to change to.\n */\n\n VariableStore.prototype.changeDomain = function(domain) {\n var globalVariables, persistentVariables;\n this.domain = domain;\n globalVariables = this.globalVariablesByDomain[domain];\n persistentVariables = this.persistentVariablesByDomain[domain];\n if (!globalVariables) {\n globalVariables = this.globalVariablesByDomain[domain] = {\n numbers: new Array(500),\n strings: new Array(500),\n booleans: new Array(500),\n lists: new Array(500)\n };\n }\n if (!persistentVariables) {\n persistentVariables = this.persistentVariablesByDomain[domain] = {\n numbers: new Array(500),\n strings: new Array(500),\n booleans: new Array(500),\n lists: new Array(500)\n };\n }\n this.numbers = globalVariables.numbers;\n this.strings = globalVariables.strings;\n this.booleans = globalVariables.booleans;\n this.lists = globalVariables.lists;\n this.persistentNumbers = persistentVariables.numbers;\n this.persistentBooleans = persistentVariables.booleans;\n this.persistentStrings = persistentVariables.strings;\n return this.persistentLists = persistentVariables.lists;\n };\n\n\n /**\n * Clears all global variables\n *\n * @method clearGlobalVariables\n */\n\n VariableStore.prototype.clearAllGlobalVariables = function() {\n var globalVariables;\n this.setupGlobalDomains();\n return;\n globalVariables = this.globalVariablesByDomain[this.domain];\n this.numbersByDomain = new Array(1000);\n globalVariables.booleans = new Array(1000);\n globalVariables.strings = new Array(1000);\n this.numbers = globalVariables.numbers;\n this.strings = globalVariables.strings;\n return this.booleans = globalVariables.booleans;\n };\n\n\n /**\n * Clears all local variables for all contexts/scenes/common-events.\n *\n * @method clearAllLocalVariables\n */\n\n VariableStore.prototype.clearAllLocalVariables = function() {\n this.localNumbers = {};\n this.localStrings = {};\n this.localBooleans = {};\n return this.localLists = {};\n };\n\n\n /**\n * Clears specified variables.\n *\n * @method clearVariables\n * @param {number[]} numbers - The number variables to clear.\n * @param {string[]} strings - The string variables to clear.\n * @param {boolean[]} booleans - The boolean variables to clear.\n * @param {Array[]} lists - The list variables to clear.\n * @param {number} type - Determines what kind of variables should be cleared.\n * <ul>\n * <li>0 = All</li>\n * <li>1 = Switches / Booleans</li>\n * <li>2 = Numbers</li>\n * <li>3 = Texts</li>\n * <li>4 = Lists</li>\n * </ul>\n * @param {Object} range - The variable id-range to clear. If <b>null</b> all specified variables are cleared.\n */\n\n VariableStore.prototype.clearVariables = function(numbers, strings, booleans, lists, type, range) {\n switch (type) {\n case 0:\n if (numbers != null) {\n numbers.fill(0, range.start, range.end);\n }\n if (strings != null) {\n strings.fill(\"\", range.start, range.end);\n }\n if (booleans != null) {\n booleans.fill(false, range.start, range.end);\n }\n return lists != null ? lists.fill([], range.start, range.end) : void 0;\n case 1:\n return booleans != null ? booleans.fill(false, range.start, range.end) : void 0;\n case 2:\n return numbers != null ? numbers.fill(0, range.start, range.end) : void 0;\n case 3:\n return strings != null ? strings.fill(\"\", range.start, range.end) : void 0;\n case 4:\n return lists != null ? lists.fill([], range.start, range.end) : void 0;\n }\n };\n\n\n /**\n * Clears all local variables for a specified context. If the context is not specified, all\n * local variables for all contexts/scenes/common-events are cleared.\n *\n * @method clearLocalVariables\n * @param {Object} context - The context to clear the local variables for. If <b>null</b>, all\n * @param {number} type - Determines what kind of variables should be cleared.\n * <ul>\n * <li>0 = All</li>\n * <li>1 = Switches / Booleans</li>\n * <li>2 = Numbers</li>\n * <li>3 = Texts</li>\n * <li>4 = Lists</li>\n * </ul>\n * @param {Object} range - The variable id-range to clear. If <b>null</b> all variables are cleared.\n */\n\n VariableStore.prototype.clearLocalVariables = function(context, type, range) {\n var id, ids, j, len, results;\n if (context != null) {\n ids = [context.id];\n } else {\n ids = Object.keys(this.localNumbers);\n }\n if (range != null) {\n range = {\n start: range.start,\n end: range.end + 1\n };\n } else {\n range = {\n start: 0,\n end: null\n };\n }\n results = [];\n for (j = 0, len = ids.length; j < len; j++) {\n id = ids[j];\n results.push(this.clearVariables(this.localNumbers[id], this.localStrings[id], this.localBooleans[id], this.localLists[id], type, range));\n }\n return results;\n };\n\n\n /**\n * Clears global variables.\n *\n * @method clearGlobalVariables\n * @param {number} type - Determines what kind of variables should be cleared.\n * <ul>\n * <li>0 = All</li>\n * <li>1 = Switches / Booleans</li>\n * <li>2 = Numbers</li>\n * <li>3 = Texts</li>\n * <li>4 = Lists</li>\n * </ul>\n * @param {Object} range - The variable id-range to clear. If <b>null</b> all variables are cleared.\n */\n\n VariableStore.prototype.clearGlobalVariables = function(type, range) {\n if (range != null) {\n range = {\n start: range.start,\n end: range.end + 1\n };\n } else {\n range = {\n start: 0,\n end: null\n };\n }\n return this.clearVariables(this.numbers, this.strings, this.booleans, this.lists, type, range);\n };\n\n\n /**\n * Clears persistent variables.\n *\n * @method clearPersistentVariables\n * @param {number} type - Determines what kind of variables should be cleared.\n * <ul>\n * <li>0 = All</li>\n * <li>1 = Switches / Booleans</li>\n * <li>2 = Numbers</li>\n * <li>3 = Texts</li>\n * <li>4 = Lists</li>\n * </ul>\n * @param {Object} range - The variable id-range to clear. If <b>null</b> all variables are cleared.\n */\n\n VariableStore.prototype.clearPersistentVariables = function(type, range) {\n if (range != null) {\n range = {\n start: range.start,\n end: range.end + 1\n };\n } else {\n range = {\n start: 0,\n end: null\n };\n }\n return this.clearVariables(this.persistentNumbers, this.persistentstrings, this.persistentBooleans, this.persistentLists, type, range);\n };\n\n\n /**\n * Initializes the variables. Should be called whenever the context changes. (Like after a scene change)\n *\n * @method setup\n * @param {Object} context - The context(current scene) needed for local variables. Needs have at least an id-property.\n */\n\n VariableStore.prototype.setup = function(context) {\n this.setupLocalVariables(context);\n return this.setupTempVariables(context);\n };\n\n\n /**\n * Initializes the local variables for the specified context. Should be called on first time use.\n *\n * @method setupLocalVariables\n * @param {Object} context - The context(current scene). Needs have at least an id-property.\n */\n\n VariableStore.prototype.setupLocalVariables = function(context) {\n this.setupVariables(context, \"localNumbers\", 0);\n this.setupVariables(context, \"localStrings\", \"\");\n this.setupVariables(context, \"localBooleans\", false);\n return this.setupVariables(context, \"localLists\", []);\n };\n\n\n /**\n * Initializes the specified kind of variables.\n *\n * @method setupVariables \n * @param {Object} context - The context(current scene). Needs have at least an id-property.\n * @param {string} property - The kind of variables (property-name).\n * @param {Object} defaultValue - The default value for each variable.\n */\n\n VariableStore.prototype.setupVariables = function(context, property, defaultValue) {\n if (this[property][context.id] == null) {\n return this[property][context.id] = [];\n }\n };\n\n\n /**\n * Initializes the current temp variables for the specified context. Should be called whenever the context changed.\n *\n * @method setupTempVariables\n * @param {Object} context - The context(current scene). Needs have at least an id-property.\n */\n\n VariableStore.prototype.setupTempVariables = function(context) {\n this.context = context;\n if (!this.localNumbers[context.id]) {\n this.setupLocalVariables(context);\n }\n this.tempNumbers = this.localNumbers[context.id];\n this.tempStrings = this.localStrings[context.id];\n this.tempBooleans = this.localBooleans[context.id];\n return this.tempLists = this.localLists[context.id];\n };\n\n VariableStore.prototype.clearTempVariables = function(context) {};\n\n\n /**\n * Gets the index for the variable with the specified name. If a variable with that\n * name cannot be found, the index will be 0.\n *\n * @method indexOfTempVariable\n * @param {string} name - The name of the variable to get the index for.\n * @param {string} type - The type name: number, string, boolean or list.\n * @param {number} scope - The variable scope: 0 = local, 1 = global, 2 = persistent.\n * @param {string} domain - The variable domain to search in. If not specified, the default domain will be used.\n */\n\n VariableStore.prototype.indexOfVariable = function(name, type, scope, domain) {\n var result;\n result = 0;\n switch (scope) {\n case 0:\n result = this.indexOfTempVariable(name, type);\n break;\n case 1:\n result = this.indexOfGlobalVariable(name, type, domain);\n break;\n case 2:\n result = this.indexOfPersistentVariable(name, type, domain);\n }\n return result;\n };\n\n\n /**\n * Gets the index for the local variable with the specified name. If a variable with that\n * name cannot be found, the index will be 0.\n *\n * @method indexOfTempVariable\n * @param {string} name - The name of the variable to get the index for.\n * @param {string} type - The type name: number, string, boolean or list.\n */\n\n VariableStore.prototype.indexOfTempVariable = function(name, type) {\n var ref, result, variable;\n result = 0;\n if ((ref = this.context) != null ? ref.owner : void 0) {\n if (this.context.owner.sceneDocument) {\n variable = this.context.owner.sceneDocument.items[type + \"Variables\"].first(function(v) {\n return v.name === name;\n });\n if (variable != null) {\n result = variable.index;\n }\n } else if (this.context.owner[type + \"Variables\"]) {\n variable = this.context.owner[type + \"Variables\"].first(function(v) {\n return v.name === name;\n });\n if (variable != null) {\n result = variable.index;\n } else {\n console.warn(\"Variable referenced by name not found: \" + name(+\"(local, \" + type + \")\"));\n }\n }\n }\n return result;\n };\n\n\n /**\n * Gets the index for the global variable with the specified name. If a variable with that\n * name cannot be found, the index will be 0.\n *\n * @method indexOfTempVariable\n * @param {string} name - The name of the variable to get the index for.\n * @param {string} type - The type name: number, string, boolean or list.\n * @param {string} domain - The variable domain to search in. If not specified, the default domain will be used.\n */\n\n VariableStore.prototype.indexOfGlobalVariable = function(name, type, domain) {\n var result, variable, variables, variablesDocument;\n result = 0;\n variables = DataManager.getDocumentsByType(\"global_variables\");\n variablesDocument = variables.first(function(v) {\n return v.items.domain === domain;\n });\n if (variablesDocument == null) {\n variablesDocument = variables[0];\n }\n if (variablesDocument) {\n variable = variablesDocument.items[type + \"s\"].first(function(v) {\n return v.name === name;\n });\n if (variable) {\n result = variable.index;\n } else {\n console.warn(\"Variable referenced by name not found: \" + name + \" (persistent, \" + type + \")\");\n }\n }\n return result;\n };\n\n\n /**\n * Gets the index for the persistent variable with the specified name. If a variable with that\n * name cannot be found, the index will be 0.\n *\n * @method indexOfTempVariable\n * @param {string} name - The name of the variable to get the index for.\n * @param {string} type - The type name: number, string, boolean or list.\n * @param {string} domain - The variable domain to search in. If not specified, the default domain will be used.\n */\n\n VariableStore.prototype.indexOfPersistentVariable = function(name, type, domain) {\n var result, variable, variables, variablesDocument;\n result = 0;\n variables = DataManager.getDocumentsByType(\"persistent_variables\");\n variablesDocument = variables.first(function(v) {\n return v.items.domain === domain;\n });\n if (variablesDocument == null) {\n variablesDocument = variables[0];\n }\n if (variablesDocument) {\n variable = variablesDocument.items[type + \"s\"].first(function(v) {\n return v.name === name;\n });\n if (variable != null) {\n result = variable.index;\n } else {\n console.warn(\"Variable referenced by name not found: \" + name + \" (persistent, \" + type + \")\");\n }\n }\n return result;\n };\n\n\n /**\n * Sets the value of the number variable at the specified index.\n *\n * @method setNumberValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} type - The variable's index.\n * @param {number} value - The value to set.\n */\n\n VariableStore.prototype.setNumberValueAtIndex = function(scope, index, value, domain) {\n if (scope === 2) {\n return this.persistentNumbersByDomain[domain][index] = value;\n } else if (scope === 1) {\n return this.numbersByDomain[domain || 0][index] = value;\n } else {\n return this.tempNumbers[index] = value;\n }\n };\n\n\n /**\n * Sets the value of a specified number variable.\n *\n * @method setNumberValueAtIndex\n * @param {number} variable - The variable to set. \n * @param {number} value - The value to set.\n */\n\n VariableStore.prototype.setNumberValueTo = function(variable, value) {\n if (variable.scope === 2) {\n return this.persistentNumbersByDomain[variable.domain || 0][variable.index] = value;\n } else if (variable.scope === 1) {\n return this.numbersByDomain[variable.domain || 0][variable.index] = value;\n } else {\n return this.tempNumbers[variable.index] = value;\n }\n };\n\n\n /**\n * Sets the value of a specified list variable.\n *\n * @method setListObjectTo\n * @param {Object} variable - The variable to set. \n * @param {Object} value - The value to set.\n */\n\n VariableStore.prototype.setListObjectTo = function(variable, value) {\n if (variable.scope === 2) {\n return this.persistentListsByDomain[variable.domain || 0][variable.index] = value;\n } else if (variable.scope === 1) {\n return this.listsByDomain[variable.domain || 0][variable.index] = value;\n } else {\n return this.tempLists[variable.index] = value;\n }\n };\n\n\n /**\n * Sets the value of a specified boolean variable.\n *\n * @method setBooleanValueTo\n * @param {Object} variable - The variable to set. \n * @param {boolean} value - The value to set.\n */\n\n VariableStore.prototype.setBooleanValueTo = function(variable, value) {\n if (variable.scope === 2) {\n return this.persistentBooleansByDomain[variable.domain][variable.index] = value;\n } else if (variable.scope === 1) {\n return this.booleansByDomain[variable.domain][variable.index] = value;\n } else {\n return this.tempBooleans[variable.index] = value;\n }\n };\n\n\n /**\n * Sets the value of the boolean variable at the specified index.\n *\n * @method setBooleanValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @param {boolean} value - The value to set.\n */\n\n VariableStore.prototype.setBooleanValueAtIndex = function(scope, index, value, domain) {\n if (scope === 2) {\n return this.persistentBooleansByDomain[domain][index] = value;\n } else if (scope === 1) {\n return this.booleansByDomain[domain][index] = value;\n } else {\n return this.tempBooleans[index] = value;\n }\n };\n\n\n /**\n * Sets the value of a specified string variable.\n *\n * @method setStringValueTo\n * @param {Object} variable - The variable to set. \n * @param {string} value - The value to set.\n */\n\n VariableStore.prototype.setStringValueTo = function(variable, value) {\n if (variable.scope === 2) {\n return this.persistentStringsByDomain[variable.domain][variable.index] = value;\n } else if (variable.scope === 1) {\n return this.stringsByDomain[variable.domain][variable.index] = value;\n } else {\n return this.tempStrings[variable.index] = value;\n }\n };\n\n\n /**\n * Sets the value of the string variable at the specified index.\n *\n * @method setStringValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @param {string} value - The value to set.\n */\n\n VariableStore.prototype.setStringValueAtIndex = function(scope, index, value, domain) {\n if (scope === 2) {\n return this.persistentStringsByDomain[domain][index] = value;\n } else if (scope === 1) {\n return this.stringsByDomain[domain][index] = value;\n } else {\n return this.tempStrings[index] = value;\n }\n };\n\n\n /**\n * Gets the value of a specified list variable.\n *\n * @method listObjectOf\n * @param {Object} object - The list-variable/object to get the value from.\n * @return {Object} The list-object.\n */\n\n VariableStore.prototype.listObjectOf = function(object) {\n var result;\n result = 0;\n if ((object != null) && (object.index != null)) {\n if (object.scope === 2) {\n result = this.persistentListsByDomain[object.domain][object.index];\n } else if (object.scope === 1) {\n result = this.listsByDomain[object.domain][object.index];\n } else {\n result = this.tempLists[object.index];\n }\n } else {\n result = object;\n }\n return result || [];\n };\n\n\n /**\n * Gets the value of a number variable at the specified index.\n *\n * @method numberValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @return {Object} The number value of the variable.\n */\n\n VariableStore.prototype.numberValueAtIndex = function(scope, index, domain) {\n var result;\n result = 0;\n if (scope === 2) {\n result = this.persistentNumbersByDomain[domain][index];\n } else if (scope === 1) {\n result = this.numbersByDomain[domain][index];\n } else {\n result = this.tempNumbers[index];\n }\n return result;\n };\n\n\n /**\n * Gets the value of a specified number variable.\n *\n * @method numberValueOf\n * @param {Object} object - The variable to get the value from.\n * @return {Object} The number value of the variable.\n */\n\n VariableStore.prototype.numberValueOf = function(object) {\n var result;\n result = 0;\n if ((object != null) && (object.index != null)) {\n if (object.scope === 2) {\n result = this.persistentNumbersByDomain[object.domain][object.index];\n } else if (object.scope === 1) {\n result = this.numbersByDomain[object.domain][object.index];\n } else {\n result = this.tempNumbers[object.index];\n }\n } else {\n result = object;\n }\n return result || 0;\n };\n\n\n /**\n * Gets the value of a specified string variable.\n *\n * @method stringValueOf\n * @param {Object} object - The variable to get the value from.\n * @return {string} The string value of the variable.\n */\n\n VariableStore.prototype.stringValueOf = function(object) {\n var result;\n result = \"\";\n if ((object != null) && (object.index != null)) {\n if (object.scope === 2) {\n result = this.persistentStringsByDomain[object.domain][object.index];\n } else if (object.scope === 1) {\n result = this.stringsByDomain[object.domain][object.index];\n } else {\n result = this.tempStrings[object.index];\n }\n } else {\n result = object;\n }\n return result || \"\";\n };\n\n\n /**\n * Gets the value of a string variable at the specified index.\n *\n * @method stringValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @return {string} The string value of the variable.\n */\n\n VariableStore.prototype.stringValueAtIndex = function(scope, index, domain) {\n var result;\n result = \"\";\n if (scope === 2) {\n result = this.persistentStringsByDomain[domain][index];\n } else if (scope === 1) {\n result = this.stringsByDomain[domain][index];\n } else {\n result = this.tempStrings[index];\n }\n return result || \"\";\n };\n\n\n /**\n * Gets the value of a specified boolean variable.\n *\n * @method booleanValueOf\n * @param {Object} object - The variable to get the value from.\n * @return {Object} The boolean value of the variable.\n */\n\n VariableStore.prototype.booleanValueOf = function(object) {\n var result;\n result = false;\n if ((object != null) && (object.index != null)) {\n if (object.scope === 2) {\n result = this.persistentBooleansByDomain[object.domain][object.index] || false;\n } else if (object.scope === 1) {\n result = this.booleansByDomain[object.domain][object.index] || false;\n } else {\n result = this.tempBooleans[object.index] || false;\n }\n } else {\n result = object ? true : false;\n }\n return result;\n };\n\n\n /**\n * Gets the value of a boolean variable at the specified index.\n *\n * @method booleanValueAtIndex\n * @param {number} scope - The variable scope.\n * @param {number} index - The variable's index.\n * @return {boolean} The boolean value of the variable.\n */\n\n VariableStore.prototype.booleanValueAtIndex = function(scope, index, domain) {\n var result;\n result = false;\n if (scope === 2) {\n result = this.persistenBooleansByDomain[domain][index] || false;\n } else if (scope === 1) {\n result = this.booleansByDomain[domain][index] || false;\n } else {\n result = this.tempBooleans[index] || false;\n }\n return result;\n };\n\n return VariableStore;\n\n})();\n\ngs.VariableStore = VariableStore;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUE7O0FBQU07RUFDRixhQUFDLENBQUEsb0JBQUQsR0FBd0IsQ0FBQyxtQkFBRCxFQUFzQixtQkFBdEIsRUFBMkMsb0JBQTNDLEVBQWlFLGlCQUFqRTs7O0FBRXhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlCYSx1QkFBQTs7QUFDVDs7Ozs7SUFLQSxJQUFDLENBQUEsT0FBRCxHQUFXOztBQUVYOzs7Ozs7O0lBT0EsSUFBQyxDQUFBLE1BQUQsR0FBVTs7QUFFVjs7Ozs7SUFLQSxJQUFDLENBQUEsT0FBRCxHQUFXLENBQUMsRUFBRDs7QUFFWDs7Ozs7SUFLQSxJQUFDLENBQUEsT0FBRCxHQUFXOztBQUNYOzs7OztJQUtBLElBQUMsQ0FBQSxRQUFELEdBQVk7O0FBQ1o7Ozs7O0lBS0EsSUFBQyxDQUFBLE9BQUQsR0FBVzs7QUFDWDs7Ozs7SUFLQSxJQUFDLENBQUEsS0FBRCxHQUFTOztBQUVUOzs7OztJQUtBLElBQUMsQ0FBQSx1QkFBRCxHQUEyQjs7QUFFM0I7Ozs7O0lBS0EsSUFBQyxDQUFBLDJCQUFELEdBQStCOztBQUUvQjs7Ozs7SUFLQSxJQUFDLENBQUEsaUJBQUQsR0FBcUI7O0FBQ3JCOzs7OztJQUtBLElBQUMsQ0FBQSxpQkFBRCxHQUFxQjs7QUFDckI7Ozs7O0lBS0EsSUFBQyxDQUFBLGtCQUFELEdBQXNCOztBQUN0Qjs7Ozs7SUFLQSxJQUFDLENBQUEsZUFBRCxHQUFtQjs7QUFDbkI7Ozs7O0lBS0EsSUFBQyxDQUFBLFlBQUQsR0FBZ0I7O0FBQ2hCOzs7OztJQUtBLElBQUMsQ0FBQSxZQUFELEdBQWdCOztBQUNoQjs7Ozs7SUFLQSxJQUFDLENBQUEsYUFBRCxHQUFpQjs7QUFDakI7Ozs7O0lBS0EsSUFBQyxDQUFBLFVBQUQsR0FBYzs7QUFDZDs7OztJQUlBLElBQUMsQ0FBQSxXQUFELEdBQWU7O0FBQ2Y7Ozs7SUFJQSxJQUFDLENBQUEsV0FBRCxHQUFlOztBQUNmOzs7O0lBSUEsSUFBQyxDQUFBLFlBQUQsR0FBZ0I7O0FBQ2hCOzs7O0lBSUEsSUFBQyxDQUFBLFNBQUQsR0FBYTtFQWxJSjs7O0FBb0liOzs7Ozs7Ozs7MEJBUUEsbUJBQUEsR0FBcUIsU0FBQyxJQUFELEVBQU8sT0FBUDtBQUNqQixRQUFBO0lBQUEsT0FBQSxHQUFVLFdBQVcsQ0FBQyxrQkFBWixDQUErQixrQkFBL0IsQ0FBa0QsQ0FBQyxNQUFuRCxDQUEwRCxTQUFDLENBQUQ7YUFBTyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQWYsQ0FBMUQ7QUFFVixTQUFBLGlEQUFBOztNQUNJLElBQUMsQ0FBQSxlQUFnQixDQUFBLE1BQUEsQ0FBakIsR0FBMkIsSUFBQyxDQUFBLGVBQWdCLENBQUEsQ0FBQTtNQUM1QyxJQUFDLENBQUEsZUFBZ0IsQ0FBQSxNQUFBLENBQWpCLEdBQTJCLElBQUMsQ0FBQSxlQUFnQixDQUFBLENBQUE7TUFDNUMsSUFBQyxDQUFBLGdCQUFpQixDQUFBLE1BQUEsQ0FBbEIsR0FBNEIsSUFBQyxDQUFBLGdCQUFpQixDQUFBLENBQUE7TUFDOUMsSUFBQyxDQUFBLGFBQWMsQ0FBQSxNQUFBLENBQWYsR0FBeUIsSUFBQyxDQUFBLGFBQWMsQ0FBQSxDQUFBO0FBSjVDO0FBTUEsV0FBTztFQVRVOzswQkFXckIsa0JBQUEsR0FBb0IsU0FBQTtBQUNoQixRQUFBO0lBQUEsSUFBQyxDQUFBLGVBQUQsR0FBbUI7SUFDbkIsSUFBQyxDQUFBLGVBQUQsR0FBbUI7SUFDbkIsSUFBQyxDQUFBLGdCQUFELEdBQW9CO0lBQ3BCLElBQUMsQ0FBQSxhQUFELEdBQWlCO0FBRWpCO0FBQUEsU0FBQSw2Q0FBQTs7TUFDSSxJQUFDLENBQUEsZUFBZ0IsQ0FBQSxDQUFBLENBQWpCLEdBQTBCLElBQUEsS0FBQSxDQUFNLElBQU47TUFDMUIsSUFBQyxDQUFBLGVBQWdCLENBQUEsTUFBQSxDQUFqQixHQUEyQixJQUFDLENBQUEsZUFBZ0IsQ0FBQSxDQUFBO01BQzVDLElBQUMsQ0FBQSxlQUFnQixDQUFBLENBQUEsQ0FBakIsR0FBMEIsSUFBQSxLQUFBLENBQU0sSUFBTjtNQUMxQixJQUFDLENBQUEsZUFBZ0IsQ0FBQSxNQUFBLENBQWpCLEdBQTJCLElBQUMsQ0FBQSxlQUFnQixDQUFBLENBQUE7TUFDNUMsSUFBQyxDQUFBLGdCQUFpQixDQUFBLENBQUEsQ0FBbEIsR0FBMkIsSUFBQSxLQUFBLENBQU0sSUFBTjtNQUMzQixJQUFDLENBQUEsZ0JBQWlCLENBQUEsTUFBQSxDQUFsQixHQUE0QixJQUFDLENBQUEsZ0JBQWlCLENBQUEsQ0FBQTtNQUM5QyxJQUFDLENBQUEsYUFBYyxDQUFBLENBQUEsQ0FBZixHQUF3QixJQUFBLEtBQUEsQ0FBTSxJQUFOO01BQ3hCLElBQUMsQ0FBQSxhQUFjLENBQUEsTUFBQSxDQUFmLEdBQXlCLElBQUMsQ0FBQSxhQUFjLENBQUEsQ0FBQTtBQVI1QztJQVVBLElBQUMsQ0FBQSxPQUFELEdBQVcsSUFBQyxDQUFBLGVBQWdCLENBQUEsQ0FBQTtJQUM1QixJQUFDLENBQUEsT0FBRCxHQUFXLElBQUMsQ0FBQSxlQUFnQixDQUFBLENBQUE7SUFDNUIsSUFBQyxDQUFBLFFBQUQsR0FBWSxJQUFDLENBQUEsZ0JBQWlCLENBQUEsQ0FBQTtXQUM5QixJQUFDLENBQUEsS0FBRCxHQUFTLElBQUMsQ0FBQSxlQUFnQixDQUFBLENBQUE7RUFuQlY7OzBCQXFCcEIsc0JBQUEsR0FBd0IsU0FBQyxPQUFEO0FBQ3BCLFFBQUE7SUFBQSxJQUFDLENBQUEseUJBQUQsR0FBNkI7SUFDN0IsSUFBQyxDQUFBLHlCQUFELEdBQTZCO0lBQzdCLElBQUMsQ0FBQSwwQkFBRCxHQUE4QjtJQUM5QixJQUFDLENBQUEsdUJBQUQsR0FBMkI7QUFFM0I7QUFBQSxTQUFBLDZDQUFBOztNQUNJLElBQUMsQ0FBQSx5QkFBMEIsQ0FBQSxDQUFBLENBQTNCLEdBQW9DLElBQUEsS0FBQSxDQUFNLEVBQU47TUFDcEMsSUFBQyxDQUFBLHlCQUEwQixDQUFBLE1BQUEsQ0FBM0IsR0FBcUMsSUFBQyxDQUFBLGlCQUFrQixDQUFBLENBQUE7TUFDeEQsSUFBQyxDQUFBLHlCQUEwQixDQUFBLENBQUEsQ0FBM0IsR0FBb0MsSUFBQSxLQUFBLENBQU0sRUFBTjtNQUNwQyxJQUFDLENBQUEseUJBQTBCLENBQUEsTUFBQSxDQUEzQixHQUFxQyxJQUFDLENBQUEsaUJBQWtCLENBQUEsQ0FBQTtNQUN4RCxJQUFDLENBQUEsMEJBQTJCLENBQUEsQ0FBQSxDQUE1QixHQUFxQyxJQUFBLEtBQUEsQ0FBTSxFQUFOO01BQ3JDLElBQUMsQ0FBQSwwQkFBMkIsQ0FBQSxNQUFBLENBQTVCLEdBQXNDLElBQUMsQ0FBQSxrQkFBbUIsQ0FBQSxDQUFBO01BQzFELElBQUMsQ0FBQSx1QkFBd0IsQ0FBQSxDQUFBLENBQXpCLEdBQWtDLElBQUEsS0FBQSxDQUFNLEVBQU47TUFDbEMsSUFBQyxDQUFBLHVCQUF3QixDQUFBLE1BQUEsQ0FBekIsR0FBbUMsSUFBQyxDQUFBLGVBQWdCLENBQUEsQ0FBQTtBQVJ4RDtJQVVBLElBQUMsQ0FBQSxpQkFBRCxHQUFxQixJQUFDLENBQUEseUJBQTBCLENBQUEsQ0FBQTtJQUNoRCxJQUFDLENBQUEsaUJBQUQsR0FBcUIsSUFBQyxDQUFBLHlCQUEwQixDQUFBLENBQUE7SUFDaEQsSUFBQyxDQUFBLGtCQUFELEdBQXNCLElBQUMsQ0FBQSwwQkFBMkIsQ0FBQSxDQUFBO1dBQ2xELElBQUMsQ0FBQSxlQUFELEdBQW1CLElBQUMsQ0FBQSx1QkFBd0IsQ0FBQSxDQUFBO0VBbkJ4Qjs7MEJBcUJ4QixZQUFBLEdBQWMsU0FBQyxPQUFEO0lBQ1YsSUFBQyxDQUFBLE9BQUQsR0FBVztJQUNYLElBQUMsQ0FBQSxrQkFBRCxDQUFBO1dBQ0EsSUFBQyxDQUFBLHNCQUFELENBQUE7RUFIVTs7O0FBTWQ7Ozs7Ozs7OzBCQU9BLFlBQUEsR0FBYyxTQUFDLE1BQUQ7QUFDVixRQUFBO0lBQUEsSUFBQyxDQUFBLE1BQUQsR0FBVTtJQUNWLGVBQUEsR0FBa0IsSUFBQyxDQUFBLHVCQUF3QixDQUFBLE1BQUE7SUFDM0MsbUJBQUEsR0FBc0IsSUFBQyxDQUFBLDJCQUE0QixDQUFBLE1BQUE7SUFFbkQsSUFBRyxDQUFDLGVBQUo7TUFDSSxlQUFBLEdBQWtCLElBQUMsQ0FBQSx1QkFBd0IsQ0FBQSxNQUFBLENBQXpCLEdBQW1DO1FBQUUsT0FBQSxFQUFhLElBQUEsS0FBQSxDQUFNLEdBQU4sQ0FBZjtRQUEyQixPQUFBLEVBQWEsSUFBQSxLQUFBLENBQU0sR0FBTixDQUF4QztRQUFvRCxRQUFBLEVBQWMsSUFBQSxLQUFBLENBQU0sR0FBTixDQUFsRTtRQUE4RSxLQUFBLEVBQVcsSUFBQSxLQUFBLENBQU0sR0FBTixDQUF6RjtRQUR6RDs7SUFFQSxJQUFHLENBQUMsbUJBQUo7TUFDSSxtQkFBQSxHQUFzQixJQUFDLENBQUEsMkJBQTRCLENBQUEsTUFBQSxDQUE3QixHQUF1QztRQUFFLE9BQUEsRUFBYSxJQUFBLEtBQUEsQ0FBTSxHQUFOLENBQWY7UUFBMkIsT0FBQSxFQUFhLElBQUEsS0FBQSxDQUFNLEdBQU4sQ0FBeEM7UUFBb0QsUUFBQSxFQUFjLElBQUEsS0FBQSxDQUFNLEdBQU4sQ0FBbEU7UUFBOEUsS0FBQSxFQUFXLElBQUEsS0FBQSxDQUFNLEdBQU4sQ0FBekY7UUFEakU7O0lBR0EsSUFBQyxDQUFBLE9BQUQsR0FBVyxlQUFlLENBQUM7SUFDM0IsSUFBQyxDQUFBLE9BQUQsR0FBVyxlQUFlLENBQUM7SUFDM0IsSUFBQyxDQUFBLFFBQUQsR0FBWSxlQUFlLENBQUM7SUFDNUIsSUFBQyxDQUFBLEtBQUQsR0FBUyxlQUFlLENBQUM7SUFDekIsSUFBQyxDQUFBLGlCQUFELEdBQXFCLG1CQUFtQixDQUFDO0lBQ3pDLElBQUMsQ0FBQSxrQkFBRCxHQUFzQixtQkFBbUIsQ0FBQztJQUMxQyxJQUFDLENBQUEsaUJBQUQsR0FBcUIsbUJBQW1CLENBQUM7V0FDekMsSUFBQyxDQUFBLGVBQUQsR0FBbUIsbUJBQW1CLENBQUM7RUFqQjdCOzs7QUFtQmQ7Ozs7OzswQkFLQSx1QkFBQSxHQUF5QixTQUFBO0FBQ3JCLFFBQUE7SUFBQSxJQUFDLENBQUEsa0JBQUQsQ0FBQTtBQUNBO0lBRUEsZUFBQSxHQUFrQixJQUFDLENBQUEsdUJBQXdCLENBQUEsSUFBQyxDQUFBLE1BQUQ7SUFDM0MsSUFBQyxDQUFBLGVBQUQsR0FBdUIsSUFBQSxLQUFBLENBQU0sSUFBTjtJQUN2QixlQUFlLENBQUMsUUFBaEIsR0FBK0IsSUFBQSxLQUFBLENBQU0sSUFBTjtJQUMvQixlQUFlLENBQUMsT0FBaEIsR0FBOEIsSUFBQSxLQUFBLENBQU0sSUFBTjtJQUU5QixJQUFDLENBQUEsT0FBRCxHQUFXLGVBQWUsQ0FBQztJQUMzQixJQUFDLENBQUEsT0FBRCxHQUFXLGVBQWUsQ0FBQztXQUMzQixJQUFDLENBQUEsUUFBRCxHQUFZLGVBQWUsQ0FBQztFQVhQOzs7QUFhekI7Ozs7OzswQkFLQSxzQkFBQSxHQUF3QixTQUFBO0lBQ3BCLElBQUMsQ0FBQSxZQUFELEdBQWdCO0lBQ2hCLElBQUMsQ0FBQSxZQUFELEdBQWdCO0lBQ2hCLElBQUMsQ0FBQSxhQUFELEdBQWlCO1dBQ2pCLElBQUMsQ0FBQSxVQUFELEdBQWM7RUFKTTs7O0FBTXhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQWtCQSxjQUFBLEdBQWdCLFNBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsUUFBbkIsRUFBNkIsS0FBN0IsRUFBb0MsSUFBcEMsRUFBMEMsS0FBMUM7QUFDWixZQUFPLElBQVA7QUFBQSxXQUNTLENBRFQ7O1VBRVEsT0FBTyxDQUFFLElBQVQsQ0FBYyxDQUFkLEVBQWlCLEtBQUssQ0FBQyxLQUF2QixFQUE4QixLQUFLLENBQUMsR0FBcEM7OztVQUNBLE9BQU8sQ0FBRSxJQUFULENBQWMsRUFBZCxFQUFrQixLQUFLLENBQUMsS0FBeEIsRUFBK0IsS0FBSyxDQUFDLEdBQXJDOzs7VUFDQSxRQUFRLENBQUUsSUFBVixDQUFlLEtBQWYsRUFBc0IsS0FBSyxDQUFDLEtBQTVCLEVBQW1DLEtBQUssQ0FBQyxHQUF6Qzs7K0JBQ0EsS0FBSyxDQUFFLElBQVAsQ0FBWSxFQUFaLEVBQWdCLEtBQUssQ0FBQyxLQUF0QixFQUE2QixLQUFLLENBQUMsR0FBbkM7QUFMUixXQU1TLENBTlQ7a0NBT1EsUUFBUSxDQUFFLElBQVYsQ0FBZSxLQUFmLEVBQXNCLEtBQUssQ0FBQyxLQUE1QixFQUFtQyxLQUFLLENBQUMsR0FBekM7QUFQUixXQVFTLENBUlQ7aUNBU1EsT0FBTyxDQUFFLElBQVQsQ0FBYyxDQUFkLEVBQWlCLEtBQUssQ0FBQyxLQUF2QixFQUE4QixLQUFLLENBQUMsR0FBcEM7QUFUUixXQVVTLENBVlQ7aUNBV1EsT0FBTyxDQUFFLElBQVQsQ0FBYyxFQUFkLEVBQWtCLEtBQUssQ0FBQyxLQUF4QixFQUErQixLQUFLLENBQUMsR0FBckM7QUFYUixXQVlTLENBWlQ7K0JBYVEsS0FBSyxDQUFFLElBQVAsQ0FBWSxFQUFaLEVBQWdCLEtBQUssQ0FBQyxLQUF0QixFQUE2QixLQUFLLENBQUMsR0FBbkM7QUFiUjtFQURZOzs7QUFnQmhCOzs7Ozs7Ozs7Ozs7Ozs7OzswQkFnQkEsbUJBQUEsR0FBcUIsU0FBQyxPQUFELEVBQVUsSUFBVixFQUFnQixLQUFoQjtBQUNqQixRQUFBO0lBQUEsSUFBRyxlQUFIO01BQ0ksR0FBQSxHQUFNLENBQUMsT0FBTyxDQUFDLEVBQVQsRUFEVjtLQUFBLE1BQUE7TUFHSSxHQUFBLEdBQU0sTUFBTSxDQUFDLElBQVAsQ0FBWSxJQUFDLENBQUEsWUFBYixFQUhWOztJQUtBLElBQUcsYUFBSDtNQUNJLEtBQUEsR0FBUTtRQUFBLEtBQUEsRUFBTyxLQUFLLENBQUMsS0FBYjtRQUFvQixHQUFBLEVBQUssS0FBSyxDQUFDLEdBQU4sR0FBWSxDQUFyQztRQURaO0tBQUEsTUFBQTtNQUdJLEtBQUEsR0FBUTtRQUFBLEtBQUEsRUFBTyxDQUFQO1FBQVUsR0FBQSxFQUFLLElBQWY7UUFIWjs7QUFLQTtTQUFBLHFDQUFBOzttQkFDSSxJQUFDLENBQUEsY0FBRCxDQUFnQixJQUFDLENBQUEsWUFBYSxDQUFBLEVBQUEsQ0FBOUIsRUFBbUMsSUFBQyxDQUFBLFlBQWEsQ0FBQSxFQUFBLENBQWpELEVBQXNELElBQUMsQ0FBQSxhQUFjLENBQUEsRUFBQSxDQUFyRSxFQUEwRSxJQUFDLENBQUEsVUFBVyxDQUFBLEVBQUEsQ0FBdEYsRUFBMkYsSUFBM0YsRUFBaUcsS0FBakc7QUFESjs7RUFYaUI7OztBQWNyQjs7Ozs7Ozs7Ozs7Ozs7OzBCQWNBLG9CQUFBLEdBQXNCLFNBQUMsSUFBRCxFQUFPLEtBQVA7SUFDbEIsSUFBRyxhQUFIO01BQ0ksS0FBQSxHQUFRO1FBQUEsS0FBQSxFQUFPLEtBQUssQ0FBQyxLQUFiO1FBQW9CLEdBQUEsRUFBSyxLQUFLLENBQUMsR0FBTixHQUFZLENBQXJDO1FBRFo7S0FBQSxNQUFBO01BR0ksS0FBQSxHQUFRO1FBQUEsS0FBQSxFQUFPLENBQVA7UUFBVSxHQUFBLEVBQUssSUFBZjtRQUhaOztXQUtBLElBQUMsQ0FBQSxjQUFELENBQWdCLElBQUMsQ0FBQSxPQUFqQixFQUEwQixJQUFDLENBQUEsT0FBM0IsRUFBb0MsSUFBQyxDQUFBLFFBQXJDLEVBQStDLElBQUMsQ0FBQSxLQUFoRCxFQUF1RCxJQUF2RCxFQUE2RCxLQUE3RDtFQU5rQjs7O0FBUXRCOzs7Ozs7Ozs7Ozs7Ozs7MEJBY0Esd0JBQUEsR0FBMEIsU0FBQyxJQUFELEVBQU8sS0FBUDtJQUN0QixJQUFHLGFBQUg7TUFDSSxLQUFBLEdBQVE7UUFBQSxLQUFBLEVBQU8sS0FBSyxDQUFDLEtBQWI7UUFBb0IsR0FBQSxFQUFLLEtBQUssQ0FBQyxHQUFOLEdBQVksQ0FBckM7UUFEWjtLQUFBLE1BQUE7TUFHSSxLQUFBLEdBQVE7UUFBQSxLQUFBLEVBQU8sQ0FBUDtRQUFVLEdBQUEsRUFBSyxJQUFmO1FBSFo7O1dBS0EsSUFBQyxDQUFBLGNBQUQsQ0FBZ0IsSUFBQyxDQUFBLGlCQUFqQixFQUFvQyxJQUFDLENBQUEsaUJBQXJDLEVBQXdELElBQUMsQ0FBQSxrQkFBekQsRUFBNkUsSUFBQyxDQUFBLGVBQTlFLEVBQStGLElBQS9GLEVBQXFHLEtBQXJHO0VBTnNCOzs7QUFRMUI7Ozs7Ozs7MEJBTUEsS0FBQSxHQUFPLFNBQUMsT0FBRDtJQUNILElBQUMsQ0FBQSxtQkFBRCxDQUFxQixPQUFyQjtXQUNBLElBQUMsQ0FBQSxrQkFBRCxDQUFvQixPQUFwQjtFQUZHOzs7QUFLUDs7Ozs7OzswQkFNQSxtQkFBQSxHQUFxQixTQUFDLE9BQUQ7SUFDakIsSUFBQyxDQUFBLGNBQUQsQ0FBZ0IsT0FBaEIsRUFBeUIsY0FBekIsRUFBeUMsQ0FBekM7SUFDQSxJQUFDLENBQUEsY0FBRCxDQUFnQixPQUFoQixFQUF5QixjQUF6QixFQUF5QyxFQUF6QztJQUNBLElBQUMsQ0FBQSxjQUFELENBQWdCLE9BQWhCLEVBQXlCLGVBQXpCLEVBQTBDLEtBQTFDO1dBQ0EsSUFBQyxDQUFBLGNBQUQsQ0FBZ0IsT0FBaEIsRUFBeUIsWUFBekIsRUFBdUMsRUFBdkM7RUFKaUI7OztBQU1yQjs7Ozs7Ozs7OzBCQVFBLGNBQUEsR0FBZ0IsU0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixZQUFwQjtJQUNaLElBQU8sa0NBQVA7YUFDSSxJQUFLLENBQUEsUUFBQSxDQUFVLENBQUEsT0FBTyxDQUFDLEVBQVIsQ0FBZixHQUE2QixHQURqQzs7RUFEWTs7O0FBS2hCOzs7Ozs7OzBCQU1BLGtCQUFBLEdBQW9CLFNBQUMsT0FBRDtJQUNoQixJQUFDLENBQUEsT0FBRCxHQUFXO0lBQ1gsSUFBRyxDQUFDLElBQUMsQ0FBQSxZQUFhLENBQUEsT0FBTyxDQUFDLEVBQVIsQ0FBbEI7TUFDSSxJQUFDLENBQUEsbUJBQUQsQ0FBcUIsT0FBckIsRUFESjs7SUFHQSxJQUFDLENBQUEsV0FBRCxHQUFlLElBQUMsQ0FBQSxZQUFhLENBQUEsT0FBTyxDQUFDLEVBQVI7SUFDN0IsSUFBQyxDQUFBLFdBQUQsR0FBZSxJQUFDLENBQUEsWUFBYSxDQUFBLE9BQU8sQ0FBQyxFQUFSO0lBQzdCLElBQUMsQ0FBQSxZQUFELEdBQWdCLElBQUMsQ0FBQSxhQUFjLENBQUEsT0FBTyxDQUFDLEVBQVI7V0FDL0IsSUFBQyxDQUFBLFNBQUQsR0FBYSxJQUFDLENBQUEsVUFBVyxDQUFBLE9BQU8sQ0FBQyxFQUFSO0VBUlQ7OzBCQVVwQixrQkFBQSxHQUFvQixTQUFDLE9BQUQsR0FBQTs7O0FBR3BCOzs7Ozs7Ozs7OzswQkFVQSxlQUFBLEdBQWlCLFNBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxLQUFiLEVBQW9CLE1BQXBCO0FBQ2IsUUFBQTtJQUFBLE1BQUEsR0FBUztBQUVULFlBQU8sS0FBUDtBQUFBLFdBQ1MsQ0FEVDtRQUVRLE1BQUEsR0FBUyxJQUFDLENBQUEsbUJBQUQsQ0FBcUIsSUFBckIsRUFBMkIsSUFBM0I7QUFEUjtBQURULFdBR1MsQ0FIVDtRQUlRLE1BQUEsR0FBUyxJQUFDLENBQUEscUJBQUQsQ0FBdUIsSUFBdkIsRUFBNkIsSUFBN0IsRUFBbUMsTUFBbkM7QUFEUjtBQUhULFdBS1MsQ0FMVDtRQU1RLE1BQUEsR0FBUyxJQUFDLENBQUEseUJBQUQsQ0FBMkIsSUFBM0IsRUFBaUMsSUFBakMsRUFBdUMsTUFBdkM7QUFOakI7QUFRQSxXQUFPO0VBWE07OztBQWFqQjs7Ozs7Ozs7OzBCQVFBLG1CQUFBLEdBQXFCLFNBQUMsSUFBRCxFQUFPLElBQVA7QUFDakIsUUFBQTtJQUFBLE1BQUEsR0FBUztJQUVULHNDQUFXLENBQUUsY0FBYjtNQUNJLElBQUcsSUFBQyxDQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBbEI7UUFDSSxRQUFBLEdBQVcsSUFBQyxDQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQU0sQ0FBQSxJQUFBLEdBQU8sV0FBUCxDQUFtQixDQUFDLEtBQXZELENBQTZELFNBQUMsQ0FBRDtpQkFBTyxDQUFDLENBQUMsSUFBRixLQUFVO1FBQWpCLENBQTdEO1FBQ1gsSUFBMkIsZ0JBQTNCO1VBQUEsTUFBQSxHQUFTLFFBQVEsQ0FBQyxNQUFsQjtTQUZKO09BQUEsTUFHSyxJQUFHLElBQUMsQ0FBQSxPQUFPLENBQUMsS0FBTSxDQUFBLElBQUEsR0FBTyxXQUFQLENBQWxCO1FBQ0QsUUFBQSxHQUFXLElBQUMsQ0FBQSxPQUFPLENBQUMsS0FBTSxDQUFBLElBQUEsR0FBTyxXQUFQLENBQW1CLENBQUMsS0FBbkMsQ0FBeUMsU0FBQyxDQUFEO2lCQUFPLENBQUMsQ0FBQyxJQUFGLEtBQVU7UUFBakIsQ0FBekM7UUFFWCxJQUFHLGdCQUFIO1VBQ0ksTUFBQSxHQUFTLFFBQVEsQ0FBQyxNQUR0QjtTQUFBLE1BQUE7VUFHSSxPQUFPLENBQUMsSUFBUixDQUFhLHlDQUFBLEdBQTRDLElBQUEsQ0FBSyxDQUFDLFVBQUQsR0FBWSxJQUFaLEdBQWlCLEdBQXRCLENBQXpELEVBSEo7U0FIQztPQUpUOztBQVlBLFdBQU87RUFmVTs7O0FBaUJyQjs7Ozs7Ozs7OzswQkFTQSxxQkFBQSxHQUF1QixTQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsTUFBYjtBQUNuQixRQUFBO0lBQUEsTUFBQSxHQUFTO0lBQ1QsU0FBQSxHQUFZLFdBQVcsQ0FBQyxrQkFBWixDQUErQixrQkFBL0I7SUFDWixpQkFBQSxHQUFvQixTQUFTLENBQUMsS0FBVixDQUFnQixTQUFDLENBQUQ7YUFBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQVIsS0FBa0I7SUFBekIsQ0FBaEI7O01BQ3BCLG9CQUFxQixTQUFVLENBQUEsQ0FBQTs7SUFFL0IsSUFBRyxpQkFBSDtNQUNJLFFBQUEsR0FBVyxpQkFBaUIsQ0FBQyxLQUFNLENBQUEsSUFBQSxHQUFPLEdBQVAsQ0FBVyxDQUFDLEtBQXBDLENBQTBDLFNBQUMsQ0FBRDtlQUFPLENBQUMsQ0FBQyxJQUFGLEtBQVU7TUFBakIsQ0FBMUM7TUFDWCxJQUFHLFFBQUg7UUFDSSxNQUFBLEdBQVMsUUFBUSxDQUFDLE1BRHRCO09BQUEsTUFBQTtRQUdJLE9BQU8sQ0FBQyxJQUFSLENBQWEseUNBQUEsR0FBMEMsSUFBMUMsR0FBK0MsZ0JBQS9DLEdBQStELElBQS9ELEdBQW9FLEdBQWpGLEVBSEo7T0FGSjs7QUFPQSxXQUFPO0VBYlk7OztBQWV2Qjs7Ozs7Ozs7OzswQkFTQSx5QkFBQSxHQUEyQixTQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsTUFBYjtBQUN2QixRQUFBO0lBQUEsTUFBQSxHQUFTO0lBQ1QsU0FBQSxHQUFZLFdBQVcsQ0FBQyxrQkFBWixDQUErQixzQkFBL0I7SUFDWixpQkFBQSxHQUFvQixTQUFTLENBQUMsS0FBVixDQUFnQixTQUFDLENBQUQ7YUFBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQVIsS0FBa0I7SUFBekIsQ0FBaEI7O01BQ3BCLG9CQUFxQixTQUFVLENBQUEsQ0FBQTs7SUFFL0IsSUFBRyxpQkFBSDtNQUNJLFFBQUEsR0FBVyxpQkFBaUIsQ0FBQyxLQUFNLENBQUEsSUFBQSxHQUFPLEdBQVAsQ0FBVyxDQUFDLEtBQXBDLENBQTBDLFNBQUMsQ0FBRDtlQUFPLENBQUMsQ0FBQyxJQUFGLEtBQVU7TUFBakIsQ0FBMUM7TUFDWCxJQUFHLGdCQUFIO1FBQ0ksTUFBQSxHQUFTLFFBQVEsQ0FBQyxNQUR0QjtPQUFBLE1BQUE7UUFHSSxPQUFPLENBQUMsSUFBUixDQUFhLHlDQUFBLEdBQTBDLElBQTFDLEdBQStDLGdCQUEvQyxHQUErRCxJQUEvRCxHQUFvRSxHQUFqRixFQUhKO09BRko7O0FBT0EsV0FBTztFQWJnQjs7O0FBZTNCOzs7Ozs7Ozs7MEJBUUEscUJBQUEsR0FBdUIsU0FBQyxLQUFELEVBQVEsS0FBUixFQUFlLEtBQWYsRUFBc0IsTUFBdEI7SUFDbkIsSUFBRyxLQUFBLEtBQVMsQ0FBWjthQUNJLElBQUMsQ0FBQSx5QkFBMEIsQ0FBQSxNQUFBLENBQVEsQ0FBQSxLQUFBLENBQW5DLEdBQTRDLE1BRGhEO0tBQUEsTUFFSyxJQUFHLEtBQUEsS0FBUyxDQUFaO2FBQ0QsSUFBQyxDQUFBLGVBQWdCLENBQUEsTUFBQSxJQUFRLENBQVIsQ0FBVyxDQUFBLEtBQUEsQ0FBNUIsR0FBcUMsTUFEcEM7S0FBQSxNQUFBO2FBR0QsSUFBQyxDQUFBLFdBQVksQ0FBQSxLQUFBLENBQWIsR0FBc0IsTUFIckI7O0VBSGM7OztBQVF2Qjs7Ozs7Ozs7MEJBT0EsZ0JBQUEsR0FBa0IsU0FBQyxRQUFELEVBQVcsS0FBWDtJQUNkLElBQUcsUUFBUSxDQUFDLEtBQVQsS0FBa0IsQ0FBckI7YUFDSSxJQUFDLENBQUEseUJBQTBCLENBQUEsUUFBUSxDQUFDLE1BQVQsSUFBaUIsQ0FBakIsQ0FBb0IsQ0FBQSxRQUFRLENBQUMsS0FBVCxDQUEvQyxHQUFpRSxNQURyRTtLQUFBLE1BRUssSUFBRyxRQUFRLENBQUMsS0FBVCxLQUFrQixDQUFyQjthQUNELElBQUMsQ0FBQSxlQUFnQixDQUFBLFFBQVEsQ0FBQyxNQUFULElBQWlCLENBQWpCLENBQW9CLENBQUEsUUFBUSxDQUFDLEtBQVQsQ0FBckMsR0FBdUQsTUFEdEQ7S0FBQSxNQUFBO2FBR0QsSUFBQyxDQUFBLFdBQVksQ0FBQSxRQUFRLENBQUMsS0FBVCxDQUFiLEdBQStCLE1BSDlCOztFQUhTOzs7QUFRbEI7Ozs7Ozs7OzBCQU9BLGVBQUEsR0FBaUIsU0FBQyxRQUFELEVBQVcsS0FBWDtJQUNiLElBQUcsUUFBUSxDQUFDLEtBQVQsS0FBa0IsQ0FBckI7YUFDSSxJQUFDLENBQUEsdUJBQXdCLENBQUEsUUFBUSxDQUFDLE1BQVQsSUFBaUIsQ0FBakIsQ0FBb0IsQ0FBQSxRQUFRLENBQUMsS0FBVCxDQUE3QyxHQUErRCxNQURuRTtLQUFBLE1BRUssSUFBRyxRQUFRLENBQUMsS0FBVCxLQUFrQixDQUFyQjthQUNELElBQUMsQ0FBQSxhQUFjLENBQUEsUUFBUSxDQUFDLE1BQVQsSUFBaUIsQ0FBakIsQ0FBb0IsQ0FBQSxRQUFRLENBQUMsS0FBVCxDQUFuQyxHQUFxRCxNQURwRDtLQUFBLE1BQUE7YUFHRCxJQUFDLENBQUEsU0FBVSxDQUFBLFFBQVEsQ0FBQyxLQUFULENBQVgsR0FBNkIsTUFINUI7O0VBSFE7OztBQVNqQjs7Ozs7Ozs7MEJBT0EsaUJBQUEsR0FBbUIsU0FBQyxRQUFELEVBQVcsS0FBWDtJQUNmLElBQUcsUUFBUSxDQUFDLEtBQVQsS0FBa0IsQ0FBckI7YUFDSSxJQUFDLENBQUEsMEJBQTJCLENBQUEsUUFBUSxDQUFDLE1BQVQsQ0FBaUIsQ0FBQSxRQUFRLENBQUMsS0FBVCxDQUE3QyxHQUErRCxNQURuRTtLQUFBLE1BRUssSUFBRyxRQUFRLENBQUMsS0FBVCxLQUFrQixDQUFyQjthQUNELElBQUMsQ0FBQSxnQkFBaUIsQ0FBQSxRQUFRLENBQUMsTUFBVCxDQUFpQixDQUFBLFFBQVEsQ0FBQyxLQUFULENBQW5DLEdBQXFELE1BRHBEO0tBQUEsTUFBQTthQUdELElBQUMsQ0FBQSxZQUFhLENBQUEsUUFBUSxDQUFDLEtBQVQsQ0FBZCxHQUFnQyxNQUgvQjs7RUFIVTs7O0FBUW5COzs7Ozs7Ozs7MEJBUUEsc0JBQUEsR0FBd0IsU0FBQyxLQUFELEVBQVEsS0FBUixFQUFlLEtBQWYsRUFBc0IsTUFBdEI7SUFDcEIsSUFBRyxLQUFBLEtBQVMsQ0FBWjthQUNJLElBQUMsQ0FBQSwwQkFBMkIsQ0FBQSxNQUFBLENBQVEsQ0FBQSxLQUFBLENBQXBDLEdBQTZDLE1BRGpEO0tBQUEsTUFFSyxJQUFHLEtBQUEsS0FBUyxDQUFaO2FBQ0QsSUFBQyxDQUFBLGdCQUFpQixDQUFBLE1BQUEsQ0FBUSxDQUFBLEtBQUEsQ0FBMUIsR0FBbUMsTUFEbEM7S0FBQSxNQUFBO2FBR0QsSUFBQyxDQUFBLFlBQWEsQ0FBQSxLQUFBLENBQWQsR0FBdUIsTUFIdEI7O0VBSGU7OztBQVF4Qjs7Ozs7Ozs7MEJBT0EsZ0JBQUEsR0FBa0IsU0FBQyxRQUFELEVBQVcsS0FBWDtJQUNkLElBQUcsUUFBUSxDQUFDLEtBQVQsS0FBa0IsQ0FBckI7YUFDSSxJQUFDLENBQUEseUJBQTBCLENBQUEsUUFBUSxDQUFDLE1BQVQsQ0FBaUIsQ0FBQSxRQUFRLENBQUMsS0FBVCxDQUE1QyxHQUE4RCxNQURsRTtLQUFBLE1BRUssSUFBRyxRQUFRLENBQUMsS0FBVCxLQUFrQixDQUFyQjthQUNELElBQUMsQ0FBQSxlQUFnQixDQUFBLFFBQVEsQ0FBQyxNQUFULENBQWlCLENBQUEsUUFBUSxDQUFDLEtBQVQsQ0FBbEMsR0FBb0QsTUFEbkQ7S0FBQSxNQUFBO2FBR0QsSUFBQyxDQUFBLFdBQVksQ0FBQSxRQUFRLENBQUMsS0FBVCxDQUFiLEdBQStCLE1BSDlCOztFQUhTOzs7QUFRbEI7Ozs7Ozs7OzswQkFRQSxxQkFBQSxHQUF1QixTQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWUsS0FBZixFQUFzQixNQUF0QjtJQUNuQixJQUFHLEtBQUEsS0FBUyxDQUFaO2FBQ0ksSUFBQyxDQUFBLHlCQUEwQixDQUFBLE1BQUEsQ0FBUSxDQUFBLEtBQUEsQ0FBbkMsR0FBNEMsTUFEaEQ7S0FBQSxNQUVLLElBQUcsS0FBQSxLQUFTLENBQVo7YUFDRCxJQUFDLENBQUEsZUFBZ0IsQ0FBQSxNQUFBLENBQVEsQ0FBQSxLQUFBLENBQXpCLEdBQWtDLE1BRGpDO0tBQUEsTUFBQTthQUdELElBQUMsQ0FBQSxXQUFZLENBQUEsS0FBQSxDQUFiLEdBQXNCLE1BSHJCOztFQUhjOzs7QUFRdkI7Ozs7Ozs7OzBCQU9BLFlBQUEsR0FBYyxTQUFDLE1BQUQ7QUFDVixRQUFBO0lBQUEsTUFBQSxHQUFTO0lBQ1QsSUFBRyxnQkFBQSxJQUFZLHNCQUFmO01BQ0ksSUFBRyxNQUFNLENBQUMsS0FBUCxLQUFnQixDQUFuQjtRQUNJLE1BQUEsR0FBUyxJQUFDLENBQUEsdUJBQXdCLENBQUEsTUFBTSxDQUFDLE1BQVAsQ0FBZSxDQUFBLE1BQU0sQ0FBQyxLQUFQLEVBRHJEO09BQUEsTUFFSyxJQUFHLE1BQU0sQ0FBQyxLQUFQLEtBQWdCLENBQW5CO1FBQ0QsTUFBQSxHQUFTLElBQUMsQ0FBQSxhQUFjLENBQUEsTUFBTSxDQUFDLE1BQVAsQ0FBZSxDQUFBLE1BQU0sQ0FBQyxLQUFQLEVBRHRDO09BQUEsTUFBQTtRQUdELE1BQUEsR0FBUyxJQUFDLENBQUEsU0FBVSxDQUFBLE1BQU0sQ0FBQyxLQUFQLEVBSG5CO09BSFQ7S0FBQSxNQUFBO01BUUksTUFBQSxHQUFTLE9BUmI7O0FBVUEsV0FBTyxNQUFBLElBQVU7RUFaUDs7O0FBY2Q7Ozs7Ozs7OzswQkFRQSxrQkFBQSxHQUFvQixTQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWUsTUFBZjtBQUNoQixRQUFBO0lBQUEsTUFBQSxHQUFTO0lBRVQsSUFBRyxLQUFBLEtBQVMsQ0FBWjtNQUNJLE1BQUEsR0FBUyxJQUFDLENBQUEseUJBQTBCLENBQUEsTUFBQSxDQUFRLENBQUEsS0FBQSxFQURoRDtLQUFBLE1BRUssSUFBRyxLQUFBLEtBQVMsQ0FBWjtNQUNELE1BQUEsR0FBUyxJQUFDLENBQUEsZUFBZ0IsQ0FBQSxNQUFBLENBQVEsQ0FBQSxLQUFBLEVBRGpDO0tBQUEsTUFBQTtNQUdELE1BQUEsR0FBUyxJQUFDLENBQUEsV0FBWSxDQUFBLEtBQUEsRUFIckI7O0FBS0wsV0FBTztFQVZTOzs7QUFZcEI7Ozs7Ozs7OzBCQU9BLGFBQUEsR0FBZSxTQUFDLE1BQUQ7QUFDWCxRQUFBO0lBQUEsTUFBQSxHQUFTO0lBQ1QsSUFBRyxnQkFBQSxJQUFZLHNCQUFmO01BQ0ksSUFBRyxNQUFNLENBQUMsS0FBUCxLQUFnQixDQUFuQjtRQUNJLE1BQUEsR0FBUyxJQUFDLENBQUEseUJBQTBCLENBQUEsTUFBTSxDQUFDLE1BQVAsQ0FBZSxDQUFBLE1BQU0sQ0FBQyxLQUFQLEVBRHZEO09BQUEsTUFFSyxJQUFHLE1BQU0sQ0FBQyxLQUFQLEtBQWdCLENBQW5CO1FBQ0QsTUFBQSxHQUFTLElBQUMsQ0FBQSxlQUFnQixDQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWUsQ0FBQSxNQUFNLENBQUMsS0FBUCxFQUR4QztPQUFBLE1BQUE7UUFHRCxNQUFBLEdBQVMsSUFBQyxDQUFBLFdBQVksQ0FBQSxNQUFNLENBQUMsS0FBUCxFQUhyQjtPQUhUO0tBQUEsTUFBQTtNQVNJLE1BQUEsR0FBUyxPQVRiOztBQVdBLFdBQU8sTUFBQSxJQUFVO0VBYk47OztBQWVmOzs7Ozs7OzswQkFPQSxhQUFBLEdBQWUsU0FBQyxNQUFEO0FBQ1gsUUFBQTtJQUFBLE1BQUEsR0FBUztJQUNULElBQUcsZ0JBQUEsSUFBWSxzQkFBZjtNQUNJLElBQUcsTUFBTSxDQUFDLEtBQVAsS0FBZ0IsQ0FBbkI7UUFDSSxNQUFBLEdBQVMsSUFBQyxDQUFBLHlCQUEwQixDQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWUsQ0FBQSxNQUFNLENBQUMsS0FBUCxFQUR2RDtPQUFBLE1BRUssSUFBRyxNQUFNLENBQUMsS0FBUCxLQUFnQixDQUFuQjtRQUNELE1BQUEsR0FBUyxJQUFDLENBQUEsZUFBZ0IsQ0FBQSxNQUFNLENBQUMsTUFBUCxDQUFlLENBQUEsTUFBTSxDQUFDLEtBQVAsRUFEeEM7T0FBQSxNQUFBO1FBR0QsTUFBQSxHQUFTLElBQUMsQ0FBQSxXQUFZLENBQUEsTUFBTSxDQUFDLEtBQVAsRUFIckI7T0FIVDtLQUFBLE1BQUE7TUFRSSxNQUFBLEdBQVMsT0FSYjs7QUFVQSxXQUFPLE1BQUEsSUFBVTtFQVpOOzs7QUFjZjs7Ozs7Ozs7OzBCQVFBLGtCQUFBLEdBQW9CLFNBQUMsS0FBRCxFQUFRLEtBQVIsRUFBZSxNQUFmO0FBQ2hCLFFBQUE7SUFBQSxNQUFBLEdBQVM7SUFFVCxJQUFHLEtBQUEsS0FBUyxDQUFaO01BQ0ksTUFBQSxHQUFTLElBQUMsQ0FBQSx5QkFBMEIsQ0FBQSxNQUFBLENBQVEsQ0FBQSxLQUFBLEVBRGhEO0tBQUEsTUFFSyxJQUFHLEtBQUEsS0FBUyxDQUFaO01BQ0QsTUFBQSxHQUFTLElBQUMsQ0FBQSxlQUFnQixDQUFBLE1BQUEsQ0FBUSxDQUFBLEtBQUEsRUFEakM7S0FBQSxNQUFBO01BR0QsTUFBQSxHQUFTLElBQUMsQ0FBQSxXQUFZLENBQUEsS0FBQSxFQUhyQjs7QUFLTCxXQUFPLE1BQUEsSUFBVTtFQVZEOzs7QUFZcEI7Ozs7Ozs7OzBCQU9BLGNBQUEsR0FBZ0IsU0FBQyxNQUFEO0FBQ1osUUFBQTtJQUFBLE1BQUEsR0FBUztJQUNULElBQUcsZ0JBQUEsSUFBWSxzQkFBZjtNQUNJLElBQUcsTUFBTSxDQUFDLEtBQVAsS0FBZ0IsQ0FBbkI7UUFDSSxNQUFBLEdBQVMsSUFBQyxDQUFBLDBCQUEyQixDQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWUsQ0FBQSxNQUFNLENBQUMsS0FBUCxDQUEzQyxJQUE0RCxNQUR6RTtPQUFBLE1BRUssSUFBRyxNQUFNLENBQUMsS0FBUCxLQUFnQixDQUFuQjtRQUNELE1BQUEsR0FBUyxJQUFDLENBQUEsZ0JBQWlCLENBQUEsTUFBTSxDQUFDLE1BQVAsQ0FBZSxDQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWpDLElBQWtELE1BRDFEO09BQUEsTUFBQTtRQUdELE1BQUEsR0FBUyxJQUFDLENBQUEsWUFBYSxDQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWQsSUFBK0IsTUFIdkM7T0FIVDtLQUFBLE1BQUE7TUFTSSxNQUFBLEdBQVksTUFBSCxHQUFlLElBQWYsR0FBeUIsTUFUdEM7O0FBV0EsV0FBTztFQWJLOzs7QUFlaEI7Ozs7Ozs7OzswQkFRQSxtQkFBQSxHQUFxQixTQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWUsTUFBZjtBQUNqQixRQUFBO0lBQUEsTUFBQSxHQUFTO0lBRVQsSUFBRyxLQUFBLEtBQVMsQ0FBWjtNQUNJLE1BQUEsR0FBUyxJQUFDLENBQUEseUJBQTBCLENBQUEsTUFBQSxDQUFRLENBQUEsS0FBQSxDQUFuQyxJQUE2QyxNQUQxRDtLQUFBLE1BRUssSUFBRyxLQUFBLEtBQVMsQ0FBWjtNQUNELE1BQUEsR0FBUyxJQUFDLENBQUEsZ0JBQWlCLENBQUEsTUFBQSxDQUFRLENBQUEsS0FBQSxDQUExQixJQUFvQyxNQUQ1QztLQUFBLE1BQUE7TUFHRCxNQUFBLEdBQVMsSUFBQyxDQUFBLFlBQWEsQ0FBQSxLQUFBLENBQWQsSUFBd0IsTUFIaEM7O0FBS0wsV0FBTztFQVZVOzs7Ozs7QUFZekIsRUFBRSxDQUFDLGFBQUgsR0FBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiNcbiMgICBTY3JpcHQ6IFZhcmlhYmxlU3RvcmVcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIFZhcmlhYmxlU3RvcmVcbiAgICBAb2JqZWN0Q29kZWNCbGFja0xpc3QgPSBbXCJwZXJzaXN0ZW50TnVtYmVyc1wiLCBcInBlcnNpc3RlbnRTdHJpbmdzXCIsIFwicGVyc2lzdGVudEJvb2xlYW5zXCIsIFwicGVyc2lzdGVudExpc3RzXCJdXG4gICAgXG4gICAgIyMjKlxuICAgICogPHA+QSBzdG9yYWdlIGZvciBkaWZmZXJlbnQga2luZCBvZiBnYW1lIHZhcmlhYmxlcy4gVGhlIGZvbGxvd2luZyBzY29wZXNcbiAgICAqIGZvciB2YXJpYWJsZXMgZXhpc3Q6PC9wPlxuICAgICogXG4gICAgKiAtIExvY2FsIFZhcmlhYmxlcyAtPiBPbmx5IHZhbGlkIGZvciB0aGUgY3VycmVudCBzY2VuZS5cbiAgICAqIC0gR2xvYmFsIFZhcmlhYmxlcyAtPiBWYWxpZCBmb3IgdGhlIHdob2xlIGdhbWUgYnV0IGJvdW5kIHRvIGEgc2luZ2xlIHNhdmUtZ2FtZS5cbiAgICAqIC0gUGVyc2lzdGVudCBWYXJpYWJsZXMgLT4gVmFsaWQgZm9yIHRoZSB3aG9sZSBnYW1lIGluZGVwZW50ZW50IGZyb20gdGhlIHNhdmUtZ2FtZXMuXG4gICAgKiBcbiAgICAqIDxwPlRoZSBmb2xsb3dpbmcgZGF0YS10eXBlcyBleGlzdDo8L3A+XG4gICAgKiAtIFN0cmluZ3MgLT4gVmFyaWFibGVzIHN0b3JpbmcgdGV4dCBkYXRhLlxuICAgICogLSBOdW1iZXJzIC0+IFZhcmlhYmxlcyBzdG9yaW5nIGludGVnZXIgbnVtYmVyIHZhbHVlcy5cbiAgICAqIC0gQm9vbGVhbnMgLT4gVmFyaWFibGVzIHN0b3JpbmcgYm9vbGVhbiB2YWx1ZXMuIChDYWxsZWQgXCJTd2l0Y2hlc1wiIGZvciBlYXNpZXIgdW5kZXJzdGFuZGluZylcbiAgICAqIC0gTGlzdHMgLT4gVmFyaWFibGVzIHN0b3JpbmcgbXVsdGlwbGUgb3RoZXIgdmFyaWFibGVzLiBMaXN0cyBjYW4gYWxzbyBjb250YWluIExpc3RzLlxuICAgICogPHA+XG4gICAgKiBMb2NhbCB2YXJpYWJsZXMgYXJlIHN0b3JlZCBieSBzY2VuZSBVSUQuIEZvciBlYWNoIHNjZW5lIFVJRCBhIGxpc3Qgb2YgbG9jYWwgdmFyaWFibGVzIGlzIHN0b3JlZC48L3A+XG4gICAgKiBcbiAgICAqIDxwPkdsb2JhbCBhbmQgcGVyc2lzdGVudCB2YXJpYWJsZXMgYXJlIHN0b3JlZCBhbmQgYSBzcGVjaWZpYyBkb21haW4uIEEgZG9tYWluIGlzIGp1c3QgYSB1bmlxdWUgbmFtZSBzdWNoXG4gICAgKiBhcyA8aT5jb20uZXhhbXBsZS5nYW1lPC9pPiBmb3IgZXhhbXBsZS4gVGhlIGRlZmF1bHQgZG9tYWluIGlzIGFuIGVtcHR5IHN0cmluZy4gRG9tYWlucyBhcmUgdXNlZnVsIHRvIGF2b2lkXG4gICAgKiBvdmVybGFwcGluZyBvZiB2YXJpYWJsZSBudW1iZXJzIHdoZW4gc2hhcmluZyBjb250ZW50IHdpdGggb3RoZXIgdXNlcnMuIDwvcD5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgVmFyaWFibGVTdG9yZVxuICAgICogQG1lbWJlcm9mIGdzXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogKCkgLT5cbiAgICAgICAgIyMjKlxuICAgICAgICAqIEN1cnJlbnQgbG9jYWwgdmFyaWFibGUgY29udGV4dFxuICAgICAgICAqIEBwcm9wZXJ0eSBjb250ZXh0XG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjI1xuICAgICAgICBAY29udGV4dCA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBDdXJyZW50IGRvbWFpbiBmb3IgZ2xvYmFsIGFuZCBwZXJzaXN0ZW50IHZhcmlhYmxlcy4gRWFjaCBkb21haW4gaGFzIGl0cyBvd25cbiAgICAgICAgKiB2YXJpYWJsZXMuIFBsZWFzZSB1c2UgPGI+Y2hhbmdlRG9tYWluPC9iPiBtZXRob2QgdG8gY2hhbmdlIHRoZSBkb21haW4uXG4gICAgICAgICogQHByb3BlcnR5IGRvbWFpblxuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAjIyNcbiAgICAgICAgQGRvbWFpbiA9IFwiXCJcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBMaXN0IG9mIGF2YWlsYWJsZSBkb21haW5zIGZvciBnbG9iYWwgYW5kIHBlcnNpc3RlbnQgdmFyaWFibGVzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBkb21haW5zXG4gICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAgIyMjXG4gICAgICAgIEBkb21haW5zID0gW1wiXCJdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIGdsb2JhbCBudW1iZXIgdmFyaWFibGVzIG9mIHRoZSBjdXJyZW50IGRvbWFpbi5cbiAgICAgICAgKiBAcHJvcGVydHkgbnVtYmVyc1xuICAgICAgICAqIEB0eXBlIG51bWJlcltdXG4gICAgICAgICMjI1xuICAgICAgICBAbnVtYmVycyA9IG51bGxcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBnbG9iYWwgYm9vbGVhbiB2YXJpYWJsZXMgb2YgdGhlIGN1cnJlbnQgZG9tYWluLlxuICAgICAgICAqIEBwcm9wZXJ0eSBib29sZWFuc1xuICAgICAgICAqIEB0eXBlIGJvb2xlYW5bXVxuICAgICAgICAjIyNcbiAgICAgICAgQGJvb2xlYW5zID0gbnVsbFxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIGdsb2JhbCBzdHJpbmcgdmFyaWFibGVzIG9mIHRoZSBjdXJyZW50IGRvbWFpbi5cbiAgICAgICAgKiBAcHJvcGVydHkgc3RyaW5nc1xuICAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgICMjI1xuICAgICAgICBAc3RyaW5ncyA9IG51bGxcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBnbG9iYWwgbGlzdCB2YXJpYWJsZXMgb2YgdGhlIGN1cnJlbnQgZG9tYWluLlxuICAgICAgICAqIEBwcm9wZXJ0eSBsaXN0c1xuICAgICAgICAqIEB0eXBlIE9iamVjdFtdW11cbiAgICAgICAgIyMjXG4gICAgICAgIEBsaXN0cyA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgc3RvcmFnZSBvZiBhbGwgZ2xvYmFsIHZhcmlhYmxlcyBieSBkb21haW4uXG4gICAgICAgICogQHByb3BlcnR5IGdsb2JhbFZhcmlhYmxlc0J5RG9tYWluXG4gICAgICAgICogQHR5cGUgT2JqZWN0W11bXVxuICAgICAgICAjIyNcbiAgICAgICAgQGdsb2JhbFZhcmlhYmxlc0J5RG9tYWluID0ge31cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgc3RvcmFnZSBvZiBhbGwgcGVyc2lzdGVudCB2YXJpYWJsZXMgYnkgZG9tYWluLlxuICAgICAgICAqIEBwcm9wZXJ0eSBwZXJzaXN0ZW50VmFyaWFibGVzQnlEb21haW5cbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVtdXG4gICAgICAgICMjI1xuICAgICAgICBAcGVyc2lzdGVudFZhcmlhYmxlc0J5RG9tYWluID0ge31cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgcGVyc2lzdGVudCBudW1iZXIgdmFyaWFibGVzIG9mIHRoZSBjdXJyZW50IGRvbWFpbi5cbiAgICAgICAgKiBAcHJvcGVydHkgcGVyc2lzdGVudE51bWJlcnNcbiAgICAgICAgKiBAdHlwZSBudW1iZXJbXVxuICAgICAgICAjIyNcbiAgICAgICAgQHBlcnNpc3RlbnROdW1iZXJzID0gW11cbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBwZXJzaXN0ZW50IHN0cmluZyB2YXJpYWJsZXMgb2YgdGhlIGN1cnJlbnQgZG9tYWluLlxuICAgICAgICAqIEBwcm9wZXJ0eSBwZXJzaXN0ZW50U3RyaW5nc1xuICAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgICMjI1xuICAgICAgICBAcGVyc2lzdGVudFN0cmluZ3MgPSBbXVxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIHBlcnNpc3RlbnQgYm9vbGVhbiB2YXJpYWJsZXMgb2YgdGhlIGN1cnJlbnQgZG9tYWluLlxuICAgICAgICAqIEBwcm9wZXJ0eSBwZXJzaXN0ZW50Qm9vbGVhbnNcbiAgICAgICAgKiBAdHlwZSBib29sZWFuW11cbiAgICAgICAgIyMjXG4gICAgICAgIEBwZXJzaXN0ZW50Qm9vbGVhbnMgPSBbXVxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIHBlcnNpc3RlbnQgbGlzdCB2YXJpYWJsZXMgb2YgdGhlIGN1cnJlbnQgZG9tYWluLlxuICAgICAgICAqIEBwcm9wZXJ0eSBwZXJzaXN0ZW50TGlzdHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVtdXG4gICAgICAgICMjI1xuICAgICAgICBAcGVyc2lzdGVudExpc3RzID0gW11cbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBsb2NhbCBudW1iZXIgdmFyaWFibGVzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBsb2NhbE51bWJlcnNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjXG4gICAgICAgIEBsb2NhbE51bWJlcnMgPSB7fVxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIGxvY2FsIHN0cmluZyB2YXJpYWJsZXMuXG4gICAgICAgICogQHByb3BlcnR5IGxvY2FsU3RyaW5nc1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyNcbiAgICAgICAgQGxvY2FsU3RyaW5ncyA9IHt9XG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgbG9jYWwgYm9vbGVhbiB2YXJpYWJsZXMuXG4gICAgICAgICogQHByb3BlcnR5IGxvY2FsQm9vbGVhbnNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjXG4gICAgICAgIEBsb2NhbEJvb2xlYW5zID0ge31cbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBsb2NhbCBsaXN0IHZhcmlhYmxlcy5cbiAgICAgICAgKiBAcHJvcGVydHkgbG9jYWxMaXN0c1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyNcbiAgICAgICAgQGxvY2FsTGlzdHMgPSB7fVxuICAgICAgICAjIyMqXG4gICAgICAgICogQHByb3BlcnR5IHRlbXBOdW1iZXJzXG4gICAgICAgICogQHR5cGUgbnVtYmVyW11cbiAgICAgICAgIyMjXG4gICAgICAgIEB0ZW1wTnVtYmVycyA9IG51bGxcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEBwcm9wZXJ0eSB0ZW1wU3RyaW5nc1xuICAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgICMjI1xuICAgICAgICBAdGVtcFN0cmluZ3MgPSBudWxsXG4gICAgICAgICMjIypcbiAgICAgICAgKiBAcHJvcGVydHkgbG9jYWxCb29sZWFuc1xuICAgICAgICAqIEB0eXBlIG51bWJlcltdXG4gICAgICAgICMjI1xuICAgICAgICBAdGVtcEJvb2xlYW5zID0gbnVsbFxuICAgICAgICAjIyMqXG4gICAgICAgICogQHByb3BlcnR5IGxvY2FsTGlzdHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVtdXG4gICAgICAgICMjI1xuICAgICAgICBAdGVtcExpc3RzID0gbnVsbFxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgZG9tYWlucyA9IERhdGFNYW5hZ2VyLmdldERvY3VtZW50c0J5VHlwZShcImdsb2JhbF92YXJpYWJsZXNcIikuc2VsZWN0IChkKSAtPiBkLml0ZW1zLmRvbWFpblxuICAgICAgICBcbiAgICAgICAgZm9yIGRvbWFpbiwgaSBpbiBkb21haW5zXG4gICAgICAgICAgICBAbnVtYmVyc0J5RG9tYWluW2RvbWFpbl0gPSBAbnVtYmVyc0J5RG9tYWluW2ldXG4gICAgICAgICAgICBAc3RyaW5nc0J5RG9tYWluW2RvbWFpbl0gPSBAc3RyaW5nc0J5RG9tYWluW2ldXG4gICAgICAgICAgICBAYm9vbGVhbnNCeURvbWFpbltkb21haW5dID0gQGJvb2xlYW5zQnlEb21haW5baV1cbiAgICAgICAgICAgIEBsaXN0c0J5RG9tYWluW2RvbWFpbl0gPSBAbGlzdHNCeURvbWFpbltpXVxuICAgICAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICBcbiAgICBzZXR1cEdsb2JhbERvbWFpbnM6ICgpIC0+XG4gICAgICAgIEBudW1iZXJzQnlEb21haW4gPSBbXVxuICAgICAgICBAc3RyaW5nc0J5RG9tYWluID0gW11cbiAgICAgICAgQGJvb2xlYW5zQnlEb21haW4gPSBbXVxuICAgICAgICBAbGlzdHNCeURvbWFpbiA9IFtdXG4gICAgICAgIFxuICAgICAgICBmb3IgZG9tYWluLCBpIGluIEBkb21haW5zXG4gICAgICAgICAgICBAbnVtYmVyc0J5RG9tYWluW2ldID0gbmV3IEFycmF5KDEwMDApXG4gICAgICAgICAgICBAbnVtYmVyc0J5RG9tYWluW2RvbWFpbl0gPSBAbnVtYmVyc0J5RG9tYWluW2ldXG4gICAgICAgICAgICBAc3RyaW5nc0J5RG9tYWluW2ldID0gbmV3IEFycmF5KDEwMDApXG4gICAgICAgICAgICBAc3RyaW5nc0J5RG9tYWluW2RvbWFpbl0gPSBAc3RyaW5nc0J5RG9tYWluW2ldXG4gICAgICAgICAgICBAYm9vbGVhbnNCeURvbWFpbltpXSA9IG5ldyBBcnJheSgxMDAwKVxuICAgICAgICAgICAgQGJvb2xlYW5zQnlEb21haW5bZG9tYWluXSA9IEBib29sZWFuc0J5RG9tYWluW2ldXG4gICAgICAgICAgICBAbGlzdHNCeURvbWFpbltpXSA9IG5ldyBBcnJheSgxMDAwKVxuICAgICAgICAgICAgQGxpc3RzQnlEb21haW5bZG9tYWluXSA9IEBsaXN0c0J5RG9tYWluW2ldXG4gICAgICAgICAgICBcbiAgICAgICAgQG51bWJlcnMgPSBAbnVtYmVyc0J5RG9tYWluWzBdXG4gICAgICAgIEBzdHJpbmdzID0gQHN0cmluZ3NCeURvbWFpblswXVxuICAgICAgICBAYm9vbGVhbnMgPSBAYm9vbGVhbnNCeURvbWFpblswXVxuICAgICAgICBAbGlzdHMgPSBAbnVtYmVyc0J5RG9tYWluWzBdXG4gICAgICAgIFxuICAgIHNldHVwUGVyc2lzdGVudERvbWFpbnM6IChkb21haW5zKSAtPlxuICAgICAgICBAcGVyc2lzdGVudE51bWJlcnNCeURvbWFpbiA9IHt9XG4gICAgICAgIEBwZXJzaXN0ZW50U3RyaW5nc0J5RG9tYWluID0ge31cbiAgICAgICAgQHBlcnNpc3RlbnRCb29sZWFuc0J5RG9tYWluID0ge31cbiAgICAgICAgQHBlcnNpc3RlbnRMaXN0c0J5RG9tYWluID0ge31cbiAgICAgICAgXG4gICAgICAgIGZvciBkb21haW4sIGkgaW4gQGRvbWFpbnNcbiAgICAgICAgICAgIEBwZXJzaXN0ZW50TnVtYmVyc0J5RG9tYWluW2ldID0gbmV3IEFycmF5KDEwKVxuICAgICAgICAgICAgQHBlcnNpc3RlbnROdW1iZXJzQnlEb21haW5bZG9tYWluXSA9IEBwZXJzaXN0ZW50TnVtYmVyc1tpXVxuICAgICAgICAgICAgQHBlcnNpc3RlbnRTdHJpbmdzQnlEb21haW5baV0gPSBuZXcgQXJyYXkoMTApXG4gICAgICAgICAgICBAcGVyc2lzdGVudFN0cmluZ3NCeURvbWFpbltkb21haW5dID0gQHBlcnNpc3RlbnRTdHJpbmdzW2ldXG4gICAgICAgICAgICBAcGVyc2lzdGVudEJvb2xlYW5zQnlEb21haW5baV0gPSBuZXcgQXJyYXkoMTApXG4gICAgICAgICAgICBAcGVyc2lzdGVudEJvb2xlYW5zQnlEb21haW5bZG9tYWluXSA9IEBwZXJzaXN0ZW50Qm9vbGVhbnNbaV1cbiAgICAgICAgICAgIEBwZXJzaXN0ZW50TGlzdHNCeURvbWFpbltpXSA9IG5ldyBBcnJheSgxMClcbiAgICAgICAgICAgIEBwZXJzaXN0ZW50TGlzdHNCeURvbWFpbltkb21haW5dID0gQHBlcnNpc3RlbnRMaXN0c1tpXVxuICAgICAgICBcbiAgICAgICAgQHBlcnNpc3RlbnROdW1iZXJzID0gQHBlcnNpc3RlbnROdW1iZXJzQnlEb21haW5bMF1cbiAgICAgICAgQHBlcnNpc3RlbnRTdHJpbmdzID0gQHBlcnNpc3RlbnRTdHJpbmdzQnlEb21haW5bMF1cbiAgICAgICAgQHBlcnNpc3RlbnRCb29sZWFucyA9IEBwZXJzaXN0ZW50Qm9vbGVhbnNCeURvbWFpblswXVxuICAgICAgICBAcGVyc2lzdGVudExpc3RzID0gQHBlcnNpc3RlbnRMaXN0c0J5RG9tYWluWzBdXG4gICAgICAgICAgICBcbiAgICBzZXR1cERvbWFpbnM6IChkb21haW5zKSAtPlxuICAgICAgICBAZG9tYWlucyA9IGRvbWFpbnNcbiAgICAgICAgQHNldHVwR2xvYmFsRG9tYWlucygpXG4gICAgICAgIEBzZXR1cFBlcnNpc3RlbnREb21haW5zKClcbiAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBDaGFuZ2VzIHRoZSBjdXJyZW50IGRvbWFpbi5cbiAgICAqXG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICogQG1ldGhvZCBjaGFuZ2VEb21haW5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb21haW4gLSBUaGUgZG9tYWluIHRvIGNoYW5nZSB0by5cbiAgICAjIyMgXG4gICAgY2hhbmdlRG9tYWluOiAoZG9tYWluKSAtPlxuICAgICAgICBAZG9tYWluID0gZG9tYWluXG4gICAgICAgIGdsb2JhbFZhcmlhYmxlcyA9IEBnbG9iYWxWYXJpYWJsZXNCeURvbWFpbltkb21haW5dXG4gICAgICAgIHBlcnNpc3RlbnRWYXJpYWJsZXMgPSBAcGVyc2lzdGVudFZhcmlhYmxlc0J5RG9tYWluW2RvbWFpbl1cbiAgICAgICAgXG4gICAgICAgIGlmICFnbG9iYWxWYXJpYWJsZXNcbiAgICAgICAgICAgIGdsb2JhbFZhcmlhYmxlcyA9IEBnbG9iYWxWYXJpYWJsZXNCeURvbWFpbltkb21haW5dID0geyBudW1iZXJzOiBuZXcgQXJyYXkoNTAwKSwgc3RyaW5nczogbmV3IEFycmF5KDUwMCksIGJvb2xlYW5zOiBuZXcgQXJyYXkoNTAwKSwgbGlzdHM6IG5ldyBBcnJheSg1MDApIH1cbiAgICAgICAgaWYgIXBlcnNpc3RlbnRWYXJpYWJsZXNcbiAgICAgICAgICAgIHBlcnNpc3RlbnRWYXJpYWJsZXMgPSBAcGVyc2lzdGVudFZhcmlhYmxlc0J5RG9tYWluW2RvbWFpbl0gPSB7IG51bWJlcnM6IG5ldyBBcnJheSg1MDApLCBzdHJpbmdzOiBuZXcgQXJyYXkoNTAwKSwgYm9vbGVhbnM6IG5ldyBBcnJheSg1MDApLCBsaXN0czogbmV3IEFycmF5KDUwMCkgfSAgICBcbiAgICAgICAgXG4gICAgICAgIEBudW1iZXJzID0gZ2xvYmFsVmFyaWFibGVzLm51bWJlcnNcbiAgICAgICAgQHN0cmluZ3MgPSBnbG9iYWxWYXJpYWJsZXMuc3RyaW5nc1xuICAgICAgICBAYm9vbGVhbnMgPSBnbG9iYWxWYXJpYWJsZXMuYm9vbGVhbnNcbiAgICAgICAgQGxpc3RzID0gZ2xvYmFsVmFyaWFibGVzLmxpc3RzXG4gICAgICAgIEBwZXJzaXN0ZW50TnVtYmVycyA9IHBlcnNpc3RlbnRWYXJpYWJsZXMubnVtYmVyc1xuICAgICAgICBAcGVyc2lzdGVudEJvb2xlYW5zID0gcGVyc2lzdGVudFZhcmlhYmxlcy5ib29sZWFuc1xuICAgICAgICBAcGVyc2lzdGVudFN0cmluZ3MgPSBwZXJzaXN0ZW50VmFyaWFibGVzLnN0cmluZ3NcbiAgICAgICAgQHBlcnNpc3RlbnRMaXN0cyA9IHBlcnNpc3RlbnRWYXJpYWJsZXMubGlzdHNcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQ2xlYXJzIGFsbCBnbG9iYWwgdmFyaWFibGVzXG4gICAgKlxuICAgICogQG1ldGhvZCBjbGVhckdsb2JhbFZhcmlhYmxlc1xuICAgICMjIyBcbiAgICBjbGVhckFsbEdsb2JhbFZhcmlhYmxlczogLT5cbiAgICAgICAgQHNldHVwR2xvYmFsRG9tYWlucygpXG4gICAgICAgIHJldHVyblxuICAgICAgICBcbiAgICAgICAgZ2xvYmFsVmFyaWFibGVzID0gQGdsb2JhbFZhcmlhYmxlc0J5RG9tYWluW0Bkb21haW5dXG4gICAgICAgIEBudW1iZXJzQnlEb21haW4gPSBuZXcgQXJyYXkoMTAwMClcbiAgICAgICAgZ2xvYmFsVmFyaWFibGVzLmJvb2xlYW5zID0gbmV3IEFycmF5KDEwMDApXG4gICAgICAgIGdsb2JhbFZhcmlhYmxlcy5zdHJpbmdzID0gbmV3IEFycmF5KDEwMDApXG4gICAgXG4gICAgICAgIEBudW1iZXJzID0gZ2xvYmFsVmFyaWFibGVzLm51bWJlcnNcbiAgICAgICAgQHN0cmluZ3MgPSBnbG9iYWxWYXJpYWJsZXMuc3RyaW5nc1xuICAgICAgICBAYm9vbGVhbnMgPSBnbG9iYWxWYXJpYWJsZXMuYm9vbGVhbnNcbiAgICBcbiAgICAjIyMqXG4gICAgKiBDbGVhcnMgYWxsIGxvY2FsIHZhcmlhYmxlcyBmb3IgYWxsIGNvbnRleHRzL3NjZW5lcy9jb21tb24tZXZlbnRzLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2xlYXJBbGxMb2NhbFZhcmlhYmxlc1xuICAgICMjIyBcbiAgICBjbGVhckFsbExvY2FsVmFyaWFibGVzOiAtPlxuICAgICAgICBAbG9jYWxOdW1iZXJzID0ge31cbiAgICAgICAgQGxvY2FsU3RyaW5ncyA9IHt9XG4gICAgICAgIEBsb2NhbEJvb2xlYW5zID0ge31cbiAgICAgICAgQGxvY2FsTGlzdHMgPSB7fVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBDbGVhcnMgc3BlY2lmaWVkIHZhcmlhYmxlcy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNsZWFyVmFyaWFibGVzXG4gICAgKiBAcGFyYW0ge251bWJlcltdfSBudW1iZXJzIC0gVGhlIG51bWJlciB2YXJpYWJsZXMgdG8gY2xlYXIuXG4gICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzdHJpbmdzIC0gVGhlIHN0cmluZyB2YXJpYWJsZXMgdG8gY2xlYXIuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW5bXX0gYm9vbGVhbnMgLSBUaGUgYm9vbGVhbiB2YXJpYWJsZXMgdG8gY2xlYXIuXG4gICAgKiBAcGFyYW0ge0FycmF5W119IGxpc3RzIC0gVGhlIGxpc3QgdmFyaWFibGVzIHRvIGNsZWFyLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBEZXRlcm1pbmVzIHdoYXQga2luZCBvZiB2YXJpYWJsZXMgc2hvdWxkIGJlIGNsZWFyZWQuXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+MCA9IEFsbDwvbGk+XG4gICAgKiA8bGk+MSA9IFN3aXRjaGVzIC8gQm9vbGVhbnM8L2xpPlxuICAgICogPGxpPjIgPSBOdW1iZXJzPC9saT5cbiAgICAqIDxsaT4zID0gVGV4dHM8L2xpPlxuICAgICogPGxpPjQgPSBMaXN0czwvbGk+XG4gICAgKiA8L3VsPlxuICAgICogQHBhcmFtIHtPYmplY3R9IHJhbmdlIC0gVGhlIHZhcmlhYmxlIGlkLXJhbmdlIHRvIGNsZWFyLiBJZiA8Yj5udWxsPC9iPiBhbGwgc3BlY2lmaWVkIHZhcmlhYmxlcyBhcmUgY2xlYXJlZC5cbiAgICAjIyMgIFxuICAgIGNsZWFyVmFyaWFibGVzOiAobnVtYmVycywgc3RyaW5ncywgYm9vbGVhbnMsIGxpc3RzLCB0eXBlLCByYW5nZSkgLT5cbiAgICAgICAgc3dpdGNoIHR5cGVcbiAgICAgICAgICAgIHdoZW4gMCAjIEFsbFxuICAgICAgICAgICAgICAgIG51bWJlcnM/LmZpbGwoMCwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZClcbiAgICAgICAgICAgICAgICBzdHJpbmdzPy5maWxsKFwiXCIsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpXG4gICAgICAgICAgICAgICAgYm9vbGVhbnM/LmZpbGwoZmFsc2UsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpXG4gICAgICAgICAgICAgICAgbGlzdHM/LmZpbGwoW10sIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpXG4gICAgICAgICAgICB3aGVuIDEgIyBTd2l0Y2hcbiAgICAgICAgICAgICAgICBib29sZWFucz8uZmlsbChmYWxzZSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZClcbiAgICAgICAgICAgIHdoZW4gMiAjIE51bWJlclxuICAgICAgICAgICAgICAgIG51bWJlcnM/LmZpbGwoMCwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZClcbiAgICAgICAgICAgIHdoZW4gMyAjIFRleHRcbiAgICAgICAgICAgICAgICBzdHJpbmdzPy5maWxsKFwiXCIsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpXG4gICAgICAgICAgICB3aGVuIDQgIyBMaXN0XG4gICAgICAgICAgICAgICAgbGlzdHM/LmZpbGwoW10sIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpXG4gICAgICAgICAgICAgICAgXG4gICAgIyMjKlxuICAgICogQ2xlYXJzIGFsbCBsb2NhbCB2YXJpYWJsZXMgZm9yIGEgc3BlY2lmaWVkIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIG5vdCBzcGVjaWZpZWQsIGFsbFxuICAgICogbG9jYWwgdmFyaWFibGVzIGZvciBhbGwgY29udGV4dHMvc2NlbmVzL2NvbW1vbi1ldmVudHMgYXJlIGNsZWFyZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCBjbGVhckxvY2FsVmFyaWFibGVzXG4gICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAtIFRoZSBjb250ZXh0IHRvIGNsZWFyIHRoZSBsb2NhbCB2YXJpYWJsZXMgZm9yLiBJZiA8Yj5udWxsPC9iPiwgYWxsXG4gICAgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIERldGVybWluZXMgd2hhdCBraW5kIG9mIHZhcmlhYmxlcyBzaG91bGQgYmUgY2xlYXJlZC5cbiAgICAqIDx1bD5cbiAgICAqIDxsaT4wID0gQWxsPC9saT5cbiAgICAqIDxsaT4xID0gU3dpdGNoZXMgLyBCb29sZWFuczwvbGk+XG4gICAgKiA8bGk+MiA9IE51bWJlcnM8L2xpPlxuICAgICogPGxpPjMgPSBUZXh0czwvbGk+XG4gICAgKiA8bGk+NCA9IExpc3RzPC9saT5cbiAgICAqIDwvdWw+XG4gICAgKiBAcGFyYW0ge09iamVjdH0gcmFuZ2UgLSBUaGUgdmFyaWFibGUgaWQtcmFuZ2UgdG8gY2xlYXIuIElmIDxiPm51bGw8L2I+IGFsbCB2YXJpYWJsZXMgYXJlIGNsZWFyZWQuXG4gICAgIyMjICBcbiAgICBjbGVhckxvY2FsVmFyaWFibGVzOiAoY29udGV4dCwgdHlwZSwgcmFuZ2UpIC0+XG4gICAgICAgIGlmIGNvbnRleHQ/XG4gICAgICAgICAgICBpZHMgPSBbY29udGV4dC5pZF1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWRzID0gT2JqZWN0LmtleXMoQGxvY2FsTnVtYmVycylcbiAgICAgICAgICAgIFxuICAgICAgICBpZiByYW5nZT9cbiAgICAgICAgICAgIHJhbmdlID0gc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCArIDFcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmFuZ2UgPSBzdGFydDogMCwgZW5kOiBudWxsXG4gICAgICAgICAgICBcbiAgICAgICAgZm9yIGlkIGluIGlkc1xuICAgICAgICAgICAgQGNsZWFyVmFyaWFibGVzKEBsb2NhbE51bWJlcnNbaWRdLCBAbG9jYWxTdHJpbmdzW2lkXSwgQGxvY2FsQm9vbGVhbnNbaWRdLCBAbG9jYWxMaXN0c1tpZF0sIHR5cGUsIHJhbmdlKVxuIFxuICAgICMjIypcbiAgICAqIENsZWFycyBnbG9iYWwgdmFyaWFibGVzLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2xlYXJHbG9iYWxWYXJpYWJsZXNcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gRGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2YgdmFyaWFibGVzIHNob3VsZCBiZSBjbGVhcmVkLlxuICAgICogPHVsPlxuICAgICogPGxpPjAgPSBBbGw8L2xpPlxuICAgICogPGxpPjEgPSBTd2l0Y2hlcyAvIEJvb2xlYW5zPC9saT5cbiAgICAqIDxsaT4yID0gTnVtYmVyczwvbGk+XG4gICAgKiA8bGk+MyA9IFRleHRzPC9saT5cbiAgICAqIDxsaT40ID0gTGlzdHM8L2xpPlxuICAgICogPC91bD5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSByYW5nZSAtIFRoZSB2YXJpYWJsZSBpZC1yYW5nZSB0byBjbGVhci4gSWYgPGI+bnVsbDwvYj4gYWxsIHZhcmlhYmxlcyBhcmUgY2xlYXJlZC5cbiAgICAjIyMgXG4gICAgY2xlYXJHbG9iYWxWYXJpYWJsZXM6ICh0eXBlLCByYW5nZSkgLT5cbiAgICAgICAgaWYgcmFuZ2U/XG4gICAgICAgICAgICByYW5nZSA9IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQgKyAxXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJhbmdlID0gc3RhcnQ6IDAsIGVuZDogbnVsbFxuICAgICAgICAgICAgXG4gICAgICAgIEBjbGVhclZhcmlhYmxlcyhAbnVtYmVycywgQHN0cmluZ3MsIEBib29sZWFucywgQGxpc3RzLCB0eXBlLCByYW5nZSlcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQ2xlYXJzIHBlcnNpc3RlbnQgdmFyaWFibGVzLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2xlYXJQZXJzaXN0ZW50VmFyaWFibGVzXG4gICAgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIERldGVybWluZXMgd2hhdCBraW5kIG9mIHZhcmlhYmxlcyBzaG91bGQgYmUgY2xlYXJlZC5cbiAgICAqIDx1bD5cbiAgICAqIDxsaT4wID0gQWxsPC9saT5cbiAgICAqIDxsaT4xID0gU3dpdGNoZXMgLyBCb29sZWFuczwvbGk+XG4gICAgKiA8bGk+MiA9IE51bWJlcnM8L2xpPlxuICAgICogPGxpPjMgPSBUZXh0czwvbGk+XG4gICAgKiA8bGk+NCA9IExpc3RzPC9saT5cbiAgICAqIDwvdWw+XG4gICAgKiBAcGFyYW0ge09iamVjdH0gcmFuZ2UgLSBUaGUgdmFyaWFibGUgaWQtcmFuZ2UgdG8gY2xlYXIuIElmIDxiPm51bGw8L2I+IGFsbCB2YXJpYWJsZXMgYXJlIGNsZWFyZWQuXG4gICAgIyMjIFxuICAgIGNsZWFyUGVyc2lzdGVudFZhcmlhYmxlczogKHR5cGUsIHJhbmdlKSAtPlxuICAgICAgICBpZiByYW5nZT9cbiAgICAgICAgICAgIHJhbmdlID0gc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCArIDFcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmFuZ2UgPSBzdGFydDogMCwgZW5kOiBudWxsXG4gICAgICAgICAgICBcbiAgICAgICAgQGNsZWFyVmFyaWFibGVzKEBwZXJzaXN0ZW50TnVtYmVycywgQHBlcnNpc3RlbnRzdHJpbmdzLCBAcGVyc2lzdGVudEJvb2xlYW5zLCBAcGVyc2lzdGVudExpc3RzLCB0eXBlLCByYW5nZSlcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogSW5pdGlhbGl6ZXMgdGhlIHZhcmlhYmxlcy4gU2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgY29udGV4dCBjaGFuZ2VzLiAoTGlrZSBhZnRlciBhIHNjZW5lIGNoYW5nZSlcbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwXG4gICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAtIFRoZSBjb250ZXh0KGN1cnJlbnQgc2NlbmUpIG5lZWRlZCBmb3IgbG9jYWwgdmFyaWFibGVzLiBOZWVkcyBoYXZlIGF0IGxlYXN0IGFuIGlkLXByb3BlcnR5LlxuICAgICMjIyAgICAgXG4gICAgc2V0dXA6IChjb250ZXh0KSAtPlxuICAgICAgICBAc2V0dXBMb2NhbFZhcmlhYmxlcyhjb250ZXh0KVxuICAgICAgICBAc2V0dXBUZW1wVmFyaWFibGVzKGNvbnRleHQpXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogSW5pdGlhbGl6ZXMgdGhlIGxvY2FsIHZhcmlhYmxlcyBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0LiBTaG91bGQgYmUgY2FsbGVkIG9uIGZpcnN0IHRpbWUgdXNlLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0dXBMb2NhbFZhcmlhYmxlc1xuICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgLSBUaGUgY29udGV4dChjdXJyZW50IHNjZW5lKS4gTmVlZHMgaGF2ZSBhdCBsZWFzdCBhbiBpZC1wcm9wZXJ0eS5cbiAgICAjIyNcbiAgICBzZXR1cExvY2FsVmFyaWFibGVzOiAoY29udGV4dCkgLT5cbiAgICAgICAgQHNldHVwVmFyaWFibGVzKGNvbnRleHQsIFwibG9jYWxOdW1iZXJzXCIsIDApXG4gICAgICAgIEBzZXR1cFZhcmlhYmxlcyhjb250ZXh0LCBcImxvY2FsU3RyaW5nc1wiLCBcIlwiKVxuICAgICAgICBAc2V0dXBWYXJpYWJsZXMoY29udGV4dCwgXCJsb2NhbEJvb2xlYW5zXCIsIG5vKVxuICAgICAgICBAc2V0dXBWYXJpYWJsZXMoY29udGV4dCwgXCJsb2NhbExpc3RzXCIsIFtdKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBJbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIGtpbmQgb2YgdmFyaWFibGVzLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0dXBWYXJpYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IC0gVGhlIGNvbnRleHQoY3VycmVudCBzY2VuZSkuIE5lZWRzIGhhdmUgYXQgbGVhc3QgYW4gaWQtcHJvcGVydHkuXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUga2luZCBvZiB2YXJpYWJsZXMgKHByb3BlcnR5LW5hbWUpLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRWYWx1ZSAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLlxuICAgICMjIyAgXG4gICAgc2V0dXBWYXJpYWJsZXM6IChjb250ZXh0LCBwcm9wZXJ0eSwgZGVmYXVsdFZhbHVlKSAtPlxuICAgICAgICBpZiBub3QgdGhpc1twcm9wZXJ0eV1bY29udGV4dC5pZF0/XG4gICAgICAgICAgICB0aGlzW3Byb3BlcnR5XVtjb250ZXh0LmlkXSA9IFtdXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogSW5pdGlhbGl6ZXMgdGhlIGN1cnJlbnQgdGVtcCB2YXJpYWJsZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29udGV4dC4gU2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgY29udGV4dCBjaGFuZ2VkLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0dXBUZW1wVmFyaWFibGVzXG4gICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAtIFRoZSBjb250ZXh0KGN1cnJlbnQgc2NlbmUpLiBOZWVkcyBoYXZlIGF0IGxlYXN0IGFuIGlkLXByb3BlcnR5LlxuICAgICMjIyAgICBcbiAgICBzZXR1cFRlbXBWYXJpYWJsZXM6IChjb250ZXh0KSAtPlxuICAgICAgICBAY29udGV4dCA9IGNvbnRleHRcbiAgICAgICAgaWYgIUBsb2NhbE51bWJlcnNbY29udGV4dC5pZF1cbiAgICAgICAgICAgIEBzZXR1cExvY2FsVmFyaWFibGVzKGNvbnRleHQpXG4gICAgICAgICAgICBcbiAgICAgICAgQHRlbXBOdW1iZXJzID0gQGxvY2FsTnVtYmVyc1tjb250ZXh0LmlkXVxuICAgICAgICBAdGVtcFN0cmluZ3MgPSBAbG9jYWxTdHJpbmdzW2NvbnRleHQuaWRdXG4gICAgICAgIEB0ZW1wQm9vbGVhbnMgPSBAbG9jYWxCb29sZWFuc1tjb250ZXh0LmlkXVxuICAgICAgICBAdGVtcExpc3RzID0gQGxvY2FsTGlzdHNbY29udGV4dC5pZF1cbiAgICAgICAgXG4gICAgY2xlYXJUZW1wVmFyaWFibGVzOiAoY29udGV4dCkgLT5cbiAgICAgICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgaW5kZXggZm9yIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gSWYgYSB2YXJpYWJsZSB3aXRoIHRoYXRcbiAgICAqIG5hbWUgY2Fubm90IGJlIGZvdW5kLCB0aGUgaW5kZXggd2lsbCBiZSAwLlxuICAgICpcbiAgICAqIEBtZXRob2QgaW5kZXhPZlRlbXBWYXJpYWJsZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gZ2V0IHRoZSBpbmRleCBmb3IuXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG5hbWU6IG51bWJlciwgc3RyaW5nLCBib29sZWFuIG9yIGxpc3QuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc2NvcGUgLSBUaGUgdmFyaWFibGUgc2NvcGU6IDAgPSBsb2NhbCwgMSA9IGdsb2JhbCwgMiA9IHBlcnNpc3RlbnQuXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gZG9tYWluIC0gVGhlIHZhcmlhYmxlIGRvbWFpbiB0byBzZWFyY2ggaW4uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGRvbWFpbiB3aWxsIGJlIHVzZWQuXG4gICAgIyMjICBcbiAgICBpbmRleE9mVmFyaWFibGU6IChuYW1lLCB0eXBlLCBzY29wZSwgZG9tYWluKSAtPlxuICAgICAgICByZXN1bHQgPSAwXG4gICAgICAgIFxuICAgICAgICBzd2l0Y2ggc2NvcGVcbiAgICAgICAgICAgIHdoZW4gMCAjIExvY2FsXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gQGluZGV4T2ZUZW1wVmFyaWFibGUobmFtZSwgdHlwZSlcbiAgICAgICAgICAgIHdoZW4gMSAjIEdsb2JhbFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEBpbmRleE9mR2xvYmFsVmFyaWFibGUobmFtZSwgdHlwZSwgZG9tYWluKVxuICAgICAgICAgICAgd2hlbiAyICMgUGVyc2lzdGVudFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEBpbmRleE9mUGVyc2lzdGVudFZhcmlhYmxlKG5hbWUsIHR5cGUsIGRvbWFpbilcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgdGhlIGluZGV4IGZvciB0aGUgbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIElmIGEgdmFyaWFibGUgd2l0aCB0aGF0XG4gICAgKiBuYW1lIGNhbm5vdCBiZSBmb3VuZCwgdGhlIGluZGV4IHdpbGwgYmUgMC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGluZGV4T2ZUZW1wVmFyaWFibGVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGdldCB0aGUgaW5kZXggZm9yLlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBuYW1lOiBudW1iZXIsIHN0cmluZywgYm9vbGVhbiBvciBsaXN0LlxuICAgICMjIyAgXG4gICAgaW5kZXhPZlRlbXBWYXJpYWJsZTogKG5hbWUsIHR5cGUpIC0+XG4gICAgICAgIHJlc3VsdCA9IDBcbiAgICAgICAgXG4gICAgICAgIGlmIEBjb250ZXh0Py5vd25lclxuICAgICAgICAgICAgaWYgQGNvbnRleHQub3duZXIuc2NlbmVEb2N1bWVudFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gQGNvbnRleHQub3duZXIuc2NlbmVEb2N1bWVudC5pdGVtc1t0eXBlICsgXCJWYXJpYWJsZXNcIl0uZmlyc3QgKHYpIC0+IHYubmFtZSA9PSBuYW1lXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFyaWFibGUuaW5kZXggaWYgdmFyaWFibGU/XG4gICAgICAgICAgICBlbHNlIGlmIEBjb250ZXh0Lm93bmVyW3R5cGUgKyBcIlZhcmlhYmxlc1wiXVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gQGNvbnRleHQub3duZXJbdHlwZSArIFwiVmFyaWFibGVzXCJdLmZpcnN0ICh2KSAtPiB2Lm5hbWUgPT0gbmFtZVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIHZhcmlhYmxlP1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YXJpYWJsZS5pbmRleFxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVmFyaWFibGUgcmVmZXJlbmNlZCBieSBuYW1lIG5vdCBmb3VuZDogXCIgKyBuYW1lICtcIihsb2NhbCwgXCIrdHlwZStcIilcIilcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgaW5kZXggZm9yIHRoZSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIElmIGEgdmFyaWFibGUgd2l0aCB0aGF0XG4gICAgKiBuYW1lIGNhbm5vdCBiZSBmb3VuZCwgdGhlIGluZGV4IHdpbGwgYmUgMC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGluZGV4T2ZUZW1wVmFyaWFibGVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGdldCB0aGUgaW5kZXggZm9yLlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBuYW1lOiBudW1iZXIsIHN0cmluZywgYm9vbGVhbiBvciBsaXN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGRvbWFpbiAtIFRoZSB2YXJpYWJsZSBkb21haW4gdG8gc2VhcmNoIGluLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBkb21haW4gd2lsbCBiZSB1c2VkLlxuICAgICMjIyAgXG4gICAgaW5kZXhPZkdsb2JhbFZhcmlhYmxlOiAobmFtZSwgdHlwZSwgZG9tYWluKSAtPlxuICAgICAgICByZXN1bHQgPSAwXG4gICAgICAgIHZhcmlhYmxlcyA9IERhdGFNYW5hZ2VyLmdldERvY3VtZW50c0J5VHlwZShcImdsb2JhbF92YXJpYWJsZXNcIilcbiAgICAgICAgdmFyaWFibGVzRG9jdW1lbnQgPSB2YXJpYWJsZXMuZmlyc3QgKHYpIC0+IHYuaXRlbXMuZG9tYWluID09IGRvbWFpblxuICAgICAgICB2YXJpYWJsZXNEb2N1bWVudCA/PSB2YXJpYWJsZXNbMF1cbiAgICAgICAgXG4gICAgICAgIGlmIHZhcmlhYmxlc0RvY3VtZW50XG4gICAgICAgICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlc0RvY3VtZW50Lml0ZW1zW3R5cGUgKyBcInNcIl0uZmlyc3QgKHYpIC0+IHYubmFtZSA9PSBuYW1lXG4gICAgICAgICAgICBpZiB2YXJpYWJsZVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhcmlhYmxlLmluZGV4IFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlZhcmlhYmxlIHJlZmVyZW5jZWQgYnkgbmFtZSBub3QgZm91bmQ6ICN7bmFtZX0gKHBlcnNpc3RlbnQsICN7dHlwZX0pXCIpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgaW5kZXggZm9yIHRoZSBwZXJzaXN0ZW50IHZhcmlhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBJZiBhIHZhcmlhYmxlIHdpdGggdGhhdFxuICAgICogbmFtZSBjYW5ub3QgYmUgZm91bmQsIHRoZSBpbmRleCB3aWxsIGJlIDAuXG4gICAgKlxuICAgICogQG1ldGhvZCBpbmRleE9mVGVtcFZhcmlhYmxlXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBnZXQgdGhlIGluZGV4IGZvci5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgbmFtZTogbnVtYmVyLCBzdHJpbmcsIGJvb2xlYW4gb3IgbGlzdC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb21haW4gLSBUaGUgdmFyaWFibGUgZG9tYWluIHRvIHNlYXJjaCBpbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgZG9tYWluIHdpbGwgYmUgdXNlZC5cbiAgICAjIyMgICAgICBcbiAgICBpbmRleE9mUGVyc2lzdGVudFZhcmlhYmxlOiAobmFtZSwgdHlwZSwgZG9tYWluKSAtPlxuICAgICAgICByZXN1bHQgPSAwXG4gICAgICAgIHZhcmlhYmxlcyA9IERhdGFNYW5hZ2VyLmdldERvY3VtZW50c0J5VHlwZShcInBlcnNpc3RlbnRfdmFyaWFibGVzXCIpXG4gICAgICAgIHZhcmlhYmxlc0RvY3VtZW50ID0gdmFyaWFibGVzLmZpcnN0ICh2KSAtPiB2Lml0ZW1zLmRvbWFpbiA9PSBkb21haW5cbiAgICAgICAgdmFyaWFibGVzRG9jdW1lbnQgPz0gdmFyaWFibGVzWzBdXG4gICAgICAgIFxuICAgICAgICBpZiB2YXJpYWJsZXNEb2N1bWVudFxuICAgICAgICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZXNEb2N1bWVudC5pdGVtc1t0eXBlICsgXCJzXCJdLmZpcnN0ICh2KSAtPiB2Lm5hbWUgPT0gbmFtZVxuICAgICAgICAgICAgaWYgdmFyaWFibGU/XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFyaWFibGUuaW5kZXggXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVmFyaWFibGUgcmVmZXJlbmNlZCBieSBuYW1lIG5vdCBmb3VuZDogI3tuYW1lfSAocGVyc2lzdGVudCwgI3t0eXBlfSlcIilcbiAgICAgICAgXG4gICAgICAgIHJldHVybiByZXN1bHQgICAgXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBudW1iZXIgdmFyaWFibGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldE51bWJlclZhbHVlQXRJbmRleFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNjb3BlIC0gVGhlIHZhcmlhYmxlIHNjb3BlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgdmFyaWFibGUncyBpbmRleC5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgIyMjICAgICBcbiAgICBzZXROdW1iZXJWYWx1ZUF0SW5kZXg6IChzY29wZSwgaW5kZXgsIHZhbHVlLCBkb21haW4pIC0+XG4gICAgICAgIGlmIHNjb3BlID09IDJcbiAgICAgICAgICAgIEBwZXJzaXN0ZW50TnVtYmVyc0J5RG9tYWluW2RvbWFpbl1baW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZSBpZiBzY29wZSA9PSAxXG4gICAgICAgICAgICBAbnVtYmVyc0J5RG9tYWluW2RvbWFpbnx8MF1baW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQHRlbXBOdW1iZXJzW2luZGV4XSA9IHZhbHVlXG5cbiAgICAjIyMqXG4gICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBudW1iZXIgdmFyaWFibGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXROdW1iZXJWYWx1ZUF0SW5kZXhcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YXJpYWJsZSAtIFRoZSB2YXJpYWJsZSB0byBzZXQuIFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICAjIyMgICAgIFxuICAgIHNldE51bWJlclZhbHVlVG86ICh2YXJpYWJsZSwgdmFsdWUpIC0+XG4gICAgICAgIGlmIHZhcmlhYmxlLnNjb3BlID09IDJcbiAgICAgICAgICAgIEBwZXJzaXN0ZW50TnVtYmVyc0J5RG9tYWluW3ZhcmlhYmxlLmRvbWFpbnx8MF1bdmFyaWFibGUuaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZSBpZiB2YXJpYWJsZS5zY29wZSA9PSAxXG4gICAgICAgICAgICBAbnVtYmVyc0J5RG9tYWluW3ZhcmlhYmxlLmRvbWFpbnx8MF1bdmFyaWFibGUuaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQHRlbXBOdW1iZXJzW3ZhcmlhYmxlLmluZGV4XSA9IHZhbHVlXG5cbiAgICAjIyMqXG4gICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBsaXN0IHZhcmlhYmxlLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0TGlzdE9iamVjdFRvXG4gICAgKiBAcGFyYW0ge09iamVjdH0gdmFyaWFibGUgLSBUaGUgdmFyaWFibGUgdG8gc2V0LiBcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgIyMjICAgICAgICAgICAgIFxuICAgIHNldExpc3RPYmplY3RUbzogKHZhcmlhYmxlLCB2YWx1ZSkgLT5cbiAgICAgICAgaWYgdmFyaWFibGUuc2NvcGUgPT0gMlxuICAgICAgICAgICAgQHBlcnNpc3RlbnRMaXN0c0J5RG9tYWluW3ZhcmlhYmxlLmRvbWFpbnx8MF1bdmFyaWFibGUuaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZSBpZiB2YXJpYWJsZS5zY29wZSA9PSAxXG4gICAgICAgICAgICBAbGlzdHNCeURvbWFpblt2YXJpYWJsZS5kb21haW58fDBdW3ZhcmlhYmxlLmluZGV4XSA9IHZhbHVlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEB0ZW1wTGlzdHNbdmFyaWFibGUuaW5kZXhdID0gdmFsdWVcblxuICAgIFxuICAgICMjIypcbiAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIGJvb2xlYW4gdmFyaWFibGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXRCb29sZWFuVmFsdWVUb1xuICAgICogQHBhcmFtIHtPYmplY3R9IHZhcmlhYmxlIC0gVGhlIHZhcmlhYmxlIHRvIHNldC4gXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICAjIyMgICAgICAgICAgICAgICBcbiAgICBzZXRCb29sZWFuVmFsdWVUbzogKHZhcmlhYmxlLCB2YWx1ZSkgLT5cbiAgICAgICAgaWYgdmFyaWFibGUuc2NvcGUgPT0gMlxuICAgICAgICAgICAgQHBlcnNpc3RlbnRCb29sZWFuc0J5RG9tYWluW3ZhcmlhYmxlLmRvbWFpbl1bdmFyaWFibGUuaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZSBpZiB2YXJpYWJsZS5zY29wZSA9PSAxXG4gICAgICAgICAgICBAYm9vbGVhbnNCeURvbWFpblt2YXJpYWJsZS5kb21haW5dW3ZhcmlhYmxlLmluZGV4XSA9IHZhbHVlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEB0ZW1wQm9vbGVhbnNbdmFyaWFibGUuaW5kZXhdID0gdmFsdWVcbiAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBib29sZWFuIHZhcmlhYmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXRCb29sZWFuVmFsdWVBdEluZGV4XG4gICAgKiBAcGFyYW0ge251bWJlcn0gc2NvcGUgLSBUaGUgdmFyaWFibGUgc2NvcGUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgdmFyaWFibGUncyBpbmRleC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICMjIyAgICAgXG4gICAgc2V0Qm9vbGVhblZhbHVlQXRJbmRleDogKHNjb3BlLCBpbmRleCwgdmFsdWUsIGRvbWFpbikgLT5cbiAgICAgICAgaWYgc2NvcGUgPT0gMlxuICAgICAgICAgICAgQHBlcnNpc3RlbnRCb29sZWFuc0J5RG9tYWluW2RvbWFpbl1baW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZSBpZiBzY29wZSA9PSAxXG4gICAgICAgICAgICBAYm9vbGVhbnNCeURvbWFpbltkb21haW5dW2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEB0ZW1wQm9vbGVhbnNbaW5kZXhdID0gdmFsdWVcblxuICAgICMjIypcbiAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHN0cmluZyB2YXJpYWJsZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldFN0cmluZ1ZhbHVlVG9cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YXJpYWJsZSAtIFRoZSB2YXJpYWJsZSB0byBzZXQuIFxuICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICAjIyMgICBcbiAgICBzZXRTdHJpbmdWYWx1ZVRvOiAodmFyaWFibGUsIHZhbHVlKSAtPlxuICAgICAgICBpZiB2YXJpYWJsZS5zY29wZSA9PSAyXG4gICAgICAgICAgICBAcGVyc2lzdGVudFN0cmluZ3NCeURvbWFpblt2YXJpYWJsZS5kb21haW5dW3ZhcmlhYmxlLmluZGV4XSA9IHZhbHVlXG4gICAgICAgIGVsc2UgaWYgdmFyaWFibGUuc2NvcGUgPT0gMVxuICAgICAgICAgICAgQHN0cmluZ3NCeURvbWFpblt2YXJpYWJsZS5kb21haW5dW3ZhcmlhYmxlLmluZGV4XSA9IHZhbHVlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEB0ZW1wU3RyaW5nc1t2YXJpYWJsZS5pbmRleF0gPSB2YWx1ZVxuICAgICAgICAgICAgXG4gICAgIyMjKlxuICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN0cmluZyB2YXJpYWJsZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0U3RyaW5nVmFsdWVBdEluZGV4XG4gICAgKiBAcGFyYW0ge251bWJlcn0gc2NvcGUgLSBUaGUgdmFyaWFibGUgc2NvcGUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgdmFyaWFibGUncyBpbmRleC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgIyMjICAgICBcbiAgICBzZXRTdHJpbmdWYWx1ZUF0SW5kZXg6IChzY29wZSwgaW5kZXgsIHZhbHVlLCBkb21haW4pIC0+XG4gICAgICAgIGlmIHNjb3BlID09IDJcbiAgICAgICAgICAgIEBwZXJzaXN0ZW50U3RyaW5nc0J5RG9tYWluW2RvbWFpbl1baW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZSBpZiBzY29wZSA9PSAxXG4gICAgICAgICAgICBAc3RyaW5nc0J5RG9tYWluW2RvbWFpbl1baW5kZXhdID0gdmFsdWVcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQHRlbXBTdHJpbmdzW2luZGV4XSA9IHZhbHVlXG5cbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBsaXN0IHZhcmlhYmxlLlxuICAgICpcbiAgICAqIEBtZXRob2QgbGlzdE9iamVjdE9mXG4gICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIGxpc3QtdmFyaWFibGUvb2JqZWN0IHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGxpc3Qtb2JqZWN0LlxuICAgICMjIyAgIFxuICAgIGxpc3RPYmplY3RPZjogKG9iamVjdCkgLT5cbiAgICAgICAgcmVzdWx0ID0gMFxuICAgICAgICBpZiBvYmplY3Q/IGFuZCBvYmplY3QuaW5kZXg/XG4gICAgICAgICAgICBpZiBvYmplY3Quc2NvcGUgPT0gMlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEBwZXJzaXN0ZW50TGlzdHNCeURvbWFpbltvYmplY3QuZG9tYWluXVtvYmplY3QuaW5kZXhdXG4gICAgICAgICAgICBlbHNlIGlmIG9iamVjdC5zY29wZSA9PSAxXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gQGxpc3RzQnlEb21haW5bb2JqZWN0LmRvbWFpbl1bb2JqZWN0LmluZGV4XVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEB0ZW1wTGlzdHNbb2JqZWN0LmluZGV4XVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQgPSBvYmplY3RcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IFtdXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBudW1iZXIgdmFyaWFibGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG51bWJlclZhbHVlQXRJbmRleFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNjb3BlIC0gVGhlIHZhcmlhYmxlIHNjb3BlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHZhcmlhYmxlJ3MgaW5kZXguXG4gICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBudW1iZXIgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLlxuICAgICMjIyAgICAgIFxuICAgIG51bWJlclZhbHVlQXRJbmRleDogKHNjb3BlLCBpbmRleCwgZG9tYWluKSAtPlxuICAgICAgICByZXN1bHQgPSAwXG4gICAgICAgIFxuICAgICAgICBpZiBzY29wZSA9PSAyXG4gICAgICAgICAgICByZXN1bHQgPSBAcGVyc2lzdGVudE51bWJlcnNCeURvbWFpbltkb21haW5dW2luZGV4XVxuICAgICAgICBlbHNlIGlmIHNjb3BlID09IDFcbiAgICAgICAgICAgIHJlc3VsdCA9IEBudW1iZXJzQnlEb21haW5bZG9tYWluXVtpbmRleF1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzdWx0ID0gQHRlbXBOdW1iZXJzW2luZGV4XVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBudW1iZXIgdmFyaWFibGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBudW1iZXJWYWx1ZU9mXG4gICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIHZhcmlhYmxlIHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG51bWJlciB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuXG4gICAgIyMjICAgICBcbiAgICBudW1iZXJWYWx1ZU9mOiAob2JqZWN0KSAtPlxuICAgICAgICByZXN1bHQgPSAwXG4gICAgICAgIGlmIG9iamVjdD8gYW5kIG9iamVjdC5pbmRleD9cbiAgICAgICAgICAgIGlmIG9iamVjdC5zY29wZSA9PSAyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gQHBlcnNpc3RlbnROdW1iZXJzQnlEb21haW5bb2JqZWN0LmRvbWFpbl1bb2JqZWN0LmluZGV4XVxuICAgICAgICAgICAgZWxzZSBpZiBvYmplY3Quc2NvcGUgPT0gMVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEBudW1iZXJzQnlEb21haW5bb2JqZWN0LmRvbWFpbl1bb2JqZWN0LmluZGV4XVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEB0ZW1wTnVtYmVyc1tvYmplY3QuaW5kZXhdXG5cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzdWx0ID0gb2JqZWN0XG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCAwXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgc3RyaW5nIHZhcmlhYmxlLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc3RyaW5nVmFsdWVPZlxuICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAtIFRoZSB2YXJpYWJsZSB0byBnZXQgdGhlIHZhbHVlIGZyb20uXG4gICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLlxuICAgICMjIyAgICAgICAgXG4gICAgc3RyaW5nVmFsdWVPZjogKG9iamVjdCkgLT5cbiAgICAgICAgcmVzdWx0ID0gXCJcIlxuICAgICAgICBpZiBvYmplY3Q/IGFuZCBvYmplY3QuaW5kZXg/XG4gICAgICAgICAgICBpZiBvYmplY3Quc2NvcGUgPT0gMlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEBwZXJzaXN0ZW50U3RyaW5nc0J5RG9tYWluW29iamVjdC5kb21haW5dW29iamVjdC5pbmRleF1cbiAgICAgICAgICAgIGVsc2UgaWYgb2JqZWN0LnNjb3BlID09IDFcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBAc3RyaW5nc0J5RG9tYWluW29iamVjdC5kb21haW5dW29iamVjdC5pbmRleF1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBAdGVtcFN0cmluZ3Nbb2JqZWN0LmluZGV4XVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQgPSBvYmplY3RcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IFwiXCJcbiAgICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzdHJpbmcgdmFyaWFibGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHN0cmluZ1ZhbHVlQXRJbmRleFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNjb3BlIC0gVGhlIHZhcmlhYmxlIHNjb3BlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHZhcmlhYmxlJ3MgaW5kZXguXG4gICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLlxuICAgICMjIyAgICAgICAgXG4gICAgc3RyaW5nVmFsdWVBdEluZGV4OiAoc2NvcGUsIGluZGV4LCBkb21haW4pIC0+XG4gICAgICAgIHJlc3VsdCA9IFwiXCJcbiAgICAgICAgXG4gICAgICAgIGlmIHNjb3BlID09IDJcbiAgICAgICAgICAgIHJlc3VsdCA9IEBwZXJzaXN0ZW50U3RyaW5nc0J5RG9tYWluW2RvbWFpbl1baW5kZXhdXG4gICAgICAgIGVsc2UgaWYgc2NvcGUgPT0gMVxuICAgICAgICAgICAgcmVzdWx0ID0gQHN0cmluZ3NCeURvbWFpbltkb21haW5dW2luZGV4XVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQgPSBAdGVtcFN0cmluZ3NbaW5kZXhdXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBcIlwiXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgYm9vbGVhbiB2YXJpYWJsZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGJvb2xlYW5WYWx1ZU9mXG4gICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIHZhcmlhYmxlIHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIHZhcmlhYmxlLlxuICAgICMjIyAgICAgICBcbiAgICBib29sZWFuVmFsdWVPZjogKG9iamVjdCkgLT5cbiAgICAgICAgcmVzdWx0ID0gbm9cbiAgICAgICAgaWYgb2JqZWN0PyBhbmQgb2JqZWN0LmluZGV4P1xuICAgICAgICAgICAgaWYgb2JqZWN0LnNjb3BlID09IDJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBAcGVyc2lzdGVudEJvb2xlYW5zQnlEb21haW5bb2JqZWN0LmRvbWFpbl1bb2JqZWN0LmluZGV4XSB8fCBub1xuICAgICAgICAgICAgZWxzZSBpZiBvYmplY3Quc2NvcGUgPT0gMVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEBib29sZWFuc0J5RG9tYWluW29iamVjdC5kb21haW5dW29iamVjdC5pbmRleF0gfHwgbm9cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBAdGVtcEJvb2xlYW5zW29iamVjdC5pbmRleF0gfHwgbm9cblxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQgPSBpZiBvYmplY3QgdGhlbiB0cnVlIGVsc2UgZmFsc2VcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgYm9vbGVhbiB2YXJpYWJsZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICpcbiAgICAqIEBtZXRob2QgYm9vbGVhblZhbHVlQXRJbmRleFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNjb3BlIC0gVGhlIHZhcmlhYmxlIHNjb3BlLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHZhcmlhYmxlJ3MgaW5kZXguXG4gICAgKiBAcmV0dXJuIHtib29sZWFufSBUaGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuXG4gICAgIyMjICAgICAgICBcbiAgICBib29sZWFuVmFsdWVBdEluZGV4OiAoc2NvcGUsIGluZGV4LCBkb21haW4pIC0+XG4gICAgICAgIHJlc3VsdCA9IG5vXG4gICAgICAgIFxuICAgICAgICBpZiBzY29wZSA9PSAyXG4gICAgICAgICAgICByZXN1bHQgPSBAcGVyc2lzdGVuQm9vbGVhbnNCeURvbWFpbltkb21haW5dW2luZGV4XSB8fCBub1xuICAgICAgICBlbHNlIGlmIHNjb3BlID09IDFcbiAgICAgICAgICAgIHJlc3VsdCA9IEBib29sZWFuc0J5RG9tYWluW2RvbWFpbl1baW5kZXhdIHx8IG5vXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdCA9IEB0ZW1wQm9vbGVhbnNbaW5kZXhdIHx8IG5vXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICBcbmdzLlZhcmlhYmxlU3RvcmUgPSBWYXJpYWJsZVN0b3JlIl19\n//# sourceURL=VariableStore_82.js", "parentId": "2EC9F946K6417A4973S8308E368608E89B8B" }, "summary": [ "name", "type", "order" ] } |