/******/ (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(options) { _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.DISPOSE_INSTANCE = 0x2; Event.DISPOSE_OBJECT = 0x3; Event.GET_RUNTIME = 0x4; Event.GET_WINDOW_SIZE = 0x5; Event.INSTANCE_CREATED = 0x6; Event.INSTANCE_DISPOSED = 0x7; Event.OBJECT_CREATED = 0x8; Event.OBJECT_DISPOSED = 0x9; Event.OBJECT_INITIALIZED = 0xa; Event.PAUSE = 0xb; Event.RESTART = 0xc; Event.START = 0xd; Event.UPDATE_FROM_INSTANCE_AFTER = 0xe; Event.UPDATE_FROM_INSTANCE_BEFORE = 0xf; Event.UPDATE_INSTANCE_AFTER = 0x10; Event.UPDATE_INSTANCE_BEFORE = 0x11; Event.MAX_EVENTS = 0x12; Event.GetEventName = function (eventId) { switch (eventId) { case 0x1: return 'create_instance'; case 0x2: return 'dispose_instance'; case 0x3: return 'dispose_object'; case 0x4: return 'get_runtime'; case 0x5: return 'get_window_size'; case 0x6: return 'instance_created'; case 0x7: return 'instance_disposed'; case 0x8: return 'object_created'; case 0x9: return 'object_disposed'; case 0xa: return 'object_initialized'; case 0xb: return 'pause'; case 0xc: return 'restart'; case 0xd: return 'start'; case 0xe: return 'update_from_instance_after'; case 0xf: return 'update_from_instance_before'; case 0x10: return 'update_instance_after'; case 0x11: return 'update_instance_before'; 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(options) { var _this; _classCallCheck(this, R3Object); _this = _super.call(this, options); 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.js */ "./src/r3/r3-system/r3-system.js"); var SystemLinking = __webpack_require__(/*! ./r3-system-linking.js */ "./src/r3/r3-system/r3-system-linking.js"); var SystemSocket = __webpack_require__(/*! ./r3-system-socket.js */ "./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 'Sun Jun 20 2021 06:12:04 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1ldmVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtcjMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1zeXN0ZW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0tbGlua2luZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtc3lzdGVtL3IzLXN5c3RlbS1zb2NrZXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXV0aWxzLmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy5qcyJdLCJuYW1lcyI6WyJSMyIsInJlcXVpcmUiLCJTeXN0ZW0iLCJMaW5raW5nIiwic3RhcnQiLCJTb2NrZXQiLCJtb2R1bGUiLCJleHBvcnRzIiwiVXRpbHMiLCJFdmVudCIsIm9wdGlvbnMiLCJjb25zb2xlIiwibG9nIiwiZXZlbnROYW1lIiwiY2FsbGJhY2siLCJTdWJzY3JpYmUiLCJiaW5kIiwiZGF0YSIsImNsaWVudENhbGxiYWNrIiwiY2xpZW50RXJyb3JDYWxsYmFjayIsIkVtaXQiLCJmbiIsInN1YnNjcmlwdGlvbklkIiwiUmFuZG9tSWQiLCJTdWJzY3JpcHRpb25zIiwiaGFzT3duUHJvcGVydHkiLCJFcnJvciIsInJlbW92ZSIsImV2ZW50SWQiLCJsaXN0ZW5lcnMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwic3Vic2NyaXB0aW9uSWRzIiwibWFwIiwicmVzdWx0IiwiZXJyb3IiLCJDUkVBVEVfSU5TVEFOQ0UiLCJESVNQT1NFX0lOU1RBTkNFIiwiRElTUE9TRV9PQkpFQ1QiLCJHRVRfUlVOVElNRSIsIkdFVF9XSU5ET1dfU0laRSIsIklOU1RBTkNFX0NSRUFURUQiLCJJTlNUQU5DRV9ESVNQT1NFRCIsIk9CSkVDVF9DUkVBVEVEIiwiT0JKRUNUX0RJU1BPU0VEIiwiT0JKRUNUX0lOSVRJQUxJWkVEIiwiUEFVU0UiLCJSRVNUQVJUIiwiU1RBUlQiLCJVUERBVEVfRlJPTV9JTlNUQU5DRV9BRlRFUiIsIlVQREFURV9GUk9NX0lOU1RBTkNFX0JFRk9SRSIsIlVQREFURV9JTlNUQU5DRV9BRlRFUiIsIlVQREFURV9JTlNUQU5DRV9CRUZPUkUiLCJNQVhfRVZFTlRTIiwiR2V0RXZlbnROYW1lIiwiUjNPYmplY3QiLCJlbWl0IiwiU3lzdGVtTGlua2luZyIsIlN5c3RlbVNvY2tldCIsIkxpbmtpbmdTeXN0ZW0iLCJvYmplY3QiLCJTb2NrZXRTeXN0ZW0iLCJjb25zdHJ1Y3RvciIsIlVuZGVmaW5lZE9yTnVsbCIsInBhcmVudCIsIkdldEZpcnN0UGFyZW50IiwianNvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJyZXBsYWNlIiwibWF0Y2giLCJjbHMiLCJ0ZXN0IiwiY29tcG9uZW50IiwiUHJvamVjdCIsIkdldFBhcmVudFByb2plY3QiLCJwYXJlbnRzIiwicHVzaCIsIkdldFBhcmVudHMiLCJEZWZpbmVkIiwiaW5zdGFuY2UiLCJzZWxlY3QiLCJpZCIsImkiLCJ2YWx1ZSIsInNlbGVjdGVkSW5kZXgiLCJ0bXAiLCJ0ZXh0Iiwic29ydCIsIk9wdGlvbiIsInByb3BlcnR5IiwiaW5kZXgiLCJnZXRQYXJlbnQiLCJ3YXJuIiwiaW1hZ2VQYXRoIiwibmFtZSIsImRpbWVuc2lvbiIsIngiLCJ5IiwieiIsInciLCJhcnJheSIsInJlZHVjZSIsImZhY2VzIiwiYSIsImIiLCJtYXRlcmlhbEluZGV4IiwiYXhpcyIsImFuZ2xlIiwicHJvcGVydHlJZCIsInJ1bnRpbWUiLCJzaXplIiwiR2V0V2luZG93U2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwiaWRUb09iamVjdCIsIm1pbiIsIm1heCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJmaXRDb3VudCIsImxpbmVhckludGVycG9sYXRlIiwiYmVmb3JlIiwiYWZ0ZXIiLCJhdFBvaW50IiwibmV3RGF0YSIsInNwcmluZ0ZhY3RvciIsIk51bWJlciIsInRvRml4ZWQiLCJ2YXJpYWJsZSIsIkZOX0FSR1MiLCJGTl9BUkdfU1BMSVQiLCJGTl9BUkciLCJTVFJJUF9DT01NRU5UUyIsInBhcmFtZXRlcnMiLCJmblRleHQiLCJhcmdEZWNsIiwidG9TdHJpbmciLCJzcGxpdCIsImZvckVhY2giLCJhcmciLCJhbGwiLCJ1bmRlcnNjb3JlIiwib2JqZWN0UHJvcGVydHkiLCJzdG9yZSIsImdldCIsInNldCIsIlBJIiwiaXRlbSIsInByb3BlcnR5U3RyaW5nIiwicGFyZW50T2JqZWN0Iiwic3Vic3RyIiwidHJpYW5nbGVzIiwidjEiLCJ2MiIsImJhY2t1cFVWIiwidHJpYW5nbGUiLCJ2MXV2IiwidjJ1diIsIm1lc2giLCJmYWNlIiwidG1wVjEiLCJ0bXBWMXV2IiwidmVydGljZXMiLCJ2ZXJ0ZXhMaXN0IiwiQVBJIiwiVmVjdG9yMyIsIlBvaW50cyIsInYiLCJhZGQiLCJwb3NpdGlvbiIsIlYiLCJhdmVyYWdlIiwicyIsInYwIiwiZWRnZXMiLCJ3aW5kaW5nIiwiZWRnZUluZGV4IiwicHJvY2Vzc2VkIiwiY2xvY2t3aXNlIiwiYnYxIiwib3JpZW50YXRpb25FZGdlIiwiaW5Qcm9jZXNzZWQiLCJlcXVhbHMiLCJuZWlnaGJvdXJPbkVkZ2UiLCJlZGdlIiwiY3VycmVudFRyaWFuZ2xlIiwiRDMiLCJGYWNlIiwidjBpbmRleCIsInYxaW5kZXgiLCJ2MmluZGV4IiwidXZzIiwiVHJpYW5nbGVFZGdlIiwidG9Qcm9jZXNzIiwidHJpYW5nbGVFZGdlIiwicG9wIiwiYmFja3VwViIsIlZlY3RvcjIiLCJqIiwibmVpZ2hib3VyIiwiZm91bmQiLCJrIiwidmVydGljZXNGbGF0IiwiZ3JhaW4iLCJwb2ludHMiLCJRdWF0ZXJuaW9uIiwidG9PcmlnaW4iLCJtYXhpbWl6ZVhEaXN0YW5jZSIsIm1heGltaXplWURpc3RhbmNlIiwidmVjdG9ycyIsInBlcmlvZCIsIm51bXMiLCJudW0iLCJzcGxpY2UiLCJzdW0iLCJuIiwidCIsImZpbHRlciIsImUiLCJpbmRleE9mIiwiYyIsIm9iaiIsIm1lbWJlciIsIkNvbG9yIiwiVmVjdG9yNCIsInR5cGUiLCJzdHJpbmciLCJ0b0xvd2VyQ2FzZSIsImlucHV0Iiwid29yZCIsIndvcmRzIiwidG9VcHBlckNhc2UiLCJ0cmltIiwic3RyIiwibGV0dGVyIiwiUmVnRXhwIiwicGFkQ2hhciIsInBhZCIsInN1YnN0cmluZyJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7O0FDbEZBLElBQU1BLEVBQUUsR0FBR0MsbUJBQU8sQ0FBQywrQkFBRCxDQUFsQjs7QUFFQUQsRUFBRSxDQUFDRSxNQUFILENBQVVDLE9BQVYsQ0FBa0JDLEtBQWxCO0FBQ0FKLEVBQUUsQ0FBQ0UsTUFBSCxDQUFVRyxNQUFWLENBQWlCRCxLQUFqQjtBQUVBRSxNQUFNLENBQUNDLE9BQVAs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T0FBMUIsRUFBbUNWLE1BQW5DLEVBQTJDO0FBRTFDLFVBQUlXLEdBQUcsR0FBRyxFQUFWOztBQUVBLFdBQUssSUFBSS9JLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUduRSxNQUFwQixFQUE0Qm1FLENBQUMsRUFBN0IsRUFBaUM7QUFDaEMrSSxXQUFHLElBQUlELE9BQVA7QUFDQTs7QUFFRCxhQUFPQyxHQUFHLENBQUNDLFNBQUosQ0FBYyxDQUFkLEVBQWlCRCxHQUFHLENBQUNsTixNQUFKLEdBQWF1TSxNQUFNLENBQUN2TSxNQUFyQyxJQUErQ3VNLE1BQXREO0FBQ0E7Ozs7OztBQUdGak8sTUFBTSxDQUFDQyxPQUFQLEdBQWlCQyxLQUFqQixDOzs7Ozs7Ozs7Ozs7Ozs7OztBQzl0Q0EsZUFBOENQLG1CQUFPLENBQUMsZ0RBQUQsQ0FBckQ7QUFBQSxJQUFPQyxNQUFQLFlBQU9BLE1BQVA7QUFBQSxJQUFld0QsYUFBZixZQUFlQSxhQUFmO0FBQUEsSUFBOEJDLFlBQTlCLFlBQThCQSxZQUE5Qjs7QUFDQSxJQUFNSCxRQUFRLEdBQUd2RCxtQkFBTyxDQUFDLGdEQUFELENBQXhCOztJQUVNRCxFO0FBRUwsZ0JBQWM7QUFBQTtBQUNiOzs7O1dBRUQsbUJBQWlCO0FBQ2hCLGFBQU8sVUFBUDtBQUNBOzs7Ozs7QUFJRkEsRUFBRSxDQUFDd0QsUUFBSCxHQUFnQkEsUUFBaEI7QUFDQXhELEVBQUUsQ0FBQ0UsTUFBSCxHQUFlQSxNQUFmO0FBQ0FGLEVBQUUsQ0FBQ0UsTUFBSCxDQUFVQyxPQUFWLEdBQW9CdUQsYUFBcEI7QUFDQTFELEVBQUUsQ0FBQ0UsTUFBSCxDQUFVRyxNQUFWLEdBQW1Cc0QsWUFBbkI7QUFFQXJELE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlAsRUFBakIsQyIsImZpbGUiOiJyMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3IzL2luZGV4LmpzXCIpO1xuIiwiY29uc3QgUjMgPSByZXF1aXJlKCcuL3IzLmpzJyk7XG5cblIzLlN5c3RlbS5MaW5raW5nLnN0YXJ0KCk7XG5SMy5TeXN0ZW0uU29ja2V0LnN0YXJ0KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUjM7XG4iLCJjb25zdCBVdGlscyA9IHJlcXVpcmUoJy4vcjMtdXRpbHMnKTtcblxuY2xhc3MgRXZlbnQge1xuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRjb25zb2xlLmxvZygnRXZlbnQgY3JlYXRlZCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNvbWUgbmljZSBFdmVudHMgaGFuZGxpbmdcblx0ICogQHR5cGUge3t9fVxuXHQgKi9cblx0c3RhdGljIFN1YnNjcmlwdGlvbnMgPSB7fTtcblxuXHRzdGF0aWMgU3Vic2NyaWJlKFxuXHRcdGV2ZW50TmFtZSxcblx0XHRmblxuXHQpIHtcblx0XHQvKipcblx0XHQgKiBUb2RvIC0gbWF5YmUgZXZlbnR1YWxseSBzdG9yZSBhIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHRcdCAqL1xuXHRcdGxldCBzdWJzY3JpcHRpb25JZCA9IFV0aWxzLlJhbmRvbUlkKDEwKTtcblxuXHRcdGlmIChFdmVudC5TdWJzY3JpcHRpb25zLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcblxuXHRcdFx0aWYgKEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnROYW1lXVtzdWJzY3JpcHRpb25JZF0pIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBIGNvbXBvbmVudCBjYW4gb25seSBzdWJzY3JpYmUgdG8gYSBwYXJ0aWN1bGFyIGV2ZW50IElEIG9uY2UnKTtcblx0XHRcdH1cblxuXHRcdFx0RXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudE5hbWVdW3N1YnNjcmlwdGlvbklkXSA9IGZuO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50TmFtZV0gPSB7fTtcblx0XHRcdEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnROYW1lXVtzdWJzY3JpcHRpb25JZF0gPSBmbjtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBSZXR1cm4gYSBoYW5kbGUgdG8gdGhlIGNhbGxlciB0byBhbGxvdyB1cyB0byB1bnN1YnNjcmliZSB0byB0aGlzIGV2ZW50XG5cdFx0ICovXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZuOiBmbixcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24gKGV2ZW50SWQsIHN1YnNjcmlwdGlvbklkKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFN0b3AgbGlzdGVuaW5nIGZvciB0aGlzIGV2ZW50IGZyb20gdGhpcyBjb21wb25lbnRcblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRkZWxldGUgRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXVtzdWJzY3JpcHRpb25JZF07XG5cblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBJZiB0aGUgbGVuZ3RoIG9mIGxpc3RlbmVycyBpcyAwLCBzdG9wIHJlZmVyZW5jaW5nIHRoaXMgZXZlbnRcblx0XHRcdFx0XHQgKiBAdHlwZSB7c3RyaW5nW119XG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0bGV0IGxpc3RlbmVycyA9IE9iamVjdC5rZXlzKEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF0pO1xuXHRcdFx0XHRcdGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0fShldmVudE5hbWUsIHN1YnNjcmlwdGlvbklkKSxcblx0XHRcdHN1YnNjcmlwdGlvbklkIDogc3Vic2NyaXB0aW9uSWRcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdWJzY3JpYmUgdG8gc29tZSBldmVudHNcblx0ICogQHBhcmFtIGV2ZW50TmFtZVxuXHQgKiBAcGFyYW0gY2FsbGJhY2tcblx0ICovXG5cdHN1YnNjcmliZShcblx0XHRldmVudE5hbWUsXG5cdFx0Y2FsbGJhY2tcblx0KSB7XG5cdFx0cmV0dXJuIEV2ZW50LlN1YnNjcmliZShldmVudE5hbWUsIGNhbGxiYWNrLmJpbmQodGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdGF0aWMgU3luY2hyb25vdXMgRXZlbnQgLSBDYWxscyBjbGllbnRDYWxsYmFjayBkaXJlY3RseSBhZnRlciB0aGUgZXZlbnQgcmVzdWx0IGlzIG9idGFpbmVkXG5cdCAqIEBwYXJhbSBldmVudElkXG5cdCAqIEBwYXJhbSBkYXRhXG5cdCAqIEBwYXJhbSBjbGllbnRDYWxsYmFjayBpcyBleGVjdXRlZCBpZGVhbGx5IHdoZW4gdGhlIGV2ZW50IGNvbXBsZXRlZFxuXHQgKiBAcGFyYW0gY2xpZW50RXJyb3JDYWxsYmFja1xuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBvZiBjYWxsYmFja3MgZXhlY3V0ZWRcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgRW1pdChcblx0XHRldmVudElkLFxuXHRcdGRhdGEsXG5cdFx0Y2xpZW50Q2FsbGJhY2ssXG5cdFx0Y2xpZW50RXJyb3JDYWxsYmFja1xuXHQpIHtcblx0XHRpZiAoRXZlbnQuU3Vic2NyaXB0aW9ucy5oYXNPd25Qcm9wZXJ0eShldmVudElkKSkge1xuXG5cdFx0XHRsZXQgc3Vic2NyaXB0aW9uSWRzID0gT2JqZWN0LmtleXMoRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXSk7XG5cblx0XHRcdHN1YnNjcmlwdGlvbklkcy5tYXAoXG5cdFx0XHRcdGZ1bmN0aW9uKHN1YnNjcmlwdGlvbklkKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGxldCByZXN1bHQgPSBFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdW3N1YnNjcmlwdGlvbklkXShkYXRhKTtcblxuXHRcdFx0XHRcdFx0aWYgKGNsaWVudENhbGxiYWNrKSB7XG5cdFx0XHRcdFx0XHRcdGNsaWVudENhbGxiYWNrKHJlc3VsdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGlmIChjbGllbnRFcnJvckNhbGxiYWNrKSB7XG5cdFx0XHRcdFx0XHRcdGNsaWVudEVycm9yQ2FsbGJhY2soZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XG5cdFx0XHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KVxuXHRcdH1cblx0fVxuXG5cdGVtaXQoXG5cdFx0ZXZlbnROYW1lLFxuXHRcdGRhdGEsXG5cdFx0Y2xpZW50Q2FsbGJhY2ssXG5cdFx0Y2xpZW50RXJyb3JDYWxsYmFja1xuXHQpIHtcblx0XHRyZXR1cm4gRXZlbnQuRW1pdChcblx0XHRcdGV2ZW50TmFtZSxcblx0XHRcdGRhdGEsXG5cdFx0XHRjbGllbnRDYWxsYmFjayxcblx0XHRcdGNsaWVudEVycm9yQ2FsbGJhY2tcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGhlIGZ1bmN0aW9ucyB3aGljaCBzdWJzY3JpYmUgdG8gdGhpcyBldmVudCwgYnV0IGRvbid0IHByb2Nlc3MgdGhlIGNsaWVudCBjYWxsYmFjayAtIHRoZSBzdWJzY3JpcHRpb24gZnVuY3Rpb25cblx0ICogc2hvdWxkIGV4ZWN1dGUgdGhlIGNsaWVudCBjYWxsYmFja1xuXHQgKiBAcGFyYW0gZXZlbnRJZFxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcGFyYW0gY2xpZW50Q2FsbGJhY2tcblx0ICogQHBhcmFtIGNsaWVudEVycm9yQ2FsbGJhY2tcblx0ICogQHJldHVybnMge251bWJlcn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgQXN5bmMoXG5cdFx0ZXZlbnRJZCxcblx0XHRkYXRhLFxuXHRcdGNsaWVudENhbGxiYWNrLFxuXHRcdGNsaWVudEVycm9yQ2FsbGJhY2tcblx0KSB7XG5cdFx0aWYgKEV2ZW50LlN1YnNjcmlwdGlvbnMuaGFzT3duUHJvcGVydHkoZXZlbnRJZCkpIHtcblxuXHRcdFx0bGV0IHN1YnNjcmlwdGlvbklkcyA9IE9iamVjdC5rZXlzKEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF0pO1xuXG5cdFx0XHRzdWJzY3JpcHRpb25JZHMubWFwKFxuXHRcdFx0XHRmdW5jdGlvbihzdWJzY3JpcHRpb25JZCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdW3N1YnNjcmlwdGlvbklkXShkYXRhLCBjbGllbnRDYWxsYmFjaywgY2xpZW50RXJyb3JDYWxsYmFjayk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGlmIChjbGllbnRFcnJvckNhbGxiYWNrKSB7XG5cdFx0XHRcdFx0XHRcdGNsaWVudEVycm9yQ2FsbGJhY2soZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XG5cdFx0XHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KVxuXHRcdH1cblx0fTtcblxufVxuXG4vL0VWRU5UX0dFTkVSQVRFRF9TVEFSVFxuRXZlbnQuQ1JFQVRFX0lOU1RBTkNFID0gMHgxO1xuRXZlbnQuRElTUE9TRV9JTlNUQU5DRSA9IDB4MjtcbkV2ZW50LkRJU1BPU0VfT0JKRUNUID0gMHgzO1xuRXZlbnQuR0VUX1JVTlRJTUUgPSAweDQ7XG5FdmVudC5HRVRfV0lORE9XX1NJWkUgPSAweDU7XG5FdmVudC5JTlNUQU5DRV9DUkVBVEVEID0gMHg2O1xuRXZlbnQuSU5TVEFOQ0VfRElTUE9TRUQgPSAweDc7XG5FdmVudC5PQkpFQ1RfQ1JFQVRFRCA9IDB4ODtcbkV2ZW50Lk9CSkVDVF9ESVNQT1NFRCA9IDB4OTtcbkV2ZW50Lk9CSkVDVF9JTklUSUFMSVpFRCA9IDB4YTtcbkV2ZW50LlBBVVNFID0gMHhiO1xuRXZlbnQuUkVTVEFSVCA9IDB4YztcbkV2ZW50LlNUQVJUID0gMHhkO1xuRXZlbnQuVVBEQVRFX0ZST01fSU5TVEFOQ0VfQUZURVIgPSAweGU7XG5FdmVudC5VUERBVEVfRlJPTV9JTlNUQU5DRV9CRUZPUkUgPSAweGY7XG5FdmVudC5VUERBVEVfSU5TVEFOQ0VfQUZURVIgPSAweDEwO1xuRXZlbnQuVVBEQVRFX0lOU1RBTkNFX0JFRk9SRSA9IDB4MTE7XG5FdmVudC5NQVhfRVZFTlRTID0gMHgxMjtcblxuRXZlbnQuR2V0RXZlbnROYW1lID0gZnVuY3Rpb24oZXZlbnRJZCkge1xuXG5cdHN3aXRjaChldmVudElkKSB7XG5cdFx0Y2FzZSAweDEgOiByZXR1cm4gJ2NyZWF0ZV9pbnN0YW5jZSc7XG5cdFx0Y2FzZSAweDIgOiByZXR1cm4gJ2Rpc3Bvc2VfaW5zdGFuY2UnO1xuXHRcdGNhc2UgMHgzIDogcmV0dXJuICdkaXNwb3NlX29iamVjdCc7XG5cdFx0Y2FzZSAweDQgOiByZXR1cm4gJ2dldF9ydW50aW1lJztcblx0XHRjYXNlIDB4NSA6IHJldHVybiAnZ2V0X3dpbmRvd19zaXplJztcblx0XHRjYXNlIDB4NiA6IHJldHVybiAnaW5zdGFuY2VfY3JlYXRlZCc7XG5cdFx0Y2FzZSAweDcgOiByZXR1cm4gJ2luc3RhbmNlX2Rpc3Bvc2VkJztcblx0XHRjYXNlIDB4OCA6IHJldHVybiAnb2JqZWN0X2NyZWF0ZWQnO1xuXHRcdGNhc2UgMHg5IDogcmV0dXJuICdvYmplY3RfZGlzcG9zZWQnO1xuXHRcdGNhc2UgMHhhIDogcmV0dXJuICdvYmplY3RfaW5pdGlhbGl6ZWQnO1xuXHRcdGNhc2UgMHhiIDogcmV0dXJuICdwYXVzZSc7XG5cdFx0Y2FzZSAweGMgOiByZXR1cm4gJ3Jlc3RhcnQnO1xuXHRcdGNhc2UgMHhkIDogcmV0dXJuICdzdGFydCc7XG5cdFx0Y2FzZSAweGUgOiByZXR1cm4gJ3VwZGF0ZV9mcm9tX2luc3RhbmNlX2FmdGVyJztcblx0XHRjYXNlIDB4ZiA6IHJldHVybiAndXBkYXRlX2Zyb21faW5zdGFuY2VfYmVmb3JlJztcblx0XHRjYXNlIDB4MTAgOiByZXR1cm4gJ3VwZGF0ZV9pbnN0YW5jZV9hZnRlcic7XG5cdFx0Y2FzZSAweDExIDogcmV0dXJuICd1cGRhdGVfaW5zdGFuY2VfYmVmb3JlJztcblx0XHRkZWZhdWx0IDpcblx0XHRcdHRocm93IG5ldyBFcnJvcignRXZlbnQgdHlwZSBub3QgZGVmaW5lZCA6ICcgKyBldmVudElkKTtcblx0fVxuXG59O1xuLy9FVkVOVF9HRU5FUkFURURfRU5EXG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnQ7XG4iLCJjb25zdCBFdmVudCA9IHJlcXVpcmUoJy4vcjMtZXZlbnQnKTtcblxuY2xhc3MgUjNPYmplY3QgZXh0ZW5kcyBFdmVudCB7XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cblx0XHRjb25zb2xlLmxvZygnT2JqZWN0IGNyZWF0ZWQnKTtcblxuXHRcdHRoaXMuZW1pdChFdmVudC5PQkpFQ1RfQ1JFQVRFRCk7XG5cblx0fVxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gUjNPYmplY3Q7IiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0uanMnKTtcbmNvbnN0IFN5c3RlbUxpbmtpbmcgPSByZXF1aXJlKCcuL3IzLXN5c3RlbS1saW5raW5nLmpzJyk7XG5jb25zdCBTeXN0ZW1Tb2NrZXQgPSByZXF1aXJlKCcuL3IzLXN5c3RlbS1zb2NrZXQuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFN5c3RlbSxcbiAgU3lzdGVtTGlua2luZyxcbiAgU3lzdGVtU29ja2V0XG59IiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0nKTtcbmNvbnN0IFIzT2JqZWN0ID0gcmVxdWlyZSgnLi4vcjMtcjMtb2JqZWN0Jyk7XG5jb25zdCBFdmVudCA9IHJlcXVpcmUoJy4uL3IzLWV2ZW50Jyk7XG5cbmNsYXNzIExpbmtpbmdTeXN0ZW0gZXh0ZW5kcyBTeXN0ZW0ge1xuXG5cdHN0YXRpYyBzdGFydCgpIHtcblxuXHRcdHN1cGVyLnN0YXJ0KCk7XG5cdFx0XG5cdFx0Y29uc29sZS5sb2coJ3N0YXJ0aW5nIGxpbmtpbmcgc3lzdGVtJyk7XG5cblx0XHRFdmVudC5TdWJzY3JpYmUoXG5cdFx0XHRFdmVudC5PQkpFQ1RfQ1JFQVRFRCxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0Y29uc29sZS5sb2coJ2xpbmtpbmcgc3lzdGVtIGRpc2NvdmVyZWQgYW4gb2JqZWN0Jyk7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGxldCBvYmplY3QgPSBuZXcgUjNPYmplY3QoKTtcblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cdFxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gTGlua2luZ1N5c3RlbTtcbiIsImNvbnN0IFN5c3RlbSA9IHJlcXVpcmUoJy4vcjMtc3lzdGVtLmpzJyk7XG5cbmNsYXNzIFNvY2tldFN5c3RlbSBleHRlbmRzIFN5c3RlbSB7XG5cblx0c3RhdGljIHN0YXJ0KCkge1xuXG5cdFx0c3VwZXIuc3RhcnQoKTtcblx0XHRcblx0XHRjb25zb2xlLmxvZygnc3RhcnRpbmcgc29ja2V0IHN5c3RlbScpO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU29ja2V0U3lzdGVtOyIsImNsYXNzIFN5c3RlbSB7XG5cblx0c3RhdGljIHN0YXJ0KCkge1xuXHRcdGNvbnNvbGUubG9nKCdzdGFydGluZyBhIHN5c3RlbScpO1x0XG5cdH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFN5c3RlbTtcbiIsImNsYXNzIFV0aWxzIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRcblx0fVxuXHRcblx0LyoqXG5cdCAqIEdldHMgdGhlIGZpcnN0IHBhcmVudCBvZiB0aGUgb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSBvYmplY3Rcblx0ICogQHBhcmFtIGNvbnN0cnVjdG9yXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBHZXRGaXJzdFBhcmVudChvYmplY3QsIGNvbnN0cnVjdG9yKSB7XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGNvbnN0cnVjdG9yKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IGEgY29uc3RydWN0b3InKTtcblx0XHR9XG5cblx0XHRpZiAob2JqZWN0LnBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKG9iamVjdC5wYXJlbnQgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikge1xuXHRcdFx0cmV0dXJuIG9iamVjdC5wYXJlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBVdGlscy5HZXRGaXJzdFBhcmVudChvYmplY3QucGFyZW50LCBjb25zdHJ1Y3Rvcik7XG5cdFx0fVxuXG5cdH07XG5cblx0c3RhdGljIFN5bnRheEhpZ2hsaWdodChqc29uKSB7XG5cdFx0aWYgKHR5cGVvZiBqc29uICE9ICdzdHJpbmcnKSB7XG5cdFx0XHRqc29uID0gSlNPTi5zdHJpbmdpZnkoanNvbiwgdW5kZWZpbmVkLCAyKTtcblx0XHR9XG5cdFx0anNvbiA9IGpzb24ucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuXHRcdHJldHVybiBqc29uLnJlcGxhY2UoLyhcIihcXFxcdVthLXpBLVowLTldezR9fFxcXFxbXnVdfFteXFxcXFwiXSkqXCIoXFxzKjopP3xcXGIodHJ1ZXxmYWxzZXxudWxsKVxcYnwtP1xcZCsoPzpcXC5cXGQqKT8oPzpbZUVdWytcXC1dP1xcZCspPykvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG5cdFx0XHRsZXQgY2xzID0gJ251bWJlcic7XG5cdFx0XHRpZiAoL15cIi8udGVzdChtYXRjaCkpIHtcblx0XHRcdFx0aWYgKC86JC8udGVzdChtYXRjaCkpIHtcblx0XHRcdFx0XHRjbHMgPSAna2V5Jztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjbHMgPSAnc3RyaW5nJztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICgvdHJ1ZXxmYWxzZS8udGVzdChtYXRjaCkpIHtcblx0XHRcdFx0Y2xzID0gJ2Jvb2xlYW4nO1xuXHRcdFx0fSBlbHNlIGlmICgvbnVsbC8udGVzdChtYXRjaCkpIHtcblx0XHRcdFx0Y2xzID0gJ251bGwnO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICc8c3BhbiBjbGFzcz1cIicgKyBjbHMgKyAnXCI+JyArIG1hdGNoICsgJzwvc3Bhbj4nO1xuXHRcdH0pO1xuXHR9O1xuXG5cdHN0YXRpYyBHZXRQYXJlbnRQcm9qZWN0KGNvbXBvbmVudCkge1xuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb21wb25lbnQucGFyZW50KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgbm90IGZvdW5kJyk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbXBvbmVudC5wYXJlbnQgaW5zdGFuY2VvZiBSMy5Qcm9qZWN0KSB7XG5cdFx0XHRyZXR1cm4gY29tcG9uZW50LnBhcmVudDtcblx0XHR9XG5cblx0XHRyZXR1cm4gVXRpbHMuR2V0UGFyZW50UHJvamVjdChjb21wb25lbnQucGFyZW50KTtcblx0fTtcblxuXHRzdGF0aWMgR2V0UGFyZW50cyhjb21wb25lbnQsIHBhcmVudHMpIHtcblxuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwocGFyZW50cykpIHtcblx0XHRcdHBhcmVudHMgPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGNvbXBvbmVudC5wYXJlbnQpKSB7XG5cdFx0XHRyZXR1cm4gcGFyZW50cztcblx0XHR9XG5cblx0XHRwYXJlbnRzLnB1c2goY29tcG9uZW50LnBhcmVudCk7XG5cblx0XHRyZXR1cm4gVXRpbHMuR2V0UGFyZW50cyhjb21wb25lbnQucGFyZW50LCBwYXJlbnRzKTtcblxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0c3RhdGljIEluc3RhbmNlKGNvbXBvbmVudCkge1xuXHRcdHJldHVybiBVdGlscy5EZWZpbmVkKGNvbXBvbmVudCkgJiYgVXRpbHMuRGVmaW5lZChjb21wb25lbnQuaW5zdGFuY2UpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBVdGlscy5SZW1vdmVGcm9tU2VsZWN0XG5cdCAqIEBwYXJhbSBzZWxlY3Rcblx0ICogQHBhcmFtIGlkXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBSZW1vdmVGcm9tU2VsZWN0KHNlbGVjdCwgaWQpIHtcblxuXHRcdGxldCBpO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoc2VsZWN0Lm9wdGlvbnNbaV0udmFsdWUgPT09IGlkKSB7XG5cdFx0XHRcdHNlbGVjdC5yZW1vdmUoaSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0LyoqXG5cdCAqIFV0aWxzLkdldFNlbGVjdEluZGV4XG5cdCAqXG5cdCAqIEdldCB0aGUgc2VsZWN0IGluZGV4IG9mIGdpdmVuIGlkXG5cdCAqXG5cdCAqIEBwYXJhbSBzZWxlY3Rcblx0ICogQHBhcmFtIGlkXG5cdCAqIEByZXR1cm5zIGJvb2xlYW4gdHJ1ZSBpZiBzdWNjZXNzZnVsXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFNldFNlbGVjdEluZGV4KHNlbGVjdCwgaWQpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoc2VsZWN0Lm9wdGlvbnNbaV0udmFsdWUgPT09IGlkKSB7XG5cdFx0XHRcdHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gaTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXHRzdGF0aWMgU29ydFNlbGVjdChzZWxlY3QpIHtcblxuXHRcdGxldCB0bXAgPSBbXTtcblx0XHRsZXQgaTtcblxuXHRcdGZvciAoaSA9IDE7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dG1wW2ktMV0gPSBbXTtcblx0XHRcdHRtcFtpLTFdWzBdID0gc2VsZWN0Lm9wdGlvbnNbaV0udGV4dDtcblx0XHRcdHRtcFtpLTFdWzFdID0gc2VsZWN0Lm9wdGlvbnNbaV0udmFsdWU7XG5cdFx0fVxuXG5cdFx0dG1wLnNvcnQoKTtcblxuXHRcdHNlbGVjdC5vcHRpb25zID0gW3NlbGVjdC5vcHRpb25zWzBdXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyBpKyspIHtcblx0XHRcdHNlbGVjdC5vcHRpb25zW2krMV0gPSBuZXcgT3B0aW9uKHRtcFtpXVswXSwgdG1wW2ldWzFdKTtcblx0XHR9XG5cblx0XHRyZXR1cm47XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhcmVudCBvZiBvYmplY3Qgd2hpdGggcHJvcGVydHkgb2Ygb3B0aW9uYWwgdHlwZSBjb25zdHJ1Y3Rvci4gSWYgaW5kZXggaXMgc3BlY2lmaWVkLCBnZXQgdGhlIHBhcmVudCBvZiB0aGVcblx0ICogb2JqZWN0IHdpdGggcHJvcGVydHlbaW5kZXhdIC0gd2hpY2ggbWVhbnMgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhbiBhcnJheVxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gaW5kZXhcblx0ICogQHBhcmFtIGNvbnN0cnVjdG9yXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBHZXRQYXJlbnQob2JqZWN0LCBwcm9wZXJ0eSwgaW5kZXgsIGNvbnN0cnVjdG9yKSB7XG5cblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGNvbnN0cnVjdG9yKSkge1xuXHRcdFx0Y29uc3RydWN0b3IgPSBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwoaW5kZXgpKSB7XG5cdFx0XHRpbmRleCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKG9iamVjdC5wYXJlbnQpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogUGFyZW50IGRlZmluZWRcblx0XHRcdCAqL1xuXHRcdFx0aWYgKG9iamVjdC5wYXJlbnQuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG5cblx0XHRcdFx0aWYgKGNvbnN0cnVjdG9yKSB7XG5cblx0XHRcdFx0XHRpZiAoaW5kZXgpIHtcblxuXHRcdFx0XHRcdFx0aWYgKG9iamVjdC5wYXJlbnRbcHJvcGVydHldW2luZGV4XSBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50W3Byb3BlcnR5XVtpbmRleF07XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2Ygb2JqZWN0LnBhcmVudC5nZXRQYXJlbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb2JqZWN0LnBhcmVudC5nZXRQYXJlbnQocHJvcGVydHksIGluZGV4LCBjb25zdHJ1Y3Rvcik7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCdnZXRQYXJlbnQgbm90IGRlZmluZWQgb24gQVBJIG9iamVjdCA6ICcgKyBvYmplY3QucGFyZW50ICsgJyAtIHlvdSBzaG91bGQgYXZvaWQgaGF2aW5nIHRoZXNlIG1lc3NzYWdlcycpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKG9iamVjdC5wYXJlbnRbcHJvcGVydHldIGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9iamVjdC5wYXJlbnRbcHJvcGVydHldO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdC5wYXJlbnQuZ2V0UGFyZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9iamVjdC5wYXJlbnQuZ2V0UGFyZW50KHByb3BlcnR5LCBpbmRleCwgY29uc3RydWN0b3IpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybignZ2V0UGFyZW50IG5vdCBkZWZpbmVkIG9uIEFQSSBvYmplY3QgOiAnICsgb2JqZWN0LnBhcmVudCArICcgLSB5b3Ugc2hvdWxkIGF2b2lkIGhhdmluZyB0aGVzZSBtZXNzc2FnZXMnKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoaW5kZXgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50W3Byb3BlcnR5XVtpbmRleF07XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50W3Byb3BlcnR5XTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhpcyBwYXJlbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVydHkgLSBnbyBhIGxldmVsIGhpZ2hlclxuXHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKHR5cGVvZiBvYmplY3QucGFyZW50LmdldFBhcmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdHJldHVybiBvYmplY3QucGFyZW50LmdldFBhcmVudChwcm9wZXJ0eSwgaW5kZXgsIGNvbnN0cnVjdG9yKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ2dldFBhcmVudCBub3QgZGVmaW5lZCBvbiBBUEkgb2JqZWN0IDogJyArIG9iamVjdC5wYXJlbnQgKyAnIC0geW91IHNob3VsZCBhdm9pZCBoYXZpbmcgdGhlc2UgbWVzc3NhZ2VzJyk7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIE5vIHBhcmVudCBkZWZpbmVkXG5cdFx0XHQgKi9cblx0XHRcdGNvbnNvbGUud2FybigncHJvcGVydHkgOiAnICsgcHJvcGVydHkgKyAnIG9mIHR5cGUgJyArIGNvbnN0cnVjdG9yICsgJyB3YXMgbm90IGZvdW5kIGluIHRoZSBwYXJlbnQgY2hhaW4nKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHR9O1xuXG5cblx0LyoqXG5cdCAqIFN0cmlwcyBpbWFnZSBleHRlbnNpb24gZnJvbSBnaXZlbiBwYXRoXG5cdCAqIEBwYXJhbSBpbWFnZVBhdGhcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgU3RyaXBJbWFnZUV4dGVuc2lvbihpbWFnZVBhdGgpIHtcblx0XHRyZXR1cm4gaW1hZ2VQYXRoLnJlcGxhY2UoLyhcXC5wbmckfFxcLmdpZiR8XFwuanBlZyR8XFwuanBnJCkvLCcnKVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgdW5sb2FkZWRcblx0ICogQHBhcmFtIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgVW5sb2FkZWQoY29tcG9uZW50KSB7XG5cdFx0aWYgKFxuXHRcdFx0VXRpbHMuVW5kZWZpbmVkT3JOdWxsKGNvbXBvbmVudCkgfHxcblx0XHRcdFV0aWxzLlVuZGVmaW5lZE9yTnVsbChjb21wb25lbnQuaW5zdGFuY2UpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBjb21wb25lbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIExvYWRlZChjb21wb25lbnQpIHtcblx0XHRpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5pbnN0YW5jZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdHN0YXRpYyBCdWlsZFZlY3RvclNvdXJjZShyZXN1bHQsIG5hbWUsIGRpbWVuc2lvbikge1xuXG5cdFx0aWYgKGRpbWVuc2lvbiA9PT0gMikge1xuXHRcdFx0cmVzdWx0W25hbWVdID0ge307XG5cdFx0XHRyZXN1bHRbbmFtZV0ueCA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZGltZW5zaW9uID09PSAzKSB7XG5cdFx0XHRyZXN1bHRbbmFtZV0gPSB7fTtcblx0XHRcdHJlc3VsdFtuYW1lXS54ID0gZmFsc2U7XG5cdFx0XHRyZXN1bHRbbmFtZV0ueSA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnkgPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZGltZW5zaW9uID09PSA0KSB7XG5cdFx0XHRyZXN1bHRbbmFtZV0gPSB7fTtcblx0XHRcdHJlc3VsdFtuYW1lXS54ID0gZmFsc2U7XG5cdFx0XHRyZXN1bHRbbmFtZV0ueSA9IGZhbHNlO1xuXHRcdFx0cmVzdWx0W25hbWVdLnogPSBmYWxzZTtcblx0XHRcdHJlc3VsdFtuYW1lXS53ID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc29sZS53YXJuKCd1bmtub3duIGRpbWVuc2lvbiA6ICcgKyBkaW1lbnNpb24pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCAnaW5zdGFuY2VzJyBvZiB0aGUgYXJyYXksIG9yIG51bGwgaWYgYW4gJ2luc3RhbmNlJyBpcyB1bmRlZmluZWRcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSBhcnJheVxuXHQgKi9cblx0c3RhdGljIEdldEFycmF5SW5zdGFuY2VzKGFycmF5KSB7XG5cdFx0cmV0dXJuIGFycmF5LnJlZHVjZShcblx0XHRcdGZ1bmN0aW9uKHJlc3VsdCwgb2JqZWN0KSB7XG5cblx0XHRcdFx0aWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKG9iamVjdC5pbnN0YW5jZSkpIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBudWxsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKG9iamVjdC5pbnN0YW5jZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdFtdXG5cdFx0KTtcblx0fTtcblxuXHRzdGF0aWMgU29ydEZhY2VzQnlNYXRlcmlhbEluZGV4KGZhY2VzKSB7XG5cblx0XHQvKipcblx0XHQgKiBTb3J0cyBmYWNlcyBhY2NvcmRpbmcgdG8gbWF0ZXJpYWwgaW5kZXggYmVjYXVzZSBsYXRlciB3ZSB3aWxsIGNyZWF0ZVxuXHRcdCAqIGdyb3VwcyBmb3IgZWFjaCB2ZXJ0aWNlIGdyb3VwXG5cdFx0ICovXG5cdFx0ZmFjZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cblx0XHRcdGlmIChhLm1hdGVyaWFsSW5kZXggPCBiLm1hdGVyaWFsSW5kZXgpIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYS5tYXRlcmlhbEluZGV4ID4gYi5tYXRlcmlhbEluZGV4KSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9KTtcblxuXHRcdHJldHVybiBmYWNlcztcblx0fTtcblxuXHRzdGF0aWMgQnVpbGRRdWF0ZXJuaW9uU291cmNlKHJlc3VsdCwgbmFtZSkge1xuXHRcdHJlc3VsdFtuYW1lXSA9IHt9O1xuXHRcdHJlc3VsdFtuYW1lXS5heGlzID0ge307XG5cdFx0cmVzdWx0W25hbWVdLmF4aXMueCA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS5heGlzLnkgPSBmYWxzZTtcblx0XHRyZXN1bHRbbmFtZV0uYXhpcy56ID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLmFuZ2xlID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLnggPSBmYWxzZTtcblx0XHRyZXN1bHRbbmFtZV0ueSA9IGZhbHNlO1xuXHRcdHJlc3VsdFtuYW1lXS56ID0gZmFsc2U7XG5cdFx0cmVzdWx0W25hbWVdLncgPSBmYWxzZTtcblx0fTtcblxuXHRzdGF0aWMgT2JqZWN0UHJvcGVydGllc0FzQm9vbGVhbihvYmplY3QpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5yZWR1Y2UoXG5cdFx0XHRmdW5jdGlvbihyZXN1bHQsIHByb3BlcnR5SWQpIHtcblxuXHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdFtwcm9wZXJ0eUlkXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbcHJvcGVydHlJZF0gPSBmYWxzZTtcblxuXHRcdFx0XHQvLyBpZiAob2JqZWN0W3Byb3BlcnR5SWRdIGluc3RhbmNlb2YgUjMuVmVjdG9yMikge1xuXHRcdFx0XHQvLyAgICAgVXRpbHMuQnVpbGRWZWN0b3JTb3VyY2UocmVzdWx0LCBwcm9wZXJ0eUlkLCAyKTtcblx0XHRcdFx0Ly8gfVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBpZiAob2JqZWN0W3Byb3BlcnR5SWRdIGluc3RhbmNlb2YgUjMuVmVjdG9yMykge1xuXHRcdFx0XHQvLyAgICAgVXRpbHMuQnVpbGRWZWN0b3JTb3VyY2UocmVzdWx0LCBwcm9wZXJ0eUlkLCAzKTtcblx0XHRcdFx0Ly8gfVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBpZiAob2JqZWN0W3Byb3BlcnR5SWRdIGluc3RhbmNlb2YgUjMuVmVjdG9yNCkge1xuXHRcdFx0XHQvLyAgICAgVXRpbHMuQnVpbGRWZWN0b3JTb3VyY2UocmVzdWx0LCBwcm9wZXJ0eUlkLCA0KTtcblx0XHRcdFx0Ly8gfVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBpZiAob2JqZWN0W3Byb3BlcnR5SWRdIGluc3RhbmNlb2YgUjMuUXVhdGVybmlvbikge1xuXHRcdFx0XHQvLyAgICAgVXRpbHMuQnVpbGRRdWF0ZXJuaW9uU291cmNlKHJlc3VsdCwgcHJvcGVydHlJZCk7XG5cdFx0XHRcdC8vIH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0XHR9LmJpbmQodGhpcyksXG5cdFx0XHR7fVxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIEdldFJ1bnRpbWUoKSB7XG5cblx0XHRsZXQgcmVzdWx0ID0gbnVsbDtcblxuXHRcdFIzLkV2ZW50LkVtaXQoXG5cdFx0XHRSMy5FdmVudC5HRVRfUlVOVElNRSxcblx0XHRcdG51bGwsXG5cdFx0XHRmdW5jdGlvbihydW50aW1lKSB7XG5cdFx0XHRcdHJlc3VsdCA9IHJ1bnRpbWU7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHdpbmRvdyBzaXplIG9yIG51bGxcblx0ICogQHJldHVybnMgeyp9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEdldFdpbmRvd1NpemUoKSB7XG5cblx0XHRsZXQgc2l6ZSA9IG51bGw7XG5cblx0XHRSMy5FdmVudC5FbWl0KFxuXHRcdFx0UjMuRXZlbnQuR0VUX1dJTkRPV19TSVpFLFxuXHRcdFx0bnVsbCxcblx0XHRcdGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRcdFx0c2l6ZSA9IGRhdGE7XG5cdFx0XHR9LmJpbmQodGhpcylcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHNpemU7XG5cblx0fTtcblxuXHQvKipcblx0ICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gdXBkYXRlIG9iamVjdCB3aWR0aCBhbmQgaGVpZ2h0IG1lbWJlcnMgd2l0aCB3aW5kb3cgc2l6ZVxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFVwZGF0ZVdpbmRvd1NpemUob2JqZWN0KSB7XG5cdFx0bGV0IHNpemUgPSBVdGlscy5HZXRXaW5kb3dTaXplKCk7XG5cdFx0b2JqZWN0LndpZHRoID0gc2l6ZS53aWR0aDtcblx0XHRvYmplY3QuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG5cdH07XG5cblxuXHQvKipcblx0ICogUmV0dXJucyBpZCBvZiBvYmplY3Qgd2l0aCB0aGUgbmFtZSBpZiBpdCBleGlzdHMgaW4gdGhlIGFycmF5LCBvdGhlcndpc2UgbnVsbFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiBAcGFyYW0gYXJyYXlcblx0ICogQHJldHVybnMgeyp9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIE9iamVjdElkV2l0aE5hbWVJbkFycmF5KG5hbWUsIGFycmF5KSB7XG5cblx0XHRyZXR1cm4gYXJyYXkucmVkdWNlKFxuXHRcdFx0ZnVuY3Rpb24ocmVzdWx0LCBvYmplY3QpIHtcblxuXHRcdFx0XHRpZiAocmVzdWx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChuYW1lID09PSBvYmplY3QubmFtZSkge1xuXHRcdFx0XHRcdHJldHVybiBvYmplY3QuaWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0sXG5cdFx0XHRudWxsXG5cdFx0KTtcblx0fTtcblxuXHRzdGF0aWMgTG9hZElkc0Zyb21BcnJheVRvSWRPYmplY3QoYXJyYXksIGlkVG9PYmplY3QpIHtcblxuXHR9O1xuXG5cdHN0YXRpYyBMb2FkSWRzRnJvbU9iamVjdFRvSWRPYmplY3Qob2JqZWN0LCBpZFRvT2JqZWN0KSB7XG5cblxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHJhbmRvbSBpbnQgZXhjbHVzaXZlIG9mIG1heGltdW0gYnV0IGluY2x1c2l2ZSBvZiBtaW5pbXVtXG5cdCAqIEBwYXJhbSBtaW5cblx0ICogQHBhcmFtIG1heFxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0UmFuZG9tSW50KG1pbiwgbWF4KSB7XG5cdFx0bWluID0gTWF0aC5jZWlsKG1pbik7XG5cdFx0bWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuXHRcdHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47IC8vVGhlIG1heGltdW0gaXMgZXhjbHVzaXZlIGFuZCB0aGUgbWluaW11bSBpcyBpbmNsdXNpdmVcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyByYW5kb20gaW50IGluY2x1c2l2ZSBvZiBtaW5pbXVtIGFuZCBtYXhpbXVtXG5cdCAqIEBwYXJhbSBtaW5cblx0ICogQHBhcmFtIG1heFxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0UmFuZG9tSW50SW5jbHVzaXZlKG1pbiwgbWF4KSB7XG5cdFx0bWluID0gTWF0aC5jZWlsKG1pbik7XG5cdFx0bWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuXHRcdHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluOyAvL1RoZSBtYXhpbXVtIGlzIGluY2x1c2l2ZSBhbmQgdGhlIG1pbmltdW0gaXMgaW5jbHVzaXZlXG5cdH07XG5cblx0c3RhdGljIEludGVycG9sYXRlQXJyYXkoZGF0YSwgZml0Q291bnQpIHtcblxuXHRcdGxldCBsaW5lYXJJbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKGJlZm9yZSwgYWZ0ZXIsIGF0UG9pbnQpIHtcblx0XHRcdHJldHVybiBiZWZvcmUgKyAoYWZ0ZXIgLSBiZWZvcmUpICogYXRQb2ludDtcblx0XHR9O1xuXG5cdFx0bGV0IG5ld0RhdGEgPSBbXTtcblxuXHRcdGxldCBzcHJpbmdGYWN0b3IgPSBOdW1iZXIoKGRhdGEubGVuZ3RoIC0gMSkgLyAoZml0Q291bnQgLSAxKSk7XG5cblx0XHRuZXdEYXRhWzBdID0gZGF0YVswXTsgLy8gZm9yIG5ldyBhbGxvY2F0aW9uXG5cblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPCBmaXRDb3VudCAtIDE7IGkrKykge1xuXHRcdFx0bGV0IHRtcCAgICAgPSBpICogc3ByaW5nRmFjdG9yO1xuXHRcdFx0bGV0IGJlZm9yZSAgPSBOdW1iZXIoTWF0aC5mbG9vcih0bXApKS50b0ZpeGVkKCk7XG5cdFx0XHRsZXQgYWZ0ZXIgICA9IE51bWJlcihNYXRoLmNlaWwodG1wKSkudG9GaXhlZCgpO1xuXHRcdFx0bGV0IGF0UG9pbnQgPSB0bXAgLSBiZWZvcmU7XG5cdFx0XHRuZXdEYXRhW2ldICA9IGxpbmVhckludGVycG9sYXRlKGRhdGFbYmVmb3JlXSwgZGF0YVthZnRlcl0sIGF0UG9pbnQpO1xuXHRcdH1cblxuXHRcdG5ld0RhdGFbZml0Q291bnQgLSAxXSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXTsgLy8gZm9yIG5ldyBhbGxvY2F0aW9uXG5cblx0XHRyZXR1cm4gbmV3RGF0YTtcblx0fTtcblxuXHQvKipcblx0ICogVW5kZWZpbmVkIG9yIG51bGwgY2hlY2tcblx0ICogQHBhcmFtIHZhcmlhYmxlXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBVbmRlZmluZWRPck51bGwoXG5cdFx0dmFyaWFibGVcblx0KSB7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdmFyaWFibGUgPT09IG51bGw7XG5cdH07XG5cblx0LyoqXG5cdCAqIFRoZSB2YXJpYWJsZSBpcyBub3QgdW5kZWZpbmVkIGFuZCBub3QgbnVsbFxuXHQgKiBAcGFyYW0gdmFyaWFibGVcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIERlZmluZWQoXG5cdFx0dmFyaWFibGVcblx0KSB7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YXJpYWJsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFyaWFibGUgIT09IG51bGw7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgZnVuY3Rpb24gcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gZm5cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgR2V0UGFyYW1ldGVycyhmbikge1xuXG5cdFx0bGV0IEZOX0FSR1MgPSAvXmZ1bmN0aW9uXFxzKlteXFwoXSpcXChcXHMqKFteXFwpXSopXFwpL207XG5cdFx0bGV0IEZOX0FSR19TUExJVCA9IC8sLztcblx0XHRsZXQgRk5fQVJHID0gL15cXHMqKF8/KSguKz8pXFwxXFxzKiQvO1xuXHRcdGxldCBTVFJJUF9DT01NRU5UUyA9IC8oXFwvXFwvLiokKXwoXFwvXFwqW1xcc1xcU10qP1xcKlxcLyl8KFxccyo9W14sXFwpXSooKCcoPzpcXFxcJ3xbXidcXHJcXG5dKSonKXwoXCIoPzpcXFxcXCJ8W15cIlxcclxcbl0pKlwiKSl8KFxccyo9W14sXFwpXSopKS9tZztcblxuXHRcdGxldCBwYXJhbWV0ZXJzLFxuXHRcdFx0Zm5UZXh0LFxuXHRcdFx0YXJnRGVjbDtcblxuXHRcdGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHBhcmFtZXRlcnMgPSBbXTtcblx0XHRcdGZuVGV4dCA9IGZuLnRvU3RyaW5nKCkucmVwbGFjZShTVFJJUF9DT01NRU5UUywgJycpO1xuXHRcdFx0YXJnRGVjbCA9IGZuVGV4dC5tYXRjaChGTl9BUkdTKTtcblx0XHRcdGFyZ0RlY2xbMV0uc3BsaXQoRk5fQVJHX1NQTElUKS5mb3JFYWNoKGZ1bmN0aW9uKGFyZykge1xuXHRcdFx0XHRhcmcucmVwbGFjZShGTl9BUkcsIGZ1bmN0aW9uKGFsbCwgdW5kZXJzY29yZSwgbmFtZSkge1xuXHRcdFx0XHRcdHBhcmFtZXRlcnMucHVzaChuYW1lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgRXJyb3IoXCJub3QgYSBmdW5jdGlvblwiKVxuXHRcdH1cblxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGVpdGhlciBhbiBJRCBvZiB0aGUgb2JqZWN0IG9yIE51bGxcblx0ICogQHBhcmFtIG9iamVjdFxuXHQgKiBAcmV0dXJucyB7bnVsbH1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgSWRPck51bGwob2JqZWN0KSB7XG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChvYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChvYmplY3QuaWQpKSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybignc2F2aW5nIGFuIG9iamVjdCByZWZlcmVuY2Ugd2l0aCBubyBJRCA6ICcsIG9iamVjdCk7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9iamVjdC5pZDtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIExpbWl0IGEgcHJvcGVydHkgdG8gdmFsdWVzIGJldHdlZW4gLXBpIGFuZCArcGlcblx0ICogQHBhcmFtIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBvYmplY3RQcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyB7e2NvbmZpZ3VyYWJsZT86IGJvb2xlYW4sIGVudW1lcmFibGU/OiBib29sZWFuLCB2YWx1ZT8sIHdyaXRhYmxlPzogYm9vbGVhbiwgZ2V0PzogRnVuY3Rpb24sIHNldD86IEZ1bmN0aW9ufX1cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgTGltaXRUb1BJKHByb3BlcnR5LCBvYmplY3RQcm9wZXJ0eSkge1xuXG5cdFx0bGV0IHN0b3JlID0gb2JqZWN0UHJvcGVydHk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0IDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBzdG9yZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQgOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHR3aGlsZSAodmFsdWUgPiBNYXRoLlBJKSB7XG5cdFx0XHRcdFx0dmFsdWUgLT0gKE1hdGguUEkgKiAyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHdoaWxlICh2YWx1ZSA8IC0oTWF0aC5QSSkpIHtcblx0XHRcdFx0XHR2YWx1ZSArPSAoTWF0aC5QSSAqIDIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RvcmUgPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIElEcyByZXByZXNlbnRpbmcgdGhlIG9iamVjdHNcblx0ICogQHBhcmFtIGFycmF5XG5cdCAqIEByZXR1cm5zIFtdXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIElkQXJyYXlPckVtcHR5QXJyYXkoYXJyYXkpIHtcblx0XHRpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKGFycmF5KSkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuXG5cdFx0XHRcdGlmIChVdGlscy5VbmRlZmluZWRPck51bGwoaXRlbS5pZCkpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIElEIGZvdW5kIHdoaWxlIHRyeWluZyB0byBzdG9yZSBJRHMgdG8gYXJyYXknKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpdGVtLmlkXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIExpbmtzIGFuIG9iamVjdCB0byBpdHMgcGFyZW50IHRocm91Z2ggaWRUb09iamVjdCBhcnJheVxuXHQgKiBAcGFyYW0gcHJvcGVydHlTdHJpbmdcblx0ICogQHBhcmFtIGlkVG9PYmplY3Rcblx0ICogQHBhcmFtIHBhcmVudE9iamVjdFxuXHQgKiBAcGFyYW0gaWRcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRzdGF0aWMgTGluayhwcm9wZXJ0eVN0cmluZywgaWRUb09iamVjdCwgcGFyZW50T2JqZWN0LCBpZCkge1xuXG5cdFx0aWYgKCFVdGlscy5VbmRlZmluZWRPck51bGwocGFyZW50T2JqZWN0W3Byb3BlcnR5U3RyaW5nXSkpIHtcblxuXHRcdFx0aWYgKCFpZFRvT2JqZWN0Lmhhc093blByb3BlcnR5KGlkKSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oJ0xpbmtpbmcgZmFpbGVkIGZvciBvYmplY3Q6JyArIHBhcmVudE9iamVjdC5uYW1lKTtcblx0XHRcdH1cblxuXHRcdFx0cGFyZW50T2JqZWN0W3Byb3BlcnR5U3RyaW5nXSA9IGlkVG9PYmplY3RbaWRdO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogR2VuZXJhdGVzIGEgcmFuZG9tIElEXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFJhbmRvbUlkKGxlbmd0aCkge1xuXG5cdFx0aWYgKFV0aWxzLlVuZGVmaW5lZE9yTnVsbChsZW5ndGgpKSB7XG5cdFx0XHRsZW5ndGggPSAxMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIGxlbmd0aCk7XG5cdH07XG5cblx0c3RhdGljIEludmVydFdpbmRpbmdPcmRlcih0cmlhbmdsZXMpIHtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsZXQgdjEgPSB0cmlhbmdsZXNbaV0udjE7XG5cdFx0XHR0cmlhbmdsZXNbaV0udjEgPSB0cmlhbmdsZXNbaV0udjI7XG5cdFx0XHR0cmlhbmdsZXNbaV0udjIgPSB2MTtcblxuXHRcdFx0bGV0IGJhY2t1cFVWID0gdHJpYW5nbGVzW2ldLnRyaWFuZ2xlLnYxdXY7XG5cdFx0XHR0cmlhbmdsZXNbaV0udHJpYW5nbGUudjF1diA9IHRyaWFuZ2xlc1tpXS50cmlhbmdsZS52MnV2O1xuXHRcdFx0dHJpYW5nbGVzW2ldLnRyaWFuZ2xlLnYydXYgPSBiYWNrdXBVVjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBJbnZlcnRzIGEgbWVzaCB3aW5kaW5nIG9yZGVyIChhbmQgaXRzIGluc3RhbmNlKVxuXHQgKiBAcGFyYW0gbWVzaCBSMy5EMy5NZXNoXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBJbnZlcnRNZXNoV2luZGluZ09yZGVyKG1lc2gpIHtcblxuXHRcdG1lc2guZmFjZXMuZm9yRWFjaChcblx0XHRcdGZ1bmN0aW9uKGZhY2UpIHtcblxuXHRcdFx0XHRsZXQgdG1wVjEgPSBmYWNlLnYxO1xuXHRcdFx0XHRmYWNlLnYxID0gZmFjZS52Mjtcblx0XHRcdFx0ZmFjZS52MiA9IHRtcFYxO1xuXG5cdFx0XHRcdGxldCB0bXBWMXV2ID0gZmFjZS52MXV2O1xuXHRcdFx0XHRmYWNlLnYxdXYgPSBmYWNlLnYydXY7XG5cdFx0XHRcdGZhY2UudjJ1diA9IHRtcFYxdXY7XG5cblx0XHRcdH0uYmluZCh0aGlzKVxuXHRcdCk7XG5cblx0XHQvL21lc2guY29tcHV0ZU5vcm1hbHMgPSB0cnVlO1xuXHRcdC8vbWVzaC5jcmVhdGVJbnN0YW5jZSgpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBhIHRoZSB3aW5kaW5nIG9yZGVyIG9mIGEgbWVzaCBmcm9tIGEgcmVmZXJlbmNlIHBvaW50IFYgKHRoZSBhdmVyYWdlIGNlbnRlciBvZiB0aGUgbWVzaClcblx0ICovXG5cdHN0YXRpYyBSZXNldFdpbmRpbmdPcmRlcihmYWNlcywgdmVydGljZXMpIHtcblxuXHRcdGxldCB2ZXJ0ZXhMaXN0ID0gbmV3IFIzLkFQSS5WZWN0b3IzLlBvaW50cygpO1xuXG5cdFx0Zm9yIChsZXQgdiA9IDA7IHYgPCB2ZXJ0aWNlcy5sZW5ndGg7IHYrKykge1xuXHRcdFx0dmVydGV4TGlzdC5hZGQobmV3IFIzLkFQSS5WZWN0b3IzKFxuXHRcdFx0XHR2ZXJ0aWNlc1t2XS5wb3NpdGlvbi54LFxuXHRcdFx0XHR2ZXJ0aWNlc1t2XS5wb3NpdGlvbi55LFxuXHRcdFx0XHR2ZXJ0aWNlc1t2XS5wb3NpdGlvbi56XG5cdFx0XHQpKTtcblx0XHR9XG5cblx0XHRsZXQgViA9IHZlcnRleExpc3QuYXZlcmFnZSgpO1xuXG5cdFx0bGV0IHRyaWFuZ2xlcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgcyA9IDA7IHMgPCBmYWNlcy5sZW5ndGg7IHMgKz0gMykge1xuXG5cdFx0XHRsZXQgdjAgPSBmYWNlc1tzXTtcblx0XHRcdGxldCB2MSA9IGZhY2VzW3MrMV07XG5cdFx0XHRsZXQgdjIgPSBmYWNlc1tzKzJdO1xuXG5cdFx0XHR0cmlhbmdsZXMucHVzaChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHYwIDogdjAsXG5cdFx0XHRcdFx0djEgOiB2MSxcblx0XHRcdFx0XHR2MiA6IHYyLFxuXHRcdFx0XHRcdGVkZ2VzIDogW1xuXHRcdFx0XHRcdFx0e3YwOiB2MCwgdjE6IHYxfSxcblx0XHRcdFx0XHRcdHt2MDogdjEsIHYxOiB2Mn0sXG5cdFx0XHRcdFx0XHR7djA6IHYyLCB2MTogdjB9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR3aW5kaW5nIDogMCxcblx0XHRcdFx0XHRlZGdlSW5kZXggOiAtMSxcblx0XHRcdFx0XHRwcm9jZXNzZWQgOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdFIzLkFQSS5WZWN0b3IzLmNsb2Nrd2lzZShcblx0XHRcdFx0XHR2ZXJ0aWNlc1t0cmlhbmdsZXNbaV0udjBdLnBvc2l0aW9uLFxuXHRcdFx0XHRcdHZlcnRpY2VzW3RyaWFuZ2xlc1tpXS52MV0ucG9zaXRpb24sXG5cdFx0XHRcdFx0dmVydGljZXNbdHJpYW5nbGVzW2ldLnYyXS5wb3NpdGlvbixcblx0XHRcdFx0XHRWXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zb2xlLmxvZygnY2xvY2t3aXNlJyk7XG5cdFx0XHRcdGxldCBidjEgPSB0cmlhbmdsZXNbaV0udjE7XG5cdFx0XHRcdHRyaWFuZ2xlc1tpXS52MSA9IHRyaWFuZ2xlc1tpXS52Mjtcblx0XHRcdFx0dHJpYW5nbGVzW2ldLnYyID0gYnYxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc29sZS5sb2coJ25vdCBjbG9ja3dpc2UnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgd2luZGluZyBvcmRlciBmb3IgdHJpYW5nbGVzIGluIGZhY2VzLCBnaXZlbiBhbiBpbml0aWFsIHRyaWFuZ2xlIGFuZCBvcmllbnRhdGlvbiBlZGdlXG5cdCAqIHVzZWQgcHNldWRvY29kZSBmcm9tXG5cdCAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTcwMzY5NzAvaG93LXRvLWNvcnJlY3Qtd2luZGluZy1vZi10cmlhbmdsZXMtdG8tY291bnRlci1jbG9ja3dpc2UtZGlyZWN0aW9uLW9mLWEtM2QtbWVzaFxuXHQgKiAgV2UgbmVlZCB0byB1c2UgYSBncmFwaCB0cmF2ZXJzYWwgYWxnb3JpdGhtLFxuXHQgKiAgbGV0cyBhc3N1bWUgd2UgaGF2ZSBtZXRob2QgdGhhdCByZXR1cm5zIG5laWdoYm9yIG9mIHRyaWFuZ2xlIG9uIGdpdmVuIGVkZ2Vcblx0ICpcblx0ICogICAgICBuZWlnaGJvcl9vbl9lZ2RlKCBuZXh0X3RyaWEsIGVkZ2UgKVxuXHQgKlxuXHQgKiAgdG9fcHJvY2VzcyA9IHNldCBvZiBwYWlycyB0cmlhbmdsZSBhbmQgb3JpZW50YXRpb24gZWRnZSwgaW5pdGlhbCBzdGF0ZSBpcyBvbmUgZ29vZCBvcmllbnRlZCB0cmlhbmdsZSB3aXRoIGFueSBlZGdlIG9uIGl0XG5cdCAqICBwcm9jZXNzZWQgPSBzZXQgb2YgcHJvY2Vzc2VkIHRyaWFuZ2xlczsgaW5pdGlhbCBlbXB0eVxuXHQgKlxuXHQgKiAgd2hpbGUgdG9fcHJvY2VzcyBpcyBub3QgZW1wdHk6XG5cdCAqICAgICAgbmV4dF90cmlhLCBvcmllbnRhdGlvbl9lZGdlID0gdG9fcHJvY2Vzcy5wb3AoKVxuXHQgKiAgICAgIGFkZCBuZXh0X3RyaWEgaW4gcHJvY2Vzc2VkXG5cdCAqICAgICAgaWYgbmV4dF90cmlhIGlzIG5vdCBvcHBvc2l0ZSBvcmllbnRlZCB0aGFuIG9yaWVudGF0aW9uX2VkZ2U6XG5cdCAqICAgICAgICAgIGNoYW5nZSBuZXh0X3RyaWEgKEFCQykgb3JpZW50YXRpb24gIChCPC0+Qylcblx0ICogICAgICBmb3IgZWFjaCBlZGdlIChBQikgaW4gbmV4dF90cmlhOlxuXHQgKiAgICAgICAgICBuZWlnaGJvcl90cmlhID0gbmVpZ2hib3Jfb25fZWdkZSggbmV4dF90cmlhLCBlZGdlIClcblx0ICogICAgICAgICAgaWYgbmVpZ2hib3JfdHJpYSBleGlzdHMgYW5kIG5laWdoYm9yX3RyaWEgbm90IGluIHByb2Nlc3NlZDpcblx0ICogICAgICAgICAgICAgIHRvX3Byb2Nlc3MgYWRkIChuZWlnaGJvcl90cmlhLCBlZGdlIG9wcG9zaXRlIG9yaWVudGVkIChCQSkpXG5cdCAqIEBwYXJhbSBmYWNlcyBSMy5EMy5GYWNlW11cblx0ICogQHBhcmFtIG9yaWVudGF0aW9uRWRnZSBSMy5BUEkuVmVjdG9yMlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9XG5cdCAqL1xuXHRzdGF0aWMgRml4V2luZGluZ09yZGVyKGZhY2VzLCBvcmllbnRhdGlvbkVkZ2UpIHtcblxuXHRcdC8qKlxuXHRcdCAqIENoZWNrcyBpZiBhIEZhY2UgYmVsb25naW5nIHRvIGEgVHJpYW5nbGVFZGdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkXG5cdFx0ICogQHBhcmFtIHByb2Nlc3NlZCBUcmlhbmdsZUVkZ2VbXVxuXHRcdCAqIEBwYXJhbSB0cmlhbmdsZSBGYWNlXG5cdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gaW5Qcm9jZXNzZWQocHJvY2Vzc2VkLCB0cmlhbmdsZSkge1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkW2ldLnRyaWFuZ2xlLmVxdWFscyh0cmlhbmdsZSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyBhIG5laWdoYm91cmluZyB0cmlhbmdsZSBvbiBhIHNwZWNpZmljIGVkZ2UgLSBwcmVzZXJ2aW5nIHRoZSBlZGdlIG9yaWVudGF0aW9uXG5cdFx0ICogQHBhcmFtIGVkZ2UgUjMuQVBJLlZlY3RvcjJcblx0XHQgKiBAcGFyYW0gZmFjZXMgUjMuRDMuRmFjZVtdXG5cdFx0ICogQHBhcmFtIGN1cnJlbnRUcmlhbmdsZVxuXHRcdCAqIEByZXR1cm5zIHsqfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIG5laWdoYm91ck9uRWRnZShlZGdlLCBmYWNlcywgY3VycmVudFRyaWFuZ2xlKSB7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdChmYWNlc1tpXS52MCA9PT0gZWRnZS54ICYmIGZhY2VzW2ldLnYxID09PSBlZGdlLnkpIHx8XG5cdFx0XHRcdFx0KGZhY2VzW2ldLnYxID09PSBlZGdlLnggJiYgZmFjZXNbaV0udjIgPT09IGVkZ2UueSkgfHxcblx0XHRcdFx0XHQoZmFjZXNbaV0udjIgPT09IGVkZ2UueCAmJiBmYWNlc1tpXS52MCA9PT0gZWRnZS55KSB8fFxuXHRcdFx0XHRcdChmYWNlc1tpXS52MCA9PT0gZWRnZS55ICYmIGZhY2VzW2ldLnYxID09PSBlZGdlLngpIHx8XG5cdFx0XHRcdFx0KGZhY2VzW2ldLnYxID09PSBlZGdlLnkgJiYgZmFjZXNbaV0udjIgPT09IGVkZ2UueCkgfHxcblx0XHRcdFx0XHQoZmFjZXNbaV0udjIgPT09IGVkZ2UueSAmJiBmYWNlc1tpXS52MCA9PT0gZWRnZS54KVxuXHRcdFx0XHQpIHtcblxuXHRcdFx0XHRcdGxldCB0cmlhbmdsZSA9IG5ldyBSMy5EMy5BUEkuRmFjZShcblx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0ZmFjZXNbaV0udjBpbmRleCxcblx0XHRcdFx0XHRcdGZhY2VzW2ldLnYxaW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlc1tpXS52MmluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZXNbaV0ubWF0ZXJpYWxJbmRleCxcblx0XHRcdFx0XHRcdGZhY2VzW2ldLnV2c1xuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAodHJpYW5nbGUuZXF1YWxzKGN1cnJlbnRUcmlhbmdsZSkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBuZXcgUjMuRDMuVHJpYW5nbGVFZGdlKFxuXHRcdFx0XHRcdFx0dHJpYW5nbGUsXG5cdFx0XHRcdFx0XHRlZGdlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRsZXQgdG9Qcm9jZXNzID0gW1xuXHRcdFx0bmV3IFIzLkQzLlRyaWFuZ2xlRWRnZShcblx0XHRcdFx0bmV3IFIzLkQzLkFQSS5GYWNlKFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRmYWNlc1swXS52MGluZGV4LFxuXHRcdFx0XHRcdGZhY2VzWzBdLnYxaW5kZXgsXG5cdFx0XHRcdFx0ZmFjZXNbMF0udjJpbmRleCxcblx0XHRcdFx0XHRmYWNlc1swXS5tYXRlcmlhbEluZGV4LFxuXHRcdFx0XHRcdGZhY2VzWzBdLnV2c1xuXHRcdFx0XHQpLFxuXHRcdFx0XHRvcmllbnRhdGlvbkVkZ2Vcblx0XHRcdClcblx0XHRdO1xuXG5cdFx0bGV0IHByb2Nlc3NlZCA9IFtdO1xuXG5cdFx0d2hpbGUgKHRvUHJvY2Vzcy5sZW5ndGggPiAwKSB7XG5cblx0XHRcdGxldCB0cmlhbmdsZUVkZ2UgPSB0b1Byb2Nlc3MucG9wKCk7XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgZWRnZSBpcyB0aGUgc2FtZSBvcmllbnRhdGlvbiAoaS5lLiB0aGUgZWRnZSBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gdHJpYW5nbGUgZWRnZSkgaXQgbmVlZHMgdG8gYmUgcmV2ZXJzZWRcblx0XHRcdCAqIHRvIGhhdmUgdGhlIHNhbWUgd2luZGluZyBvcmRlcilcblx0XHRcdCAqL1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQodHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYwaW5kZXggPT09IHRyaWFuZ2xlRWRnZS5lZGdlLnggJiZcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjFpbmRleCA9PT0gdHJpYW5nbGVFZGdlLmVkZ2UueSkgfHxcblx0XHRcdFx0KHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4ID09PSB0cmlhbmdsZUVkZ2UuZWRnZS54ICYmXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYyaW5kZXggPT09IHRyaWFuZ2xlRWRnZS5lZGdlLnkpIHx8XG5cdFx0XHRcdCh0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJpbmRleCA9PT0gdHJpYW5nbGVFZGdlLmVkZ2UueCAmJlxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MGluZGV4ID09PSB0cmlhbmdsZUVkZ2UuZWRnZS55KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxldCBiYWNrdXBWID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxaW5kZXg7XG5cdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4ID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYyaW5kZXg7XG5cdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MmluZGV4ID0gYmFja3VwVjtcblxuXHRcdFx0XHQvLyBsZXQgYmFja3VwVVYgPSB0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjF1djtcblx0XHRcdFx0Ly8gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxdXYgPSB0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJ1djtcblx0XHRcdFx0Ly8gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYydXYgPSBiYWNrdXBVVjtcblx0XHRcdFx0Ly9cblx0XHRcdFx0bGV0IGJhY2t1cFVWID0gdHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnV2c1swXVsxXTtcblx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnV2c1swXVsxXSA9IHRyaWFuZ2xlRWRnZS50cmlhbmdsZS51dnNbMF1bMl07XG5cdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS51dnNbMF1bMl0gPSBiYWNrdXBVVjtcblx0XHRcdH1cblxuXHRcdFx0cHJvY2Vzc2VkLnB1c2godHJpYW5nbGVFZGdlKTtcblxuXHRcdFx0bGV0IGVkZ2VzID0gW1xuXHRcdFx0XHRuZXcgUjMuQVBJLlZlY3RvcjIoXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYwaW5kZXgsXG5cdFx0XHRcdFx0dHJpYW5nbGVFZGdlLnRyaWFuZ2xlLnYxaW5kZXhcblx0XHRcdFx0KSxcblx0XHRcdFx0bmV3IFIzLkFQSS5WZWN0b3IyKFxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MWluZGV4LFxuXHRcdFx0XHRcdHRyaWFuZ2xlRWRnZS50cmlhbmdsZS52MmluZGV4XG5cdFx0XHRcdCksXG5cdFx0XHRcdG5ldyBSMy5BUEkuVmVjdG9yMihcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjJpbmRleCxcblx0XHRcdFx0XHR0cmlhbmdsZUVkZ2UudHJpYW5nbGUudjBpbmRleFxuXHRcdFx0XHQpXG5cdFx0XHRdO1xuXG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGxldCBuZWlnaGJvdXIgPSBuZWlnaGJvdXJPbkVkZ2UoZWRnZXNbal0sIGZhY2VzLCB0cmlhbmdsZUVkZ2UudHJpYW5nbGUpO1xuXHRcdFx0XHRpZiAobmVpZ2hib3VyICYmICFpblByb2Nlc3NlZChwcm9jZXNzZWQsIG5laWdoYm91ci50cmlhbmdsZSkpIHtcblx0XHRcdFx0XHR0b1Byb2Nlc3MucHVzaChuZWlnaGJvdXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogSW4gcHJvY2Vzc2VkIC0gd2Ugd2lsbCBoYXZlIHNvbWUgZHVwbGljYXRlcyAtIG9ubHkgYWRkIHRoZSB1bmlxdWUgb25lc1xuXHRcdCAqIEB0eXBlIHtBcnJheX1cblx0XHQgKi9cblx0XHRsZXQgdHJpYW5nbGVzID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0Zm9yIChsZXQgayA9IDA7IGsgPCB0cmlhbmdsZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0aWYgKHRyaWFuZ2xlc1trXS5lcXVhbHMocHJvY2Vzc2VkW2ldLnRyaWFuZ2xlKSl7XG5cdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdHRyaWFuZ2xlcy5wdXNoKHByb2Nlc3NlZFtpXS50cmlhbmdsZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlcztcblx0fTtcblxuXHQvKipcblx0ICogVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZ1bmN0aW9uIHRvIGZpeCBwb2x5cyB3aGljaCBkb24ndCB0cmlhbmd1bGF0ZSBiZWNhdXNlXG5cdCAqIHRoZXkgY291bGQgbGllIG9uIFotcGxhbmUgKFhaIG9yIFlaKSkgLSB3ZSB0cmFuc2xhdGUgdGhlIHBvbHkgdG8gdGhlIG9yaWdpbiwgc3lzdGVtYXRpY2FsbHkgcm90YXRlIHRoZSBwb2x5IGFyb3VuZFxuXHQgKiBaIHRoZW4gWSBheGlzXG5cdCAqIEBwYXJhbSB2ZXJ0aWNlc0ZsYXQgW11cblx0ICogQHBhcmFtIGdyYWluIGlzIHRoZSBhbW91bnQgdG8gc3lzdGVtYXRpY2FsbHkgcm90YXRlIHRoZSBwb2x5IGJ5IC0gYSBmaW5lciBncmFpbiBtZWFucyBhIG1vcmUgYWNjdXJhdGUgbWF4aW11bSBYWVxuXHQgKiBAcmV0dXJuIFtdXG5cdCAqL1xuXHRzdGF0aWMgRml4UG9seVpQbGFuZSh2ZXJ0aWNlc0ZsYXQsIGdyYWluKSB7XG5cblx0XHRpZiAoKHZlcnRpY2VzRmxhdC5sZW5ndGggJSAzKSAhPT0gMCAmJiAhKHZlcnRpY2VzRmxhdC5sZW5ndGggPiA5KSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJUaGUgdmVydGljZXMgYXJlIG5vdCBpbiB0aGUgcmlnaHQgbGVuZ3RoIDogXCIgKyB2ZXJ0aWNlc0ZsYXQubGVuZ3RoKTtcblx0XHR9XG5cblx0XHRsZXQgdmVydGljZXMgPSBbXTtcblxuXHRcdGxldCBwb2ludHMgPSBuZXcgUjMuQVBJLlF1YXRlcm5pb24uUG9pbnRzKCk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzRmxhdC5sZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0cG9pbnRzLmFkZChuZXcgUjMuQVBJLlZlY3RvcjMoXG5cdFx0XHRcdHZlcnRpY2VzRmxhdFtpXSxcblx0XHRcdFx0dmVydGljZXNGbGF0W2kgKyAxXSxcblx0XHRcdFx0dmVydGljZXNGbGF0W2kgKyAyXVxuXHRcdFx0KSk7XG5cdFx0fVxuXG5cdFx0cG9pbnRzLnRvT3JpZ2luKCk7XG5cblx0XHRwb2ludHMubWF4aW1pemVYRGlzdGFuY2UoZ3JhaW4pO1xuXG5cdFx0cG9pbnRzLm1heGltaXplWURpc3RhbmNlKGdyYWluKTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHMudmVjdG9ycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmVydGljZXMucHVzaChcblx0XHRcdFx0W1xuXHRcdFx0XHRcdHBvaW50cy52ZWN0b3JzW2ldLngsXG5cdFx0XHRcdFx0cG9pbnRzLnZlY3RvcnNbaV0ueVxuXHRcdFx0XHRdXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2ZXJ0aWNlcztcblx0fTtcblxuXHRzdGF0aWMgTW92aW5nQXZlcmFnZShwZXJpb2QpIHtcblx0XHRsZXQgbnVtcyA9IFtdO1xuXHRcdHJldHVybiBmdW5jdGlvbihudW0pIHtcblx0XHRcdG51bXMucHVzaChudW0pO1xuXHRcdFx0aWYgKG51bXMubGVuZ3RoID4gcGVyaW9kKVxuXHRcdFx0XHRudW1zLnNwbGljZSgwLDEpOyAgLy8gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheVxuXHRcdFx0bGV0IHN1bSA9IDA7XG5cdFx0XHRmb3IgKGxldCBpIGluIG51bXMpXG5cdFx0XHRcdHN1bSArPSBudW1zW2ldO1xuXHRcdFx0bGV0IG4gPSBwZXJpb2Q7XG5cdFx0XHRpZiAobnVtcy5sZW5ndGggPCBwZXJpb2QpXG5cdFx0XHRcdG4gPSBudW1zLmxlbmd0aDtcblx0XHRcdHJldHVybihzdW0vbik7XG5cdFx0fVxuXHR9O1xuXG5cdHN0YXRpYyBJbnRlcnNlY3QoYSwgYikge1xuXG5cdFx0bGV0IHQ7XG5cblx0XHQvKipcblx0XHQgKiBMb29wIG92ZXIgc2hvcnRlc3QgYXJyYXlcblx0XHQgKi9cblx0XHRpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkge1xuXHRcdFx0dCA9IGI7XG5cdFx0XHRiID0gYTtcblx0XHRcdGEgPSB0O1xuXHRcdH1cblxuXHRcdHJldHVybiBhLmZpbHRlcihcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2hlY2sgaWYgZXhpc3RzXG5cdFx0XHQgKiBAcGFyYW0gZVxuXHRcdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIChiLmluZGV4T2YoZSkgPiAtMSk7XG5cdFx0XHR9XG5cdFx0KS5maWx0ZXIoXG5cdFx0XHQvKipcblx0XHRcdCAqIFJlbW92ZSBEdXBsaWNhdGVzXG5cdFx0XHQgKiBAcGFyYW0gZVxuXHRcdFx0ICogQHBhcmFtIGlcblx0XHRcdCAqIEBwYXJhbSBjXG5cdFx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24oZSwgaSwgYykge1xuXHRcdFx0XHRyZXR1cm4gYy5pbmRleE9mKGUpID09PSBpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIERpZmZlcmVuY2UoYSwgYikge1xuXG5cdFx0bGV0IHQ7XG5cblx0XHQvKipcblx0XHQgKiBMb29wIG92ZXIgc2hvcnRlc3QgYXJyYXlcblx0XHQgKi9cblx0XHRpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkge1xuXHRcdFx0dCA9IGI7XG5cdFx0XHRiID0gYTtcblx0XHRcdGEgPSB0O1xuXHRcdH1cblxuXHRcdHJldHVybiBhLmZpbHRlcihcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2hlY2sgaWYgZXhpc3RzXG5cdFx0XHQgKiBAcGFyYW0gZVxuXHRcdFx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0cmV0dXJuIChiLmluZGV4T2YoZSkgPT09IC0xKTtcblx0XHRcdH1cblx0XHQpLmZpbHRlcihcblx0XHRcdC8qKlxuXHRcdFx0ICogUmVtb3ZlIER1cGxpY2F0ZXNcblx0XHRcdCAqIEBwYXJhbSBlXG5cdFx0XHQgKiBAcGFyYW0gaVxuXHRcdFx0ICogQHBhcmFtIGNcblx0XHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbihlLCBpLCBjKSB7XG5cdFx0XHRcdHJldHVybiBjLmluZGV4T2YoZSkgPT09IGk7XG5cdFx0XHR9XG5cdFx0KTtcblx0fTtcblxuXHQvKipcblx0ICogUHVzaCBvbmx5IGlmIG5vdCBpbiB0aGVyZSBhbHJlYWR5XG5cdCAqIEBwYXJhbSBhcnJheVxuXHQgKiBAcGFyYW0gb2JqZWN0XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIFB1c2hVbmlxdWUoYXJyYXksIG9iamVjdCkge1xuXG5cdFx0aWYgKGFycmF5LmluZGV4T2Yob2JqZWN0KSA9PT0gLTEpIHtcblx0XHRcdGFycmF5LnB1c2gob2JqZWN0KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgb2JqZWN0IGlzIGVtcHR5XG5cdCAqIEBwYXJhbSBvYmpcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIElzRW1wdHkob2JqKSB7XG5cdFx0cmV0dXJuIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMCAmJiBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdCk7XG5cdH07XG5cblx0c3RhdGljIElzU3RyaW5nKG1lbWJlcikge1xuXHRcdHJldHVybiAodHlwZW9mIG1lbWJlciA9PT0gJ3N0cmluZycpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc0Jvb2xlYW4obWVtYmVyKSB7XG5cdFx0cmV0dXJuIChtZW1iZXIgPT09IHRydWUgfHwgbWVtYmVyID09PSBmYWxzZSk7XG5cdH07XG5cblx0c3RhdGljIElzQ29sb3IobWVtYmVyKSB7XG5cdFx0cmV0dXJuIChtZW1iZXIgaW5zdGFuY2VvZiBSMy5Db2xvcik7XG5cdH07XG5cblx0c3RhdGljIElzTnVtYmVyKG1lbWJlcikge1xuXHRcdHJldHVybiAodHlwZW9mIG1lbWJlciA9PT0gJ251bWJlcicpO1xuXHR9O1xuXG5cdHN0YXRpYyBJc1ZlY3RvcjIobWVtYmVyKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLkFQSS5WZWN0b3IyIHx8XG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5WZWN0b3IyXG5cdFx0KTtcblx0fTtcblxuXHRzdGF0aWMgSXNWZWN0b3IzKG1lbWJlcikge1xuXHRcdHJldHVybiAoXG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5BUEkuVmVjdG9yMyB8fFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuVmVjdG9yM1xuXHRcdCk7XG5cdH07XG5cblx0c3RhdGljIElzVmVjdG9yNChtZW1iZXIpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0bWVtYmVyIGluc3RhbmNlb2YgUjMuQVBJLlZlY3RvcjQgfHxcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLlZlY3RvcjQgfHxcblx0XHRcdG1lbWJlciBpbnN0YW5jZW9mIFIzLkFQSS5RdWF0ZXJuaW9uIHx8XG5cdFx0XHRtZW1iZXIgaW5zdGFuY2VvZiBSMy5RdWF0ZXJuaW9uXG5cdFx0KTtcblx0fTtcblxuXHRzdGF0aWMgSXNPYmplY3QobWVtYmVyKSB7XG5cdFx0bGV0IHR5cGUgPSB0eXBlb2YgbWVtYmVyO1xuXHRcdHJldHVybiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09ICdvYmplY3QnICYmICEhbWVtYmVyO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgTG93ZXJVbmRlcnNjb3JlKG5hbWUpIHtcblx0XHRsZXQgc3RyaW5nID0gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJ18nKTtcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvLS9nLCAnXycpO1xuXHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXF8rL2csICdfJyk7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblxuXHRzdGF0aWMgVXBwZXJDYXNlV29yZHNTcGFjZXMoaW5wdXQpIHtcblxuXHRcdGxldCB3b3JkID0gaW5wdXQucmVwbGFjZSgvWy1fXS9nLCAnICcpO1xuXG5cdFx0d29yZCA9IHdvcmQucmVwbGFjZSgvXFxzKy8sICcgJyk7XG5cblx0XHRsZXQgd29yZHMgPSB3b3JkLnNwbGl0KCcgJyk7XG5cblx0XHRyZXR1cm4gd29yZHMucmVkdWNlKFxuXHRcdFx0ZnVuY3Rpb24ocmVzdWx0LCB3b3JkKSB7XG5cdFx0XHRcdHJlc3VsdCArPSB3b3JkWzBdLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnN1YnN0cigxKTtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdCArICcgJztcblx0XHRcdH0sXG5cdFx0XHQnJ1xuXHRcdCkudHJpbSgpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgVXBwZXJDYXNlVW5kZXJzY29yZSh3b3JkKSB7XG5cblx0XHRsZXQgc3RyID0gJyc7XG5cblx0XHR3b3JkLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24obGV0dGVyKXtcblx0XHRcdGlmIChsZXR0ZXIgPT0gbGV0dGVyLnRvVXBwZXJDYXNlKCkpIHtcblx0XHRcdFx0c3RyICs9ICdfJyArIGxldHRlcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0ciArPSBsZXR0ZXIudG9VcHBlckNhc2UoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHN0ciA9IHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoJ15fJyksJycpO1xuXG5cdFx0cmV0dXJuIHN0cjtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyBMZWZ0IFBhZGRlZCBUZXh0IC0gZXguIGxlbmd0aCA1LCBwYWRjaGFyIDAsIHN0cmluZyBhYmMgPSAnMDBhYmMnXG5cdCAqIEBwYXJhbSBsZW5ndGhcblx0ICogQHBhcmFtIHBhZENoYXJcblx0ICogQHBhcmFtIHN0cmluZ1xuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHN0YXRpYyBQYWRkZWRUZXh0KGxlbmd0aCwgcGFkQ2hhciwgc3RyaW5nKSB7XG5cblx0XHRsZXQgcGFkID0gXCJcIjtcblxuXHRcdGZvciAobGV0IHggPSAwOyB4IDwgbGVuZ3RoOyB4KyspIHtcblx0XHRcdHBhZCArPSBwYWRDaGFyO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYWQuc3Vic3RyaW5nKDAsIHBhZC5sZW5ndGggLSBzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBVdGlsczsiLCJjb25zdCB7U3lzdGVtLCBTeXN0ZW1MaW5raW5nLCBTeXN0ZW1Tb2NrZXR9ID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0nKTtcbmNvbnN0IFIzT2JqZWN0ID0gcmVxdWlyZSgnLi9yMy1yMy1vYmplY3QnKTtcblxuY2xhc3MgUjMge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHR9XG5cblx0c3RhdGljIHZlcnNpb24oKSB7XG5cdFx0cmV0dXJuICdfX0RBVEVfXyc7XG5cdH1cblxufVxuXG5SMy5SM09iamVjdCBcdFx0PSBSM09iamVjdDtcblIzLlN5c3RlbSBcdFx0XHQ9IFN5c3RlbTtcblIzLlN5c3RlbS5MaW5raW5nXHQ9IFN5c3RlbUxpbmtpbmc7XG5SMy5TeXN0ZW0uU29ja2V0XHQ9IFN5c3RlbVNvY2tldDtcblxubW9kdWxlLmV4cG9ydHMgPSBSMztcbiJdLCJzb3VyY2VSb290IjoiIn0=