1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{
"uid": "AB1D7471K9AA5A4790SA69CEB8BEC017E46A",
"isLoaded": true,
"lastModificationTime": 0,
"items": {
"name": "Component_EventEmitter",
"type": "game_script",
"order": 15,
"content": "# ===================================================================\n#\n# Script: Component_EventEmitter\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_EventEmitter extends gs.Component\n #@objectCodecBlackList = [\"handlers\"]\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 for k of @handlers\n list = @handlers[k]\n for i in [0...list.length]\n handlers = list[i]\n j = 0\n while j < handlers.length\n handler = handlers[j]\n \n if !handler.handler or !handler.handler.$vnm_cb\n handlers.splice(j, 1)\n else \n j++\n \n #@handlers = {}\n return null\n ###*\n * A component which allow a game object to fire events and manage a list\n * of observers.\n *\n * @module gs\n * @class Component_EventEmitter\n * @extends gs.Component\n * @memberof gs\n ###\n constructor: ->\n super\n \n ###*\n * List of registered observers.\n *\n * @property handlers\n * @type Object\n * @private\n ###\n @handlers = {}\n \n ###*\n * @property defaultData\n * @type Object\n * @private\n ###\n @defaultData = {}\n \n ###*\n * @property chainInfo\n * @type Object\n * @private\n ###\n @chainInfo = {}\n \n ###*\n * @property needsSort\n * @type boolean\n * @private\n ###\n @needsSort = {}\n \n ###*\n * @property markedForRemove\n * @type Object[]\n * @private\n ###\n @markedForRemove = []\n \n ###*\n * @property isEmitting\n * @type number\n * @private\n ###\n @isEmitting = 0\n \n ###*\n * Clears the event emitter by removing all handlers/listeners.\n *\n * @method clear\n ### \n clear: ->\n @needsSort = {}\n @handlers = {}\n @defaultData = {}\n \n ###*\n * Adds a new observer/listener for a specified event.\n *\n * @method on\n * @param {string} eventName - The event name.\n * @param {function} handler - The handler-function called when the event is fired.\n * @param {Object} [data={}] - An optional info-object passed to the handler-function.\n * @param {Object} [owner=null] - An optional owner-object associated with the observer/listener.\n * @param {number} priority - An optional priority level. An observer/listener with a higher level will receive the event before observers/listeners with a lower level.\n * @return {gs.EventObserver} - The added observer-object.\n ### \n on: (eventName, handler, data, owner, priority) ->\n priority = priority || 0\n @needsSort[eventName] = true\n if not @handlers[eventName]?\n @handlers[eventName] = []\n if not @handlers[eventName][priority]\n @handlers[eventName][priority] = []\n \n handlerObject = { handler: handler, once: no, data: data, owner: owner, eventName: eventName, priority: priority }\n @handlers[eventName][priority].push(handlerObject)\n \n return handlerObject\n \n ###*\n * Adds a new observer/listener for a specified event and removes it\n * after the even has been emitted once.\n *\n * @method once\n * @param {string} eventName - The event name.\n * @param {function} handler - The handler-function called when the event is fired.\n * @param {Object} [data={}] - An optional info-object passed to the handler-function.\n * @param {Object} [owner=null] - An optional owner-object associated with the observer/listener.\n * @param {number} priority - An optional priority level. An observer/listener with a higher level will receive the event before observers/listeners with a lower level.\n * @return {gs.EventObserver} - The added observer-object.\n ### \n once: (eventName, handler, data, owner, priority) ->\n handlerObject = @on(eventName, handler, data, owner, priority)\n handlerObject.once = yes\n \n return handlerObject\n \n ###*\n * Removes an observer/listener from a specified event. If handler parameter\n * is null, all observers for the specified event are removed.\n *\n * @method off\n * @param {string} eventName - The event name.\n * @param {gs.EventObserver} [handler=null] - The observer-object to remove. \n * If null, all observers for the specified event are removed.\n ### \n off: (eventName, handler) ->\n if @isEmitting > 0 and handler\n @markedForRemove.push(handler)\n else if handler?\n @handlers[eventName]?[handler.priority]?.remove(handler)\n else\n @handlers[eventName] = []\n \n ###*\n * Removes all observers/listeners from an event which are belonging to the specified\n * owner.\n *\n * @method offByOwner\n * @param {string} eventName - The event name.\n * @param {Object} owner - The owner.\n * @return {number} Count of removed observers/listeners.\n ###\n offByOwner: (eventName, owner) ->\n if @handlers[eventName]\n if @isEmitting > 0\n for handlerList in @handlers[eventName]\n handlers = handlerList?.where (x) -> x.owner == owner\n for handler in handlers\n @markedForRemove.push(handler)\n else\n for handlerList in @handlers[eventName]\n handlerList.removeAll((x) -> x.owner == owner)\n \n ###*\n * Emits the specified event. All observers/listeners registered for the\n * specified event are informed.\n *\n * @method emit\n * @param {string} eventName - The name of the event to fire.\n * @param {Object} [sender=null] - The sender of the event.\n * @param {Object} [data={}] - An optional object passed to each handler-function.\n ### \n emit: (eventName, sender, data) ->\n handlerLists = @handlers[eventName]\n data = data ? {} #@defaultData\n \n if handlerLists and @needsSort[eventName]\n @needsSort[eventName] = no\n for handlerList in handlerLists\n handlerList.sort (a, b) ->\n if a.owner and b.owner\n if a.owner.rIndex > b.owner.rIndex\n return -1\n else if a.owner.rIndex < b.owner.rIndex\n return 1\n else\n return 0\n else\n return -1\n \n if handlerLists?\n for handlerList in handlerLists by -1\n if !handlerList then continue\n i = 0\n count = handlerList.length\n @isEmitting++\n while i < count\n handler = handlerList[i]\n \n data.handler = handler\n data.sender = sender\n data.data = handler.data\n \n if !handler.owner or !handler.owner.visible? or handler.owner.visible\n handler.handler(data) \n \n if handler.once\n @markedForRemove.push(handler)\n \n if data.breakChain\n break\n \n i++\n @isEmitting--\n if data.breakChain\n data.breakChain = no\n break\n \n if !@isEmitting and @markedForRemove.length > 0\n for handler in @markedForRemove\n @handlers[handler.eventName][handler.priority].remove(handler)\n @markedForRemove = []\n \n \n return null\n \n \n\n ###*\n * Checks if an event-handler with a specified owner exists for the\n * given event.\n *\n * @method checkForOwner\n * @param {string} eventName - The event name.\n * @param {function} owner - The owner to search for.\n * @return {boolean} If <b>true</b>, an event-handler with the specified owner\n * exists for the given event. Otherwise <b>false</b>.\n ### \n checkForOwner: (eventName, owner) ->\n result = no\n \n for handler in @handlers[eventName]\n if handler.owner == owner\n result = yes\n break\n \n return result\n \n ###*\n * Checks if an event-handler with a specified handler-function exists for the\n * given event.\n *\n * @method checkForHandlerFunction\n * @param {string} eventName - The event name.\n * @param {function} handlerFunction - The handler-function to search for.\n * @return {boolean} If true, an observer witht he specified handler-function\n * exists for the given event. Otherwise false.\n ### \n checkForHandlerFunction: (eventName, handlerFunction) -> \n result = no\n \n if handlerFunction?\n for handler in @handlers[eventName]\n if handler.handler == handlerFunction\n result = yes\n break\n \n return result\n \n ###*\n * Not implemented yet.\n * @method update\n ### \n # FIXME: Why should event-emitter influence the active-property?\n update: ->\n @object.active = @object.active and (!@object.parent or @object.parent.active)\n \ngs.Component_EventEmitter = Component_EventEmitter\ngs.EventEmitter = Component_EventEmitter\ngs.GlobalEventManager = new Component_EventEmitter()",
"parentId": "D3325122KACDEA4515SB731E37A42B9D779F",
"folder": false,
"compiledContent": "var Component_EventEmitter,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nComponent_EventEmitter = (function(superClass) {\n extend(Component_EventEmitter, superClass);\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 Component_EventEmitter.prototype.onDataBundleRestore = function(data, context) {\n var handler, handlers, i, j, k, l, list, ref;\n for (k in this.handlers) {\n list = this.handlers[k];\n for (i = l = 0, ref = list.length; 0 <= ref ? l < ref : l > ref; i = 0 <= ref ? ++l : --l) {\n handlers = list[i];\n j = 0;\n while (j < handlers.length) {\n handler = handlers[j];\n if (!handler.handler || !handler.handler.$vnm_cb) {\n handlers.splice(j, 1);\n } else {\n j++;\n }\n }\n }\n }\n return null;\n };\n\n\n /**\n * A component which allow a game object to fire events and manage a list\n * of observers.\n *\n * @module gs\n * @class Component_EventEmitter\n * @extends gs.Component\n * @memberof gs\n */\n\n function Component_EventEmitter() {\n Component_EventEmitter.__super__.constructor.apply(this, arguments);\n\n /**\n * List of registered observers.\n *\n * @property handlers\n * @type Object\n * @private\n */\n this.handlers = {};\n\n /**\n * @property defaultData\n * @type Object\n * @private\n */\n this.defaultData = {};\n\n /**\n * @property chainInfo\n * @type Object\n * @private\n */\n this.chainInfo = {};\n\n /**\n * @property needsSort\n * @type boolean\n * @private\n */\n this.needsSort = {};\n\n /**\n * @property markedForRemove\n * @type Object[]\n * @private\n */\n this.markedForRemove = [];\n\n /**\n * @property isEmitting\n * @type number\n * @private\n */\n this.isEmitting = 0;\n }\n\n\n /**\n * Clears the event emitter by removing all handlers/listeners.\n *\n * @method clear\n */\n\n Component_EventEmitter.prototype.clear = function() {\n this.needsSort = {};\n this.handlers = {};\n return this.defaultData = {};\n };\n\n\n /**\n * Adds a new observer/listener for a specified event.\n *\n * @method on\n * @param {string} eventName - The event name.\n * @param {function} handler - The handler-function called when the event is fired.\n * @param {Object} [data={}] - An optional info-object passed to the handler-function.\n * @param {Object} [owner=null] - An optional owner-object associated with the observer/listener.\n * @param {number} priority - An optional priority level. An observer/listener with a higher level will receive the event before observers/listeners with a lower level.\n * @return {gs.EventObserver} - The added observer-object.\n */\n\n Component_EventEmitter.prototype.on = function(eventName, handler, data, owner, priority) {\n var handlerObject;\n priority = priority || 0;\n this.needsSort[eventName] = true;\n if (this.handlers[eventName] == null) {\n this.handlers[eventName] = [];\n }\n if (!this.handlers[eventName][priority]) {\n this.handlers[eventName][priority] = [];\n }\n handlerObject = {\n handler: handler,\n once: false,\n data: data,\n owner: owner,\n eventName: eventName,\n priority: priority\n };\n this.handlers[eventName][priority].push(handlerObject);\n return handlerObject;\n };\n\n\n /**\n * Adds a new observer/listener for a specified event and removes it\n * after the even has been emitted once.\n *\n * @method once\n * @param {string} eventName - The event name.\n * @param {function} handler - The handler-function called when the event is fired.\n * @param {Object} [data={}] - An optional info-object passed to the handler-function.\n * @param {Object} [owner=null] - An optional owner-object associated with the observer/listener.\n * @param {number} priority - An optional priority level. An observer/listener with a higher level will receive the event before observers/listeners with a lower level.\n * @return {gs.EventObserver} - The added observer-object.\n */\n\n Component_EventEmitter.prototype.once = function(eventName, handler, data, owner, priority) {\n var handlerObject;\n handlerObject = this.on(eventName, handler, data, owner, priority);\n handlerObject.once = true;\n return handlerObject;\n };\n\n\n /**\n * Removes an observer/listener from a specified event. If handler parameter\n * is null, all observers for the specified event are removed.\n *\n * @method off\n * @param {string} eventName - The event name.\n * @param {gs.EventObserver} [handler=null] - The observer-object to remove. \n * If null, all observers for the specified event are removed.\n */\n\n Component_EventEmitter.prototype.off = function(eventName, handler) {\n var ref, ref1;\n if (this.isEmitting > 0 && handler) {\n return this.markedForRemove.push(handler);\n } else if (handler != null) {\n return (ref = this.handlers[eventName]) != null ? (ref1 = ref[handler.priority]) != null ? ref1.remove(handler) : void 0 : void 0;\n } else {\n return this.handlers[eventName] = [];\n }\n };\n\n\n /**\n * Removes all observers/listeners from an event which are belonging to the specified\n * owner.\n *\n * @method offByOwner\n * @param {string} eventName - The event name.\n * @param {Object} owner - The owner.\n * @return {number} Count of removed observers/listeners.\n */\n\n Component_EventEmitter.prototype.offByOwner = function(eventName, owner) {\n var handler, handlerList, handlers, l, len, len1, m, ref, ref1, results, results1;\n if (this.handlers[eventName]) {\n if (this.isEmitting > 0) {\n ref = this.handlers[eventName];\n results = [];\n for (l = 0, len = ref.length; l < len; l++) {\n handlerList = ref[l];\n handlers = handlerList != null ? handlerList.where(function(x) {\n return x.owner === owner;\n }) : void 0;\n results.push((function() {\n var len1, m, results1;\n results1 = [];\n for (m = 0, len1 = handlers.length; m < len1; m++) {\n handler = handlers[m];\n results1.push(this.markedForRemove.push(handler));\n }\n return results1;\n }).call(this));\n }\n return results;\n } else {\n ref1 = this.handlers[eventName];\n results1 = [];\n for (m = 0, len1 = ref1.length; m < len1; m++) {\n handlerList = ref1[m];\n results1.push(handlerList.removeAll(function(x) {\n return x.owner === owner;\n }));\n }\n return results1;\n }\n }\n };\n\n\n /**\n * Emits the specified event. All observers/listeners registered for the\n * specified event are informed.\n *\n * @method emit\n * @param {string} eventName - The name of the event to fire.\n * @param {Object} [sender=null] - The sender of the event.\n * @param {Object} [data={}] - An optional object passed to each handler-function.\n */\n\n Component_EventEmitter.prototype.emit = function(eventName, sender, data) {\n var count, handler, handlerList, handlerLists, i, l, len, len1, m, n, ref;\n handlerLists = this.handlers[eventName];\n data = data != null ? data : {};\n if (handlerLists && this.needsSort[eventName]) {\n this.needsSort[eventName] = false;\n for (l = 0, len = handlerLists.length; l < len; l++) {\n handlerList = handlerLists[l];\n handlerList.sort(function(a, b) {\n if (a.owner && b.owner) {\n if (a.owner.rIndex > b.owner.rIndex) {\n return -1;\n } else if (a.owner.rIndex < b.owner.rIndex) {\n return 1;\n } else {\n return 0;\n }\n } else {\n return -1;\n }\n });\n }\n }\n if (handlerLists != null) {\n for (m = handlerLists.length - 1; m >= 0; m += -1) {\n handlerList = handlerLists[m];\n if (!handlerList) {\n continue;\n }\n i = 0;\n count = handlerList.length;\n this.isEmitting++;\n while (i < count) {\n handler = handlerList[i];\n data.handler = handler;\n data.sender = sender;\n data.data = handler.data;\n if (!handler.owner || (handler.owner.visible == null) || handler.owner.visible) {\n handler.handler(data);\n }\n if (handler.once) {\n this.markedForRemove.push(handler);\n }\n if (data.breakChain) {\n break;\n }\n i++;\n }\n this.isEmitting--;\n if (data.breakChain) {\n data.breakChain = false;\n break;\n }\n }\n if (!this.isEmitting && this.markedForRemove.length > 0) {\n ref = this.markedForRemove;\n for (n = 0, len1 = ref.length; n < len1; n++) {\n handler = ref[n];\n this.handlers[handler.eventName][handler.priority].remove(handler);\n }\n this.markedForRemove = [];\n }\n }\n return null;\n };\n\n\n /**\n * Checks if an event-handler with a specified owner exists for the\n * given event.\n *\n * @method checkForOwner\n * @param {string} eventName - The event name.\n * @param {function} owner - The owner to search for.\n * @return {boolean} If <b>true</b>, an event-handler with the specified owner\n * exists for the given event. Otherwise <b>false</b>.\n */\n\n Component_EventEmitter.prototype.checkForOwner = function(eventName, owner) {\n var handler, l, len, ref, result;\n result = false;\n ref = this.handlers[eventName];\n for (l = 0, len = ref.length; l < len; l++) {\n handler = ref[l];\n if (handler.owner === owner) {\n result = true;\n break;\n }\n }\n return result;\n };\n\n\n /**\n * Checks if an event-handler with a specified handler-function exists for the\n * given event.\n *\n * @method checkForHandlerFunction\n * @param {string} eventName - The event name.\n * @param {function} handlerFunction - The handler-function to search for.\n * @return {boolean} If true, an observer witht he specified handler-function\n * exists for the given event. Otherwise false.\n */\n\n Component_EventEmitter.prototype.checkForHandlerFunction = function(eventName, handlerFunction) {\n var handler, l, len, ref, result;\n result = false;\n if (handlerFunction != null) {\n ref = this.handlers[eventName];\n for (l = 0, len = ref.length; l < len; l++) {\n handler = ref[l];\n if (handler.handler === handlerFunction) {\n result = true;\n break;\n }\n }\n }\n return result;\n };\n\n\n /**\n * Not implemented yet.\n * @method update\n */\n\n Component_EventEmitter.prototype.update = function() {\n return this.object.active = this.object.active && (!this.object.parent || this.object.parent.active);\n };\n\n return Component_EventEmitter;\n\n})(gs.Component);\n\ngs.Component_EventEmitter = Component_EventEmitter;\n\ngs.EventEmitter = Component_EventEmitter;\n\ngs.GlobalEventManager = new Component_EventEmitter();\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsc0JBQUE7RUFBQTs7O0FBQU07Ozs7QUFFRjs7Ozs7Ozs7O21DQVFBLG1CQUFBLEdBQXFCLFNBQUMsSUFBRCxFQUFPLE9BQVA7QUFDakIsUUFBQTtBQUFBLFNBQUEsa0JBQUE7TUFDSSxJQUFBLEdBQU8sSUFBQyxDQUFBLFFBQVMsQ0FBQSxDQUFBO0FBQ2pCLFdBQVMsb0ZBQVQ7UUFDSSxRQUFBLEdBQVcsSUFBSyxDQUFBLENBQUE7UUFDaEIsQ0FBQSxHQUFJO0FBQ0osZUFBTSxDQUFBLEdBQUksUUFBUSxDQUFDLE1BQW5CO1VBQ0ksT0FBQSxHQUFVLFFBQVMsQ0FBQSxDQUFBO1VBRW5CLElBQUcsQ0FBQyxPQUFPLENBQUMsT0FBVCxJQUFvQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBeEM7WUFDSSxRQUFRLENBQUMsTUFBVCxDQUFnQixDQUFoQixFQUFtQixDQUFuQixFQURKO1dBQUEsTUFBQTtZQUdJLENBQUEsR0FISjs7UUFISjtBQUhKO0FBRko7QUFjQSxXQUFPO0VBZlU7OztBQWdCckI7Ozs7Ozs7Ozs7RUFTYSxnQ0FBQTtJQUNULHlEQUFBLFNBQUE7O0FBRUE7Ozs7Ozs7SUFPQSxJQUFDLENBQUEsUUFBRCxHQUFZOztBQUVaOzs7OztJQUtBLElBQUMsQ0FBQSxXQUFELEdBQWU7O0FBRWY7Ozs7O0lBS0EsSUFBQyxDQUFBLFNBQUQsR0FBYTs7QUFFYjs7Ozs7SUFLQSxJQUFDLENBQUEsU0FBRCxHQUFhOztBQUViOzs7OztJQUtBLElBQUMsQ0FBQSxlQUFELEdBQW1COztBQUVuQjs7Ozs7SUFLQSxJQUFDLENBQUEsVUFBRCxHQUFjO0VBN0NMOzs7QUErQ2I7Ozs7OzttQ0FLQSxLQUFBLEdBQU8sU0FBQTtJQUNILElBQUMsQ0FBQSxTQUFELEdBQWE7SUFDYixJQUFDLENBQUEsUUFBRCxHQUFZO1dBQ1osSUFBQyxDQUFBLFdBQUQsR0FB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eUIsRUFBRSxDQUFDOztBQTZSeEMsRUFBRSxDQUFDLHNCQUFILEdBQTRCOztBQUM1QixFQUFFLENBQUMsWUFBSCxHQUFrQjs7QUFDbEIsRUFBRSxDQUFDLGtCQUFILEdBQTRCLElBQUEsc0JBQUEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogQ29tcG9uZW50X0V2ZW50RW1pdHRlclxuI1xuIyAgICQkQ09QWVJJR0hUJCRcbiNcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY2xhc3MgQ29tcG9uZW50X0V2ZW50RW1pdHRlciBleHRlbmRzIGdzLkNvbXBvbmVudFxuICAgICNAb2JqZWN0Q29kZWNCbGFja0xpc3QgPSBbXCJoYW5kbGVyc1wiXVxuICAgICMjIypcbiAgICAqIENhbGxlZCBpZiB0aGlzIG9iamVjdCBpbnN0YW5jZSBpcyByZXN0b3JlZCBmcm9tIGEgZGF0YS1idW5kbGUuIEl0IGNhbiBiZSB1c2VkXG4gICAgKiByZS1hc3NpZ24gZXZlbnQtaGFuZGxlciwgYW5vbnltb3VzIGZ1bmN0aW9ucywgZXRjLlxuICAgICogXG4gICAgKiBAbWV0aG9kIG9uRGF0YUJ1bmRsZVJlc3RvcmUuXG4gICAgKiBAcGFyYW0gT2JqZWN0IGRhdGEgLSBUaGUgZGF0YS1idW5kbGVcbiAgICAqIEBwYXJhbSBncy5PYmplY3RDb2RlY0NvbnRleHQgY29udGV4dCAtIFRoZSBjb2RlYy1jb250ZXh0LlxuICAgICMjI1xuICAgIG9uRGF0YUJ1bmRsZVJlc3RvcmU6IChkYXRhLCBjb250ZXh0KSAtPlxuICAgICAgICBmb3IgayBvZiBAaGFuZGxlcnNcbiAgICAgICAgICAgIGxpc3QgPSBAaGFuZGxlcnNba11cbiAgICAgICAgICAgIGZvciBpIGluIFswLi4ubGlzdC5sZW5ndGhdXG4gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBsaXN0W2ldXG4gICAgICAgICAgICAgICAgaiA9IDBcbiAgICAgICAgICAgICAgICB3aGlsZSBqIDwgaGFuZGxlcnMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBoYW5kbGVyc1tqXVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgIWhhbmRsZXIuaGFuZGxlciBvciAhaGFuZGxlci5oYW5kbGVyLiR2bm1fY2JcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShqLCAxKVxuICAgICAgICAgICAgICAgICAgICBlbHNlICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAjQGhhbmRsZXJzID0ge31cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAjIyMqXG4gICAgKiBBIGNvbXBvbmVudCB3aGljaCBhbGxvdyBhIGdhbWUgb2JqZWN0IHRvIGZpcmUgZXZlbnRzIGFuZCBtYW5hZ2UgYSBsaXN0XG4gICAgKiBvZiBvYnNlcnZlcnMuXG4gICAgKlxuICAgICogQG1vZHVsZSBnc1xuICAgICogQGNsYXNzIENvbXBvbmVudF9FdmVudEVtaXR0ZXJcbiAgICAqIEBleHRlbmRzIGdzLkNvbXBvbmVudFxuICAgICogQG1lbWJlcm9mIGdzXG4gICAgIyMjXG4gICAgY29uc3RydWN0b3I6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogTGlzdCBvZiByZWdpc3RlcmVkIG9ic2VydmVycy5cbiAgICAgICAgKlxuICAgICAgICAqIEBwcm9wZXJ0eSBoYW5kbGVyc1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICMjI1xuICAgICAgICBAaGFuZGxlcnMgPSB7fVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEBwcm9wZXJ0eSBkZWZhdWx0RGF0YVxuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICMjI1xuICAgICAgICBAZGVmYXVsdERhdGEgPSB7fVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEBwcm9wZXJ0eSBjaGFpbkluZm9cbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAjIyNcbiAgICAgICAgQGNoYWluSW5mbyA9IHt9XG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQHByb3BlcnR5IG5lZWRzU29ydFxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAjIyNcbiAgICAgICAgQG5lZWRzU29ydCA9IHt9XG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQHByb3BlcnR5IG1hcmtlZEZvclJlbW92ZVxuICAgICAgICAqIEB0eXBlIE9iamVjdFtdXG4gICAgICAgICogQHByaXZhdGVcbiAgICAgICAgIyMjXG4gICAgICAgIEBtYXJrZWRGb3JSZW1vdmUgPSBbXVxuICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQHByb3BlcnR5IGlzRW1pdHRpbmdcbiAgICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAjIyNcbiAgICAgICAgQGlzRW1pdHRpbmcgPSAwXG4gICAgXG4gICAgIyMjKlxuICAgICogQ2xlYXJzIHRoZSBldmVudCBlbWl0dGVyIGJ5IHJlbW92aW5nIGFsbCBoYW5kbGVycy9saXN0ZW5lcnMuXG4gICAgKlxuICAgICogQG1ldGhvZCBjbGVhclxuICAgICMjIyBcbiAgICBjbGVhcjogLT5cbiAgICAgICAgQG5lZWRzU29ydCA9IHt9XG4gICAgICAgIEBoYW5kbGVycyA9IHt9XG4gICAgICAgIEBkZWZhdWx0RGF0YSA9IHt9XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFkZHMgYSBuZXcgb2JzZXJ2ZXIvbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWVkIGV2ZW50LlxuICAgICpcbiAgICAqIEBtZXRob2Qgb25cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBUaGUgaGFuZGxlci1mdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9e31dIC0gQW4gb3B0aW9uYWwgaW5mby1vYmplY3QgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLWZ1bmN0aW9uLlxuICAgICogQHBhcmFtIHtPYmplY3R9IFtvd25lcj1udWxsXSAtIEFuIG9wdGlvbmFsIG93bmVyLW9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG9ic2VydmVyL2xpc3RlbmVyLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHByaW9yaXR5IC0gQW4gb3B0aW9uYWwgcHJpb3JpdHkgbGV2ZWwuIEFuIG9ic2VydmVyL2xpc3RlbmVyIHdpdGggYSBoaWdoZXIgbGV2ZWwgd2lsbCByZWNlaXZlIHRoZSBldmVudCBiZWZvcmUgb2JzZXJ2ZXJzL2xpc3RlbmVycyB3aXRoIGEgbG93ZXIgbGV2ZWwuXG4gICAgKiBAcmV0dXJuIHtncy5FdmVudE9ic2VydmVyfSAtIFRoZSBhZGRlZCBvYnNlcnZlci1vYmplY3QuXG4gICAgIyMjICAgIFxuICAgIG9uOiAoZXZlbnROYW1lLCBoYW5kbGVyLCBkYXRhLCBvd25lciwgcHJpb3JpdHkpIC0+XG4gICAgICAgIHByaW9yaXR5ID0gcHJpb3JpdHkgfHwgMFxuICAgICAgICBAbmVlZHNTb3J0W2V2ZW50TmFtZV0gPSB0cnVlXG4gICAgICAgIGlmIG5vdCBAaGFuZGxlcnNbZXZlbnROYW1lXT9cbiAgICAgICAgICAgIEBoYW5kbGVyc1tldmVudE5hbWVdID0gW11cbiAgICAgICAgaWYgbm90IEBoYW5kbGVyc1tldmVudE5hbWVdW3ByaW9yaXR5XVxuICAgICAgICAgICAgQGhhbmRsZXJzW2V2ZW50TmFtZV1bcHJpb3JpdHldID0gW11cbiAgICAgICAgICAgIFxuICAgICAgICBoYW5kbGVyT2JqZWN0ID0geyBoYW5kbGVyOiBoYW5kbGVyLCBvbmNlOiBubywgZGF0YTogZGF0YSwgb3duZXI6IG93bmVyLCBldmVudE5hbWU6IGV2ZW50TmFtZSwgcHJpb3JpdHk6IHByaW9yaXR5IH1cbiAgICAgICAgQGhhbmRsZXJzW2V2ZW50TmFtZV1bcHJpb3JpdHldLnB1c2goaGFuZGxlck9iamVjdClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBoYW5kbGVyT2JqZWN0XG4gICAgXG4gICAgIyMjKlxuICAgICogQWRkcyBhIG5ldyBvYnNlcnZlci9saXN0ZW5lciBmb3IgYSBzcGVjaWZpZWQgZXZlbnQgYW5kIHJlbW92ZXMgaXRcbiAgICAqIGFmdGVyIHRoZSBldmVuIGhhcyBiZWVuIGVtaXR0ZWQgb25jZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG9uY2VcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBUaGUgaGFuZGxlci1mdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9e31dIC0gQW4gb3B0aW9uYWwgaW5mby1vYmplY3QgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLWZ1bmN0aW9uLlxuICAgICogQHBhcmFtIHtPYmplY3R9IFtvd25lcj1udWxsXSAtIEFuIG9wdGlvbmFsIG93bmVyLW9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG9ic2VydmVyL2xpc3RlbmVyLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHByaW9yaXR5IC0gQW4gb3B0aW9uYWwgcHJpb3JpdHkgbGV2ZWwuIEFuIG9ic2VydmVyL2xpc3RlbmVyIHdpdGggYSBoaWdoZXIgbGV2ZWwgd2lsbCByZWNlaXZlIHRoZSBldmVudCBiZWZvcmUgb2JzZXJ2ZXJzL2xpc3RlbmVycyB3aXRoIGEgbG93ZXIgbGV2ZWwuXG4gICAgKiBAcmV0dXJuIHtncy5FdmVudE9ic2VydmVyfSAtIFRoZSBhZGRlZCBvYnNlcnZlci1vYmplY3QuXG4gICAgIyMjICAgICAgICBcbiAgICBvbmNlOiAoZXZlbnROYW1lLCBoYW5kbGVyLCBkYXRhLCBvd25lciwgcHJpb3JpdHkpIC0+XG4gICAgICAgIGhhbmRsZXJPYmplY3QgPSBAb24oZXZlbnROYW1lLCBoYW5kbGVyLCBkYXRhLCBvd25lciwgcHJpb3JpdHkpXG4gICAgICAgIGhhbmRsZXJPYmplY3Qub25jZSA9IHllc1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGhhbmRsZXJPYmplY3RcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogUmVtb3ZlcyBhbiBvYnNlcnZlci9saXN0ZW5lciBmcm9tIGEgc3BlY2lmaWVkIGV2ZW50LiBJZiBoYW5kbGVyIHBhcmFtZXRlclxuICAgICogaXMgbnVsbCwgYWxsIG9ic2VydmVycyBmb3IgdGhlIHNwZWNpZmllZCBldmVudCBhcmUgcmVtb3ZlZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG9mZlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lLlxuICAgICogQHBhcmFtIHtncy5FdmVudE9ic2VydmVyfSBbaGFuZGxlcj1udWxsXSAtIFRoZSBvYnNlcnZlci1vYmplY3QgdG8gcmVtb3ZlLiBcbiAgICAqIElmIG51bGwsIGFsbCBvYnNlcnZlcnMgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQgYXJlIHJlbW92ZWQuXG4gICAgIyMjICAgIFxuICAgIG9mZjogKGV2ZW50TmFtZSwgaGFuZGxlcikgLT5cbiAgICAgICAgaWYgQGlzRW1pdHRpbmcgPiAwIGFuZCBoYW5kbGVyXG4gICAgICAgICAgICBAbWFya2VkRm9yUmVtb3ZlLnB1c2goaGFuZGxlcilcbiAgICAgICAgZWxzZSBpZiBoYW5kbGVyP1xuICAgICAgICAgICAgQGhhbmRsZXJzW2V2ZW50TmFtZV0/W2hhbmRsZXIucHJpb3JpdHldPy5yZW1vdmUoaGFuZGxlcilcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQGhhbmRsZXJzW2V2ZW50TmFtZV0gPSBbXVxuICAgICAgICAgICAgXG4gICAgIyMjKlxuICAgICogUmVtb3ZlcyBhbGwgb2JzZXJ2ZXJzL2xpc3RlbmVycyBmcm9tIGFuIGV2ZW50IHdoaWNoIGFyZSBiZWxvbmdpbmcgdG8gdGhlIHNwZWNpZmllZFxuICAgICogb3duZXIuXG4gICAgKlxuICAgICogQG1ldGhvZCBvZmZCeU93bmVyXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gVGhlIGV2ZW50IG5hbWUuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gb3duZXIgLSBUaGUgb3duZXIuXG4gICAgKiBAcmV0dXJuIHtudW1iZXJ9IENvdW50IG9mIHJlbW92ZWQgb2JzZXJ2ZXJzL2xpc3RlbmVycy5cbiAgICAjIyNcbiAgICBvZmZCeU93bmVyOiAoZXZlbnROYW1lLCBvd25lcikgLT5cbiAgICAgICAgaWYgQGhhbmRsZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICAgIGlmIEBpc0VtaXR0aW5nID4gMFxuICAgICAgICAgICAgICAgIGZvciBoYW5kbGVyTGlzdCBpbiBAaGFuZGxlcnNbZXZlbnROYW1lXVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGhhbmRsZXJMaXN0Py53aGVyZSAoeCkgLT4geC5vd25lciA9PSBvd25lclxuICAgICAgICAgICAgICAgICAgICBmb3IgaGFuZGxlciBpbiBoYW5kbGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgQG1hcmtlZEZvclJlbW92ZS5wdXNoKGhhbmRsZXIpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm9yIGhhbmRsZXJMaXN0IGluIEBoYW5kbGVyc1tldmVudE5hbWVdXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJMaXN0LnJlbW92ZUFsbCgoeCkgLT4geC5vd25lciA9PSBvd25lcilcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogRW1pdHMgdGhlIHNwZWNpZmllZCBldmVudC4gQWxsIG9ic2VydmVycy9saXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgdGhlXG4gICAgKiBzcGVjaWZpZWQgZXZlbnQgYXJlIGluZm9ybWVkLlxuICAgICpcbiAgICAqIEBtZXRob2QgZW1pdFxuICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBmaXJlLlxuICAgICogQHBhcmFtIHtPYmplY3R9IFtzZW5kZXI9bnVsbF0gLSBUaGUgc2VuZGVyIG9mIHRoZSBldmVudC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT17fV0gLSBBbiBvcHRpb25hbCBvYmplY3QgcGFzc2VkIHRvIGVhY2ggaGFuZGxlci1mdW5jdGlvbi5cbiAgICAjIyMgICAgICBcbiAgICBlbWl0OiAoZXZlbnROYW1lLCBzZW5kZXIsIGRhdGEpIC0+XG4gICAgICAgIGhhbmRsZXJMaXN0cyA9IEBoYW5kbGVyc1tldmVudE5hbWVdXG4gICAgICAgIGRhdGEgPSBkYXRhID8ge30gI0BkZWZhdWx0RGF0YVxuICAgICAgICBcbiAgICAgICAgaWYgaGFuZGxlckxpc3RzIGFuZCBAbmVlZHNTb3J0W2V2ZW50TmFtZV1cbiAgICAgICAgICAgIEBuZWVkc1NvcnRbZXZlbnROYW1lXSA9IG5vXG4gICAgICAgICAgICBmb3IgaGFuZGxlckxpc3QgaW4gaGFuZGxlckxpc3RzXG4gICAgICAgICAgICAgICAgaGFuZGxlckxpc3Quc29ydCAoYSwgYikgLT5cbiAgICAgICAgICAgICAgICAgICAgaWYgYS5vd25lciBhbmQgYi5vd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgYS5vd25lci5ySW5kZXggPiBiLm93bmVyLnJJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgYS5vd25lci5ySW5kZXggPCBiLm93bmVyLnJJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIFxuICAgICAgICBpZiBoYW5kbGVyTGlzdHM/XG4gICAgICAgICAgICBmb3IgaGFuZGxlckxpc3QgaW4gaGFuZGxlckxpc3RzIGJ5IC0xXG4gICAgICAgICAgICAgICAgaWYgIWhhbmRsZXJMaXN0IHRoZW4gY29udGludWVcbiAgICAgICAgICAgICAgICBpID0gMFxuICAgICAgICAgICAgICAgIGNvdW50ID0gaGFuZGxlckxpc3QubGVuZ3RoXG4gICAgICAgICAgICAgICAgQGlzRW1pdHRpbmcrK1xuICAgICAgICAgICAgICAgIHdoaWxlIGkgPCBjb3VudFxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlckxpc3RbaV1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZW5kZXIgPSBzZW5kZXJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5kYXRhID0gaGFuZGxlci5kYXRhXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAhaGFuZGxlci5vd25lciBvciAhaGFuZGxlci5vd25lci52aXNpYmxlPyBvciBoYW5kbGVyLm93bmVyLnZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuaGFuZGxlcihkYXRhKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiBoYW5kbGVyLm9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIEBtYXJrZWRGb3JSZW1vdmUucHVzaChoYW5kbGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIGRhdGEuYnJlYWtDaGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgICAgIEBpc0VtaXR0aW5nLS1cbiAgICAgICAgICAgICAgICBpZiBkYXRhLmJyZWFrQ2hhaW5cbiAgICAgICAgICAgICAgICAgICAgZGF0YS5icmVha0NoYWluID0gbm9cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICFAaXNFbWl0dGluZyBhbmQgQG1hcmtlZEZvclJlbW92ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgZm9yIGhhbmRsZXIgaW4gQG1hcmtlZEZvclJlbW92ZVxuICAgICAgICAgICAgICAgICAgICBAaGFuZGxlcnNbaGFuZGxlci5ldmVudE5hbWVdW2hhbmRsZXIucHJpb3JpdHldLnJlbW92ZShoYW5kbGVyKVxuICAgICAgICAgICAgICAgIEBtYXJrZWRGb3JSZW1vdmUgPSBbXVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIFxuICAgIFxuXG4gICAgIyMjKlxuICAgICogQ2hlY2tzIGlmIGFuIGV2ZW50LWhhbmRsZXIgd2l0aCBhIHNwZWNpZmllZCBvd25lciBleGlzdHMgZm9yIHRoZVxuICAgICogZ2l2ZW4gZXZlbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBjaGVja0Zvck93bmVyXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gVGhlIGV2ZW50IG5hbWUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBvd25lciAtIFRoZSBvd25lciB0byBzZWFyY2ggZm9yLlxuICAgICogQHJldHVybiB7Ym9vbGVhbn0gSWYgPGI+dHJ1ZTwvYj4sIGFuIGV2ZW50LWhhbmRsZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG93bmVyXG4gICAgKiBleGlzdHMgZm9yIHRoZSBnaXZlbiBldmVudC4gT3RoZXJ3aXNlIDxiPmZhbHNlPC9iPi5cbiAgICAjIyMgIFxuICAgIGNoZWNrRm9yT3duZXI6IChldmVudE5hbWUsIG93bmVyKSAtPlxuICAgICAgICByZXN1bHQgPSBub1xuICAgICAgICBcbiAgICAgICAgZm9yIGhhbmRsZXIgaW4gQGhhbmRsZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICAgIGlmIGhhbmRsZXIub3duZXIgPT0gb3duZXJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB5ZXNcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIENoZWNrcyBpZiBhbiBldmVudC1oYW5kbGVyIHdpdGggYSBzcGVjaWZpZWQgaGFuZGxlci1mdW5jdGlvbiBleGlzdHMgZm9yIHRoZVxuICAgICogZ2l2ZW4gZXZlbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBjaGVja0ZvckhhbmRsZXJGdW5jdGlvblxuICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lLlxuICAgICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlckZ1bmN0aW9uIC0gVGhlIGhhbmRsZXItZnVuY3Rpb24gdG8gc2VhcmNoIGZvci5cbiAgICAqIEByZXR1cm4ge2Jvb2xlYW59IElmIHRydWUsIGFuIG9ic2VydmVyIHdpdGh0IGhlIHNwZWNpZmllZCBoYW5kbGVyLWZ1bmN0aW9uXG4gICAgKiBleGlzdHMgZm9yIHRoZSBnaXZlbiBldmVudC4gT3RoZXJ3aXNlIGZhbHNlLlxuICAgICMjIyAgXG4gICAgY2hlY2tGb3JIYW5kbGVyRnVuY3Rpb246IChldmVudE5hbWUsIGhhbmRsZXJGdW5jdGlvbikgLT4gXG4gICAgICAgIHJlc3VsdCA9IG5vXG4gICAgICAgIFxuICAgICAgICBpZiBoYW5kbGVyRnVuY3Rpb24/XG4gICAgICAgICAgICBmb3IgaGFuZGxlciBpbiBAaGFuZGxlcnNbZXZlbnROYW1lXVxuICAgICAgICAgICAgICAgIGlmIGhhbmRsZXIuaGFuZGxlciA9PSBoYW5kbGVyRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geWVzXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4gICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICMjIyBcbiAgICAjIEZJWE1FOiBXaHkgc2hvdWxkIGV2ZW50LWVtaXR0ZXIgaW5mbHVlbmNlIHRoZSBhY3RpdmUtcHJvcGVydHk/XG4gICAgdXBkYXRlOiAtPlxuICAgICAgICBAb2JqZWN0LmFjdGl2ZSA9IEBvYmplY3QuYWN0aXZlIGFuZCAoIUBvYmplY3QucGFyZW50IG9yIEBvYmplY3QucGFyZW50LmFjdGl2ZSlcbiAgICAgICAgXG5ncy5Db21wb25lbnRfRXZlbnRFbWl0dGVyID0gQ29tcG9uZW50X0V2ZW50RW1pdHRlclxuZ3MuRXZlbnRFbWl0dGVyID0gQ29tcG9uZW50X0V2ZW50RW1pdHRlclxuZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyID0gbmV3IENvbXBvbmVudF9FdmVudEVtaXR0ZXIoKSJdfQ==\n//# sourceURL=Component_EventEmitter_151.js"
},
"summary": [
"name",
"type",
"order"
]
}
|