/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/r3/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/r3/index.js": /*!*************************!*\ !*** ./src/r3/index.js ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var R3 = __webpack_require__(/*! ./r3.js */ "./src/r3/r3.js"); R3.System.Linking.start(); R3.System.Socket.start(); module.exports = R3; /***/ }), /***/ "./src/r3/r3-event.js": /*!****************************!*\ !*** ./src/r3/r3-event.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Utils = __webpack_require__(/*! ./r3-utils */ "./src/r3/r3-utils.js"); var Event = /*#__PURE__*/function () { function Event() { _classCallCheck(this, Event); console.log('Event created'); } /** * Some nice Events handling * @type {{}} */ _createClass(Event, [{ key: "subscribe", value: /** * Subscribe to some events * @param eventName * @param callback */ function subscribe(eventName, callback) { return Event.Subscribe(eventName, callback.bind(this)); } }, { key: "emit", value: function emit(eventName, data, clientCallback, clientErrorCallback) { return Event.Emit(eventName, data, clientCallback, clientErrorCallback); } /** * Execute the functions which subscribe to this event, but don't process the client callback - the subscription function * should execute the client callback * @param eventId * @param data * @param clientCallback * @param clientErrorCallback * @returns {number} * @constructor */ }], [{ key: "Subscribe", value: function Subscribe(eventName, fn) { /** * Todo - maybe eventually store a boolean which indicates if the function has been executed */ var subscriptionId = Utils.RandomId(10); if (Event.Subscriptions.hasOwnProperty(eventName)) { if (Event.Subscriptions[eventName][subscriptionId]) { throw new Error('A component can only subscribe to a particular event ID once'); } Event.Subscriptions[eventName][subscriptionId] = fn; } else { Event.Subscriptions[eventName] = {}; Event.Subscriptions[eventName][subscriptionId] = fn; } /** * Return a handle to the caller to allow us to unsubscribe to this event */ return { fn: fn, remove: function (eventId, subscriptionId) { return function () { /** * Stop listening for this event from this component */ delete Event.Subscriptions[eventId][subscriptionId]; /** * If the length of listeners is 0, stop referencing this event * @type {string[]} */ var listeners = Object.keys(Event.Subscriptions[eventId]); if (listeners.length === 0) { delete Event.Subscriptions[eventId]; } }; }(eventName, subscriptionId), subscriptionId: subscriptionId }; } }, { key: "Emit", value: /** * Static Synchronous Event - Calls clientCallback directly after the event result is obtained * @param eventId * @param data * @param clientCallback is executed ideally when the event completed * @param clientErrorCallback * @returns {number} of callbacks executed * @constructor */ function Emit(eventId, data, clientCallback, clientErrorCallback) { if (Event.Subscriptions.hasOwnProperty(eventId)) { var subscriptionIds = Object.keys(Event.Subscriptions[eventId]); subscriptionIds.map(function (subscriptionId) { try { var result = Event.Subscriptions[eventId][subscriptionId](data); if (clientCallback) { clientCallback(result); } } catch (error) { if (clientErrorCallback) { clientErrorCallback(error); } else { console.error(error); throw error; } } }); } } }, { key: "Async", value: function Async(eventId, data, clientCallback, clientErrorCallback) { if (Event.Subscriptions.hasOwnProperty(eventId)) { var subscriptionIds = Object.keys(Event.Subscriptions[eventId]); subscriptionIds.map(function (subscriptionId) { try { Event.Subscriptions[eventId][subscriptionId](data, clientCallback, clientErrorCallback); } catch (error) { if (clientErrorCallback) { clientErrorCallback(error); } else { console.error(error); throw error; } } }); } } }]); return Event; }(); //EVENT_GENERATED_START _defineProperty(Event, "Subscriptions", {}); Event.CREATE_INSTANCE = 0x1; Event.GET_RUNTIME = 0x2; Event.GET_WINDOW_SIZE = 0x3; Event.INSTANCE_CREATED = 0x4; Event.OBJECT_CREATED = 0x5; Event.OBJECT_INITIALIZED = 0x6; Event.PAUSE = 0x7; Event.RESTART = 0x8; Event.START = 0x9; Event.MAX_EVENTS = 0xa; Event.GetEventName = function (eventId) { switch (eventId) { case 0x1: return 'create_instance'; case 0x2: return 'get_runtime'; case 0x3: return 'get_window_size'; case 0x4: return 'instance_created'; case 0x5: return 'object_created'; case 0x6: return 'object_initialized'; case 0x7: return 'pause'; case 0x8: return 'restart'; case 0x9: return 'start'; default: throw new Error('Event type not defined : ' + eventId); } }; //EVENT_GENERATED_END module.exports = Event; /***/ }), /***/ "./src/r3/r3-r3-object.js": /*!********************************!*\ !*** ./src/r3/r3-r3-object.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var Event = __webpack_require__(/*! ./r3-event */ "./src/r3/r3-event.js"); var R3Object = /*#__PURE__*/function (_Event) { _inherits(R3Object, _Event); var _super = _createSuper(R3Object); function R3Object() { var _this; _classCallCheck(this, R3Object); _this = _super.call(this); console.log('Object created'); _this.emit(Event.OBJECT_CREATED); return _this; } return R3Object; }(Event); module.exports = R3Object; /***/ }), /***/ "./src/r3/r3-system/index.js": /*!***********************************!*\ !*** ./src/r3/r3-system/index.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var System = __webpack_require__(/*! ./r3-system */ "./src/r3/r3-system/r3-system.js"); var SystemLinking = __webpack_require__(/*! ./r3-system-linking */ "./src/r3/r3-system/r3-system-linking.js"); var SystemSocket = __webpack_require__(/*! ./r3-system-socket */ "./src/r3/r3-system/r3-system-socket.js"); module.exports = { System: System, SystemLinking: SystemLinking, SystemSocket: SystemSocket }; /***/ }), /***/ "./src/r3/r3-system/r3-system-linking.js": /*!***********************************************!*\ !*** ./src/r3/r3-system/r3-system-linking.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var System = __webpack_require__(/*! ./r3-system */ "./src/r3/r3-system/r3-system.js"); var R3Object = __webpack_require__(/*! ../r3-r3-object */ "./src/r3/r3-r3-object.js"); var Event = __webpack_require__(/*! ../r3-event */ "./src/r3/r3-event.js"); var LinkingSystem = /*#__PURE__*/function (_System) { _inherits(LinkingSystem, _System); var _super = _createSuper(LinkingSystem); function LinkingSystem() { _classCallCheck(this, LinkingSystem); return _super.apply(this, arguments); } _createClass(LinkingSystem, null, [{ key: "start", value: function start() { _get(_getPrototypeOf(LinkingSystem), "start", this).call(this); console.log('starting linking system'); Event.Subscribe(Event.OBJECT_CREATED, function () { console.log('linking system discovered an object'); }); var object = new R3Object(); return true; } }]); return LinkingSystem; }(System); module.exports = LinkingSystem; /***/ }), /***/ "./src/r3/r3-system/r3-system-socket.js": /*!**********************************************!*\ !*** ./src/r3/r3-system/r3-system-socket.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var System = __webpack_require__(/*! ./r3-system.js */ "./src/r3/r3-system/r3-system.js"); var SocketSystem = /*#__PURE__*/function (_System) { _inherits(SocketSystem, _System); var _super = _createSuper(SocketSystem); function SocketSystem() { _classCallCheck(this, SocketSystem); return _super.apply(this, arguments); } _createClass(SocketSystem, null, [{ key: "start", value: function start() { _get(_getPrototypeOf(SocketSystem), "start", this).call(this); console.log('starting socket system'); return true; } }]); return SocketSystem; }(System); module.exports = SocketSystem; /***/ }), /***/ "./src/r3/r3-system/r3-system.js": /*!***************************************!*\ !*** ./src/r3/r3-system/r3-system.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var System = /*#__PURE__*/function () { function System() { _classCallCheck(this, System); } _createClass(System, null, [{ key: "start", value: function start() { console.log('starting a system'); } }]); return System; }(); module.exports = System; /***/ }), /***/ "./src/r3/r3-utils.js": /*!****************************!*\ !*** ./src/r3/r3-utils.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports) { function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var Utils = /*#__PURE__*/function () { function Utils() { _classCallCheck(this, Utils); } /** * Gets the first parent of the object which is an instance of constructor * @param object * @param constructor * @returns {*} * @constructor */ _createClass(Utils, null, [{ key: "GetFirstParent", value: function GetFirstParent(object, constructor) { if (Utils.UndefinedOrNull(constructor)) { throw new Error('You need to specify a constructor'); } if (object.parent === null) { return null; } if (object.parent instanceof constructor) { return object.parent; } else { return Utils.GetFirstParent(object.parent, constructor); } } }, { key: "SyntaxHighlight", value: function SyntaxHighlight(json) { if (typeof json != 'string') { json = JSON.stringify(json, undefined, 2); } json = json.replace(/&/g, '&').replace(//g, '>'); return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { var cls = 'number'; if (/^"/.test(match)) { if (/:$/.test(match)) { cls = 'key'; } else { cls = 'string'; } } else if (/true|false/.test(match)) { cls = 'boolean'; } else if (/null/.test(match)) { cls = 'null'; } return '' + match + ''; }); } }, { key: "GetParentProject", value: function GetParentProject(component) { if (Utils.UndefinedOrNull(component.parent)) { throw new Error('Parent not found'); } if (component.parent instanceof R3.Project) { return component.parent; } return Utils.GetParentProject(component.parent); } }, { key: "GetParents", value: function GetParents(component, parents) { if (Utils.UndefinedOrNull(parents)) { parents = []; } if (Utils.UndefinedOrNull(component.parent)) { return parents; } parents.push(component.parent); return Utils.GetParents(component.parent, parents); } }, { key: "Instance", value: /** * @return {boolean} */ function Instance(component) { return Utils.Defined(component) && Utils.Defined(component.instance); } }, { key: "RemoveFromSelect", value: /** * Utils.RemoveFromSelect * @param select * @param id * @returns {boolean} * @constructor */ function RemoveFromSelect(select, id) { var i; for (i = 0; i < select.options.length; i++) { if (select.options[i].value === id) { select.remove(i); return true; } } return false; } }, { key: "SetSelectIndex", value: /** * Utils.GetSelectIndex * * Get the select index of given id * * @param select * @param id * @returns boolean true if successful * * @constructor */ function SetSelectIndex(select, id) { for (var _i = 0; _i < select.options.length; _i++) { if (select.options[_i].value === id) { select.selectedIndex = _i; return true; } } return false; } }, { key: "SortSelect", value: function SortSelect(select) { var tmp = []; var i; for (i = 1; i < select.options.length; i++) { tmp[i - 1] = []; tmp[i - 1][0] = select.options[i].text; tmp[i - 1][1] = select.options[i].value; } tmp.sort(); select.options = [select.options[0]]; for (i = 0; i < tmp.length; i++) { select.options[i + 1] = new Option(tmp[i][0], tmp[i][1]); } return; } }, { key: "GetParent", value: /** * Gets the parent of object whith property of optional type constructor. If index is specified, get the parent of the * object with property[index] - which means the property should be an array * @param object * @param property * @param index * @param constructor * @returns {*} * @constructor */ function GetParent(object, property, index, constructor) { if (Utils.UndefinedOrNull(constructor)) { constructor = null; } if (Utils.UndefinedOrNull(index)) { index = null; } if (object.parent) { /** * Parent defined */ if (object.parent.hasOwnProperty(property)) { if (constructor) { if (index) { if (object.parent[property][index] instanceof constructor) { return object.parent[property][index]; } else { if (typeof object.parent.getParent === 'function') { return object.parent.getParent(property, index, constructor); } else { console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); return null; } } } else { if (object.parent[property] instanceof constructor) { return object.parent[property]; } else { if (typeof object.parent.getParent === 'function') { return object.parent.getParent(property, index, constructor); } else { console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); return null; } } } } else { if (index) { return object.parent[property][index]; } else { return object.parent[property]; } } } else { /** * This parent does not have the property - go a level higher */ if (typeof object.parent.getParent === 'function') { return object.parent.getParent(property, index, constructor); } else { console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); return null; } } } else { /** * No parent defined */ console.warn('property : ' + property + ' of type ' + constructor + ' was not found in the parent chain'); return null; } } }, { key: "StripImageExtension", value: /** * Strips image extension from given path * @param imagePath * @constructor */ function StripImageExtension(imagePath) { return imagePath.replace(/(\.png$|\.gif$|\.jpeg$|\.jpg$)/, ''); } }, { key: "Unloaded", value: /** * Returns true if unloaded * @param component * @returns {boolean} * @constructor */ function Unloaded(component) { if (Utils.UndefinedOrNull(component) || Utils.UndefinedOrNull(component.instance)) { return true; } return false; } }, { key: "Loaded", value: /** * * @param component * @returns {boolean} * @constructor */ function Loaded(component) { if (component && component.instance) { return true; } return false; } }, { key: "BuildVectorSource", value: function BuildVectorSource(result, name, dimension) { if (dimension === 2) { result[name] = {}; result[name].x = false; result[name].y = false; return; } if (dimension === 3) { result[name] = {}; result[name].x = false; result[name].y = false; result[name].y = false; return; } if (dimension === 4) { result[name] = {}; result[name].x = false; result[name].y = false; result[name].z = false; result[name].w = false; return; } console.warn('unknown dimension : ' + dimension); } }, { key: "GetArrayInstances", value: /** * Returns all 'instances' of the array, or null if an 'instance' is undefined * @constructor * @param array */ function GetArrayInstances(array) { return array.reduce(function (result, object) { if (result === null) { return result; } if (Utils.UndefinedOrNull(object.instance)) { result = null; } else { result.push(object.instance); } return result; }, []); } }, { key: "SortFacesByMaterialIndex", value: function SortFacesByMaterialIndex(faces) { /** * Sorts faces according to material index because later we will create * groups for each vertice group */ faces.sort(function (a, b) { if (a.materialIndex < b.materialIndex) { return -1; } if (a.materialIndex > b.materialIndex) { return 1; } return 0; }); return faces; } }, { key: "BuildQuaternionSource", value: function BuildQuaternionSource(result, name) { result[name] = {}; result[name].axis = {}; result[name].axis.x = false; result[name].axis.y = false; result[name].axis.z = false; result[name].angle = false; result[name].x = false; result[name].y = false; result[name].z = false; result[name].w = false; } }, { key: "ObjectPropertiesAsBoolean", value: function ObjectPropertiesAsBoolean(object) { return Object.keys(object).reduce(function (result, propertyId) { if (typeof object[propertyId] === 'function') { return result; } result[propertyId] = false; // if (object[propertyId] instanceof R3.Vector2) { // Utils.BuildVectorSource(result, propertyId, 2); // } // // if (object[propertyId] instanceof R3.Vector3) { // Utils.BuildVectorSource(result, propertyId, 3); // } // // if (object[propertyId] instanceof R3.Vector4) { // Utils.BuildVectorSource(result, propertyId, 4); // } // // if (object[propertyId] instanceof R3.Quaternion) { // Utils.BuildQuaternionSource(result, propertyId); // } return result; }.bind(this), {}); } }, { key: "GetRuntime", value: function GetRuntime() { var result = null; R3.Event.Emit(R3.Event.GET_RUNTIME, null, function (runtime) { result = runtime; }); return result; } }, { key: "GetWindowSize", value: /** * Returns the window size or null * @returns {*} * @constructor */ function GetWindowSize() { var size = null; R3.Event.Emit(R3.Event.GET_WINDOW_SIZE, null, function (data) { size = data; }.bind(this)); return size; } }, { key: "UpdateWindowSize", value: /** * Convenience function to update object width and height members with window size * @param object * @constructor */ function UpdateWindowSize(object) { var size = Utils.GetWindowSize(); object.width = size.width; object.height = size.height; } }, { key: "ObjectIdWithNameInArray", value: /** * Returns id of object with the name if it exists in the array, otherwise null * @param name * @param array * @returns {*} * @constructor */ function ObjectIdWithNameInArray(name, array) { return array.reduce(function (result, object) { if (result) { return result; } if (name === object.name) { return object.id; } return null; }, null); } }, { key: "LoadIdsFromArrayToIdObject", value: function LoadIdsFromArrayToIdObject(array, idToObject) {} }, { key: "LoadIdsFromObjectToIdObject", value: function LoadIdsFromObjectToIdObject(object, idToObject) {} }, { key: "GetRandomInt", value: /** * Gets random int exclusive of maximum but inclusive of minimum * @param min * @param max * @returns {*} * @constructor */ function GetRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive } }, { key: "GetRandomIntInclusive", value: /** * Gets random int inclusive of minimum and maximum * @param min * @param max * @returns {*} * @constructor */ function GetRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive } }, { key: "InterpolateArray", value: function InterpolateArray(data, fitCount) { var linearInterpolate = function linearInterpolate(before, after, atPoint) { return before + (after - before) * atPoint; }; var newData = []; var springFactor = Number((data.length - 1) / (fitCount - 1)); newData[0] = data[0]; // for new allocation for (var _i2 = 1; _i2 < fitCount - 1; _i2++) { var tmp = _i2 * springFactor; var before = Number(Math.floor(tmp)).toFixed(); var after = Number(Math.ceil(tmp)).toFixed(); var atPoint = tmp - before; newData[_i2] = linearInterpolate(data[before], data[after], atPoint); } newData[fitCount - 1] = data[data.length - 1]; // for new allocation return newData; } }, { key: "UndefinedOrNull", value: /** * Undefined or null check * @param variable * @returns {boolean} * @constructor */ function UndefinedOrNull(variable) { return typeof variable === 'undefined' || variable === null; } }, { key: "Defined", value: /** * The variable is not undefined and not null * @param variable * @returns {boolean} * @constructor */ function Defined(variable) { return typeof variable !== 'undefined' && variable !== null; } }, { key: "GetParameters", value: /** * Gets function parameters * @param fn * @constructor */ function GetParameters(fn) { var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; var FN_ARG_SPLIT = /,/; var FN_ARG = /^\s*(_?)(.+?)\1\s*$/; var STRIP_COMMENTS = /(\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s*=[^,\)]*(('(?:\\'|[^'\r\n])*')|("(?:\\"|[^"\r\n])*"))|(\s*=[^,\)]*))/mg; var parameters, fnText, argDecl; if (typeof fn !== 'function') { parameters = []; fnText = fn.toString().replace(STRIP_COMMENTS, ''); argDecl = fnText.match(FN_ARGS); argDecl[1].split(FN_ARG_SPLIT).forEach(function (arg) { arg.replace(FN_ARG, function (all, underscore, name) { parameters.push(name); }); }); } else { throw Error("not a function"); } return parameters; } }, { key: "IdOrNull", value: /** * Returns either an ID of the object or Null * @param object * @returns {null} * @constructor */ function IdOrNull(object) { if (Utils.UndefinedOrNull(object)) { return null; } else { if (Utils.UndefinedOrNull(object.id)) { console.warn('saving an object reference with no ID : ', object); return null; } return object.id; } } }, { key: "LimitToPI", value: /** * Limit a property to values between -pi and +pi * @param property * @param objectProperty * @returns {{configurable?: boolean, enumerable?: boolean, value?, writable?: boolean, get?: Function, set?: Function}} * @constructor */ function LimitToPI(property, objectProperty) { var store = objectProperty; return { get: function get() { return store; }, set: function set(value) { while (value > Math.PI) { value -= Math.PI * 2; } while (value < -Math.PI) { value += Math.PI * 2; } store = value; } }; } }, { key: "IdArrayOrEmptyArray", value: /** * Returns an array of IDs representing the objects * @param array * @returns [] * @constructor */ function IdArrayOrEmptyArray(array) { if (Utils.UndefinedOrNull(array)) { return []; } else { return array.map(function (item) { if (Utils.UndefinedOrNull(item.id)) { throw new Error('No ID found while trying to store IDs to array'); } return item.id; }); } } }, { key: "Link", value: /** * Links an object to its parent through idToObject array * @param propertyString * @param idToObject * @param parentObject * @param id * @constructor */ function Link(propertyString, idToObject, parentObject, id) { if (!Utils.UndefinedOrNull(parentObject[propertyString])) { if (!idToObject.hasOwnProperty(id)) { console.warn('Linking failed for object:' + parentObject.name); } parentObject[propertyString] = idToObject[id]; } } }, { key: "RandomId", value: /** * Generates a random ID * @returns {string} * @constructor */ function RandomId(length) { if (Utils.UndefinedOrNull(length)) { length = 10; } return Math.random().toString(36).substr(2, length); } }, { key: "InvertWindingOrder", value: function InvertWindingOrder(triangles) { for (var _i3 = 0; _i3 < triangles.length; _i3++) { var v1 = triangles[_i3].v1; triangles[_i3].v1 = triangles[_i3].v2; triangles[_i3].v2 = v1; var backupUV = triangles[_i3].triangle.v1uv; triangles[_i3].triangle.v1uv = triangles[_i3].triangle.v2uv; triangles[_i3].triangle.v2uv = backupUV; } return triangles; } }, { key: "InvertMeshWindingOrder", value: /** * Inverts a mesh winding order (and its instance) * @param mesh R3.D3.Mesh * @returns {*} * @constructor */ function InvertMeshWindingOrder(mesh) { mesh.faces.forEach(function (face) { var tmpV1 = face.v1; face.v1 = face.v2; face.v2 = tmpV1; var tmpV1uv = face.v1uv; face.v1uv = face.v2uv; face.v2uv = tmpV1uv; }.bind(this)); //mesh.computeNormals = true; //mesh.createInstance(); } }, { key: "ResetWindingOrder", value: /** * This function resets a the winding order of a mesh from a reference point V (the average center of the mesh) */ function ResetWindingOrder(faces, vertices) { var vertexList = new R3.API.Vector3.Points(); for (var v = 0; v < vertices.length; v++) { vertexList.add(new R3.API.Vector3(vertices[v].position.x, vertices[v].position.y, vertices[v].position.z)); } var V = vertexList.average(); var triangles = []; for (var s = 0; s < faces.length; s += 3) { var v0 = faces[s]; var v1 = faces[s + 1]; var v2 = faces[s + 2]; triangles.push({ v0: v0, v1: v1, v2: v2, edges: [{ v0: v0, v1: v1 }, { v0: v1, v1: v2 }, { v0: v2, v1: v0 }], winding: 0, edgeIndex: -1, processed: false }); } for (var _i4 = 0; _i4 < triangles.length; _i4++) { if (R3.API.Vector3.clockwise(vertices[triangles[_i4].v0].position, vertices[triangles[_i4].v1].position, vertices[triangles[_i4].v2].position, V)) { console.log('clockwise'); var bv1 = triangles[_i4].v1; triangles[_i4].v1 = triangles[_i4].v2; triangles[_i4].v2 = bv1; } else { console.log('not clockwise'); } } return triangles; } }, { key: "FixWindingOrder", value: /** * This function resets the winding order for triangles in faces, given an initial triangle and orientation edge * used pseudocode from * http://stackoverflow.com/questions/17036970/how-to-correct-winding-of-triangles-to-counter-clockwise-direction-of-a-3d-mesh * We need to use a graph traversal algorithm, * lets assume we have method that returns neighbor of triangle on given edge * * neighbor_on_egde( next_tria, edge ) * * to_process = set of pairs triangle and orientation edge, initial state is one good oriented triangle with any edge on it * processed = set of processed triangles; initial empty * * while to_process is not empty: * next_tria, orientation_edge = to_process.pop() * add next_tria in processed * if next_tria is not opposite oriented than orientation_edge: * change next_tria (ABC) orientation (B<->C) * for each edge (AB) in next_tria: * neighbor_tria = neighbor_on_egde( next_tria, edge ) * if neighbor_tria exists and neighbor_tria not in processed: * to_process add (neighbor_tria, edge opposite oriented (BA)) * @param faces R3.D3.Face[] * @param orientationEdge R3.API.Vector2 * @returns {Array} */ function FixWindingOrder(faces, orientationEdge) { /** * Checks if a Face belonging to a TriangleEdge has already been processed * @param processed TriangleEdge[] * @param triangle Face * @returns {boolean} */ function inProcessed(processed, triangle) { for (var _i5 = 0; _i5 < processed.length; _i5++) { if (processed[_i5].triangle.equals(triangle)) { return true; } } return false; } /** * Returns a neighbouring triangle on a specific edge - preserving the edge orientation * @param edge R3.API.Vector2 * @param faces R3.D3.Face[] * @param currentTriangle * @returns {*} */ function neighbourOnEdge(edge, faces, currentTriangle) { for (var _i6 = 0; _i6 < faces.length; _i6++) { if (faces[_i6].v0 === edge.x && faces[_i6].v1 === edge.y || faces[_i6].v1 === edge.x && faces[_i6].v2 === edge.y || faces[_i6].v2 === edge.x && faces[_i6].v0 === edge.y || faces[_i6].v0 === edge.y && faces[_i6].v1 === edge.x || faces[_i6].v1 === edge.y && faces[_i6].v2 === edge.x || faces[_i6].v2 === edge.y && faces[_i6].v0 === edge.x) { var triangle = new R3.D3.API.Face(null, null, faces[_i6].v0index, faces[_i6].v1index, faces[_i6].v2index, faces[_i6].materialIndex, faces[_i6].uvs); if (triangle.equals(currentTriangle)) { continue; } return new R3.D3.TriangleEdge(triangle, edge); } } return null; } var toProcess = [new R3.D3.TriangleEdge(new R3.D3.API.Face(null, null, faces[0].v0index, faces[0].v1index, faces[0].v2index, faces[0].materialIndex, faces[0].uvs), orientationEdge)]; var processed = []; while (toProcess.length > 0) { var triangleEdge = toProcess.pop(); /** * If edge is the same orientation (i.e. the edge order is the same as the given triangle edge) it needs to be reversed * to have the same winding order) */ if (triangleEdge.triangle.v0index === triangleEdge.edge.x && triangleEdge.triangle.v1index === triangleEdge.edge.y || triangleEdge.triangle.v1index === triangleEdge.edge.x && triangleEdge.triangle.v2index === triangleEdge.edge.y || triangleEdge.triangle.v2index === triangleEdge.edge.x && triangleEdge.triangle.v0index === triangleEdge.edge.y) { var backupV = triangleEdge.triangle.v1index; triangleEdge.triangle.v1index = triangleEdge.triangle.v2index; triangleEdge.triangle.v2index = backupV; // let backupUV = triangleEdge.triangle.v1uv; // triangleEdge.triangle.v1uv = triangleEdge.triangle.v2uv; // triangleEdge.triangle.v2uv = backupUV; // var backupUV = triangleEdge.triangle.uvs[0][1]; triangleEdge.triangle.uvs[0][1] = triangleEdge.triangle.uvs[0][2]; triangleEdge.triangle.uvs[0][2] = backupUV; } processed.push(triangleEdge); var edges = [new R3.API.Vector2(triangleEdge.triangle.v0index, triangleEdge.triangle.v1index), new R3.API.Vector2(triangleEdge.triangle.v1index, triangleEdge.triangle.v2index), new R3.API.Vector2(triangleEdge.triangle.v2index, triangleEdge.triangle.v0index)]; for (var j = 0; j < edges.length; j++) { var neighbour = neighbourOnEdge(edges[j], faces, triangleEdge.triangle); if (neighbour && !inProcessed(processed, neighbour.triangle)) { toProcess.push(neighbour); } } } /** * In processed - we will have some duplicates - only add the unique ones * @type {Array} */ var triangles = []; for (var _i7 = 0; _i7 < processed.length; _i7++) { var found = false; for (var k = 0; k < triangles.length; k++) { if (triangles[k].equals(processed[_i7].triangle)) { found = true; break; } } if (!found) { triangles.push(processed[_i7].triangle); } } return triangles; } }, { key: "FixPolyZPlane", value: /** * This is a work-around function to fix polys which don't triangulate because * they could lie on Z-plane (XZ or YZ)) - we translate the poly to the origin, systematically rotate the poly around * Z then Y axis * @param verticesFlat [] * @param grain is the amount to systematically rotate the poly by - a finer grain means a more accurate maximum XY * @return [] */ function FixPolyZPlane(verticesFlat, grain) { if (verticesFlat.length % 3 !== 0 && !(verticesFlat.length > 9)) { console.log("The vertices are not in the right length : " + verticesFlat.length); } var vertices = []; var points = new R3.API.Quaternion.Points(); for (var _i8 = 0; _i8 < verticesFlat.length; _i8 += 3) { points.add(new R3.API.Vector3(verticesFlat[_i8], verticesFlat[_i8 + 1], verticesFlat[_i8 + 2])); } points.toOrigin(); points.maximizeXDistance(grain); points.maximizeYDistance(grain); for (i = 0; i < points.vectors.length; i++) { vertices.push([points.vectors[i].x, points.vectors[i].y]); } return vertices; } }, { key: "MovingAverage", value: function MovingAverage(period) { var nums = []; return function (num) { nums.push(num); if (nums.length > period) nums.splice(0, 1); // remove the first element of the array var sum = 0; for (var _i9 in nums) { sum += nums[_i9]; } var n = period; if (nums.length < period) n = nums.length; return sum / n; }; } }, { key: "Intersect", value: function Intersect(a, b) { var t; /** * Loop over shortest array */ if (b.length > a.length) { t = b; b = a; a = t; } return a.filter( /** * Check if exists * @param e * @returns {boolean} */ function (e) { return b.indexOf(e) > -1; }).filter( /** * Remove Duplicates * @param e * @param i * @param c * @returns {boolean} */ function (e, i, c) { return c.indexOf(e) === i; }); } }, { key: "Difference", value: function Difference(a, b) { var t; /** * Loop over shortest array */ if (b.length > a.length) { t = b; b = a; a = t; } return a.filter( /** * Check if exists * @param e * @returns {boolean} */ function (e) { return b.indexOf(e) === -1; }).filter( /** * Remove Duplicates * @param e * @param i * @param c * @returns {boolean} */ function (e, i, c) { return c.indexOf(e) === i; }); } }, { key: "PushUnique", value: /** * Push only if not in there already * @param array * @param object * @constructor */ function PushUnique(array, object) { if (array.indexOf(object) === -1) { array.push(object); } } }, { key: "IsEmpty", value: /** * Checks whether or not the object is empty * @param obj * @returns {boolean} * @constructor */ function IsEmpty(obj) { return Object.keys(obj).length === 0 && obj.constructor === Object; } }, { key: "IsString", value: function IsString(member) { return typeof member === 'string'; } }, { key: "IsBoolean", value: function IsBoolean(member) { return member === true || member === false; } }, { key: "IsColor", value: function IsColor(member) { return member instanceof R3.Color; } }, { key: "IsNumber", value: function IsNumber(member) { return typeof member === 'number'; } }, { key: "IsVector2", value: function IsVector2(member) { return member instanceof R3.API.Vector2 || member instanceof R3.Vector2; } }, { key: "IsVector3", value: function IsVector3(member) { return member instanceof R3.API.Vector3 || member instanceof R3.Vector3; } }, { key: "IsVector4", value: function IsVector4(member) { return member instanceof R3.API.Vector4 || member instanceof R3.Vector4 || member instanceof R3.API.Quaternion || member instanceof R3.Quaternion; } }, { key: "IsObject", value: function IsObject(member) { var type = _typeof(member); return type === 'function' || type === 'object' && !!member; } }, { key: "LowerUnderscore", value: /** * @return {string} */ function LowerUnderscore(name) { var string = name.toLowerCase().replace(/\s+/g, '_'); string = string.replace(/-/g, '_'); string = string.replace(/\_+/g, '_'); return string; } }, { key: "UpperCaseWordsSpaces", value: function UpperCaseWordsSpaces(input) { var word = input.replace(/[-_]/g, ' '); word = word.replace(/\s+/, ' '); var words = word.split(' '); return words.reduce(function (result, word) { result += word[0].toUpperCase() + word.substr(1); return result + ' '; }, '').trim(); } }, { key: "UpperCaseUnderscore", value: /** * @return {string} */ function UpperCaseUnderscore(word) { var str = ''; word.split('').map(function (letter) { if (letter == letter.toUpperCase()) { str += '_' + letter; } else { str += letter.toUpperCase(); } }); str = str.replace(new RegExp('^_'), ''); return str; } }, { key: "PaddedText", value: /** * Returns Left Padded Text - ex. length 5, padchar 0, string abc = '00abc' * @param length * @param padChar * @param string * @returns {string} * @constructor */ function PaddedText(length, padChar, string) { var pad = ""; for (var x = 0; x < length; x++) { pad += padChar; } return pad.substring(0, pad.length - string.length) + string; } }]); return Utils; }(); module.exports = Utils; /***/ }), /***/ "./src/r3/r3.js": /*!**********************!*\ !*** ./src/r3/r3.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var _require = __webpack_require__(/*! ./r3-system */ "./src/r3/r3-system/index.js"), System = _require.System, SystemLinking = _require.SystemLinking, SystemSocket = _require.SystemSocket; var R3Object = __webpack_require__(/*! ./r3-r3-object */ "./src/r3/r3-r3-object.js"); var R3 = /*#__PURE__*/function () { function R3() { _classCallCheck(this, R3); } _createClass(R3, null, [{ key: "version", value: function version() { return 'Fri Jun 18 2021 12:28:24 GMT+0000 (Coordinated Universal Time)'; } }]); return R3; }(); R3.R3Object = R3Object; R3.System = System; R3.System.Linking = SystemLinking; R3.System.Socket = SystemSocket; module.exports = R3; /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1ldmVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtcjMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1zeXN0ZW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0tbGlua2luZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtc3lzdGVtL3IzLXN5c3RlbS1zb2NrZXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXV0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy5qcyJdLCJuYW1lcyI6WyJSMyIsInJlcXVpcmUiLCJTeXN0ZW0iLCJMaW5raW5nIiwic3RhcnQiLCJTb2NrZXQiLCJtb2R1bGUiLCJleHBvcnRzIiwiVXRpbHMiLCJFdmVudCIsImNvbnNvbGUiLCJsb2ciLCJldmVudE5hbWUiLCJjYWxsYmFjayIsIlN1YnNjcmliZSIsImJpbmQiLCJkYXRhIiwiY2xpZW50Q2FsbGJhY2siLCJjbGllbnRFcnJvckNhbGxiYWNrIiwiRW1pdCIsImZuIiwic3Vic2NyaXB0aW9uSWQiLCJSYW5kb21JZCIsIlN1YnNjcmlwdGlvbnMiLCJoYXNPd25Qcm9wZXJ0eSIsIkVycm9yIiwicmVtb3ZlIiwiZXZlbnRJZCIsImxpc3RlbmVycyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJzdWJzY3JpcHRpb25JZHMiLCJtYXAiLCJyZXN1bHQiLCJlcnJvciIsIkNSRUFURV9JTlNUQU5DRSIsIkdFVF9SVU5USU1FIiwiR0VUX1dJTkRPV19TSVpFIiwiSU5TVEFOQ0VfQ1JFQVRFRCIsIk9CSkVDVF9DUkVBVEVEIiwiT0JKRUNUX0lOSVRJQUxJWkVEIiwiUEFVU0UiLCJSRVNUQVJUIiwiU1RBUlQiLCJNQVhfRVZFTlRTIiwiR2V0RXZlbnROYW1lIiwiUjNPYmplY3QiLCJlbWl0IiwiU3lzdGVtTGlua2luZyIsIlN5c3RlbVNvY2tldCIsIkxpbmtpbmdTeXN0ZW0iLCJvYmplY3QiLCJTb2NrZXRTeXN0ZW0iLCJjb25zdHJ1Y3RvciIsIlVuZGVmaW5lZE9yTnVsbCIsInBhcmVudCIsIkdldEZpcnN0UGFyZW50IiwianNvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwibWF0Y2giLCJjbHMiLCJ0ZXN0IiwiY29tcG9uZW50IiwiUHJvamVjdCIsIkdldFBhcmVudFByb2plY3QiLCJwYXJlbnRzIiwicHVzaCIsIkdldFBhcmVudHMiLCJEZWZpbmVkIiwiaW5zdGFuY2UiLCJzZWxlY3QiLCJpZCIsImkiLCJvcHRpb25zIiwidmFsdWUiLCJzZWxlY3RlZEluZGV4IiwidG1wIiwidGV4dCIsInNvcnQiLCJPcHRpb24iLCJwcm9wZXJ0eSIsImluZGV4IiwiZ2V0UGFyZW50Iiwid2FybiIsImltYWdlUGF0aCIsIm5hbWUiLCJkaW1lbnNpb24iLCJ4IiwieSIsInoiLCJ3IiwiYXJyYXkiLCJyZWR1Y2UiLCJmYWNlcyIsImEiLCJiIiwibWF0ZXJpYWxJbmRleCIsImF4aXMiLCJhbmdsZSIsInByb3BlcnR5SWQiLCJydW50aW1lIiwic2l6ZSIsIkdldFdpbmRvd1NpemUiLCJ3aWR0aCIsImhlaWdodCIsImlkVG9PYmplY3QiLCJtaW4iLCJtYXgiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZml0Q291bnQiLCJsaW5lYXJJbnRlcnBvbGF0ZSIsImJlZm9yZSIsImFmdGVyIiwiYXRQb2ludCIsIm5ld0RhdGEiLCJzcHJpbmdGYWN0b3IiLCJOdW1iZXIiLCJ0b0ZpeGVkIiwidmFyaWFibGUiLCJGTl9BUkdTIiwiRk5fQVJHX1NQTElUIiwiRk5fQVJHIiwiU1RSSVBfQ09NTUVOVFMiLCJwYXJhbWV0ZXJzIiwiZm5UZXh0IiwiYXJnRGVjbCIsInRvU3RyaW5nIiwic3BsaXQiLCJmb3JFYWNoIiwiYXJnIiwiYWxsIiwidW5kZXJzY29yZSIsIm9iamVjdFByb3BlcnR5Iiwic3RvcmUiLCJnZXQiLCJzZXQiLCJQSSIsIml0ZW0iLCJwcm9wZXJ0eVN0cmluZyIsInBhcmVudE9iamVjdCIsInN1YnN0ciIsInRyaWFuZ2xlcyIsInYxIiwidjIiLCJiYWNrdXBVViIsInRyaWFuZ2xlIiwidjF1diIsInYydXYiLCJtZXNoIiwiZmFjZSIsInRtcFYxIiwidG1wVjF1diIsInZlcnRpY2VzIiwidmVydGV4TGlzdCIsIkFQSSIsIlZlY3RvcjMiLCJQb2ludHMiLCJ2IiwiYWRkIiwicG9zaXRpb24iLCJWIiwiYXZlcmFnZSIsInMiLCJ2MCIsImVkZ2VzIiwid2luZGluZyIsImVkZ2VJbmRleCIsInByb2Nlc3NlZCIsImNsb2Nrd2lzZSIsImJ2MSIsIm9yaWVudGF0aW9uRWRnZSIsImluUHJvY2Vzc2VkIiwiZXF1YWxzIiwibmVpZ2hib3VyT25FZGdlIiwiZWRnZSIsImN1cnJlbnRUcmlhbmdsZSIsIkQzIiwiRmFjZSIsInYwaW5kZXgiLCJ2MWluZGV4IiwidjJpbmRleCIsInV2cyIsIlRyaWFuZ2xlRWRnZSIsInRvUHJvY2VzcyIsInRyaWFuZ2xlRWRnZSIsInBvcCIsImJhY2t1cFYiLCJWZWN0b3IyIiwiaiIsIm5laWdoYm91ciIsImZvdW5kIiwiayIsInZlcnRpY2VzRmxhdCIsImdyYWluIiwicG9pbnRzIiwiUXVhdGVybmlvbiIsInRvT3JpZ2luIiwibWF4aW1pemVYRGlzdGFuY2UiLCJtYXhpbWl6ZVlEaXN0YW5jZSIsInZlY3RvcnMiLCJwZXJpb2QiLCJudW1zIiwibnVtIiwic3BsaWNlIiwic3VtIiwibiIsInQiLCJmaWx0ZXIiLCJlIiwiaW5kZXhPZiIsImMiLCJvYmoiLCJtZW1iZXIiLCJDb2xvciIsIlZlY3RvcjQiLCJ0eXBlIiwic3RyaW5nIiwidG9Mb3dlckNhc2UiLCJpbnB1dCIsIndvcmQiLCJ3b3JkcyIsInRvVXBwZXJDYXNlIiwidHJp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c291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvcjMvaW5kZXguanNcIik7XG4iLCJjb25zdCBSMyA9IHJlcXVpcmUoJy4vcjMuanMnKTtcblxuUjMuU3lzdGVtLkxpbmtpbmcuc3RhcnQoKTtcblIzLlN5c3RlbS5Tb2NrZXQuc3RhcnQoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSMztcbiIsImNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi9yMy11dGlscycpO1xuXG5jbGFzcyBFdmVudCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc29sZS5sb2coJ0V2ZW50IGNyZWF0ZWQnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTb21lIG5pY2UgRXZlbnRzIGhhbmRsaW5nXG5cdCAqIEB0eXBlIHt7fX1cblx0ICovXG5cdHN0YXRpYyBTdWJzY3JpcHRpb25zID0ge307XG5cblx0c3RhdGljIFN1YnNjcmliZShcblx0XHRldmVudE5hbWUsXG5cdFx0Zm5cblx0KSB7XG5cdFx0LyoqXG5cdFx0ICogVG9kbyAtIG1heWJlIGV2ZW50dWFsbHkgc3RvcmUgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0XHQgKi9cblx0XHRsZXQgc3Vic2NyaXB0aW9uSWQgPSBVdGlscy5SYW5kb21JZCgxMCk7XG5cblx0XHRpZiAoRXZlbnQuU3Vic2NyaXB0aW9ucy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG5cblx0XHRcdGlmIChFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50TmFtZV1bc3Vic2NyaXB0aW9uSWRdKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignQSBjb21wb25lbnQgY2FuIG9ubHkgc3Vic2NyaWJlIHRvIGEgcGFydGljdWxhciBldmVudCBJRCBvbmNlJyk7XG5cdFx0XHR9XG5cblx0XHRcdEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnROYW1lXVtzdWJzY3JpcHRpb25JZF0gPSBmbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0RXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudE5hbWVdID0ge307XG5cdFx0XHRFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50TmFtZV1bc3Vic2NyaXB0aW9uSWRdID0gZm47XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBjYWxsZXIgdG8gYWxsb3cgdXMgdG8gdW5zdWJzY3JpYmUgdG8gdGhpcyBldmVudFxuXHRcdCAqL1xuXHRcdHJldHVybiB7XG5cdFx0XHRmbjogZm4sXG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uIChldmVudElkLCBzdWJzY3JpcHRpb25JZCkge1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBTdG9wIGxpc3RlbmluZyBmb3IgdGhpcyBldmVudCBmcm9tIHRoaXMgY29tcG9uZW50XG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0ZGVsZXRlIEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF1bc3Vic2NyaXB0aW9uSWRdO1xuXG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogSWYgdGhlIGxlbmd0aCBvZiBsaXN0ZW5lcnMgaXMgMCwgc3RvcCByZWZlcmVuY2luZyB0aGlzIGV2ZW50XG5cdFx0XHRcdFx0ICogQHR5cGUge3N0cmluZ1tdfVxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGxldCBsaXN0ZW5lcnMgPSBPYmplY3Qua2V5cyhFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdKTtcblx0XHRcdFx0XHRpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH0oZXZlbnROYW1lLCBzdWJzY3JpcHRpb25JZCksXG5cdFx0XHRzdWJzY3JpcHRpb25JZCA6IHN1YnNjcmlwdGlvbklkXG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogU3Vic2NyaWJlIHRvIHNvbWUgZXZlbnRzXG5cdCAqIEBwYXJhbSBldmVudE5hbWVcblx0ICogQHBhcmFtIGNhbGxiYWNrXG5cdCAqL1xuXHRzdWJzY3JpYmUoXG5cdFx0ZXZlbnROYW1lLFxuXHRcdGNhbGxiYWNrXG5cdCkge1xuXHRcdHJldHVybiBFdmVudC5TdWJzY3JpYmUoZXZlbnROYW1lLCBjYWxsYmFjay5iaW5kKHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogU3RhdGljIFN5bmNocm9ub3VzIEV2ZW50IC0gQ2FsbHMgY2xpZW50Q2FsbGJhY2sgZGlyZWN0bHkgYWZ0ZXIgdGhlIGV2ZW50IHJlc3VsdCBpcyBvYnRhaW5lZFxuXHQgKiBAcGFyYW0gZXZlbnRJZFxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcGFyYW0gY2xpZW50Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgaWRlYWxseSB3aGVuIHRoZSBldmVudCBjb21wbGV0ZWRcblx0ICogQHBhcmFtIGNsaWVudEVycm9yQ2FsbGJhY2tcblx0ICogQHJldHVybnMge251bWJlcn0gb2YgY2FsbGJhY2tzIGV4ZWN1dGVkXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEVtaXQoXG5cdFx0ZXZlbnRJZCxcblx0XHRkYXRhLFxuXHRcdGNsaWVudENhbGxiYWNrLFxuXHRcdGNsaWVudEVycm9yQ2FsbGJhY2tcblx0KSB7XG5cdFx0aWYgKEV2ZW50LlN1YnNjcmlwdGlvbnMuaGFzT3duUHJvcGVydHkoZXZlbnRJZCkpIHtcblxuXHRcdFx0bGV0IHN1YnNjcmlwdGlvbklkcyA9IE9iamVjdC5rZXlzKEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF0pO1xuXG5cdFx0XHRzdWJzY3JpcHRpb25JZHMubWFwKFxuXHRcdFx0XHRmdW5jdGlvbihzdWJzY3JpcHRpb25JZCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0ID0gRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXVtzdWJzY3JpcHRpb25JZF0oZGF0YSk7XG5cblx0XHRcdFx0XHRcdGlmIChjbGllbnRDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRDYWxsYmFjayhyZXN1bHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2xpZW50RXJyb3JDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrKGVycm9yKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHR9XG5cdH1cblxuXHRlbWl0KFxuXHRcdGV2ZW50TmFtZSxcblx0XHRkYXRhLFxuXHRcdGNsaWVudENhbGxiYWNrLFxuXHRcdGNsaWVudEVycm9yQ2FsbGJhY2tcblx0KSB7XG5cdFx0cmV0dXJuIEV2ZW50LkVtaXQoXG5cdFx0XHRldmVudE5hbWUsXG5cdFx0XHRkYXRhLFxuXHRcdFx0Y2xpZW50Q2FsbGJhY2ssXG5cdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIHRoZSBmdW5jdGlvbnMgd2hpY2ggc3Vic2NyaWJlIHRvIHRoaXMgZXZlbnQsIGJ1dCBkb24ndCBwcm9jZXNzIHRoZSBjbGllbnQgY2FsbGJhY2sgLSB0aGUgc3Vic2NyaXB0aW9uIGZ1bmN0aW9uXG5cdCAqIHNob3VsZCBleGVjdXRlIHRoZSBjbGllbnQgY2FsbGJhY2tcblx0ICogQHBhcmFtIGV2ZW50SWRcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHBhcmFtIGNsaWVudENhbGxiYWNrXG5cdCAqIEBwYXJhbSBjbGllbnRFcnJvckNhbGxiYWNrXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEFzeW5jKFxuXHRcdGV2ZW50SWQsXG5cdFx0ZGF0YSxcblx0XHRjbGllbnRDYWxsYmFjayxcblx0XHRjbGllbnRFcnJvckNhbGxiYWNrXG5cdCkge1xuXHRcdGlmIChFdmVudC5TdWJzY3JpcHRpb25zLmhhc093blByb3BlcnR5KGV2ZW50SWQpKSB7XG5cblx0XHRcdGxldCBzdWJzY3JpcHRpb25JZHMgPSBPYmplY3Qua2V5cyhFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdKTtcblxuXHRcdFx0c3Vic2NyaXB0aW9uSWRzLm1hcChcblx0XHRcdFx0ZnVuY3Rpb24oc3Vic2NyaXB0aW9uSWQpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0RXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXVtzdWJzY3JpcHRpb25JZF0oZGF0YSwgY2xpZW50Q2FsbGJhY2ssIGNsaWVudEVycm9yQ2FsbGJhY2spO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2xpZW50RXJyb3JDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrKGVycm9yKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHR9XG5cdH07XG5cbn1cblxuLy9FVkVOVF9HRU5FUkFURURfU1RBUlRcbkV2ZW50LkNSRUFURV9JTlNUQU5DRSA9IDB4MTtcbkV2ZW50LkdFVF9SVU5USU1FID0gMHgyO1xuRXZlbnQuR0VUX1dJTkRPV19TSVpFID0gMHgzO1xuRXZlbnQuSU5TVEFOQ0VfQ1JFQVRFRCA9IDB4NDtcbkV2ZW50Lk9CSkVDVF9DUkVBVEVEID0gMHg1O1xuRXZlbnQuT0JKRUNUX0lOSVRJQUxJWkVEID0gMHg2O1xuRXZlbnQuUEFVU0UgPSAweDc7XG5FdmVudC5SRVNUQVJUID0gMHg4O1xuRXZlbnQuU1RBUlQgPSAweDk7XG5FdmVudC5NQVhfRVZFTlRTID0gMHhhO1xuXG5FdmVudC5HZXRFdmVudE5hbWUgPSBmdW5jdGlvbihldmVudElkKSB7XG5cblx0c3dpdGNoKGV2ZW50SWQpIHtcblx0XHRjYXNlIDB4MSA6IHJldHVybiAnY3JlYXRlX2luc3RhbmNlJztcblx0XHRjYXNlIDB4MiA6IHJldHVybiAnZ2V0X3J1bnRpbWUnO1xuXHRcdGNhc2UgMHgzIDogcmV0dXJuICdnZXRfd2luZG93X3NpemUnO1xuXHRcdGNhc2UgMHg0IDogcmV0dXJuICdpbnN0YW5jZV9jcmVhdGVkJztcblx0XHRjYXNlIDB4NSA6IHJldHVybiAnb2JqZWN0X2NyZWF0ZWQnO1xuXHRcdGNhc2UgMHg2IDogcmV0dXJuICdvYmplY3RfaW5pdGlhbGl6ZWQnO1xuXHRcdGNhc2UgMHg3IDogcmV0dXJuICdwYXVzZSc7XG5cdFx0Y2FzZSAweDggOiByZXR1cm4gJ3Jlc3RhcnQnO1xuXHRcdGNhc2UgMHg5IDogcmV0dXJuICdzdGFydCc7XG5cdFx0ZGVmYXVsdCA6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0V2ZW50IHR5cGUgbm90IGRlZmluZWQgOiAnICsgZXZlbnRJZCk7XG5cdH1cblxufTtcbi8vRVZFTlRfR0VORVJBVEVEX0VORFxuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50O1xuIiwiY29uc3QgRXZlbnQgPSByZXF1aXJlKCcuL3IzLWV2ZW50Jyk7XG5cbmNsYXNzIFIzT2JqZWN0IGV4dGVuZHMgRXZlbnQge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdGNvbnNvbGUubG9nKCdPYmplY3QgY3JlYXRlZCcpO1xuXG5cdFx0dGhpcy5lbWl0KEV2ZW50Lk9CSkVDVF9DUkVBVEVEKTtcblxuXHR9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSM09iamVjdDsiLCJjb25zdCBTeXN0ZW0gPSByZXF1aXJlKCcuL3IzLXN5c3RlbScpO1xuY29uc3QgU3lzdGVtTGlua2luZyA9IHJlcXVpcmUoJy4vcjMtc3lzdGVtLWxpbmtpbmcnKTtcbmNvbnN0IFN5c3RlbVNvY2tldCA9IHJlcXVpcmUoJy4vcjMtc3lzdGVtLXNvY2tldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU3lzdGVtLFxuICBTeXN0ZW1MaW5raW5nLFxuICBTeXN0ZW1Tb2NrZXRcbn0iLCJjb25zdCBTeXN0ZW0gPSByZXF1aXJlKCcuL3IzLXN5c3RlbScpO1xuY29uc3QgUjNPYmplY3QgPSByZXF1aXJlKCcuLi9yMy1yMy1vYmplY3QnKTtcbmNvbnN0IEV2ZW50ID0gcmVxdWlyZSgnLi4vcjMtZXZlbnQnKTtcblxuY2xhc3MgTGlua2luZ1N5c3RlbSBleHRlbmRzIFN5c3RlbSB7XG5cblx0c3RhdGljIHN0YXJ0KCkge1xuXG5cdFx0c3VwZXIuc3RhcnQoKTtcblx0XHRcblx0XHRjb25zb2xlLmxvZygnc3RhcnRpbmcgbGlua2luZyBzeXN0ZW0nKTtcblxuXHRcdEV2ZW50LlN1YnNjcmliZShcblx0XHRcdEV2ZW50Lk9CSkVDVF9DUkVBVEVELFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmxvZygnbGlua2luZyBzeXN0ZW0gZGlzY292ZXJlZCBhbiBvYmplY3QnKTtcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0bGV0IG9iamVjdCA9IG5ldyBSM09iamVjdCgpO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVx0XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMaW5raW5nU3lzdGVtO1xuIiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0uanMnKTtcblxuY2xhc3MgU29ja2V0U3lzdGVtIGV4dGVuZHMgU3lzdGVtIHtcblxuXHRzdGF0aWMgc3RhcnQoKSB7XG5cblx0XHRzdXBlci5zdGFydCgpO1xuXHRcdFxuXHRcdGNvbnNvbGUubG9nKCdzdGFydGluZyBzb2NrZXQgc3lzdGVtJyk7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XHRcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNvY2tldFN5c3RlbTsiLCJjbGFzcyBTeXN0ZW0ge1xuXG5cdHN0YXRpYyBzdGFydCgpIHtcblx0XHRjb25zb2xlLmxvZygnc3RhcnRpbmcgYSBzeXN0ZW0nKTtcdFxuXHR9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTeXN0ZW07XG4iLCJjbGFzcyBVdGlscyB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0XG5cdH1cblx0XG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmaXJzdCBwYXJlbnQgb2YgdGhlIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBwYXJhbSBjb25zdHJ1Y3RvclxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0Rmlyc3RQYXJlbnQob2JqZWN0LCBjb25zdHJ1Y3Rvcikge1xuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb25zdHJ1Y3RvcikpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc3BlY2lmeSBhIGNvbnN0cnVjdG9yJyk7XG5cdFx0fVxuXG5cdFx0aWYgKG9iamVjdC5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChvYmplY3QucGFyZW50IGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcblx0XHRcdHJldHVybiBvYmplY3QucGFyZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gVXRpbHMuR2V0Rmlyc3RQYXJlbnQob2JqZWN0LnBhcmVudCwgY29uc3RydWN0b3IpO1xuXHRcdH1cblxuXHR9O1xuXG5cdHN0YXRpYyBTeW50YXhIaWdobGlnaHQoanNvbikge1xuXHRcdGlmICh0eXBlb2YganNvbiAhPSAnc3RyaW5nJykge1xuXHRcdFx0anNvbiA9IEpTT04uc3RyaW5naWZ5KGpzb24sIHVuZGVmaW5lZCwgMik7XG5cdFx0fVxuXHRcdGpzb24gPSBqc29uLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblx0XHRyZXR1cm4ganNvbi5yZXBsYWNlKC8oXCIoXFxcXHVbYS16QS1aMC05XXs0fXxcXFxcW151XXxbXlxcXFxcIl0pKlwiKFxccyo6KT98XFxiKHRydWV8ZmFsc2V8bnVsbClcXGJ8LT9cXGQrKD86XFwuXFxkKik/KD86W2VFXVsrXFwtXT9cXGQrKT8pL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuXHRcdFx0bGV0IGNscyA9ICdudW1iZXInO1xuXHRcdFx0aWYgKC9eXCIvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRcdGlmICgvOiQvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRcdFx0Y2xzID0gJ2tleSc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2xzID0gJ3N0cmluZyc7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoL3RydWV8ZmFsc2UvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRcdGNscyA9ICdib29sZWFuJztcblx0XHRcdH0gZWxzZSBpZiAoL251bGwvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRcdGNscyA9ICdudWxsJztcblx0XHRcdH1cblx0XHRcdHJldHVybiAnPHNwYW4gY2xhc3M9XCInICsgY2xzICsgJ1wiPicgKyBtYXRjaCArICc8L3NwYW4+Jztcblx0XHR9KTtcblx0fTtcblxuXHRzdGF0aWMgR2V0UGFyZW50UHJvamVjdChjb21wb25lbnQpIHtcblxuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwoY29tcG9uZW50LnBhcmVudCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignUGFyZW50IG5vdCBmb3VuZCcpO1xuXHRcdH1cblxuXHRcdGlmIChjb21wb25lbnQucGFyZW50IGluc3RhbmNlb2YgUjMuUHJvamVjdCkge1xuXHRcdFx0cmV0dXJuIGNvbXBvbmVudC5wYXJlbnQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFV0aWxzLkdldFBhcmVudFByb2plY3QoY29tcG9uZW50LnBhcmVudCk7XG5cdH07XG5cblx0c3RhdGljIEdldFBhcmVudHMoY29tcG9uZW50LCBwYXJlbnRzKSB7XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKHBhcmVudHMpKSB7XG5cdFx0XHRwYXJlbnRzID0gW107XG5cdFx0fVxuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb21wb25lbnQucGFyZW50KSkge1xuXHRcdFx0cmV0dXJuIHBhcmVudHM7XG5cdFx0fVxuXG5cdFx0cGFyZW50cy5wdXNoKGNvbXBvbmVudC5wYXJlbnQpO1xuXG5cdFx0cmV0dXJuIFV0aWxzLkdldFBhcmVudHMoY29tcG9uZW50LnBhcmVudCwgcGFyZW50cyk7XG5cblx0fTtcblxuXHQvKipcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdHN0YXRpYyBJbnN0YW5jZShjb21wb25lbnQpIHtcblx0XHRyZXR1cm4gVXRpbHMuRGVmaW5lZChjb21wb25lbnQpICYmIFV0aWxzLkRlZmluZWQoY29tcG9uZW50Lmluc3RhbmNlKTtcblx0fTtcblxuXHQvKipcblx0ICogVXRpbHMuUmVtb3ZlRnJvbVNlbGVjdFxuXHQgKiBAcGFyYW0gc2VsZWN0XG5cdCAqIEBwYXJhbSBpZFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgUmVtb3ZlRnJvbVNlbGVjdChzZWxlY3QsIGlkKSB7XG5cblx0XHRsZXQgaTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHNlbGVjdC5vcHRpb25zW2ldLnZhbHVlID09PSBpZCkge1xuXHRcdFx0XHRzZWxlY3QucmVtb3ZlKGkpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBVdGlscy5HZXRTZWxlY3RJbmRleFxuXHQgKlxuXHQgKiBHZXQgdGhlIHNlbGVjdCBpbmRleCBvZiBnaXZlbiBpZFxuXHQgKlxuXHQgKiBAcGFyYW0gc2VsZWN0XG5cdCAqIEBwYXJhbSBpZFxuXHQgKiBAcmV0dXJucyBib29sZWFuIHRydWUgaWYgc3VjY2Vzc2Z1bFxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBTZXRTZWxlY3RJbmRleChzZWxlY3QsIGlkKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHNlbGVjdC5vcHRpb25zW2ldLnZhbHVlID09PSBpZCkge1xuXHRcdFx0XHRzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0c3RhdGljIFNvcnRTZWxlY3Qoc2VsZWN0KSB7XG5cblx0XHRsZXQgdG1wID0gW107XG5cdFx0bGV0IGk7XG5cblx0XHRmb3IgKGkgPSAxOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRtcFtpLTFdID0gW107XG5cdFx0XHR0bXBbaS0xXVswXSA9IHNlbGVjdC5vcHRpb25zW2ldLnRleHQ7XG5cdFx0XHR0bXBbaS0xXVsxXSA9IHNlbGVjdC5vcHRpb25zW2ldLnZhbHVlO1xuXHRcdH1cblxuXHRcdHRtcC5zb3J0KCk7XG5cblx0XHRzZWxlY3Qub3B0aW9ucyA9IFtzZWxlY3Qub3B0aW9uc1swXV07XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzZWxlY3Qub3B0aW9uc1tpKzFdID0gbmV3IE9wdGlvbih0bXBbaV1bMF0sIHRtcFtpXVsxXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwYXJlbnQgb2Ygb2JqZWN0IHdoaXRoIHByb3BlcnR5IG9mIG9wdGlvbmFsIHR5cGUgY29uc3RydWN0b3IuIElmIGluZGV4IGlzIHNwZWNpZmllZCwgZ2V0IHRoZSBwYXJlbnQgb2YgdGhlXG5cdCAqIG9iamVjdCB3aXRoIHByb3BlcnR5W2luZGV4XSAtIHdoaWNoIG1lYW5zIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXlcblx0ICogQHBhcmFtIG9iamVjdFxuXHQgKiBAcGFyYW0gcHJvcGVydHlcblx0ICogQHBhcmFtIGluZGV4XG5cdCAqIEBwYXJhbSBjb25zdHJ1Y3RvclxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0UGFyZW50KG9iamVjdCwgcHJvcGVydHksIGluZGV4LCBjb25zdHJ1Y3Rvcikge1xuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb25zdHJ1Y3RvcikpIHtcblx0XHRcdGNvbnN0cnVjdG9yID0gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGluZGV4KSkge1xuXHRcdFx0aW5kZXggPSBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChvYmplY3QucGFyZW50KSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFBhcmVudCBkZWZpbmVkXG5cdFx0XHQgKi9cblx0XHRcdGlmIChvYmplY3QucGFyZW50Lmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuXG5cdFx0XHRcdGlmIChjb25zdHJ1Y3Rvcikge1xuXG5cdFx0XHRcdFx0aWYgKGluZGV4KSB7XG5cblx0XHRcdFx0XHRcdGlmIChvYmplY3QucGFyZW50W3Byb3BlcnR5XVtpbmRleF0gaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudFtwcm9wZXJ0eV1baW5kZXhdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdC5wYXJlbnQuZ2V0UGFyZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9iamVjdC5wYXJlbnQuZ2V0UGFyZW50KHByb3BlcnR5LCBpbmRleCwgY29uc3RydWN0b3IpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybignZ2V0UGFyZW50IG5vdCBkZWZpbmVkIG9uIEFQSSBvYmplY3QgOiAnICsgb2JqZWN0LnBhcmVudCArICcgLSB5b3Ugc2hvdWxkIGF2b2lkIGhhdmluZyB0aGVzZSBtZXNzc2FnZXMnKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmIChvYmplY3QucGFyZW50W3Byb3BlcnR5XSBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50W3Byb3BlcnR5XTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3QucGFyZW50LmdldFBhcmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50LmdldFBhcmVudChwcm9wZXJ0eSwgaW5kZXgsIGNvbnN0cnVjdG9yKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ2dldFBhcmVudCBub3QgZGVmaW5lZCBvbiBBUEkgb2JqZWN0IDogJyArIG9iamVjdC5wYXJlbnQgKyAnIC0geW91IHNob3VsZCBhdm9pZCBoYXZpbmcgdGhlc2UgbWVzc3NhZ2VzJyk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKGluZGV4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudFtwcm9wZXJ0eV1baW5kZXhdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudFtwcm9wZXJ0eV07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoaXMgcGFyZW50IGRvZXMgbm90IGhhdmUgdGhlIHByb3BlcnR5IC0gZ28gYSBsZXZlbCBoaWdoZXJcblx0XHRcdFx0ICovXG5cdFx0XHRcdGlmICh0eXBlb2Ygb2JqZWN0LnBhcmVudC5nZXRQYXJlbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudC5nZXRQYXJlbnQocHJvcGVydHksIGluZGV4LCBjb25zdHJ1Y3Rvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdnZXRQYXJlbnQgbm90IGRlZmluZWQgb24gQVBJIG9iamVjdCA6ICcgKyBvYmplY3QucGFyZW50ICsgJyAtIHlvdSBzaG91bGQgYXZvaWQgaGF2aW5nIHRoZXNlIG1lc3NzYWdlcycpO1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBObyBwYXJlbnQgZGVmaW5lZFxuXHRcdFx0ICovXG5cdFx0XHRjb25zb2xlLndhcm4oJ3Byb3BlcnR5IDogJyArIHByb3BlcnR5ICsgJyBvZiB0eXBlICcgKyBjb25zdHJ1Y3RvciArICcgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGFyZW50IGNoYWluJyk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0fTtcblxuXG5cdC8qKlxuXHQgKiBTdHJpcHMgaW1hZ2UgZXh0ZW5zaW9uIGZyb20gZ2l2ZW4gcGF0aFxuXHQgKiBAcGFyYW0gaW1hZ2VQYXRoXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFN0cmlwSW1hZ2VFeHRlbnNpb24oaW1hZ2VQYXRoKSB7XG5cdFx0cmV0dXJuIGltYWdlUGF0aC5yZXBsYWNlKC8oXFwucG5nJHxcXC5naWYkfFxcLmpwZWckfFxcLmpwZyQpLywnJylcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIHVubG9hZGVkXG5cdCAqIEBwYXJhbSBjb21wb25lbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFVubG9hZGVkKGNvbXBvbmVudCkge1xuXHRcdGlmIChcblx0XHRcdFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb21wb25lbnQpIHx8XG5cdFx0XHRVdGlscy5VbmRlZmluZWRPck51bGwoY29tcG9uZW50Lmluc3RhbmNlKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBMb2FkZWQoY29tcG9uZW50KSB7XG5cdFx0aWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuaW5zdGFuY2UpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXHRzdGF0aWMgQnVpbGRWZWN0b3JTb3VyY2UocmVzdWx0LCBuYW1lLCBkaW1lbnNpb24pIHtcblxuXHRcdGlmIChkaW1lbnNpb24gPT09IDIpIHtcblx0XHRcdHJlc3VsdFtuYW1lXSA9IHt9O1xuXHRcdFx0cmVzdWx0W25hbWVdLnggPSBmYWxzZTtcblx0XHRcdHJlc3VsdFtuYW1lXS55ID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGRpbWVuc2lvbiA9PT0gMykge1xuXHRcdFx0cmVzdWx0W25hbWVdID0ge307XG5cdFx0XHRyZXN1bHRbbmFtZV0ueCA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRcdHJlc3VsdFtuYW1lXS55ID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGRpbWVuc2lvbiA9PT0gNCkge1xuXHRcdFx0cmVzdWx0W25hbWVdID0ge307XG5cdFx0XHRyZXN1bHRbbmFtZV0ueCA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRcdHJlc3VsdFtuYW1lXS56ID0gZmFsc2U7XG5cdFx0XHRyZXN1bHRbbmFtZV0udyA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnNvbGUud2FybigndW5rbm93biBkaW1lbnNpb24gOiAnICsgZGltZW5zaW9uKTtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgJ2luc3RhbmNlcycgb2YgdGhlIGFycmF5LCBvciBudWxsIGlmIGFuICdpbnN0YW5jZScgaXMgdW5kZWZpbmVkXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0gYXJyYXlcblx0ICovXG5cdHN0YXRpYyBHZXRBcnJheUluc3RhbmNlcyhhcnJheSkge1xuXHRcdHJldHVybiBhcnJheS5yZWR1Y2UoXG5cdFx0XHRmdW5jdGlvbihyZXN1bHQsIG9iamVjdCkge1xuXG5cdFx0XHRcdGlmIChyZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChvYmplY3QuaW5zdGFuY2UpKSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gbnVsbDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChvYmplY3QuaW5zdGFuY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRbXVxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIFNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleChmYWNlcykge1xuXG5cdFx0LyoqXG5cdFx0ICogU29ydHMgZmFjZXMgYWNjb3JkaW5nIHRvIG1hdGVyaWFsIGluZGV4IGJlY2F1c2UgbGF0ZXIgd2Ugd2lsbCBjcmVhdGVcblx0XHQgKiBncm91cHMgZm9yIGVhY2ggdmVydGljZSBncm91cFxuXHRcdCAqL1xuXHRcdGZhY2VzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuXG5cdFx0XHRpZiAoYS5tYXRlcmlhbEluZGV4IDwgYi5tYXRlcmlhbEluZGV4KSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGEubWF0ZXJpYWxJbmRleCA+IGIubWF0ZXJpYWxJbmRleCkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZmFjZXM7XG5cdH07XG5cblx0c3RhdGljIEJ1aWxkUXVhdGVybmlvblNvdXJjZShyZXN1bHQsIG5hbWUpIHtcblx0XHRyZXN1bHRbbmFtZV0gPSB7fTtcblx0XHRyZXN1bHRbbmFtZV0uYXhpcyA9IHt9O1xuXHRcdHJlc3VsdFtuYW1lXS5heGlzLnggPSBmYWxzZTtcblx0XHRyZXN1bHRbbmFtZV0uYXhpcy55ID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLmF4aXMueiA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS5hbmdsZSA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS54ID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRyZXN1bHRbbmFtZV0ueiA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS53ID0gZmFsc2U7XG5cdH07XG5cblx0c3RhdGljIE9iamVjdFByb3BlcnRpZXNBc0Jvb2xlYW4ob2JqZWN0KSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkucmVkdWNlKFxuXHRcdFx0ZnVuY3Rpb24ocmVzdWx0LCBwcm9wZXJ0eUlkKSB7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3RbcHJvcGVydHlJZF0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0W3Byb3BlcnR5SWRdID0gZmFsc2U7XG5cblx0XHRcdFx0Ly8gaWYgKG9iamVjdFtwcm9wZXJ0eUlkXSBpbnN0YW5jZW9mIFIzLlZlY3RvcjIpIHtcblx0XHRcdFx0Ly8gICAgIFV0aWxzLkJ1aWxkVmVjdG9yU291cmNlKHJlc3VsdCwgcHJvcGVydHlJZCwgMik7XG5cdFx0XHRcdC8vIH1cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gaWYgKG9iamVjdFtwcm9wZXJ0eUlkXSBpbnN0YW5jZW9mIFIzLlZlY3RvcjMpIHtcblx0XHRcdFx0Ly8gICAgIFV0aWxzLkJ1aWxkVmVjdG9yU291cmNlKHJlc3VsdCwgcHJvcGVydHlJZCwgMyk7XG5cdFx0XHRcdC8vIH1cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gaWYgKG9iamVjdFtwcm9wZXJ0eUlkXSBpbnN0YW5jZW9mIFIzLlZlY3RvcjQpIHtcblx0XHRcdFx0Ly8gICAgIFV0aWxzLkJ1aWxkVmVjdG9yU291cmNlKHJlc3VsdCwgcHJvcGVydHlJZCwgNCk7XG5cdFx0XHRcdC8vIH1cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gaWYgKG9iamVjdFtwcm9wZXJ0eUlkXSBpbnN0YW5jZW9mIFIzLlF1YXRlcm5pb24pIHtcblx0XHRcdFx0Ly8gICAgIFV0aWxzLkJ1aWxkUXVhdGVybmlvblNvdXJjZShyZXN1bHQsIHByb3BlcnR5SWQpO1xuXHRcdFx0XHQvLyB9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0fS5iaW5kKHRoaXMpLFxuXHRcdFx0e31cblx0XHQpO1xuXHR9O1xuXG5cdHN0YXRpYyBHZXRSdW50aW1lKCkge1xuXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XG5cblx0XHRSMy5FdmVudC5FbWl0KFxuXHRcdFx0UjMuRXZlbnQuR0VUX1JVTlRJTUUsXG5cdFx0XHRudWxsLFxuXHRcdFx0ZnVuY3Rpb24ocnVudGltZSkge1xuXHRcdFx0XHRyZXN1bHQgPSBydW50aW1lO1xuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB3aW5kb3cgc2l6ZSBvciBudWxsXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBHZXRXaW5kb3dTaXplKCkge1xuXG5cdFx0bGV0IHNpemUgPSBudWxsO1xuXG5cdFx0UjMuRXZlbnQuRW1pdChcblx0XHRcdFIzLkV2ZW50LkdFVF9XSU5ET1dfU0laRSxcblx0XHRcdG51bGwsXG5cdFx0XHRmdW5jdGlvbihkYXRhKSB7XG5cdFx0XHRcdHNpemUgPSBkYXRhO1xuXHRcdFx0fS5iaW5kKHRoaXMpXG5cdFx0KTtcblxuXHRcdHJldHVybiBzaXplO1xuXG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBvYmplY3Qgd2lkdGggYW5kIGhlaWdodCBtZW1iZXJzIHdpdGggd2luZG93IHNpemVcblx0ICogQHBhcmFtIG9iamVjdFxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBVcGRhdGVXaW5kb3dTaXplKG9iamVjdCkge1xuXHRcdGxldCBzaXplID0gVXRpbHMuR2V0V2luZG93U2l6ZSgpO1xuXHRcdG9iamVjdC53aWR0aCA9IHNpemUud2lkdGg7XG5cdFx0b2JqZWN0LmhlaWdodCA9IHNpemUuaGVpZ2h0O1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgaWQgb2Ygb2JqZWN0IHdpdGggdGhlIG5hbWUgaWYgaXQgZXhpc3RzIGluIHRoZSBhcnJheSwgb3RoZXJ3aXNlIG51bGxcblx0ICogQHBhcmFtIG5hbWVcblx0ICogQHBhcmFtIGFycmF5XG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBPYmplY3RJZFdpdGhOYW1lSW5BcnJheShuYW1lLCBhcnJheSkge1xuXG5cdFx0cmV0dXJuIGFycmF5LnJlZHVjZShcblx0XHRcdGZ1bmN0aW9uKHJlc3VsdCwgb2JqZWN0KSB7XG5cblx0XHRcdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAobmFtZSA9PT0gb2JqZWN0Lm5hbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LmlkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9LFxuXHRcdFx0bnVsbFxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIExvYWRJZHNGcm9tQXJyYXlUb0lkT2JqZWN0KGFycmF5LCBpZFRvT2JqZWN0KSB7XG5cblx0fTtcblxuXHRzdGF0aWMgTG9hZElkc0Zyb21PYmplY3RUb0lkT2JqZWN0KG9iamVjdCwgaWRUb09iamVjdCkge1xuXG5cblx0fTtcblxuXHQvKipcblx0ICogR2V0cyByYW5kb20gaW50IGV4Y2x1c2l2ZSBvZiBtYXhpbXVtIGJ1dCBpbmNsdXNpdmUgb2YgbWluaW11bVxuXHQgKiBAcGFyYW0gbWluXG5cdCAqIEBwYXJhbSBtYXhcblx0ICogQHJldHVybnMgeyp9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEdldFJhbmRvbUludChtaW4sIG1heCkge1xuXHRcdG1pbiA9IE1hdGguY2VpbChtaW4pO1xuXHRcdG1heCA9IE1hdGguZmxvb3IobWF4KTtcblx0XHRyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluOyAvL1RoZSBtYXhpbXVtIGlzIGV4Y2x1c2l2ZSBhbmQgdGhlIG1pbmltdW0gaXMgaW5jbHVzaXZlXG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgcmFuZG9tIGludCBpbmNsdXNpdmUgb2YgbWluaW11bSBhbmQgbWF4aW11bVxuXHQgKiBAcGFyYW0gbWluXG5cdCAqIEBwYXJhbSBtYXhcblx0ICogQHJldHVybnMgeyp9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEdldFJhbmRvbUludEluY2x1c2l2ZShtaW4sIG1heCkge1xuXHRcdG1pbiA9IE1hdGguY2VpbChtaW4pO1xuXHRcdG1heCA9IE1hdGguZmxvb3IobWF4KTtcblx0XHRyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsgLy9UaGUgbWF4aW11bSBpcyBpbmNsdXNpdmUgYW5kIHRoZSBtaW5pbXVtIGlzIGluY2x1c2l2ZVxuXHR9O1xuXG5cdHN0YXRpYyBJbnRlcnBvbGF0ZUFycmF5KGRhdGEsIGZpdENvdW50KSB7XG5cblx0XHRsZXQgbGluZWFySW50ZXJwb2xhdGUgPSBmdW5jdGlvbihiZWZvcmUsIGFmdGVyLCBhdFBvaW50KSB7XG5cdFx0XHRyZXR1cm4gYmVmb3JlICsgKGFmdGVyIC0gYmVmb3JlKSAqIGF0UG9pbnQ7XG5cdFx0fTtcblxuXHRcdGxldCBuZXdEYXRhID0gW107XG5cblx0XHRsZXQgc3ByaW5nRmFjdG9yID0gTnVtYmVyKChkYXRhLmxlbmd0aCAtIDEpIC8gKGZpdENvdW50IC0gMSkpO1xuXG5cdFx0bmV3RGF0YVswXSA9IGRhdGFbMF07IC8vIGZvciBuZXcgYWxsb2NhdGlvblxuXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgZml0Q291bnQgLSAxOyBpKyspIHtcblx0XHRcdGxldCB0bXAgICAgID0gaSAqIHNwcmluZ0ZhY3Rvcjtcblx0XHRcdGxldCBiZWZvcmUgID0gTnVtYmVyKE1hdGguZmxvb3IodG1wKSkudG9GaXhlZCgpO1xuXHRcdFx0bGV0IGFmdGVyICAgPSBOdW1iZXIoTWF0aC5jZWlsKHRtcCkpLnRvRml4ZWQoKTtcblx0XHRcdGxldCBhdFBvaW50ID0gdG1wIC0gYmVmb3JlO1xuXHRcdFx0bmV3RGF0YVtpXSAgPSBsaW5lYXJJbnRlcnBvbGF0ZShkYXRhW2JlZm9yZV0sIGRhdGFbYWZ0ZXJdLCBhdFBvaW50KTtcblx0XHR9XG5cblx0XHRuZXdEYXRhW2ZpdENvdW50IC0gMV0gPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV07IC8vIGZvciBuZXcgYWxsb2NhdGlvblxuXG5cdFx0cmV0dXJuIG5ld0RhdGE7XG5cdH07XG5cblx0LyoqXG5cdCAqIFVuZGVmaW5lZCBvciBudWxsIGNoZWNrXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgVW5kZWZpbmVkT3JOdWxsKFxuXHRcdHZhcmlhYmxlXG5cdCkge1xuXHRcdHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT09ICd1bmRlZmluZWQnIHx8IHZhcmlhYmxlID09PSBudWxsO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUaGUgdmFyaWFibGUgaXMgbm90IHVuZGVmaW5lZCBhbmQgbm90IG51bGxcblx0ICogQHBhcmFtIHZhcmlhYmxlXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBEZWZpbmVkKFxuXHRcdHZhcmlhYmxlXG5cdCkge1xuXHRcdHJldHVybiB0eXBlb2YgdmFyaWFibGUgIT09ICd1bmRlZmluZWQnICYmIHZhcmlhYmxlICE9PSBudWxsO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIGZ1bmN0aW9uIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIGZuXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEdldFBhcmFtZXRlcnMoZm4pIHtcblxuXHRcdGxldCBGTl9BUkdTID0gL15mdW5jdGlvblxccypbXlxcKF0qXFwoXFxzKihbXlxcKV0qKVxcKS9tO1xuXHRcdGxldCBGTl9BUkdfU1BMSVQgPSAvLC87XG5cdFx0bGV0IEZOX0FSRyA9IC9eXFxzKihfPykoLis/KVxcMVxccyokLztcblx0XHRsZXQgU1RSSVBfQ09NTUVOVFMgPSAvKFxcL1xcLy4qJCl8KFxcL1xcKltcXHNcXFNdKj9cXCpcXC8pfChcXHMqPVteLFxcKV0qKCgnKD86XFxcXCd8W14nXFxyXFxuXSkqJyl8KFwiKD86XFxcXFwifFteXCJcXHJcXG5dKSpcIikpfChcXHMqPVteLFxcKV0qKSkvbWc7XG5cblx0XHRsZXQgcGFyYW1ldGVycyxcblx0XHRcdGZuVGV4dCxcblx0XHRcdGFyZ0RlY2w7XG5cblx0XHRpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0gW107XG5cdFx0XHRmblRleHQgPSBmbi50b1N0cmluZygpLnJlcGxhY2UoU1RSSVBfQ09NTUVOVFMsICcnKTtcblx0XHRcdGFyZ0RlY2wgPSBmblRleHQubWF0Y2goRk5fQVJHUyk7XG5cdFx0XHRhcmdEZWNsWzFdLnNwbGl0KEZOX0FSR19TUExJVCkuZm9yRWFjaChmdW5jdGlvbihhcmcpIHtcblx0XHRcdFx0YXJnLnJlcGxhY2UoRk5fQVJHLCBmdW5jdGlvbihhbGwsIHVuZGVyc2NvcmUsIG5hbWUpIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLnB1c2gobmFtZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IEVycm9yKFwibm90IGEgZnVuY3Rpb25cIilcblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyYW1ldGVycztcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBlaXRoZXIgYW4gSUQgb2YgdGhlIG9iamVjdCBvciBOdWxsXG5cdCAqIEBwYXJhbSBvYmplY3Rcblx0ICogQHJldHVybnMge251bGx9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIElkT3JOdWxsKG9iamVjdCkge1xuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwob2JqZWN0KSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwob2JqZWN0LmlkKSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oJ3NhdmluZyBhbiBvYmplY3QgcmVmZXJlbmNlIHdpdGggbm8gSUQgOiAnLCBvYmplY3QpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmplY3QuaWQ7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBMaW1pdCBhIHByb3BlcnR5IHRvIHZhbHVlcyBiZXR3ZWVuIC1waSBhbmQgK3BpXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gb2JqZWN0UHJvcGVydHlcblx0ICogQHJldHVybnMge3tjb25maWd1cmFibGU/OiBib29sZWFuLCBlbnVtZXJhYmxlPzogYm9vbGVhbiwgdmFsdWU/LCB3cml0YWJsZT86IGJvb2xlYW4sIGdldD86IEZ1bmN0aW9uLCBzZXQ/OiBGdW5jdGlvbn19XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIExpbWl0VG9QSShwcm9wZXJ0eSwgb2JqZWN0UHJvcGVydHkpIHtcblxuXHRcdGxldCBzdG9yZSA9IG9iamVjdFByb3BlcnR5O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gc3RvcmU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0IDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0d2hpbGUgKHZhbHVlID4gTWF0aC5QSSkge1xuXHRcdFx0XHRcdHZhbHVlIC09IChNYXRoLlBJICogMik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3aGlsZSAodmFsdWUgPCAtKE1hdGguUEkpKSB7XG5cdFx0XHRcdFx0dmFsdWUgKz0gKE1hdGguUEkgKiAyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0b3JlID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBhcnJheSBvZiBJRHMgcmVwcmVzZW50aW5nIHRoZSBvYmplY3RzXG5cdCAqIEBwYXJhbSBhcnJheVxuXHQgKiBAcmV0dXJucyBbXVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBJZEFycmF5T3JFbXB0eUFycmF5KGFycmF5KSB7XG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChhcnJheSkpIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcblxuXHRcdFx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGl0ZW0uaWQpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdObyBJRCBmb3VuZCB3aGlsZSB0cnlpbmcgdG8gc3RvcmUgSURzIHRvIGFycmF5Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gaXRlbS5pZFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBMaW5rcyBhbiBvYmplY3QgdG8gaXRzIHBhcmVudCB0aHJvdWdoIGlkVG9PYmplY3QgYXJyYXlcblx0ICogQHBhcmFtIHByb3BlcnR5U3RyaW5nXG5cdCAqIEBwYXJhbSBpZFRvT2JqZWN0XG5cdCAqIEBwYXJhbSBwYXJlbnRPYmplY3Rcblx0ICogQHBhcmFtIGlkXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIExpbmsocHJvcGVydHlTdHJpbmcsIGlkVG9PYmplY3QsIHBhcmVudE9iamVjdCwgaWQpIHtcblxuXHRcdGlmICghVXRpbHMuVW5kZWZpbmVkT3JOdWxsKHBhcmVudE9iamVjdFtwcm9wZXJ0eVN0cmluZ10pKSB7XG5cblx0XHRcdGlmICghaWRUb09iamVjdC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCdMaW5raW5nIGZhaWxlZCBmb3Igb2JqZWN0OicgKyBwYXJlbnRPYmplY3QubmFtZSk7XG5cdFx0XHR9XG5cblx0XHRcdHBhcmVudE9iamVjdFtwcm9wZXJ0eVN0cmluZ10gPSBpZFRvT2JqZWN0W2lkXTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHJhbmRvbSBJRFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBSYW5kb21JZChsZW5ndGgpIHtcblxuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwobGVuZ3RoKSkge1xuXHRcdFx0bGVuZ3RoID0gMTA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCBsZW5ndGgpO1xuXHR9O1xuXG5cdHN0YXRpYyBJbnZlcnRXaW5kaW5nT3JkZXIodHJpYW5nbGVzKSB7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0bGV0IHYxID0gdHJpYW5nbGVzW2ldLnYxO1xuXHRcdFx0dHJpYW5nbGVzW2ldLnYxID0gdHJpYW5nbGVzW2ldLnYyO1xuXHRcdFx0dHJpYW5nbGVzW2ldLnYyID0gdjE7XG5cblx0XHRcdGxldCBiYWNrdXBVViA9IHRyaWFuZ2xlc1tpXS50cmlhbmdsZS52MXV2O1xuXHRcdFx0dHJpYW5nbGVzW2ldLnRyaWFuZ2xlLnYxdXYgPSB0cmlhbmdsZXNbaV0udHJpYW5nbGUudjJ1djtcblx0XHRcdHRyaWFuZ2xlc1tpXS50cmlhbmdsZS52MnV2ID0gYmFja3VwVVY7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlcztcblx0fTtcblxuXHQvKipcblx0ICogSW52ZXJ0cyBhIG1lc2ggd2luZGluZyBvcmRlciAoYW5kIGl0cyBpbnN0YW5jZSlcblx0ICogQHBhcmFtIG1lc2ggUjMuRDMuTWVzaFxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgSW52ZXJ0TWVzaFdpbmRpbmdPcmRlcihtZXNoKSB7XG5cblx0XHRtZXNoLmZhY2VzLmZvckVhY2goXG5cdFx0XHRmdW5jdGlvbihmYWNlKSB7XG5cblx0XHRcdFx0bGV0IHRtcFYxID0gZmFjZS52MTtcblx0XHRcdFx0ZmFjZS52MSA9IGZhY2UudjI7XG5cdFx0XHRcdGZhY2UudjIgPSB0bXBWMTtcblxuXHRcdFx0XHRsZXQgdG1wVjF1diA9IGZhY2UudjF1djtcblx0XHRcdFx0ZmFjZS52MXV2ID0gZmFjZS52MnV2O1xuXHRcdFx0XHRmYWNlLnYydXYgPSB0bXBWMXV2O1xuXG5cdFx0XHR9LmJpbmQodGhpcylcblx0XHQpO1xuXG5cdFx0Ly9tZXNoLmNvbXB1dGVOb3JtYWxzID0gdHJ1ZTtcblx0XHQvL21lc2guY3JlYXRlSW5zdGFuY2UoKTtcblx0fTtcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXNldHMgYSB0aGUgd2luZGluZyBvcmRlciBvZiBhIG1lc2ggZnJvbSBhIHJlZmVyZW5jZSBwb2ludCBWICh0aGUgYXZlcmFnZSBjZW50ZXIgb2YgdGhlIG1lc2gpXG5cdCAqL1xuXHRzdGF0aWMgUmVzZXRXaW5kaW5nT3JkZXIoZmFjZXMsIHZlcnRpY2VzKSB7XG5cblx0XHRsZXQgdmVydGV4TGlzdCA9IG5ldyBSMy5BUEkuVmVjdG9yMy5Qb2ludHMoKTtcblxuXHRcdGZvciAobGV0IHYgPSAwOyB2IDwgdmVydGljZXMubGVuZ3RoOyB2KyspIHtcblx0XHRcdHZlcnRleExpc3QuYWRkKG5ldyBSMy5BUEkuVmVjdG9yMyhcblx0XHRcdFx0dmVydGljZXNbdl0ucG9zaXRpb24ueCxcblx0XHRcdFx0dmVydGljZXNbdl0ucG9zaXRpb24ueSxcblx0XHRcdFx0dmVydGljZXNbdl0ucG9zaXRpb24uelxuXHRcdFx0KSk7XG5cdFx0fVxuXG5cdFx0bGV0IFYgPSB2ZXJ0ZXhMaXN0LmF2ZXJhZ2UoKTtcblxuXHRcdGxldCB0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IHMgPSAwOyBzIDwgZmFjZXMubGVuZ3RoOyBzICs9IDMpIHtcblxuXHRcdFx0bGV0IHYwID0gZmFjZXNbc107XG5cdFx0XHRsZXQgdjEgPSBmYWNlc1tzKzFdO1xuXHRcdFx0bGV0IHYyID0gZmFjZXNbcysyXTtcblxuXHRcdFx0dHJpYW5nbGVzLnB1c2goXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR2MCA6IHYwLFxuXHRcdFx0XHRcdHYxIDogdjEsXG5cdFx0XHRcdFx0djIgOiB2Mixcblx0XHRcdFx0XHRlZGdlcyA6IFtcblx0XHRcdFx0XHRcdHt2MDogdjAsIHYxOiB2MX0sXG5cdFx0XHRcdFx0XHR7djA6IHYxLCB2MTogdjJ9LFxuXHRcdFx0XHRcdFx0e3YwOiB2MiwgdjE6IHYwfVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0d2luZGluZyA6IDAsXG5cdFx0XHRcdFx0ZWRnZUluZGV4IDogLTEsXG5cdFx0XHRcdFx0cHJvY2Vzc2VkIDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRSMy5BUEkuVmVjdG9yMy5jbG9ja3dpc2UoXG5cdFx0XHRcdFx0dmVydGljZXNbdHJpYW5nbGVzW2ldLnYwXS5wb3NpdGlvbixcblx0XHRcdFx0XHR2ZXJ0aWNlc1t0cmlhbmdsZXNbaV0udjFdLnBvc2l0aW9uLFxuXHRcdFx0XHRcdHZlcnRpY2VzW3RyaWFuZ2xlc1tpXS52Ml0ucG9zaXRpb24sXG5cdFx0XHRcdFx0VlxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc29sZS5sb2coJ2Nsb2Nrd2lzZScpO1xuXHRcdFx0XHRsZXQgYnYxID0gdHJpYW5nbGVzW2ldLnYxO1xuXHRcdFx0XHR0cmlhbmdsZXNbaV0udjEgPSB0cmlhbmdsZXNbaV0udjI7XG5cdFx0XHRcdHRyaWFuZ2xlc1tpXS52MiA9IGJ2MTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdub3QgY2xvY2t3aXNlJyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlcztcblx0fTtcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIHdpbmRpbmcgb3JkZXIgZm9yIHRyaWFuZ2xlcyBpbiBmYWNlcywgZ2l2ZW4gYW4gaW5pdGlhbCB0cmlhbmdsZSBhbmQgb3JpZW50YXRpb24gZWRnZVxuXHQgKiB1c2VkIHBzZXVkb2NvZGUgZnJvbVxuXHQgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE3MDM2OTcwL2hvdy10by1jb3JyZWN0LXdpbmRpbmctb2YtdHJpYW5nbGVzLXRvLWNvdW50ZXItY2xvY2t3aXNlLWRpcmVjdGlvbi1vZi1hLTNkLW1lc2hcblx0ICogIFdlIG5lZWQgdG8gdXNlIGEgZ3JhcGggdHJhdmVyc2FsIGFsZ29yaXRobSxcblx0ICogIGxldHMgYXNzdW1lIHdlIGhhdmUgbWV0aG9kIHRoYXQgcmV0dXJucyBuZWlnaGJvciBvZiB0cmlhbmdsZSBvbiBnaXZlbiBlZGdlXG5cdCAqXG5cdCAqICAgICAgbmVpZ2hib3Jfb25fZWdkZSggbmV4dF90cmlhLCBlZGdlIClcblx0ICpcblx0ICogIHRvX3Byb2Nlc3MgPSBzZXQgb2YgcGFpcnMgdHJpYW5nbGUgYW5kIG9yaWVudGF0aW9uIGVkZ2UsIGluaXRpYWwgc3RhdGUgaXMgb25lIGdvb2Qgb3JpZW50ZWQgdHJpYW5nbGUgd2l0aCBhbnkgZWRnZSBvbiBpdFxuXHQgKiAgcHJvY2Vzc2VkID0gc2V0IG9mIHByb2Nlc3NlZCB0cmlhbmdsZXM7IGluaXRpYWwgZW1wdHlcblx0ICpcblx0ICogIHdoaWxlIHRvX3Byb2Nlc3MgaXMgbm90IGVtcHR5OlxuXHQgKiAgICAgIG5leHRfdHJpYSwgb3JpZW50YXRpb25fZWRnZSA9IHRvX3Byb2Nlc3MucG9wKClcblx0ICogICAgICBhZGQgbmV4dF90cmlhIGluIHByb2Nlc3NlZFxuXHQgKiAgICAgIGlmIG5leHRfdHJpYSBpcyBub3Qgb3Bwb3NpdGUgb3JpZW50ZWQgdGhhbiBvcmllbnRhdGlvbl9lZGdlOlxuXHQgKiAgICAgICAgICBjaGFuZ2UgbmV4dF90cmlhIChBQkMpIG9yaWVudGF0aW9uICAoQjwtPkMpXG5cdCAqICAgICAgZm9yIGVhY2ggZWRnZSAoQUIpIGluIG5leHRfdHJpYTpcblx0ICogICAgICAgICAgbmVpZ2hib3JfdHJpYSA9IG5laWdoYm9yX29uX2VnZGUoIG5leHRfdHJpYSwgZWRnZSApXG5cdCAqICAgICAgICAgIGlmIG5laWdoYm9yX3RyaWEgZXhpc3RzIGFuZCBuZWlnaGJvcl90cmlhIG5vdCBpbiBwcm9jZXNzZWQ6XG5cdCAqICAgICAgICAgICAgICB0b19wcm9jZXNzIGFkZCAobmVpZ2hib3JfdHJpYSwgZWRnZSBvcHBvc2l0ZSBvcmllbnRlZCAoQkEpKVxuXHQgKiBAcGFyYW0gZmFjZXMgUjMuRDMuRmFjZVtdXG5cdCAqIEBwYXJhbSBvcmllbnRhdGlvbkVkZ2UgUjMuQVBJLlZlY3RvcjJcblx0ICogQHJldHVybnMge0FycmF5fVxuXHQgKi9cblx0c3RhdGljIEZpeFdpbmRpbmdPcmRlcihmYWNlcywgb3JpZW50YXRpb25FZGdlKSB7XG5cblx0XHQvKipcblx0XHQgKiBDaGVja3MgaWYgYSBGYWNlIGJlbG9uZ2luZyB0byBhIFRyaWFuZ2xlRWRnZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZFxuXHRcdCAqIEBwYXJhbSBwcm9jZXNzZWQgVHJpYW5nbGVFZGdlW11cblx0XHQgKiBAcGFyYW0gdHJpYW5nbGUgRmFjZVxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGluUHJvY2Vzc2VkKHByb2Nlc3NlZCwgdHJpYW5nbGUpIHtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb2Nlc3NlZFtpXS50cmlhbmdsZS5lcXVhbHModHJpYW5nbGUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgYSBuZWlnaGJvdXJpbmcgdHJpYW5nbGUgb24gYSBzcGVjaWZpYyBlZGdlIC0gcHJlc2VydmluZyB0aGUgZWRnZSBvcmllbnRhdGlvblxuXHRcdCAqIEBwYXJhbSBlZGdlIFIzLkFQSS5WZWN0b3IyXG5cdFx0ICogQHBhcmFtIGZhY2VzIFIzLkQzLkZhY2VbXVxuXHRcdCAqIEBwYXJhbSBjdXJyZW50VHJpYW5nbGVcblx0XHQgKiBAcmV0dXJucyB7Kn1cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBuZWlnaGJvdXJPbkVkZ2UoZWRnZSwgZmFjZXMsIGN1cnJlbnRUcmlhbmdsZSkge1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoZmFjZXNbaV0udjAgPT09IGVkZ2UueCAmJiBmYWNlc1tpXS52MSA9PT0gZWRnZS55KSB8fFxuXHRcdFx0XHRcdChmYWNlc1tpXS52MSA9PT0gZWRnZS54ICYmIGZhY2VzW2ldLnYyID09PSBlZGdlLnkpIHx8XG5cdFx0XHRcdFx0KGZhY2VzW2ldLnYyID09PSBlZGdlLnggJiYgZmFjZXNbaV0udjAgPT09IGVkZ2UueSkgfHxcblx0XHRcdFx0XHQoZmFjZXNbaV0udjAgPT09IGVkZ2UueSAmJiBmYWNlc1tpXS52MSA9PT0gZWRnZS54KSB8fFxuXHRcdFx0XHRcdChmYWNlc1tpXS52MSA9PT0gZWRnZS55ICYmIGZhY2VzW2ldLnYyID09PSBlZGdlLngpIHx8XG5cdFx0XHRcdFx0KGZhY2VzW2ldLnYyID09PSBlZGdlLnkgJiYgZmFjZXNbaV0udjAgPT09IGVkZ2UueClcblx0XHRcdFx0KSB7XG5cblx0XHRcdFx0XHRsZXQgdHJpYW5nbGUgPSBuZXcgUjMuRDMuQVBJLkZhY2UoXG5cdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdGZhY2VzW2ldLnYwaW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlc1tpXS52MWluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZXNbaV0udjJpbmRleCxcblx0XHRcdFx0XHRcdGZhY2VzW2ldLm1hdGVyaWFsSW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlc1tpXS51dnNcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0aWYgKHRyaWFuZ2xlLmVxdWFscyhjdXJyZW50VHJpYW5nbGUpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gbmV3IFIzLkQzLlRyaWFuZ2xlRWRnZShcblx0XHRcdFx0XHRcdHRyaWFuZ2xlLFxuXHRcdFx0XHRcdFx0ZWRnZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0bGV0IHRvUHJvY2VzcyA9IFtcblx0XHRcdG5ldyBSMy5EMy5UcmlhbmdsZUVkZ2UoXG5cdFx0XHRcdG5ldyBSMy5EMy5BUEkuRmFjZShcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0ZmFjZXNbMF0udjBpbmRleCxcblx0XHRcdFx0XHRmYWNlc1swXS52MWluZGV4LFxuXHRcdFx0XHRcdGZhY2VzWzBdLnYyaW5kZXgsXG5cdFx0XHRcdFx0ZmFjZXNbMF0ubWF0ZXJpYWxJbmRleCxcblx0XHRcdFx0XHRmYWNlc1swXS51dnNcblx0XHRcdFx0KSxcblx0XHRcdFx0b3JpZW50YXRpb25FZGdlXG5cdFx0XHQpXG5cdFx0XTtcblxuXHRcdGxldCBwcm9jZXNzZWQgPSBbXTtcblxuXHRcdHdoaWxlICh0b1Byb2Nlc3MubGVuZ3RoID4gMCkge1xuXG5cdFx0XHRsZXQgdHJpYW5nbGVFZGdlID0gdG9Qcm9jZXNzLnBvcCgpO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIElmIGVkZ2UgaXMgdGhlIHNhbWUgb3JpZW50YXRpb24gKGkuZS4gdGhlIGVkZ2Ugb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIHRyaWFuZ2xlIGVkZ2UpIGl0IG5lZWRzIHRvIGJlIHJldmVyc2VkXG5cdFx0XHQgKiB0byBoYXZlIHRoZSBzYW1lIHdpbmRpbmcgb3JkZXIpXG5cdFx0XHQgKi9cblx0XHRcdGlmIChcblx0XHRcdFx0KHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MGluZGV4ID09PSB0cmlhbmdsZUVkZ2UuZWRnZS54ICYmXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxaW5kZXggPT09IHRyaWFuZ2xlRWRnZS5lZGdlLnkpIHx8XG5cdFx0XHRcdCh0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjFpbmRleCA9PT0gdHJpYW5nbGVFZGdlLmVkZ2UueCAmJlxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MmluZGV4ID09PSB0cmlhbmdsZUVkZ2UuZWRnZS55KSB8fFxuXHRcdFx0XHQodHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYyaW5kZXggPT09IHRyaWFuZ2xlRWRnZS5lZGdlLnggJiZcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjBpbmRleCA9PT0gdHJpYW5nbGVFZGdlLmVkZ2UueSlcblx0XHRcdCkge1xuXHRcdFx0XHRsZXQgYmFja3VwViA9IHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4O1xuXHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjFpbmRleCA9IHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MmluZGV4O1xuXHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJpbmRleCA9IGJhY2t1cFY7XG5cblx0XHRcdFx0Ly8gbGV0IGJhY2t1cFVWID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxdXY7XG5cdFx0XHRcdC8vIHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MXV2ID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYydXY7XG5cdFx0XHRcdC8vIHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MnV2ID0gYmFja3VwVVY7XG5cdFx0XHRcdC8vXG5cdFx0XHRcdGxldCBiYWNrdXBVViA9IHRyaWFuZ2xlRWRnZS50cmlhbmdsZS51dnNbMF1bMV07XG5cdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS51dnNbMF1bMV0gPSB0cmlhbmdsZUVkZ2UudHJpYW5nbGUudXZzWzBdWzJdO1xuXHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudXZzWzBdWzJdID0gYmFja3VwVVY7XG5cdFx0XHR9XG5cblx0XHRcdHByb2Nlc3NlZC5wdXNoKHRyaWFuZ2xlRWRnZSk7XG5cblx0XHRcdGxldCBlZGdlcyA9IFtcblx0XHRcdFx0bmV3IFIzLkFQSS5WZWN0b3IyKFxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MGluZGV4LFxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4XG5cdFx0XHRcdCksXG5cdFx0XHRcdG5ldyBSMy5BUEkuVmVjdG9yMihcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjFpbmRleCxcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJpbmRleFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRuZXcgUjMuQVBJLlZlY3RvcjIoXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYyaW5kZXgsXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYwaW5kZXhcblx0XHRcdFx0KVxuXHRcdFx0XTtcblxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRsZXQgbmVpZ2hib3VyID0gbmVpZ2hib3VyT25FZGdlKGVkZ2VzW2pdLCBmYWNlcywgdHJpYW5nbGVFZGdlLnRyaWFuZ2xlKTtcblx0XHRcdFx0aWYgKG5laWdoYm91ciAmJiAhaW5Qcm9jZXNzZWQocHJvY2Vzc2VkLCBuZWlnaGJvdXIudHJpYW5nbGUpKSB7XG5cdFx0XHRcdFx0dG9Qcm9jZXNzLnB1c2gobmVpZ2hib3VyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEluIHByb2Nlc3NlZCAtIHdlIHdpbGwgaGF2ZSBzb21lIGR1cGxpY2F0ZXMgLSBvbmx5IGFkZCB0aGUgdW5pcXVlIG9uZXNcblx0XHQgKiBAdHlwZSB7QXJyYXl9XG5cdFx0ICovXG5cdFx0bGV0IHRyaWFuZ2xlcyA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsZXQgZm91bmQgPSBmYWxzZTtcblx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgdHJpYW5nbGVzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGlmICh0cmlhbmdsZXNba10uZXF1YWxzKHByb2Nlc3NlZFtpXS50cmlhbmdsZSkpe1xuXHRcdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHR0cmlhbmdsZXMucHVzaChwcm9jZXNzZWRbaV0udHJpYW5nbGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cmlhbmdsZXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgYSB3b3JrLWFyb3VuZCBmdW5jdGlvbiB0byBmaXggcG9seXMgd2hpY2ggZG9uJ3QgdHJpYW5ndWxhdGUgYmVjYXVzZVxuXHQgKiB0aGV5IGNvdWxkIGxpZSBvbiBaLXBsYW5lIChYWiBvciBZWikpIC0gd2UgdHJhbnNsYXRlIHRoZSBwb2x5IHRvIHRoZSBvcmlnaW4sIHN5c3RlbWF0aWNhbGx5IHJvdGF0ZSB0aGUgcG9seSBhcm91bmRcblx0ICogWiB0aGVuIFkgYXhpc1xuXHQgKiBAcGFyYW0gdmVydGljZXNGbGF0IFtdXG5cdCAqIEBwYXJhbSBncmFpbiBpcyB0aGUgYW1vdW50IHRvIHN5c3RlbWF0aWNhbGx5IHJvdGF0ZSB0aGUgcG9seSBieSAtIGEgZmluZXIgZ3JhaW4gbWVhbnMgYSBtb3JlIGFjY3VyYXRlIG1heGltdW0gWFlcblx0ICogQHJldHVybiBbXVxuXHQgKi9cblx0c3RhdGljIEZpeFBvbHlaUGxhbmUodmVydGljZXNGbGF0LCBncmFpbikge1xuXG5cdFx0aWYgKCh2ZXJ0aWNlc0ZsYXQubGVuZ3RoICUgMykgIT09IDAgJiYgISh2ZXJ0aWNlc0ZsYXQubGVuZ3RoID4gOSkpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiVGhlIHZlcnRpY2VzIGFyZSBub3QgaW4gdGhlIHJpZ2h0IGxlbmd0aCA6IFwiICsgdmVydGljZXNGbGF0Lmxlbmd0aCk7XG5cdFx0fVxuXG5cdFx0bGV0IHZlcnRpY2VzID0gW107XG5cblx0XHRsZXQgcG9pbnRzID0gbmV3IFIzLkFQSS5RdWF0ZXJuaW9uLlBvaW50cygpO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0aWNlc0ZsYXQubGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdHBvaW50cy5hZGQobmV3IFIzLkFQSS5WZWN0b3IzKFxuXHRcdFx0XHR2ZXJ0aWNlc0ZsYXRbaV0sXG5cdFx0XHRcdHZlcnRpY2VzRmxhdFtpICsgMV0sXG5cdFx0XHRcdHZlcnRpY2VzRmxhdFtpICsgMl1cblx0XHRcdCkpO1xuXHRcdH1cblxuXHRcdHBvaW50cy50b09yaWdpbigpO1xuXG5cdFx0cG9pbnRzLm1heGltaXplWERpc3RhbmNlKGdyYWluKTtcblxuXHRcdHBvaW50cy5tYXhpbWl6ZVlEaXN0YW5jZShncmFpbik7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgcG9pbnRzLnZlY3RvcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZlcnRpY2VzLnB1c2goXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRwb2ludHMudmVjdG9yc1tpXS54LFxuXHRcdFx0XHRcdHBvaW50cy52ZWN0b3JzW2ldLnlcblx0XHRcdFx0XVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmVydGljZXM7XG5cdH07XG5cblx0c3RhdGljIE1vdmluZ0F2ZXJhZ2UocGVyaW9kKSB7XG5cdFx0bGV0IG51bXMgPSBbXTtcblx0XHRyZXR1cm4gZnVuY3Rpb24obnVtKSB7XG5cdFx0XHRudW1zLnB1c2gobnVtKTtcblx0XHRcdGlmIChudW1zLmxlbmd0aCA+IHBlcmlvZClcblx0XHRcdFx0bnVtcy5zcGxpY2UoMCwxKTsgIC8vIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXlcblx0XHRcdGxldCBzdW0gPSAwO1xuXHRcdFx0Zm9yIChsZXQgaSBpbiBudW1zKVxuXHRcdFx0XHRzdW0gKz0gbnVtc1tpXTtcblx0XHRcdGxldCBuID0gcGVyaW9kO1xuXHRcdFx0aWYgKG51bXMubGVuZ3RoIDwgcGVyaW9kKVxuXHRcdFx0XHRuID0gbnVtcy5sZW5ndGg7XG5cdFx0XHRyZXR1cm4oc3VtL24pO1xuXHRcdH1cblx0fTtcblxuXHRzdGF0aWMgSW50ZXJzZWN0KGEsIGIpIHtcblxuXHRcdGxldCB0O1xuXG5cdFx0LyoqXG5cdFx0ICogTG9vcCBvdmVyIHNob3J0ZXN0IGFycmF5XG5cdFx0ICovXG5cdFx0aWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHtcblx0XHRcdHQgPSBiO1xuXHRcdFx0YiA9IGE7XG5cdFx0XHRhID0gdDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYS5maWx0ZXIoXG5cdFx0XHQvKipcblx0XHRcdCAqIENoZWNrIGlmIGV4aXN0c1xuXHRcdFx0ICogQHBhcmFtIGVcblx0XHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHJldHVybiAoYi5pbmRleE9mKGUpID4gLTEpO1xuXHRcdFx0fVxuXHRcdCkuZmlsdGVyKFxuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZW1vdmUgRHVwbGljYXRlc1xuXHRcdFx0ICogQHBhcmFtIGVcblx0XHRcdCAqIEBwYXJhbSBpXG5cdFx0XHQgKiBAcGFyYW0gY1xuXHRcdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uKGUsIGksIGMpIHtcblx0XHRcdFx0cmV0dXJuIGMuaW5kZXhPZihlKSA9PT0gaTtcblx0XHRcdH1cblx0XHQpO1xuXHR9O1xuXG5cdHN0YXRpYyBEaWZmZXJlbmNlKGEsIGIpIHtcblxuXHRcdGxldCB0O1xuXG5cdFx0LyoqXG5cdFx0ICogTG9vcCBvdmVyIHNob3J0ZXN0IGFycmF5XG5cdFx0ICovXG5cdFx0aWYgKGIubGVuZ3RoID4gYS5sZW5ndGgpIHtcblx0XHRcdHQgPSBiO1xuXHRcdFx0YiA9IGE7XG5cdFx0XHRhID0gdDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYS5maWx0ZXIoXG5cdFx0XHQvKipcblx0XHRcdCAqIENoZWNrIGlmIGV4aXN0c1xuXHRcdFx0ICogQHBhcmFtIGVcblx0XHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHJldHVybiAoYi5pbmRleE9mKGUpID09PSAtMSk7XG5cdFx0XHR9XG5cdFx0KS5maWx0ZXIoXG5cdFx0XHQvKipcblx0XHRcdCAqIFJlbW92ZSBEdXBsaWNhdGVzXG5cdFx0XHQgKiBAcGFyYW0gZVxuXHRcdFx0ICogQHBhcmFtIGlcblx0XHRcdCAqIEBwYXJhbSBjXG5cdFx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24oZSwgaSwgYykge1xuXHRcdFx0XHRyZXR1cm4gYy5pbmRleE9mKGUpID09PSBpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFB1c2ggb25seSBpZiBub3QgaW4gdGhlcmUgYWxyZWFkeVxuXHQgKiBAcGFyYW0gYXJyYXlcblx0ICogQHBhcmFtIG9iamVjdFxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBQdXNoVW5pcXVlKGFycmF5LCBvYmplY3QpIHtcblxuXHRcdGlmIChhcnJheS5pbmRleE9mKG9iamVjdCkgPT09IC0xKSB7XG5cdFx0XHRhcnJheS5wdXNoKG9iamVjdCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIG9iamVjdCBpcyBlbXB0eVxuXHQgKiBAcGFyYW0gb2JqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBJc0VtcHR5KG9iaikge1xuXHRcdHJldHVybiAoT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDAgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3QpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc1N0cmluZyhtZW1iZXIpIHtcblx0XHRyZXR1cm4gKHR5cGVvZiBtZW1iZXIgPT09ICdzdHJpbmcnKTtcblx0fTtcblxuXHRzdGF0aWMgSXNCb29sZWFuKG1lbWJlcikge1xuXHRcdHJldHVybiAobWVtYmVyID09PSB0cnVlIHx8IG1lbWJlciA9PT0gZmFsc2UpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc0NvbG9yKG1lbWJlcikge1xuXHRcdHJldHVybiAobWVtYmVyIGluc3RhbmNlb2YgUjMuQ29sb3IpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc051bWJlcihtZW1iZXIpIHtcblx0XHRyZXR1cm4gKHR5cGVvZiBtZW1iZXIgPT09ICdudW1iZXInKTtcblx0fTtcblxuXHRzdGF0aWMgSXNWZWN0b3IyKG1lbWJlcikge1xuXHRcdHJldHVybiAoXG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5BUEkuVmVjdG9yMiB8fFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuVmVjdG9yMlxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIElzVmVjdG9yMyhtZW1iZXIpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuQVBJLlZlY3RvcjMgfHxcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLlZlY3RvcjNcblx0XHQpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc1ZlY3RvcjQobWVtYmVyKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLkFQSS5WZWN0b3I0IHx8XG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5WZWN0b3I0IHx8XG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5BUEkuUXVhdGVybmlvbiB8fFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuUXVhdGVybmlvblxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIElzT2JqZWN0KG1lbWJlcikge1xuXHRcdGxldCB0eXBlID0gdHlwZW9mIG1lbWJlcjtcblx0XHRyZXR1cm4gdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlID09PSAnb2JqZWN0JyAmJiAhIW1lbWJlcjtcblx0fTtcblxuXHQvKipcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIExvd2VyVW5kZXJzY29yZShuYW1lKSB7XG5cdFx0bGV0IHN0cmluZyA9IG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICdfJyk7XG5cdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLy0vZywgJ18nKTtcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFxfKy9nLCAnXycpO1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH07XG5cblx0c3RhdGljIFVwcGVyQ2FzZVdvcmRzU3BhY2VzKGlucHV0KSB7XG5cblx0XHRsZXQgd29yZCA9IGlucHV0LnJlcGxhY2UoL1stX10vZywgJyAnKTtcblxuXHRcdHdvcmQgPSB3b3JkLnJlcGxhY2UoL1xccysvLCAnICcpO1xuXG5cdFx0bGV0IHdvcmRzID0gd29yZC5zcGxpdCgnICcpO1xuXG5cdFx0cmV0dXJuIHdvcmRzLnJlZHVjZShcblx0XHRcdGZ1bmN0aW9uKHJlc3VsdCwgd29yZCkge1xuXHRcdFx0XHRyZXN1bHQgKz0gd29yZFswXS50b1VwcGVyQ2FzZSgpICsgd29yZC5zdWJzdHIoMSk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQgKyAnICc7XG5cdFx0XHR9LFxuXHRcdFx0Jydcblx0XHQpLnRyaW0oKTtcblx0fTtcblxuXHQvKipcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIFVwcGVyQ2FzZVVuZGVyc2NvcmUod29yZCkge1xuXG5cdFx0bGV0IHN0ciA9ICcnO1xuXG5cdFx0d29yZC5zcGxpdCgnJykubWFwKGZ1bmN0aW9uKGxldHRlcil7XG5cdFx0XHRpZiAobGV0dGVyID09IGxldHRlci50b1VwcGVyQ2FzZSgpKSB7XG5cdFx0XHRcdHN0ciArPSAnXycgKyBsZXR0ZXI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdHIgKz0gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRzdHIgPSBzdHIucmVwbGFjZShuZXcgUmVnRXhwKCdeXycpLCcnKTtcblxuXHRcdHJldHVybiBzdHI7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgTGVmdCBQYWRkZWQgVGV4dCAtIGV4LiBsZW5ndGggNSwgcGFkY2hhciAwLCBzdHJpbmcgYWJjID0gJzAwYWJjJ1xuXHQgKiBAcGFyYW0gbGVuZ3RoXG5cdCAqIEBwYXJhbSBwYWRDaGFyXG5cdCAqIEBwYXJhbSBzdHJpbmdcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgUGFkZGVkVGV4dChsZW5ndGgsIHBhZENoYXIsIHN0cmluZykge1xuXG5cdFx0bGV0IHBhZCA9IFwiXCI7XG5cblx0XHRmb3IgKGxldCB4ID0gMDsgeCA8IGxlbmd0aDsgeCsrKSB7XG5cdFx0XHRwYWQgKz0gcGFkQ2hhcjtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGFkLnN1YnN0cmluZygwLCBwYWQubGVuZ3RoIC0gc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVXRpbHM7IiwiY29uc3Qge1N5c3RlbSwgU3lzdGVtTGlua2luZywgU3lzdGVtU29ja2V0fSA9IHJlcXVpcmUoJy4vcjMtc3lzdGVtJyk7XG5jb25zdCBSM09iamVjdCA9IHJlcXVpcmUoJy4vcjMtcjMtb2JqZWN0Jyk7XG5cbmNsYXNzIFIzIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0fVxuXG5cdHN0YXRpYyB2ZXJzaW9uKCkge1xuXHRcdHJldHVybiAnX19EQVRFX18nO1xuXHR9XG5cbn1cblxuUjMuUjNPYmplY3QgXHRcdD0gUjNPYmplY3Q7XG5SMy5TeXN0ZW0gXHRcdFx0PSBTeXN0ZW07XG5SMy5TeXN0ZW0uTGlua2luZ1x0PSBTeXN0ZW1MaW5raW5nO1xuUjMuU3lzdGVtLlNvY2tldFx0PSBTeXN0ZW1Tb2NrZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gUjM7XG4iXSwic291cmNlUm9vdCI6IiJ9