diff --git a/CHANGELOG.md b/CHANGELOG.md
index ba8905a..6c0f432 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,10 @@
## Changelog
-#### 2018-05-21
+#### 2018-06-02
+* Hotfix for HA 0.71+
+* Restore handling custom attributes in form and more-info.
+
+#### 2018-05-28
* New feature: [`control_element`](docs/features.md#custom-controls)
* Fix theming on Firefix/Edge.
diff --git a/README.md b/README.md
index fb61e88..f1e8645 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,8 @@ TODO: Add screenshots
## Notes
-**CustomUI 2018-05-21 required for HA 0.70+**
+**CustomUI 2018-06-02 required for HA 0.71+**
+**CustomUI 2018-05-21 required for HA 0.70**
Please fill the [usage poll](https://docs.google.com/forms/d/e/1FAIpQLSdjgb4iu5aDyvFB6ch9KJpRn25I0wLL7NLyTIhcWCzU3KM1-w/viewform?usp=send_form)
@@ -22,7 +23,11 @@ Please ask questions and post feature requests in the [forum](https://community.
## Changelog
-#### 2018-05-21
+#### 2018-06-02
+* Hotfix for HA 0.71+
+* Restore handling custom attributes in form and more-info.
+
+#### 2018-05-28
* New feature: [`control_element`](docs/features.md#custom-controls)
* Fix theming on Firefix/Edge.
diff --git a/scripts-dbg-es5.js b/scripts-dbg-es5.js
index 9dcf7c5..885be3c 100644
--- a/scripts-dbg-es5.js
+++ b/scripts-dbg-es5.js
@@ -417,6 +417,81 @@ function stateCardType(hass, stateObj) {
/***/ }),
+/***/ "../home-assistant-polymer/src/util/hass-attributes-util.js":
+/*!******************************************************************!*\
+ !*** ../home-assistant-polymer/src/util/hass-attributes-util.js ***!
+ \******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var hassAttributeUtil = {};
+
+hassAttributeUtil.DOMAIN_DEVICE_CLASS = {
+ binary_sensor: ['battery', 'cold', 'connectivity', 'door', 'garage_door', 'gas', 'heat', 'light', 'lock', 'moisture', 'motion', 'moving', 'occupancy', 'opening', 'plug', 'power', 'presence', 'problem', 'safety', 'smoke', 'sound', 'vibration', 'window'],
+ cover: ['garage'],
+ sensor: ['battery', 'humidity', 'illuminance', 'temperature']
+};
+
+hassAttributeUtil.UNKNOWN_TYPE = 'json';
+hassAttributeUtil.ADD_TYPE = 'key-value';
+
+hassAttributeUtil.TYPE_TO_TAG = {
+ string: 'ha-customize-string',
+ json: 'ha-customize-string',
+ icon: 'ha-customize-icon',
+ boolean: 'ha-customize-boolean',
+ array: 'ha-customize-array',
+ 'key-value': 'ha-customize-key-value'
+};
+
+// Attributes here serve dual purpose:
+// 1) Any key of this object won't be shown in more-info window.
+// 2) Any key which has value other than undefined will appear in customization
+// config according to its value.
+hassAttributeUtil.LOGIC_STATE_ATTRIBUTES = hassAttributeUtil.LOGIC_STATE_ATTRIBUTES || {
+ entity_picture: undefined,
+ friendly_name: { type: 'string', description: 'Name' },
+ icon: { type: 'icon' },
+ emulated_hue: {
+ type: 'boolean',
+ domains: ['emulated_hue']
+ },
+ emulated_hue_name: {
+ type: 'string',
+ domains: ['emulated_hue']
+ },
+ haaska_hidden: undefined,
+ haaska_name: undefined,
+ homebridge_hidden: { type: 'boolean' },
+ homebridge_name: { type: 'string' },
+ supported_features: undefined,
+ attribution: undefined,
+ custom_ui_more_info: { type: 'string' },
+ custom_ui_state_card: { type: 'string' },
+ device_class: {
+ type: 'array',
+ options: hassAttributeUtil.DOMAIN_DEVICE_CLASS,
+ description: 'Device class',
+ domains: ['binary_sensor', 'cover', 'sensor']
+ },
+ hidden: { type: 'boolean', description: 'Hide from UI' },
+ assumed_state: {
+ type: 'boolean',
+ domains: ['switch', 'light', 'cover', 'climate', 'fan', 'group']
+ },
+ initial_state: {
+ type: 'string',
+ domains: ['automation']
+ },
+ unit_of_measurement: { type: 'string' }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (hassAttributeUtil);
+
+/***/ }),
+
/***/ "./node_modules/@polymer/polymer/lib/utils/boot.js":
/*!*********************************************************!*\
!*** ./node_modules/@polymer/polymer/lib/utils/boot.js ***!
@@ -1500,7 +1575,7 @@ var _createClass = function () { function defineProperties(target, props) { for
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
-var _templateObject = _taggedTemplateLiteral(['\n \n \n\n
\n
\n
\n \n [[item]]
\n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n
\n '], ['\n \n \n\n \n
\n
\n \n [[item]]
\n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n
\n ']);
+var _templateObject = _taggedTemplateLiteral(['\n \n \n\n \n
\n
\n \n [[item]]
\n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n
\n '], ['\n \n \n\n \n
\n
\n \n [[item]]
\n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n
\n ']);
function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
@@ -1777,7 +1852,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _dynamic_with_extra_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dynamic-with-extra.js */ "./src/elements/dynamic-with-extra.js");
var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-var _templateObject = _taggedTemplateLiteral(['\n \n \n\n \n
\n \n [[item]]
\n \n \n
\n \n
\n '], ['\n \n \n\n \n
\n \n [[item]]
\n \n \n
\n \n
\n ']);
+var _templateObject = _taggedTemplateLiteral(['\n \n \n\n \n
\n \n [[item]]
\n \n \n
\n \n
\n '], ['\n \n \n\n \n
\n \n [[item]]
\n \n \n
\n \n
\n ']);
function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
@@ -1934,6 +2009,54 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
/***/ }),
+/***/ "./src/utils/hass-attribute-util.js":
+/*!******************************************!*\
+ !*** ./src/utils/hass-attribute-util.js ***!
+ \******************************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _home_assistant_polymer_src_util_hass_attributes_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../home-assistant-polymer/src/util/hass-attributes-util.js */ "../home-assistant-polymer/src/util/hass-attributes-util.js");
+
+
+window.hassAttributeUtil = window.hassAttributeUtil || {};
+var SUPPORTED_SLIDER_MODES = ['single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider'];
+
+var customUiAttributes = {
+ group: undefined,
+ device: undefined,
+ templates: undefined,
+ control_element: { type: 'string' },
+ state_card_mode: {
+ type: 'array',
+ options: {
+ light: SUPPORTED_SLIDER_MODES.concat('badges'),
+ cover: SUPPORTED_SLIDER_MODES.concat('badges'),
+ climate: SUPPORTED_SLIDER_MODES.concat('badges'),
+ '*': ['badges']
+ }
+ },
+ state_card_custom_ui_secondary: { type: 'string' },
+ badges_list: { type: 'json' },
+ show_last_changed: { type: 'boolean' },
+ hide_control: { type: 'boolean' },
+ extra_data_template: { type: 'string' },
+ extra_badge: { type: 'json' },
+ stretch_slider: { type: 'boolean' },
+ slider_theme: { type: 'json' },
+ theme: { type: 'string' },
+ confirm_controls: { type: 'boolean' },
+ confirm_controls_show_lock: { type: 'boolean' },
+ hide_in_default_view: { type: 'boolean' }
+};
+window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES = _home_assistant_polymer_src_util_hass_attributes_util_js__WEBPACK_IMPORTED_MODULE_0__["default"].LOGIC_STATE_ATTRIBUTES;
+window.hassAttributeUtil.UNKNOWN_TYPE = _home_assistant_polymer_src_util_hass_attributes_util_js__WEBPACK_IMPORTED_MODULE_0__["default"].UNKNOWN_TYPE;
+Object.assign(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, customUiAttributes);
+
+/***/ }),
+
/***/ "./src/utils/hooks.js":
/*!****************************!*\
!*** ./src/utils/hooks.js ***!
@@ -1948,6 +2071,8 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _home_assistant_polymer_src_common_entity_get_view_entities_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../home-assistant-polymer/src/common/entity/get_view_entities.js */ "../home-assistant-polymer/src/common/entity/get_view_entities.js");
/* harmony import */ var _elements_ha_config_custom_ui_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../elements/ha-config-custom-ui.js */ "./src/elements/ha-config-custom-ui.js");
/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./version.js */ "./src/utils/version.js");
+/* harmony import */ var _hass_attribute_util_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hass-attribute-util.js */ "./src/utils/hass-attribute-util.js");
+
@@ -2189,7 +2314,6 @@ window.customUI = window.customUI || {
window.customUI.controlColumns(customizer.attributes.columns);
}
if (customizer.attributes.hide_attributes) {
- // TODO: Won't working starting from HA 0.71
if (window.hassAttributeUtil && window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {
customizer.attributes.hide_attributes.forEach(function (attr) {
if (!Object.prototype.hasOwnProperty.call(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, attr)) {
@@ -2199,42 +2323,6 @@ window.customUI = window.customUI || {
}
}
},
- updateAttributes: function updateAttributes() {
- if (!window.hassAttributeUtil) {
- // App.js wasn't parsed yet.
- window.setTimeout(window.customUI.updateAttributes, 1000);
- return;
- }
-
- var customUiAttributes = {
- group: undefined,
- device: undefined,
- templates: undefined,
- state_card_mode: {
- type: 'array',
- options: {
- light: window.customUI.SUPPORTED_SLIDER_MODES.concat('badges'),
- cover: window.customUI.SUPPORTED_SLIDER_MODES.concat('badges'),
- '*': ['badges']
- }
- },
- state_card_custom_ui_secondary: { type: 'string' },
- badges_list: { type: 'json' },
- show_last_changed: { type: 'boolean' },
- hide_control: { type: 'boolean' },
- extra_data_template: { type: 'string' },
- extra_badge: { type: 'json' },
- stretch_slider: { type: 'boolean' },
- slider_theme: { type: 'json' },
- theme: { type: 'string' },
- confirm_controls: { type: 'boolean' },
- confirm_controls_show_lock: { type: 'boolean' },
- hide_in_default_view: { type: 'boolean' }
- };
- if (window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {
- Object.assign(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, customUiAttributes);
- }
- },
updateConfigPanel: function updateConfigPanel() {
if (!window.location.pathname.startsWith('/config')) return;
var haPanelConfig = window.customUI.getElementHierarchy(document, ['home-assistant', 'home-assistant-main', 'partial-panel-resolver', 'ha-panel-config']);
@@ -2415,6 +2503,46 @@ window.customUI = window.customUI || {
}
};
},
+ installHaAttributes: function installHaAttributes() {
+ var haAttributes = customElements.get('ha-attributes');
+ if (!haAttributes || !haAttributes.prototype.computeFiltersArray || !window.hassAttributeUtil) return;
+ // Use named function to preserve 'this'.
+ haAttributes.prototype.computeFiltersArray = function customComputeFiltersArray(extraFilters) {
+ return Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES).concat(extraFilters ? extraFilters.split(',') : []);
+ };
+ },
+ installHaFormCustomize: function installHaFormCustomize() {
+ if (!window.location.pathname.startsWith('/config')) return;
+ var haFormCustomize = customElements.get('ha-form-customize');
+ if (!haFormCustomize) {
+ // DOM not ready. Wait 100ms.
+ window.setTimeout(window.customUI.installHaFormCustomize, 100);
+ return;
+ }
+ if (window.customUI.haFormCustomizeInitDone) return;
+ window.customUI.haFormCustomizeInitDone = true;
+
+ if (!window.hassAttributeUtil) return;
+ if (haFormCustomize.prototype._computeSingleAttribute) {
+ // Use named function to preserve 'this'.
+ haFormCustomize.prototype._computeSingleAttribute = function customComputeSingleAttribute(key, value, secondary) {
+ var config = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key] || { type: window.hassAttributeUtil.UNKNOWN_TYPE };
+ return this._initOpenObject(key, config.type === 'json' ? JSON.stringify(value) : value, secondary, config);
+ };
+ }
+ if (haFormCustomize.prototype.getNewAttributesOptions) {
+ // Use named function to preserve 'this'.
+ haFormCustomize.prototype.getNewAttributesOptions = function customgetNewAttributesOptions(localAttributes, globalAttributes, existingAttributes, newAttributes) {
+ var _this2 = this;
+
+ var knownKeys = Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES).filter(function (key) {
+ var conf = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key];
+ return conf && (!conf.domains || !_this2.entity || conf.domains.includes(Object(_home_assistant_polymer_src_common_entity_compute_state_domain_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_this2.entity)));
+ }).filter(this.filterFromAttributes(localAttributes)).filter(this.filterFromAttributes(globalAttributes)).filter(this.filterFromAttributes(existingAttributes)).filter(this.filterFromAttributes(newAttributes));
+ return knownKeys.sort().concat('Other');
+ };
+ }
+ },
installClassHooks: function installClassHooks() {
if (window.customUI.classInitDone) return;
window.customUI.classInitDone = true;
@@ -2422,10 +2550,9 @@ window.customUI = window.customUI || {
window.customUI.installStatesHook();
window.customUI.installHaStateLabelBadge();
window.customUI.installStateBadge();
+ window.customUI.installHaAttributes();
window.customUI.installActionName('state-card-scene');
window.customUI.installActionName('state-card-script');
- // TODO: Fix, not working since HA 0.71
- window.customUI.updateAttributes();
},
init: function init() {
if (window.customUI.initDone) return;
@@ -2457,6 +2584,7 @@ window.customUI = window.customUI || {
runHooks: function runHooks() {
window.customUI.fixGroupTitles();
window.customUI.updateConfigPanel();
+ window.customUI.installHaFormCustomize();
},
getName: function getName() {
return window.localStorage.getItem('ha-device-name') || '';
@@ -2495,9 +2623,9 @@ window.customUI.init();
"use strict";
__webpack_require__.r(__webpack_exports__);
-/* harmony default export */ __webpack_exports__["default"] = ('20180528');
+/* harmony default export */ __webpack_exports__["default"] = ('20180602');
/***/ })
/******/ });
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9jb25zdC5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9hcHBseV90aGVtZXNfb25fZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9keW5hbWljX2NvbnRlbnRfdXBkYXRlci5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jYW5fdG9nZ2xlX2RvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jYW5fdG9nZ2xlX3N0YXRlLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfZG9tYWluLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2dldF9ncm91cF9lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9nZXRfdmlld19lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9zdGF0ZV9jYXJkX3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2Jvb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzIiwid2VicGFjazovLy8uL3NyYy9lbGVtZW50cy9jdWktYmFzZS1lbGVtZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9lbGVtZW50cy9keW5hbWljLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL2R5bmFtaWMtd2l0aC1leHRyYS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvaGEtY29uZmlnLWN1c3RvbS11aS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvaGEtdGhlbWVkLXNsaWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvc3RhdGUtY2FyZC1jdXN0b20tdWkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL3N0YXRlLWNhcmQtd2l0aC1zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL3N0YXRlLWNhcmQtd2l0aG91dC1zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21peGlucy9ldmVudHMtbWl4aW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2hvb2tzLmpzIiwid2VicGFjazovLy8uL3NyYy91dGlscy92ZXJzaW9uLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfRE9NQUlOX0lDT04iLCJET01BSU5TX1dJVEhfQ0FSRCIsIkRPTUFJTlNfTU9SRV9JTkZPX05PX0hJU1RPUlkiLCJTVEFURVNfT0ZGIiwiVU5JVF9DIiwiVU5JVF9GIiwiREVGQVVMVF9WSUVXX0VOVElUWV9JRCIsImFwcGx5VGhlbWVzT25FbGVtZW50IiwiZWxlbWVudCIsInRoZW1lcyIsImxvY2FsVGhlbWUiLCJ1cGRhdGVNZXRhIiwiX3RoZW1lcyIsInRoZW1lTmFtZSIsImRlZmF1bHRfdGhlbWUiLCJzdHlsZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJ0aGVtZSIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwicHJlZml4ZWRLZXkiLCJ1cGRhdGVTdHlsZXMiLCJ3aW5kb3ciLCJTaGFkeUNTUyIsInN0eWxlU3VidHJlZSIsIm1ldGEiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJoYXNBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJ0aGVtZUNvbG9yIiwiZHluYW1pY0NvbnRlbnRVcGRhdGVyIiwicm9vdCIsIm5ld0VsZW1lbnRUYWciLCJhdHRyaWJ1dGVzIiwicm9vdEVsIiwiY3VzdG9tRWwiLCJsYXN0Q2hpbGQiLCJ0YWdOYW1lIiwicmVtb3ZlQ2hpbGQiLCJjcmVhdGVFbGVtZW50IiwidG9Mb3dlckNhc2UiLCJzZXRQcm9wZXJ0aWVzIiwicGFyZW50Tm9kZSIsImFwcGVuZENoaWxkIiwiY2FuVG9nZ2xlRG9tYWluIiwiaGFzcyIsImRvbWFpbiIsInNlcnZpY2VzIiwiY29uZmlnIiwiY2FuVG9nZ2xlU3RhdGUiLCJzdGF0ZU9iaiIsImNvbXB1dGVTdGF0ZURvbWFpbiIsInN0YXRlIiwic3VwcG9ydGVkX2ZlYXR1cmVzIiwiY29tcHV0ZURvbWFpbiIsImVudGl0eUlkIiwic3Vic3RyIiwiaW5kZXhPZiIsIl9kb21haW4iLCJlbnRpdHlfaWQiLCJnZXRHcm91cEVudGl0aWVzIiwiZW50aXRpZXMiLCJncm91cCIsInJlc3VsdCIsImVudGl0eSIsImdldFZpZXdFbnRpdGllcyIsInZpZXciLCJ2aWV3RW50aXRpZXMiLCJoaWRkZW4iLCJncm91cEVudGl0aWVzIiwiZ3JFbnRpdHlJZCIsImdyRW50aXR5Iiwic3RhdGVDYXJkVHlwZSIsImluY2x1ZGVzIiwiY29udHJvbCIsIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCJwcm9wIiwiTGl0ZXJhbFN0cmluZyIsInN0cmluZyIsInZhbHVlIiwidG9TdHJpbmciLCJsaXRlcmFsVmFsdWUiLCJFcnJvciIsImh0bWxWYWx1ZSIsIkhUTUxUZW1wbGF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJodG1sIiwic3RyaW5ncyIsInRlbXBsYXRlIiwidmFsdWVzIiwicmVkdWNlIiwiYWNjIiwidiIsImlkeCIsImh0bWxMaXRlcmFsIiwiQ3VpQmFzZUVsZW1lbnQiLCJleHRyYXMiLCJleHRyYV9kYXRhX3RlbXBsYXRlIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiY3VzdG9tVUkiLCJjb21wdXRlVGVtcGxhdGUiLCJleHRyYSIsInN0YXRlcyIsInVuZGVmaW5lZCIsImZpbHRlciIsImluRGlhbG9nIiwibGVuZ3RoIiwic2hvd19sYXN0X2NoYW5nZWQiLCJ0eXBlIiwiQm9vbGVhbiIsImNvbnRyb2xFbGVtZW50IiwiU3RyaW5nIiwiY29tcHV0ZWQiLCJQb2x5bWVyIiwiRWxlbWVudCIsIkR5bmFtaWNFbGVtZW50IiwiZWxlbWVudE5hbWUiLCJ0b1VwcGVyQ2FzZSIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIiwiRHluYW1pY1dpdGhFeHRyYSIsIl9hdHRhY2hlZCIsIl9pc0F0dGFjaGVkIiwiYXR0YWNoZWQiLCJleHRyYV9iYWRnZSIsImV4dHJhQmFkZ2VzIiwiZXh0cmFCYWRnZSIsIm1heWJlQ2hhbmdlT2JqZWN0IiwiYXR0cmlidXRlIiwidW5pdF9vZl9tZWFzdXJlbWVudCIsInVuaXQiLCJibGFja2xpc3QiLCJibGFja2xpc3Rfc3RhdGVzIiwic29tZSIsIlJlZ0V4cCIsInRlc3QiLCJfZW50aXR5RGlzcGxheSIsImV4dHJhT2JqIiwiZXh0cmFPYmpWaXNpYmxlIiwiaGlkZV9jb250cm9sIiwiaGFMb2NhbGl6ZSIsImxvY2FsaXplIiwiY29uZmlybV9jb250cm9scyIsImNvbmZpcm1fY29udHJvbHNfc2hvd19sb2NrIiwiZSIsInN0eWxlIiwicG9pbnRlckV2ZW50cyIsImxvY2siLCJpY29uIiwib3BhY2l0eSIsInNldFRpbWVvdXQiLCJzdG9wUHJvcGFnYXRpb24iLCJxdWVyeVNlbGVjdG9yQWxsIiwiZWxlbSIsImFwcGx5VGhlbWVzIiwiZ2V0IiwiSGFDb25maWdDdXN0b21VaSIsIm5hbWUiLCJnZXROYW1lIiwic2V0TmFtZSIsImhpc3RvcnkiLCJiYWNrIiwiZmlyZSIsImlzV2lkZSIsIm9ic2VydmVyIiwiRXZlbnRzTWl4aW4iLCJIYVRoZW1lZFNsaWRlciIsImRpc2FibGVPZmZXaGVuTWluIiwiX2NvbXB1dGVBdHRyaWJ1dGUiLCJjb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwiZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwiX2VuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCIsImF0dHIiLCJkZWYiLCJpc09uIiwidGhlbWVkTWluIiwiZXYiLCJ0YXJnZXQiLCJtaW4iLCJOdW1iZXIiLCJtYXgiLCJwaW4iLCJub3RpZnkiLCJfdGhlbWVkTWluIiwiU0hPV19MQVNUX0NIQU5HRURfQkxBQ0tMSVNURURfQ0FSRFMiLCJET01BSU5fVE9fU0xJREVSX1NVUFBPUlQiLCJsaWdodCIsImNvdmVyIiwiY2xpbWF0ZSIsIlRZUEVfVE9fQ09OVFJPTCIsInRvZ2dsZSIsImRpc3BsYXkiLCJTdGF0ZUNhcmRDdXN0b21VaSIsImNvbnRhaW5lciIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiX2NvbnRhaW5lciIsInNldFByb3BlcnR5IiwiaW5wdXRDaGFuZ2VkIiwibWFyZ2luIiwicGFkZGluZyIsImlkIiwiY29uc29sZSIsIndhcm4iLCJiYWRnZXNfbGlzdCIsInB1c2giLCJwYXJhbXMiLCJ3aWR0aCIsImZvbnRTaXplIiwibW9kaWZpZWRPYmoiLCJ0aGVtZVRhcmdldCIsIm9iaiIsInN0YXRlX2NhcmRfbW9kZSIsIm1heWJlSGlkZUVudGl0eSIsImJhZGdlTW9kZSIsInJlZ3VsYXJNb2RlXyIsImNsZWFuQmFkZ2VTdHlsZSIsIm9yaWdpbmFsU3RhdGVDYXJkVHlwZSIsImN1c3RvbVN0YXRlQ2FyZFR5cGUiLCJzZWNvbmRhcnlTdGF0ZUNhcmRUeXBlIiwic3RhdGVfY2FyZF9jdXN0b21fdWlfc2Vjb25kYXJ5Iiwic2xpZGVyRWxpZ2libGVfIiwic2VydmljZU1pbiIsInNlcnZpY2VNYXgiLCJ2YWx1ZU5hbWUiLCJzZXRWYWx1ZU5hbWUiLCJuYW1lT24iLCJtaW5fdGVtcCIsIm1heF90ZW1wIiwiY29udHJvbF9lbGVtZW50IiwiU3RhdGVDYXJkV2l0aFNsaWRlciIsIl9vbklyb25SZXNpemUiLCJiaW5kIiwiX2lzQ29ubmVjdGVkIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl93YWl0Rm9yTGF5b3V0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9zZXRNb2RlIiwiX2ZyYW1lSWQiLCJyZWFkeVRvQ29tcHV0ZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImhpZGVTbGlkZXIiLCJtb2RlIiwibGluZVRvb0xvbmciLCJicmVha1NsaWRlciIsInNob3dTbGlkZXIiLCJwcmV2QnJlYWtTbGlkZXIiLCJwcmV2SGlkZVNsaWRlciIsIiQiLCJjb250YWluZXJXaWR0aCIsImNsaWVudFdpZHRoIiwibWluTGluZUJyZWFrIiwibWF4TGluZUJyZWFrIiwiY29udGFpbmVySGVpZ2h0IiwiY2xpZW50SGVpZ2h0Iiwic3RhdGVIZWlnaHQiLCJzdHJldGNoU2xpZGVyIiwicGFyc2VJbnQiLCJwYXJhbSIsImlzTmFOIiwicGF0aCIsImNvbXBvc2VkUGF0aCIsImNhbGxTZXJ2aWNlIiwic2xpZGVyVmFsdWUiLCJzdHJldGNoX3NsaWRlciIsIlN0YXRlQ2FyZFdpdGhvdXRTbGlkZXIiLCJzdXBlckNsYXNzIiwiZGV0YWlsIiwib3B0aW9ucyIsImV2ZW50IiwiRXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwibm9kZSIsImRpc3BhdGNoRXZlbnQiLCJTVVBQT1JURURfU0xJREVSX01PREVTIiwiZG9tSG9zdCIsImdldFJvb3ROb2RlIiwiRG9jdW1lbnRGcmFnbWVudCIsImhvc3QiLCJsaWdodE9yU2hhZG93Iiwic2VsZWN0b3IiLCJzaGFkb3dSb290IiwiZ2V0RWxlbWVudEhpZXJhcmNoeSIsImhpZXJhcmNoeSIsInNoaWZ0IiwiZ2V0Q29udGV4dCIsIl9jb250ZXh0IiwiZ3JvdXBFbnRpdHkiLCJyZXZlcnNlIiwiZmluZE1hdGNoIiwiZmluZCIsIm1hdGNoIiwib3B0aW9uIiwibWF5YmVDaGFuZ2VPYmplY3RCeURldmljZSIsImRldmljZSIsImFwcGx5QXR0cmlidXRlcyIsIm1heWJlQ2hhbmdlT2JqZWN0QnlHcm91cCIsImNvbnRleHQiLCJjIiwiX3NldEtlZXAiLCJfY3VpX2tlZXAiLCJtYXliZUFwcGx5VGVtcGxhdGVBdHRyaWJ1dGVzIiwidGVtcGxhdGVzIiwibmV3QXR0cmlidXRlcyIsImhhc0dsb2JhbCIsImhhc0NoYW5nZXMiLCJ1bnRlbXBsYXRlZF9hdHRyaWJ1dGVzIiwidW50ZW1wbGF0ZWRfc3RhdGUiLCJfc3RhdGVEaXNwbGF5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwidW50ZW1wbGF0ZWRfc3RhdGVEaXNwbGF5IiwibWF5YmVBcHBseVRlbXBsYXRlcyIsIm5ld1Jlc3VsdCIsImNoZWNrQXR0cmlidXRlcyIsImxhc3RfY2hhbmdlZCIsImFsbG93SGlkZGVuIiwiZml4R3JvdXBUaXRsZXMiLCJob21lQXNzaXN0YW50TWFpbiIsImhhQ2FyZHMiLCJtYWluIiwiY2FyZHMiLCJjYXJkIiwiZnJpZW5kbHlfbmFtZSIsIm5hbWVFbGVtIiwidGV4dENvbnRlbnQiLCJjb250cm9sQ29sdW1ucyIsImNvbHVtbnMiLCJwYXJ0aWFsQ2FyZHMiLCJtcWxzIiwibXFsIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVXaW5kb3dDaGFuZ2UiLCJtYXRjaE1lZGlhIiwiYWRkTGlzdGVuZXIiLCJ1c2VDdXN0b21pemVyIiwiY3VzdG9taXplciIsImhpZGVfYXR0cmlidXRlcyIsImhhc3NBdHRyaWJ1dGVVdGlsIiwiTE9HSUNfU1RBVEVfQVRUUklCVVRFUyIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJjdXN0b21VaUF0dHJpYnV0ZXMiLCJjb25jYXQiLCJzbGlkZXJfdGhlbWUiLCJoaWRlX2luX2RlZmF1bHRfdmlldyIsInVwZGF0ZUNvbmZpZ1BhbmVsIiwibG9jYXRpb24iLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJoYVBhbmVsQ29uZmlnIiwiaGFDb25maWdOYXZpZ2F0aW9uIiwiY3VpUGF0Y2giLCJfb3JpZ2luYWxDb21wdXRlTG9hZGVkIiwiX2NvbXB1dGVMb2FkZWQiLCJfb3JpZ2luYWxDb21wdXRlQ2FwdGlvbiIsIl9jb21wdXRlQ2FwdGlvbiIsIl9vcmlnaW5hbENvbXB1dGVEZXNjcmlwdGlvbiIsIl9jb21wdXRlRGVzY3JpcHRpb24iLCJwYWdlIiwicGFnZXMiLCJjb25mIiwiY2FwdGlvbiIsImRlc2NyaXB0aW9uIiwibG9hZGVkIiwiZ2V0SGFDb25maWdDdXN0b21VaSIsImhhQ29uZmlnQ3VzdG9tVWkiLCJpcm9uUGFnZXMiLCJsYXN0RWxlbWVudENoaWxkIiwic2VsZWN0IiwidmlzaWJsZSIsImluc3RhbGxTdGF0ZXNIb29rIiwiaG9tZUFzc2lzdGFudCIsIl91cGRhdGVIYXNzIiwib3JpZ2luYWxVcGRhdGUiLCJ1cGRhdGUiLCJuZXdFbnRpdHkiLCJfdGhlbWVXYWl0ZXJzIiwid2FpdGVyIiwic3RhdGVDaGFuZ2VkIiwiaW5zdGFsbFBhcnRpYWxDYXJkcyIsIl9kZWZhdWx0Vmlld0ZpbHRlciIsImV4Y2x1ZGVzIiwiZXhjbHVkZUVudGl0eUlkIiwiaW5zdGFsbEFjdGlvbk5hbWUiLCJrbGFzcyIsImRlZmluZVByb3BlcnR5IiwiY3VzdG9tTG9jYWxpemUiLCJhY3Rpb25fbmFtZSIsIl9fZGF0YSIsInNldCIsImluc3RhbGxIYVN0YXRlTGFiZWxCYWRnZSIsImhhU3RhdGVMYWJlbEJhZGdlIiwic3RhcnRJbnRlcnZhbCIsImluc3RhbGxTdGF0ZUJhZGdlIiwic3RhdGVCYWRnZSIsInVwZGF0ZUljb25BcHBlYXJhbmNlIiwib3JpZ2luYWxVcGRhdGVJY29uQXBwZWFyYW5jZSIsImN1c3RvbVVwZGF0ZUljb25BcHBlYXJhbmNlIiwiaWNvbl9jb2xvciIsImVudGl0eV9waWN0dXJlIiwiYmFja2dyb3VuZEltYWdlIiwiY29sb3IiLCJpbnN0YWxsQ2xhc3NIb29rcyIsImNsYXNzSW5pdERvbmUiLCJpbml0IiwiaW5pdERvbmUiLCJydW5Ib29rcyIsImxvZyIsIkNVU1RPTV9VSV9MSVNUIiwidmVyc2lvbiIsInVybCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJzZXRJdGVtIiwiZnVuY3Rpb25Cb2R5IiwiZnVuYyIsIkZ1bmN0aW9uIiwiU3ludGF4RXJyb3IiLCJSZWZlcmVuY2VFcnJvciIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25FQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNPLElBQU1BLHNCQUFzQixjQUE1Qjs7QUFFUDtBQUNPLElBQU1DLG9CQUFvQixDQUMvQixTQUQrQixFQUUvQixPQUYrQixFQUcvQixjQUgrQixFQUkvQixjQUorQixFQUsvQixjQUwrQixFQU0vQixZQU4rQixFQU8vQixjQVArQixFQVEvQixPQVIrQixFQVMvQixRQVQrQixFQVUvQixPQVYrQixFQVcvQixTQVgrQixDQUExQjs7QUFjUDtBQUNPLElBQU1DLCtCQUErQixDQUMxQyxRQUQwQyxFQUUxQyxjQUYwQyxFQUcxQyxlQUgwQyxFQUkxQyxPQUowQyxDQUFyQzs7QUFPUDtBQUNPLElBQU1DLGFBQWEsQ0FDeEIsUUFEd0IsRUFFeEIsS0FGd0IsRUFHeEIsVUFId0IsQ0FBbkI7O0FBTVA7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RUE2aUI2QztBQUM5RSxRQUFNK1csZUFBZ0IzVSxTQUFTL0IsT0FBVCxDQUFpQixRQUFqQixLQUE4QixDQUEvQixHQUFvQytCLFFBQXBDLGdCQUEyREEsUUFBM0QsT0FBckI7QUFDQSxRQUFJO0FBQ0Y7QUFDQSxVQUFNNFUsT0FBTyxJQUFJQyxRQUFKLENBQ1gsTUFEVyxFQUNILFVBREcsRUFDUyxRQURULEVBQ21CLFlBRG5CLEVBQ2lDLFdBRGpDLEVBQzhDLE9BRDlDLEVBQ3VERixZQUR2RCxDQUFiO0FBRUE7QUFDQSxhQUFPQyxLQUFLdlgsSUFBTCxFQUFXZ0IsUUFBWCxFQUFxQkcsTUFBckIsRUFBNkIvQixVQUE3QixFQUF5Q2lHLFNBQXpDLEVBQW9EOUUsS0FBcEQsQ0FBUDtBQUNELEtBTkQsQ0FNRSxPQUFPOEYsQ0FBUCxFQUFVO0FBQ1Y7QUFDQSxVQUFLQSxhQUFhb1IsV0FBZCxJQUE4QnBSLGFBQWFxUixjQUEvQyxFQUErRDtBQUM3RDNOLGdCQUFRQyxJQUFSLENBQWdCM0QsRUFBRWEsSUFBbEIsVUFBMkJiLEVBQUVzUixPQUE3QixxQkFBb0RMLFlBQXBEO0FBQ0EsZUFBTyxJQUFQO0FBQ0Q7QUFDRDtBQUNBLFlBQU1qUixDQUFOO0FBQ0Q7QUFDRjtBQTlqQmtDLENBQXJDO0FBZ2tCQTlILE9BQU9pRixRQUFQLENBQWdCb1QsSUFBaEIsRzs7Ozs7Ozs7Ozs7OztBQ3ZrQkEsK0RBQWUsVUFBZixFIiwiZmlsZSI6InNjcmlwdHMtZGJnLWVzNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9lbnRyeXBvaW50cy9zY3JpcHRzLmpzXCIpO1xuIiwiLyoqIENvbnN0YW50cyB0byBiZSB1c2VkIGluIHRoZSBmcm9udGVuZC4gKi9cblxuLy8gQ29uc3RhbnRzIHNob3VsZCBiZSBhbHBoYWJldGljYWxseSBzb3J0ZWQgYnkgbmFtZS5cbi8vIEFycmF5cyB3aXRoIHZhbHVlcyBzaG91bGQgYmUgYWxwaGFiZXRpY2FsbHkgc29ydGVkIGlmIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLlxuLy8gRWFjaCBjb25zdGFudCBzaG91bGQgaGF2ZSBhIGRlc2NyaXB0aW9uIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3IuXG5cbi8qKiBJY29uIHRvIHVzZSB3aGVuIG5vIGljb24gc3BlY2lmaWVkIGZvciBkb21haW4uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ET01BSU5fSUNPTiA9ICdtZGk6Ym9va21hcmsnO1xuXG4vKiogRG9tYWlucyB0aGF0IGhhdmUgYSBzdGF0ZSBjYXJkLiAqL1xuZXhwb3J0IGNvbnN0IERPTUFJTlNfV0lUSF9DQVJEID0gW1xuICAnY2xpbWF0ZScsXG4gICdjb3ZlcicsXG4gICdjb25maWd1cmF0b3InLFxuICAnaW5wdXRfc2VsZWN0JyxcbiAgJ2lucHV0X251bWJlcicsXG4gICdpbnB1dF90ZXh0JyxcbiAgJ21lZGlhX3BsYXllcicsXG4gICdzY2VuZScsXG4gICdzY3JpcHQnLFxuICAndGltZXInLFxuICAnd2VibGluaycsXG5dO1xuXG4vKiogRG9tYWlucyB0aGF0IHNob3VsZCBoYXZlIHRoZSBoaXN0b3J5IGhpZGRlbiBpbiB0aGUgbW9yZSBpbmZvIGRpYWxvZy4gKi9cbmV4cG9ydCBjb25zdCBET01BSU5TX01PUkVfSU5GT19OT19ISVNUT1JZID0gW1xuICAnY2FtZXJhJyxcbiAgJ2NvbmZpZ3VyYXRvcicsXG4gICdoaXN0b3J5X2dyYXBoJyxcbiAgJ3NjZW5lJyxcbl07XG5cbi8qKiBTdGF0ZXMgdGhhdCB3ZSBjb25zaWRlciBcIm9mZlwiLiAqL1xuZXhwb3J0IGNvbnN0IFNUQVRFU19PRkYgPSBbXG4gICdjbG9zZWQnLFxuICAnb2ZmJyxcbiAgJ3VubG9ja2VkJyxcbl07XG5cbi8qKiBUZW1wZXJhdHVyZSB1bml0cy4gKi9cbmV4cG9ydCBjb25zdCBVTklUX0MgPSAnwrBDJztcbmV4cG9ydCBjb25zdCBVTklUX0YgPSAnwrBGJztcblxuLyoqIEVudGl0eSBJRCBvZiB0aGUgZGVmYXVsdCB2aWV3LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVklFV19FTlRJVFlfSUQgPSAnZ3JvdXAuZGVmYXVsdF92aWV3JztcbiIsIi8qKlxuICogQXBwbHkgYSB0aGVtZSB0byBhbiBlbGVtZW50IGJ5IHNldHRpbmcgdGhlIENTUyB2YXJpYWJsZXMgb24gaXQuXG4gKlxuICogZWxlbWVudDogRWxlbWVudCB0byBhcHBseSB0aGVtZSBvbi5cbiAqIHRoZW1lczogSEFTUyBUaGVtZSBpbmZvcm1hdGlvblxuICogbG9jYWxUaGVtZTogc2VsZWN0ZWQgdGhlbWUuXG4gKiB1cGRhdGVNZXRhOiBib29sZWFuIGlmIHdlIHNob3VsZCB1cGRhdGUgdGhlIHRoZW1lLWNvbG9yIG1ldGEgZWxlbWVudC5cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcHBseVRoZW1lc09uRWxlbWVudChlbGVtZW50LCB0aGVtZXMsIGxvY2FsVGhlbWUsIHVwZGF0ZU1ldGEgPSBmYWxzZSkge1xuICBpZiAoIWVsZW1lbnQuX3RoZW1lcykge1xuICAgIGVsZW1lbnQuX3RoZW1lcyA9IHt9O1xuICB9XG4gIGxldCB0aGVtZU5hbWUgPSB0aGVtZXMuZGVmYXVsdF90aGVtZTtcbiAgaWYgKGxvY2FsVGhlbWUgPT09ICdkZWZhdWx0JyB8fCAobG9jYWxUaGVtZSAmJiB0aGVtZXMudGhlbWVzW2xvY2FsVGhlbWVdKSkge1xuICAgIHRoZW1lTmFtZSA9IGxvY2FsVGhlbWU7XG4gIH1cbiAgY29uc3Qgc3R5bGVzID0gT2JqZWN0LmFzc2lnbih7fSwgZWxlbWVudC5fdGhlbWVzKTtcbiAgaWYgKHRoZW1lTmFtZSAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgdmFyIHRoZW1lID0gdGhlbWVzLnRoZW1lc1t0aGVtZU5hbWVdO1xuICAgIE9iamVjdC5rZXlzKHRoZW1lKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHZhciBwcmVmaXhlZEtleSA9ICctLScgKyBrZXk7XG4gICAgICBlbGVtZW50Ll90aGVtZXNbcHJlZml4ZWRLZXldID0gJyc7XG4gICAgICBzdHlsZXNbcHJlZml4ZWRLZXldID0gdGhlbWVba2V5XTtcbiAgICB9KTtcbiAgfVxuICBpZiAoZWxlbWVudC51cGRhdGVTdHlsZXMpIHtcbiAgICBlbGVtZW50LnVwZGF0ZVN0eWxlcyhzdHlsZXMpO1xuICB9IGVsc2UgaWYgKHdpbmRvdy5TaGFkeUNTUykge1xuICAgIC8vIGltcGxlbWVudCB1cGRhdGVTdHlsZXMoKSBtZXRob2Qgb2YgUG9sZW1lciBlbGVtZW50c1xuICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZVN1YnRyZWUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKGVsZW1lbnQpLCBzdHlsZXMpO1xuICB9XG5cbiAgaWYgKCF1cGRhdGVNZXRhKSByZXR1cm47XG5cbiAgY29uc3QgbWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT10aGVtZS1jb2xvcl0nKTtcbiAgaWYgKG1ldGEpIHtcbiAgICBpZiAoIW1ldGEuaGFzQXR0cmlidXRlKCdkZWZhdWx0LWNvbnRlbnQnKSkge1xuICAgICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ2RlZmF1bHQtY29udGVudCcsIG1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykpO1xuICAgIH1cbiAgICBjb25zdCB0aGVtZUNvbG9yID0gc3R5bGVzWyctLXByaW1hcnktY29sb3InXSB8fCBtZXRhLmdldEF0dHJpYnV0ZSgnZGVmYXVsdC1jb250ZW50Jyk7XG4gICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCB0aGVtZUNvbG9yKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBVcGRhdGUgcm9vdCdzIGNoaWxkIGVsZW1lbnQgdG8gYmUgbmV3RWxlbWVudFRhZyByZXBsYWNpbmcgYW5vdGhlciBleGlzdGluZyBjaGlsZCBpZiBhbnkuXG4gKiBDb3B5IGF0dHJpYnV0ZXMgaW50byB0aGUgY2hpbGQgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHluYW1pY0NvbnRlbnRVcGRhdGVyKHJvb3QsIG5ld0VsZW1lbnRUYWcsIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3Qgcm9vdEVsID0gcm9vdDtcbiAgbGV0IGN1c3RvbUVsO1xuXG4gIGlmIChyb290RWwubGFzdENoaWxkICYmIHJvb3RFbC5sYXN0Q2hpbGQudGFnTmFtZSA9PT0gbmV3RWxlbWVudFRhZykge1xuICAgIGN1c3RvbUVsID0gcm9vdEVsLmxhc3RDaGlsZDtcbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdEVsLmxhc3RDaGlsZCkge1xuICAgICAgcm9vdEVsLnJlbW92ZUNoaWxkKHJvb3RFbC5sYXN0Q2hpbGQpO1xuICAgIH1cbiAgICAvLyBDcmVhdGluZyBhbiBlbGVtZW50IHdpdGggdXBwZXIgY2FzZSB3b3JrcyBmaW5lIGluIENocm9tZSwgYnV0IGluIEZGIGl0IGRvZXNuJ3QgaW1tZWRpYXRlbHlcbiAgICAvLyBiZWNvbWUgYSBkZWZpbmVkIEN1c3RvbSBFbGVtZW50LiBQb2x5bWVyIGRvZXMgdGhhdCBpbiBzb21lIGxhdGVyIHBhc3MuXG4gICAgY3VzdG9tRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5ld0VsZW1lbnRUYWcudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICBpZiAoY3VzdG9tRWwuc2V0UHJvcGVydGllcykge1xuICAgIGN1c3RvbUVsLnNldFByb3BlcnRpZXMoYXR0cmlidXRlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbiB3YXNuJ3QgbG9hZGVkIHlldCAtIHNldFByb3BlcnRpZXMgd291bGQgYmVcbiAgICAvLyBtaXNzaW5nLCBidXQgbm8gaGFybSBpbiBzZXR0aW5nIGF0dHJpYnV0ZXMgb25lLWJ5LW9uZSB0aGVuLlxuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY3VzdG9tRWxba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjdXN0b21FbC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcm9vdEVsLmFwcGVuZENoaWxkKGN1c3RvbUVsKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FuVG9nZ2xlRG9tYWluKGhhc3MsIGRvbWFpbikge1xuICBjb25zdCBzZXJ2aWNlcyA9IGhhc3MuY29uZmlnLnNlcnZpY2VzW2RvbWFpbl07XG4gIGlmICghc2VydmljZXMpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKGRvbWFpbiA9PT0gJ2xvY2snKSB7XG4gICAgcmV0dXJuICdsb2NrJyBpbiBzZXJ2aWNlcztcbiAgfSBlbHNlIGlmIChkb21haW4gPT09ICdjb3ZlcicpIHtcbiAgICByZXR1cm4gJ29wZW5fY292ZXInIGluIHNlcnZpY2VzO1xuICB9XG4gIHJldHVybiAndHVybl9vbicgaW4gc2VydmljZXM7XG59XG4iLCJpbXBvcnQgY2FuVG9nZ2xlRG9tYWluIGZyb20gJy4vY2FuX3RvZ2dsZV9kb21haW4uanMnO1xuaW1wb3J0IGNvbXB1dGVTdGF0ZURvbWFpbiBmcm9tICcuL2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FuVG9nZ2xlU3RhdGUoaGFzcywgc3RhdGVPYmopIHtcbiAgY29uc3QgZG9tYWluID0gY29tcHV0ZVN0YXRlRG9tYWluKHN0YXRlT2JqKTtcbiAgaWYgKGRvbWFpbiA9PT0gJ2dyb3VwJykge1xuICAgIHJldHVybiBzdGF0ZU9iai5zdGF0ZSA9PT0gJ29uJyB8fCBzdGF0ZU9iai5zdGF0ZSA9PT0gJ29mZic7XG4gIH1cbiAgaWYgKGRvbWFpbiA9PT0gJ2NsaW1hdGUnKSB7XG4gICAgcmV0dXJuICEhKChzdGF0ZU9iai5hdHRyaWJ1dGVzIHx8IHt9KS5zdXBwb3J0ZWRfZmVhdHVyZXMgJiA0MDk2KTtcbiAgfVxuXG4gIHJldHVybiBjYW5Ub2dnbGVEb21haW4oaGFzcywgZG9tYWluKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVEb21haW4oZW50aXR5SWQpIHtcbiAgcmV0dXJuIGVudGl0eUlkLnN1YnN0cigwLCBlbnRpdHlJZC5pbmRleE9mKCcuJykpO1xufVxuIiwiaW1wb3J0IGNvbXB1dGVEb21haW4gZnJvbSAnLi9jb21wdXRlX2RvbWFpbi5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVTdGF0ZURvbWFpbihzdGF0ZU9iaikge1xuICBpZiAoIXN0YXRlT2JqLl9kb21haW4pIHtcbiAgICBzdGF0ZU9iai5fZG9tYWluID0gY29tcHV0ZURvbWFpbihzdGF0ZU9iai5lbnRpdHlfaWQpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlT2JqLl9kb21haW47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRHcm91cEVudGl0aWVzKGVudGl0aWVzLCBncm91cCkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcblxuICBncm91cC5hdHRyaWJ1dGVzLmVudGl0eV9pZC5mb3JFYWNoKChlbnRpdHlJZCkgPT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IGVudGl0aWVzW2VudGl0eUlkXTtcblxuICAgIGlmIChlbnRpdHkpIHtcbiAgICAgIHJlc3VsdFtlbnRpdHkuZW50aXR5X2lkXSA9IGVudGl0eTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgY29tcHV0ZURvbWFpbiBmcm9tICcuL2NvbXB1dGVfZG9tYWluLmpzJztcbmltcG9ydCBnZXRHcm91cEVudGl0aWVzIGZyb20gJy4vZ2V0X2dyb3VwX2VudGl0aWVzLmpzJztcblxuLy8gUmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCBlbnRpdGllcyB0aGF0IHRoZSB2aWV3IHdpbGwgc2hvd1xuLy8gaW5jbHVkaW5nIGVtYmVkZGVkIGdyb3Vwcy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdFbnRpdGllcyhlbnRpdGllcywgdmlldykge1xuICBjb25zdCB2aWV3RW50aXRpZXMgPSB7fTtcblxuICB2aWV3LmF0dHJpYnV0ZXMuZW50aXR5X2lkLmZvckVhY2goKGVudGl0eUlkKSA9PiB7XG4gICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbZW50aXR5SWRdO1xuXG4gICAgaWYgKGVudGl0eSAmJiAhZW50aXR5LmF0dHJpYnV0ZXMuaGlkZGVuKSB7XG4gICAgICB2aWV3RW50aXRpZXNbZW50aXR5LmVudGl0eV9pZF0gPSBlbnRpdHk7XG5cbiAgICAgIGlmIChjb21wdXRlRG9tYWluKGVudGl0eS5lbnRpdHlfaWQpID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwRW50aXRpZXMgPSBnZXRHcm91cEVudGl0aWVzKGVudGl0aWVzLCBlbnRpdHkpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGdyb3VwRW50aXRpZXMpLmZvckVhY2goKGdyRW50aXR5SWQpID0+IHtcbiAgICAgICAgICBjb25zdCBnckVudGl0eSA9IGdyb3VwRW50aXRpZXNbZ3JFbnRpdHlJZF07XG5cbiAgICAgICAgICBpZiAoIWdyRW50aXR5LmF0dHJpYnV0ZXMuaGlkZGVuKSB7XG4gICAgICAgICAgICB2aWV3RW50aXRpZXNbZ3JFbnRpdHlJZF0gPSBnckVudGl0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHZpZXdFbnRpdGllcztcbn1cbiIsImltcG9ydCBjYW5Ub2dnbGVTdGF0ZSBmcm9tICcuL2Nhbl90b2dnbGVfc3RhdGUuanMnO1xuaW1wb3J0IGNvbXB1dGVTdGF0ZURvbWFpbiBmcm9tICcuL2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzJztcbmltcG9ydCB7IERPTUFJTlNfV0lUSF9DQVJEIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGF0ZUNhcmRUeXBlKGhhc3MsIHN0YXRlT2JqKSB7XG4gIGlmIChzdGF0ZU9iai5zdGF0ZSA9PT0gJ3VuYXZhaWxhYmxlJykge1xuICAgIHJldHVybiAnZGlzcGxheSc7XG4gIH1cblxuICBjb25zdCBkb21haW4gPSBjb21wdXRlU3RhdGVEb21haW4oc3RhdGVPYmopO1xuXG4gIGlmIChET01BSU5TX1dJVEhfQ0FSRC5pbmNsdWRlcyhkb21haW4pKSB7XG4gICAgcmV0dXJuIGRvbWFpbjtcbiAgfSBlbHNlIGlmIChjYW5Ub2dnbGVTdGF0ZShoYXNzLCBzdGF0ZU9iaikgJiZcbiAgICAgICAgICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbnRyb2wgIT09ICdoaWRkZW4nKSB7XG4gICAgcmV0dXJuICd0b2dnbGUnO1xuICB9XG4gIHJldHVybiAnZGlzcGxheSc7XG59XG4iLCIvKipcbkBsaWNlbnNlXG5Db3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xuXG53aW5kb3cuSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHByb3ApIHsgcmV0dXJuIHByb3A7IH07XG4iLCIvKipcbkBsaWNlbnNlXG5Db3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xuaW1wb3J0ICcuL2Jvb3QuanMnO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIHN0YXRpYyBzdHJpbmcgdmFsdWUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmlsdGVyXG4gKiBzdHJpbmdzIGJ5IGFzc2V0aW5nIHRoYXQgdGhleSBoYXZlIGJlZW4gY3JlYXRlZCB2aWEgdGhpcyBjbGFzcy4gVGhlXG4gKiBgdmFsdWVgIHByb3BlcnR5IHJldHVybnMgdGhlIHN0cmluZyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICovXG5jbGFzcyBMaXRlcmFsU3RyaW5nIHtcbiAgY29uc3RydWN0b3Ioc3RyaW5nKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgdGhpcy52YWx1ZSA9IHN0cmluZy50b1N0cmluZygpO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IExpdGVyYWxTdHJpbmcgc3RyaW5nIHZhbHVlXG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgT2JqZWN0IHRvIHN0cmluZ2lmeSBpbnRvIEhUTUxcbiAqIEByZXR1cm4ge3N0cmluZ30gSFRNTCBzdHJpbmdpZmllZCBmb3JtIG9mIGBvYmpgXG4gKi9cbmZ1bmN0aW9uIGxpdGVyYWxWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7IUxpdGVyYWxTdHJpbmd9ICovKHZhbHVlKS52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lcidzIGh0bWxMaXRlcmFsIGZ1bmN0aW9uOiAke3ZhbHVlfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTFxuICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamBcbiAqL1xuZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7XG4gICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbm9uLXRlbXBsYXRlIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyJ3MgaHRtbCBmdW5jdGlvbjogJHt2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdGhhdCBjcmVhdGVzIGFuIEhUTUwgPHRlbXBsYXRlPiBlbGVtZW50IGZyb20gdGhlXG4gKiBjb250ZW50cyBvZiB0aGUgc3RyaW5nLlxuICpcbiAqIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSBhIFBvbHltZXIgVGVtcGxhdGUgaW4gSmF2YVNjcmlwdC5cbiAqXG4gKiBUZW1wbGF0ZXMgY2FuIGJlIGNvbXBvc2VkIGJ5IGludGVycG9sYXRpbmcgYEhUTUxUZW1wbGF0ZUVsZW1lbnRgcyBpblxuICogZXhwcmVzc2lvbnMgaW4gdGhlIEphdmFTY3JpcHQgdGVtcGxhdGUgbGl0ZXJhbC4gVGhlIG5lc3RlZCB0ZW1wbGF0ZSdzXG4gKiBgaW5uZXJIVE1MYCBpcyBpbmNsdWRlZCBpbiB0aGUgY29udGFpbmluZyB0ZW1wbGF0ZS4gIFRoZSBvbmx5IG90aGVyXG4gKiB2YWx1ZXMgYWxsb3dlZCBpbiBleHByZXNzaW9ucyBhcmUgdGhvc2UgcmV0dXJuZWQgZnJvbSBgaHRtbExpdGVyYWxgXG4gKiB3aGljaCBlbnN1cmVzIG9ubHkgbGl0ZXJhbCB2YWx1ZXMgZnJvbSBKUyBzb3VyY2UgZXZlciByZWFjaCB0aGUgSFRNTCwgdG9cbiAqIGd1YXJkIGFnYWluc3QgWFNTIHJpc2tzLlxuICpcbiAqIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGRpc2FsbG93ZWQgaW4gZXhwcmVzc2lvbnMgdG8gaGVscCBwcmV2ZW50IFhTU1xuICogYXR0YWNrczsgaG93ZXZlciwgYGh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpY1xuICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG9cbiAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgXG4gKiBlbGVtZW50LlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gKiAgICAgICByZXR1cm4gaHRtbGBcbiAqICAgICAgICAgPHN0eWxlPjpob3N0eyBjb250ZW50OlwiLi4uXCIgfTwvc3R5bGU+XG4gKiAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGFkb3dlZFwiPiR7dGhpcy5wYXJ0aWFsVGVtcGxhdGV9PC9kaXY+XG4gKiAgICAgICAgICR7c3VwZXIudGVtcGxhdGV9XG4gKiAgICAgICBgO1xuICogICAgIH1cbiAqICAgICBzdGF0aWMgZ2V0IHBhcnRpYWxUZW1wbGF0ZSgpIHsgcmV0dXJuIGh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfVxuICpcbiAqIEBwYXJhbSB7IUlUZW1wbGF0ZUFycmF5fSBzdHJpbmdzIENvbnN0YW50IHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gey4uLip9IHZhbHVlcyBWYXJpYWJsZSBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybiB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IENvbnN0cnVjdGVkIEhUTUxUZW1wbGF0ZUVsZW1lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGh0bWwgPSBmdW5jdGlvbiBodG1sKHN0cmluZ3MsIC4uLnZhbHVlcykge1xuICBjb25zdCB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJykpO1xuICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSB2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT5cbiAgICAgIGFjYyArIGh0bWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pO1xuICByZXR1cm4gdGVtcGxhdGU7XG59O1xuXG4vKipcbiAqIEFuIGh0bWwgbGl0ZXJhbCB0YWcgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGBodG1sYCB0byBjb21wb3NlLlxuICogYSBsaXRlcmFsIHN0cmluZy5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkge1xuICogICAgICAgcmV0dXJuIGh0bWxgXG4gKiAgICAgICAgIDxzdHlsZT5cbiAqICAgICAgICAgICA6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gKiAgICAgICAgICAgJHt0aGlzLnN0eWxlVGVtcGxhdGUoKX1cbiAqICAgICAgICAgPC9zdHlsZT5cbiAqICAgICAgICAgPGRpdiBjbGFzcz1cInNoYWRvd2VkXCI+JHtzdGF0aWNWYWx1ZX08L2Rpdj5cbiAqICAgICAgICAgJHtzdXBlci50ZW1wbGF0ZX1cbiAqICAgICAgIGA7XG4gKiAgICAgfVxuICogICAgIHN0YXRpYyBnZXQgc3R5bGVUZW1wbGF0ZSgpIHtcbiAqICAgICAgICByZXR1cm4gaHRtbExpdGVyYWxgLnNoYWRvd2VkIHsgYmFja2dyb3VuZDogZ3JheTsgfWA7XG4gKiAgICAgfVxuICpcbiAqIEBwYXJhbSB7IUlUZW1wbGF0ZUFycmF5fSBzdHJpbmdzIENvbnN0YW50IHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gey4uLip9IHZhbHVlcyBWYXJpYWJsZSBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybiB7IUxpdGVyYWxTdHJpbmd9IENvbnN0cnVjdGVkIGxpdGVyYWwgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBodG1sTGl0ZXJhbCA9IGZ1bmN0aW9uKHN0cmluZ3MsIC4uLnZhbHVlcykge1xuICByZXR1cm4gbmV3IExpdGVyYWxTdHJpbmcodmFsdWVzLnJlZHVjZSgoYWNjLCB2LCBpZHgpID0+XG4gICAgICBhY2MgKyBsaXRlcmFsVmFsdWUodikgKyBzdHJpbmdzW2lkeCArIDFdLCBzdHJpbmdzWzBdKSk7XG59O1xuIiwiaW1wb3J0ICcuLi91dGlscy9ob29rcy5qcyc7XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgQ3VpQmFzZUVsZW1lbnQgZXh0ZW5kcyBQb2x5bWVyLkVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc3M6IE9iamVjdCxcbiAgICAgIGluRGlhbG9nOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBzdGF0ZU9iajogT2JqZWN0LFxuICAgICAgY29udHJvbEVsZW1lbnQ6IFN0cmluZyxcbiAgICAgIGV4dHJhOiB7XG4gICAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgICBjb21wdXRlZDogJ2NvbXB1dGVFeHRyYShoYXNzLCBzdGF0ZU9iaiknLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29tcHV0ZUV4dHJhKGhhc3MsIHN0YXRlT2JqKSB7XG4gICAgbGV0IGV4dHJhcyA9IHN0YXRlT2JqLmF0dHJpYnV0ZXMuZXh0cmFfZGF0YV90ZW1wbGF0ZTtcbiAgICBpZiAoZXh0cmFzKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXh0cmFzKSkge1xuICAgICAgICBleHRyYXMgPSBbZXh0cmFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleHRyYXMubWFwKGV4dHJhID0+IHdpbmRvdy5jdXN0b21VSS5jb21wdXRlVGVtcGxhdGUoXG4gICAgICAgIGV4dHJhLFxuICAgICAgICBoYXNzLFxuICAgICAgICBoYXNzLnN0YXRlcyxcbiAgICAgICAgc3RhdGVPYmosXG4gICAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXMsXG4gICAgICAgIC8qIGF0dHJpYnV0ZT0gKi8gdW5kZWZpbmVkLFxuICAgICAgICBzdGF0ZU9iai5zdGF0ZSxcbiAgICAgICkpLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0ICE9PSBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgc2hvd0xhc3RDaGFuZ2VkKHN0YXRlT2JqLCBpbkRpYWxvZywgZXh0cmEpIHtcbiAgICBpZiAoaW5EaWFsb2cpIHJldHVybiB0cnVlO1xuICAgIGlmIChleHRyYS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gISFzdGF0ZU9iai5hdHRyaWJ1dGVzLnNob3dfbGFzdF9jaGFuZ2VkO1xuICB9XG5cbiAgaGFzRXh0cmEoZXh0cmEpIHtcbiAgICByZXR1cm4gZXh0cmEubGVuZ3RoID4gMDtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgQ3VpQmFzZUVsZW1lbnQ7XG4iLCJpbXBvcnQgZHluYW1pY0NvbnRlbnRVcGRhdGVyIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9kb20vZHluYW1pY19jb250ZW50X3VwZGF0ZXIuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIER5bmFtaWNFbGVtZW50IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNzOiBPYmplY3QsXG4gICAgICBzdGF0ZU9iajogT2JqZWN0LFxuICAgICAgZWxlbWVudE5hbWU6IFN0cmluZyxcblxuICAgICAgaW5EaWFsb2c6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdvYnNlcnZlckZ1bmMoaGFzcywgc3RhdGVPYmosIGVsZW1lbnROYW1lLCBpbkRpYWxvZyknLFxuICAgIF07XG4gIH1cblxuICBvYnNlcnZlckZ1bmMoaGFzcywgc3RhdGVPYmosIGVsZW1lbnROYW1lLCBpbkRpYWxvZykge1xuICAgIGR5bmFtaWNDb250ZW50VXBkYXRlcihcbiAgICAgIHRoaXMsXG4gICAgICBlbGVtZW50TmFtZSA/IGVsZW1lbnROYW1lLnRvVXBwZXJDYXNlKCkgOiAnRElWJyxcbiAgICAgIHsgaGFzcywgc3RhdGVPYmosIGluRGlhbG9nIH0pO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2R5bmFtaWMtZWxlbWVudCcsIER5bmFtaWNFbGVtZW50KTtcbiIsImltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9odG1sLXRhZy5qcyc7XG5pbXBvcnQgYXBwbHlUaGVtZXNPbkVsZW1lbnQgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9hcHBseV90aGVtZXNfb25fZWxlbWVudC5qcyc7XG5cbmltcG9ydCAnLi9keW5hbWljLWVsZW1lbnQuanMnO1xuaW1wb3J0ICcuLi91dGlscy9ob29rcy5qcyc7XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgRHluYW1pY1dpdGhFeHRyYSBleHRlbmRzIGN1c3RvbUVsZW1lbnRzLmdldCgnc3RhdGUtY2FyZC1kaXNwbGF5Jykge1xuICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgIDxzdHlsZSBpcz1cImN1c3RvbS1zdHlsZVwiIGluY2x1ZGU9XCJpcm9uLWZsZXggaXJvbi1mbGV4LWFsaWdubWVudCBpcm9uLWZsZXgtZmFjdG9yc1wiPjwvc3R5bGU+XG4gICAgPHN0eWxlPlxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB9XG4gICAgICAuY29udHJvbC13cmFwcGVyIHtcbiAgICAgICAgbWFyZ2luOiAtNHB4IC0xNnB4IC00cHggMDtcbiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7XG4gICAgICB9XG4gICAgICBoYS1zdGF0ZS1sYWJlbC1iYWRnZSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG4gICAgICB9XG4gICAgICBkeW5hbWljLWVsZW1lbnQge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICB9XG4gICAgICAjb3ZlcmxheSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgICAgei1pbmRleDogMTtcbiAgICAgIH1cbiAgICAgICNsb2NrIHtcbiAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuICAgICAgICBvcGFjaXR5OiAwLjM7XG4gICAgICAgIG1hcmdpbi1yaWdodDogN3B4O1xuICAgICAgfVxuICAgICAgI2xvY2suaGEtY292ZXItY29udHJvbHMge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDUycHg7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgICAgfVxuICAgICAgLmV4dHJhIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogLTE2cHg7XG4gICAgICAgIC0taGEtbGFiZWwtYmFkZ2Utc2l6ZTogMzZweDtcbiAgICAgICAgLS1oYS1sYWJlbC1iYWRnZS1mb250LXNpemU6IDEuMmVtO1xuICAgICAgfVxuICAgICAgLnN0YXRlIHtcbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTtcbiAgICAgICAgY29sb3I6IHZhcigtLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4O1xuICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgICA8ZGl2IGNsYXNzJD0nW1tleHRyYUNsYXNzKGV4dHJhT2JqVmlzaWJsZSldXSBob3Jpem9udGFsIGxheW91dCc+XG4gICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbZXh0cmFPYmpWaXNpYmxlXV0nPlxuICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1yZXBlYXQnXG4gICAgICAgICAgICAgICAgICBpdGVtcz0nW1tleHRyYU9ial1dJ1xuICAgICAgICAgICAgICAgICAgb24tZG9tLWNoYW5nZT0nZXh0cmFEb21DaGFuZ2VkJz5cbiAgICAgICAgICA8aGEtc3RhdGUtbGFiZWwtYmFkZ2UgaGFzcz0nW1toYXNzXV0nIHN0YXRlPSdbW2l0ZW1dXSc+PC9oYS1zdGF0ZS1sYWJlbC1iYWRnZT5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbX3Nob3dDb250cm9sKGluRGlhbG9nLCBzdGF0ZU9iaildXSc+XG4gICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tjb250cm9sRWxlbWVudF1dJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZHluYW1pYy1lbGVtZW50XG4gICAgICAgICAgICAgICAgY2xhc3M9J2ZsZXgnXG4gICAgICAgICAgICAgICAgc3RhdGUtb2JqPVwiW1tzdGF0ZU9ial1dXCJcbiAgICAgICAgICAgICAgICBoYXNzPSdbW2hhc3NdXSdcbiAgICAgICAgICAgICAgICBlbGVtZW50LW5hbWU9J1tbY29udHJvbEVsZW1lbnRdXSc+XG4gICAgICAgICAgICA8L2R5bmFtaWMtZWxlbWVudD5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tpc0NvbmZpcm1Db250cm9scyhzdGF0ZU9iaildXSc+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJvdmVybGF5XCIgb24tY2xpY2s9J2NsaWNrSGFuZGxlcic+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW3N0YXRlT2JqLmF0dHJpYnV0ZXMuY29uZmlybV9jb250cm9sc19zaG93X2xvY2tdXSc+XG4gICAgICAgICAgICAgICAgICA8aXJvbi1pY29uIGlkPVwibG9ja1wiIGNsYXNzJD1cIltbY29udHJvbEVsZW1lbnRdXVwiIGljb249XCJtZGk6bG9jay1vdXRsaW5lXCI+PC9pcm9uLWljb24+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbIWNvbnRyb2xFbGVtZW50XV0nPlxuICAgICAgICAgIDxkaXYgY2xhc3M9J3N0YXRlJz5bW2NvbXB1dGVTdGF0ZURpc3BsYXkoc3RhdGVPYmopXV08L2Rpdj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzczogT2JqZWN0LFxuICAgICAgaW5EaWFsb2c6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHN0YXRlT2JqOiBPYmplY3QsXG4gICAgICBjb250cm9sRWxlbWVudDogU3RyaW5nLFxuICAgICAgZXh0cmFPYmo6IHtcbiAgICAgICAgdHlwZTogQXJyYXksXG4gICAgICAgIGNvbXB1dGVkOiAnY29tcHV0ZUV4dHJhKGhhc3MsIHN0YXRlT2JqLCBfYXR0YWNoZWQpJyxcbiAgICAgIH0sXG4gICAgICBfYXR0YWNoZWQ6IEJvb2xlYW4sXG4gICAgICBleHRyYU9ialZpc2libGU6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgY29tcHV0ZWQ6ICdjb21wdXRlRXh0cmFWaXNpYmxlKGV4dHJhT2JqLCBpbkRpYWxvZyknLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl9hdHRhY2hlZCA9IHRydWU7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9pc0F0dGFjaGVkID0gZmFsc2U7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIGNvbXB1dGVFeHRyYShoYXNzLCBzdGF0ZU9iaiwgYXR0YWNoZWQpIHtcbiAgICBpZiAoIXN0YXRlT2JqLmF0dHJpYnV0ZXMuZXh0cmFfYmFkZ2UgfHwgIWF0dGFjaGVkKSByZXR1cm4gW107XG4gICAgbGV0IGV4dHJhQmFkZ2VzID0gc3RhdGVPYmouYXR0cmlidXRlcy5leHRyYV9iYWRnZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXh0cmFCYWRnZXMpKSB7XG4gICAgICBleHRyYUJhZGdlcyA9IFtleHRyYUJhZGdlc107XG4gICAgfVxuICAgIHJldHVybiBleHRyYUJhZGdlcy5tYXAoKGV4dHJhQmFkZ2UpID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgaWYgKGV4dHJhQmFkZ2UuZW50aXR5X2lkICYmIGhhc3Muc3RhdGVzW2V4dHJhQmFkZ2UuZW50aXR5X2lkXSkge1xuICAgICAgICByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCB3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3QoXG4gICAgICAgICAgdGhpcywgaGFzcy5zdGF0ZXNbZXh0cmFCYWRnZS5lbnRpdHlfaWRdLCB0aGlzLmluRGlhbG9nLFxuICAgICAgICAgIC8qIGFsbG93SGlkZGVuPSAqL2ZhbHNlKSk7XG4gICAgICB9IGVsc2UgaWYgKGV4dHJhQmFkZ2UuYXR0cmlidXRlICYmXG4gICAgICAgICAgICAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXNbZXh0cmFCYWRnZS5hdHRyaWJ1dGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgIHN0YXRlOiBTdHJpbmcoc3RhdGVPYmouYXR0cmlidXRlc1tleHRyYUJhZGdlLmF0dHJpYnV0ZV0pLFxuICAgICAgICAgIF9kb21haW46ICdub25lJyxcbiAgICAgICAgICBlbnRpdHlfaWQ6IG51bGwsXG4gICAgICAgICAgYXR0cmlidXRlczogeyB1bml0X29mX21lYXN1cmVtZW50OiBleHRyYUJhZGdlLnVuaXQgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgIGxldCBibGFja2xpc3QgPSBleHRyYUJhZGdlLmJsYWNrbGlzdF9zdGF0ZXM7XG4gICAgICBpZiAoYmxhY2tsaXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGJsYWNrbGlzdCkpIHtcbiAgICAgICAgICBibGFja2xpc3QgPSBbYmxhY2tsaXN0XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmxhY2tsaXN0LnNvbWUodiA9PiBSZWdFeHAodikudGVzdChyZXN1bHQuc3RhdGUudG9TdHJpbmcoKSkpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdC5fZW50aXR5RGlzcGxheSA9ICcnO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KS5maWx0ZXIoZXh0cmFCYWRnZSA9PiBleHRyYUJhZGdlICE9IG51bGwpO1xuICB9XG5cbiAgY29tcHV0ZUV4dHJhVmlzaWJsZShleHRyYU9iaiwgaW5EaWFsb2cpIHtcbiAgICBpZiAoaW5EaWFsb2cgfHwgIWV4dHJhT2JqKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGV4dHJhT2JqLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIGV4dHJhQ2xhc3MoZXh0cmFPYmpWaXNpYmxlKSB7XG4gICAgcmV0dXJuIGV4dHJhT2JqVmlzaWJsZSA/ICdleHRyYScgOiAnJztcbiAgfVxuXG4gIF9zaG93Q29udHJvbChpbkRpYWxvZywgc3RhdGVPYmopIHtcbiAgICBpZiAoaW5EaWFsb2cpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAhc3RhdGVPYmouYXR0cmlidXRlcy5oaWRlX2NvbnRyb2w7XG4gIH1cblxuICBjb21wdXRlU3RhdGVEaXNwbGF5KHN0YXRlT2JqKSB7XG4gICAgLy8gaGFMb2NhbGl6ZSByZW1vdmVkIGluIDAuNjFcbiAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVN0YXRlRGlzcGxheSh0aGlzLmhhTG9jYWxpemUgfHwgdGhpcy5sb2NhbGl6ZSwgc3RhdGVPYmopO1xuICB9XG5cbiAgaXNDb25maXJtQ29udHJvbHMoc3RhdGVPYmopIHtcbiAgICByZXR1cm4gc3RhdGVPYmouYXR0cmlidXRlcy5jb25maXJtX2NvbnRyb2xzIHx8XG4gICAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXMuY29uZmlybV9jb250cm9sc19zaG93X2xvY2s7XG4gIH1cblxuICBjbGlja0hhbmRsZXIoZSkge1xuICAgIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcjb3ZlcmxheScpLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgY29uc3QgbG9jayA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcjbG9jaycpO1xuICAgIGlmIChsb2NrKSB7XG4gICAgICBsb2NrLmljb24gPSAnbWRpOmxvY2stb3Blbi1vdXRsaW5lJztcbiAgICAgIGxvY2suc3R5bGUub3BhY2l0eSA9ICcwLjEnO1xuICAgIH1cbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignI292ZXJsYXknKS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICBpZiAobG9jaykge1xuICAgICAgICBsb2NrLmljb24gPSAnbWRpOmxvY2stb3V0bGluZSc7XG4gICAgICAgIGxvY2suc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgICAgfVxuICAgIH0sIDUwMDApO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBhcHBseVRoZW1lcyhoYXNzLCBlbGVtZW50LCBzdGF0ZU9iaikge1xuICAgIGNvbnN0IHRoZW1lTmFtZSA9IHN0YXRlT2JqLmF0dHJpYnV0ZXMudGhlbWUgfHwgJ2RlZmF1bHQnO1xuICAgIGFwcGx5VGhlbWVzT25FbGVtZW50KFxuICAgICAgZWxlbWVudCwgaGFzcy50aGVtZXMgfHwgeyBkZWZhdWx0X3RoZW1lOiAnZGVmYXVsdCcsIHRoZW1lczoge30gfSwgdGhlbWVOYW1lKTtcbiAgfVxuXG4gIGV4dHJhRG9tQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgnaGEtc3RhdGUtbGFiZWwtYmFkZ2UnKVxuICAgICAgLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgdGhpcy5hcHBseVRoZW1lcyh0aGlzLmhhc3MsIGVsZW0sIGVsZW0uc3RhdGUpO1xuICAgICAgfSk7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZHluYW1pYy13aXRoLWV4dHJhJywgRHluYW1pY1dpdGhFeHRyYSk7XG4iLCJpbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvaHRtbC10YWcuanMnO1xuaW1wb3J0IEV2ZW50c01peGluIGZyb20gJy4uL21peGlucy9ldmVudHMtbWl4aW4uanMnO1xuaW1wb3J0ICcuLi91dGlscy9ob29rcy5qcyc7XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgSGFDb25maWdDdXN0b21VaSBleHRlbmRzIEV2ZW50c01peGluKFBvbHltZXIuRWxlbWVudCkge1xuICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgIDxzdHlsZSBpbmNsdWRlPVwiaGEtc3R5bGVcIj48L3N0eWxlPlxuICAgIDxhcHAtaGVhZGVyLWxheW91dCBoYXMtc2Nyb2xsaW5nLXJlZ2lvbj5cbiAgICAgIDxhcHAtaGVhZGVyIHNsb3Q9XCJoZWFkZXJcIiBmaXhlZD5cbiAgICAgICAgPGFwcC10b29sYmFyPlxuICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvblxuICAgICAgICAgICAgaWNvbj0nbWRpOmFycm93LWxlZnQnXG4gICAgICAgICAgICBvbi1jbGljaz0nX2JhY2tIYW5kbGVyJ1xuICAgICAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPlxuICAgICAgICAgIDxkaXYgbWFpbi10aXRsZT5DdXN0b20gVUkgc2V0dGluZ3M8L2Rpdj5cbiAgICAgICAgPC9hcHAtdG9vbGJhcj5cbiAgICAgIDwvYXBwLWhlYWRlcj5cblxuICAgICAgPGhhLWNvbmZpZy1zZWN0aW9uIGlzLXdpZGU9J1tbaXNXaWRlXV0nPlxuICAgICAgICA8cGFwZXItY2FyZCBoZWFkaW5nPSdEZXZpY2UgbmFtZSc+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nY2FyZC1jb250ZW50Jz5cbiAgICAgICAgICAgIFNldCBkZXZpY2UgbmFtZSBzbyB0aGF0IHlvdSBjYW4gcmVmZXJlbmNlIGl0IGluIHBlci1kZXZpY2Ugc2V0dGluZ3NcbiAgICAgICAgICAgIDxwYXBlci1pbnB1dFxuICAgICAgICAgICAgICBsYWJlbD0nTmFtZSdcbiAgICAgICAgICAgICAgdmFsdWU9J3t7bmFtZX19J1xuICAgICAgICAgICAgPjwvcGFwZXItaW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcGFwZXItY2FyZD5cbiAgICAgIDwvaGEtY29uZmlnLXNlY3Rpb24+XG4gICAgPC9hcHAtaGVhZGVyLWxheW91dD5cbiAgICBgO1xuICB9XG5cbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpc1dpZGU6IEJvb2xlYW4sXG5cbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBvYnNlcnZlcjogJ25hbWVDaGFuZ2VkJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJlYWR5KCkge1xuICAgIHN1cGVyLnJlYWR5KCk7XG4gICAgdGhpcy5uYW1lID0gd2luZG93LmN1c3RvbVVJLmdldE5hbWUoKTtcbiAgfVxuXG4gIG5hbWVDaGFuZ2VkKG5hbWUpIHtcbiAgICB3aW5kb3cuY3VzdG9tVUkuc2V0TmFtZShuYW1lKTtcbiAgfVxuXG4gIF9iYWNrSGFuZGxlcigpIHtcbiAgICB3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG4gICAgdGhpcy5maXJlKCdsb2NhdGlvbi1jaGFuZ2VkJyk7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaGEtY29uZmlnLWN1c3RvbS11aScsIEhhQ29uZmlnQ3VzdG9tVWkpO1xuIiwiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBIYVRoZW1lZFNsaWRlciBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlPlxuICAgICAgOmhvc3Qge1xuICAgICAgICBtYXJnaW46IHZhcigtLWhhLXRoZW1lZC1zbGlkZXItbWFyZ2luLCBpbml0aWFsKTtcbiAgICAgIH1cbiAgICAgIC5kaXNhYmxlLW9mZi13aGVuLW1pbiB7XG4gICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogIHZhcigtLXBhcGVyLXNsaWRlci1waW4tY29sb3IpO1xuICAgICAgfVxuXG4gICAgICAuZGlzYWJsZS1vZmYtd2hlbi1taW4uaXMtb24ge1xuICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcik7XG4gICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcik7XG4gICAgICB9XG4gICAgICBwYXBlci1zbGlkZXIge1xuICAgICAgICBtYXJnaW46IDRweCAwO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAgICAgIHdpZHRoOiB2YXIoLS1oYS1wYXBlci1zbGlkZXItd2lkdGgsIDIwMHB4KTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuXG4gICAgPHBhcGVyLXNsaWRlclxuICAgICAgICAgbWluPSdbW190aGVtZWRNaW5dXSdcbiAgICAgICAgIG1heD0nW1tfY29tcHV0ZUF0dHJpYnV0ZSh0aGVtZSwgXCJtYXhcIiwgbWF4KV1dJ1xuICAgICAgICAgcGluPSdbW19jb21wdXRlQXR0cmlidXRlKHRoZW1lLCBcInBpblwiLCBwaW4pXV0nXG4gICAgICAgICBjbGFzcyQ9J1tbY29tcHV0ZUNsYXNzKHRoZW1lLCBpc09uLCBfdGhlbWVkTWluKV1dJyB2YWx1ZT0nW1t2YWx1ZV1dJ1xuICAgICAgICAgb24tY2hhbmdlPSd2YWx1ZUNoYW5nZWQnPlxuICAgIDwvcGFwZXItc2xpZGVyPlxuICAgIGA7XG4gIH1cblxuICByZWFkeSgpIHtcbiAgICBzdXBlci5yZWFkeSgpO1xuICAgIHRoaXMuZGlzYWJsZU9mZldoZW5NaW4gPSAhdGhpcy5fY29tcHV0ZUF0dHJpYnV0ZSh0aGlzLnRoZW1lLCAnb2ZmX3doZW5fbWluJywgIXRoaXMuZGlzYWJsZU9mZldoZW5NaW4pO1xuICAgIHRoaXMuY29tcHV0ZUVuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCh0aGlzLnRoZW1lLCB0aGlzLmRpc2FibGVSZXBvcnRXaGVuTm90Q2hhbmdlZCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbjoge1xuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHZhbHVlOiAwLFxuICAgICAgfSxcbiAgICAgIG1heDoge1xuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHZhbHVlOiAxMDAsXG4gICAgICB9LFxuICAgICAgcGluOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBpc09uOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlT2ZmV2hlbk1pbjoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIG5vdGlmeTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlUmVwb3J0V2hlbk5vdENoYW5nZWQ6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcblxuICAgICAgdGhlbWU6IE9iamVjdCxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgbm90aWZ5OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIF90aGVtZWRNaW46IHtcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICBjb21wdXRlZDogJ19jb21wdXRlQXR0cmlidXRlKHRoZW1lLCBcIm1pblwiLCBtaW4pJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnY29tcHV0ZUVuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCh0aGVtZSwgZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkKScsXG4gICAgXTtcbiAgfVxuXG4gIGNvbXB1dGVFbmFibGVkVGhlbWVkUmVwb3J0V2hlbk5vdENoYW5nZWQodGhlbWUsIGRpc2FibGVSZXBvcnRXaGVuTm90Q2hhbmdlZCkge1xuICAgIHRoaXMuX2VuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCA9IHRoaXMuX2NvbXB1dGVBdHRyaWJ1dGUoXG4gICAgICB0aGVtZSwgJ3JlcG9ydF93aGVuX25vdF9jaGFuZ2VkJywgIWRpc2FibGVSZXBvcnRXaGVuTm90Q2hhbmdlZCk7XG4gIH1cblxuICBfY29tcHV0ZUF0dHJpYnV0ZSh0aGVtZSwgYXR0ciwgZGVmKSB7XG4gICAgaWYgKHRoZW1lKSB7XG4gICAgICBpZiAoYXR0ciBpbiB0aGVtZSkge1xuICAgICAgICByZXR1cm4gdGhlbWVbYXR0cl07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWY7XG4gIH1cblxuICBjb21wdXRlQ2xhc3ModGhlbWUsIGlzT24sIHRoZW1lZE1pbikge1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBpZiAoaXNPbikge1xuICAgICAgcmVzdWx0ICs9ICdpcy1vbiAnO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29tcHV0ZUF0dHJpYnV0ZSh0aGVtZSwgJ29mZl93aGVuX21pbicsICF0aGlzLmRpc2FibGVPZmZXaGVuTWluKSB8fCB0aGVtZWRNaW4gPT09IDApIHtcbiAgICAgIC8vIElmIG9mZldoZW5NaW4gaXMgZW5hYmxlZCBkb24ndCBjdXN0b21pemUuXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBgJHtyZXN1bHR9ZGlzYWJsZS1vZmYtd2hlbi1taW5gO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2VkKGV2KSB7XG4gICAgaWYgKCF0aGlzLl9lbmFibGVkVGhlbWVkUmVwb3J0V2hlbk5vdENoYW5nZWQgJiYgdGhpcy52YWx1ZSA9PT0gZXYudGFyZ2V0LnZhbHVlKSB7XG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IGV2LnRhcmdldC52YWx1ZTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdoYS10aGVtZWQtc2xpZGVyJywgSGFUaGVtZWRTbGlkZXIpO1xuIiwiaW1wb3J0IGFwcGx5VGhlbWVzT25FbGVtZW50IGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9kb20vYXBwbHlfdGhlbWVzX29uX2VsZW1lbnQuanMnO1xuaW1wb3J0IGNvbXB1dGVTdGF0ZURvbWFpbiBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzJztcbmltcG9ydCBkeW5hbWljQ29udGVudFVwZGF0ZXIgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9keW5hbWljX2NvbnRlbnRfdXBkYXRlci5qcyc7XG5pbXBvcnQgc3RhdGVDYXJkVHlwZSBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L3N0YXRlX2NhcmRfdHlwZS5qcyc7XG5cbmltcG9ydCAnLi4vdXRpbHMvaG9va3MuanMnO1xuaW1wb3J0ICcuL3N0YXRlLWNhcmQtd2l0aC1zbGlkZXIuanMnO1xuaW1wb3J0ICcuL3N0YXRlLWNhcmQtd2l0aG91dC1zbGlkZXIuanMnO1xuXG5jb25zdCBTSE9XX0xBU1RfQ0hBTkdFRF9CTEFDS0xJU1RFRF9DQVJEUyA9IFsnY29uZmlndXJhdG9yJ107XG5jb25zdCBET01BSU5fVE9fU0xJREVSX1NVUFBPUlQgPSB7XG4gIGxpZ2h0OiAxLCAvLyBTVVBQT1JUX0JSSUdIVE5FU1NcbiAgY292ZXI6IDQsIC8vIFNVUFBPUlRfU0VUX1BPU0lUSU9OXG4gIGNsaW1hdGU6IDEsIC8vIFNVUFBPUlRfVEFSR0VUX1RFTVBFUkFUVVJFXG59O1xuY29uc3QgVFlQRV9UT19DT05UUk9MID0ge1xuICB0b2dnbGU6ICdoYS1lbnRpdHktdG9nZ2xlJyxcbiAgZGlzcGxheTogJycsXG4gIGNvdmVyOiAnaGEtY292ZXItY29udHJvbHMnLFxufTtcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBTdGF0ZUNhcmRDdXN0b21VaSBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzczogT2JqZWN0LFxuXG4gICAgICBpbkRpYWxvZzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuXG4gICAgICBzdGF0ZU9iajogT2JqZWN0LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2lucHV0Q2hhbmdlZChoYXNzLCBpbkRpYWxvZywgc3RhdGVPYmopJyxcbiAgICBdO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICBpZiAoY29udGFpbmVyLnRhZ05hbWUgPT09ICdESVYnICYmXG4gICAgICAgIChjb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGF0ZScpIHx8IGNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2NoaWxkLWNhcmQnKSkpIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcblxuICAgICAgLy8gU2luY2UgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGNoYW5nZSB0aGUgYmFja2dyb3VuZCAtIG5vIG5lZWQgdG8gY2xlYXIgaXQuXG4gICAgICBjb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJywgJ3ZhcigtLXBhcGVyLWNhcmQtYmFja2dyb3VuZC1jb2xvciwgaW5oZXJpdCknKTtcblxuICAgICAgLy8gUG9seWZpbGwgJ3VwZGF0ZVN0eWxlcycuXG4gICAgICBpZiAoIWNvbnRhaW5lci51cGRhdGVTdHlsZXMpIHtcbiAgICAgICAgY29udGFpbmVyLnVwZGF0ZVN0eWxlcyA9IChzdHlsZXMpID0+IHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KGtleSwgc3R5bGVzW2tleV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pc0F0dGFjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmlucHV0Q2hhbmdlZCh0aGlzLmhhc3MsIHRoaXMuaW5EaWFsb2csIHRoaXMuc3RhdGVPYmopO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5faXNBdHRhY2hlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5lci51cGRhdGVTdHlsZXMoeyBkaXNwbGF5OiAnJywgbWFyZ2luOiAnJywgcGFkZGluZzogJycgfSk7XG4gICAgICBhcHBseVRoZW1lc09uRWxlbWVudChcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLCB0aGlzLmhhc3MudGhlbWVzIHx8IHsgZGVmYXVsdF90aGVtZTogJ2RlZmF1bHQnLCB0aGVtZXM6IHt9IH0sICdkZWZhdWx0Jyk7XG4gICAgICB0aGlzLl9jb250YWluZXIgPSBudWxsO1xuICAgIH1cbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgYmFkZ2VNb2RlKGhhc3MsIHN0YXRlT2JqLCBkb21haW4pIHtcbiAgICBjb25zdCBzdGF0ZXMgPSBbXTtcbiAgICBpZiAoZG9tYWluID09PSAnZ3JvdXAnKSB7XG4gICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzLmVudGl0eV9pZC5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGhhc3Muc3RhdGVzW2lkXTtcbiAgICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gSUQgJHtpZH0gaW4gZ3JvdXAgJHtzdGF0ZU9iai5lbnRpdHlfaWR9YCk7XG4gICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhdGVPYmouYXR0cmlidXRlcy5iYWRnZXNfbGlzdCB8fFxuICAgICAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlcy5iYWRnZXNfbGlzdC5pbmNsdWRlcyhzdGF0ZS5lbnRpdHlfaWQpKSB7XG4gICAgICAgICAgc3RhdGVzLnB1c2god2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0KFxuICAgICAgICAgICAgdGhpcywgc3RhdGUsIGZhbHNlIC8qIGluRGlhbG9nICovLCBmYWxzZSAvKiBhbGxvd0hpZGRlbiAqLykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVzLnB1c2goc3RhdGVPYmopO1xuICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snIH07XG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGF0ZScpKSB7XG4gICAgICAgICAgcGFyYW1zLm1hcmdpbiA9ICd2YXIoLS1oYS1iYWRnZXMtY2FyZC1tYXJnaW4sIDApJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhwYXJhbXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBkeW5hbWljQ29udGVudFVwZGF0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgJ0hBLUJBREdFUy1DQVJEJyxcbiAgICAgIHsgaGFzcywgc3RhdGVzIH0pO1xuICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5lci51cGRhdGVTdHlsZXMoe1xuICAgICAgICB3aWR0aDogJ3ZhcigtLWhhLWJhZGdlcy1jYXJkLXdpZHRoLCBpbml0aWFsKScsXG4gICAgICAgICd0ZXh0LWFsaWduJzogJ3ZhcigtLWhhLWJhZGdlcy1jYXJkLXRleHQtYWxpZ24sIGluaXRpYWwpJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxhc3RDaGlsZC5zdHlsZS5mb250U2l6ZSA9ICc4NSUnO1xuXG4gICAgLy8gU2luY2UgdGhpcyB2YXJpYWJsZSBvbmx5IGFmZmVjdHMgYmFkZ2VzIG1vZGUgLSBubyBuZWVkIHRvIGNsZWFuIGl0IHVwLlxuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0taGEtc3RhdGUtbGFiZWwtYmFkZ2UtbWFyZ2luLWJvdHRvbScsICcwJyk7XG4gIH1cblxuICBjbGVhbkJhZGdlU3R5bGUoKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgdGhpcy5fY29udGFpbmVyLnVwZGF0ZVN0eWxlcyh7XG4gICAgICAgIGRpc3BsYXk6ICcnLFxuICAgICAgICB3aWR0aDogJycsXG4gICAgICAgICd0ZXh0LWFsaWduJzogJycsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTdHlsZXMoeyBkaXNwbGF5OiAnJywgbWFyZ2luOiAnJyB9KTtcbiAgfVxuXG4gIGFwcGx5VGhlbWVzKGhhc3MsIG1vZGlmaWVkT2JqKSB7XG4gICAgbGV0IHRoZW1lVGFyZ2V0ID0gdGhpcztcbiAgICBsZXQgdGhlbWVOYW1lID0gJ2RlZmF1bHQnO1xuICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgIHRoZW1lVGFyZ2V0ID0gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZWRPYmouYXR0cmlidXRlcy50aGVtZSkge1xuICAgICAgdGhlbWVOYW1lID0gbW9kaWZpZWRPYmouYXR0cmlidXRlcy50aGVtZTtcbiAgICB9XG4gICAgYXBwbHlUaGVtZXNPbkVsZW1lbnQoXG4gICAgICB0aGVtZVRhcmdldCwgaGFzcy50aGVtZXMgfHwgeyBkZWZhdWx0X3RoZW1lOiAnZGVmYXVsdCcsIHRoZW1lczoge30gfSwgdGhlbWVOYW1lKTtcbiAgfVxuXG4gIG1heWJlSGlkZUVudGl0eShtb2RpZmllZE9iaikge1xuICAgIGlmICghbW9kaWZpZWRPYmopIHtcbiAgICAgIGlmICh0aGlzLmxhc3RDaGlsZCkge1xuICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMubGFzdENoaWxkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnVwZGF0ZVN0eWxlcyh7IG1hcmdpbjogJzAnLCBwYWRkaW5nOiAnMCcgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgdGhpcy5fY29udGFpbmVyLnVwZGF0ZVN0eWxlcyh7IG1hcmdpbjogJycsIHBhZGRpbmc6ICcnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzbGlkZXJFbGlnaWJsZV8oZG9tYWluLCBvYmosIGluRGlhbG9nKSB7XG4gICAgaWYgKGluRGlhbG9nKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIERPTUFJTl9UT19TTElERVJfU1VQUE9SVFtkb21haW5dICYmXG4gICAgICAoRE9NQUlOX1RPX1NMSURFUl9TVVBQT1JUW2RvbWFpbl0gJiBvYmouYXR0cmlidXRlcy5zdXBwb3J0ZWRfZmVhdHVyZXMpICYmXG4gICAgICBvYmouYXR0cmlidXRlcy5zdGF0ZV9jYXJkX21vZGUgJiYgb2JqLmF0dHJpYnV0ZXMuc3RhdGVfY2FyZF9tb2RlICE9PSAnbm8tc2xpZGVyJztcbiAgfVxuXG4gIGlucHV0Q2hhbmdlZChoYXNzLCBpbkRpYWxvZywgc3RhdGVPYmopIHtcbiAgICBpZiAoIXN0YXRlT2JqIHx8ICFoYXNzIHx8ICF0aGlzLl9pc0F0dGFjaGVkKSByZXR1cm47XG4gICAgY29uc3QgZG9tYWluID0gY29tcHV0ZVN0YXRlRG9tYWluKHN0YXRlT2JqKTtcbiAgICBjb25zdCBtb2RpZmllZE9iaiA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdChcbiAgICAgIHRoaXMsIHN0YXRlT2JqLCBpbkRpYWxvZywgdHJ1ZSAvKiBhbGxvd0hpZGRlbiAqLyk7XG5cbiAgICBpZiAodGhpcy5tYXliZUhpZGVFbnRpdHkobW9kaWZpZWRPYmopKSByZXR1cm47XG5cbiAgICB0aGlzLmFwcGx5VGhlbWVzKGhhc3MsIG1vZGlmaWVkT2JqKTtcblxuICAgIGlmICghaW5EaWFsb2cgJiYgbW9kaWZpZWRPYmouYXR0cmlidXRlcy5zdGF0ZV9jYXJkX21vZGUgPT09ICdiYWRnZXMnKSB7XG4gICAgICB0aGlzLmJhZGdlTW9kZShoYXNzLCBtb2RpZmllZE9iaiwgZG9tYWluKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWd1bGFyTW9kZV8oaGFzcywgaW5EaWFsb2csIG1vZGlmaWVkT2JqLCBkb21haW4pO1xuICAgIH1cbiAgfVxuXG4gIHJlZ3VsYXJNb2RlXyhoYXNzLCBpbkRpYWxvZywgc3RhdGVPYmosIGRvbWFpbikge1xuICAgIHRoaXMuY2xlYW5CYWRnZVN0eWxlKCk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBoYXNzLFxuICAgICAgc3RhdGVPYmosXG4gICAgICBpbkRpYWxvZyxcbiAgICB9O1xuICAgIGNvbnN0IG9yaWdpbmFsU3RhdGVDYXJkVHlwZSA9IHN0YXRlQ2FyZFR5cGUoaGFzcywgc3RhdGVPYmopO1xuICAgIGxldCBjdXN0b21TdGF0ZUNhcmRUeXBlO1xuICAgIGNvbnN0IHNlY29uZGFyeVN0YXRlQ2FyZFR5cGUgPSBzdGF0ZU9iai5hdHRyaWJ1dGVzLnN0YXRlX2NhcmRfY3VzdG9tX3VpX3NlY29uZGFyeTtcblxuICAgIGlmIChkb21haW4gPT09ICdsaWdodCcgJiYgdGhpcy5zbGlkZXJFbGlnaWJsZV8oZG9tYWluLCBzdGF0ZU9iaiwgaW5EaWFsb2cpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHBhcmFtcywge1xuICAgICAgICBjb250cm9sRWxlbWVudDogJ2hhLWVudGl0eS10b2dnbGUnLFxuICAgICAgICBzZXJ2aWNlTWluOiAndHVybl9vZmYnLFxuICAgICAgICBzZXJ2aWNlTWF4OiAndHVybl9vbicsXG4gICAgICAgIHZhbHVlTmFtZTogJ2JyaWdodG5lc3MnLFxuICAgICAgICBkb21haW4sXG4gICAgICB9KTtcbiAgICAgIGN1c3RvbVN0YXRlQ2FyZFR5cGUgPSAnc3RhdGUtY2FyZC13aXRoLXNsaWRlcic7XG4gICAgfSBlbHNlIGlmIChkb21haW4gPT09ICdjb3ZlcicgJiYgdGhpcy5zbGlkZXJFbGlnaWJsZV8oZG9tYWluLCBzdGF0ZU9iaiwgaW5EaWFsb2cpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHBhcmFtcywge1xuICAgICAgICBjb250cm9sRWxlbWVudDogJ2hhLWNvdmVyLWNvbnRyb2xzJyxcbiAgICAgICAgbWF4OiAxMDAsXG4gICAgICAgIHNlcnZpY2VNaW46ICdjbG9zZV9jb3ZlcicsXG4gICAgICAgIHNlcnZpY2VNYXg6ICdzZXRfY292ZXJfcG9zaXRpb24nLFxuICAgICAgICBzZXRWYWx1ZU5hbWU6ICdwb3NpdGlvbicsXG4gICAgICAgIHZhbHVlTmFtZTogJ2N1cnJlbnRfcG9zaXRpb24nLFxuICAgICAgICBuYW1lT246ICdvcGVuJyxcbiAgICAgICAgZG9tYWluLFxuICAgICAgfSk7XG4gICAgICBjdXN0b21TdGF0ZUNhcmRUeXBlID0gJ3N0YXRlLWNhcmQtd2l0aC1zbGlkZXInO1xuICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSAnY2xpbWF0ZScgJiYgdGhpcy5zbGlkZXJFbGlnaWJsZV8oZG9tYWluLCBzdGF0ZU9iaiwgaW5EaWFsb2cpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHBhcmFtcywge1xuICAgICAgICBjb250cm9sRWxlbWVudDogJ2hhLWNsaW1hdGUtc3RhdGUnLFxuICAgICAgICBtaW46IHN0YXRlT2JqLmF0dHJpYnV0ZXMubWluX3RlbXAgfHwgLTEwMCxcbiAgICAgICAgbWF4OiBzdGF0ZU9iai5hdHRyaWJ1dGVzLm1heF90ZW1wIHx8IDIwMCxcbiAgICAgICAgc2VydmljZU1pbjogJ3NldF90ZW1wZXJhdHVyZScsXG4gICAgICAgIHNlcnZpY2VNYXg6ICdzZXRfdGVtcGVyYXR1cmUnLFxuICAgICAgICB2YWx1ZU5hbWU6ICd0ZW1wZXJhdHVyZScsXG4gICAgICAgIG5hbWVPbjogJycsXG4gICAgICAgIGRvbWFpbixcbiAgICAgIH0pO1xuICAgICAgY3VzdG9tU3RhdGVDYXJkVHlwZSA9ICdzdGF0ZS1jYXJkLXdpdGgtc2xpZGVyJztcbiAgICB9IGVsc2UgaWYgKFRZUEVfVE9fQ09OVFJPTFtvcmlnaW5hbFN0YXRlQ2FyZFR5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5jb250cm9sRWxlbWVudCA9IFRZUEVfVE9fQ09OVFJPTFtvcmlnaW5hbFN0YXRlQ2FyZFR5cGVdO1xuICAgICAgY3VzdG9tU3RhdGVDYXJkVHlwZSA9ICdzdGF0ZS1jYXJkLXdpdGhvdXQtc2xpZGVyJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlT2JqLmF0dHJpYnV0ZXMuc2hvd19sYXN0X2NoYW5nZWQgJiZcbiAgICAgICAgICAgICAgICFTSE9XX0xBU1RfQ0hBTkdFRF9CTEFDS0xJU1RFRF9DQVJEUy5pbmNsdWRlcyhvcmlnaW5hbFN0YXRlQ2FyZFR5cGUpKSB7XG4gICAgICBwYXJhbXMuaW5EaWFsb2cgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoc3RhdGVPYmouc3RhdGUgPT09ICd1bmF2YWlsYWJsZScpIHtcbiAgICAgIHBhcmFtcy5jb250cm9sRWxlbWVudCA9ICcnO1xuICAgIH1cbiAgICBpZiAoc3RhdGVPYmouYXR0cmlidXRlcy5jb250cm9sX2VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLmNvbnRyb2xFbGVtZW50ID0gc3RhdGVPYmouYXR0cmlidXRlcy5jb250cm9sX2VsZW1lbnQ7XG4gICAgfVxuXG4gICAgZHluYW1pY0NvbnRlbnRVcGRhdGVyKFxuICAgICAgdGhpcyxcbiAgICAgIChzZWNvbmRhcnlTdGF0ZUNhcmRUeXBlIHx8IGN1c3RvbVN0YXRlQ2FyZFR5cGUgfHwgYFNUQVRFLUNBUkQtJHtvcmlnaW5hbFN0YXRlQ2FyZFR5cGV9YCkudG9VcHBlckNhc2UoKSxcbiAgICAgIHBhcmFtcyk7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc3RhdGUtY2FyZC1jdXN0b20tdWknLCBTdGF0ZUNhcmRDdXN0b21VaSk7XG4iLCJpbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvaHRtbC10YWcuanMnO1xuaW1wb3J0IEN1aUJhc2VFbGVtZW50IGZyb20gJy4vY3VpLWJhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgJy4vZHluYW1pYy13aXRoLWV4dHJhLmpzJztcbmltcG9ydCAnLi9oYS10aGVtZWQtc2xpZGVyLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBTdGF0ZUNhcmRXaXRoU2xpZGVyIGV4dGVuZHMgQ3VpQmFzZUVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgIDxzdHlsZSBpcz1cImN1c3RvbS1zdHlsZVwiIGluY2x1ZGU9XCJpcm9uLWZsZXggaXJvbi1mbGV4LWFsaWdubWVudCBpcm9uLWZsZXgtZmFjdG9yc1wiPjwvc3R5bGU+XG4gICAgPHN0eWxlPlxuICAgICAgI2NvbnRhaW5lciB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICAgIC5zZWNvbmQtbGluZSwgLnN0YXRlLWFuZC10b2dnbGUsIC5zdGF0ZS1pbmZvIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgICAgLm5vd3JhcCAuc3RhdGUtYW5kLXRvZ2dsZSB7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGZsZXgtZ3JvdzogMDtcbiAgICAgIH1cbiAgICAgIC5ub3dyYXAgLnNlY29uZC1saW5lIHtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgLnNlY29uZC1saW5lIHtcbiAgICAgICAgcGFkZGluZy10b3A6IDIwcHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxNnB4O1xuICAgICAgICBtYXJnaW4tdG9wOiAtMjBweDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogLTE2cHg7XG4gICAgICB9XG4gICAgICAuc3RyZXRjaCAuc2Vjb25kLWxpbmUsIC5zdHJldGNoIGhhLXRoZW1lZC1zbGlkZXIge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgLS1oYS1wYXBlci1zbGlkZXItd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAubm93cmFwIC5zdGF0ZS1pbmZvIHtcbiAgICAgICAgbWluLXdpZHRoOiBpbml0aWFsO1xuICAgICAgfVxuICAgICAgaGEtdGhlbWVkLXNsaWRlciwgLnRvcC13cmFwcGVyIHtcbiAgICAgICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgICAgLnRvcC13cmFwcGVyLnN0cmV0Y2gge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cblxuICAgICAgLmhpZGRlbiB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cblxuICAgIDxkaXYgaWQ9J2NvbnRhaW5lcicgY2xhc3MkPSdob3Jpem9udGFsIGxheW91dCBmbGV4IHRvcC13cmFwcGVyIFtbX2NvbXB1dGVXcmFwQ2xhc3MobW9kZSwgc3RyZXRjaFNsaWRlciwgbGluZVRvb0xvbmcsIGluRGlhbG9nKV1dJz5cbiAgICAgIDxkaXYgY2xhc3M9J2hvcml6b250YWwgbGF5b3V0IGp1c3RpZmllZCBmbGV4LWF1dG8gc3RhdGUtYW5kLXRvZ2dsZSc+XG4gICAgICAgIDxzdGF0ZS1pbmZvIGNsYXNzPSdzdGF0ZS1pbmZvJyBzdGF0ZS1vYmo9J1tbc3RhdGVPYmpdXScgaW4tZGlhbG9nPSdbW3Nob3dMYXN0Q2hhbmdlZChzdGF0ZU9iaiwgaW5EaWFsb2csIGV4dHJhKV1dJyBzZWNvbmRhcnktbGluZSQ9J1tbaGFzRXh0cmEoZXh0cmEpXV0nIGNsYXNzPSdmbGV4LWF1dG8nPlxuICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLXJlcGVhdCcgaXRlbXM9J1tbZXh0cmFdXSc+XG4gICAgICAgICAgICA8ZGl2PltbaXRlbV1dPC9kaXY+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9zdGF0ZS1pbmZvPlxuICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbYnJlYWtTbGlkZXJdXScgY2xhc3M9J2hpZGRlbic+XG4gICAgICAgICAgPGR5bmFtaWMtd2l0aC1leHRyYSBoYXNzPSdbW2hhc3NdXScgc3RhdGUtb2JqPSdbW3N0YXRlT2JqXV0nIGNvbnRyb2wtZWxlbWVudD0nW1tjb250cm9sRWxlbWVudF1dJyBpbi1kaWFsb2c9J1tbaW5EaWFsb2ddXSc+PC9keW5hbWljLXdpdGgtZXh0cmE+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tzaG93U2xpZGVyXV0nIHJlc3RhbXA+XG4gICAgICAgIDxkaXYgY2xhc3M9J2hvcml6b250YWwgbGF5b3V0IGZsZXgtYXV0byBlbmQtanVzdGlmaWVkIHNlY29uZC1saW5lJz5cbiAgICAgICAgICA8aGEtdGhlbWVkLXNsaWRlclxuICAgICAgICAgICAgaWQ9J3NsaWRlcidcbiAgICAgICAgICAgIG1heD1bW21heF1dXG4gICAgICAgICAgICBtaW49W1ttaW5dXVxuICAgICAgICAgICAgdGhlbWU9J1tbc3RhdGVPYmouYXR0cmlidXRlcy5zbGlkZXJfdGhlbWVdXSdcbiAgICAgICAgICAgIGlzLW9uPSdbW2lzT24oc3RhdGVPYmosIG5hbWVPbildXSdcbiAgICAgICAgICAgIHZhbHVlPSd7e3NsaWRlclZhbHVlfX0nXG4gICAgICAgICAgICBkaXNhYmxlLW9mZi13aGVuLW1pbj0ne3tkaXNhYmxlT2ZmV2hlbk1pbn19J1xuICAgICAgICAgICAgb24tY2hhbmdlPSdzbGlkZXJDaGFuZ2VkJ1xuICAgICAgICAgICAgb24tY2xpY2s9J3N0b3BQcm9wYWdhdGlvbic+XG4gICAgICAgICAgPC9oYS10aGVtZWQtc2xpZGVyPlxuICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1shYnJlYWtTbGlkZXJdXSc+XG4gICAgICAgICAgICA8ZHluYW1pYy13aXRoLWV4dHJhIGhhc3M9J1tbaGFzc11dJyBzdGF0ZS1vYmo9J1tbc3RhdGVPYmpdXScgY29udHJvbC1lbGVtZW50PSdbW2NvbnRyb2xFbGVtZW50XV0nIGluLWRpYWxvZz0nW1tpbkRpYWxvZ11dJz48L2R5bmFtaWMtd2l0aC1leHRyYT5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZG9tYWluOiBTdHJpbmcsXG4gICAgICBzZXJ2aWNlTWluOiBTdHJpbmcsXG4gICAgICBzZXJ2aWNlTWF4OiBTdHJpbmcsXG4gICAgICB2YWx1ZU5hbWU6IFN0cmluZyxcbiAgICAgIHNldFZhbHVlTmFtZTogU3RyaW5nLFxuICAgICAgbmFtZU9uOiB7IHR5cGU6IFN0cmluZywgdmFsdWU6ICdvbicgfSxcbiAgICAgIG1pbjogeyB0eXBlOiBOdW1iZXIsIHZhbHVlOiAwIH0sXG4gICAgICBtYXg6IHsgdHlwZTogTnVtYmVyLCB2YWx1ZTogMjU1IH0sXG5cbiAgICAgIHNsaWRlclZhbHVlOiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgdmFsdWU6IDAsXG4gICAgICB9LFxuICAgICAgZGlzYWJsZU9mZldoZW5NaW46IEJvb2xlYW4sXG4gICAgICBtb2RlOiBTdHJpbmcsXG4gICAgICBzdHJldGNoU2xpZGVyOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBicmVha1NsaWRlcjoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgaGlkZVNsaWRlcjoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgbGluZVRvb0xvbmc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG1pbkxpbmVCcmVhazogTnVtYmVyLFxuICAgICAgbWF4TGluZUJyZWFrOiBOdW1iZXIsXG4gICAgICBzaG93U2xpZGVyOiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgY29tcHV0ZWQ6ICdfc2hvd1NsaWRlcihpbkRpYWxvZywgc3RhdGVPYmosIGhpZGVTbGlkZXIpJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJlYWR5KCkge1xuICAgIHN1cGVyLnJlYWR5KCk7XG4gICAgdGhpcy5fb25Jcm9uUmVzaXplID0gdGhpcy5fb25Jcm9uUmVzaXplLmJpbmQodGhpcyk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fb25Jcm9uUmVzaXplKTtcbiAgICB0aGlzLl93YWl0Rm9yTGF5b3V0KCk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fb25Jcm9uUmVzaXplKTtcbiAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3N0YXRlT2JqQ2hhbmdlZChzdGF0ZU9iaiwgbmFtZU9uLCB2YWx1ZU5hbWUpJyxcbiAgICBdO1xuICB9XG5cbiAgX3dhaXRGb3JMYXlvdXQoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0Nvbm5lY3RlZCkgcmV0dXJuO1xuICAgIHRoaXMuX3NldE1vZGUoKTtcbiAgICBpZiAodGhpcy5fZnJhbWVJZCkgcmV0dXJuO1xuICAgIHRoaXMucmVhZHlUb0NvbXB1dGUgPSBmYWxzZTtcbiAgICB0aGlzLl9mcmFtZUlkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcbiAgICAgIHRoaXMucmVhZHlUb0NvbXB1dGUgPSB0cnVlO1xuICAgICAgdGhpcy5fb25Jcm9uUmVzaXplKCk7XG4gICAgfSk7XG4gIH1cblxuICBfc2V0TW9kZSgpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBoaWRlU2xpZGVyOiB0aGlzLm1vZGUgPT09ICdoaWRlLXNsaWRlcicgJiYgdGhpcy5saW5lVG9vTG9uZyxcbiAgICAgIGJyZWFrU2xpZGVyOlxuICAgICAgICAgICAodGhpcy5tb2RlID09PSAnYnJlYWstc2xpZGVyJyB8fCB0aGlzLm1vZGUgPT09ICdoaWRlLXNsaWRlcicpICYmXG4gICAgICAgICAgIHRoaXMubGluZVRvb0xvbmcsXG4gICAgfTtcbiAgICBpZiAoIXRoaXMuc2hvd1NsaWRlcikge1xuICAgICAgb2JqLmJyZWFrU2xpZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0aWVzKG9iaik7XG4gIH1cblxuICBfb25Jcm9uUmVzaXplKCkge1xuICAgIGlmICghdGhpcy5yZWFkeVRvQ29tcHV0ZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICduby1zbGlkZXInKSB7XG4gICAgICB0aGlzLnNldFByb3BlcnRpZXMoe1xuICAgICAgICBoaWRlU2xpZGVyOiB0cnVlLFxuICAgICAgICBicmVha1NsaWRlcjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2QnJlYWtTbGlkZXIgPSB0aGlzLmJyZWFrU2xpZGVyO1xuICAgIGNvbnN0IHByZXZIaWRlU2xpZGVyID0gdGhpcy5oaWRlU2xpZGVyO1xuICAgIHRoaXMuc2V0UHJvcGVydGllcyh7XG4gICAgICBsaW5lVG9vTG9uZzogZmFsc2UsXG4gICAgICBoaWRlU2xpZGVyOiBmYWxzZSxcbiAgICAgIGJyZWFrU2xpZGVyOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGhpcy4kO1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgIGlmIChjb250YWluZXJXaWR0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGlmIChjb250YWluZXJXaWR0aCA8PSB0aGlzLm1pbkxpbmVCcmVhaykge1xuICAgICAgdGhpcy5saW5lVG9vTG9uZyA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChjb250YWluZXJXaWR0aCA+PSB0aGlzLm1heExpbmVCcmVhaykge1xuICAgICAgdGhpcy5saW5lVG9vTG9uZyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldkhpZGVTbGlkZXIgJiYgdGhpcy5tb2RlID09PSAnaGlkZS1zbGlkZXInKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdW5oaWRlIHRoZSBzbGlkZXIgaW4gb3JkZXIgdG8gcmVjYWxjdWxhdGUgaGVpZ2h0LlxuICAgICAgICB0aGlzLl93YWl0Rm9yTGF5b3V0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBzdGF0ZUhlaWdodCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuc3RhdGUtaW5mbycpLmNsaWVudEhlaWdodDtcbiAgICAgIHRoaXMubGluZVRvb0xvbmcgPSBjb250YWluZXJIZWlnaHQgPiBzdGF0ZUhlaWdodCAqIDEuNTtcbiAgICAgIGlmICh0aGlzLmxpbmVUb29Mb25nKSB7XG4gICAgICAgIHRoaXMubWluTGluZUJyZWFrID0gY29udGFpbmVyV2lkdGg7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2QnJlYWtTbGlkZXIpIHtcbiAgICAgICAgdGhpcy5tYXhMaW5lQnJlYWsgPSBjb250YWluZXJXaWR0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc2V0TW9kZSgpO1xuICB9XG5cbiAgX2NvbXB1dGVXcmFwQ2xhc3MobW9kZSwgc3RyZXRjaFNsaWRlciwgbGluZVRvb0xvbmcsIGluRGlhbG9nKSB7XG4gICAgaWYgKGluRGlhbG9nKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAnc2luZ2xlLWxpbmUnKSB7XG4gICAgICByZXR1cm4gJ25vd3JhcCc7XG4gICAgfVxuICAgIGlmIChzdHJldGNoU2xpZGVyICYmIGxpbmVUb29Mb25nKSB7XG4gICAgICByZXR1cm4gJ3N0cmV0Y2ggd3JhcCc7XG4gICAgfVxuICAgIHJldHVybiAnd3JhcCc7XG4gIH1cblxuICBfc2hvd1NsaWRlcihpbkRpYWxvZywgc3RhdGVPYmosIGhpZGVTbGlkZXIpIHtcbiAgICBpZiAoaW5EaWFsb2cgfHwgaGlkZVNsaWRlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNsaWRlckNoYW5nZWQoZXYpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGV2LnRhcmdldC52YWx1ZSwgMTApO1xuICAgIGNvbnN0IHBhcmFtID0geyBlbnRpdHlfaWQ6IHRoaXMuc3RhdGVPYmouZW50aXR5X2lkIH07XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNzbGlkZXInKTtcbiAgICBpZiAoZXYudGFyZ2V0ICE9PSB0YXJnZXQpIHtcbiAgICAgIC8vIE5vIFNoYWRvdyBET00gLSB3ZSBoYXZlIGFjY2VzcyB0byBvcmlnaW5hbCB0YXJnZXQuXG4gICAgICAoeyB0YXJnZXQgfSA9IGV2KTtcbiAgICB9IGVsc2UgaWYgKGV2LnBhdGgpIHtcbiAgICAgIFt0YXJnZXRdID0gZXYucGF0aDtcbiAgICB9IGVsc2UgaWYgKGV2LmNvbXBvc2VkUGF0aCkge1xuICAgICAgW3RhcmdldF0gPSBldi5jb21wb3NlZFBhdGgoKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAwIHx8ICh2YWx1ZSA8PSB0YXJnZXQubWluICYmICF0aGlzLmRpc2FibGVPZmZXaGVuTWluKSkge1xuICAgICAgdGhpcy5oYXNzLmNhbGxTZXJ2aWNlKHRoaXMuZG9tYWluLCB0aGlzLnNlcnZpY2VNaW4sIHBhcmFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1bdGhpcy5zZXRWYWx1ZU5hbWUgfHwgdGhpcy52YWx1ZU5hbWVdID0gdmFsdWU7XG4gICAgICB0aGlzLmhhc3MuY2FsbFNlcnZpY2UodGhpcy5kb21haW4sIHRoaXMuc2VydmljZU1heCwgcGFyYW0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlT2JqQ2hhbmdlZChzdGF0ZU9iaiwgbmFtZU9uLCB2YWx1ZU5hbWUpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBzbGlkZXJWYWx1ZTogdGhpcy5pc09uKHN0YXRlT2JqLCBuYW1lT24pID8gc3RhdGVPYmouYXR0cmlidXRlc1t2YWx1ZU5hbWVdIDogMCxcbiAgICB9O1xuICAgIGlmIChzdGF0ZU9iaikge1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHtcbiAgICAgICAgbWluTGluZUJyZWFrOiAwLFxuICAgICAgICBtYXhMaW5lQnJlYWs6IDk5OSxcbiAgICAgICAgaGlkZVNsaWRlcjogZmFsc2UsXG4gICAgICAgIGJyZWFrU2xpZGVyOiBmYWxzZSxcbiAgICAgICAgbGluZVRvb0xvbmc6IGZhbHNlLFxuICAgICAgICBtb2RlOiBzdGF0ZU9iai5hdHRyaWJ1dGVzLnN0YXRlX2NhcmRfbW9kZSxcbiAgICAgICAgc3RyZXRjaFNsaWRlcjogISFzdGF0ZU9iai5hdHRyaWJ1dGVzLnN0cmV0Y2hfc2xpZGVyLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydGllcyhvYmopO1xuICAgIGlmIChzdGF0ZU9iaikge1xuICAgICAgdGhpcy5fd2FpdEZvckxheW91dCgpO1xuICAgIH1cbiAgfVxuXG4gIGlzT24oc3RhdGVPYmosIG5hbWVPbikge1xuICAgIHJldHVybiBzdGF0ZU9iaiAmJiAoIW5hbWVPbiB8fCBzdGF0ZU9iai5zdGF0ZSA9PT0gbmFtZU9uKTtcbiAgfVxuXG4gIHN0b3BQcm9wYWdhdGlvbihldikge1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3N0YXRlLWNhcmQtd2l0aC1zbGlkZXInLCBTdGF0ZUNhcmRXaXRoU2xpZGVyKTtcbiIsImltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9odG1sLXRhZy5qcyc7XG5pbXBvcnQgQ3VpQmFzZUVsZW1lbnQgZnJvbSAnLi9jdWktYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCAnLi9keW5hbWljLXdpdGgtZXh0cmEuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIFN0YXRlQ2FyZFdpdGhvdXRTbGlkZXIgZXh0ZW5kcyBDdWlCYXNlRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlIGlzPVwiY3VzdG9tLXN0eWxlXCIgaW5jbHVkZT1cImlyb24tZmxleCBpcm9uLWZsZXgtYWxpZ25tZW50XCI+PC9zdHlsZT5cbiAgICA8c3R5bGU+XG4gICAgICAjY29udGFpbmVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG5cbiAgICA8ZGl2IGlkPSdjb250YWluZXInIGNsYXNzPSdob3Jpem9udGFsIGxheW91dCBqdXN0aWZpZWQnPlxuICAgICAgPHN0YXRlLWluZm9cbiAgICAgICAgICBjbGFzcz0nc3RhdGUtaW5mbydcbiAgICAgICAgICBzdGF0ZS1vYmo9J1tbc3RhdGVPYmpdXSdcbiAgICAgICAgICBpbi1kaWFsb2c9J1tbc2hvd0xhc3RDaGFuZ2VkKHN0YXRlT2JqLCBpbkRpYWxvZywgZXh0cmEpXV0nXG4gICAgICAgICAgc2Vjb25kYXJ5LWxpbmUkPSdbW2hhc0V4dHJhKGV4dHJhKV1dJz5cbiAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20tcmVwZWF0JyBpdGVtcz0nW1tleHRyYV1dJz5cbiAgICAgICAgICA8ZGl2PltbaXRlbV1dPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3N0YXRlLWluZm8+XG4gICAgICA8ZHluYW1pYy13aXRoLWV4dHJhXG4gICAgICAgICAgaGFzcz0nW1toYXNzXV0nXG4gICAgICAgICAgc3RhdGUtb2JqPSdbW3N0YXRlT2JqXV0nXG4gICAgICAgICAgY29udHJvbC1lbGVtZW50PSdbW2NvbnRyb2xFbGVtZW50XV0nXG4gICAgICAgICAgaW4tZGlhbG9nPSdbW2luRGlhbG9nXV0nPlxuICAgICAgPC9keW5hbWljLXdpdGgtZXh0cmE+XG4gICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdzdGF0ZS1jYXJkLXdpdGhvdXQtc2xpZGVyJywgU3RhdGVDYXJkV2l0aG91dFNsaWRlcik7XG4iLCIvLyBQb2x5bWVyIGxlZ2FjeSBldmVudCBoZWxwZXJzIHVzZWQgY291cnRlc3kgb2YgdGhlIFBvbHltZXIgcHJvamVjdC5cbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbi8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbi8vIG1ldDpcbi8vXG4vLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4vLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbi8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJcbi8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbi8vIGRpc3RyaWJ1dGlvbi5cbi8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbi8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4vL1xuLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuLy8gXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbi8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuXG5leHBvcnQgZGVmYXVsdCAoc3VwZXJDbGFzcykgPT4ge1xuICAvKipcbiAgICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAgICovXG4gIGNsYXNzIEV2ZW50c01peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS5cbiAgICAgKiBAcGFyYW0geyo9fSBkZXRhaWwgRGV0YWlsIHZhbHVlIGNvbnRhaW5pbmcgZXZlbnQtc3BlY2lmaWNcbiAgICAgKiAgIHBheWxvYWQuXG4gICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fVxuICAgICAqICBvcHRpb25zIE9iamVjdCBzcGVjaWZ5aW5nIG9wdGlvbnMuICBUaGVzZSBtYXkgaW5jbHVkZTpcbiAgICAgKiAgYGJ1YmJsZXNgIChib29sZWFuLCBkZWZhdWx0cyB0byBgdHJ1ZWApLFxuICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kXG4gICAgICogIGBub2RlYCBvbiB3aGljaCB0byBmaXJlIHRoZSBldmVudCAoSFRNTEVsZW1lbnQsIGRlZmF1bHRzIHRvIGB0aGlzYCkuXG4gICAgICogQHJldHVybiB7RXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuXG4gICAgICovXG4gICAgZmlyZSh0eXBlLCBkZXRhaWwgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCh0eXBlLCB7XG4gICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcyxcbiAgICAgICAgY2FuY2VsYWJsZTogQm9vbGVhbihvcHRpb25zLmNhbmNlbGFibGUpLFxuICAgICAgICBjb21wb3NlZDogb3B0aW9ucy5jb21wb3NlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuY29tcG9zZWQsXG4gICAgICB9KTtcbiAgICAgIGV2ZW50LmRldGFpbCA9IGRldGFpbDtcbiAgICAgIGNvbnN0IG5vZGUgPSBvcHRpb25zLm5vZGUgfHwgdGhpcztcbiAgICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBFdmVudHNNaXhpbjtcbn07XG4iLCJpbXBvcnQgYXBwbHlUaGVtZXNPbkVsZW1lbnQgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9hcHBseV90aGVtZXNfb25fZWxlbWVudC5qcyc7XG5pbXBvcnQgY29tcHV0ZVN0YXRlRG9tYWluIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9lbnRpdHkvY29tcHV0ZV9zdGF0ZV9kb21haW4uanMnO1xuaW1wb3J0IGdldFZpZXdFbnRpdGllcyBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2dldF92aWV3X2VudGl0aWVzLmpzJztcblxuaW1wb3J0ICcuLi9lbGVtZW50cy9oYS1jb25maWctY3VzdG9tLXVpLmpzJztcbmltcG9ydCBWRVJTSU9OIGZyb20gJy4vdmVyc2lvbi5qcyc7XG5cbndpbmRvdy5jdXN0b21VSSA9IHdpbmRvdy5jdXN0b21VSSB8fCB7XG4gIFNVUFBPUlRFRF9TTElERVJfTU9ERVM6IFtcbiAgICAnc2luZ2xlLWxpbmUnLCAnYnJlYWstc2xpZGVyJywgJ2JyZWFrLXNsaWRlci10b2dnbGUnLCAnaGlkZS1zbGlkZXInLCAnbm8tc2xpZGVyJyxcbiAgXSxcblxuICBkb21Ib3N0KGVsZW0pIHtcbiAgICBpZiAoZWxlbSA9PT0gZG9jdW1lbnQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJvb3QgPSBlbGVtLmdldFJvb3ROb2RlKCk7XG4gICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDtcbiAgfSxcblxuICBsaWdodE9yU2hhZG93KGVsZW0sIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIGVsZW0uc2hhZG93Um9vdCA/XG4gICAgICBlbGVtLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgOlxuICAgICAgZWxlbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfSxcblxuICBnZXRFbGVtZW50SGllcmFyY2h5KHJvb3QsIGhpZXJhcmNoeSkge1xuICAgIGlmIChyb290ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBlbGVtID0gaGllcmFyY2h5LnNoaWZ0KCk7XG4gICAgaWYgKGVsZW0pIHtcbiAgICAgIHJldHVybiB3aW5kb3cuY3VzdG9tVUkuZ2V0RWxlbWVudEhpZXJhcmNoeShcbiAgICAgICAgd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3cocm9vdCwgZWxlbSksIGhpZXJhcmNoeSk7XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9LFxuXG4gIGdldENvbnRleHQoZWxlbSkge1xuICAgIGlmIChlbGVtLl9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVsZW0uX2NvbnRleHQgPSBbXTtcbiAgICAgIGZvciAobGV0IGVsZW1lbnQgPSAoZWxlbS50YWdOYW1lID09PSAnSEEtRU5USVRJRVMtQ0FSRCcgPyB3aW5kb3cuY3VzdG9tVUkuZG9tSG9zdChlbGVtKSA6IGVsZW0pO1xuICAgICAgICBlbGVtZW50OyBlbGVtZW50ID0gd2luZG93LmN1c3RvbVVJLmRvbUhvc3QoZWxlbWVudCkpIHtcbiAgICAgICAgc3dpdGNoIChlbGVtZW50LnRhZ05hbWUpIHtcbiAgICAgICAgICBjYXNlICdIQS1FTlRJVElFUy1DQVJEJzpcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmdyb3VwRW50aXR5KSB7XG4gICAgICAgICAgICAgIGVsZW0uX2NvbnRleHQucHVzaChlbGVtZW50Lmdyb3VwRW50aXR5LmVudGl0eV9pZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ3JvdXBFbnRpdHkgPT09IGZhbHNlICYmIGVsZW1lbnQuc3RhdGVzICYmIGVsZW1lbnQuc3RhdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBlbGVtLl9jb250ZXh0LnB1c2goYGdyb3VwLiR7Y29tcHV0ZVN0YXRlRG9tYWluKGVsZW1lbnQuc3RhdGVzWzBdKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ01PUkUtSU5GTy1HUk9VUCc6XG4gICAgICAgICAgY2FzZSAnU1RBVEUtQ0FSRC1DT05URU5UJzpcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnN0YXRlT2JqKSB7XG4gICAgICAgICAgICAgIGVsZW0uX2NvbnRleHQucHVzaChlbGVtZW50LnN0YXRlT2JqLmVudGl0eV9pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdIQS1DQVJEUyc6XG4gICAgICAgICAgICBlbGVtLl9jb250ZXh0LnB1c2goZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlldycpIHx8ICdkZWZhdWx0X3ZpZXcnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIG5vIGRlZmF1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxlbS5fY29udGV4dC5yZXZlcnNlKCk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtLl9jb250ZXh0O1xuICB9LFxuXG4gIGZpbmRNYXRjaChrZXksIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybiBudWxsO1xuICAgIGlmIChvcHRpb25zW2tleV0pIHJldHVybiBrZXk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZpbmQob3B0aW9uID0+IGtleS5tYXRjaChgXiR7b3B0aW9ufSRgKSk7XG4gIH0sXG5cbiAgbWF5YmVDaGFuZ2VPYmplY3RCeURldmljZShzdGF0ZU9iaikge1xuICAgIGNvbnN0IG5hbWUgPSB3aW5kb3cuY3VzdG9tVUkuZ2V0TmFtZSgpO1xuICAgIGlmICghbmFtZSkgcmV0dXJuIHN0YXRlT2JqO1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5maW5kTWF0Y2gobmFtZSwgc3RhdGVPYmouYXR0cmlidXRlcy5kZXZpY2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBzdGF0ZU9iajtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGVPYmouYXR0cmlidXRlcy5kZXZpY2VbbWF0Y2hdKTtcblxuICAgIGlmICghT2JqZWN0LmtleXMoYXR0cmlidXRlcykubGVuZ3RoKSByZXR1cm4gc3RhdGVPYmo7XG4gICAgcmV0dXJuIHdpbmRvdy5jdXN0b21VSS5hcHBseUF0dHJpYnV0ZXMoc3RhdGVPYmosIGF0dHJpYnV0ZXMpO1xuICB9LFxuXG4gIG1heWJlQ2hhbmdlT2JqZWN0QnlHcm91cChlbGVtLCBzdGF0ZU9iaikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB3aW5kb3cuY3VzdG9tVUkuZ2V0Q29udGV4dChlbGVtKTtcbiAgICBpZiAoIWNvbnRleHQpIHJldHVybiBzdGF0ZU9iajtcblxuICAgIGlmICghc3RhdGVPYmouYXR0cmlidXRlcy5ncm91cCkge1xuICAgICAgcmV0dXJuIHN0YXRlT2JqO1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgY29udGV4dC5mb3JFYWNoKChjKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZmluZE1hdGNoKGMsIHN0YXRlT2JqLmF0dHJpYnV0ZXMuZ3JvdXApO1xuICAgICAgaWYgKHN0YXRlT2JqLmF0dHJpYnV0ZXMuZ3JvdXBbbWF0Y2hdKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgc3RhdGVPYmouYXR0cmlidXRlcy5ncm91cFttYXRjaF0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5sZW5ndGgpIHJldHVybiBzdGF0ZU9iajtcblxuICAgIHJldHVybiB3aW5kb3cuY3VzdG9tVUkuYXBwbHlBdHRyaWJ1dGVzKHN0YXRlT2JqLCBhdHRyaWJ1dGVzKTtcbiAgfSxcblxuICBfc2V0S2VlcChvYmosIHZhbHVlKSB7XG4gICAgaWYgKG9iai5fY3VpX2tlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JqLl9jdWlfa2VlcCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmouX2N1aV9rZWVwID0gb2JqLl9jdWlfa2VlcCAmJiB2YWx1ZTtcbiAgICB9XG4gIH0sXG5cbiAgbWF5YmVBcHBseVRlbXBsYXRlQXR0cmlidXRlcyhoYXNzLCBzdGF0ZXMsIHN0YXRlT2JqLCBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGVzLnRlbXBsYXRlcykge1xuICAgICAgd2luZG93LmN1c3RvbVVJLl9zZXRLZWVwKHN0YXRlT2JqLCB0cnVlKTtcbiAgICAgIHJldHVybiBzdGF0ZU9iajtcbiAgICB9XG4gICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IHt9O1xuICAgIGxldCBoYXNHbG9iYWwgPSBmYWxzZTtcbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMudGVtcGxhdGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXR0cmlidXRlcy50ZW1wbGF0ZXNba2V5XTtcbiAgICAgIGlmICh0ZW1wbGF0ZS5tYXRjaCgvXFxiKGVudGl0aWVzfGhhc3MpXFxiLykpIHtcbiAgICAgICAgaGFzR2xvYmFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gd2luZG93LmN1c3RvbVVJLmNvbXB1dGVUZW1wbGF0ZShcbiAgICAgICAgdGVtcGxhdGUsIGhhc3MsIHN0YXRlcywgc3RhdGVPYmosIGF0dHJpYnV0ZXMsXG4gICAgICAgIChzdGF0ZU9iai51bnRlbXBsYXRlZF9hdHRyaWJ1dGVzICYmIHN0YXRlT2JqLnVudGVtcGxhdGVkX2F0dHJpYnV0ZXNba2V5XSkgfHxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNba2V5XSxcbiAgICAgICAgc3RhdGVPYmoudW50ZW1wbGF0ZWRfc3RhdGUgfHwgc3RhdGVPYmouc3RhdGUpO1xuICAgICAgLy8gSW4gY2FzZSBvZiBudWxsIGRvbid0IHNldCB0aGUgdmFsdWUuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybjtcbiAgICAgIG5ld0F0dHJpYnV0ZXNba2V5XSA9IHZhbHVlO1xuICAgICAgaWYgKGtleSA9PT0gJ3N0YXRlJykge1xuICAgICAgICBpZiAodmFsdWUgIT09IHN0YXRlT2JqLnN0YXRlKSB7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX3N0YXRlRGlzcGxheScpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBzdGF0ZU9iai5fc3RhdGVEaXNwbGF5KSB7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IGF0dHJpYnV0ZXNba2V5XSkge1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuY3VzdG9tVUkuX3NldEtlZXAoc3RhdGVPYmosICFoYXNHbG9iYWwpO1xuICAgIGlmICghaGFzQ2hhbmdlcykge1xuICAgICAgcmV0dXJuIHN0YXRlT2JqO1xuICAgIH1cbiAgICBpZiAoc3RhdGVPYmouYXR0cmlidXRlcyA9PT0gYXR0cmlidXRlcykge1xuICAgICAgLy8gV2UgYXJlIG9wZXJhdGluZyBvbiByZWFsIGF0dHJpYnV0ZXMuIFJlcGxhY2UgdGhlbS5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHdpbmRvdy5jdXN0b21VSS5hcHBseUF0dHJpYnV0ZXMoc3RhdGVPYmosIG5ld0F0dHJpYnV0ZXMpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXdBdHRyaWJ1dGVzLCAnc3RhdGUnKSkge1xuICAgICAgICBpZiAobmV3QXR0cmlidXRlcy5zdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdC5zdGF0ZSA9IFN0cmluZyhuZXdBdHRyaWJ1dGVzLnN0YXRlKTtcbiAgICAgICAgICByZXN1bHQudW50ZW1wbGF0ZWRfc3RhdGUgPSBzdGF0ZU9iai5zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXdBdHRyaWJ1dGVzLCAnX3N0YXRlRGlzcGxheScpKSB7XG4gICAgICAgIHJlc3VsdC5fc3RhdGVEaXNwbGF5ID0gbmV3QXR0cmlidXRlcy5fc3RhdGVEaXNwbGF5O1xuICAgICAgICByZXN1bHQudW50ZW1wbGF0ZWRfc3RhdGVEaXNwbGF5ID0gc3RhdGVPYmouX3N0YXRlRGlzcGxheTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5jdXN0b21VSS5fc2V0S2VlcChyZXN1bHQsICFoYXNHbG9iYWwpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gT3BlcmF0aW5nIG9uIGNvbnRleHQtYXdhcmUgYXR0cmlidXRlcy4gUmV0dXJuIHNoYWxsb3cgY29weSBvZiBvYmplY3QuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlT2JqKTtcbiAgfSxcblxuICBtYXliZUFwcGx5VGVtcGxhdGVzKGhhc3MsIHN0YXRlcywgc3RhdGVPYmopIHtcbiAgICBjb25zdCBuZXdSZXN1bHQgPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVBcHBseVRlbXBsYXRlQXR0cmlidXRlcyhcbiAgICAgIGhhc3MsIHN0YXRlcywgc3RhdGVPYmosIHN0YXRlT2JqLmF0dHJpYnV0ZXMpO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gKG5ld1Jlc3VsdCAhPT0gc3RhdGVPYmopO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGVzKG9iaikge1xuICAgICAgaWYgKCFvYmopIHJldHVybjtcbiAgICAgIE9iamVjdC52YWx1ZXMob2JqKS5mb3JFYWNoKChhdHRyaWJ1dGVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUFwcGx5VGVtcGxhdGVBdHRyaWJ1dGVzKFxuICAgICAgICAgIGhhc3MsIHN0YXRlcywgbmV3UmVzdWx0LCBhdHRyaWJ1dGVzKTtcbiAgICAgICAgaGFzQ2hhbmdlcyB8PSAocmVzdWx0ICE9PSBuZXdSZXN1bHQpO1xuICAgICAgfSk7XG4gICAgICBjaGVja0F0dHJpYnV0ZXMob2JqLmRldmljZSk7XG4gICAgICBjaGVja0F0dHJpYnV0ZXMob2JqLmdyb3VwKTtcbiAgICB9XG5cbiAgICBjaGVja0F0dHJpYnV0ZXMoc3RhdGVPYmouYXR0cmlidXRlcy5kZXZpY2UpO1xuICAgIGNoZWNrQXR0cmlidXRlcyhzdGF0ZU9iai5hdHRyaWJ1dGVzLmdyb3VwKTtcbiAgICBpZiAobmV3UmVzdWx0ICE9PSBzdGF0ZU9iaikgcmV0dXJuIG5ld1Jlc3VsdDtcbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlT2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlT2JqO1xuICB9LFxuXG4gIGFwcGx5QXR0cmlidXRlcyhzdGF0ZU9iaiwgYXR0cmlidXRlcykge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRpdHlfaWQ6IHN0YXRlT2JqLmVudGl0eV9pZCxcbiAgICAgIHN0YXRlOiBzdGF0ZU9iai5zdGF0ZSxcbiAgICAgIGF0dHJpYnV0ZXM6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlT2JqLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpLFxuICAgICAgdW50ZW1wbGF0ZWRfYXR0cmlidXRlczogc3RhdGVPYmouYXR0cmlidXRlcyxcbiAgICAgIGxhc3RfY2hhbmdlZDogc3RhdGVPYmoubGFzdF9jaGFuZ2VkLFxuICAgIH07XG4gIH0sXG5cbiAgbWF5YmVDaGFuZ2VPYmplY3QoZWxlbSwgc3RhdGVPYmosIGluRGlhbG9nLCBhbGxvd0hpZGRlbikge1xuICAgIGlmIChpbkRpYWxvZykgcmV0dXJuIHN0YXRlT2JqO1xuICAgIGxldCBvYmogPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3RCeURldmljZShzdGF0ZU9iaik7XG4gICAgb2JqID0gd2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0QnlHcm91cChlbGVtLCBvYmopO1xuICAgIG9iaiA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUFwcGx5VGVtcGxhdGVBdHRyaWJ1dGVzKFxuICAgICAgZWxlbS5oYXNzLCBlbGVtLmhhc3Muc3RhdGVzLCBvYmosIG9iai5hdHRyaWJ1dGVzKTtcblxuICAgIGlmIChvYmogIT09IHN0YXRlT2JqICYmIG9iai5hdHRyaWJ1dGVzLmhpZGRlbiAmJiBhbGxvd0hpZGRlbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0sXG5cbiAgZml4R3JvdXBUaXRsZXMoKSB7XG4gICAgY29uc3QgaG9tZUFzc2lzdGFudE1haW4gPSB3aW5kb3cuY3VzdG9tVUkuZ2V0RWxlbWVudEhpZXJhcmNoeShkb2N1bWVudCwgW1xuICAgICAgJ2hvbWUtYXNzaXN0YW50JyxcbiAgICAgICdob21lLWFzc2lzdGFudC1tYWluJ10pO1xuICAgIGlmIChob21lQXNzaXN0YW50TWFpbiA9PT0gbnVsbCkge1xuICAgICAgLy8gRE9NIG5vdCByZWFkeS4gV2FpdCAxIHNlY29uZC5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHdpbmRvdy5jdXN0b21VSS5maXhHcm91cFRpdGxlcywgMTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFDYXJkcyA9IHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KGhvbWVBc3Npc3RhbnRNYWluLCBbXG4gICAgICAncGFydGlhbC1jYXJkcycsXG4gICAgICAnaGEtY2FyZHNbdmlldy12aXNpYmxlXSddKTtcbiAgICBpZiAoaGFDYXJkcyA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IG1haW4gPSB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhoYUNhcmRzLCAnLm1haW4nKSB8fCBoYUNhcmRzLiQubWFpbjtcbiAgICBjb25zdCBjYXJkcyA9IG1haW4ucXVlcnlTZWxlY3RvckFsbCgnaGEtZW50aXRpZXMtY2FyZCcpO1xuICAgIGNhcmRzLmZvckVhY2goKGNhcmQpID0+IHtcbiAgICAgIGlmIChjYXJkLmdyb3VwRW50aXR5KSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdChcbiAgICAgICAgICBjYXJkLFxuICAgICAgICAgIGNhcmQuZ3JvdXBFbnRpdHksXG4gICAgICAgICAgZmFsc2UgLyogaW5EaWFsb2cgKi8sXG4gICAgICAgICAgZmFsc2UgLyogYWxsb3dIaWRkZW4gKi8pO1xuICAgICAgICBpZiAob2JqICE9PSBjYXJkLmdyb3VwRW50aXR5ICYmIG9iai5hdHRyaWJ1dGVzLmZyaWVuZGx5X25hbWUpIHtcbiAgICAgICAgICBjb25zdCBuYW1lRWxlbSA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGNhcmQsICcubmFtZScpO1xuICAgICAgICAgIG5hbWVFbGVtLnRleHRDb250ZW50ID0gb2JqLmF0dHJpYnV0ZXMuZnJpZW5kbHlfbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGNvbnRyb2xDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICBjb25zdCBwYXJ0aWFsQ2FyZHMgPSB3aW5kb3cuY3VzdG9tVUkuZ2V0RWxlbWVudEhpZXJhcmNoeShkb2N1bWVudCwgW1xuICAgICAgJ2hvbWUtYXNzaXN0YW50JyxcbiAgICAgICdob21lLWFzc2lzdGFudC1tYWluJyxcbiAgICAgICdwYXJ0aWFsLWNhcmRzJ10pO1xuICAgIGlmIChwYXJ0aWFsQ2FyZHMgPT09IG51bGwpIHtcbiAgICAgIC8vIERPTSBub3QgcmVhZHkuIFdhaXQgMSBzZWNvbmQuXG4gICAgICB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgd2luZG93LmN1c3RvbVVJLmNvbnRyb2xDb2x1bW5zLmJpbmQobnVsbCwgY29sdW1ucyksXG4gICAgICAgIDEwMDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXJ0aWFsQ2FyZHMubXFscy5mb3JFYWNoKChtcWwpID0+IHtcbiAgICAgIG1xbC5yZW1vdmVMaXN0ZW5lcihwYXJ0aWFsQ2FyZHMuaGFuZGxlV2luZG93Q2hhbmdlKTtcbiAgICB9KTtcbiAgICBwYXJ0aWFsQ2FyZHMubXFscyA9IGNvbHVtbnMubWFwKCh3aWR0aCkgPT4ge1xuICAgICAgY29uc3QgbXFsID0gd2luZG93Lm1hdGNoTWVkaWEoYChtaW4td2lkdGg6ICR7d2lkdGh9cHgpYCk7XG4gICAgICBtcWwuYWRkTGlzdGVuZXIocGFydGlhbENhcmRzLmhhbmRsZVdpbmRvd0NoYW5nZSk7XG4gICAgICByZXR1cm4gbXFsO1xuICAgIH0pO1xuICAgIHBhcnRpYWxDYXJkcy5oYW5kbGVXaW5kb3dDaGFuZ2UoKTtcbiAgfSxcblxuICB1c2VDdXN0b21pemVyKCkge1xuICAgIGNvbnN0IG1haW4gPSB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhkb2N1bWVudCwgJ2hvbWUtYXNzaXN0YW50Jyk7XG4gICAgY29uc3QgY3VzdG9taXplciA9IG1haW4uaGFzcy5zdGF0ZXNbJ2N1c3RvbWl6ZXIuY3VzdG9taXplciddO1xuICAgIGlmICghY3VzdG9taXplcikgcmV0dXJuO1xuICAgIGlmIChjdXN0b21pemVyLmF0dHJpYnV0ZXMuY29sdW1ucykge1xuICAgICAgd2luZG93LmN1c3RvbVVJLmNvbnRyb2xDb2x1bW5zKGN1c3RvbWl6ZXIuYXR0cmlidXRlcy5jb2x1bW5zKTtcbiAgICB9XG4gICAgaWYgKGN1c3RvbWl6ZXIuYXR0cmlidXRlcy5oaWRlX2F0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIFRPRE86IFdvbid0IHdvcmtpbmcgc3RhcnRpbmcgZnJvbSBIQSAwLjcxXG4gICAgICBpZiAod2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsICYmIHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTKSB7XG4gICAgICAgIGN1c3RvbWl6ZXIuYXR0cmlidXRlcy5oaWRlX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgd2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMsIGF0dHIpKSB7XG4gICAgICAgICAgICB3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFU1thdHRyXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB1cGRhdGVBdHRyaWJ1dGVzKCkge1xuICAgIGlmICghd2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsKSB7XG4gICAgICAvLyBBcHAuanMgd2Fzbid0IHBhcnNlZCB5ZXQuXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCh3aW5kb3cuY3VzdG9tVUkudXBkYXRlQXR0cmlidXRlcywgMTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VzdG9tVWlBdHRyaWJ1dGVzID0ge1xuICAgICAgZ3JvdXA6IHVuZGVmaW5lZCxcbiAgICAgIGRldmljZTogdW5kZWZpbmVkLFxuICAgICAgdGVtcGxhdGVzOiB1bmRlZmluZWQsXG4gICAgICBzdGF0ZV9jYXJkX21vZGU6IHtcbiAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGxpZ2h0OiB3aW5kb3cuY3VzdG9tVUkuU1VQUE9SVEVEX1NMSURFUl9NT0RFUy5jb25jYXQoJ2JhZGdlcycpLFxuICAgICAgICAgIGNvdmVyOiB3aW5kb3cuY3VzdG9tVUkuU1VQUE9SVEVEX1NMSURFUl9NT0RFUy5jb25jYXQoJ2JhZGdlcycpLFxuICAgICAgICAgICcqJzogWydiYWRnZXMnXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGF0ZV9jYXJkX2N1c3RvbV91aV9zZWNvbmRhcnk6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIGJhZGdlc19saXN0OiB7IHR5cGU6ICdqc29uJyB9LFxuICAgICAgc2hvd19sYXN0X2NoYW5nZWQ6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICBoaWRlX2NvbnRyb2w6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICBleHRyYV9kYXRhX3RlbXBsYXRlOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICBleHRyYV9iYWRnZTogeyB0eXBlOiAnanNvbicgfSxcbiAgICAgIHN0cmV0Y2hfc2xpZGVyOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgc2xpZGVyX3RoZW1lOiB7IHR5cGU6ICdqc29uJyB9LFxuICAgICAgdGhlbWU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIGNvbmZpcm1fY29udHJvbHM6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICBjb25maXJtX2NvbnRyb2xzX3Nob3dfbG9jazogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgIGhpZGVfaW5fZGVmYXVsdF92aWV3OiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgIH07XG4gICAgaWYgKHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTLCBjdXN0b21VaUF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfSxcblxuICB1cGRhdGVDb25maWdQYW5lbCgpIHtcbiAgICBpZiAoIXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvY29uZmlnJykpIHJldHVybjtcbiAgICBjb25zdCBoYVBhbmVsQ29uZmlnID0gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoZG9jdW1lbnQsIFtcbiAgICAgICdob21lLWFzc2lzdGFudCcsXG4gICAgICAnaG9tZS1hc3Npc3RhbnQtbWFpbicsXG4gICAgICAncGFydGlhbC1wYW5lbC1yZXNvbHZlcicsXG4gICAgICAnaGEtcGFuZWwtY29uZmlnJ10pO1xuICAgIGlmICghaGFQYW5lbENvbmZpZykge1xuICAgICAgLy8gRE9NIG5vdCByZWFkeS4gV2FpdCAxMDBtcy5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHdpbmRvdy5jdXN0b21VSS51cGRhdGVDb25maWdQYW5lbCwgMTAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGFDb25maWdOYXZpZ2F0aW9uID0gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoaGFQYW5lbENvbmZpZywgW1xuICAgICAgJ2hhLWNvbmZpZy1kYXNoYm9hcmQnLFxuICAgICAgJ2hhLWNvbmZpZy1uYXZpZ2F0aW9uJ10pO1xuICAgIGlmIChoYUNvbmZpZ05hdmlnYXRpb24pIHtcbiAgICAgIC8vIEhhQ29uZmlnTmF2aWdhdGlvbiBzdGFydGVkIHVzaW5nIGxvY2FsaXplIG9uIDIxLjAxLjIwMThcbiAgICAgIGlmIChoYUNvbmZpZ05hdmlnYXRpb24ubG9jYWxpemUgJiYgIWhhQ29uZmlnTmF2aWdhdGlvbi5jdWlQYXRjaCkge1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uY3VpUGF0Y2ggPSB0cnVlO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX29yaWdpbmFsQ29tcHV0ZUxvYWRlZCA9IGhhQ29uZmlnTmF2aWdhdGlvbi5fY29tcHV0ZUxvYWRlZDtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9vcmlnaW5hbENvbXB1dGVDYXB0aW9uID0gaGFDb25maWdOYXZpZ2F0aW9uLl9jb21wdXRlQ2FwdGlvbjtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9vcmlnaW5hbENvbXB1dGVEZXNjcmlwdGlvbiA9IGhhQ29uZmlnTmF2aWdhdGlvbi5fY29tcHV0ZURlc2NyaXB0aW9uO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX2NvbXB1dGVMb2FkZWQgPSAoaGFzcywgcGFnZSkgPT5cbiAgICAgICAgICBwYWdlID09PSAnY3VzdG9tdWknIHx8IGhhQ29uZmlnTmF2aWdhdGlvbi5fb3JpZ2luYWxDb21wdXRlTG9hZGVkKGhhc3MsIHBhZ2UpO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX2NvbXB1dGVDYXB0aW9uID0gKHBhZ2UsIGxvY2FsaXplKSA9PlxuICAgICAgICAgIChwYWdlID09PSAnY3VzdG9tdWknID8gJ0N1c3RvbSBVSScgOiBoYUNvbmZpZ05hdmlnYXRpb24uX29yaWdpbmFsQ29tcHV0ZUNhcHRpb24ocGFnZSwgbG9jYWxpemUpKTtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9jb21wdXRlRGVzY3JpcHRpb24gPSAocGFnZSwgbG9jYWxpemUpID0+XG4gICAgICAgICAgKHBhZ2UgPT09ICdjdXN0b211aScgPyAnU2V0VUkgdHdlYWtzJyA6IGhhQ29uZmlnTmF2aWdhdGlvbi5fb3JpZ2luYWxDb21wdXRlRGVzY3JpcHRpb24ocGFnZSwgbG9jYWxpemUpKTtcbiAgICAgIH1cbiAgICAgIGlmICghaGFDb25maWdOYXZpZ2F0aW9uLnBhZ2VzLnNvbWUoY29uZiA9PiBjb25mID09PSAnY3VzdG9tdWknIHx8IGNvbmYuZG9tYWluID09PSAnY3VzdG9tdWknKSkge1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24ucHVzaCgncGFnZXMnLCBoYUNvbmZpZ05hdmlnYXRpb24ubG9jYWxpemUgPyAnY3VzdG9tdWknIDoge1xuICAgICAgICAgIGRvbWFpbjogJ2N1c3RvbXVpJyxcbiAgICAgICAgICBjYXB0aW9uOiAnQ3VzdG9tIFVJJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NldCBVSSB0d2Vha3MuJyxcbiAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBnZXRIYUNvbmZpZ0N1c3RvbVVpID0gKCkgPT4ge1xuICAgICAgY29uc3QgaGFDb25maWdDdXN0b21VaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hhLWNvbmZpZy1jdXN0b20tdWknKTtcbiAgICAgIGhhQ29uZmlnQ3VzdG9tVWkuaXNXaWRlID0gaGFQYW5lbENvbmZpZy5pc1dpZGU7XG4gICAgICBoYUNvbmZpZ0N1c3RvbVVpLnNldEF0dHJpYnV0ZSgncGFnZS1uYW1lJywgJ2N1c3RvbXVpJyk7XG4gICAgICByZXR1cm4gaGFDb25maWdDdXN0b21VaTtcbiAgICB9O1xuXG4gICAgY29uc3QgaXJvblBhZ2VzID0gd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3coaGFQYW5lbENvbmZpZywgJ2lyb24tcGFnZXMnKTtcbiAgICBpZiAoaXJvblBhZ2VzKSB7XG4gICAgICBpZiAoaXJvblBhZ2VzLmxhc3RFbGVtZW50Q2hpbGQudGFnTmFtZSAhPT0gJ0hBLUNPTkZJRy1DVVNUT00tVUknKSB7XG4gICAgICAgIGNvbnN0IGhhQ29uZmlnQ3VzdG9tVWkgPSBnZXRIYUNvbmZpZ0N1c3RvbVVpKCk7XG4gICAgICAgIGlyb25QYWdlcy5hcHBlbmRDaGlsZChoYUNvbmZpZ0N1c3RvbVVpKTtcbiAgICAgICAgaXJvblBhZ2VzLmFkZEV2ZW50TGlzdGVuZXIoJ2lyb24taXRlbXMtY2hhbmdlZCcsICgpID0+IHtcbiAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9jb25maWcvY3VzdG9tdWknKSkge1xuICAgICAgICAgICAgaXJvblBhZ2VzLnNlbGVjdCgnY3VzdG9tdWknKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByb290ID0gaGFQYW5lbENvbmZpZy5zaGFkb3dSb290IHx8IGhhUGFuZWxDb25maWc7XG4gICAgICBpZiAocm9vdC5sYXN0RWxlbWVudENoaWxkLnRhZ05hbWUgIT09ICdIQS1DT05GSUctQ1VTVE9NLVVJJykge1xuICAgICAgICBjb25zdCBoYUNvbmZpZ0N1c3RvbVVpID0gZ2V0SGFDb25maWdDdXN0b21VaSgpO1xuICAgICAgICByb290LmFwcGVuZENoaWxkKGhhQ29uZmlnQ3VzdG9tVWkpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmlzaWJsZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvY29uZmlnL2N1c3RvbXVpJyk7XG4gICAgICByb290Lmxhc3RFbGVtZW50Q2hpbGQuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICB9XG4gIH0sXG5cbiAgaW5zdGFsbFN0YXRlc0hvb2soKSB7XG4gICAgY29uc3QgaG9tZUFzc2lzdGFudCA9IGN1c3RvbUVsZW1lbnRzLmdldCgnaG9tZS1hc3Npc3RhbnQnKTtcbiAgICBpZiAoIWhvbWVBc3Npc3RhbnQgfHwgIWhvbWVBc3Npc3RhbnQucHJvdG90eXBlLl91cGRhdGVIYXNzKSByZXR1cm47XG4gICAgY29uc3Qgb3JpZ2luYWxVcGRhdGUgPSBob21lQXNzaXN0YW50LnByb3RvdHlwZS5fdXBkYXRlSGFzcztcbiAgICBob21lQXNzaXN0YW50LnByb3RvdHlwZS5fdXBkYXRlSGFzcyA9IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIC8vIFVzZSBuYW1lZCBmdW5jdGlvbiB0byBwcmVzZXJ2ZSAndGhpcycuXG4gICAgICBjb25zdCB7IGhhc3MgfSA9IHRoaXM7XG4gICAgICBpZiAob2JqLnN0YXRlcykge1xuICAgICAgICBPYmplY3Qua2V5cyhvYmouc3RhdGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBvYmouc3RhdGVzW2tleV07XG4gICAgICAgICAgaWYgKGVudGl0eS5fY3VpX2tlZXApIHJldHVybjtcbiAgICAgICAgICBjb25zdCBuZXdFbnRpdHkgPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVBcHBseVRlbXBsYXRlcyhoYXNzLCBvYmouc3RhdGVzLCBlbnRpdHkpO1xuICAgICAgICAgIGlmIChoYXNzLnN0YXRlcyAmJiBlbnRpdHkgIT09IGhhc3Muc3RhdGVzW2tleV0pIHtcbiAgICAgICAgICAgIC8vIE5ldyBzdGF0ZSBhcnJpdmVkLiBQdXQgbW9kaWZpZWQgc3RhdGUgaW4uXG4gICAgICAgICAgICBvYmouc3RhdGVzW2tleV0gPSBuZXdFbnRpdHk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbnRpdHkgIT09IG5ld0VudGl0eSkge1xuICAgICAgICAgICAgLy8gSXQncyB0aGUgc2FtZSBzdGF0ZSBidXQgY29udGVudHMgY2hhbmdlZCBkdWUgdG8gb3RoZXIgc3RhdGUgY2hhbmdlcy5cbiAgICAgICAgICAgIG9iai5zdGF0ZXNba2V5XSA9IG5ld0VudGl0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxVcGRhdGUuY2FsbCh0aGlzLCBvYmopO1xuICAgICAgaWYgKG9iai50aGVtZXMgJiYgaGFzcy5fdGhlbWVXYWl0ZXJzKSB7XG4gICAgICAgIGhhc3MuX3RoZW1lV2FpdGVycy5mb3JFYWNoKHdhaXRlciA9PiB3YWl0ZXIuc3RhdGVDaGFuZ2VkKHdhaXRlci5zdGF0ZSkpO1xuICAgICAgICBoYXNzLl90aGVtZVdhaXRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBtYWluID0gd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3coZG9jdW1lbnQsICdob21lLWFzc2lzdGFudCcpO1xuICAgIGlmIChtYWluLmhhc3MgJiYgbWFpbi5oYXNzLnN0YXRlcykge1xuICAgICAgbWFpbi5fdXBkYXRlSGFzcyh7IHN0YXRlczogbWFpbi5oYXNzLnN0YXRlcyB9KTtcbiAgICB9XG4gIH0sXG5cbiAgaW5zdGFsbFBhcnRpYWxDYXJkcygpIHtcbiAgICBjb25zdCBwYXJ0aWFsQ2FyZHMgPSBjdXN0b21FbGVtZW50cy5nZXQoJ3BhcnRpYWwtY2FyZHMnKTtcbiAgICBpZiAoIXBhcnRpYWxDYXJkcyB8fCAhcGFydGlhbENhcmRzLnByb3RvdHlwZS5fZGVmYXVsdFZpZXdGaWx0ZXIpIHJldHVybjtcbiAgICBwYXJ0aWFsQ2FyZHMucHJvdG90eXBlLl9kZWZhdWx0Vmlld0ZpbHRlciA9IChoYXNzLCBlbnRpdHlJZCkgPT4ge1xuICAgICAgaWYgKGhhc3Muc3RhdGVzW2VudGl0eUlkXS5hdHRyaWJ1dGVzLmhpZGRlbikgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZXhjbHVkZXMgPSB7fTtcbiAgICAgIE9iamVjdC52YWx1ZXMoaGFzcy5zdGF0ZXMpLmZvckVhY2goKGVudGl0eSkgPT4ge1xuICAgICAgICBpZiAoZW50aXR5LmF0dHJpYnV0ZXMgJiYgZW50aXR5LmF0dHJpYnV0ZXMuaGlkZV9pbl9kZWZhdWx0X3ZpZXcpIHtcbiAgICAgICAgICBjb25zdCBleGNsdWRlRW50aXR5SWQgPSBlbnRpdHkuZW50aXR5X2lkO1xuICAgICAgICAgIGlmIChleGNsdWRlc1tleGNsdWRlRW50aXR5SWRdKSByZXR1cm47XG4gICAgICAgICAgZXhjbHVkZXNbZXhjbHVkZUVudGl0eUlkXSA9IGVudGl0eTtcbiAgICAgICAgICBpZiAoZW50aXR5LmF0dHJpYnV0ZXMudmlldykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgZXhjbHVkZXMsIGdldFZpZXdFbnRpdGllcyhoYXNzLnN0YXRlcywgZW50aXR5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhZXhjbHVkZXNbZW50aXR5SWRdO1xuICAgIH07XG4gIH0sXG5cbiAgLy8gQWxsb3dzIGNoYW5naW5nIHRoZSAnRXhlY3V0ZScgLyAnQWN0aXZhdGUnIHRleHQgb24gc2NyaXB0L3NjZW5lIGNhcmRzLlxuICBpbnN0YWxsQWN0aW9uTmFtZShlbGVtZW50TmFtZSkge1xuICAgIGNvbnN0IGtsYXNzID0gY3VzdG9tRWxlbWVudHMuZ2V0KGVsZW1lbnROYW1lKTtcbiAgICBpZiAoIWtsYXNzIHx8ICFrbGFzcy5wcm90b3R5cGUpIHJldHVybjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoa2xhc3MucHJvdG90eXBlLCAnbG9jYWxpemUnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGN1c3RvbUxvY2FsaXplKHYpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZU9iaiAmJiB0aGlzLnN0YXRlT2JqLmF0dHJpYnV0ZXMgJiZcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZU9iai5hdHRyaWJ1dGVzLmFjdGlvbl9uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZU9iai5hdHRyaWJ1dGVzLmFjdGlvbl9uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5fX2RhdGEubG9jYWxpemUodik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1c3RvbUxvY2FsaXplO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHt9LFxuICAgIH0pO1xuICB9LFxuXG4gIC8vIEFsbG93cyB0aGVtaW5nIFwicmVndWxhclwiIHRvcCBiYWRnZXMuXG4gIGluc3RhbGxIYVN0YXRlTGFiZWxCYWRnZSgpIHtcbiAgICBjb25zdCBoYVN0YXRlTGFiZWxCYWRnZSA9IGN1c3RvbUVsZW1lbnRzLmdldCgnaGEtc3RhdGUtbGFiZWwtYmFkZ2UnKTtcbiAgICBpZiAoIWhhU3RhdGVMYWJlbEJhZGdlIHx8ICFoYVN0YXRlTGFiZWxCYWRnZS5wcm90b3R5cGUuc3RhdGVDaGFuZ2VkKSByZXR1cm47XG4gICAgLy8gVXNlIG5hbWVkIGZ1bmN0aW9uIHRvIHByZXNlcnZlICd0aGlzJy5cbiAgICBoYVN0YXRlTGFiZWxCYWRnZS5wcm90b3R5cGUuc3RhdGVDaGFuZ2VkID0gZnVuY3Rpb24gdXBkYXRlKHN0YXRlT2JqKSB7XG4gICAgICAvLyBUT0RPOiBDYWxsIHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdFxuICAgICAgaWYgKHN0YXRlT2JqLmF0dHJpYnV0ZXMudGhlbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzcy50aGVtZXMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmhhc3MuX3RoZW1lV2FpdGVycyA9IHRoaXMuaGFzcy5fdGhlbWVXYWl0ZXJzIHx8IFtdO1xuICAgICAgICAgIHRoaXMuaGFzcy5fdGhlbWVXYWl0ZXJzLnB1c2godGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwbHlUaGVtZXNPbkVsZW1lbnQoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy5oYXNzLnRoZW1lcyB8fCB7IGRlZmF1bHRfdGhlbWU6ICdkZWZhdWx0JywgdGhlbWVzOiB7fSB9LFxuICAgICAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlcy50aGVtZSB8fCAnZGVmYXVsdCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVN0eWxlcygpO1xuICAgICAgaWYgKHRoaXMuc3RhcnRJbnRlcnZhbCkge1xuICAgICAgICAvLyBBZGRlZCBvbiAxOS4xLjIwMThcbiAgICAgICAgdGhpcy5zdGFydEludGVydmFsKHN0YXRlT2JqKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIGluc3RhbGxTdGF0ZUJhZGdlKCkge1xuICAgIGNvbnN0IHN0YXRlQmFkZ2UgPSBjdXN0b21FbGVtZW50cy5nZXQoJ3N0YXRlLWJhZGdlJyk7XG4gICAgaWYgKCFzdGF0ZUJhZGdlIHx8ICFzdGF0ZUJhZGdlLnByb3RvdHlwZS51cGRhdGVJY29uQXBwZWFyYW5jZSkgcmV0dXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsVXBkYXRlSWNvbkFwcGVhcmFuY2UgPSBzdGF0ZUJhZGdlLnByb3RvdHlwZS51cGRhdGVJY29uQXBwZWFyYW5jZTtcbiAgICAvLyBVc2UgbmFtZWQgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnLlxuICAgIHN0YXRlQmFkZ2UucHJvdG90eXBlLnVwZGF0ZUljb25BcHBlYXJhbmNlID0gZnVuY3Rpb24gY3VzdG9tVXBkYXRlSWNvbkFwcGVhcmFuY2Uoc3RhdGVPYmopIHtcbiAgICAgIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzLmljb25fY29sb3IgJiYgIXN0YXRlT2JqLmF0dHJpYnV0ZXMuZW50aXR5X3BpY3R1cmUpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnJztcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLiQuaWNvbi5zdHlsZSwge1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUnLFxuICAgICAgICAgIGNvbG9yOiBzdGF0ZU9iai5hdHRyaWJ1dGVzLmljb25fY29sb3IsXG4gICAgICAgICAgZmlsdGVyOiAnJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbFVwZGF0ZUljb25BcHBlYXJhbmNlLmNhbGwodGhpcywgc3RhdGVPYmopO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgaW5zdGFsbENsYXNzSG9va3MoKSB7XG4gICAgaWYgKHdpbmRvdy5jdXN0b21VSS5jbGFzc0luaXREb25lKSByZXR1cm47XG4gICAgd2luZG93LmN1c3RvbVVJLmNsYXNzSW5pdERvbmUgPSB0cnVlO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsUGFydGlhbENhcmRzKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxTdGF0ZXNIb29rKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxIYVN0YXRlTGFiZWxCYWRnZSgpO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsU3RhdGVCYWRnZSgpO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsQWN0aW9uTmFtZSgnc3RhdGUtY2FyZC1zY2VuZScpO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsQWN0aW9uTmFtZSgnc3RhdGUtY2FyZC1zY3JpcHQnKTtcbiAgICAvLyBUT0RPOiBGaXgsIG5vdCB3b3JraW5nIHNpbmNlIEhBIDAuNzFcbiAgICB3aW5kb3cuY3VzdG9tVUkudXBkYXRlQXR0cmlidXRlcygpO1xuICB9LFxuXG4gIGluaXQoKSB7XG4gICAgaWYgKHdpbmRvdy5jdXN0b21VSS5pbml0RG9uZSkgcmV0dXJuO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsQ2xhc3NIb29rcygpO1xuICAgIGNvbnN0IG1haW4gPSB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhkb2N1bWVudCwgJ2hvbWUtYXNzaXN0YW50Jyk7XG4gICAgaWYgKCFtYWluLmhhc3MgfHwgIW1haW4uaGFzcy5zdGF0ZXMpIHtcbiAgICAgIC8vIENvbm5lY3Rpb24gd2Fzbid0IG1hZGUgeWV0LiBUcnkgaW4gMSBzZWNvbmQuXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCh3aW5kb3cuY3VzdG9tVUkuaW5pdCwgMTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvdy5jdXN0b21VSS5pbml0RG9uZSA9IHRydWU7XG5cbiAgICB3aW5kb3cuY3VzdG9tVUkudXNlQ3VzdG9taXplcigpO1xuXG4gICAgd2luZG93LmN1c3RvbVVJLnJ1bkhvb2tzKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvY2F0aW9uLWNoYW5nZWQnLCB3aW5kb3cuc2V0VGltZW91dC5iaW5kKG51bGwsIHdpbmRvdy5jdXN0b21VSS5ydW5Ib29rcywgMTAwKSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUubG9nKGBMb2FkZWQgQ3VzdG9tVUkgJHtWRVJTSU9OfWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgIGlmICghd2luZG93LkNVU1RPTV9VSV9MSVNUKSB7XG4gICAgICB3aW5kb3cuQ1VTVE9NX1VJX0xJU1QgPSBbXTtcbiAgICB9XG4gICAgd2luZG93LkNVU1RPTV9VSV9MSVNULnB1c2goe1xuICAgICAgbmFtZTogJ0N1c3RvbVVJJyxcbiAgICAgIHZlcnNpb246IFZFUlNJT04sXG4gICAgICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vYW5kcmV5LWdpdC9ob21lLWFzc2lzdGFudC1jdXN0b20tdWknLFxuICAgIH0pO1xuICB9LFxuXG4gIHJ1bkhvb2tzKCkge1xuICAgIHdpbmRvdy5jdXN0b21VSS5maXhHcm91cFRpdGxlcygpO1xuICAgIHdpbmRvdy5jdXN0b21VSS51cGRhdGVDb25maWdQYW5lbCgpO1xuICB9LFxuXG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGEtZGV2aWNlLW5hbWUnKSB8fCAnJztcbiAgfSxcblxuICBzZXROYW1lKG5hbWUpIHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hhLWRldmljZS1uYW1lJywgbmFtZSB8fCAnJyk7XG4gIH0sXG5cbiAgY29tcHV0ZVRlbXBsYXRlKHRlbXBsYXRlLCBoYXNzLCBlbnRpdGllcywgZW50aXR5LCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUsIHN0YXRlKSB7XG4gICAgY29uc3QgZnVuY3Rpb25Cb2R5ID0gKHRlbXBsYXRlLmluZGV4T2YoJ3JldHVybicpID49IDApID8gdGVtcGxhdGUgOiBgcmV0dXJuIFxcYCR7dGVtcGxhdGV9XFxgO2A7XG4gICAgdHJ5IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldy1mdW5jICovXG4gICAgICBjb25zdCBmdW5jID0gbmV3IEZ1bmN0aW9uKFxuICAgICAgICAnaGFzcycsICdlbnRpdGllcycsICdlbnRpdHknLCAnYXR0cmlidXRlcycsICdhdHRyaWJ1dGUnLCAnc3RhdGUnLCBmdW5jdGlvbkJvZHkpO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXctZnVuYyAqL1xuICAgICAgcmV0dXJuIGZ1bmMoaGFzcywgZW50aXRpZXMsIGVudGl0eSwgYXR0cmlidXRlcywgYXR0cmlidXRlLCBzdGF0ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgaWYgKChlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHx8IGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7ZS5uYW1lfTogJHtlLm1lc3NhZ2V9IGluIHRlbXBsYXRlICR7ZnVuY3Rpb25Cb2R5fWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH0sXG59O1xud2luZG93LmN1c3RvbVVJLmluaXQoKTtcbiIsImV4cG9ydCBkZWZhdWx0ICcyMDE4MDUyOCc7XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9jb25zdC5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9hcHBseV90aGVtZXNfb25fZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9keW5hbWljX2NvbnRlbnRfdXBkYXRlci5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jYW5fdG9nZ2xlX2RvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jYW5fdG9nZ2xlX3N0YXRlLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfZG9tYWluLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2dldF9ncm91cF9lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9nZXRfdmlld19lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9zdGF0ZV9jYXJkX3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL3V0aWwvaGFzcy1hdHRyaWJ1dGVzLXV0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2Jvb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzIiwid2VicGFjazovLy8uL3NyYy9lbGVtZW50cy9jdWktYmFzZS1lbGVtZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9lbGVtZW50cy9keW5hbWljLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL2R5bmFtaWMtd2l0aC1leHRyYS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvaGEtY29uZmlnLWN1c3RvbS11aS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvaGEtdGhlbWVkLXNsaWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvc3RhdGUtY2FyZC1jdXN0b20tdWkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL3N0YXRlLWNhcmQtd2l0aC1zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL3N0YXRlLWNhcmQtd2l0aG91dC1zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21peGlucy9ldmVudHMtbWl4aW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2hhc3MtYXR0cmlidXRlLXV0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2hvb2tzLmpzIiwid2VicGFjazovLy8uL3NyYy91dGlscy92ZXJzaW9uLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfRE9NQUlOX0lDT04iLCJET01BSU5TX1dJVEhfQ0FSRCIsIkRPTUFJTlNfTU9SRV9JTkZPX05PX0hJU1RPUlkiLCJTVEFURVNfT0ZGIiwiVU5JVF9DIiwiVU5JVF9GIiwiREVGQVVMVF9WSUVXX0VOVElUWV9JRCIsImFwcGx5VGhlbWVzT25FbGVtZW50IiwiZWxlbWVudCIsInRoZW1lcyIsImxvY2FsVGhlbWUiLCJ1cGRhdGVNZXRhIiwiX3RoZW1lcyIsInRoZW1lTmFtZSIsImRlZmF1bHRfdGhlbWUiLCJzdHlsZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJ0aGVtZSIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwicHJlZml4ZWRLZXkiLCJ1cGRhdGVTdHlsZXMiLCJ3aW5kb3ciLCJTaGFkeUNTUyIsInN0eWxlU3VidHJlZSIsIm1ldGEiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJoYXNBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJ0aGVtZUNvbG9yIiwiZHluYW1pY0NvbnRlbnRVcGRhdGVyIiwicm9vdCIsIm5ld0VsZW1lbnRUYWciLCJhdHRyaWJ1dGVzIiwicm9vdEVsIiwiY3VzdG9tRWwiLCJsYXN0Q2hpbGQiLCJ0YWdOYW1lIiwicmVtb3ZlQ2hpbGQiLCJjcmVhdGVFbGVtZW50IiwidG9Mb3dlckNhc2UiLCJzZXRQcm9wZXJ0aWVzIiwicGFyZW50Tm9kZSIsImFwcGVuZENoaWxkIiwiY2FuVG9nZ2xlRG9tYWluIiwiaGFzcyIsImRvbWFpbiIsInNlcnZpY2VzIiwiY29uZmlnIiwiY2FuVG9nZ2xlU3RhdGUiLCJzdGF0ZU9iaiIsImNvbXB1dGVTdGF0ZURvbWFpbiIsInN0YXRlIiwic3VwcG9ydGVkX2ZlYXR1cmVzIiwiY29tcHV0ZURvbWFpbiIsImVudGl0eUlkIiwic3Vic3RyIiwiaW5kZXhPZiIsIl9kb21haW4iLCJlbnRpdHlfaWQiLCJnZXRHcm91cEVudGl0aWVzIiwiZW50aXRpZXMiLCJncm91cCIsInJlc3VsdCIsImVudGl0eSIsImdldFZpZXdFbnRpdGllcyIsInZpZXciLCJ2aWV3RW50aXRpZXMiLCJoaWRkZW4iLCJncm91cEVudGl0aWVzIiwiZ3JFbnRpdHlJZCIsImdyRW50aXR5Iiwic3RhdGVDYXJkVHlwZSIsImluY2x1ZGVzIiwiY29udHJvbCIsImhhc3NBdHRyaWJ1dGVVdGlsIiwiRE9NQUlOX0RFVklDRV9DTEFTUyIsImJpbmFyeV9zZW5zb3IiLCJjb3ZlciIsInNlbnNvciIsIlVOS05PV05fVFlQRSIsIkFERF9UWVBFIiwiVFlQRV9UT19UQUciLCJzdHJpbmciLCJqc29uIiwiaWNvbiIsImJvb2xlYW4iLCJhcnJheSIsIkxPR0lDX1NUQVRFX0FUVFJJQlVURVMiLCJlbnRpdHlfcGljdHVyZSIsInVuZGVmaW5lZCIsImZyaWVuZGx5X25hbWUiLCJ0eXBlIiwiZGVzY3JpcHRpb24iLCJlbXVsYXRlZF9odWUiLCJkb21haW5zIiwiZW11bGF0ZWRfaHVlX25hbWUiLCJoYWFza2FfaGlkZGVuIiwiaGFhc2thX25hbWUiLCJob21lYnJpZGdlX2hpZGRlbiIsImhvbWVicmlkZ2VfbmFtZSIsImF0dHJpYnV0aW9uIiwiY3VzdG9tX3VpX21vcmVfaW5mbyIsImN1c3RvbV91aV9zdGF0ZV9jYXJkIiwiZGV2aWNlX2NsYXNzIiwib3B0aW9ucyIsImFzc3VtZWRfc3RhdGUiLCJpbml0aWFsX3N0YXRlIiwidW5pdF9vZl9tZWFzdXJlbWVudCIsIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCJwcm9wIiwiTGl0ZXJhbFN0cmluZyIsInZhbHVlIiwidG9TdHJpbmciLCJsaXRlcmFsVmFsdWUiLCJFcnJvciIsImh0bWxWYWx1ZSIsIkhUTUxUZW1wbGF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJodG1sIiwic3RyaW5ncyIsInRlbXBsYXRlIiwidmFsdWVzIiwicmVkdWNlIiwiYWNjIiwidiIsImlkeCIsImh0bWxMaXRlcmFsIiwiQ3VpQmFzZUVsZW1lbnQiLCJleHRyYXMiLCJleHRyYV9kYXRhX3RlbXBsYXRlIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiY3VzdG9tVUkiLCJjb21wdXRlVGVtcGxhdGUiLCJleHRyYSIsInN0YXRlcyIsImZpbHRlciIsImluRGlhbG9nIiwibGVuZ3RoIiwic2hvd19sYXN0X2NoYW5nZWQiLCJCb29sZWFuIiwiY29udHJvbEVsZW1lbnQiLCJTdHJpbmciLCJjb21wdXRlZCIsIlBvbHltZXIiLCJFbGVtZW50IiwiRHluYW1pY0VsZW1lbnQiLCJlbGVtZW50TmFtZSIsInRvVXBwZXJDYXNlIiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiLCJEeW5hbWljV2l0aEV4dHJhIiwiX2F0dGFjaGVkIiwiX2lzQXR0YWNoZWQiLCJhdHRhY2hlZCIsImV4dHJhX2JhZGdlIiwiZXh0cmFCYWRnZXMiLCJleHRyYUJhZGdlIiwibWF5YmVDaGFuZ2VPYmplY3QiLCJhdHRyaWJ1dGUiLCJ1bml0IiwiYmxhY2tsaXN0IiwiYmxhY2tsaXN0X3N0YXRlcyIsInNvbWUiLCJSZWdFeHAiLCJ0ZXN0IiwiX2VudGl0eURpc3BsYXkiLCJleHRyYU9iaiIsImV4dHJhT2JqVmlzaWJsZSIsImhpZGVfY29udHJvbCIsImhhTG9jYWxpemUiLCJsb2NhbGl6ZSIsImNvbmZpcm1fY29udHJvbHMiLCJjb25maXJtX2NvbnRyb2xzX3Nob3dfbG9jayIsImUiLCJzdHlsZSIsInBvaW50ZXJFdmVudHMiLCJsb2NrIiwib3BhY2l0eSIsInNldFRpbWVvdXQiLCJzdG9wUHJvcGFnYXRpb24iLCJxdWVyeVNlbGVjdG9yQWxsIiwiZWxlbSIsImFwcGx5VGhlbWVzIiwiZ2V0IiwiSGFDb25maWdDdXN0b21VaSIsIm5hbWUiLCJnZXROYW1lIiwic2V0TmFtZSIsImhpc3RvcnkiLCJiYWNrIiwiZmlyZSIsImlzV2lkZSIsIm9ic2VydmVyIiwiRXZlbnRzTWl4aW4iLCJIYVRoZW1lZFNsaWRlciIsImRpc2FibGVPZmZXaGVuTWluIiwiX2NvbXB1dGVBdHRyaWJ1dGUiLCJjb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwiZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwiX2VuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCIsImF0dHIiLCJkZWYiLCJpc09uIiwidGhlbWVkTWluIiwiZXYiLCJ0YXJnZXQiLCJtaW4iLCJOdW1iZXIiLCJtYXgiLCJwaW4iLCJub3RpZnkiLCJfdGhlbWVkTWluIiwiU0hPV19MQVNUX0NIQU5HRURfQkxBQ0tMSVNURURfQ0FSRFMiLCJET01BSU5fVE9fU0xJREVSX1NVUFBPUlQiLCJsaWdodCIsImNsaW1hdGUiLCJUWVBFX1RPX0NPTlRST0wiLCJ0b2dnbGUiLCJkaXNwbGF5IiwiU3RhdGVDYXJkQ3VzdG9tVWkiLCJjb250YWluZXIiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsIl9jb250YWluZXIiLCJzZXRQcm9wZXJ0eSIsImlucHV0Q2hhbmdlZCIsIm1hcmdpbiIsInBhZGRpbmciLCJpZCIsImNvbnNvbGUiLCJ3YXJuIiwiYmFkZ2VzX2xpc3QiLCJwdXNoIiwicGFyYW1zIiwid2lkdGgiLCJmb250U2l6ZSIsIm1vZGlmaWVkT2JqIiwidGhlbWVUYXJnZXQiLCJvYmoiLCJzdGF0ZV9jYXJkX21vZGUiLCJtYXliZUhpZGVFbnRpdHkiLCJiYWRnZU1vZGUiLCJyZWd1bGFyTW9kZV8iLCJjbGVhbkJhZGdlU3R5bGUiLCJvcmlnaW5hbFN0YXRlQ2FyZFR5cGUiLCJjdXN0b21TdGF0ZUNhcmRUeXBlIiwic2Vjb25kYXJ5U3RhdGVDYXJkVHlwZSIsInN0YXRlX2NhcmRfY3VzdG9tX3VpX3NlY29uZGFyeSIsInNsaWRlckVsaWdpYmxlXyIsInNlcnZpY2VNaW4iLCJzZXJ2aWNlTWF4IiwidmFsdWVOYW1lIiwic2V0VmFsdWVOYW1lIiwibmFtZU9uIiwibWluX3RlbXAiLCJtYXhfdGVtcCIsImNvbnRyb2xfZWxlbWVudCIsIlN0YXRlQ2FyZFdpdGhTbGlkZXIiLCJfb25Jcm9uUmVzaXplIiwiYmluZCIsIl9pc0Nvbm5lY3RlZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfd2FpdEZvckxheW91dCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJfc2V0TW9kZSIsIl9mcmFtZUlkIiwicmVhZHlUb0NvbXB1dGUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJoaWRlU2xpZGVyIiwibW9kZSIsImxpbmVUb29Mb25nIiwiYnJlYWtTbGlkZXIiLCJzaG93U2xpZGVyIiwicHJldkJyZWFrU2xpZGVyIiwicHJldkhpZGVTbGlkZXIiLCIkIiwiY29udGFpbmVyV2lkdGgiLCJjbGllbnRXaWR0aCIsIm1pbkxpbmVCcmVhayIsIm1heExpbmVCcmVhayIsImNvbnRhaW5lckhlaWdodCIsImNsaWVudEhlaWdodCIsInN0YXRlSGVpZ2h0Iiwic3RyZXRjaFNsaWRlciIsInBhcnNlSW50IiwicGFyYW0iLCJpc05hTiIsInBhdGgiLCJjb21wb3NlZFBhdGgiLCJjYWxsU2VydmljZSIsInNsaWRlclZhbHVlIiwic3RyZXRjaF9zbGlkZXIiLCJTdGF0ZUNhcmRXaXRob3V0U2xpZGVyIiwic3VwZXJDbGFzcyIsImRldGFpbCIsImV2ZW50IiwiRXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwibm9kZSIsImRpc3BhdGNoRXZlbnQiLCJTVVBQT1JURURfU0xJREVSX01PREVTIiwiY3VzdG9tVWlBdHRyaWJ1dGVzIiwiZGV2aWNlIiwidGVtcGxhdGVzIiwiY29uY2F0Iiwic2xpZGVyX3RoZW1lIiwiaGlkZV9pbl9kZWZhdWx0X3ZpZXciLCJoYXNzQXR0cmlidXRlc1V0aWwiLCJkb21Ib3N0IiwiZ2V0Um9vdE5vZGUiLCJEb2N1bWVudEZyYWdtZW50IiwiaG9zdCIsImxpZ2h0T3JTaGFkb3ciLCJzZWxlY3RvciIsInNoYWRvd1Jvb3QiLCJnZXRFbGVtZW50SGllcmFyY2h5IiwiaGllcmFyY2h5Iiwic2hpZnQiLCJnZXRDb250ZXh0IiwiX2NvbnRleHQiLCJncm91cEVudGl0eSIsInJldmVyc2UiLCJmaW5kTWF0Y2giLCJmaW5kIiwibWF0Y2giLCJvcHRpb24iLCJtYXliZUNoYW5nZU9iamVjdEJ5RGV2aWNlIiwiYXBwbHlBdHRyaWJ1dGVzIiwibWF5YmVDaGFuZ2VPYmplY3RCeUdyb3VwIiwiY29udGV4dCIsImMiLCJfc2V0S2VlcCIsIl9jdWlfa2VlcCIsIm1heWJlQXBwbHlUZW1wbGF0ZUF0dHJpYnV0ZXMiLCJuZXdBdHRyaWJ1dGVzIiwiaGFzR2xvYmFsIiwiaGFzQ2hhbmdlcyIsInVudGVtcGxhdGVkX2F0dHJpYnV0ZXMiLCJ1bnRlbXBsYXRlZF9zdGF0ZSIsIl9zdGF0ZURpc3BsYXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJ1bnRlbXBsYXRlZF9zdGF0ZURpc3BsYXkiLCJtYXliZUFwcGx5VGVtcGxhdGVzIiwibmV3UmVzdWx0IiwiY2hlY2tBdHRyaWJ1dGVzIiwibGFzdF9jaGFuZ2VkIiwiYWxsb3dIaWRkZW4iLCJmaXhHcm91cFRpdGxlcyIsImhvbWVBc3Npc3RhbnRNYWluIiwiaGFDYXJkcyIsIm1haW4iLCJjYXJkcyIsImNhcmQiLCJuYW1lRWxlbSIsInRleHRDb250ZW50IiwiY29udHJvbENvbHVtbnMiLCJjb2x1bW5zIiwicGFydGlhbENhcmRzIiwibXFscyIsIm1xbCIsInJlbW92ZUxpc3RlbmVyIiwiaGFuZGxlV2luZG93Q2hhbmdlIiwibWF0Y2hNZWRpYSIsImFkZExpc3RlbmVyIiwidXNlQ3VzdG9taXplciIsImN1c3RvbWl6ZXIiLCJoaWRlX2F0dHJpYnV0ZXMiLCJ1cGRhdGVDb25maWdQYW5lbCIsImxvY2F0aW9uIiwicGF0aG5hbWUiLCJzdGFydHNXaXRoIiwiaGFQYW5lbENvbmZpZyIsImhhQ29uZmlnTmF2aWdhdGlvbiIsImN1aVBhdGNoIiwiX29yaWdpbmFsQ29tcHV0ZUxvYWRlZCIsIl9jb21wdXRlTG9hZGVkIiwiX29yaWdpbmFsQ29tcHV0ZUNhcHRpb24iLCJfY29tcHV0ZUNhcHRpb24iLCJfb3JpZ2luYWxDb21wdXRlRGVzY3JpcHRpb24iLCJfY29tcHV0ZURlc2NyaXB0aW9uIiwicGFnZSIsInBhZ2VzIiwiY29uZiIsImNhcHRpb24iLCJsb2FkZWQiLCJnZXRIYUNvbmZpZ0N1c3RvbVVpIiwiaGFDb25maWdDdXN0b21VaSIsImlyb25QYWdlcyIsImxhc3RFbGVtZW50Q2hpbGQiLCJzZWxlY3QiLCJ2aXNpYmxlIiwiaW5zdGFsbFN0YXRlc0hvb2siLCJob21lQXNzaXN0YW50IiwiX3VwZGF0ZUhhc3MiLCJvcmlnaW5hbFVwZGF0ZSIsInVwZGF0ZSIsIm5ld0VudGl0eSIsIl90aGVtZVdhaXRlcnMiLCJ3YWl0ZXIiLCJzdGF0ZUNoYW5nZWQiLCJpbnN0YWxsUGFydGlhbENhcmRzIiwiX2RlZmF1bHRWaWV3RmlsdGVyIiwiZXhjbHVkZXMiLCJleGNsdWRlRW50aXR5SWQiLCJpbnN0YWxsQWN0aW9uTmFtZSIsImtsYXNzIiwiZGVmaW5lUHJvcGVydHkiLCJjdXN0b21Mb2NhbGl6ZSIsImFjdGlvbl9uYW1lIiwiX19kYXRhIiwic2V0IiwiaW5zdGFsbEhhU3RhdGVMYWJlbEJhZGdlIiwiaGFTdGF0ZUxhYmVsQmFkZ2UiLCJzdGFydEludGVydmFsIiwiaW5zdGFsbFN0YXRlQmFkZ2UiLCJzdGF0ZUJhZGdlIiwidXBkYXRlSWNvbkFwcGVhcmFuY2UiLCJvcmlnaW5hbFVwZGF0ZUljb25BcHBlYXJhbmNlIiwiY3VzdG9tVXBkYXRlSWNvbkFwcGVhcmFuY2UiLCJpY29uX2NvbG9yIiwiYmFja2dyb3VuZEltYWdlIiwiY29sb3IiLCJpbnN0YWxsSGFBdHRyaWJ1dGVzIiwiaGFBdHRyaWJ1dGVzIiwiY29tcHV0ZUZpbHRlcnNBcnJheSIsImN1c3RvbUNvbXB1dGVGaWx0ZXJzQXJyYXkiLCJleHRyYUZpbHRlcnMiLCJzcGxpdCIsImluc3RhbGxIYUZvcm1DdXN0b21pemUiLCJoYUZvcm1DdXN0b21pemUiLCJoYUZvcm1DdXN0b21pemVJbml0RG9uZSIsIl9jb21wdXRlU2luZ2xlQXR0cmlidXRlIiwiY3VzdG9tQ29tcHV0ZVNpbmdsZUF0dHJpYnV0ZSIsInNlY29uZGFyeSIsIl9pbml0T3Blbk9iamVjdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXROZXdBdHRyaWJ1dGVzT3B0aW9ucyIsImN1c3RvbWdldE5ld0F0dHJpYnV0ZXNPcHRpb25zIiwibG9jYWxBdHRyaWJ1dGVzIiwiZ2xvYmFsQXR0cmlidXRlcyIsImV4aXN0aW5nQXR0cmlidXRlcyIsImtub3duS2V5cyIsImZpbHRlckZyb21BdHRyaWJ1dGVzIiwic29ydCIsImluc3RhbGxDbGFzc0hvb2tzIiwiY2xhc3NJbml0RG9uZSIsImluaXQiLCJpbml0RG9uZSIsInJ1bkhvb2tzIiwibG9nIiwiQ1VTVE9NX1VJX0xJU1QiLCJ2ZXJzaW9uIiwidXJsIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInNldEl0ZW0iLCJmdW5jdGlvbkJvZHkiLCJmdW5jIiwiRnVuY3Rpb24iLCJTeW50YXhFcnJvciIsIlJlZmVyZW5jZUVycm9yIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseURBQWlELGNBQWM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ08sSUFBTUEsc0JBQXNCLGNBQTVCOztBQUVQO0FBQ08sSUFBTUMsb0JBQW9CLENBQy9CLFNBRCtCLEVBRS9CLE9BRitCLEVBRy9CLGNBSCtCLEVBSS9CLGNBSitCLEVBSy9CLGNBTCtCLEVBTS9CLFlBTitCLEVBTy9CLGNBUCtCLEVBUS9CLE9BUitCLEVBUy9CLFFBVCtCLEVBVS9CLE9BVitCLEVBVy9CLFNBWCtCLENBQTFCOztBQWNQO0FBQ08sSUFBTUMsK0JBQStCLENBQzFDLFFBRDBDLEVBRTFDLGNBRjBDLEVBRzFDLGVBSDBDLEVBSTFDLE9BSjBDLENBQXJDOztBQU9QO0FBQ08sSUFBTUMsYUFBYSxDQUN4QixRQUR3QixFQUV4QixLQUZ3QixFQUd4QixVQUh3QixDQUFuQjs7QUFNUDtBQUNP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RSxPQUFwQixDQUE0QixnQkFBNUIsRUFBOENuUixRQUFRLEVBQXREO0FBQ0QsR0F6akJrQztBQTJqQm5DckQsaUJBM2pCbUMsMkJBMmpCbkJkLFFBM2pCbUIsRUEyakJUNUUsSUEzakJTLEVBMmpCSGdCLFFBM2pCRyxFQTJqQk9HLE1BM2pCUCxFQTJqQmUvQixVQTNqQmYsRUEyakIyQmdJLFNBM2pCM0IsRUEyakJzQzdHLEtBM2pCdEMsRUEyakI2QztBQUM5RSxRQUFNNFosZUFBZ0J2VixTQUFTaEUsT0FBVCxDQUFpQixRQUFqQixLQUE4QixDQUEvQixHQUFvQ2dFLFFBQXBDLGdCQUEyREEsUUFBM0QsT0FBckI7QUFDQSxRQUFJO0FBQ0Y7QUFDQSxVQUFNd1YsT0FBTyxJQUFJQyxRQUFKLENBQ1gsTUFEVyxFQUNILFVBREcsRUFDUyxRQURULEVBQ21CLFlBRG5CLEVBQ2lDLFdBRGpDLEVBQzhDLE9BRDlDLEVBQ3VERixZQUR2RCxDQUFiO0FBRUE7QUFDQSxhQUFPQyxLQUFLcGEsSUFBTCxFQUFXZ0IsUUFBWCxFQUFxQkcsTUFBckIsRUFBNkIvQixVQUE3QixFQUF5Q2dJLFNBQXpDLEVBQW9EN0csS0FBcEQsQ0FBUDtBQUNELEtBTkQsQ0FNRSxPQUFPNEgsQ0FBUCxFQUFVO0FBQ1Y7QUFDQSxVQUFLQSxhQUFhbVMsV0FBZCxJQUE4Qm5TLGFBQWFvUyxjQUEvQyxFQUErRDtBQUM3RDVPLGdCQUFRQyxJQUFSLENBQWdCekQsRUFBRVksSUFBbEIsVUFBMkJaLEVBQUVxUyxPQUE3QixxQkFBb0RMLFlBQXBEO0FBQ0EsZUFBTyxJQUFQO0FBQ0Q7QUFDRDtBQUNBLFlBQU1oUyxDQUFOO0FBQ0Q7QUFDRjtBQTVrQmtDLENBQXJDO0FBOGtCQTVKLE9BQU9rSCxRQUFQLENBQWdCZ1UsSUFBaEIsRzs7Ozs7Ozs7Ozs7OztBQ3RsQkEsK0RBQWUsVUFBZixFIiwiZmlsZSI6InNjcmlwdHMtZGJnLWVzNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9lbnRyeXBvaW50cy9zY3JpcHRzLmpzXCIpO1xuIiwiLyoqIENvbnN0YW50cyB0byBiZSB1c2VkIGluIHRoZSBmcm9udGVuZC4gKi9cblxuLy8gQ29uc3RhbnRzIHNob3VsZCBiZSBhbHBoYWJldGljYWxseSBzb3J0ZWQgYnkgbmFtZS5cbi8vIEFycmF5cyB3aXRoIHZhbHVlcyBzaG91bGQgYmUgYWxwaGFiZXRpY2FsbHkgc29ydGVkIGlmIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLlxuLy8gRWFjaCBjb25zdGFudCBzaG91bGQgaGF2ZSBhIGRlc2NyaXB0aW9uIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3IuXG5cbi8qKiBJY29uIHRvIHVzZSB3aGVuIG5vIGljb24gc3BlY2lmaWVkIGZvciBkb21haW4uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ET01BSU5fSUNPTiA9ICdtZGk6Ym9va21hcmsnO1xuXG4vKiogRG9tYWlucyB0aGF0IGhhdmUgYSBzdGF0ZSBjYXJkLiAqL1xuZXhwb3J0IGNvbnN0IERPTUFJTlNfV0lUSF9DQVJEID0gW1xuICAnY2xpbWF0ZScsXG4gICdjb3ZlcicsXG4gICdjb25maWd1cmF0b3InLFxuICAnaW5wdXRfc2VsZWN0JyxcbiAgJ2lucHV0X251bWJlcicsXG4gICdpbnB1dF90ZXh0JyxcbiAgJ21lZGlhX3BsYXllcicsXG4gICdzY2VuZScsXG4gICdzY3JpcHQnLFxuICAndGltZXInLFxuICAnd2VibGluaycsXG5dO1xuXG4vKiogRG9tYWlucyB0aGF0IHNob3VsZCBoYXZlIHRoZSBoaXN0b3J5IGhpZGRlbiBpbiB0aGUgbW9yZSBpbmZvIGRpYWxvZy4gKi9cbmV4cG9ydCBjb25zdCBET01BSU5TX01PUkVfSU5GT19OT19ISVNUT1JZID0gW1xuICAnY2FtZXJhJyxcbiAgJ2NvbmZpZ3VyYXRvcicsXG4gICdoaXN0b3J5X2dyYXBoJyxcbiAgJ3NjZW5lJyxcbl07XG5cbi8qKiBTdGF0ZXMgdGhhdCB3ZSBjb25zaWRlciBcIm9mZlwiLiAqL1xuZXhwb3J0IGNvbnN0IFNUQVRFU19PRkYgPSBbXG4gICdjbG9zZWQnLFxuICAnb2ZmJyxcbiAgJ3VubG9ja2VkJyxcbl07XG5cbi8qKiBUZW1wZXJhdHVyZSB1bml0cy4gKi9cbmV4cG9ydCBjb25zdCBVTklUX0MgPSAnwrBDJztcbmV4cG9ydCBjb25zdCBVTklUX0YgPSAnwrBGJztcblxuLyoqIEVudGl0eSBJRCBvZiB0aGUgZGVmYXVsdCB2aWV3LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVklFV19FTlRJVFlfSUQgPSAnZ3JvdXAuZGVmYXVsdF92aWV3JztcbiIsIi8qKlxuICogQXBwbHkgYSB0aGVtZSB0byBhbiBlbGVtZW50IGJ5IHNldHRpbmcgdGhlIENTUyB2YXJpYWJsZXMgb24gaXQuXG4gKlxuICogZWxlbWVudDogRWxlbWVudCB0byBhcHBseSB0aGVtZSBvbi5cbiAqIHRoZW1lczogSEFTUyBUaGVtZSBpbmZvcm1hdGlvblxuICogbG9jYWxUaGVtZTogc2VsZWN0ZWQgdGhlbWUuXG4gKiB1cGRhdGVNZXRhOiBib29sZWFuIGlmIHdlIHNob3VsZCB1cGRhdGUgdGhlIHRoZW1lLWNvbG9yIG1ldGEgZWxlbWVudC5cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcHBseVRoZW1lc09uRWxlbWVudChlbGVtZW50LCB0aGVtZXMsIGxvY2FsVGhlbWUsIHVwZGF0ZU1ldGEgPSBmYWxzZSkge1xuICBpZiAoIWVsZW1lbnQuX3RoZW1lcykge1xuICAgIGVsZW1lbnQuX3RoZW1lcyA9IHt9O1xuICB9XG4gIGxldCB0aGVtZU5hbWUgPSB0aGVtZXMuZGVmYXVsdF90aGVtZTtcbiAgaWYgKGxvY2FsVGhlbWUgPT09ICdkZWZhdWx0JyB8fCAobG9jYWxUaGVtZSAmJiB0aGVtZXMudGhlbWVzW2xvY2FsVGhlbWVdKSkge1xuICAgIHRoZW1lTmFtZSA9IGxvY2FsVGhlbWU7XG4gIH1cbiAgY29uc3Qgc3R5bGVzID0gT2JqZWN0LmFzc2lnbih7fSwgZWxlbWVudC5fdGhlbWVzKTtcbiAgaWYgKHRoZW1lTmFtZSAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgdmFyIHRoZW1lID0gdGhlbWVzLnRoZW1lc1t0aGVtZU5hbWVdO1xuICAgIE9iamVjdC5rZXlzKHRoZW1lKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHZhciBwcmVmaXhlZEtleSA9ICctLScgKyBrZXk7XG4gICAgICBlbGVtZW50Ll90aGVtZXNbcHJlZml4ZWRLZXldID0gJyc7XG4gICAgICBzdHlsZXNbcHJlZml4ZWRLZXldID0gdGhlbWVba2V5XTtcbiAgICB9KTtcbiAgfVxuICBpZiAoZWxlbWVudC51cGRhdGVTdHlsZXMpIHtcbiAgICBlbGVtZW50LnVwZGF0ZVN0eWxlcyhzdHlsZXMpO1xuICB9IGVsc2UgaWYgKHdpbmRvdy5TaGFkeUNTUykge1xuICAgIC8vIGltcGxlbWVudCB1cGRhdGVTdHlsZXMoKSBtZXRob2Qgb2YgUG9sZW1lciBlbGVtZW50c1xuICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZVN1YnRyZWUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKGVsZW1lbnQpLCBzdHlsZXMpO1xuICB9XG5cbiAgaWYgKCF1cGRhdGVNZXRhKSByZXR1cm47XG5cbiAgY29uc3QgbWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT10aGVtZS1jb2xvcl0nKTtcbiAgaWYgKG1ldGEpIHtcbiAgICBpZiAoIW1ldGEuaGFzQXR0cmlidXRlKCdkZWZhdWx0LWNvbnRlbnQnKSkge1xuICAgICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ2RlZmF1bHQtY29udGVudCcsIG1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykpO1xuICAgIH1cbiAgICBjb25zdCB0aGVtZUNvbG9yID0gc3R5bGVzWyctLXByaW1hcnktY29sb3InXSB8fCBtZXRhLmdldEF0dHJpYnV0ZSgnZGVmYXVsdC1jb250ZW50Jyk7XG4gICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCB0aGVtZUNvbG9yKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBVcGRhdGUgcm9vdCdzIGNoaWxkIGVsZW1lbnQgdG8gYmUgbmV3RWxlbWVudFRhZyByZXBsYWNpbmcgYW5vdGhlciBleGlzdGluZyBjaGlsZCBpZiBhbnkuXG4gKiBDb3B5IGF0dHJpYnV0ZXMgaW50byB0aGUgY2hpbGQgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHluYW1pY0NvbnRlbnRVcGRhdGVyKHJvb3QsIG5ld0VsZW1lbnRUYWcsIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3Qgcm9vdEVsID0gcm9vdDtcbiAgbGV0IGN1c3RvbUVsO1xuXG4gIGlmIChyb290RWwubGFzdENoaWxkICYmIHJvb3RFbC5sYXN0Q2hpbGQudGFnTmFtZSA9PT0gbmV3RWxlbWVudFRhZykge1xuICAgIGN1c3RvbUVsID0gcm9vdEVsLmxhc3RDaGlsZDtcbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdEVsLmxhc3RDaGlsZCkge1xuICAgICAgcm9vdEVsLnJlbW92ZUNoaWxkKHJvb3RFbC5sYXN0Q2hpbGQpO1xuICAgIH1cbiAgICAvLyBDcmVhdGluZyBhbiBlbGVtZW50IHdpdGggdXBwZXIgY2FzZSB3b3JrcyBmaW5lIGluIENocm9tZSwgYnV0IGluIEZGIGl0IGRvZXNuJ3QgaW1tZWRpYXRlbHlcbiAgICAvLyBiZWNvbWUgYSBkZWZpbmVkIEN1c3RvbSBFbGVtZW50LiBQb2x5bWVyIGRvZXMgdGhhdCBpbiBzb21lIGxhdGVyIHBhc3MuXG4gICAgY3VzdG9tRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5ld0VsZW1lbnRUYWcudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICBpZiAoY3VzdG9tRWwuc2V0UHJvcGVydGllcykge1xuICAgIGN1c3RvbUVsLnNldFByb3BlcnRpZXMoYXR0cmlidXRlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbiB3YXNuJ3QgbG9hZGVkIHlldCAtIHNldFByb3BlcnRpZXMgd291bGQgYmVcbiAgICAvLyBtaXNzaW5nLCBidXQgbm8gaGFybSBpbiBzZXR0aW5nIGF0dHJpYnV0ZXMgb25lLWJ5LW9uZSB0aGVuLlxuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY3VzdG9tRWxba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjdXN0b21FbC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcm9vdEVsLmFwcGVuZENoaWxkKGN1c3RvbUVsKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FuVG9nZ2xlRG9tYWluKGhhc3MsIGRvbWFpbikge1xuICBjb25zdCBzZXJ2aWNlcyA9IGhhc3MuY29uZmlnLnNlcnZpY2VzW2RvbWFpbl07XG4gIGlmICghc2VydmljZXMpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgaWYgKGRvbWFpbiA9PT0gJ2xvY2snKSB7XG4gICAgcmV0dXJuICdsb2NrJyBpbiBzZXJ2aWNlcztcbiAgfSBlbHNlIGlmIChkb21haW4gPT09ICdjb3ZlcicpIHtcbiAgICByZXR1cm4gJ29wZW5fY292ZXInIGluIHNlcnZpY2VzO1xuICB9XG4gIHJldHVybiAndHVybl9vbicgaW4gc2VydmljZXM7XG59XG4iLCJpbXBvcnQgY2FuVG9nZ2xlRG9tYWluIGZyb20gJy4vY2FuX3RvZ2dsZV9kb21haW4uanMnO1xuaW1wb3J0IGNvbXB1dGVTdGF0ZURvbWFpbiBmcm9tICcuL2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FuVG9nZ2xlU3RhdGUoaGFzcywgc3RhdGVPYmopIHtcbiAgY29uc3QgZG9tYWluID0gY29tcHV0ZVN0YXRlRG9tYWluKHN0YXRlT2JqKTtcbiAgaWYgKGRvbWFpbiA9PT0gJ2dyb3VwJykge1xuICAgIHJldHVybiBzdGF0ZU9iai5zdGF0ZSA9PT0gJ29uJyB8fCBzdGF0ZU9iai5zdGF0ZSA9PT0gJ29mZic7XG4gIH1cbiAgaWYgKGRvbWFpbiA9PT0gJ2NsaW1hdGUnKSB7XG4gICAgcmV0dXJuICEhKChzdGF0ZU9iai5hdHRyaWJ1dGVzIHx8IHt9KS5zdXBwb3J0ZWRfZmVhdHVyZXMgJiA0MDk2KTtcbiAgfVxuXG4gIHJldHVybiBjYW5Ub2dnbGVEb21haW4oaGFzcywgZG9tYWluKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVEb21haW4oZW50aXR5SWQpIHtcbiAgcmV0dXJuIGVudGl0eUlkLnN1YnN0cigwLCBlbnRpdHlJZC5pbmRleE9mKCcuJykpO1xufVxuIiwiaW1wb3J0IGNvbXB1dGVEb21haW4gZnJvbSAnLi9jb21wdXRlX2RvbWFpbi5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVTdGF0ZURvbWFpbihzdGF0ZU9iaikge1xuICBpZiAoIXN0YXRlT2JqLl9kb21haW4pIHtcbiAgICBzdGF0ZU9iai5fZG9tYWluID0gY29tcHV0ZURvbWFpbihzdGF0ZU9iai5lbnRpdHlfaWQpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlT2JqLl9kb21haW47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRHcm91cEVudGl0aWVzKGVudGl0aWVzLCBncm91cCkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcblxuICBncm91cC5hdHRyaWJ1dGVzLmVudGl0eV9pZC5mb3JFYWNoKChlbnRpdHlJZCkgPT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IGVudGl0aWVzW2VudGl0eUlkXTtcblxuICAgIGlmIChlbnRpdHkpIHtcbiAgICAgIHJlc3VsdFtlbnRpdHkuZW50aXR5X2lkXSA9IGVudGl0eTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgY29tcHV0ZURvbWFpbiBmcm9tICcuL2NvbXB1dGVfZG9tYWluLmpzJztcbmltcG9ydCBnZXRHcm91cEVudGl0aWVzIGZyb20gJy4vZ2V0X2dyb3VwX2VudGl0aWVzLmpzJztcblxuLy8gUmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCBlbnRpdGllcyB0aGF0IHRoZSB2aWV3IHdpbGwgc2hvd1xuLy8gaW5jbHVkaW5nIGVtYmVkZGVkIGdyb3Vwcy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdFbnRpdGllcyhlbnRpdGllcywgdmlldykge1xuICBjb25zdCB2aWV3RW50aXRpZXMgPSB7fTtcblxuICB2aWV3LmF0dHJpYnV0ZXMuZW50aXR5X2lkLmZvckVhY2goKGVudGl0eUlkKSA9PiB7XG4gICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbZW50aXR5SWRdO1xuXG4gICAgaWYgKGVudGl0eSAmJiAhZW50aXR5LmF0dHJpYnV0ZXMuaGlkZGVuKSB7XG4gICAgICB2aWV3RW50aXRpZXNbZW50aXR5LmVudGl0eV9pZF0gPSBlbnRpdHk7XG5cbiAgICAgIGlmIChjb21wdXRlRG9tYWluKGVudGl0eS5lbnRpdHlfaWQpID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwRW50aXRpZXMgPSBnZXRHcm91cEVudGl0aWVzKGVudGl0aWVzLCBlbnRpdHkpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGdyb3VwRW50aXRpZXMpLmZvckVhY2goKGdyRW50aXR5SWQpID0+IHtcbiAgICAgICAgICBjb25zdCBnckVudGl0eSA9IGdyb3VwRW50aXRpZXNbZ3JFbnRpdHlJZF07XG5cbiAgICAgICAgICBpZiAoIWdyRW50aXR5LmF0dHJpYnV0ZXMuaGlkZGVuKSB7XG4gICAgICAgICAgICB2aWV3RW50aXRpZXNbZ3JFbnRpdHlJZF0gPSBnckVudGl0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHZpZXdFbnRpdGllcztcbn1cbiIsImltcG9ydCBjYW5Ub2dnbGVTdGF0ZSBmcm9tICcuL2Nhbl90b2dnbGVfc3RhdGUuanMnO1xuaW1wb3J0IGNvbXB1dGVTdGF0ZURvbWFpbiBmcm9tICcuL2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzJztcbmltcG9ydCB7IERPTUFJTlNfV0lUSF9DQVJEIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGF0ZUNhcmRUeXBlKGhhc3MsIHN0YXRlT2JqKSB7XG4gIGlmIChzdGF0ZU9iai5zdGF0ZSA9PT0gJ3VuYXZhaWxhYmxlJykge1xuICAgIHJldHVybiAnZGlzcGxheSc7XG4gIH1cblxuICBjb25zdCBkb21haW4gPSBjb21wdXRlU3RhdGVEb21haW4oc3RhdGVPYmopO1xuXG4gIGlmIChET01BSU5TX1dJVEhfQ0FSRC5pbmNsdWRlcyhkb21haW4pKSB7XG4gICAgcmV0dXJuIGRvbWFpbjtcbiAgfSBlbHNlIGlmIChjYW5Ub2dnbGVTdGF0ZShoYXNzLCBzdGF0ZU9iaikgJiZcbiAgICAgICAgICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbnRyb2wgIT09ICdoaWRkZW4nKSB7XG4gICAgcmV0dXJuICd0b2dnbGUnO1xuICB9XG4gIHJldHVybiAnZGlzcGxheSc7XG59XG4iLCJjb25zdCBoYXNzQXR0cmlidXRlVXRpbCA9IHt9O1xuXG5oYXNzQXR0cmlidXRlVXRpbC5ET01BSU5fREVWSUNFX0NMQVNTID0ge1xuICBiaW5hcnlfc2Vuc29yOiBbXG4gICAgJ2JhdHRlcnknLFxuICAgICdjb2xkJyxcbiAgICAnY29ubmVjdGl2aXR5JyxcbiAgICAnZG9vcicsXG4gICAgJ2dhcmFnZV9kb29yJyxcbiAgICAnZ2FzJyxcbiAgICAnaGVhdCcsXG4gICAgJ2xpZ2h0JyxcbiAgICAnbG9jaycsXG4gICAgJ21vaXN0dXJlJyxcbiAgICAnbW90aW9uJyxcbiAgICAnbW92aW5nJyxcbiAgICAnb2NjdXBhbmN5JyxcbiAgICAnb3BlbmluZycsXG4gICAgJ3BsdWcnLFxuICAgICdwb3dlcicsXG4gICAgJ3ByZXNlbmNlJyxcbiAgICAncHJvYmxlbScsXG4gICAgJ3NhZmV0eScsXG4gICAgJ3Ntb2tlJyxcbiAgICAnc291bmQnLFxuICAgICd2aWJyYXRpb24nLFxuICAgICd3aW5kb3cnXG4gIF0sXG4gIGNvdmVyOiBbJ2dhcmFnZSddLFxuICBzZW5zb3I6IFtcbiAgICAnYmF0dGVyeScsXG4gICAgJ2h1bWlkaXR5JyxcbiAgICAnaWxsdW1pbmFuY2UnLFxuICAgICd0ZW1wZXJhdHVyZSdcbiAgXSxcbn07XG5cbmhhc3NBdHRyaWJ1dGVVdGlsLlVOS05PV05fVFlQRSA9ICdqc29uJztcbmhhc3NBdHRyaWJ1dGVVdGlsLkFERF9UWVBFID0gJ2tleS12YWx1ZSc7XG5cbmhhc3NBdHRyaWJ1dGVVdGlsLlRZUEVfVE9fVEFHID0ge1xuICBzdHJpbmc6ICdoYS1jdXN0b21pemUtc3RyaW5nJyxcbiAganNvbjogJ2hhLWN1c3RvbWl6ZS1zdHJpbmcnLFxuICBpY29uOiAnaGEtY3VzdG9taXplLWljb24nLFxuICBib29sZWFuOiAnaGEtY3VzdG9taXplLWJvb2xlYW4nLFxuICBhcnJheTogJ2hhLWN1c3RvbWl6ZS1hcnJheScsXG4gICdrZXktdmFsdWUnOiAnaGEtY3VzdG9taXplLWtleS12YWx1ZScsXG59O1xuXG4vLyBBdHRyaWJ1dGVzIGhlcmUgc2VydmUgZHVhbCBwdXJwb3NlOlxuLy8gMSkgQW55IGtleSBvZiB0aGlzIG9iamVjdCB3b24ndCBiZSBzaG93biBpbiBtb3JlLWluZm8gd2luZG93LlxuLy8gMikgQW55IGtleSB3aGljaCBoYXMgdmFsdWUgb3RoZXIgdGhhbiB1bmRlZmluZWQgd2lsbCBhcHBlYXIgaW4gY3VzdG9taXphdGlvblxuLy8gICAgY29uZmlnIGFjY29yZGluZyB0byBpdHMgdmFsdWUuXG5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTID1cbiAgaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFUyB8fCB7XG4gICAgZW50aXR5X3BpY3R1cmU6IHVuZGVmaW5lZCxcbiAgICBmcmllbmRseV9uYW1lOiB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ05hbWUnIH0sXG4gICAgaWNvbjogeyB0eXBlOiAnaWNvbicgfSxcbiAgICBlbXVsYXRlZF9odWU6IHtcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIGRvbWFpbnM6IFsnZW11bGF0ZWRfaHVlJ11cbiAgICB9LFxuICAgIGVtdWxhdGVkX2h1ZV9uYW1lOiB7XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRvbWFpbnM6IFsnZW11bGF0ZWRfaHVlJ11cbiAgICB9LFxuICAgIGhhYXNrYV9oaWRkZW46IHVuZGVmaW5lZCxcbiAgICBoYWFza2FfbmFtZTogdW5kZWZpbmVkLFxuICAgIGhvbWVicmlkZ2VfaGlkZGVuOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgIGhvbWVicmlkZ2VfbmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHN1cHBvcnRlZF9mZWF0dXJlczogdW5kZWZpbmVkLFxuICAgIGF0dHJpYnV0aW9uOiB1bmRlZmluZWQsXG4gICAgY3VzdG9tX3VpX21vcmVfaW5mbzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIGN1c3RvbV91aV9zdGF0ZV9jYXJkOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgZGV2aWNlX2NsYXNzOiB7XG4gICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgb3B0aW9uczogaGFzc0F0dHJpYnV0ZVV0aWwuRE9NQUlOX0RFVklDRV9DTEFTUyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGV2aWNlIGNsYXNzJyxcbiAgICAgIGRvbWFpbnM6IFsnYmluYXJ5X3NlbnNvcicsICdjb3ZlcicsICdzZW5zb3InXVxuICAgIH0sXG4gICAgaGlkZGVuOiB7IHR5cGU6ICdib29sZWFuJywgZGVzY3JpcHRpb246ICdIaWRlIGZyb20gVUknIH0sXG4gICAgYXNzdW1lZF9zdGF0ZToge1xuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZG9tYWluczogWydzd2l0Y2gnLCAnbGlnaHQnLCAnY292ZXInLCAnY2xpbWF0ZScsICdmYW4nLCAnZ3JvdXAnXVxuICAgIH0sXG4gICAgaW5pdGlhbF9zdGF0ZToge1xuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkb21haW5zOiBbJ2F1dG9tYXRpb24nXVxuICAgIH0sXG4gICAgdW5pdF9vZl9tZWFzdXJlbWVudDogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICB9O1xuXG5leHBvcnQgZGVmYXVsdCBoYXNzQXR0cmlidXRlVXRpbDtcbiIsIi8qKlxuQGxpY2Vuc2VcbkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG5Db2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG5cbndpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCkgeyByZXR1cm4gcHJvcDsgfTtcbiIsIi8qKlxuQGxpY2Vuc2VcbkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG5Db2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG5pbXBvcnQgJy4vYm9vdC5qcyc7XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXJcbiAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGVcbiAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKi9cbmNsYXNzIExpdGVyYWxTdHJpbmcge1xuICBjb25zdHJ1Y3RvcihzdHJpbmcpIHtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTFxuICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamBcbiAqL1xuZnVuY3Rpb24gbGl0ZXJhbFZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpdGVyYWxTdHJpbmcpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHshTGl0ZXJhbFN0cmluZ30gKi8odmFsdWUpLnZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG5vbi1saXRlcmFsIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyJ3MgaHRtbExpdGVyYWwgZnVuY3Rpb246ICR7dmFsdWV9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYFxuICovXG5mdW5jdGlvbiBodG1sVmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgIHJldHVybiAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50IH0gKi8odmFsdWUpLmlubmVySFRNTDtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpdGVyYWxTdHJpbmcpIHtcbiAgICByZXR1cm4gbGl0ZXJhbFZhbHVlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIncyBodG1sIGZ1bmN0aW9uOiAke3ZhbHVlfWApO1xuICB9XG59XG5cbi8qKlxuICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGVcbiAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LlxuICpcbiAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluXG4gKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3NcbiAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXJcbiAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBodG1sTGl0ZXJhbGBcbiAqIHdoaWNoIGVuc3VyZXMgb25seSBsaXRlcmFsIHZhbHVlcyBmcm9tIEpTIHNvdXJjZSBldmVyIHJlYWNoIHRoZSBIVE1MLCB0b1xuICogZ3VhcmQgYWdhaW5zdCBYU1Mgcmlza3MuXG4gKlxuICogQWxsIG90aGVyIHZhbHVlcyBhcmUgZGlzYWxsb3dlZCBpbiBleHByZXNzaW9ucyB0byBoZWxwIHByZXZlbnQgWFNTXG4gKiBhdHRhY2tzOyBob3dldmVyLCBgaHRtbExpdGVyYWxgIGNhbiBiZSB1c2VkIHRvIGNvbXBvc2Ugc3RhdGljXG4gKiBzdHJpbmcgdmFsdWVzIGludG8gdGVtcGxhdGVzLiBUaGlzIGlzIHVzZWZ1bCB0byBjb21wb3NlIHN0cmluZ3MgaW50b1xuICogcGxhY2VzIHRoYXQgZG8gbm90IGFjY2VwdCBodG1sLCBsaWtlIHRoZSBjc3MgdGV4dCBvZiBhIGBzdHlsZWBcbiAqIGVsZW1lbnQuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAqICAgICAgIHJldHVybiBodG1sYFxuICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6XCIuLi5cIiB9PC9zdHlsZT5cbiAqICAgICAgICAgPGRpdiBjbGFzcz1cInNoYWRvd2VkXCI+JHt0aGlzLnBhcnRpYWxUZW1wbGF0ZX08L2Rpdj5cbiAqICAgICAgICAgJHtzdXBlci50ZW1wbGF0ZX1cbiAqICAgICAgIGA7XG4gKiAgICAgfVxuICogICAgIHN0YXRpYyBnZXQgcGFydGlhbFRlbXBsYXRlKCkgeyByZXR1cm4gaHRtbGA8c3Bhbj5QYXJ0aWFsITwvc3Bhbj5gOyB9XG4gKlxuICogQHBhcmFtIHshSVRlbXBsYXRlQXJyYXl9IHN0cmluZ3MgQ29uc3RhbnQgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB7Li4uKn0gdmFsdWVzIFZhcmlhYmxlIHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJuIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gQ29uc3RydWN0ZWQgSFRNTFRlbXBsYXRlRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7XG4gIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7XG4gIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PlxuICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7XG4gIHJldHVybiB0ZW1wbGF0ZTtcbn07XG5cbi8qKlxuICogQW4gaHRtbCBsaXRlcmFsIHRhZyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYGh0bWxgIHRvIGNvbXBvc2UuXG4gKiBhIGxpdGVyYWwgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gKiAgICAgICByZXR1cm4gaHRtbGBcbiAqICAgICAgICAgPHN0eWxlPlxuICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cbiAqICAgICAgICAgICAke3RoaXMuc3R5bGVUZW1wbGF0ZSgpfVxuICogICAgICAgICA8L3N0eWxlPlxuICogICAgICAgICA8ZGl2IGNsYXNzPVwic2hhZG93ZWRcIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PlxuICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfVxuICogICAgICAgYDtcbiAqICAgICB9XG4gKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkge1xuICogICAgICAgIHJldHVybiBodG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDtcbiAqICAgICB9XG4gKlxuICogQHBhcmFtIHshSVRlbXBsYXRlQXJyYXl9IHN0cmluZ3MgQ29uc3RhbnQgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB7Li4uKn0gdmFsdWVzIFZhcmlhYmxlIHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJuIHshTGl0ZXJhbFN0cmluZ30gQ29uc3RydWN0ZWQgbGl0ZXJhbCBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7XG4gIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT5cbiAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTtcbn07XG4iLCJpbXBvcnQgJy4uL3V0aWxzL2hvb2tzLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBDdWlCYXNlRWxlbWVudCBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzczogT2JqZWN0LFxuICAgICAgaW5EaWFsb2c6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHN0YXRlT2JqOiBPYmplY3QsXG4gICAgICBjb250cm9sRWxlbWVudDogU3RyaW5nLFxuICAgICAgZXh0cmE6IHtcbiAgICAgICAgdHlwZTogQXJyYXksXG4gICAgICAgIGNvbXB1dGVkOiAnY29tcHV0ZUV4dHJhKGhhc3MsIHN0YXRlT2JqKScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjb21wdXRlRXh0cmEoaGFzcywgc3RhdGVPYmopIHtcbiAgICBsZXQgZXh0cmFzID0gc3RhdGVPYmouYXR0cmlidXRlcy5leHRyYV9kYXRhX3RlbXBsYXRlO1xuICAgIGlmIChleHRyYXMpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShleHRyYXMpKSB7XG4gICAgICAgIGV4dHJhcyA9IFtleHRyYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4dHJhcy5tYXAoZXh0cmEgPT4gd2luZG93LmN1c3RvbVVJLmNvbXB1dGVUZW1wbGF0ZShcbiAgICAgICAgZXh0cmEsXG4gICAgICAgIGhhc3MsXG4gICAgICAgIGhhc3Muc3RhdGVzLFxuICAgICAgICBzdGF0ZU9iaixcbiAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlcyxcbiAgICAgICAgLyogYXR0cmlidXRlPSAqLyB1bmRlZmluZWQsXG4gICAgICAgIHN0YXRlT2JqLnN0YXRlLFxuICAgICAgKSkuZmlsdGVyKHJlc3VsdCA9PiByZXN1bHQgIT09IG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBzaG93TGFzdENoYW5nZWQoc3RhdGVPYmosIGluRGlhbG9nLCBleHRyYSkge1xuICAgIGlmIChpbkRpYWxvZykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGV4dHJhLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhIXN0YXRlT2JqLmF0dHJpYnV0ZXMuc2hvd19sYXN0X2NoYW5nZWQ7XG4gIH1cblxuICBoYXNFeHRyYShleHRyYSkge1xuICAgIHJldHVybiBleHRyYS5sZW5ndGggPiAwO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBDdWlCYXNlRWxlbWVudDtcbiIsImltcG9ydCBkeW5hbWljQ29udGVudFVwZGF0ZXIgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9keW5hbWljX2NvbnRlbnRfdXBkYXRlci5qcyc7XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgRHluYW1pY0VsZW1lbnQgZXh0ZW5kcyBQb2x5bWVyLkVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc3M6IE9iamVjdCxcbiAgICAgIHN0YXRlT2JqOiBPYmplY3QsXG4gICAgICBlbGVtZW50TmFtZTogU3RyaW5nLFxuXG4gICAgICBpbkRpYWxvZzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ29ic2VydmVyRnVuYyhoYXNzLCBzdGF0ZU9iaiwgZWxlbWVudE5hbWUsIGluRGlhbG9nKScsXG4gICAgXTtcbiAgfVxuXG4gIG9ic2VydmVyRnVuYyhoYXNzLCBzdGF0ZU9iaiwgZWxlbWVudE5hbWUsIGluRGlhbG9nKSB7XG4gICAgZHluYW1pY0NvbnRlbnRVcGRhdGVyKFxuICAgICAgdGhpcyxcbiAgICAgIGVsZW1lbnROYW1lID8gZWxlbWVudE5hbWUudG9VcHBlckNhc2UoKSA6ICdESVYnLFxuICAgICAgeyBoYXNzLCBzdGF0ZU9iaiwgaW5EaWFsb2cgfSk7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZHluYW1pYy1lbGVtZW50JywgRHluYW1pY0VsZW1lbnQpO1xuIiwiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzJztcbmltcG9ydCBhcHBseVRoZW1lc09uRWxlbWVudCBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZG9tL2FwcGx5X3RoZW1lc19vbl9lbGVtZW50LmpzJztcblxuaW1wb3J0ICcuL2R5bmFtaWMtZWxlbWVudC5qcyc7XG5pbXBvcnQgJy4uL3V0aWxzL2hvb2tzLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBEeW5hbWljV2l0aEV4dHJhIGV4dGVuZHMgY3VzdG9tRWxlbWVudHMuZ2V0KCdzdGF0ZS1jYXJkLWRpc3BsYXknKSB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlIGlzPVwiY3VzdG9tLXN0eWxlXCIgaW5jbHVkZT1cImlyb24tZmxleCBpcm9uLWZsZXgtYWxpZ25tZW50IGlyb24tZmxleC1mYWN0b3JzXCI+PC9zdHlsZT5cbiAgICA8c3R5bGU+XG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIH1cbiAgICAgIC5jb250cm9sLXdyYXBwZXIge1xuICAgICAgICBtYXJnaW46IC00cHggLTE2cHggLTRweCAwO1xuICAgICAgICBwYWRkaW5nOiA0cHggMTZweDtcbiAgICAgIH1cbiAgICAgIGhhLXN0YXRlLWxhYmVsLWJhZGdlIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgIH1cbiAgICAgIGR5bmFtaWMtZWxlbWVudCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgIH1cbiAgICAgICNvdmVybGF5IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgfVxuICAgICAgI2xvY2sge1xuICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgICAgIG9wYWNpdHk6IDAuMztcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA3cHg7XG4gICAgICB9XG4gICAgICAjbG9jay5oYS1jb3Zlci1jb250cm9scyB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNTJweDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgICB9XG4gICAgICAuZXh0cmEge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTZweDtcbiAgICAgICAgLS1oYS1sYWJlbC1iYWRnZS1zaXplOiAzNnB4O1xuICAgICAgICAtLWhhLWxhYmVsLWJhZGdlLWZvbnQtc2l6ZTogMS4yZW07XG4gICAgICB9XG4gICAgICAuc3RhdGUge1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxO1xuICAgICAgICBjb2xvcjogdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgICBsaW5lLWhlaWdodDogNDBweDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3MkPSdbW2V4dHJhQ2xhc3MoZXh0cmFPYmpWaXNpYmxlKV1dIGhvcml6b250YWwgbGF5b3V0Jz5cbiAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tleHRyYU9ialZpc2libGVdXSc+XG4gICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLXJlcGVhdCdcbiAgICAgICAgICAgICAgICAgIGl0ZW1zPSdbW2V4dHJhT2JqXV0nXG4gICAgICAgICAgICAgICAgICBvbi1kb20tY2hhbmdlPSdleHRyYURvbUNoYW5nZWQnPlxuICAgICAgICAgIDxoYS1zdGF0ZS1sYWJlbC1iYWRnZSBoYXNzPSdbW2hhc3NdXScgc3RhdGU9J1tbaXRlbV1dJz48L2hhLXN0YXRlLWxhYmVsLWJhZGdlPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tfc2hvd0NvbnRyb2woaW5EaWFsb2csIHN0YXRlT2JqKV1dJz5cbiAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW2NvbnRyb2xFbGVtZW50XV0nPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkeW5hbWljLWVsZW1lbnRcbiAgICAgICAgICAgICAgICBjbGFzcz0nZmxleCdcbiAgICAgICAgICAgICAgICBzdGF0ZS1vYmo9XCJbW3N0YXRlT2JqXV1cIlxuICAgICAgICAgICAgICAgIGhhc3M9J1tbaGFzc11dJ1xuICAgICAgICAgICAgICAgIGVsZW1lbnQtbmFtZT0nW1tjb250cm9sRWxlbWVudF1dJz5cbiAgICAgICAgICAgIDwvZHluYW1pYy1lbGVtZW50PlxuICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW2lzQ29uZmlybUNvbnRyb2xzKHN0YXRlT2JqKV1dJz5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cIm92ZXJsYXlcIiBvbi1jbGljaz0nY2xpY2tIYW5kbGVyJz5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbc3RhdGVPYmouYXR0cmlidXRlcy5jb25maXJtX2NvbnRyb2xzX3Nob3dfbG9ja11dJz5cbiAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWQ9XCJsb2NrXCIgY2xhc3MkPVwiW1tjb250cm9sRWxlbWVudF1dXCIgaWNvbj1cIm1kaTpsb2NrLW91dGxpbmVcIj48L2lyb24taWNvbj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1shY29udHJvbEVsZW1lbnRdXSc+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nc3RhdGUnPltbY29tcHV0ZVN0YXRlRGlzcGxheShzdGF0ZU9iaildXTwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNzOiBPYmplY3QsXG4gICAgICBpbkRpYWxvZzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgc3RhdGVPYmo6IE9iamVjdCxcbiAgICAgIGNvbnRyb2xFbGVtZW50OiBTdHJpbmcsXG4gICAgICBleHRyYU9iajoge1xuICAgICAgICB0eXBlOiBBcnJheSxcbiAgICAgICAgY29tcHV0ZWQ6ICdjb21wdXRlRXh0cmEoaGFzcywgc3RhdGVPYmosIF9hdHRhY2hlZCknLFxuICAgICAgfSxcbiAgICAgIF9hdHRhY2hlZDogQm9vbGVhbixcbiAgICAgIGV4dHJhT2JqVmlzaWJsZToge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBjb21wdXRlZDogJ2NvbXB1dGVFeHRyYVZpc2libGUoZXh0cmFPYmosIGluRGlhbG9nKScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX2F0dGFjaGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2lzQXR0YWNoZWQgPSBmYWxzZTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgY29tcHV0ZUV4dHJhKGhhc3MsIHN0YXRlT2JqLCBhdHRhY2hlZCkge1xuICAgIGlmICghc3RhdGVPYmouYXR0cmlidXRlcy5leHRyYV9iYWRnZSB8fCAhYXR0YWNoZWQpIHJldHVybiBbXTtcbiAgICBsZXQgZXh0cmFCYWRnZXMgPSBzdGF0ZU9iai5hdHRyaWJ1dGVzLmV4dHJhX2JhZGdlO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHRyYUJhZGdlcykpIHtcbiAgICAgIGV4dHJhQmFkZ2VzID0gW2V4dHJhQmFkZ2VzXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dHJhQmFkZ2VzLm1hcCgoZXh0cmFCYWRnZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICBpZiAoZXh0cmFCYWRnZS5lbnRpdHlfaWQgJiYgaGFzcy5zdGF0ZXNbZXh0cmFCYWRnZS5lbnRpdHlfaWRdKSB7XG4gICAgICAgIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdChcbiAgICAgICAgICB0aGlzLCBoYXNzLnN0YXRlc1tleHRyYUJhZGdlLmVudGl0eV9pZF0sIHRoaXMuaW5EaWFsb2csXG4gICAgICAgICAgLyogYWxsb3dIaWRkZW49ICovZmFsc2UpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXh0cmFCYWRnZS5hdHRyaWJ1dGUgJiZcbiAgICAgICAgICAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlc1tleHRyYUJhZGdlLmF0dHJpYnV0ZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgc3RhdGU6IFN0cmluZyhzdGF0ZU9iai5hdHRyaWJ1dGVzW2V4dHJhQmFkZ2UuYXR0cmlidXRlXSksXG4gICAgICAgICAgX2RvbWFpbjogJ25vbmUnLFxuICAgICAgICAgIGVudGl0eV9pZDogbnVsbCxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7IHVuaXRfb2ZfbWVhc3VyZW1lbnQ6IGV4dHJhQmFkZ2UudW5pdCB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgbGV0IGJsYWNrbGlzdCA9IGV4dHJhQmFkZ2UuYmxhY2tsaXN0X3N0YXRlcztcbiAgICAgIGlmIChibGFja2xpc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmxhY2tsaXN0KSkge1xuICAgICAgICAgIGJsYWNrbGlzdCA9IFtibGFja2xpc3RdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChibGFja2xpc3Quc29tZSh2ID0+IFJlZ0V4cCh2KS50ZXN0KHJlc3VsdC5zdGF0ZS50b1N0cmluZygpKSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0Ll9lbnRpdHlEaXNwbGF5ID0gJyc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLmZpbHRlcihleHRyYUJhZGdlID0+IGV4dHJhQmFkZ2UgIT0gbnVsbCk7XG4gIH1cblxuICBjb21wdXRlRXh0cmFWaXNpYmxlKGV4dHJhT2JqLCBpbkRpYWxvZykge1xuICAgIGlmIChpbkRpYWxvZyB8fCAhZXh0cmFPYmopIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZXh0cmFPYmoubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgZXh0cmFDbGFzcyhleHRyYU9ialZpc2libGUpIHtcbiAgICByZXR1cm4gZXh0cmFPYmpWaXNpYmxlID8gJ2V4dHJhJyA6ICcnO1xuICB9XG5cbiAgX3Nob3dDb250cm9sKGluRGlhbG9nLCBzdGF0ZU9iaikge1xuICAgIGlmIChpbkRpYWxvZykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICFzdGF0ZU9iai5hdHRyaWJ1dGVzLmhpZGVfY29udHJvbDtcbiAgfVxuXG4gIGNvbXB1dGVTdGF0ZURpc3BsYXkoc3RhdGVPYmopIHtcbiAgICAvLyBoYUxvY2FsaXplIHJlbW92ZWQgaW4gMC42MVxuICAgIHJldHVybiBzdXBlci5jb21wdXRlU3RhdGVEaXNwbGF5KHRoaXMuaGFMb2NhbGl6ZSB8fCB0aGlzLmxvY2FsaXplLCBzdGF0ZU9iaik7XG4gIH1cblxuICBpc0NvbmZpcm1Db250cm9scyhzdGF0ZU9iaikge1xuICAgIHJldHVybiBzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbmZpcm1fY29udHJvbHMgfHxcbiAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlcy5jb25maXJtX2NvbnRyb2xzX3Nob3dfbG9jaztcbiAgfVxuXG4gIGNsaWNrSGFuZGxlcihlKSB7XG4gICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNvdmVybGF5Jykuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICBjb25zdCBsb2NrID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNsb2NrJyk7XG4gICAgaWYgKGxvY2spIHtcbiAgICAgIGxvY2suaWNvbiA9ICdtZGk6bG9jay1vcGVuLW91dGxpbmUnO1xuICAgICAgbG9jay5zdHlsZS5vcGFjaXR5ID0gJzAuMSc7XG4gICAgfVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcjb3ZlcmxheScpLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgIGxvY2suaWNvbiA9ICdtZGk6bG9jay1vdXRsaW5lJztcbiAgICAgICAgbG9jay5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICB9XG4gICAgfSwgNTAwMCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIGFwcGx5VGhlbWVzKGhhc3MsIGVsZW1lbnQsIHN0YXRlT2JqKSB7XG4gICAgY29uc3QgdGhlbWVOYW1lID0gc3RhdGVPYmouYXR0cmlidXRlcy50aGVtZSB8fCAnZGVmYXVsdCc7XG4gICAgYXBwbHlUaGVtZXNPbkVsZW1lbnQoXG4gICAgICBlbGVtZW50LCBoYXNzLnRoZW1lcyB8fCB7IGRlZmF1bHRfdGhlbWU6ICdkZWZhdWx0JywgdGhlbWVzOiB7fSB9LCB0aGVtZU5hbWUpO1xuICB9XG5cbiAgZXh0cmFEb21DaGFuZ2VkKCkge1xuICAgIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdoYS1zdGF0ZS1sYWJlbC1iYWRnZScpXG4gICAgICAuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5VGhlbWVzKHRoaXMuaGFzcywgZWxlbSwgZWxlbS5zdGF0ZSk7XG4gICAgICB9KTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkeW5hbWljLXdpdGgtZXh0cmEnLCBEeW5hbWljV2l0aEV4dHJhKTtcbiIsImltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9odG1sLXRhZy5qcyc7XG5pbXBvcnQgRXZlbnRzTWl4aW4gZnJvbSAnLi4vbWl4aW5zL2V2ZW50cy1taXhpbi5qcyc7XG5pbXBvcnQgJy4uL3V0aWxzL2hvb2tzLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBIYUNvbmZpZ0N1c3RvbVVpIGV4dGVuZHMgRXZlbnRzTWl4aW4oUG9seW1lci5FbGVtZW50KSB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlIGluY2x1ZGU9XCJoYS1zdHlsZVwiPjwvc3R5bGU+XG4gICAgPGFwcC1oZWFkZXItbGF5b3V0IGhhcy1zY3JvbGxpbmctcmVnaW9uPlxuICAgICAgPGFwcC1oZWFkZXIgc2xvdD1cImhlYWRlclwiIGZpeGVkPlxuICAgICAgICA8YXBwLXRvb2xiYXI+XG4gICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uXG4gICAgICAgICAgICBpY29uPSdtZGk6YXJyb3ctbGVmdCdcbiAgICAgICAgICAgIG9uLWNsaWNrPSdfYmFja0hhbmRsZXInXG4gICAgICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+XG4gICAgICAgICAgPGRpdiBtYWluLXRpdGxlPkN1c3RvbSBVSSBzZXR0aW5nczwvZGl2PlxuICAgICAgICA8L2FwcC10b29sYmFyPlxuICAgICAgPC9hcHAtaGVhZGVyPlxuXG4gICAgICA8aGEtY29uZmlnLXNlY3Rpb24gaXMtd2lkZT0nW1tpc1dpZGVdXSc+XG4gICAgICAgIDxwYXBlci1jYXJkIGhlYWRpbmc9J0RldmljZSBuYW1lJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdjYXJkLWNvbnRlbnQnPlxuICAgICAgICAgICAgU2V0IGRldmljZSBuYW1lIHNvIHRoYXQgeW91IGNhbiByZWZlcmVuY2UgaXQgaW4gcGVyLWRldmljZSBzZXR0aW5nc1xuICAgICAgICAgICAgPHBhcGVyLWlucHV0XG4gICAgICAgICAgICAgIGxhYmVsPSdOYW1lJ1xuICAgICAgICAgICAgICB2YWx1ZT0ne3tuYW1lfX0nXG4gICAgICAgICAgICA+PC9wYXBlci1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wYXBlci1jYXJkPlxuICAgICAgPC9oYS1jb25maWctc2VjdGlvbj5cbiAgICA8L2FwcC1oZWFkZXItbGF5b3V0PlxuICAgIGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzV2lkZTogQm9vbGVhbixcblxuICAgICAgbmFtZToge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIG9ic2VydmVyOiAnbmFtZUNoYW5nZWQnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmVhZHkoKSB7XG4gICAgc3VwZXIucmVhZHkoKTtcbiAgICB0aGlzLm5hbWUgPSB3aW5kb3cuY3VzdG9tVUkuZ2V0TmFtZSgpO1xuICB9XG5cbiAgbmFtZUNoYW5nZWQobmFtZSkge1xuICAgIHdpbmRvdy5jdXN0b21VSS5zZXROYW1lKG5hbWUpO1xuICB9XG5cbiAgX2JhY2tIYW5kbGVyKCkge1xuICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcbiAgICB0aGlzLmZpcmUoJ2xvY2F0aW9uLWNoYW5nZWQnKTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdoYS1jb25maWctY3VzdG9tLXVpJywgSGFDb25maWdDdXN0b21VaSk7XG4iLCJpbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvaHRtbC10YWcuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIEhhVGhlbWVkU2xpZGVyIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHtcbiAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICA8c3R5bGU+XG4gICAgICA6aG9zdCB7XG4gICAgICAgIG1hcmdpbjogdmFyKC0taGEtdGhlbWVkLXNsaWRlci1tYXJnaW4sIGluaXRpYWwpO1xuICAgICAgfVxuICAgICAgLmRpc2FibGUtb2ZmLXdoZW4tbWluIHtcbiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiAgdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcik7XG4gICAgICB9XG5cbiAgICAgIC5kaXNhYmxlLW9mZi13aGVuLW1pbi5pcy1vbiB7XG4gICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yKTtcbiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yKTtcbiAgICAgIH1cbiAgICAgIHBhcGVyLXNsaWRlciB7XG4gICAgICAgIG1hcmdpbjogNHB4IDA7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICAgICAgd2lkdGg6IHZhcigtLWhhLXBhcGVyLXNsaWRlci13aWR0aCwgMjAwcHgpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG5cbiAgICA8cGFwZXItc2xpZGVyXG4gICAgICAgICBtaW49J1tbX3RoZW1lZE1pbl1dJ1xuICAgICAgICAgbWF4PSdbW19jb21wdXRlQXR0cmlidXRlKHRoZW1lLCBcIm1heFwiLCBtYXgpXV0nXG4gICAgICAgICBwaW49J1tbX2NvbXB1dGVBdHRyaWJ1dGUodGhlbWUsIFwicGluXCIsIHBpbildXSdcbiAgICAgICAgIGNsYXNzJD0nW1tjb21wdXRlQ2xhc3ModGhlbWUsIGlzT24sIF90aGVtZWRNaW4pXV0nIHZhbHVlPSdbW3ZhbHVlXV0nXG4gICAgICAgICBvbi1jaGFuZ2U9J3ZhbHVlQ2hhbmdlZCc+XG4gICAgPC9wYXBlci1zbGlkZXI+XG4gICAgYDtcbiAgfVxuXG4gIHJlYWR5KCkge1xuICAgIHN1cGVyLnJlYWR5KCk7XG4gICAgdGhpcy5kaXNhYmxlT2ZmV2hlbk1pbiA9ICF0aGlzLl9jb21wdXRlQXR0cmlidXRlKHRoaXMudGhlbWUsICdvZmZfd2hlbl9taW4nLCAhdGhpcy5kaXNhYmxlT2ZmV2hlbk1pbik7XG4gICAgdGhpcy5jb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkKHRoaXMudGhlbWUsIHRoaXMuZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWluOiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgdmFsdWU6IDAsXG4gICAgICB9LFxuICAgICAgbWF4OiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgdmFsdWU6IDEwMCxcbiAgICAgIH0sXG4gICAgICBwaW46IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGlzT246IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGRpc2FibGVPZmZXaGVuTWluOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgbm90aWZ5OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGRpc2FibGVSZXBvcnRXaGVuTm90Q2hhbmdlZDoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuXG4gICAgICB0aGVtZTogT2JqZWN0LFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICBub3RpZnk6IHRydWUsXG4gICAgICB9LFxuICAgICAgX3RoZW1lZE1pbjoge1xuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIGNvbXB1dGVkOiAnX2NvbXB1dGVBdHRyaWJ1dGUodGhlbWUsIFwibWluXCIsIG1pbiknLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdjb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkKHRoZW1lLCBkaXNhYmxlUmVwb3J0V2hlbk5vdENoYW5nZWQpJyxcbiAgICBdO1xuICB9XG5cbiAgY29tcHV0ZUVuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCh0aGVtZSwgZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkKSB7XG4gICAgdGhpcy5fZW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkID0gdGhpcy5fY29tcHV0ZUF0dHJpYnV0ZShcbiAgICAgIHRoZW1lLCAncmVwb3J0X3doZW5fbm90X2NoYW5nZWQnLCAhZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkKTtcbiAgfVxuXG4gIF9jb21wdXRlQXR0cmlidXRlKHRoZW1lLCBhdHRyLCBkZWYpIHtcbiAgICBpZiAodGhlbWUpIHtcbiAgICAgIGlmIChhdHRyIGluIHRoZW1lKSB7XG4gICAgICAgIHJldHVybiB0aGVtZVthdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbiAgfVxuXG4gIGNvbXB1dGVDbGFzcyh0aGVtZSwgaXNPbiwgdGhlbWVkTWluKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGlmIChpc09uKSB7XG4gICAgICByZXN1bHQgKz0gJ2lzLW9uICc7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb21wdXRlQXR0cmlidXRlKHRoZW1lLCAnb2ZmX3doZW5fbWluJywgIXRoaXMuZGlzYWJsZU9mZldoZW5NaW4pIHx8IHRoZW1lZE1pbiA9PT0gMCkge1xuICAgICAgLy8gSWYgb2ZmV2hlbk1pbiBpcyBlbmFibGVkIGRvbid0IGN1c3RvbWl6ZS5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3Jlc3VsdH1kaXNhYmxlLW9mZi13aGVuLW1pbmA7XG4gIH1cblxuICB2YWx1ZUNoYW5nZWQoZXYpIHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCAmJiB0aGlzLnZhbHVlID09PSBldi50YXJnZXQudmFsdWUpIHtcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gZXYudGFyZ2V0LnZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2hhLXRoZW1lZC1zbGlkZXInLCBIYVRoZW1lZFNsaWRlcik7XG4iLCJpbXBvcnQgYXBwbHlUaGVtZXNPbkVsZW1lbnQgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9hcHBseV90aGVtZXNfb25fZWxlbWVudC5qcyc7XG5pbXBvcnQgY29tcHV0ZVN0YXRlRG9tYWluIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9lbnRpdHkvY29tcHV0ZV9zdGF0ZV9kb21haW4uanMnO1xuaW1wb3J0IGR5bmFtaWNDb250ZW50VXBkYXRlciBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZG9tL2R5bmFtaWNfY29udGVudF91cGRhdGVyLmpzJztcbmltcG9ydCBzdGF0ZUNhcmRUeXBlIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9lbnRpdHkvc3RhdGVfY2FyZF90eXBlLmpzJztcblxuaW1wb3J0ICcuLi91dGlscy9ob29rcy5qcyc7XG5pbXBvcnQgJy4vc3RhdGUtY2FyZC13aXRoLXNsaWRlci5qcyc7XG5pbXBvcnQgJy4vc3RhdGUtY2FyZC13aXRob3V0LXNsaWRlci5qcyc7XG5cbmNvbnN0IFNIT1dfTEFTVF9DSEFOR0VEX0JMQUNLTElTVEVEX0NBUkRTID0gWydjb25maWd1cmF0b3InXTtcbmNvbnN0IERPTUFJTl9UT19TTElERVJfU1VQUE9SVCA9IHtcbiAgbGlnaHQ6IDEsIC8vIFNVUFBPUlRfQlJJR0hUTkVTU1xuICBjb3ZlcjogNCwgLy8gU1VQUE9SVF9TRVRfUE9TSVRJT05cbiAgY2xpbWF0ZTogMSwgLy8gU1VQUE9SVF9UQVJHRVRfVEVNUEVSQVRVUkVcbn07XG5jb25zdCBUWVBFX1RPX0NPTlRST0wgPSB7XG4gIHRvZ2dsZTogJ2hhLWVudGl0eS10b2dnbGUnLFxuICBkaXNwbGF5OiAnJyxcbiAgY292ZXI6ICdoYS1jb3Zlci1jb250cm9scycsXG59O1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIFN0YXRlQ2FyZEN1c3RvbVVpIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNzOiBPYmplY3QsXG5cbiAgICAgIGluRGlhbG9nOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG5cbiAgICAgIHN0YXRlT2JqOiBPYmplY3QsXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnaW5wdXRDaGFuZ2VkKGhhc3MsIGluRGlhbG9nLCBzdGF0ZU9iaiknLFxuICAgIF07XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIGlmIChjb250YWluZXIudGFnTmFtZSA9PT0gJ0RJVicgJiZcbiAgICAgICAgKGNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YXRlJykgfHwgY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnY2hpbGQtY2FyZCcpKSkge1xuICAgICAgdGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyO1xuXG4gICAgICAvLyBTaW5jZSB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgY2hhbmdlIHRoZSBiYWNrZ3JvdW5kIC0gbm8gbmVlZCB0byBjbGVhciBpdC5cbiAgICAgIGNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgJ2JhY2tncm91bmQtY29sb3InLCAndmFyKC0tcGFwZXItY2FyZC1iYWNrZ3JvdW5kLWNvbG9yLCBpbmhlcml0KScpO1xuXG4gICAgICAvLyBQb2x5ZmlsbCAndXBkYXRlU3R5bGVzJy5cbiAgICAgIGlmICghY29udGFpbmVyLnVwZGF0ZVN0eWxlcykge1xuICAgICAgICBjb250YWluZXIudXBkYXRlU3R5bGVzID0gKHN0eWxlcykgPT4ge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCBzdHlsZXNba2V5XSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2lzQXR0YWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5wdXRDaGFuZ2VkKHRoaXMuaGFzcywgdGhpcy5pbkRpYWxvZywgdGhpcy5zdGF0ZU9iaik7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9pc0F0dGFjaGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgdGhpcy5fY29udGFpbmVyLnVwZGF0ZVN0eWxlcyh7IGRpc3BsYXk6ICcnLCBtYXJnaW46ICcnLCBwYWRkaW5nOiAnJyB9KTtcbiAgICAgIGFwcGx5VGhlbWVzT25FbGVtZW50KFxuICAgICAgICB0aGlzLl9jb250YWluZXIsIHRoaXMuaGFzcy50aGVtZXMgfHwgeyBkZWZhdWx0X3RoZW1lOiAnZGVmYXVsdCcsIHRoZW1lczoge30gfSwgJ2RlZmF1bHQnKTtcbiAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBiYWRnZU1vZGUoaGFzcywgc3RhdGVPYmosIGRvbWFpbikge1xuICAgIGNvbnN0IHN0YXRlcyA9IFtdO1xuICAgIGlmIChkb21haW4gPT09ICdncm91cCcpIHtcbiAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXMuZW50aXR5X2lkLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gaGFzcy5zdGF0ZXNbaWRdO1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBJRCAke2lkfSBpbiBncm91cCAke3N0YXRlT2JqLmVudGl0eV9pZH1gKTtcbiAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0ZU9iai5hdHRyaWJ1dGVzLmJhZGdlc19saXN0IHx8XG4gICAgICAgICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzLmJhZGdlc19saXN0LmluY2x1ZGVzKHN0YXRlLmVudGl0eV9pZCkpIHtcbiAgICAgICAgICBzdGF0ZXMucHVzaCh3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3QoXG4gICAgICAgICAgICB0aGlzLCBzdGF0ZSwgZmFsc2UgLyogaW5EaWFsb2cgKi8sIGZhbHNlIC8qIGFsbG93SGlkZGVuICovKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZXMucHVzaChzdGF0ZU9iaik7XG4gICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZGlzcGxheTogJ2lubGluZS1ibG9jaycgfTtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YXRlJykpIHtcbiAgICAgICAgICBwYXJhbXMubWFyZ2luID0gJ3ZhcigtLWhhLWJhZGdlcy1jYXJkLW1hcmdpbiwgMCknO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHBhcmFtcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGR5bmFtaWNDb250ZW50VXBkYXRlcihcbiAgICAgIHRoaXMsXG4gICAgICAnSEEtQkFER0VTLUNBUkQnLFxuICAgICAgeyBoYXNzLCBzdGF0ZXMgfSk7XG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgdGhpcy5fY29udGFpbmVyLnVwZGF0ZVN0eWxlcyh7XG4gICAgICAgIHdpZHRoOiAndmFyKC0taGEtYmFkZ2VzLWNhcmQtd2lkdGgsIGluaXRpYWwpJyxcbiAgICAgICAgJ3RleHQtYWxpZ24nOiAndmFyKC0taGEtYmFkZ2VzLWNhcmQtdGV4dC1hbGlnbiwgaW5pdGlhbCknLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubGFzdENoaWxkLnN0eWxlLmZvbnRTaXplID0gJzg1JSc7XG5cbiAgICAvLyBTaW5jZSB0aGlzIHZhcmlhYmxlIG9ubHkgYWZmZWN0cyBiYWRnZXMgbW9kZSAtIG5vIG5lZWQgdG8gY2xlYW4gaXQgdXAuXG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1oYS1zdGF0ZS1sYWJlbC1iYWRnZS1tYXJnaW4tYm90dG9tJywgJzAnKTtcbiAgfVxuXG4gIGNsZWFuQmFkZ2VTdHlsZSgpIHtcbiAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIudXBkYXRlU3R5bGVzKHtcbiAgICAgICAgZGlzcGxheTogJycsXG4gICAgICAgIHdpZHRoOiAnJyxcbiAgICAgICAgJ3RleHQtYWxpZ24nOiAnJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVN0eWxlcyh7IGRpc3BsYXk6ICcnLCBtYXJnaW46ICcnIH0pO1xuICB9XG5cbiAgYXBwbHlUaGVtZXMoaGFzcywgbW9kaWZpZWRPYmopIHtcbiAgICBsZXQgdGhlbWVUYXJnZXQgPSB0aGlzO1xuICAgIGxldCB0aGVtZU5hbWUgPSAnZGVmYXVsdCc7XG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgdGhlbWVUYXJnZXQgPSB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuICAgIGlmIChtb2RpZmllZE9iai5hdHRyaWJ1dGVzLnRoZW1lKSB7XG4gICAgICB0aGVtZU5hbWUgPSBtb2RpZmllZE9iai5hdHRyaWJ1dGVzLnRoZW1lO1xuICAgIH1cbiAgICBhcHBseVRoZW1lc09uRWxlbWVudChcbiAgICAgIHRoZW1lVGFyZ2V0LCBoYXNzLnRoZW1lcyB8fCB7IGRlZmF1bHRfdGhlbWU6ICdkZWZhdWx0JywgdGhlbWVzOiB7fSB9LCB0aGVtZU5hbWUpO1xuICB9XG5cbiAgbWF5YmVIaWRlRW50aXR5KG1vZGlmaWVkT2JqKSB7XG4gICAgaWYgKCFtb2RpZmllZE9iaikge1xuICAgICAgaWYgKHRoaXMubGFzdENoaWxkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5sYXN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICB0aGlzLl9jb250YWluZXIudXBkYXRlU3R5bGVzKHsgbWFyZ2luOiAnMCcsIHBhZGRpbmc6ICcwJyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIudXBkYXRlU3R5bGVzKHsgbWFyZ2luOiAnJywgcGFkZGluZzogJycgfSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNsaWRlckVsaWdpYmxlXyhkb21haW4sIG9iaiwgaW5EaWFsb2cpIHtcbiAgICBpZiAoaW5EaWFsb2cpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gRE9NQUlOX1RPX1NMSURFUl9TVVBQT1JUW2RvbWFpbl0gJiZcbiAgICAgIChET01BSU5fVE9fU0xJREVSX1NVUFBPUlRbZG9tYWluXSAmIG9iai5hdHRyaWJ1dGVzLnN1cHBvcnRlZF9mZWF0dXJlcykgJiZcbiAgICAgIG9iai5hdHRyaWJ1dGVzLnN0YXRlX2NhcmRfbW9kZSAmJiBvYmouYXR0cmlidXRlcy5zdGF0ZV9jYXJkX21vZGUgIT09ICduby1zbGlkZXInO1xuICB9XG5cbiAgaW5wdXRDaGFuZ2VkKGhhc3MsIGluRGlhbG9nLCBzdGF0ZU9iaikge1xuICAgIGlmICghc3RhdGVPYmogfHwgIWhhc3MgfHwgIXRoaXMuX2lzQXR0YWNoZWQpIHJldHVybjtcbiAgICBjb25zdCBkb21haW4gPSBjb21wdXRlU3RhdGVEb21haW4oc3RhdGVPYmopO1xuICAgIGNvbnN0IG1vZGlmaWVkT2JqID0gd2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0KFxuICAgICAgdGhpcywgc3RhdGVPYmosIGluRGlhbG9nLCB0cnVlIC8qIGFsbG93SGlkZGVuICovKTtcblxuICAgIGlmICh0aGlzLm1heWJlSGlkZUVudGl0eShtb2RpZmllZE9iaikpIHJldHVybjtcblxuICAgIHRoaXMuYXBwbHlUaGVtZXMoaGFzcywgbW9kaWZpZWRPYmopO1xuXG4gICAgaWYgKCFpbkRpYWxvZyAmJiBtb2RpZmllZE9iai5hdHRyaWJ1dGVzLnN0YXRlX2NhcmRfbW9kZSA9PT0gJ2JhZGdlcycpIHtcbiAgICAgIHRoaXMuYmFkZ2VNb2RlKGhhc3MsIG1vZGlmaWVkT2JqLCBkb21haW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZ3VsYXJNb2RlXyhoYXNzLCBpbkRpYWxvZywgbW9kaWZpZWRPYmosIGRvbWFpbik7XG4gICAgfVxuICB9XG5cbiAgcmVndWxhck1vZGVfKGhhc3MsIGluRGlhbG9nLCBzdGF0ZU9iaiwgZG9tYWluKSB7XG4gICAgdGhpcy5jbGVhbkJhZGdlU3R5bGUoKTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGhhc3MsXG4gICAgICBzdGF0ZU9iaixcbiAgICAgIGluRGlhbG9nLFxuICAgIH07XG4gICAgY29uc3Qgb3JpZ2luYWxTdGF0ZUNhcmRUeXBlID0gc3RhdGVDYXJkVHlwZShoYXNzLCBzdGF0ZU9iaik7XG4gICAgbGV0IGN1c3RvbVN0YXRlQ2FyZFR5cGU7XG4gICAgY29uc3Qgc2Vjb25kYXJ5U3RhdGVDYXJkVHlwZSA9IHN0YXRlT2JqLmF0dHJpYnV0ZXMuc3RhdGVfY2FyZF9jdXN0b21fdWlfc2Vjb25kYXJ5O1xuXG4gICAgaWYgKGRvbWFpbiA9PT0gJ2xpZ2h0JyAmJiB0aGlzLnNsaWRlckVsaWdpYmxlXyhkb21haW4sIHN0YXRlT2JqLCBpbkRpYWxvZykpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7XG4gICAgICAgIGNvbnRyb2xFbGVtZW50OiAnaGEtZW50aXR5LXRvZ2dsZScsXG4gICAgICAgIHNlcnZpY2VNaW46ICd0dXJuX29mZicsXG4gICAgICAgIHNlcnZpY2VNYXg6ICd0dXJuX29uJyxcbiAgICAgICAgdmFsdWVOYW1lOiAnYnJpZ2h0bmVzcycsXG4gICAgICAgIGRvbWFpbixcbiAgICAgIH0pO1xuICAgICAgY3VzdG9tU3RhdGVDYXJkVHlwZSA9ICdzdGF0ZS1jYXJkLXdpdGgtc2xpZGVyJztcbiAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gJ2NvdmVyJyAmJiB0aGlzLnNsaWRlckVsaWdpYmxlXyhkb21haW4sIHN0YXRlT2JqLCBpbkRpYWxvZykpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7XG4gICAgICAgIGNvbnRyb2xFbGVtZW50OiAnaGEtY292ZXItY29udHJvbHMnLFxuICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgc2VydmljZU1pbjogJ2Nsb3NlX2NvdmVyJyxcbiAgICAgICAgc2VydmljZU1heDogJ3NldF9jb3Zlcl9wb3NpdGlvbicsXG4gICAgICAgIHNldFZhbHVlTmFtZTogJ3Bvc2l0aW9uJyxcbiAgICAgICAgdmFsdWVOYW1lOiAnY3VycmVudF9wb3NpdGlvbicsXG4gICAgICAgIG5hbWVPbjogJ29wZW4nLFxuICAgICAgICBkb21haW4sXG4gICAgICB9KTtcbiAgICAgIGN1c3RvbVN0YXRlQ2FyZFR5cGUgPSAnc3RhdGUtY2FyZC13aXRoLXNsaWRlcic7XG4gICAgfSBlbHNlIGlmIChkb21haW4gPT09ICdjbGltYXRlJyAmJiB0aGlzLnNsaWRlckVsaWdpYmxlXyhkb21haW4sIHN0YXRlT2JqLCBpbkRpYWxvZykpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7XG4gICAgICAgIGNvbnRyb2xFbGVtZW50OiAnaGEtY2xpbWF0ZS1zdGF0ZScsXG4gICAgICAgIG1pbjogc3RhdGVPYmouYXR0cmlidXRlcy5taW5fdGVtcCB8fCAtMTAwLFxuICAgICAgICBtYXg6IHN0YXRlT2JqLmF0dHJpYnV0ZXMubWF4X3RlbXAgfHwgMjAwLFxuICAgICAgICBzZXJ2aWNlTWluOiAnc2V0X3RlbXBlcmF0dXJlJyxcbiAgICAgICAgc2VydmljZU1heDogJ3NldF90ZW1wZXJhdHVyZScsXG4gICAgICAgIHZhbHVlTmFtZTogJ3RlbXBlcmF0dXJlJyxcbiAgICAgICAgbmFtZU9uOiAnJyxcbiAgICAgICAgZG9tYWluLFxuICAgICAgfSk7XG4gICAgICBjdXN0b21TdGF0ZUNhcmRUeXBlID0gJ3N0YXRlLWNhcmQtd2l0aC1zbGlkZXInO1xuICAgIH0gZWxzZSBpZiAoVFlQRV9UT19DT05UUk9MW29yaWdpbmFsU3RhdGVDYXJkVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLmNvbnRyb2xFbGVtZW50ID0gVFlQRV9UT19DT05UUk9MW29yaWdpbmFsU3RhdGVDYXJkVHlwZV07XG4gICAgICBjdXN0b21TdGF0ZUNhcmRUeXBlID0gJ3N0YXRlLWNhcmQtd2l0aG91dC1zbGlkZXInO1xuICAgIH0gZWxzZSBpZiAoc3RhdGVPYmouYXR0cmlidXRlcy5zaG93X2xhc3RfY2hhbmdlZCAmJlxuICAgICAgICAgICAgICAgIVNIT1dfTEFTVF9DSEFOR0VEX0JMQUNLTElTVEVEX0NBUkRTLmluY2x1ZGVzKG9yaWdpbmFsU3RhdGVDYXJkVHlwZSkpIHtcbiAgICAgIHBhcmFtcy5pbkRpYWxvZyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0ZU9iai5zdGF0ZSA9PT0gJ3VuYXZhaWxhYmxlJykge1xuICAgICAgcGFyYW1zLmNvbnRyb2xFbGVtZW50ID0gJyc7XG4gICAgfVxuICAgIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbnRyb2xfZWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMuY29udHJvbEVsZW1lbnQgPSBzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbnRyb2xfZWxlbWVudDtcbiAgICB9XG5cbiAgICBkeW5hbWljQ29udGVudFVwZGF0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgKHNlY29uZGFyeVN0YXRlQ2FyZFR5cGUgfHwgY3VzdG9tU3RhdGVDYXJkVHlwZSB8fCBgU1RBVEUtQ0FSRC0ke29yaWdpbmFsU3RhdGVDYXJkVHlwZX1gKS50b1VwcGVyQ2FzZSgpLFxuICAgICAgcGFyYW1zKTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdzdGF0ZS1jYXJkLWN1c3RvbS11aScsIFN0YXRlQ2FyZEN1c3RvbVVpKTtcbiIsImltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9odG1sLXRhZy5qcyc7XG5pbXBvcnQgQ3VpQmFzZUVsZW1lbnQgZnJvbSAnLi9jdWktYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCAnLi9keW5hbWljLXdpdGgtZXh0cmEuanMnO1xuaW1wb3J0ICcuL2hhLXRoZW1lZC1zbGlkZXIuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIFN0YXRlQ2FyZFdpdGhTbGlkZXIgZXh0ZW5kcyBDdWlCYXNlRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlIGlzPVwiY3VzdG9tLXN0eWxlXCIgaW5jbHVkZT1cImlyb24tZmxleCBpcm9uLWZsZXgtYWxpZ25tZW50IGlyb24tZmxleC1mYWN0b3JzXCI+PC9zdHlsZT5cbiAgICA8c3R5bGU+XG4gICAgICAjY29udGFpbmVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgLnNlY29uZC1saW5lLCAuc3RhdGUtYW5kLXRvZ2dsZSwgLnN0YXRlLWluZm8ge1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAubm93cmFwIC5zdGF0ZS1hbmQtdG9nZ2xlIHtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgZmxleC1ncm93OiAwO1xuICAgICAgfVxuICAgICAgLm5vd3JhcCAuc2Vjb25kLWxpbmUge1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAuc2Vjb25kLWxpbmUge1xuICAgICAgICBwYWRkaW5nLXRvcDogMjBweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IC0yMHB4O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTZweDtcbiAgICAgIH1cbiAgICAgIC5zdHJldGNoIC5zZWNvbmQtbGluZSwgLnN0cmV0Y2ggaGEtdGhlbWVkLXNsaWRlciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAtLWhhLXBhcGVyLXNsaWRlci13aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC5ub3dyYXAgLnN0YXRlLWluZm8ge1xuICAgICAgICBtaW4td2lkdGg6IGluaXRpYWw7XG4gICAgICB9XG4gICAgICBoYS10aGVtZWQtc2xpZGVyLCAudG9wLXdyYXBwZXIge1xuICAgICAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAudG9wLXdyYXBwZXIuc3RyZXRjaCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuXG4gICAgICAuaGlkZGVuIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuXG4gICAgPGRpdiBpZD0nY29udGFpbmVyJyBjbGFzcyQ9J2hvcml6b250YWwgbGF5b3V0IGZsZXggdG9wLXdyYXBwZXIgW1tfY29tcHV0ZVdyYXBDbGFzcyhtb2RlLCBzdHJldGNoU2xpZGVyLCBsaW5lVG9vTG9uZywgaW5EaWFsb2cpXV0nPlxuICAgICAgPGRpdiBjbGFzcz0naG9yaXpvbnRhbCBsYXlvdXQganVzdGlmaWVkIGZsZXgtYXV0byBzdGF0ZS1hbmQtdG9nZ2xlJz5cbiAgICAgICAgPHN0YXRlLWluZm9cbiAgICAgICAgICAgIGNsYXNzPSdzdGF0ZS1pbmZvIGZsZXgtYXV0bydcbiAgICAgICAgICAgIGhhc3M9J1tbaGFzc11dJ1xuICAgICAgICAgICAgc3RhdGUtb2JqPSdbW3N0YXRlT2JqXV0nXG4gICAgICAgICAgICBpbi1kaWFsb2c9J1tbc2hvd0xhc3RDaGFuZ2VkKHN0YXRlT2JqLCBpbkRpYWxvZywgZXh0cmEpXV0nXG4gICAgICAgICAgICBzZWNvbmRhcnktbGluZSQ9J1tbaGFzRXh0cmEoZXh0cmEpXV0nXG4gICAgICAgID5cbiAgICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1yZXBlYXQnIGl0ZW1zPSdbW2V4dHJhXV0nPlxuICAgICAgICAgICAgPGRpdj5bW2l0ZW1dXTwvZGl2PlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvc3RhdGUtaW5mbz5cbiAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW2JyZWFrU2xpZGVyXV0nIGNsYXNzPSdoaWRkZW4nPlxuICAgICAgICAgIDxkeW5hbWljLXdpdGgtZXh0cmEgaGFzcz0nW1toYXNzXV0nIHN0YXRlLW9iaj0nW1tzdGF0ZU9ial1dJyBjb250cm9sLWVsZW1lbnQ9J1tbY29udHJvbEVsZW1lbnRdXScgaW4tZGlhbG9nPSdbW2luRGlhbG9nXV0nPjwvZHluYW1pYy13aXRoLWV4dHJhPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbc2hvd1NsaWRlcl1dJyByZXN0YW1wPlxuICAgICAgICA8ZGl2IGNsYXNzPSdob3Jpem9udGFsIGxheW91dCBmbGV4LWF1dG8gZW5kLWp1c3RpZmllZCBzZWNvbmQtbGluZSc+XG4gICAgICAgICAgPGhhLXRoZW1lZC1zbGlkZXJcbiAgICAgICAgICAgIGlkPSdzbGlkZXInXG4gICAgICAgICAgICBtYXg9W1ttYXhdXVxuICAgICAgICAgICAgbWluPVtbbWluXV1cbiAgICAgICAgICAgIHRoZW1lPSdbW3N0YXRlT2JqLmF0dHJpYnV0ZXMuc2xpZGVyX3RoZW1lXV0nXG4gICAgICAgICAgICBpcy1vbj0nW1tpc09uKHN0YXRlT2JqLCBuYW1lT24pXV0nXG4gICAgICAgICAgICB2YWx1ZT0ne3tzbGlkZXJWYWx1ZX19J1xuICAgICAgICAgICAgZGlzYWJsZS1vZmYtd2hlbi1taW49J3t7ZGlzYWJsZU9mZldoZW5NaW59fSdcbiAgICAgICAgICAgIG9uLWNoYW5nZT0nc2xpZGVyQ2hhbmdlZCdcbiAgICAgICAgICAgIG9uLWNsaWNrPSdzdG9wUHJvcGFnYXRpb24nPlxuICAgICAgICAgIDwvaGEtdGhlbWVkLXNsaWRlcj5cbiAgICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbIWJyZWFrU2xpZGVyXV0nPlxuICAgICAgICAgICAgPGR5bmFtaWMtd2l0aC1leHRyYSBoYXNzPSdbW2hhc3NdXScgc3RhdGUtb2JqPSdbW3N0YXRlT2JqXV0nIGNvbnRyb2wtZWxlbWVudD0nW1tjb250cm9sRWxlbWVudF1dJyBpbi1kaWFsb2c9J1tbaW5EaWFsb2ddXSc+PC9keW5hbWljLXdpdGgtZXh0cmE+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbWFpbjogU3RyaW5nLFxuICAgICAgc2VydmljZU1pbjogU3RyaW5nLFxuICAgICAgc2VydmljZU1heDogU3RyaW5nLFxuICAgICAgdmFsdWVOYW1lOiBTdHJpbmcsXG4gICAgICBzZXRWYWx1ZU5hbWU6IFN0cmluZyxcbiAgICAgIG5hbWVPbjogeyB0eXBlOiBTdHJpbmcsIHZhbHVlOiAnb24nIH0sXG4gICAgICBtaW46IHsgdHlwZTogTnVtYmVyLCB2YWx1ZTogMCB9LFxuICAgICAgbWF4OiB7IHR5cGU6IE51bWJlciwgdmFsdWU6IDI1NSB9LFxuXG4gICAgICBzbGlkZXJWYWx1ZToge1xuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIHZhbHVlOiAwLFxuICAgICAgfSxcbiAgICAgIGRpc2FibGVPZmZXaGVuTWluOiBCb29sZWFuLFxuICAgICAgbW9kZTogU3RyaW5nLFxuICAgICAgc3RyZXRjaFNsaWRlcjoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgYnJlYWtTbGlkZXI6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGhpZGVTbGlkZXI6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGxpbmVUb29Mb25nOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBtaW5MaW5lQnJlYWs6IE51bWJlcixcbiAgICAgIG1heExpbmVCcmVhazogTnVtYmVyLFxuICAgICAgc2hvd1NsaWRlcjoge1xuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIGNvbXB1dGVkOiAnX3Nob3dTbGlkZXIoaW5EaWFsb2csIHN0YXRlT2JqLCBoaWRlU2xpZGVyKScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZWFkeSgpIHtcbiAgICBzdXBlci5yZWFkeSgpO1xuICAgIHRoaXMuX29uSXJvblJlc2l6ZSA9IHRoaXMuX29uSXJvblJlc2l6ZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uSXJvblJlc2l6ZSk7XG4gICAgdGhpcy5fd2FpdEZvckxheW91dCgpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uSXJvblJlc2l6ZSk7XG4gICAgdGhpcy5faXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdzdGF0ZU9iakNoYW5nZWQoc3RhdGVPYmosIG5hbWVPbiwgdmFsdWVOYW1lKScsXG4gICAgXTtcbiAgfVxuXG4gIF93YWl0Rm9yTGF5b3V0KCkge1xuICAgIGlmICghdGhpcy5faXNDb25uZWN0ZWQpIHJldHVybjtcbiAgICB0aGlzLl9zZXRNb2RlKCk7XG4gICAgaWYgKHRoaXMuX2ZyYW1lSWQpIHJldHVybjtcbiAgICB0aGlzLnJlYWR5VG9Db21wdXRlID0gZmFsc2U7XG4gICAgdGhpcy5fZnJhbWVJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG4gICAgICB0aGlzLnJlYWR5VG9Db21wdXRlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX29uSXJvblJlc2l6ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgX3NldE1vZGUoKSB7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgaGlkZVNsaWRlcjogdGhpcy5tb2RlID09PSAnaGlkZS1zbGlkZXInICYmIHRoaXMubGluZVRvb0xvbmcsXG4gICAgICBicmVha1NsaWRlcjpcbiAgICAgICAgICAgKHRoaXMubW9kZSA9PT0gJ2JyZWFrLXNsaWRlcicgfHwgdGhpcy5tb2RlID09PSAnaGlkZS1zbGlkZXInKSAmJlxuICAgICAgICAgICB0aGlzLmxpbmVUb29Mb25nLFxuICAgIH07XG4gICAgaWYgKCF0aGlzLnNob3dTbGlkZXIpIHtcbiAgICAgIG9iai5icmVha1NsaWRlciA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydGllcyhvYmopO1xuICB9XG5cbiAgX29uSXJvblJlc2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMucmVhZHlUb0NvbXB1dGUpIHJldHVybjtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnbm8tc2xpZGVyJykge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKHtcbiAgICAgICAgaGlkZVNsaWRlcjogdHJ1ZSxcbiAgICAgICAgYnJlYWtTbGlkZXI6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJldkJyZWFrU2xpZGVyID0gdGhpcy5icmVha1NsaWRlcjtcbiAgICBjb25zdCBwcmV2SGlkZVNsaWRlciA9IHRoaXMuaGlkZVNsaWRlcjtcbiAgICB0aGlzLnNldFByb3BlcnRpZXMoe1xuICAgICAgbGluZVRvb0xvbmc6IGZhbHNlLFxuICAgICAgaGlkZVNsaWRlcjogZmFsc2UsXG4gICAgICBicmVha1NsaWRlcjogZmFsc2UsXG4gICAgfSk7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHRoaXMuJDtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgICBpZiAoY29udGFpbmVyV2lkdGggPT09IDApIHJldHVybjtcbiAgICBpZiAoY29udGFpbmVyV2lkdGggPD0gdGhpcy5taW5MaW5lQnJlYWspIHtcbiAgICAgIHRoaXMubGluZVRvb0xvbmcgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbmVyV2lkdGggPj0gdGhpcy5tYXhMaW5lQnJlYWspIHtcbiAgICAgIHRoaXMubGluZVRvb0xvbmcgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXZIaWRlU2xpZGVyICYmIHRoaXMubW9kZSA9PT0gJ2hpZGUtc2xpZGVyJykge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIHVuaGlkZSB0aGUgc2xpZGVyIGluIG9yZGVyIHRvIHJlY2FsY3VsYXRlIGhlaWdodC5cbiAgICAgICAgdGhpcy5fd2FpdEZvckxheW91dCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3Qgc3RhdGVIZWlnaHQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignLnN0YXRlLWluZm8nKS5jbGllbnRIZWlnaHQ7XG4gICAgICB0aGlzLmxpbmVUb29Mb25nID0gY29udGFpbmVySGVpZ2h0ID4gc3RhdGVIZWlnaHQgKiAxLjU7XG4gICAgICBpZiAodGhpcy5saW5lVG9vTG9uZykge1xuICAgICAgICB0aGlzLm1pbkxpbmVCcmVhayA9IGNvbnRhaW5lcldpZHRoO1xuICAgICAgfSBlbHNlIGlmICghcHJldkJyZWFrU2xpZGVyKSB7XG4gICAgICAgIHRoaXMubWF4TGluZUJyZWFrID0gY29udGFpbmVyV2lkdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NldE1vZGUoKTtcbiAgfVxuXG4gIF9jb21wdXRlV3JhcENsYXNzKG1vZGUsIHN0cmV0Y2hTbGlkZXIsIGxpbmVUb29Mb25nLCBpbkRpYWxvZykge1xuICAgIGlmIChpbkRpYWxvZykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAobW9kZSA9PT0gJ3NpbmdsZS1saW5lJykge1xuICAgICAgcmV0dXJuICdub3dyYXAnO1xuICAgIH1cbiAgICBpZiAoc3RyZXRjaFNsaWRlciAmJiBsaW5lVG9vTG9uZykge1xuICAgICAgcmV0dXJuICdzdHJldGNoIHdyYXAnO1xuICAgIH1cbiAgICByZXR1cm4gJ3dyYXAnO1xuICB9XG5cbiAgX3Nob3dTbGlkZXIoaW5EaWFsb2csIHN0YXRlT2JqLCBoaWRlU2xpZGVyKSB7XG4gICAgaWYgKGluRGlhbG9nIHx8IGhpZGVTbGlkZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzbGlkZXJDaGFuZ2VkKGV2KSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChldi50YXJnZXQudmFsdWUsIDEwKTtcbiAgICBjb25zdCBwYXJhbSA9IHsgZW50aXR5X2lkOiB0aGlzLnN0YXRlT2JqLmVudGl0eV9pZCB9O1xuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcjc2xpZGVyJyk7XG4gICAgaWYgKGV2LnRhcmdldCAhPT0gdGFyZ2V0KSB7XG4gICAgICAvLyBObyBTaGFkb3cgRE9NIC0gd2UgaGF2ZSBhY2Nlc3MgdG8gb3JpZ2luYWwgdGFyZ2V0LlxuICAgICAgKHsgdGFyZ2V0IH0gPSBldik7XG4gICAgfSBlbHNlIGlmIChldi5wYXRoKSB7XG4gICAgICBbdGFyZ2V0XSA9IGV2LnBhdGg7XG4gICAgfSBlbHNlIGlmIChldi5jb21wb3NlZFBhdGgpIHtcbiAgICAgIFt0YXJnZXRdID0gZXYuY29tcG9zZWRQYXRoKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gMCB8fCAodmFsdWUgPD0gdGFyZ2V0Lm1pbiAmJiAhdGhpcy5kaXNhYmxlT2ZmV2hlbk1pbikpIHtcbiAgICAgIHRoaXMuaGFzcy5jYWxsU2VydmljZSh0aGlzLmRvbWFpbiwgdGhpcy5zZXJ2aWNlTWluLCBwYXJhbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtW3RoaXMuc2V0VmFsdWVOYW1lIHx8IHRoaXMudmFsdWVOYW1lXSA9IHZhbHVlO1xuICAgICAgdGhpcy5oYXNzLmNhbGxTZXJ2aWNlKHRoaXMuZG9tYWluLCB0aGlzLnNlcnZpY2VNYXgsIHBhcmFtKTtcbiAgICB9XG4gIH1cblxuICBzdGF0ZU9iakNoYW5nZWQoc3RhdGVPYmosIG5hbWVPbiwgdmFsdWVOYW1lKSB7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgc2xpZGVyVmFsdWU6IHRoaXMuaXNPbihzdGF0ZU9iaiwgbmFtZU9uKSA/IHN0YXRlT2JqLmF0dHJpYnV0ZXNbdmFsdWVOYW1lXSA6IDAsXG4gICAgfTtcbiAgICBpZiAoc3RhdGVPYmopIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ob2JqLCB7XG4gICAgICAgIG1pbkxpbmVCcmVhazogMCxcbiAgICAgICAgbWF4TGluZUJyZWFrOiA5OTksXG4gICAgICAgIGhpZGVTbGlkZXI6IGZhbHNlLFxuICAgICAgICBicmVha1NsaWRlcjogZmFsc2UsXG4gICAgICAgIGxpbmVUb29Mb25nOiBmYWxzZSxcbiAgICAgICAgbW9kZTogc3RhdGVPYmouYXR0cmlidXRlcy5zdGF0ZV9jYXJkX21vZGUsXG4gICAgICAgIHN0cmV0Y2hTbGlkZXI6ICEhc3RhdGVPYmouYXR0cmlidXRlcy5zdHJldGNoX3NsaWRlcixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnRpZXMob2JqKTtcbiAgICBpZiAoc3RhdGVPYmopIHtcbiAgICAgIHRoaXMuX3dhaXRGb3JMYXlvdXQoKTtcbiAgICB9XG4gIH1cblxuICBpc09uKHN0YXRlT2JqLCBuYW1lT24pIHtcbiAgICByZXR1cm4gc3RhdGVPYmogJiYgKCFuYW1lT24gfHwgc3RhdGVPYmouc3RhdGUgPT09IG5hbWVPbik7XG4gIH1cblxuICBzdG9wUHJvcGFnYXRpb24oZXYpIHtcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdzdGF0ZS1jYXJkLXdpdGgtc2xpZGVyJywgU3RhdGVDYXJkV2l0aFNsaWRlcik7XG4iLCJpbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvaHRtbC10YWcuanMnO1xuaW1wb3J0IEN1aUJhc2VFbGVtZW50IGZyb20gJy4vY3VpLWJhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgJy4vZHluYW1pYy13aXRoLWV4dHJhLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBTdGF0ZUNhcmRXaXRob3V0U2xpZGVyIGV4dGVuZHMgQ3VpQmFzZUVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgIDxzdHlsZSBpcz1cImN1c3RvbS1zdHlsZVwiIGluY2x1ZGU9XCJpcm9uLWZsZXggaXJvbi1mbGV4LWFsaWdubWVudFwiPjwvc3R5bGU+XG4gICAgPHN0eWxlPlxuICAgICAgI2NvbnRhaW5lciB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuXG4gICAgPGRpdiBpZD0nY29udGFpbmVyJyBjbGFzcz0naG9yaXpvbnRhbCBsYXlvdXQganVzdGlmaWVkJz5cbiAgICAgIDxzdGF0ZS1pbmZvXG4gICAgICAgICAgaGFzcz0nW1toYXNzXV0nXG4gICAgICAgICAgY2xhc3M9J3N0YXRlLWluZm8nXG4gICAgICAgICAgc3RhdGUtb2JqPSdbW3N0YXRlT2JqXV0nXG4gICAgICAgICAgaW4tZGlhbG9nPSdbW3Nob3dMYXN0Q2hhbmdlZChzdGF0ZU9iaiwgaW5EaWFsb2csIGV4dHJhKV1dJ1xuICAgICAgICAgIHNlY29uZGFyeS1saW5lJD0nW1toYXNFeHRyYShleHRyYSldXSc+XG4gICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLXJlcGVhdCcgaXRlbXM9J1tbZXh0cmFdXSc+XG4gICAgICAgICAgPGRpdj5bW2l0ZW1dXTwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9zdGF0ZS1pbmZvPlxuICAgICAgPGR5bmFtaWMtd2l0aC1leHRyYVxuICAgICAgICAgIGhhc3M9J1tbaGFzc11dJ1xuICAgICAgICAgIHN0YXRlLW9iaj0nW1tzdGF0ZU9ial1dJ1xuICAgICAgICAgIGNvbnRyb2wtZWxlbWVudD0nW1tjb250cm9sRWxlbWVudF1dJ1xuICAgICAgICAgIGluLWRpYWxvZz0nW1tpbkRpYWxvZ11dJz5cbiAgICAgIDwvZHluYW1pYy13aXRoLWV4dHJhPlxuICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc3RhdGUtY2FyZC13aXRob3V0LXNsaWRlcicsIFN0YXRlQ2FyZFdpdGhvdXRTbGlkZXIpO1xuIiwiLy8gUG9seW1lciBsZWdhY3kgZXZlbnQgaGVscGVycyB1c2VkIGNvdXJ0ZXN5IG9mIHRoZSBQb2x5bWVyIHByb2plY3QuXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4vLyBtZXQ6XG4vL1xuLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy8gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyXG4vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4vLyBkaXN0cmlidXRpb24uXG4vLyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbi8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuLy9cbi8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbi8vIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbi8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbi8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbi8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuZXhwb3J0IGRlZmF1bHQgKHN1cGVyQ2xhc3MpID0+IHtcbiAgLyoqXG4gICAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gICAqL1xuICBjbGFzcyBFdmVudHNNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBOYW1lIG9mIGV2ZW50IHR5cGUuXG4gICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljXG4gICAgICogICBwYXlsb2FkLlxuICAgICAqIEBwYXJhbSB7eyBidWJibGVzOiAoYm9vbGVhbnx1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiAoYm9vbGVhbnx1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICBjb21wb3NlZDogKGJvb2xlYW58dW5kZWZpbmVkKSB9PX1cbiAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6XG4gICAgICogIGBidWJibGVzYCAoYm9vbGVhbiwgZGVmYXVsdHMgdG8gYHRydWVgKSxcbiAgICAgKiAgYGNhbmNlbGFibGVgIChib29sZWFuLCBkZWZhdWx0cyB0byBmYWxzZSksIGFuZFxuICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLlxuICAgICAqIEByZXR1cm4ge0V2ZW50fSBUaGUgbmV3IGV2ZW50IHRoYXQgd2FzIGZpcmVkLlxuICAgICAqL1xuICAgIGZpcmUodHlwZSwgZGV0YWlsID0ge30sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQodHlwZSwge1xuICAgICAgICBidWJibGVzOiBvcHRpb25zLmJ1YmJsZXMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb25zLmJ1YmJsZXMsXG4gICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSxcbiAgICAgICAgY29tcG9zZWQ6IG9wdGlvbnMuY29tcG9zZWQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb25zLmNvbXBvc2VkLFxuICAgICAgfSk7XG4gICAgICBldmVudC5kZXRhaWwgPSBkZXRhaWw7XG4gICAgICBjb25zdCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7XG4gICAgICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cbiAgfVxuICByZXR1cm4gRXZlbnRzTWl4aW47XG59O1xuIiwiaW1wb3J0IGhhc3NBdHRyaWJ1dGVzVXRpbCBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy91dGlsL2hhc3MtYXR0cmlidXRlcy11dGlsLmpzJztcblxud2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsID0gd2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsIHx8IHt9O1xuY29uc3QgU1VQUE9SVEVEX1NMSURFUl9NT0RFUyA9IFtcbiAgJ3NpbmdsZS1saW5lJywgJ2JyZWFrLXNsaWRlcicsICdicmVhay1zbGlkZXItdG9nZ2xlJywgJ2hpZGUtc2xpZGVyJywgJ25vLXNsaWRlcicsXG5dO1xuXG5jb25zdCBjdXN0b21VaUF0dHJpYnV0ZXMgPSB7XG4gIGdyb3VwOiB1bmRlZmluZWQsXG4gIGRldmljZTogdW5kZWZpbmVkLFxuICB0ZW1wbGF0ZXM6IHVuZGVmaW5lZCxcbiAgY29udHJvbF9lbGVtZW50OiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gIHN0YXRlX2NhcmRfbW9kZToge1xuICAgIHR5cGU6ICdhcnJheScsXG4gICAgb3B0aW9uczoge1xuICAgICAgbGlnaHQ6IFNVUFBPUlRFRF9TTElERVJfTU9ERVMuY29uY2F0KCdiYWRnZXMnKSxcbiAgICAgIGNvdmVyOiBTVVBQT1JURURfU0xJREVSX01PREVTLmNvbmNhdCgnYmFkZ2VzJyksXG4gICAgICBjbGltYXRlOiBTVVBQT1JURURfU0xJREVSX01PREVTLmNvbmNhdCgnYmFkZ2VzJyksXG4gICAgICAnKic6IFsnYmFkZ2VzJ10sXG4gICAgfSxcbiAgfSxcbiAgc3RhdGVfY2FyZF9jdXN0b21fdWlfc2Vjb25kYXJ5OiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gIGJhZGdlc19saXN0OiB7IHR5cGU6ICdqc29uJyB9LFxuICBzaG93X2xhc3RfY2hhbmdlZDogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgaGlkZV9jb250cm9sOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICBleHRyYV9kYXRhX3RlbXBsYXRlOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gIGV4dHJhX2JhZGdlOiB7IHR5cGU6ICdqc29uJyB9LFxuICBzdHJldGNoX3NsaWRlcjogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgc2xpZGVyX3RoZW1lOiB7IHR5cGU6ICdqc29uJyB9LFxuICB0aGVtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICBjb25maXJtX2NvbnRyb2xzOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICBjb25maXJtX2NvbnRyb2xzX3Nob3dfbG9jazogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgaGlkZV9pbl9kZWZhdWx0X3ZpZXc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG59O1xud2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMgPSBoYXNzQXR0cmlidXRlc1V0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFUztcbndpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5VTktOT1dOX1RZUEUgPSBoYXNzQXR0cmlidXRlc1V0aWwuVU5LTk9XTl9UWVBFO1xuT2JqZWN0LmFzc2lnbih3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFUywgY3VzdG9tVWlBdHRyaWJ1dGVzKTtcbiIsImltcG9ydCBhcHBseVRoZW1lc09uRWxlbWVudCBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZG9tL2FwcGx5X3RoZW1lc19vbl9lbGVtZW50LmpzJztcbmltcG9ydCBjb21wdXRlU3RhdGVEb21haW4gZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jb21wdXRlX3N0YXRlX2RvbWFpbi5qcyc7XG5pbXBvcnQgZ2V0Vmlld0VudGl0aWVzIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9lbnRpdHkvZ2V0X3ZpZXdfZW50aXRpZXMuanMnO1xuXG5pbXBvcnQgJy4uL2VsZW1lbnRzL2hhLWNvbmZpZy1jdXN0b20tdWkuanMnO1xuaW1wb3J0IFZFUlNJT04gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmltcG9ydCAnLi9oYXNzLWF0dHJpYnV0ZS11dGlsLmpzJztcblxud2luZG93LmN1c3RvbVVJID0gd2luZG93LmN1c3RvbVVJIHx8IHtcbiAgU1VQUE9SVEVEX1NMSURFUl9NT0RFUzogW1xuICAgICdzaW5nbGUtbGluZScsICdicmVhay1zbGlkZXInLCAnYnJlYWstc2xpZGVyLXRvZ2dsZScsICdoaWRlLXNsaWRlcicsICduby1zbGlkZXInLFxuICBdLFxuXG4gIGRvbUhvc3QoZWxlbSkge1xuICAgIGlmIChlbGVtID09PSBkb2N1bWVudCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW0uZ2V0Um9vdE5vZGUoKTtcbiAgICByZXR1cm4gKHJvb3QgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSA/IC8qKiBAdHlwZSB7U2hhZG93Um9vdH0gKi8gKHJvb3QpLmhvc3QgOiByb290O1xuICB9LFxuXG4gIGxpZ2h0T3JTaGFkb3coZWxlbSwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gZWxlbS5zaGFkb3dSb290ID9cbiAgICAgIGVsZW0uc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSA6XG4gICAgICBlbGVtLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9LFxuXG4gIGdldEVsZW1lbnRIaWVyYXJjaHkocm9vdCwgaGllcmFyY2h5KSB7XG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGVsZW0gPSBoaWVyYXJjaHkuc2hpZnQoKTtcbiAgICBpZiAoZWxlbSkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KFxuICAgICAgICB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhyb290LCBlbGVtKSwgaGllcmFyY2h5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0sXG5cbiAgZ2V0Q29udGV4dChlbGVtKSB7XG4gICAgaWYgKGVsZW0uX2NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxlbS5fY29udGV4dCA9IFtdO1xuICAgICAgZm9yIChsZXQgZWxlbWVudCA9IChlbGVtLnRhZ05hbWUgPT09ICdIQS1FTlRJVElFUy1DQVJEJyA/IHdpbmRvdy5jdXN0b21VSS5kb21Ib3N0KGVsZW0pIDogZWxlbSk7XG4gICAgICAgIGVsZW1lbnQ7IGVsZW1lbnQgPSB3aW5kb3cuY3VzdG9tVUkuZG9tSG9zdChlbGVtZW50KSkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudGFnTmFtZSkge1xuICAgICAgICAgIGNhc2UgJ0hBLUVOVElUSUVTLUNBUkQnOlxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ3JvdXBFbnRpdHkpIHtcbiAgICAgICAgICAgICAgZWxlbS5fY29udGV4dC5wdXNoKGVsZW1lbnQuZ3JvdXBFbnRpdHkuZW50aXR5X2lkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ncm91cEVudGl0eSA9PT0gZmFsc2UgJiYgZWxlbWVudC5zdGF0ZXMgJiYgZWxlbWVudC5zdGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGVsZW0uX2NvbnRleHQucHVzaChgZ3JvdXAuJHtjb21wdXRlU3RhdGVEb21haW4oZWxlbWVudC5zdGF0ZXNbMF0pfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnTU9SRS1JTkZPLUdST1VQJzpcbiAgICAgICAgICBjYXNlICdTVEFURS1DQVJELUNPTlRFTlQnOlxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdGVPYmopIHtcbiAgICAgICAgICAgICAgZWxlbS5fY29udGV4dC5wdXNoKGVsZW1lbnQuc3RhdGVPYmouZW50aXR5X2lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0hBLUNBUkRTJzpcbiAgICAgICAgICAgIGVsZW0uX2NvbnRleHQucHVzaChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS12aWV3JykgfHwgJ2RlZmF1bHRfdmlldycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gbm8gZGVmYXVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbGVtLl9jb250ZXh0LnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW0uX2NvbnRleHQ7XG4gIH0sXG5cbiAgZmluZE1hdGNoKGtleSwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIG51bGw7XG4gICAgaWYgKG9wdGlvbnNba2V5XSkgcmV0dXJuIGtleTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob3B0aW9ucykuZmluZChvcHRpb24gPT4ga2V5Lm1hdGNoKGBeJHtvcHRpb259JGApKTtcbiAgfSxcblxuICBtYXliZUNoYW5nZU9iamVjdEJ5RGV2aWNlKHN0YXRlT2JqKSB7XG4gICAgY29uc3QgbmFtZSA9IHdpbmRvdy5jdXN0b21VSS5nZXROYW1lKCk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gc3RhdGVPYmo7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmZpbmRNYXRjaChuYW1lLCBzdGF0ZU9iai5hdHRyaWJ1dGVzLmRldmljZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIHN0YXRlT2JqO1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZU9iai5hdHRyaWJ1dGVzLmRldmljZVttYXRjaF0pO1xuXG4gICAgaWYgKCFPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5sZW5ndGgpIHJldHVybiBzdGF0ZU9iajtcbiAgICByZXR1cm4gd2luZG93LmN1c3RvbVVJLmFwcGx5QXR0cmlidXRlcyhzdGF0ZU9iaiwgYXR0cmlidXRlcyk7XG4gIH0sXG5cbiAgbWF5YmVDaGFuZ2VPYmplY3RCeUdyb3VwKGVsZW0sIHN0YXRlT2JqKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHdpbmRvdy5jdXN0b21VSS5nZXRDb250ZXh0KGVsZW0pO1xuICAgIGlmICghY29udGV4dCkgcmV0dXJuIHN0YXRlT2JqO1xuXG4gICAgaWYgKCFzdGF0ZU9iai5hdHRyaWJ1dGVzLmdyb3VwKSB7XG4gICAgICByZXR1cm4gc3RhdGVPYmo7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICBjb250ZXh0LmZvckVhY2goKGMpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5maW5kTWF0Y2goYywgc3RhdGVPYmouYXR0cmlidXRlcy5ncm91cCk7XG4gICAgICBpZiAoc3RhdGVPYmouYXR0cmlidXRlcy5ncm91cFttYXRjaF0pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCBzdGF0ZU9iai5hdHRyaWJ1dGVzLmdyb3VwW21hdGNoXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIU9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmxlbmd0aCkgcmV0dXJuIHN0YXRlT2JqO1xuXG4gICAgcmV0dXJuIHdpbmRvdy5jdXN0b21VSS5hcHBseUF0dHJpYnV0ZXMoc3RhdGVPYmosIGF0dHJpYnV0ZXMpO1xuICB9LFxuXG4gIF9zZXRLZWVwKG9iaiwgdmFsdWUpIHtcbiAgICBpZiAob2JqLl9jdWlfa2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYmouX2N1aV9rZWVwID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iai5fY3VpX2tlZXAgPSBvYmouX2N1aV9rZWVwICYmIHZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBtYXliZUFwcGx5VGVtcGxhdGVBdHRyaWJ1dGVzKGhhc3MsIHN0YXRlcywgc3RhdGVPYmosIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZXMudGVtcGxhdGVzKSB7XG4gICAgICB3aW5kb3cuY3VzdG9tVUkuX3NldEtlZXAoc3RhdGVPYmosIHRydWUpO1xuICAgICAgcmV0dXJuIHN0YXRlT2JqO1xuICAgIH1cbiAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0ge307XG4gICAgbGV0IGhhc0dsb2JhbCA9IGZhbHNlO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcy50ZW1wbGF0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBhdHRyaWJ1dGVzLnRlbXBsYXRlc1trZXldO1xuICAgICAgaWYgKHRlbXBsYXRlLm1hdGNoKC9cXGIoZW50aXRpZXN8aGFzcylcXGIvKSkge1xuICAgICAgICBoYXNHbG9iYWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSB3aW5kb3cuY3VzdG9tVUkuY29tcHV0ZVRlbXBsYXRlKFxuICAgICAgICB0ZW1wbGF0ZSwgaGFzcywgc3RhdGVzLCBzdGF0ZU9iaiwgYXR0cmlidXRlcyxcbiAgICAgICAgKHN0YXRlT2JqLnVudGVtcGxhdGVkX2F0dHJpYnV0ZXMgJiYgc3RhdGVPYmoudW50ZW1wbGF0ZWRfYXR0cmlidXRlc1trZXldKSB8fFxuICAgICAgICAgICAgYXR0cmlidXRlc1trZXldLFxuICAgICAgICBzdGF0ZU9iai51bnRlbXBsYXRlZF9zdGF0ZSB8fCBzdGF0ZU9iai5zdGF0ZSk7XG4gICAgICAvLyBJbiBjYXNlIG9mIG51bGwgZG9uJ3Qgc2V0IHRoZSB2YWx1ZS5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgbmV3QXR0cmlidXRlc1trZXldID0gdmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gc3RhdGVPYmouc3RhdGUpIHtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdfc3RhdGVEaXNwbGF5Jykge1xuICAgICAgICBpZiAodmFsdWUgIT09IHN0YXRlT2JqLl9zdGF0ZURpc3BsYXkpIHtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gYXR0cmlidXRlc1trZXldKSB7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5jdXN0b21VSS5fc2V0S2VlcChzdGF0ZU9iaiwgIWhhc0dsb2JhbCk7XG4gICAgaWYgKCFoYXNDaGFuZ2VzKSB7XG4gICAgICByZXR1cm4gc3RhdGVPYmo7XG4gICAgfVxuICAgIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzID09PSBhdHRyaWJ1dGVzKSB7XG4gICAgICAvLyBXZSBhcmUgb3BlcmF0aW5nIG9uIHJlYWwgYXR0cmlidXRlcy4gUmVwbGFjZSB0aGVtLlxuICAgICAgY29uc3QgcmVzdWx0ID0gd2luZG93LmN1c3RvbVVJLmFwcGx5QXR0cmlidXRlcyhzdGF0ZU9iaiwgbmV3QXR0cmlidXRlcyk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0F0dHJpYnV0ZXMsICdzdGF0ZScpKSB7XG4gICAgICAgIGlmIChuZXdBdHRyaWJ1dGVzLnN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0LnN0YXRlID0gU3RyaW5nKG5ld0F0dHJpYnV0ZXMuc3RhdGUpO1xuICAgICAgICAgIHJlc3VsdC51bnRlbXBsYXRlZF9zdGF0ZSA9IHN0YXRlT2JqLnN0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0F0dHJpYnV0ZXMsICdfc3RhdGVEaXNwbGF5JykpIHtcbiAgICAgICAgcmVzdWx0Ll9zdGF0ZURpc3BsYXkgPSBuZXdBdHRyaWJ1dGVzLl9zdGF0ZURpc3BsYXk7XG4gICAgICAgIHJlc3VsdC51bnRlbXBsYXRlZF9zdGF0ZURpc3BsYXkgPSBzdGF0ZU9iai5fc3RhdGVEaXNwbGF5O1xuICAgICAgfVxuICAgICAgd2luZG93LmN1c3RvbVVJLl9zZXRLZWVwKHJlc3VsdCwgIWhhc0dsb2JhbCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBPcGVyYXRpbmcgb24gY29udGV4dC1hd2FyZSBhdHRyaWJ1dGVzLiBSZXR1cm4gc2hhbGxvdyBjb3B5IG9mIG9iamVjdC5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGVPYmopO1xuICB9LFxuXG4gIG1heWJlQXBwbHlUZW1wbGF0ZXMoaGFzcywgc3RhdGVzLCBzdGF0ZU9iaikge1xuICAgIGNvbnN0IG5ld1Jlc3VsdCA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUFwcGx5VGVtcGxhdGVBdHRyaWJ1dGVzKFxuICAgICAgaGFzcywgc3RhdGVzLCBzdGF0ZU9iaiwgc3RhdGVPYmouYXR0cmlidXRlcyk7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSAobmV3UmVzdWx0ICE9PSBzdGF0ZU9iaik7XG5cbiAgICBmdW5jdGlvbiBjaGVja0F0dHJpYnV0ZXMob2JqKSB7XG4gICAgICBpZiAoIW9iaikgcmV0dXJuO1xuICAgICAgT2JqZWN0LnZhbHVlcyhvYmopLmZvckVhY2goKGF0dHJpYnV0ZXMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gd2luZG93LmN1c3RvbVVJLm1heWJlQXBwbHlUZW1wbGF0ZUF0dHJpYnV0ZXMoXG4gICAgICAgICAgaGFzcywgc3RhdGVzLCBuZXdSZXN1bHQsIGF0dHJpYnV0ZXMpO1xuICAgICAgICBoYXNDaGFuZ2VzIHw9IChyZXN1bHQgIT09IG5ld1Jlc3VsdCk7XG4gICAgICB9KTtcbiAgICAgIGNoZWNrQXR0cmlidXRlcyhvYmouZGV2aWNlKTtcbiAgICAgIGNoZWNrQXR0cmlidXRlcyhvYmouZ3JvdXApO1xuICAgIH1cblxuICAgIGNoZWNrQXR0cmlidXRlcyhzdGF0ZU9iai5hdHRyaWJ1dGVzLmRldmljZSk7XG4gICAgY2hlY2tBdHRyaWJ1dGVzKHN0YXRlT2JqLmF0dHJpYnV0ZXMuZ3JvdXApO1xuICAgIGlmIChuZXdSZXN1bHQgIT09IHN0YXRlT2JqKSByZXR1cm4gbmV3UmVzdWx0O1xuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGVPYmopO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGVPYmo7XG4gIH0sXG5cbiAgYXBwbHlBdHRyaWJ1dGVzKHN0YXRlT2JqLCBhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eV9pZDogc3RhdGVPYmouZW50aXR5X2lkLFxuICAgICAgc3RhdGU6IHN0YXRlT2JqLnN0YXRlLFxuICAgICAgYXR0cmlidXRlczogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGVPYmouYXR0cmlidXRlcywgYXR0cmlidXRlcyksXG4gICAgICB1bnRlbXBsYXRlZF9hdHRyaWJ1dGVzOiBzdGF0ZU9iai5hdHRyaWJ1dGVzLFxuICAgICAgbGFzdF9jaGFuZ2VkOiBzdGF0ZU9iai5sYXN0X2NoYW5nZWQsXG4gICAgfTtcbiAgfSxcblxuICBtYXliZUNoYW5nZU9iamVjdChlbGVtLCBzdGF0ZU9iaiwgaW5EaWFsb2csIGFsbG93SGlkZGVuKSB7XG4gICAgaWYgKGluRGlhbG9nKSByZXR1cm4gc3RhdGVPYmo7XG4gICAgbGV0IG9iaiA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdEJ5RGV2aWNlKHN0YXRlT2JqKTtcbiAgICBvYmogPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3RCeUdyb3VwKGVsZW0sIG9iaik7XG4gICAgb2JqID0gd2luZG93LmN1c3RvbVVJLm1heWJlQXBwbHlUZW1wbGF0ZUF0dHJpYnV0ZXMoXG4gICAgICBlbGVtLmhhc3MsIGVsZW0uaGFzcy5zdGF0ZXMsIG9iaiwgb2JqLmF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKG9iaiAhPT0gc3RhdGVPYmogJiYgb2JqLmF0dHJpYnV0ZXMuaGlkZGVuICYmIGFsbG93SGlkZGVuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcblxuICBmaXhHcm91cFRpdGxlcygpIHtcbiAgICBjb25zdCBob21lQXNzaXN0YW50TWFpbiA9IHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KGRvY3VtZW50LCBbXG4gICAgICAnaG9tZS1hc3Npc3RhbnQnLFxuICAgICAgJ2hvbWUtYXNzaXN0YW50LW1haW4nXSk7XG4gICAgaWYgKGhvbWVBc3Npc3RhbnRNYWluID09PSBudWxsKSB7XG4gICAgICAvLyBET00gbm90IHJlYWR5LiBXYWl0IDEgc2Vjb25kLlxuICAgICAgd2luZG93LnNldFRpbWVvdXQod2luZG93LmN1c3RvbVVJLmZpeEdyb3VwVGl0bGVzLCAxMDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYUNhcmRzID0gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoaG9tZUFzc2lzdGFudE1haW4sIFtcbiAgICAgICdwYXJ0aWFsLWNhcmRzJyxcbiAgICAgICdoYS1jYXJkc1t2aWV3LXZpc2libGVdJ10pO1xuICAgIGlmIChoYUNhcmRzID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgbWFpbiA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGhhQ2FyZHMsICcubWFpbicpIHx8IGhhQ2FyZHMuJC5tYWluO1xuICAgIGNvbnN0IGNhcmRzID0gbWFpbi5xdWVyeVNlbGVjdG9yQWxsKCdoYS1lbnRpdGllcy1jYXJkJyk7XG4gICAgY2FyZHMuZm9yRWFjaCgoY2FyZCkgPT4ge1xuICAgICAgaWYgKGNhcmQuZ3JvdXBFbnRpdHkpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gd2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0KFxuICAgICAgICAgIGNhcmQsXG4gICAgICAgICAgY2FyZC5ncm91cEVudGl0eSxcbiAgICAgICAgICBmYWxzZSAvKiBpbkRpYWxvZyAqLyxcbiAgICAgICAgICBmYWxzZSAvKiBhbGxvd0hpZGRlbiAqLyk7XG4gICAgICAgIGlmIChvYmogIT09IGNhcmQuZ3JvdXBFbnRpdHkgJiYgb2JqLmF0dHJpYnV0ZXMuZnJpZW5kbHlfbmFtZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWVFbGVtID0gd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3coY2FyZCwgJy5uYW1lJyk7XG4gICAgICAgICAgbmFtZUVsZW0udGV4dENvbnRlbnQgPSBvYmouYXR0cmlidXRlcy5mcmllbmRseV9uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgY29udHJvbENvbHVtbnMoY29sdW1ucykge1xuICAgIGNvbnN0IHBhcnRpYWxDYXJkcyA9IHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KGRvY3VtZW50LCBbXG4gICAgICAnaG9tZS1hc3Npc3RhbnQnLFxuICAgICAgJ2hvbWUtYXNzaXN0YW50LW1haW4nLFxuICAgICAgJ3BhcnRpYWwtY2FyZHMnXSk7XG4gICAgaWYgKHBhcnRpYWxDYXJkcyA9PT0gbnVsbCkge1xuICAgICAgLy8gRE9NIG5vdCByZWFkeS4gV2FpdCAxIHNlY29uZC5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICB3aW5kb3cuY3VzdG9tVUkuY29udHJvbENvbHVtbnMuYmluZChudWxsLCBjb2x1bW5zKSxcbiAgICAgICAgMTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBhcnRpYWxDYXJkcy5tcWxzLmZvckVhY2goKG1xbCkgPT4ge1xuICAgICAgbXFsLnJlbW92ZUxpc3RlbmVyKHBhcnRpYWxDYXJkcy5oYW5kbGVXaW5kb3dDaGFuZ2UpO1xuICAgIH0pO1xuICAgIHBhcnRpYWxDYXJkcy5tcWxzID0gY29sdW1ucy5tYXAoKHdpZHRoKSA9PiB7XG4gICAgICBjb25zdCBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1pbi13aWR0aDogJHt3aWR0aH1weClgKTtcbiAgICAgIG1xbC5hZGRMaXN0ZW5lcihwYXJ0aWFsQ2FyZHMuaGFuZGxlV2luZG93Q2hhbmdlKTtcbiAgICAgIHJldHVybiBtcWw7XG4gICAgfSk7XG4gICAgcGFydGlhbENhcmRzLmhhbmRsZVdpbmRvd0NoYW5nZSgpO1xuICB9LFxuXG4gIHVzZUN1c3RvbWl6ZXIoKSB7XG4gICAgY29uc3QgbWFpbiA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGRvY3VtZW50LCAnaG9tZS1hc3Npc3RhbnQnKTtcbiAgICBjb25zdCBjdXN0b21pemVyID0gbWFpbi5oYXNzLnN0YXRlc1snY3VzdG9taXplci5jdXN0b21pemVyJ107XG4gICAgaWYgKCFjdXN0b21pemVyKSByZXR1cm47XG4gICAgaWYgKGN1c3RvbWl6ZXIuYXR0cmlidXRlcy5jb2x1bW5zKSB7XG4gICAgICB3aW5kb3cuY3VzdG9tVUkuY29udHJvbENvbHVtbnMoY3VzdG9taXplci5hdHRyaWJ1dGVzLmNvbHVtbnMpO1xuICAgIH1cbiAgICBpZiAoY3VzdG9taXplci5hdHRyaWJ1dGVzLmhpZGVfYXR0cmlidXRlcykge1xuICAgICAgaWYgKHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbCAmJiB3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFUykge1xuICAgICAgICBjdXN0b21pemVyLmF0dHJpYnV0ZXMuaGlkZV9hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgIHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTLCBhdHRyKSkge1xuICAgICAgICAgICAgd2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVNbYXR0cl0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdXBkYXRlQ29uZmlnUGFuZWwoKSB7XG4gICAgaWYgKCF3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2NvbmZpZycpKSByZXR1cm47XG4gICAgY29uc3QgaGFQYW5lbENvbmZpZyA9IHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KGRvY3VtZW50LCBbXG4gICAgICAnaG9tZS1hc3Npc3RhbnQnLFxuICAgICAgJ2hvbWUtYXNzaXN0YW50LW1haW4nLFxuICAgICAgJ3BhcnRpYWwtcGFuZWwtcmVzb2x2ZXInLFxuICAgICAgJ2hhLXBhbmVsLWNvbmZpZyddKTtcbiAgICBpZiAoIWhhUGFuZWxDb25maWcpIHtcbiAgICAgIC8vIERPTSBub3QgcmVhZHkuIFdhaXQgMTAwbXMuXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCh3aW5kb3cuY3VzdG9tVUkudXBkYXRlQ29uZmlnUGFuZWwsIDEwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhhQ29uZmlnTmF2aWdhdGlvbiA9IHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KGhhUGFuZWxDb25maWcsIFtcbiAgICAgICdoYS1jb25maWctZGFzaGJvYXJkJyxcbiAgICAgICdoYS1jb25maWctbmF2aWdhdGlvbiddKTtcbiAgICBpZiAoaGFDb25maWdOYXZpZ2F0aW9uKSB7XG4gICAgICAvLyBIYUNvbmZpZ05hdmlnYXRpb24gc3RhcnRlZCB1c2luZyBsb2NhbGl6ZSBvbiAyMS4wMS4yMDE4XG4gICAgICBpZiAoaGFDb25maWdOYXZpZ2F0aW9uLmxvY2FsaXplICYmICFoYUNvbmZpZ05hdmlnYXRpb24uY3VpUGF0Y2gpIHtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLmN1aVBhdGNoID0gdHJ1ZTtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9vcmlnaW5hbENvbXB1dGVMb2FkZWQgPSBoYUNvbmZpZ05hdmlnYXRpb24uX2NvbXB1dGVMb2FkZWQ7XG4gICAgICAgIGhhQ29uZmlnTmF2aWdhdGlvbi5fb3JpZ2luYWxDb21wdXRlQ2FwdGlvbiA9IGhhQ29uZmlnTmF2aWdhdGlvbi5fY29tcHV0ZUNhcHRpb247XG4gICAgICAgIGhhQ29uZmlnTmF2aWdhdGlvbi5fb3JpZ2luYWxDb21wdXRlRGVzY3JpcHRpb24gPSBoYUNvbmZpZ05hdmlnYXRpb24uX2NvbXB1dGVEZXNjcmlwdGlvbjtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9jb21wdXRlTG9hZGVkID0gKGhhc3MsIHBhZ2UpID0+XG4gICAgICAgICAgcGFnZSA9PT0gJ2N1c3RvbXVpJyB8fCBoYUNvbmZpZ05hdmlnYXRpb24uX29yaWdpbmFsQ29tcHV0ZUxvYWRlZChoYXNzLCBwYWdlKTtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9jb21wdXRlQ2FwdGlvbiA9IChwYWdlLCBsb2NhbGl6ZSkgPT5cbiAgICAgICAgICAocGFnZSA9PT0gJ2N1c3RvbXVpJyA/ICdDdXN0b20gVUknIDogaGFDb25maWdOYXZpZ2F0aW9uLl9vcmlnaW5hbENvbXB1dGVDYXB0aW9uKHBhZ2UsIGxvY2FsaXplKSk7XG4gICAgICAgIGhhQ29uZmlnTmF2aWdhdGlvbi5fY29tcHV0ZURlc2NyaXB0aW9uID0gKHBhZ2UsIGxvY2FsaXplKSA9PlxuICAgICAgICAgIChwYWdlID09PSAnY3VzdG9tdWknID8gJ1NldFVJIHR3ZWFrcycgOiBoYUNvbmZpZ05hdmlnYXRpb24uX29yaWdpbmFsQ29tcHV0ZURlc2NyaXB0aW9uKHBhZ2UsIGxvY2FsaXplKSk7XG4gICAgICB9XG4gICAgICBpZiAoIWhhQ29uZmlnTmF2aWdhdGlvbi5wYWdlcy5zb21lKGNvbmYgPT4gY29uZiA9PT0gJ2N1c3RvbXVpJyB8fCBjb25mLmRvbWFpbiA9PT0gJ2N1c3RvbXVpJykpIHtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLnB1c2goJ3BhZ2VzJywgaGFDb25maWdOYXZpZ2F0aW9uLmxvY2FsaXplID8gJ2N1c3RvbXVpJyA6IHtcbiAgICAgICAgICBkb21haW46ICdjdXN0b211aScsXG4gICAgICAgICAgY2FwdGlvbjogJ0N1c3RvbSBVSScsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTZXQgVUkgdHdlYWtzLicsXG4gICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZ2V0SGFDb25maWdDdXN0b21VaSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGhhQ29uZmlnQ3VzdG9tVWkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoYS1jb25maWctY3VzdG9tLXVpJyk7XG4gICAgICBoYUNvbmZpZ0N1c3RvbVVpLmlzV2lkZSA9IGhhUGFuZWxDb25maWcuaXNXaWRlO1xuICAgICAgaGFDb25maWdDdXN0b21VaS5zZXRBdHRyaWJ1dGUoJ3BhZ2UtbmFtZScsICdjdXN0b211aScpO1xuICAgICAgcmV0dXJuIGhhQ29uZmlnQ3VzdG9tVWk7XG4gICAgfTtcblxuICAgIGNvbnN0IGlyb25QYWdlcyA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGhhUGFuZWxDb25maWcsICdpcm9uLXBhZ2VzJyk7XG4gICAgaWYgKGlyb25QYWdlcykge1xuICAgICAgaWYgKGlyb25QYWdlcy5sYXN0RWxlbWVudENoaWxkLnRhZ05hbWUgIT09ICdIQS1DT05GSUctQ1VTVE9NLVVJJykge1xuICAgICAgICBjb25zdCBoYUNvbmZpZ0N1c3RvbVVpID0gZ2V0SGFDb25maWdDdXN0b21VaSgpO1xuICAgICAgICBpcm9uUGFnZXMuYXBwZW5kQ2hpbGQoaGFDb25maWdDdXN0b21VaSk7XG4gICAgICAgIGlyb25QYWdlcy5hZGRFdmVudExpc3RlbmVyKCdpcm9uLWl0ZW1zLWNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvY29uZmlnL2N1c3RvbXVpJykpIHtcbiAgICAgICAgICAgIGlyb25QYWdlcy5zZWxlY3QoJ2N1c3RvbXVpJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgcm9vdCA9IGhhUGFuZWxDb25maWcuc2hhZG93Um9vdCB8fCBoYVBhbmVsQ29uZmlnO1xuICAgICAgaWYgKHJvb3QubGFzdEVsZW1lbnRDaGlsZC50YWdOYW1lICE9PSAnSEEtQ09ORklHLUNVU1RPTS1VSScpIHtcbiAgICAgICAgY29uc3QgaGFDb25maWdDdXN0b21VaSA9IGdldEhhQ29uZmlnQ3VzdG9tVWkoKTtcbiAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChoYUNvbmZpZ0N1c3RvbVVpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpc2libGUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2NvbmZpZy9jdXN0b211aScpO1xuICAgICAgcm9vdC5sYXN0RWxlbWVudENoaWxkLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgfVxuICB9LFxuXG4gIGluc3RhbGxTdGF0ZXNIb29rKCkge1xuICAgIGNvbnN0IGhvbWVBc3Npc3RhbnQgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2hvbWUtYXNzaXN0YW50Jyk7XG4gICAgaWYgKCFob21lQXNzaXN0YW50IHx8ICFob21lQXNzaXN0YW50LnByb3RvdHlwZS5fdXBkYXRlSGFzcykgcmV0dXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsVXBkYXRlID0gaG9tZUFzc2lzdGFudC5wcm90b3R5cGUuX3VwZGF0ZUhhc3M7XG4gICAgaG9tZUFzc2lzdGFudC5wcm90b3R5cGUuX3VwZGF0ZUhhc3MgPSBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICAvLyBVc2UgbmFtZWQgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnLlxuICAgICAgY29uc3QgeyBoYXNzIH0gPSB0aGlzO1xuICAgICAgaWYgKG9iai5zdGF0ZXMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMob2JqLnN0YXRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gb2JqLnN0YXRlc1trZXldO1xuICAgICAgICAgIGlmIChlbnRpdHkuX2N1aV9rZWVwKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgbmV3RW50aXR5ID0gd2luZG93LmN1c3RvbVVJLm1heWJlQXBwbHlUZW1wbGF0ZXMoaGFzcywgb2JqLnN0YXRlcywgZW50aXR5KTtcbiAgICAgICAgICBpZiAoaGFzcy5zdGF0ZXMgJiYgZW50aXR5ICE9PSBoYXNzLnN0YXRlc1trZXldKSB7XG4gICAgICAgICAgICAvLyBOZXcgc3RhdGUgYXJyaXZlZC4gUHV0IG1vZGlmaWVkIHN0YXRlIGluLlxuICAgICAgICAgICAgb2JqLnN0YXRlc1trZXldID0gbmV3RW50aXR5O1xuICAgICAgICAgIH0gZWxzZSBpZiAoZW50aXR5ICE9PSBuZXdFbnRpdHkpIHtcbiAgICAgICAgICAgIC8vIEl0J3MgdGhlIHNhbWUgc3RhdGUgYnV0IGNvbnRlbnRzIGNoYW5nZWQgZHVlIHRvIG90aGVyIHN0YXRlIGNoYW5nZXMuXG4gICAgICAgICAgICBvYmouc3RhdGVzW2tleV0gPSBuZXdFbnRpdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsVXBkYXRlLmNhbGwodGhpcywgb2JqKTtcbiAgICAgIGlmIChvYmoudGhlbWVzICYmIGhhc3MuX3RoZW1lV2FpdGVycykge1xuICAgICAgICBoYXNzLl90aGVtZVdhaXRlcnMuZm9yRWFjaCh3YWl0ZXIgPT4gd2FpdGVyLnN0YXRlQ2hhbmdlZCh3YWl0ZXIuc3RhdGUpKTtcbiAgICAgICAgaGFzcy5fdGhlbWVXYWl0ZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgbWFpbiA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGRvY3VtZW50LCAnaG9tZS1hc3Npc3RhbnQnKTtcbiAgICBpZiAobWFpbi5oYXNzICYmIG1haW4uaGFzcy5zdGF0ZXMpIHtcbiAgICAgIG1haW4uX3VwZGF0ZUhhc3MoeyBzdGF0ZXM6IG1haW4uaGFzcy5zdGF0ZXMgfSk7XG4gICAgfVxuICB9LFxuXG4gIGluc3RhbGxQYXJ0aWFsQ2FyZHMoKSB7XG4gICAgY29uc3QgcGFydGlhbENhcmRzID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdwYXJ0aWFsLWNhcmRzJyk7XG4gICAgaWYgKCFwYXJ0aWFsQ2FyZHMgfHwgIXBhcnRpYWxDYXJkcy5wcm90b3R5cGUuX2RlZmF1bHRWaWV3RmlsdGVyKSByZXR1cm47XG4gICAgcGFydGlhbENhcmRzLnByb3RvdHlwZS5fZGVmYXVsdFZpZXdGaWx0ZXIgPSAoaGFzcywgZW50aXR5SWQpID0+IHtcbiAgICAgIGlmIChoYXNzLnN0YXRlc1tlbnRpdHlJZF0uYXR0cmlidXRlcy5oaWRkZW4pIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGV4Y2x1ZGVzID0ge307XG4gICAgICBPYmplY3QudmFsdWVzKGhhc3Muc3RhdGVzKS5mb3JFYWNoKChlbnRpdHkpID0+IHtcbiAgICAgICAgaWYgKGVudGl0eS5hdHRyaWJ1dGVzICYmIGVudGl0eS5hdHRyaWJ1dGVzLmhpZGVfaW5fZGVmYXVsdF92aWV3KSB7XG4gICAgICAgICAgY29uc3QgZXhjbHVkZUVudGl0eUlkID0gZW50aXR5LmVudGl0eV9pZDtcbiAgICAgICAgICBpZiAoZXhjbHVkZXNbZXhjbHVkZUVudGl0eUlkXSkgcmV0dXJuO1xuICAgICAgICAgIGV4Y2x1ZGVzW2V4Y2x1ZGVFbnRpdHlJZF0gPSBlbnRpdHk7XG4gICAgICAgICAgaWYgKGVudGl0eS5hdHRyaWJ1dGVzLnZpZXcpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIGV4Y2x1ZGVzLCBnZXRWaWV3RW50aXRpZXMoaGFzcy5zdGF0ZXMsIGVudGl0eSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gIWV4Y2x1ZGVzW2VudGl0eUlkXTtcbiAgICB9O1xuICB9LFxuXG4gIC8vIEFsbG93cyBjaGFuZ2luZyB0aGUgJ0V4ZWN1dGUnIC8gJ0FjdGl2YXRlJyB0ZXh0IG9uIHNjcmlwdC9zY2VuZSBjYXJkcy5cbiAgaW5zdGFsbEFjdGlvbk5hbWUoZWxlbWVudE5hbWUpIHtcbiAgICBjb25zdCBrbGFzcyA9IGN1c3RvbUVsZW1lbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgaWYgKCFrbGFzcyB8fCAha2xhc3MucHJvdG90eXBlKSByZXR1cm47XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGtsYXNzLnByb3RvdHlwZSwgJ2xvY2FsaXplJywge1xuICAgICAgZ2V0KCkge1xuICAgICAgICBmdW5jdGlvbiBjdXN0b21Mb2NhbGl6ZSh2KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGVPYmogJiYgdGhpcy5zdGF0ZU9iai5hdHRyaWJ1dGVzICYmXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVPYmouYXR0cmlidXRlcy5hY3Rpb25fbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVPYmouYXR0cmlidXRlcy5hY3Rpb25fbmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19kYXRhLmxvY2FsaXplKHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXN0b21Mb2NhbGl6ZTtcbiAgICAgIH0sXG4gICAgICBzZXQoKSB7fSxcbiAgICB9KTtcbiAgfSxcblxuICAvLyBBbGxvd3MgdGhlbWluZyBcInJlZ3VsYXJcIiB0b3AgYmFkZ2VzLlxuICBpbnN0YWxsSGFTdGF0ZUxhYmVsQmFkZ2UoKSB7XG4gICAgY29uc3QgaGFTdGF0ZUxhYmVsQmFkZ2UgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2hhLXN0YXRlLWxhYmVsLWJhZGdlJyk7XG4gICAgaWYgKCFoYVN0YXRlTGFiZWxCYWRnZSB8fCAhaGFTdGF0ZUxhYmVsQmFkZ2UucHJvdG90eXBlLnN0YXRlQ2hhbmdlZCkgcmV0dXJuO1xuICAgIC8vIFVzZSBuYW1lZCBmdW5jdGlvbiB0byBwcmVzZXJ2ZSAndGhpcycuXG4gICAgaGFTdGF0ZUxhYmVsQmFkZ2UucHJvdG90eXBlLnN0YXRlQ2hhbmdlZCA9IGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZU9iaikge1xuICAgICAgLy8gVE9ETzogQ2FsbCB3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3RcbiAgICAgIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzLnRoZW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc3MudGhlbWVzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5oYXNzLl90aGVtZVdhaXRlcnMgPSB0aGlzLmhhc3MuX3RoZW1lV2FpdGVycyB8fCBbXTtcbiAgICAgICAgICB0aGlzLmhhc3MuX3RoZW1lV2FpdGVycy5wdXNoKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFwcGx5VGhlbWVzT25FbGVtZW50KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaGFzcy50aGVtZXMgfHwgeyBkZWZhdWx0X3RoZW1lOiAnZGVmYXVsdCcsIHRoZW1lczoge30gfSxcbiAgICAgICAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXMudGhlbWUgfHwgJ2RlZmF1bHQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVTdHlsZXMoKTtcbiAgICAgIGlmICh0aGlzLnN0YXJ0SW50ZXJ2YWwpIHtcbiAgICAgICAgLy8gQWRkZWQgb24gMTkuMS4yMDE4XG4gICAgICAgIHRoaXMuc3RhcnRJbnRlcnZhbChzdGF0ZU9iaik7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICBpbnN0YWxsU3RhdGVCYWRnZSgpIHtcbiAgICBjb25zdCBzdGF0ZUJhZGdlID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdzdGF0ZS1iYWRnZScpO1xuICAgIGlmICghc3RhdGVCYWRnZSB8fCAhc3RhdGVCYWRnZS5wcm90b3R5cGUudXBkYXRlSWNvbkFwcGVhcmFuY2UpIHJldHVybjtcbiAgICBjb25zdCBvcmlnaW5hbFVwZGF0ZUljb25BcHBlYXJhbmNlID0gc3RhdGVCYWRnZS5wcm90b3R5cGUudXBkYXRlSWNvbkFwcGVhcmFuY2U7XG4gICAgLy8gVXNlIG5hbWVkIGZ1bmN0aW9uIHRvIHByZXNlcnZlICd0aGlzJy5cbiAgICBzdGF0ZUJhZGdlLnByb3RvdHlwZS51cGRhdGVJY29uQXBwZWFyYW5jZSA9IGZ1bmN0aW9uIGN1c3RvbVVwZGF0ZUljb25BcHBlYXJhbmNlKHN0YXRlT2JqKSB7XG4gICAgICBpZiAoc3RhdGVPYmouYXR0cmlidXRlcy5pY29uX2NvbG9yICYmICFzdGF0ZU9iai5hdHRyaWJ1dGVzLmVudGl0eV9waWN0dXJlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJyc7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy4kLmljb24uc3R5bGUsIHtcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lJyxcbiAgICAgICAgICBjb2xvcjogc3RhdGVPYmouYXR0cmlidXRlcy5pY29uX2NvbG9yLFxuICAgICAgICAgIGZpbHRlcjogJycsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3JpZ2luYWxVcGRhdGVJY29uQXBwZWFyYW5jZS5jYWxsKHRoaXMsIHN0YXRlT2JqKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIGluc3RhbGxIYUF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgaGFBdHRyaWJ1dGVzID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdoYS1hdHRyaWJ1dGVzJyk7XG4gICAgaWYgKCFoYUF0dHJpYnV0ZXMgfHwgIWhhQXR0cmlidXRlcy5wcm90b3R5cGUuY29tcHV0ZUZpbHRlcnNBcnJheSB8fFxuICAgICAgICF3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwpIHJldHVybjtcbiAgICAvLyBVc2UgbmFtZWQgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnLlxuICAgIGhhQXR0cmlidXRlcy5wcm90b3R5cGUuY29tcHV0ZUZpbHRlcnNBcnJheSA9IGZ1bmN0aW9uIGN1c3RvbUNvbXB1dGVGaWx0ZXJzQXJyYXkoZXh0cmFGaWx0ZXJzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMod2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMpLmNvbmNhdChleHRyYUZpbHRlcnMgPyBleHRyYUZpbHRlcnMuc3BsaXQoJywnKSA6IFtdKTtcbiAgICB9O1xuICB9LFxuXG4gIGluc3RhbGxIYUZvcm1DdXN0b21pemUoKSB7XG4gICAgaWYgKCF3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2NvbmZpZycpKSByZXR1cm47XG4gICAgY29uc3QgaGFGb3JtQ3VzdG9taXplID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdoYS1mb3JtLWN1c3RvbWl6ZScpO1xuICAgIGlmICghaGFGb3JtQ3VzdG9taXplKSB7XG4gICAgICAvLyBET00gbm90IHJlYWR5LiBXYWl0IDEwMG1zLlxuICAgICAgd2luZG93LnNldFRpbWVvdXQod2luZG93LmN1c3RvbVVJLmluc3RhbGxIYUZvcm1DdXN0b21pemUsIDEwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh3aW5kb3cuY3VzdG9tVUkuaGFGb3JtQ3VzdG9taXplSW5pdERvbmUpIHJldHVybjtcbiAgICB3aW5kb3cuY3VzdG9tVUkuaGFGb3JtQ3VzdG9taXplSW5pdERvbmUgPSB0cnVlO1xuXG4gICAgaWYgKCF3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwpIHJldHVybjtcbiAgICBpZiAoaGFGb3JtQ3VzdG9taXplLnByb3RvdHlwZS5fY29tcHV0ZVNpbmdsZUF0dHJpYnV0ZSkge1xuICAgICAgLy8gVXNlIG5hbWVkIGZ1bmN0aW9uIHRvIHByZXNlcnZlICd0aGlzJy5cbiAgICAgIGhhRm9ybUN1c3RvbWl6ZS5wcm90b3R5cGUuX2NvbXB1dGVTaW5nbGVBdHRyaWJ1dGUgPVxuICAgICAgICBmdW5jdGlvbiBjdXN0b21Db21wdXRlU2luZ2xlQXR0cmlidXRlKGtleSwgdmFsdWUsIHNlY29uZGFyeSkge1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTW2tleV1cbiAgICAgICAgICAgICAgfHwgeyB0eXBlOiB3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuVU5LTk9XTl9UWVBFIH07XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRPcGVuT2JqZWN0KGtleSwgY29uZmlnLnR5cGUgPT09ICdqc29uJyA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlLCBzZWNvbmRhcnksIGNvbmZpZyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChoYUZvcm1DdXN0b21pemUucHJvdG90eXBlLmdldE5ld0F0dHJpYnV0ZXNPcHRpb25zKSB7XG4gICAgICAvLyBVc2UgbmFtZWQgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnLlxuICAgICAgaGFGb3JtQ3VzdG9taXplLnByb3RvdHlwZS5nZXROZXdBdHRyaWJ1dGVzT3B0aW9ucyA9XG4gICAgICAgIGZ1bmN0aW9uIGN1c3RvbWdldE5ld0F0dHJpYnV0ZXNPcHRpb25zKFxuICAgICAgICAgIGxvY2FsQXR0cmlidXRlcywgZ2xvYmFsQXR0cmlidXRlcywgZXhpc3RpbmdBdHRyaWJ1dGVzLCBuZXdBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgY29uc3Qga25vd25LZXlzID1cbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMod2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjb25mID0gd2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVNba2V5XTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjb25mICYmICghY29uZi5kb21haW5zIHx8ICF0aGlzLmVudGl0eSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi5kb21haW5zLmluY2x1ZGVzKGNvbXB1dGVTdGF0ZURvbWFpbih0aGlzLmVudGl0eSkpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIodGhpcy5maWx0ZXJGcm9tQXR0cmlidXRlcyhsb2NhbEF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIodGhpcy5maWx0ZXJGcm9tQXR0cmlidXRlcyhnbG9iYWxBdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHRoaXMuZmlsdGVyRnJvbUF0dHJpYnV0ZXMoZXhpc3RpbmdBdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHRoaXMuZmlsdGVyRnJvbUF0dHJpYnV0ZXMobmV3QXR0cmlidXRlcykpO1xuICAgICAgICAgIHJldHVybiBrbm93bktleXMuc29ydCgpLmNvbmNhdCgnT3RoZXInKTtcbiAgICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgaW5zdGFsbENsYXNzSG9va3MoKSB7XG4gICAgaWYgKHdpbmRvdy5jdXN0b21VSS5jbGFzc0luaXREb25lKSByZXR1cm47XG4gICAgd2luZG93LmN1c3RvbVVJLmNsYXNzSW5pdERvbmUgPSB0cnVlO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsUGFydGlhbENhcmRzKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxTdGF0ZXNIb29rKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxIYVN0YXRlTGFiZWxCYWRnZSgpO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsU3RhdGVCYWRnZSgpO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsSGFBdHRyaWJ1dGVzKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxBY3Rpb25OYW1lKCdzdGF0ZS1jYXJkLXNjZW5lJyk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxBY3Rpb25OYW1lKCdzdGF0ZS1jYXJkLXNjcmlwdCcpO1xuICB9LFxuXG4gIGluaXQoKSB7XG4gICAgaWYgKHdpbmRvdy5jdXN0b21VSS5pbml0RG9uZSkgcmV0dXJuO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsQ2xhc3NIb29rcygpO1xuICAgIGNvbnN0IG1haW4gPSB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhkb2N1bWVudCwgJ2hvbWUtYXNzaXN0YW50Jyk7XG4gICAgaWYgKCFtYWluLmhhc3MgfHwgIW1haW4uaGFzcy5zdGF0ZXMpIHtcbiAgICAgIC8vIENvbm5lY3Rpb24gd2Fzbid0IG1hZGUgeWV0LiBUcnkgaW4gMSBzZWNvbmQuXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCh3aW5kb3cuY3VzdG9tVUkuaW5pdCwgMTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvdy5jdXN0b21VSS5pbml0RG9uZSA9IHRydWU7XG5cbiAgICB3aW5kb3cuY3VzdG9tVUkudXNlQ3VzdG9taXplcigpO1xuXG4gICAgd2luZG93LmN1c3RvbVVJLnJ1bkhvb2tzKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvY2F0aW9uLWNoYW5nZWQnLCB3aW5kb3cuc2V0VGltZW91dC5iaW5kKG51bGwsIHdpbmRvdy5jdXN0b21VSS5ydW5Ib29rcywgMTAwKSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUubG9nKGBMb2FkZWQgQ3VzdG9tVUkgJHtWRVJTSU9OfWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgIGlmICghd2luZG93LkNVU1RPTV9VSV9MSVNUKSB7XG4gICAgICB3aW5kb3cuQ1VTVE9NX1VJX0xJU1QgPSBbXTtcbiAgICB9XG4gICAgd2luZG93LkNVU1RPTV9VSV9MSVNULnB1c2goe1xuICAgICAgbmFtZTogJ0N1c3RvbVVJJyxcbiAgICAgIHZlcnNpb246IFZFUlNJT04sXG4gICAgICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vYW5kcmV5LWdpdC9ob21lLWFzc2lzdGFudC1jdXN0b20tdWknLFxuICAgIH0pO1xuICB9LFxuXG4gIHJ1bkhvb2tzKCkge1xuICAgIHdpbmRvdy5jdXN0b21VSS5maXhHcm91cFRpdGxlcygpO1xuICAgIHdpbmRvdy5jdXN0b21VSS51cGRhdGVDb25maWdQYW5lbCgpO1xuICAgIHdpbmRvdy5jdXN0b21VSS5pbnN0YWxsSGFGb3JtQ3VzdG9taXplKCk7XG4gIH0sXG5cbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoYS1kZXZpY2UtbmFtZScpIHx8ICcnO1xuICB9LFxuXG4gIHNldE5hbWUobmFtZSkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGEtZGV2aWNlLW5hbWUnLCBuYW1lIHx8ICcnKTtcbiAgfSxcblxuICBjb21wdXRlVGVtcGxhdGUodGVtcGxhdGUsIGhhc3MsIGVudGl0aWVzLCBlbnRpdHksIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZSwgc3RhdGUpIHtcbiAgICBjb25zdCBmdW5jdGlvbkJvZHkgPSAodGVtcGxhdGUuaW5kZXhPZigncmV0dXJuJykgPj0gMCkgPyB0ZW1wbGF0ZSA6IGByZXR1cm4gXFxgJHt0ZW1wbGF0ZX1cXGA7YDtcbiAgICB0cnkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMgKi9cbiAgICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oXG4gICAgICAgICdoYXNzJywgJ2VudGl0aWVzJywgJ2VudGl0eScsICdhdHRyaWJ1dGVzJywgJ2F0dHJpYnV0ZScsICdzdGF0ZScsIGZ1bmN0aW9uQm9keSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldy1mdW5jICovXG4gICAgICByZXR1cm4gZnVuYyhoYXNzLCBlbnRpdGllcywgZW50aXR5LCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUsIHN0YXRlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgICBpZiAoKGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikgfHwgZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtlLm5hbWV9OiAke2UubWVzc2FnZX0gaW4gdGVtcGxhdGUgJHtmdW5jdGlvbkJvZHl9YCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfSxcbn07XG53aW5kb3cuY3VzdG9tVUkuaW5pdCgpO1xuIiwiZXhwb3J0IGRlZmF1bHQgJzIwMTgwNjAyJztcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/scripts-dbg.js b/scripts-dbg.js
index 47fb0ea..67a7c6b 100644
--- a/scripts-dbg.js
+++ b/scripts-dbg.js
@@ -417,6 +417,81 @@ function stateCardType(hass, stateObj) {
/***/ }),
+/***/ "../home-assistant-polymer/src/util/hass-attributes-util.js":
+/*!******************************************************************!*\
+ !*** ../home-assistant-polymer/src/util/hass-attributes-util.js ***!
+ \******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var hassAttributeUtil = {};
+
+hassAttributeUtil.DOMAIN_DEVICE_CLASS = {
+ binary_sensor: ['battery', 'cold', 'connectivity', 'door', 'garage_door', 'gas', 'heat', 'light', 'lock', 'moisture', 'motion', 'moving', 'occupancy', 'opening', 'plug', 'power', 'presence', 'problem', 'safety', 'smoke', 'sound', 'vibration', 'window'],
+ cover: ['garage'],
+ sensor: ['battery', 'humidity', 'illuminance', 'temperature']
+};
+
+hassAttributeUtil.UNKNOWN_TYPE = 'json';
+hassAttributeUtil.ADD_TYPE = 'key-value';
+
+hassAttributeUtil.TYPE_TO_TAG = {
+ string: 'ha-customize-string',
+ json: 'ha-customize-string',
+ icon: 'ha-customize-icon',
+ boolean: 'ha-customize-boolean',
+ array: 'ha-customize-array',
+ 'key-value': 'ha-customize-key-value'
+};
+
+// Attributes here serve dual purpose:
+// 1) Any key of this object won't be shown in more-info window.
+// 2) Any key which has value other than undefined will appear in customization
+// config according to its value.
+hassAttributeUtil.LOGIC_STATE_ATTRIBUTES = hassAttributeUtil.LOGIC_STATE_ATTRIBUTES || {
+ entity_picture: undefined,
+ friendly_name: { type: 'string', description: 'Name' },
+ icon: { type: 'icon' },
+ emulated_hue: {
+ type: 'boolean',
+ domains: ['emulated_hue']
+ },
+ emulated_hue_name: {
+ type: 'string',
+ domains: ['emulated_hue']
+ },
+ haaska_hidden: undefined,
+ haaska_name: undefined,
+ homebridge_hidden: { type: 'boolean' },
+ homebridge_name: { type: 'string' },
+ supported_features: undefined,
+ attribution: undefined,
+ custom_ui_more_info: { type: 'string' },
+ custom_ui_state_card: { type: 'string' },
+ device_class: {
+ type: 'array',
+ options: hassAttributeUtil.DOMAIN_DEVICE_CLASS,
+ description: 'Device class',
+ domains: ['binary_sensor', 'cover', 'sensor']
+ },
+ hidden: { type: 'boolean', description: 'Hide from UI' },
+ assumed_state: {
+ type: 'boolean',
+ domains: ['switch', 'light', 'cover', 'climate', 'fan', 'group']
+ },
+ initial_state: {
+ type: 'string',
+ domains: ['automation']
+ },
+ unit_of_measurement: { type: 'string' }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (hassAttributeUtil);
+
+/***/ }),
+
/***/ "./node_modules/@polymer/polymer/lib/utils/boot.js":
/*!*********************************************************!*\
!*** ./node_modules/@polymer/polymer/lib/utils/boot.js ***!
@@ -1451,7 +1526,13 @@ class StateCardWithSlider extends _cui_base_element_js__WEBPACK_IMPORTED_MODULE_
-
+
[[item]]
@@ -1722,6 +1803,7 @@ class StateCardWithoutSlider extends _cui_base_element_js__WEBPACK_IMPORTED_MODU
{
if (!Object.prototype.hasOwnProperty.call(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, attr)) {
@@ -2113,43 +2244,6 @@ window.customUI = window.customUI || {
}
},
- updateAttributes() {
- if (!window.hassAttributeUtil) {
- // App.js wasn't parsed yet.
- window.setTimeout(window.customUI.updateAttributes, 1000);
- return;
- }
-
- var customUiAttributes = {
- group: undefined,
- device: undefined,
- templates: undefined,
- state_card_mode: {
- type: 'array',
- options: {
- light: window.customUI.SUPPORTED_SLIDER_MODES.concat('badges'),
- cover: window.customUI.SUPPORTED_SLIDER_MODES.concat('badges'),
- '*': ['badges']
- }
- },
- state_card_custom_ui_secondary: { type: 'string' },
- badges_list: { type: 'json' },
- show_last_changed: { type: 'boolean' },
- hide_control: { type: 'boolean' },
- extra_data_template: { type: 'string' },
- extra_badge: { type: 'json' },
- stretch_slider: { type: 'boolean' },
- slider_theme: { type: 'json' },
- theme: { type: 'string' },
- confirm_controls: { type: 'boolean' },
- confirm_controls_show_lock: { type: 'boolean' },
- hide_in_default_view: { type: 'boolean' }
- };
- if (window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {
- Object.assign(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, customUiAttributes);
- }
- },
-
updateConfigPanel() {
if (!window.location.pathname.startsWith('/config')) return;
var haPanelConfig = window.customUI.getElementHierarchy(document, ['home-assistant', 'home-assistant-main', 'partial-panel-resolver', 'ha-panel-config']);
@@ -2322,6 +2416,46 @@ window.customUI = window.customUI || {
};
},
+ installHaAttributes() {
+ var haAttributes = customElements.get('ha-attributes');
+ if (!haAttributes || !haAttributes.prototype.computeFiltersArray || !window.hassAttributeUtil) return;
+ // Use named function to preserve 'this'.
+ haAttributes.prototype.computeFiltersArray = function customComputeFiltersArray(extraFilters) {
+ return Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES).concat(extraFilters ? extraFilters.split(',') : []);
+ };
+ },
+
+ installHaFormCustomize() {
+ if (!window.location.pathname.startsWith('/config')) return;
+ var haFormCustomize = customElements.get('ha-form-customize');
+ if (!haFormCustomize) {
+ // DOM not ready. Wait 100ms.
+ window.setTimeout(window.customUI.installHaFormCustomize, 100);
+ return;
+ }
+ if (window.customUI.haFormCustomizeInitDone) return;
+ window.customUI.haFormCustomizeInitDone = true;
+
+ if (!window.hassAttributeUtil) return;
+ if (haFormCustomize.prototype._computeSingleAttribute) {
+ // Use named function to preserve 'this'.
+ haFormCustomize.prototype._computeSingleAttribute = function customComputeSingleAttribute(key, value, secondary) {
+ var config = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key] || { type: window.hassAttributeUtil.UNKNOWN_TYPE };
+ return this._initOpenObject(key, config.type === 'json' ? JSON.stringify(value) : value, secondary, config);
+ };
+ }
+ if (haFormCustomize.prototype.getNewAttributesOptions) {
+ // Use named function to preserve 'this'.
+ haFormCustomize.prototype.getNewAttributesOptions = function customgetNewAttributesOptions(localAttributes, globalAttributes, existingAttributes, newAttributes) {
+ var knownKeys = Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES).filter(key => {
+ var conf = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key];
+ return conf && (!conf.domains || !this.entity || conf.domains.includes(Object(_home_assistant_polymer_src_common_entity_compute_state_domain_js__WEBPACK_IMPORTED_MODULE_1__["default"])(this.entity)));
+ }).filter(this.filterFromAttributes(localAttributes)).filter(this.filterFromAttributes(globalAttributes)).filter(this.filterFromAttributes(existingAttributes)).filter(this.filterFromAttributes(newAttributes));
+ return knownKeys.sort().concat('Other');
+ };
+ }
+ },
+
installClassHooks() {
if (window.customUI.classInitDone) return;
window.customUI.classInitDone = true;
@@ -2329,10 +2463,9 @@ window.customUI = window.customUI || {
window.customUI.installStatesHook();
window.customUI.installHaStateLabelBadge();
window.customUI.installStateBadge();
+ window.customUI.installHaAttributes();
window.customUI.installActionName('state-card-scene');
window.customUI.installActionName('state-card-script');
- // TODO: Fix, not working since HA 0.71
- window.customUI.updateAttributes();
},
init() {
@@ -2366,6 +2499,7 @@ window.customUI = window.customUI || {
runHooks() {
window.customUI.fixGroupTitles();
window.customUI.updateConfigPanel();
+ window.customUI.installHaFormCustomize();
},
getName() {
@@ -2407,9 +2541,9 @@ window.customUI.init();
"use strict";
__webpack_require__.r(__webpack_exports__);
-/* harmony default export */ __webpack_exports__["default"] = ('20180528');
+/* harmony default export */ __webpack_exports__["default"] = ('20180602');
/***/ })
/******/ });
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9jb25zdC5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9hcHBseV90aGVtZXNfb25fZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9keW5hbWljX2NvbnRlbnRfdXBkYXRlci5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jYW5fdG9nZ2xlX2RvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jYW5fdG9nZ2xlX3N0YXRlLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfZG9tYWluLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2dldF9ncm91cF9lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9nZXRfdmlld19lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9zdGF0ZV9jYXJkX3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2Jvb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzIiwid2VicGFjazovLy8uL3NyYy9lbGVtZW50cy9jdWktYmFzZS1lbGVtZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9lbGVtZW50cy9keW5hbWljLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL2R5bmFtaWMtd2l0aC1leHRyYS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvaGEtY29uZmlnLWN1c3RvbS11aS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvaGEtdGhlbWVkLXNsaWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvc3RhdGUtY2FyZC1jdXN0b20tdWkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL3N0YXRlLWNhcmQtd2l0aC1zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL3N0YXRlLWNhcmQtd2l0aG91dC1zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21peGlucy9ldmVudHMtbWl4aW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2hvb2tzLmpzIiwid2VicGFjazovLy8uL3NyYy91dGlscy92ZXJzaW9uLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfRE9NQUlOX0lDT04iLCJET01BSU5TX1dJVEhfQ0FSRCIsIkRPTUFJTlNfTU9SRV9JTkZPX05PX0hJU1RPUlkiLCJTVEFURVNfT0ZGIiwiVU5JVF9DIiwiVU5JVF9GIiwiREVGQVVMVF9WSUVXX0VOVElUWV9JRCIsImFwcGx5VGhlbWVzT25FbGVtZW50IiwiZWxlbWVudCIsInRoZW1lcyIsImxvY2FsVGhlbWUiLCJ1cGRhdGVNZXRhIiwiX3RoZW1lcyIsInRoZW1lTmFtZSIsImRlZmF1bHRfdGhlbWUiLCJzdHlsZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJ0aGVtZSIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwicHJlZml4ZWRLZXkiLCJ1cGRhdGVTdHlsZXMiLCJ3aW5kb3ciLCJTaGFkeUNTUyIsInN0eWxlU3VidHJlZSIsIm1ldGEiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJoYXNBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJ0aGVtZUNvbG9yIiwiZHluYW1pY0NvbnRlbnRVcGRhdGVyIiwicm9vdCIsIm5ld0VsZW1lbnRUYWciLCJhdHRyaWJ1dGVzIiwicm9vdEVsIiwiY3VzdG9tRWwiLCJsYXN0Q2hpbGQiLCJ0YWdOYW1lIiwicmVtb3ZlQ2hpbGQiLCJjcmVhdGVFbGVtZW50IiwidG9Mb3dlckNhc2UiLCJzZXRQcm9wZXJ0aWVzIiwicGFyZW50Tm9kZSIsImFwcGVuZENoaWxkIiwiY2FuVG9nZ2xlRG9tYWluIiwiaGFzcyIsImRvbWFpbiIsInNlcnZpY2VzIiwiY29uZmlnIiwiY2FuVG9nZ2xlU3RhdGUiLCJzdGF0ZU9iaiIsImNvbXB1dGVTdGF0ZURvbWFpbiIsInN0YXRlIiwic3VwcG9ydGVkX2ZlYXR1cmVzIiwiY29tcHV0ZURvbWFpbiIsImVudGl0eUlkIiwic3Vic3RyIiwiaW5kZXhPZiIsIl9kb21haW4iLCJlbnRpdHlfaWQiLCJnZXRHcm91cEVudGl0aWVzIiwiZW50aXRpZXMiLCJncm91cCIsInJlc3VsdCIsImVudGl0eSIsImdldFZpZXdFbnRpdGllcyIsInZpZXciLCJ2aWV3RW50aXRpZXMiLCJoaWRkZW4iLCJncm91cEVudGl0aWVzIiwiZ3JFbnRpdHlJZCIsImdyRW50aXR5Iiwic3RhdGVDYXJkVHlwZSIsImluY2x1ZGVzIiwiY29udHJvbCIsIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCJwcm9wIiwiTGl0ZXJhbFN0cmluZyIsImNvbnN0cnVjdG9yIiwic3RyaW5nIiwidmFsdWUiLCJ0b1N0cmluZyIsImxpdGVyYWxWYWx1ZSIsIkVycm9yIiwiaHRtbFZhbHVlIiwiSFRNTFRlbXBsYXRlRWxlbWVudCIsImlubmVySFRNTCIsImh0bWwiLCJzdHJpbmdzIiwidGVtcGxhdGUiLCJ2YWx1ZXMiLCJyZWR1Y2UiLCJhY2MiLCJ2IiwiaWR4IiwiaHRtbExpdGVyYWwiLCJDdWlCYXNlRWxlbWVudCIsIlBvbHltZXIiLCJFbGVtZW50IiwicHJvcGVydGllcyIsImluRGlhbG9nIiwidHlwZSIsIkJvb2xlYW4iLCJjb250cm9sRWxlbWVudCIsIlN0cmluZyIsImV4dHJhIiwiQXJyYXkiLCJjb21wdXRlZCIsImNvbXB1dGVFeHRyYSIsImV4dHJhcyIsImV4dHJhX2RhdGFfdGVtcGxhdGUiLCJpc0FycmF5IiwibWFwIiwiY3VzdG9tVUkiLCJjb21wdXRlVGVtcGxhdGUiLCJzdGF0ZXMiLCJ1bmRlZmluZWQiLCJmaWx0ZXIiLCJzaG93TGFzdENoYW5nZWQiLCJsZW5ndGgiLCJzaG93X2xhc3RfY2hhbmdlZCIsImhhc0V4dHJhIiwiRHluYW1pY0VsZW1lbnQiLCJlbGVtZW50TmFtZSIsIm9ic2VydmVycyIsIm9ic2VydmVyRnVuYyIsInRvVXBwZXJDYXNlIiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiLCJEeW5hbWljV2l0aEV4dHJhIiwiZ2V0IiwiZXh0cmFPYmoiLCJfYXR0YWNoZWQiLCJleHRyYU9ialZpc2libGUiLCJjb25uZWN0ZWRDYWxsYmFjayIsImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwiX2lzQXR0YWNoZWQiLCJhdHRhY2hlZCIsImV4dHJhX2JhZGdlIiwiZXh0cmFCYWRnZXMiLCJleHRyYUJhZGdlIiwibWF5YmVDaGFuZ2VPYmplY3QiLCJhdHRyaWJ1dGUiLCJ1bml0X29mX21lYXN1cmVtZW50IiwidW5pdCIsImJsYWNrbGlzdCIsImJsYWNrbGlzdF9zdGF0ZXMiLCJzb21lIiwiUmVnRXhwIiwidGVzdCIsIl9lbnRpdHlEaXNwbGF5IiwiY29tcHV0ZUV4dHJhVmlzaWJsZSIsImV4dHJhQ2xhc3MiLCJfc2hvd0NvbnRyb2wiLCJoaWRlX2NvbnRyb2wiLCJjb21wdXRlU3RhdGVEaXNwbGF5IiwiaGFMb2NhbGl6ZSIsImxvY2FsaXplIiwiaXNDb25maXJtQ29udHJvbHMiLCJjb25maXJtX2NvbnRyb2xzIiwiY29uZmlybV9jb250cm9sc19zaG93X2xvY2siLCJjbGlja0hhbmRsZXIiLCJlIiwic3R5bGUiLCJwb2ludGVyRXZlbnRzIiwibG9jayIsImljb24iLCJvcGFjaXR5Iiwic2V0VGltZW91dCIsInN0b3BQcm9wYWdhdGlvbiIsImFwcGx5VGhlbWVzIiwiZXh0cmFEb21DaGFuZ2VkIiwicXVlcnlTZWxlY3RvckFsbCIsImVsZW0iLCJIYUNvbmZpZ0N1c3RvbVVpIiwiRXZlbnRzTWl4aW4iLCJpc1dpZGUiLCJuYW1lIiwib2JzZXJ2ZXIiLCJyZWFkeSIsImdldE5hbWUiLCJuYW1lQ2hhbmdlZCIsInNldE5hbWUiLCJfYmFja0hhbmRsZXIiLCJoaXN0b3J5IiwiYmFjayIsImZpcmUiLCJIYVRoZW1lZFNsaWRlciIsImRpc2FibGVPZmZXaGVuTWluIiwiX2NvbXB1dGVBdHRyaWJ1dGUiLCJjb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwiZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwibWluIiwiTnVtYmVyIiwibWF4IiwicGluIiwiaXNPbiIsIm5vdGlmeSIsIl90aGVtZWRNaW4iLCJfZW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwiYXR0ciIsImRlZiIsImNvbXB1dGVDbGFzcyIsInRoZW1lZE1pbiIsInZhbHVlQ2hhbmdlZCIsImV2IiwidGFyZ2V0IiwiU0hPV19MQVNUX0NIQU5HRURfQkxBQ0tMSVNURURfQ0FSRFMiLCJET01BSU5fVE9fU0xJREVSX1NVUFBPUlQiLCJsaWdodCIsImNvdmVyIiwiY2xpbWF0ZSIsIlRZUEVfVE9fQ09OVFJPTCIsInRvZ2dsZSIsImRpc3BsYXkiLCJTdGF0ZUNhcmRDdXN0b21VaSIsImNvbnRhaW5lciIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiX2NvbnRhaW5lciIsInNldFByb3BlcnR5IiwiaW5wdXRDaGFuZ2VkIiwibWFyZ2luIiwicGFkZGluZyIsImJhZGdlTW9kZSIsImlkIiwiY29uc29sZSIsIndhcm4iLCJiYWRnZXNfbGlzdCIsInB1c2giLCJwYXJhbXMiLCJ3aWR0aCIsImZvbnRTaXplIiwiY2xlYW5CYWRnZVN0eWxlIiwibW9kaWZpZWRPYmoiLCJ0aGVtZVRhcmdldCIsIm1heWJlSGlkZUVudGl0eSIsInNsaWRlckVsaWdpYmxlXyIsIm9iaiIsInN0YXRlX2NhcmRfbW9kZSIsInJlZ3VsYXJNb2RlXyIsIm9yaWdpbmFsU3RhdGVDYXJkVHlwZSIsImN1c3RvbVN0YXRlQ2FyZFR5cGUiLCJzZWNvbmRhcnlTdGF0ZUNhcmRUeXBlIiwic3RhdGVfY2FyZF9jdXN0b21fdWlfc2Vjb25kYXJ5Iiwic2VydmljZU1pbiIsInNlcnZpY2VNYXgiLCJ2YWx1ZU5hbWUiLCJzZXRWYWx1ZU5hbWUiLCJuYW1lT24iLCJtaW5fdGVtcCIsIm1heF90ZW1wIiwiY29udHJvbF9lbGVtZW50IiwiU3RhdGVDYXJkV2l0aFNsaWRlciIsInNsaWRlclZhbHVlIiwibW9kZSIsInN0cmV0Y2hTbGlkZXIiLCJicmVha1NsaWRlciIsImhpZGVTbGlkZXIiLCJsaW5lVG9vTG9uZyIsIm1pbkxpbmVCcmVhayIsIm1heExpbmVCcmVhayIsInNob3dTbGlkZXIiLCJfb25Jcm9uUmVzaXplIiwiYmluZCIsIl9pc0Nvbm5lY3RlZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfd2FpdEZvckxheW91dCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJfc2V0TW9kZSIsIl9mcmFtZUlkIiwicmVhZHlUb0NvbXB1dGUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJwcmV2QnJlYWtTbGlkZXIiLCJwcmV2SGlkZVNsaWRlciIsIiQiLCJjb250YWluZXJXaWR0aCIsImNsaWVudFdpZHRoIiwiY29udGFpbmVySGVpZ2h0IiwiY2xpZW50SGVpZ2h0Iiwic3RhdGVIZWlnaHQiLCJfY29tcHV0ZVdyYXBDbGFzcyIsIl9zaG93U2xpZGVyIiwic2xpZGVyQ2hhbmdlZCIsInBhcnNlSW50IiwicGFyYW0iLCJpc05hTiIsInBhdGgiLCJjb21wb3NlZFBhdGgiLCJjYWxsU2VydmljZSIsInN0YXRlT2JqQ2hhbmdlZCIsInN0cmV0Y2hfc2xpZGVyIiwiU3RhdGVDYXJkV2l0aG91dFNsaWRlciIsInN1cGVyQ2xhc3MiLCJkZXRhaWwiLCJvcHRpb25zIiwiZXZlbnQiLCJFdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY29tcG9zZWQiLCJub2RlIiwiZGlzcGF0Y2hFdmVudCIsIlNVUFBPUlRFRF9TTElERVJfTU9ERVMiLCJkb21Ib3N0IiwiZ2V0Um9vdE5vZGUiLCJEb2N1bWVudEZyYWdtZW50IiwiaG9zdCIsImxpZ2h0T3JTaGFkb3ciLCJzZWxlY3RvciIsInNoYWRvd1Jvb3QiLCJnZXRFbGVtZW50SGllcmFyY2h5IiwiaGllcmFyY2h5Iiwic2hpZnQiLCJnZXRDb250ZXh0IiwiX2NvbnRleHQiLCJncm91cEVudGl0eSIsInJldmVyc2UiLCJmaW5kTWF0Y2giLCJmaW5kIiwib3B0aW9uIiwibWF0Y2giLCJtYXliZUNoYW5nZU9iamVjdEJ5RGV2aWNlIiwiZGV2aWNlIiwiYXBwbHlBdHRyaWJ1dGVzIiwibWF5YmVDaGFuZ2VPYmplY3RCeUdyb3VwIiwiY29udGV4dCIsImMiLCJfc2V0S2VlcCIsIl9jdWlfa2VlcCIsIm1heWJlQXBwbHlUZW1wbGF0ZUF0dHJpYnV0ZXMiLCJ0ZW1wbGF0ZXMiLCJuZXdBdHRyaWJ1dGVzIiwiaGFzR2xvYmFsIiwiaGFzQ2hhbmdlcyIsInVudGVtcGxhdGVkX2F0dHJpYnV0ZXMiLCJ1bnRlbXBsYXRlZF9zdGF0ZSIsIl9zdGF0ZURpc3BsYXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJ1bnRlbXBsYXRlZF9zdGF0ZURpc3BsYXkiLCJtYXliZUFwcGx5VGVtcGxhdGVzIiwibmV3UmVzdWx0IiwiY2hlY2tBdHRyaWJ1dGVzIiwibGFzdF9jaGFuZ2VkIiwiYWxsb3dIaWRkZW4iLCJmaXhHcm91cFRpdGxlcyIsImhvbWVBc3Npc3RhbnRNYWluIiwiaGFDYXJkcyIsIm1haW4iLCJjYXJkcyIsImNhcmQiLCJmcmllbmRseV9uYW1lIiwibmFtZUVsZW0iLCJ0ZXh0Q29udGVudCIsImNvbnRyb2xDb2x1bW5zIiwiY29sdW1ucyIsInBhcnRpYWxDYXJkcyIsIm1xbHMiLCJtcWwiLCJyZW1vdmVMaXN0ZW5lciIsImhhbmRsZVdpbmRvd0NoYW5nZSIsIm1hdGNoTWVkaWEiLCJhZGRMaXN0ZW5lciIsInVzZUN1c3RvbWl6ZXIiLCJjdXN0b21pemVyIiwiaGlkZV9hdHRyaWJ1dGVzIiwiaGFzc0F0dHJpYnV0ZVV0aWwiLCJMT0dJQ19TVEFURV9BVFRSSUJVVEVTIiwidXBkYXRlQXR0cmlidXRlcyIsImN1c3RvbVVpQXR0cmlidXRlcyIsImNvbmNhdCIsInNsaWRlcl90aGVtZSIsImhpZGVfaW5fZGVmYXVsdF92aWV3IiwidXBkYXRlQ29uZmlnUGFuZWwiLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwic3RhcnRzV2l0aCIsImhhUGFuZWxDb25maWciLCJoYUNvbmZpZ05hdmlnYXRpb24iLCJjdWlQYXRjaCIsIl9vcmlnaW5hbENvbXB1dGVMb2FkZWQiLCJfY29tcHV0ZUxvYWRlZCIsIl9vcmlnaW5hbENvbXB1dGVDYXB0aW9uIiwiX2NvbXB1dGVDYXB0aW9uIiwiX29yaWdpbmFsQ29tcHV0ZURlc2NyaXB0aW9uIiwiX2NvbXB1dGVEZXNjcmlwdGlvbiIsInBhZ2UiLCJwYWdlcyIsImNvbmYiLCJjYXB0aW9uIiwiZGVzY3JpcHRpb24iLCJsb2FkZWQiLCJnZXRIYUNvbmZpZ0N1c3RvbVVpIiwiaGFDb25maWdDdXN0b21VaSIsImlyb25QYWdlcyIsImxhc3RFbGVtZW50Q2hpbGQiLCJzZWxlY3QiLCJ2aXNpYmxlIiwiaW5zdGFsbFN0YXRlc0hvb2siLCJob21lQXNzaXN0YW50IiwiX3VwZGF0ZUhhc3MiLCJvcmlnaW5hbFVwZGF0ZSIsInVwZGF0ZSIsIm5ld0VudGl0eSIsIl90aGVtZVdhaXRlcnMiLCJ3YWl0ZXIiLCJzdGF0ZUNoYW5nZWQiLCJpbnN0YWxsUGFydGlhbENhcmRzIiwiX2RlZmF1bHRWaWV3RmlsdGVyIiwiZXhjbHVkZXMiLCJleGNsdWRlRW50aXR5SWQiLCJpbnN0YWxsQWN0aW9uTmFtZSIsImtsYXNzIiwiZGVmaW5lUHJvcGVydHkiLCJjdXN0b21Mb2NhbGl6ZSIsImFjdGlvbl9uYW1lIiwiX19kYXRhIiwic2V0IiwiaW5zdGFsbEhhU3RhdGVMYWJlbEJhZGdlIiwiaGFTdGF0ZUxhYmVsQmFkZ2UiLCJzdGFydEludGVydmFsIiwiaW5zdGFsbFN0YXRlQmFkZ2UiLCJzdGF0ZUJhZGdlIiwidXBkYXRlSWNvbkFwcGVhcmFuY2UiLCJvcmlnaW5hbFVwZGF0ZUljb25BcHBlYXJhbmNlIiwiY3VzdG9tVXBkYXRlSWNvbkFwcGVhcmFuY2UiLCJpY29uX2NvbG9yIiwiZW50aXR5X3BpY3R1cmUiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJjb2xvciIsImluc3RhbGxDbGFzc0hvb2tzIiwiY2xhc3NJbml0RG9uZSIsImluaXQiLCJpbml0RG9uZSIsInJ1bkhvb2tzIiwibG9nIiwiQ1VTVE9NX1VJX0xJU1QiLCJ2ZXJzaW9uIiwidXJsIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInNldEl0ZW0iLCJmdW5jdGlvbkJvZHkiLCJmdW5jIiwiRnVuY3Rpb24iLCJTeW50YXhFcnJvciIsIlJlZmVyZW5jZUVycm9yIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseURBQWlELGNBQWM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FB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LFNBQTlELEVBQXlFMUYsS0FBekUsRUFBZ0Y7QUFDOUUsUUFBTXdZLGVBQWdCblcsU0FBU2hDLE9BQVQsQ0FBaUIsUUFBakIsS0FBOEIsQ0FBL0IsR0FBb0NnQyxRQUFwQyxHQUFnRCxZQUFXQSxRQUFTLEtBQXpGO0FBQ0EsUUFBSTtBQUNGO0FBQ0EsVUFBTW9XLE9BQU8sSUFBSUMsUUFBSixDQUNYLE1BRFcsRUFDSCxVQURHLEVBQ1MsUUFEVCxFQUNtQixZQURuQixFQUNpQyxXQURqQyxFQUM4QyxPQUQ5QyxFQUN1REYsWUFEdkQsQ0FBYjtBQUVBO0FBQ0EsYUFBT0MsS0FBS2haLElBQUwsRUFBV2dCLFFBQVgsRUFBcUJHLE1BQXJCLEVBQTZCL0IsVUFBN0IsRUFBeUM2RyxTQUF6QyxFQUFvRDFGLEtBQXBELENBQVA7QUFDRCxLQU5ELENBTUUsT0FBTzhHLENBQVAsRUFBVTtBQUNWO0FBQ0EsVUFBS0EsYUFBYTZSLFdBQWQsSUFBOEI3UixhQUFhOFIsY0FBL0MsRUFBK0Q7QUFDN0Q5TixnQkFBUUMsSUFBUixDQUFjLEdBQUVqRSxFQUFFZSxJQUFLLEtBQUlmLEVBQUUrUixPQUFRLGdCQUFlTCxZQUFhLEVBQWpFO0FBQ0EsZUFBTyxJQUFQO0FBQ0Q7QUFDRDtBQUNBLFlBQU0xUixDQUFOO0FBQ0Q7QUFDRjtBQTlqQmtDLENBQXJDO0FBZ2tCQTlJLE9BQU82RixRQUFQLENBQWdCaVUsSUFBaEIsRzs7Ozs7Ozs7Ozs7OztBQ3ZrQkEsK0RBQWUsVUFBZixFIiwiZmlsZSI6InNjcmlwdHMtZGJnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2VudHJ5cG9pbnRzL3NjcmlwdHMuanNcIik7XG4iLCIvKiogQ29uc3RhbnRzIHRvIGJlIHVzZWQgaW4gdGhlIGZyb250ZW5kLiAqL1xuXG4vLyBDb25zdGFudHMgc2hvdWxkIGJlIGFscGhhYmV0aWNhbGx5IHNvcnRlZCBieSBuYW1lLlxuLy8gQXJyYXlzIHdpdGggdmFsdWVzIHNob3VsZCBiZSBhbHBoYWJldGljYWxseSBzb3J0ZWQgaWYgb3JkZXIgZG9lc24ndCBtYXR0ZXIuXG4vLyBFYWNoIGNvbnN0YW50IHNob3VsZCBoYXZlIGEgZGVzY3JpcHRpb24gd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGZvci5cblxuLyoqIEljb24gdG8gdXNlIHdoZW4gbm8gaWNvbiBzcGVjaWZpZWQgZm9yIGRvbWFpbi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RPTUFJTl9JQ09OID0gJ21kaTpib29rbWFyayc7XG5cbi8qKiBEb21haW5zIHRoYXQgaGF2ZSBhIHN0YXRlIGNhcmQuICovXG5leHBvcnQgY29uc3QgRE9NQUlOU19XSVRIX0NBUkQgPSBbXG4gICdjbGltYXRlJyxcbiAgJ2NvdmVyJyxcbiAgJ2NvbmZpZ3VyYXRvcicsXG4gICdpbnB1dF9zZWxlY3QnLFxuICAnaW5wdXRfbnVtYmVyJyxcbiAgJ2lucHV0X3RleHQnLFxuICAnbWVkaWFfcGxheWVyJyxcbiAgJ3NjZW5lJyxcbiAgJ3NjcmlwdCcsXG4gICd0aW1lcicsXG4gICd3ZWJsaW5rJyxcbl07XG5cbi8qKiBEb21haW5zIHRoYXQgc2hvdWxkIGhhdmUgdGhlIGhpc3RvcnkgaGlkZGVuIGluIHRoZSBtb3JlIGluZm8gZGlhbG9nLiAqL1xuZXhwb3J0IGNvbnN0IERPTUFJTlNfTU9SRV9JTkZPX05PX0hJU1RPUlkgPSBbXG4gICdjYW1lcmEnLFxuICAnY29uZmlndXJhdG9yJyxcbiAgJ2hpc3RvcnlfZ3JhcGgnLFxuICAnc2NlbmUnLFxuXTtcblxuLyoqIFN0YXRlcyB0aGF0IHdlIGNvbnNpZGVyIFwib2ZmXCIuICovXG5leHBvcnQgY29uc3QgU1RBVEVTX09GRiA9IFtcbiAgJ2Nsb3NlZCcsXG4gICdvZmYnLFxuICAndW5sb2NrZWQnLFxuXTtcblxuLyoqIFRlbXBlcmF0dXJlIHVuaXRzLiAqL1xuZXhwb3J0IGNvbnN0IFVOSVRfQyA9ICfCsEMnO1xuZXhwb3J0IGNvbnN0IFVOSVRfRiA9ICfCsEYnO1xuXG4vKiogRW50aXR5IElEIG9mIHRoZSBkZWZhdWx0IHZpZXcuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9WSUVXX0VOVElUWV9JRCA9ICdncm91cC5kZWZhdWx0X3ZpZXcnO1xuIiwiLyoqXG4gKiBBcHBseSBhIHRoZW1lIHRvIGFuIGVsZW1lbnQgYnkgc2V0dGluZyB0aGUgQ1NTIHZhcmlhYmxlcyBvbiBpdC5cbiAqXG4gKiBlbGVtZW50OiBFbGVtZW50IHRvIGFwcGx5IHRoZW1lIG9uLlxuICogdGhlbWVzOiBIQVNTIFRoZW1lIGluZm9ybWF0aW9uXG4gKiBsb2NhbFRoZW1lOiBzZWxlY3RlZCB0aGVtZS5cbiAqIHVwZGF0ZU1ldGE6IGJvb2xlYW4gaWYgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgdGhlbWUtY29sb3IgbWV0YSBlbGVtZW50LlxuKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFwcGx5VGhlbWVzT25FbGVtZW50KGVsZW1lbnQsIHRoZW1lcywgbG9jYWxUaGVtZSwgdXBkYXRlTWV0YSA9IGZhbHNlKSB7XG4gIGlmICghZWxlbWVudC5fdGhlbWVzKSB7XG4gICAgZWxlbWVudC5fdGhlbWVzID0ge307XG4gIH1cbiAgbGV0IHRoZW1lTmFtZSA9IHRoZW1lcy5kZWZhdWx0X3RoZW1lO1xuICBpZiAobG9jYWxUaGVtZSA9PT0gJ2RlZmF1bHQnIHx8IChsb2NhbFRoZW1lICYmIHRoZW1lcy50aGVtZXNbbG9jYWxUaGVtZV0pKSB7XG4gICAgdGhlbWVOYW1lID0gbG9jYWxUaGVtZTtcbiAgfVxuICBjb25zdCBzdHlsZXMgPSBPYmplY3QuYXNzaWduKHt9LCBlbGVtZW50Ll90aGVtZXMpO1xuICBpZiAodGhlbWVOYW1lICE9PSAnZGVmYXVsdCcpIHtcbiAgICB2YXIgdGhlbWUgPSB0aGVtZXMudGhlbWVzW3RoZW1lTmFtZV07XG4gICAgT2JqZWN0LmtleXModGhlbWUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdmFyIHByZWZpeGVkS2V5ID0gJy0tJyArIGtleTtcbiAgICAgIGVsZW1lbnQuX3RoZW1lc1twcmVmaXhlZEtleV0gPSAnJztcbiAgICAgIHN0eWxlc1twcmVmaXhlZEtleV0gPSB0aGVtZVtrZXldO1xuICAgIH0pO1xuICB9XG4gIGlmIChlbGVtZW50LnVwZGF0ZVN0eWxlcykge1xuICAgIGVsZW1lbnQudXBkYXRlU3R5bGVzKHN0eWxlcyk7XG4gIH0gZWxzZSBpZiAod2luZG93LlNoYWR5Q1NTKSB7XG4gICAgLy8gaW1wbGVtZW50IHVwZGF0ZVN0eWxlcygpIG1ldGhvZCBvZiBQb2xlbWVyIGVsZW1lbnRzXG4gICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oZWxlbWVudCksIHN0eWxlcyk7XG4gIH1cblxuICBpZiAoIXVwZGF0ZU1ldGEpIHJldHVybjtcblxuICBjb25zdCBtZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPXRoZW1lLWNvbG9yXScpO1xuICBpZiAobWV0YSkge1xuICAgIGlmICghbWV0YS5oYXNBdHRyaWJ1dGUoJ2RlZmF1bHQtY29udGVudCcpKSB7XG4gICAgICBtZXRhLnNldEF0dHJpYnV0ZSgnZGVmYXVsdC1jb250ZW50JywgbWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSk7XG4gICAgfVxuICAgIGNvbnN0IHRoZW1lQ29sb3IgPSBzdHlsZXNbJy0tcHJpbWFyeS1jb2xvciddIHx8IG1ldGEuZ2V0QXR0cmlidXRlKCdkZWZhdWx0LWNvbnRlbnQnKTtcbiAgICBtZXRhLnNldEF0dHJpYnV0ZSgnY29udGVudCcsIHRoZW1lQ29sb3IpO1xuICB9XG59XG4iLCIvKipcbiAqIFVwZGF0ZSByb290J3MgY2hpbGQgZWxlbWVudCB0byBiZSBuZXdFbGVtZW50VGFnIHJlcGxhY2luZyBhbm90aGVyIGV4aXN0aW5nIGNoaWxkIGlmIGFueS5cbiAqIENvcHkgYXR0cmlidXRlcyBpbnRvIHRoZSBjaGlsZCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkeW5hbWljQ29udGVudFVwZGF0ZXIocm9vdCwgbmV3RWxlbWVudFRhZywgYXR0cmlidXRlcykge1xuICBjb25zdCByb290RWwgPSByb290O1xuICBsZXQgY3VzdG9tRWw7XG5cbiAgaWYgKHJvb3RFbC5sYXN0Q2hpbGQgJiYgcm9vdEVsLmxhc3RDaGlsZC50YWdOYW1lID09PSBuZXdFbGVtZW50VGFnKSB7XG4gICAgY3VzdG9tRWwgPSByb290RWwubGFzdENoaWxkO1xuICB9IGVsc2Uge1xuICAgIGlmIChyb290RWwubGFzdENoaWxkKSB7XG4gICAgICByb290RWwucmVtb3ZlQ2hpbGQocm9vdEVsLmxhc3RDaGlsZCk7XG4gICAgfVxuICAgIC8vIENyZWF0aW5nIGFuIGVsZW1lbnQgd2l0aCB1cHBlciBjYXNlIHdvcmtzIGZpbmUgaW4gQ2hyb21lLCBidXQgaW4gRkYgaXQgZG9lc24ndCBpbW1lZGlhdGVseVxuICAgIC8vIGJlY29tZSBhIGRlZmluZWQgQ3VzdG9tIEVsZW1lbnQuIFBvbHltZXIgZG9lcyB0aGF0IGluIHNvbWUgbGF0ZXIgcGFzcy5cbiAgICBjdXN0b21FbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3RWxlbWVudFRhZy50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIGlmIChjdXN0b21FbC5zZXRQcm9wZXJ0aWVzKSB7XG4gICAgY3VzdG9tRWwuc2V0UHJvcGVydGllcyhhdHRyaWJ1dGVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBjdXN0b20gZWxlbWVudCBkZWZpbml0aW9uIHdhc24ndCBsb2FkZWQgeWV0IC0gc2V0UHJvcGVydGllcyB3b3VsZCBiZVxuICAgIC8vIG1pc3NpbmcsIGJ1dCBubyBoYXJtIGluIHNldHRpbmcgYXR0cmlidXRlcyBvbmUtYnktb25lIHRoZW4uXG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjdXN0b21FbFtrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGN1c3RvbUVsLnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByb290RWwuYXBwZW5kQ2hpbGQoY3VzdG9tRWwpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYW5Ub2dnbGVEb21haW4oaGFzcywgZG9tYWluKSB7XG4gIGNvbnN0IHNlcnZpY2VzID0gaGFzcy5jb25maWcuc2VydmljZXNbZG9tYWluXTtcbiAgaWYgKCFzZXJ2aWNlcykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoZG9tYWluID09PSAnbG9jaycpIHtcbiAgICByZXR1cm4gJ2xvY2snIGluIHNlcnZpY2VzO1xuICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gJ2NvdmVyJykge1xuICAgIHJldHVybiAnb3Blbl9jb3ZlcicgaW4gc2VydmljZXM7XG4gIH1cbiAgcmV0dXJuICd0dXJuX29uJyBpbiBzZXJ2aWNlcztcbn1cbiIsImltcG9ydCBjYW5Ub2dnbGVEb21haW4gZnJvbSAnLi9jYW5fdG9nZ2xlX2RvbWFpbi5qcyc7XG5pbXBvcnQgY29tcHV0ZVN0YXRlRG9tYWluIGZyb20gJy4vY29tcHV0ZV9zdGF0ZV9kb21haW4uanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYW5Ub2dnbGVTdGF0ZShoYXNzLCBzdGF0ZU9iaikge1xuICBjb25zdCBkb21haW4gPSBjb21wdXRlU3RhdGVEb21haW4oc3RhdGVPYmopO1xuICBpZiAoZG9tYWluID09PSAnZ3JvdXAnKSB7XG4gICAgcmV0dXJuIHN0YXRlT2JqLnN0YXRlID09PSAnb24nIHx8IHN0YXRlT2JqLnN0YXRlID09PSAnb2ZmJztcbiAgfVxuICBpZiAoZG9tYWluID09PSAnY2xpbWF0ZScpIHtcbiAgICByZXR1cm4gISEoKHN0YXRlT2JqLmF0dHJpYnV0ZXMgfHwge30pLnN1cHBvcnRlZF9mZWF0dXJlcyAmIDQwOTYpO1xuICB9XG5cbiAgcmV0dXJuIGNhblRvZ2dsZURvbWFpbihoYXNzLCBkb21haW4pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZURvbWFpbihlbnRpdHlJZCkge1xuICByZXR1cm4gZW50aXR5SWQuc3Vic3RyKDAsIGVudGl0eUlkLmluZGV4T2YoJy4nKSk7XG59XG4iLCJpbXBvcnQgY29tcHV0ZURvbWFpbiBmcm9tICcuL2NvbXB1dGVfZG9tYWluLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZVN0YXRlRG9tYWluKHN0YXRlT2JqKSB7XG4gIGlmICghc3RhdGVPYmouX2RvbWFpbikge1xuICAgIHN0YXRlT2JqLl9kb21haW4gPSBjb21wdXRlRG9tYWluKHN0YXRlT2JqLmVudGl0eV9pZCk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVPYmouX2RvbWFpbjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEdyb3VwRW50aXRpZXMoZW50aXRpZXMsIGdyb3VwKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gIGdyb3VwLmF0dHJpYnV0ZXMuZW50aXR5X2lkLmZvckVhY2goKGVudGl0eUlkKSA9PiB7XG4gICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbZW50aXR5SWRdO1xuXG4gICAgaWYgKGVudGl0eSkge1xuICAgICAgcmVzdWx0W2VudGl0eS5lbnRpdHlfaWRdID0gZW50aXR5O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCBjb21wdXRlRG9tYWluIGZyb20gJy4vY29tcHV0ZV9kb21haW4uanMnO1xuaW1wb3J0IGdldEdyb3VwRW50aXRpZXMgZnJvbSAnLi9nZXRfZ3JvdXBfZW50aXRpZXMuanMnO1xuXG4vLyBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGVudGl0aWVzIHRoYXQgdGhlIHZpZXcgd2lsbCBzaG93XG4vLyBpbmNsdWRpbmcgZW1iZWRkZWQgZ3JvdXBzLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld0VudGl0aWVzKGVudGl0aWVzLCB2aWV3KSB7XG4gIGNvbnN0IHZpZXdFbnRpdGllcyA9IHt9O1xuXG4gIHZpZXcuYXR0cmlidXRlcy5lbnRpdHlfaWQuZm9yRWFjaCgoZW50aXR5SWQpID0+IHtcbiAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllc1tlbnRpdHlJZF07XG5cbiAgICBpZiAoZW50aXR5ICYmICFlbnRpdHkuYXR0cmlidXRlcy5oaWRkZW4pIHtcbiAgICAgIHZpZXdFbnRpdGllc1tlbnRpdHkuZW50aXR5X2lkXSA9IGVudGl0eTtcblxuICAgICAgaWYgKGNvbXB1dGVEb21haW4oZW50aXR5LmVudGl0eV9pZCkgPT09ICdncm91cCcpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBFbnRpdGllcyA9IGdldEdyb3VwRW50aXRpZXMoZW50aXRpZXMsIGVudGl0eSk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXBFbnRpdGllcykuZm9yRWFjaCgoZ3JFbnRpdHlJZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdyRW50aXR5ID0gZ3JvdXBFbnRpdGllc1tnckVudGl0eUlkXTtcblxuICAgICAgICAgIGlmICghZ3JFbnRpdHkuYXR0cmlidXRlcy5oaWRkZW4pIHtcbiAgICAgICAgICAgIHZpZXdFbnRpdGllc1tnckVudGl0eUlkXSA9IGdyRW50aXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdmlld0VudGl0aWVzO1xufVxuIiwiaW1wb3J0IGNhblRvZ2dsZVN0YXRlIGZyb20gJy4vY2FuX3RvZ2dsZV9zdGF0ZS5qcyc7XG5pbXBvcnQgY29tcHV0ZVN0YXRlRG9tYWluIGZyb20gJy4vY29tcHV0ZV9zdGF0ZV9kb21haW4uanMnO1xuaW1wb3J0IHsgRE9NQUlOU19XSVRIX0NBUkQgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXRlQ2FyZFR5cGUoaGFzcywgc3RhdGVPYmopIHtcbiAgaWYgKHN0YXRlT2JqLnN0YXRlID09PSAndW5hdmFpbGFibGUnKSB7XG4gICAgcmV0dXJuICdkaXNwbGF5JztcbiAgfVxuXG4gIGNvbnN0IGRvbWFpbiA9IGNvbXB1dGVTdGF0ZURvbWFpbihzdGF0ZU9iaik7XG5cbiAgaWYgKERPTUFJTlNfV0lUSF9DQVJELmluY2x1ZGVzKGRvbWFpbikpIHtcbiAgICByZXR1cm4gZG9tYWluO1xuICB9IGVsc2UgaWYgKGNhblRvZ2dsZVN0YXRlKGhhc3MsIHN0YXRlT2JqKSAmJlxuICAgICAgICAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXMuY29udHJvbCAhPT0gJ2hpZGRlbicpIHtcbiAgICByZXR1cm4gJ3RvZ2dsZSc7XG4gIH1cbiAgcmV0dXJuICdkaXNwbGF5Jztcbn1cbiIsIi8qKlxuQGxpY2Vuc2VcbkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG5Db2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG5cbndpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCkgeyByZXR1cm4gcHJvcDsgfTtcbiIsIi8qKlxuQGxpY2Vuc2VcbkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG5Db2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG5pbXBvcnQgJy4vYm9vdC5qcyc7XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXJcbiAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGVcbiAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKi9cbmNsYXNzIExpdGVyYWxTdHJpbmcge1xuICBjb25zdHJ1Y3RvcihzdHJpbmcpIHtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTFxuICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamBcbiAqL1xuZnVuY3Rpb24gbGl0ZXJhbFZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpdGVyYWxTdHJpbmcpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHshTGl0ZXJhbFN0cmluZ30gKi8odmFsdWUpLnZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG5vbi1saXRlcmFsIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyJ3MgaHRtbExpdGVyYWwgZnVuY3Rpb246ICR7dmFsdWV9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYFxuICovXG5mdW5jdGlvbiBodG1sVmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgIHJldHVybiAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50IH0gKi8odmFsdWUpLmlubmVySFRNTDtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpdGVyYWxTdHJpbmcpIHtcbiAgICByZXR1cm4gbGl0ZXJhbFZhbHVlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIncyBodG1sIGZ1bmN0aW9uOiAke3ZhbHVlfWApO1xuICB9XG59XG5cbi8qKlxuICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGVcbiAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LlxuICpcbiAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluXG4gKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3NcbiAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXJcbiAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBodG1sTGl0ZXJhbGBcbiAqIHdoaWNoIGVuc3VyZXMgb25seSBsaXRlcmFsIHZhbHVlcyBmcm9tIEpTIHNvdXJjZSBldmVyIHJlYWNoIHRoZSBIVE1MLCB0b1xuICogZ3VhcmQgYWdhaW5zdCBYU1Mgcmlza3MuXG4gKlxuICogQWxsIG90aGVyIHZhbHVlcyBhcmUgZGlzYWxsb3dlZCBpbiBleHByZXNzaW9ucyB0byBoZWxwIHByZXZlbnQgWFNTXG4gKiBhdHRhY2tzOyBob3dldmVyLCBgaHRtbExpdGVyYWxgIGNhbiBiZSB1c2VkIHRvIGNvbXBvc2Ugc3RhdGljXG4gKiBzdHJpbmcgdmFsdWVzIGludG8gdGVtcGxhdGVzLiBUaGlzIGlzIHVzZWZ1bCB0byBjb21wb3NlIHN0cmluZ3MgaW50b1xuICogcGxhY2VzIHRoYXQgZG8gbm90IGFjY2VwdCBodG1sLCBsaWtlIHRoZSBjc3MgdGV4dCBvZiBhIGBzdHlsZWBcbiAqIGVsZW1lbnQuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAqICAgICAgIHJldHVybiBodG1sYFxuICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6XCIuLi5cIiB9PC9zdHlsZT5cbiAqICAgICAgICAgPGRpdiBjbGFzcz1cInNoYWRvd2VkXCI+JHt0aGlzLnBhcnRpYWxUZW1wbGF0ZX08L2Rpdj5cbiAqICAgICAgICAgJHtzdXBlci50ZW1wbGF0ZX1cbiAqICAgICAgIGA7XG4gKiAgICAgfVxuICogICAgIHN0YXRpYyBnZXQgcGFydGlhbFRlbXBsYXRlKCkgeyByZXR1cm4gaHRtbGA8c3Bhbj5QYXJ0aWFsITwvc3Bhbj5gOyB9XG4gKlxuICogQHBhcmFtIHshSVRlbXBsYXRlQXJyYXl9IHN0cmluZ3MgQ29uc3RhbnQgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB7Li4uKn0gdmFsdWVzIFZhcmlhYmxlIHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJuIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gQ29uc3RydWN0ZWQgSFRNTFRlbXBsYXRlRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7XG4gIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7XG4gIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PlxuICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7XG4gIHJldHVybiB0ZW1wbGF0ZTtcbn07XG5cbi8qKlxuICogQW4gaHRtbCBsaXRlcmFsIHRhZyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYGh0bWxgIHRvIGNvbXBvc2UuXG4gKiBhIGxpdGVyYWwgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gKiAgICAgICByZXR1cm4gaHRtbGBcbiAqICAgICAgICAgPHN0eWxlPlxuICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cbiAqICAgICAgICAgICAke3RoaXMuc3R5bGVUZW1wbGF0ZSgpfVxuICogICAgICAgICA8L3N0eWxlPlxuICogICAgICAgICA8ZGl2IGNsYXNzPVwic2hhZG93ZWRcIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PlxuICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfVxuICogICAgICAgYDtcbiAqICAgICB9XG4gKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkge1xuICogICAgICAgIHJldHVybiBodG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDtcbiAqICAgICB9XG4gKlxuICogQHBhcmFtIHshSVRlbXBsYXRlQXJyYXl9IHN0cmluZ3MgQ29uc3RhbnQgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB7Li4uKn0gdmFsdWVzIFZhcmlhYmxlIHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJuIHshTGl0ZXJhbFN0cmluZ30gQ29uc3RydWN0ZWQgbGl0ZXJhbCBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7XG4gIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT5cbiAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTtcbn07XG4iLCJpbXBvcnQgJy4uL3V0aWxzL2hvb2tzLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBDdWlCYXNlRWxlbWVudCBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzczogT2JqZWN0LFxuICAgICAgaW5EaWFsb2c6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHN0YXRlT2JqOiBPYmplY3QsXG4gICAgICBjb250cm9sRWxlbWVudDogU3RyaW5nLFxuICAgICAgZXh0cmE6IHtcbiAgICAgICAgdHlwZTogQXJyYXksXG4gICAgICAgIGNvbXB1dGVkOiAnY29tcHV0ZUV4dHJhKGhhc3MsIHN0YXRlT2JqKScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjb21wdXRlRXh0cmEoaGFzcywgc3RhdGVPYmopIHtcbiAgICBsZXQgZXh0cmFzID0gc3RhdGVPYmouYXR0cmlidXRlcy5leHRyYV9kYXRhX3RlbXBsYXRlO1xuICAgIGlmIChleHRyYXMpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShleHRyYXMpKSB7XG4gICAgICAgIGV4dHJhcyA9IFtleHRyYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4dHJhcy5tYXAoZXh0cmEgPT4gd2luZG93LmN1c3RvbVVJLmNvbXB1dGVUZW1wbGF0ZShcbiAgICAgICAgZXh0cmEsXG4gICAgICAgIGhhc3MsXG4gICAgICAgIGhhc3Muc3RhdGVzLFxuICAgICAgICBzdGF0ZU9iaixcbiAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlcyxcbiAgICAgICAgLyogYXR0cmlidXRlPSAqLyB1bmRlZmluZWQsXG4gICAgICAgIHN0YXRlT2JqLnN0YXRlLFxuICAgICAgKSkuZmlsdGVyKHJlc3VsdCA9PiByZXN1bHQgIT09IG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBzaG93TGFzdENoYW5nZWQoc3RhdGVPYmosIGluRGlhbG9nLCBleHRyYSkge1xuICAgIGlmIChpbkRpYWxvZykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGV4dHJhLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhIXN0YXRlT2JqLmF0dHJpYnV0ZXMuc2hvd19sYXN0X2NoYW5nZWQ7XG4gIH1cblxuICBoYXNFeHRyYShleHRyYSkge1xuICAgIHJldHVybiBleHRyYS5sZW5ndGggPiAwO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBDdWlCYXNlRWxlbWVudDtcbiIsImltcG9ydCBkeW5hbWljQ29udGVudFVwZGF0ZXIgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9keW5hbWljX2NvbnRlbnRfdXBkYXRlci5qcyc7XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgRHluYW1pY0VsZW1lbnQgZXh0ZW5kcyBQb2x5bWVyLkVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc3M6IE9iamVjdCxcbiAgICAgIHN0YXRlT2JqOiBPYmplY3QsXG4gICAgICBlbGVtZW50TmFtZTogU3RyaW5nLFxuXG4gICAgICBpbkRpYWxvZzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ29ic2VydmVyRnVuYyhoYXNzLCBzdGF0ZU9iaiwgZWxlbWVudE5hbWUsIGluRGlhbG9nKScsXG4gICAgXTtcbiAgfVxuXG4gIG9ic2VydmVyRnVuYyhoYXNzLCBzdGF0ZU9iaiwgZWxlbWVudE5hbWUsIGluRGlhbG9nKSB7XG4gICAgZHluYW1pY0NvbnRlbnRVcGRhdGVyKFxuICAgICAgdGhpcyxcbiAgICAgIGVsZW1lbnROYW1lID8gZWxlbWVudE5hbWUudG9VcHBlckNhc2UoKSA6ICdESVYnLFxuICAgICAgeyBoYXNzLCBzdGF0ZU9iaiwgaW5EaWFsb2cgfSk7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZHluYW1pYy1lbGVtZW50JywgRHluYW1pY0VsZW1lbnQpO1xuIiwiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzJztcbmltcG9ydCBhcHBseVRoZW1lc09uRWxlbWVudCBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZG9tL2FwcGx5X3RoZW1lc19vbl9lbGVtZW50LmpzJztcblxuaW1wb3J0ICcuL2R5bmFtaWMtZWxlbWVudC5qcyc7XG5pbXBvcnQgJy4uL3V0aWxzL2hvb2tzLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBEeW5hbWljV2l0aEV4dHJhIGV4dGVuZHMgY3VzdG9tRWxlbWVudHMuZ2V0KCdzdGF0ZS1jYXJkLWRpc3BsYXknKSB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlIGlzPVwiY3VzdG9tLXN0eWxlXCIgaW5jbHVkZT1cImlyb24tZmxleCBpcm9uLWZsZXgtYWxpZ25tZW50IGlyb24tZmxleC1mYWN0b3JzXCI+PC9zdHlsZT5cbiAgICA8c3R5bGU+XG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIH1cbiAgICAgIC5jb250cm9sLXdyYXBwZXIge1xuICAgICAgICBtYXJnaW46IC00cHggLTE2cHggLTRweCAwO1xuICAgICAgICBwYWRkaW5nOiA0cHggMTZweDtcbiAgICAgIH1cbiAgICAgIGhhLXN0YXRlLWxhYmVsLWJhZGdlIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgIH1cbiAgICAgIGR5bmFtaWMtZWxlbWVudCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgIH1cbiAgICAgICNvdmVybGF5IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgfVxuICAgICAgI2xvY2sge1xuICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgICAgIG9wYWNpdHk6IDAuMztcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA3cHg7XG4gICAgICB9XG4gICAgICAjbG9jay5oYS1jb3Zlci1jb250cm9scyB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNTJweDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgICB9XG4gICAgICAuZXh0cmEge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTZweDtcbiAgICAgICAgLS1oYS1sYWJlbC1iYWRnZS1zaXplOiAzNnB4O1xuICAgICAgICAtLWhhLWxhYmVsLWJhZGdlLWZvbnQtc2l6ZTogMS4yZW07XG4gICAgICB9XG4gICAgICAuc3RhdGUge1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxO1xuICAgICAgICBjb2xvcjogdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgICBsaW5lLWhlaWdodDogNDBweDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3MkPSdbW2V4dHJhQ2xhc3MoZXh0cmFPYmpWaXNpYmxlKV1dIGhvcml6b250YWwgbGF5b3V0Jz5cbiAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tleHRyYU9ialZpc2libGVdXSc+XG4gICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLXJlcGVhdCdcbiAgICAgICAgICAgICAgICAgIGl0ZW1zPSdbW2V4dHJhT2JqXV0nXG4gICAgICAgICAgICAgICAgICBvbi1kb20tY2hhbmdlPSdleHRyYURvbUNoYW5nZWQnPlxuICAgICAgICAgIDxoYS1zdGF0ZS1sYWJlbC1iYWRnZSBoYXNzPSdbW2hhc3NdXScgc3RhdGU9J1tbaXRlbV1dJz48L2hhLXN0YXRlLWxhYmVsLWJhZGdlPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tfc2hvd0NvbnRyb2woaW5EaWFsb2csIHN0YXRlT2JqKV1dJz5cbiAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW2NvbnRyb2xFbGVtZW50XV0nPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkeW5hbWljLWVsZW1lbnRcbiAgICAgICAgICAgICAgICBjbGFzcz0nZmxleCdcbiAgICAgICAgICAgICAgICBzdGF0ZS1vYmo9XCJbW3N0YXRlT2JqXV1cIlxuICAgICAgICAgICAgICAgIGhhc3M9J1tbaGFzc11dJ1xuICAgICAgICAgICAgICAgIGVsZW1lbnQtbmFtZT0nW1tjb250cm9sRWxlbWVudF1dJz5cbiAgICAgICAgICAgIDwvZHluYW1pYy1lbGVtZW50PlxuICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW2lzQ29uZmlybUNvbnRyb2xzKHN0YXRlT2JqKV1dJz5cbiAgICAgICAgICAgICAgPGRpdiBpZD1cIm92ZXJsYXlcIiBvbi1jbGljaz0nY2xpY2tIYW5kbGVyJz5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbc3RhdGVPYmouYXR0cmlidXRlcy5jb25maXJtX2NvbnRyb2xzX3Nob3dfbG9ja11dJz5cbiAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWQ9XCJsb2NrXCIgY2xhc3MkPVwiW1tjb250cm9sRWxlbWVudF1dXCIgaWNvbj1cIm1kaTpsb2NrLW91dGxpbmVcIj48L2lyb24taWNvbj5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1shY29udHJvbEVsZW1lbnRdXSc+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nc3RhdGUnPltbY29tcHV0ZVN0YXRlRGlzcGxheShzdGF0ZU9iaildXTwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNzOiBPYmplY3QsXG4gICAgICBpbkRpYWxvZzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgc3RhdGVPYmo6IE9iamVjdCxcbiAgICAgIGNvbnRyb2xFbGVtZW50OiBTdHJpbmcsXG4gICAgICBleHRyYU9iajoge1xuICAgICAgICB0eXBlOiBBcnJheSxcbiAgICAgICAgY29tcHV0ZWQ6ICdjb21wdXRlRXh0cmEoaGFzcywgc3RhdGVPYmosIF9hdHRhY2hlZCknLFxuICAgICAgfSxcbiAgICAgIF9hdHRhY2hlZDogQm9vbGVhbixcbiAgICAgIGV4dHJhT2JqVmlzaWJsZToge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBjb21wdXRlZDogJ2NvbXB1dGVFeHRyYVZpc2libGUoZXh0cmFPYmosIGluRGlhbG9nKScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX2F0dGFjaGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2lzQXR0YWNoZWQgPSBmYWxzZTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgY29tcHV0ZUV4dHJhKGhhc3MsIHN0YXRlT2JqLCBhdHRhY2hlZCkge1xuICAgIGlmICghc3RhdGVPYmouYXR0cmlidXRlcy5leHRyYV9iYWRnZSB8fCAhYXR0YWNoZWQpIHJldHVybiBbXTtcbiAgICBsZXQgZXh0cmFCYWRnZXMgPSBzdGF0ZU9iai5hdHRyaWJ1dGVzLmV4dHJhX2JhZGdlO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHRyYUJhZGdlcykpIHtcbiAgICAgIGV4dHJhQmFkZ2VzID0gW2V4dHJhQmFkZ2VzXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dHJhQmFkZ2VzLm1hcCgoZXh0cmFCYWRnZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICBpZiAoZXh0cmFCYWRnZS5lbnRpdHlfaWQgJiYgaGFzcy5zdGF0ZXNbZXh0cmFCYWRnZS5lbnRpdHlfaWRdKSB7XG4gICAgICAgIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdChcbiAgICAgICAgICB0aGlzLCBoYXNzLnN0YXRlc1tleHRyYUJhZGdlLmVudGl0eV9pZF0sIHRoaXMuaW5EaWFsb2csXG4gICAgICAgICAgLyogYWxsb3dIaWRkZW49ICovZmFsc2UpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXh0cmFCYWRnZS5hdHRyaWJ1dGUgJiZcbiAgICAgICAgICAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlc1tleHRyYUJhZGdlLmF0dHJpYnV0ZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgc3RhdGU6IFN0cmluZyhzdGF0ZU9iai5hdHRyaWJ1dGVzW2V4dHJhQmFkZ2UuYXR0cmlidXRlXSksXG4gICAgICAgICAgX2RvbWFpbjogJ25vbmUnLFxuICAgICAgICAgIGVudGl0eV9pZDogbnVsbCxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7IHVuaXRfb2ZfbWVhc3VyZW1lbnQ6IGV4dHJhQmFkZ2UudW5pdCB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgbGV0IGJsYWNrbGlzdCA9IGV4dHJhQmFkZ2UuYmxhY2tsaXN0X3N0YXRlcztcbiAgICAgIGlmIChibGFja2xpc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmxhY2tsaXN0KSkge1xuICAgICAgICAgIGJsYWNrbGlzdCA9IFtibGFja2xpc3RdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChibGFja2xpc3Quc29tZSh2ID0+IFJlZ0V4cCh2KS50ZXN0KHJlc3VsdC5zdGF0ZS50b1N0cmluZygpKSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0Ll9lbnRpdHlEaXNwbGF5ID0gJyc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLmZpbHRlcihleHRyYUJhZGdlID0+IGV4dHJhQmFkZ2UgIT0gbnVsbCk7XG4gIH1cblxuICBjb21wdXRlRXh0cmFWaXNpYmxlKGV4dHJhT2JqLCBpbkRpYWxvZykge1xuICAgIGlmIChpbkRpYWxvZyB8fCAhZXh0cmFPYmopIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZXh0cmFPYmoubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgZXh0cmFDbGFzcyhleHRyYU9ialZpc2libGUpIHtcbiAgICByZXR1cm4gZXh0cmFPYmpWaXNpYmxlID8gJ2V4dHJhJyA6ICcnO1xuICB9XG5cbiAgX3Nob3dDb250cm9sKGluRGlhbG9nLCBzdGF0ZU9iaikge1xuICAgIGlmIChpbkRpYWxvZykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICFzdGF0ZU9iai5hdHRyaWJ1dGVzLmhpZGVfY29udHJvbDtcbiAgfVxuXG4gIGNvbXB1dGVTdGF0ZURpc3BsYXkoc3RhdGVPYmopIHtcbiAgICAvLyBoYUxvY2FsaXplIHJlbW92ZWQgaW4gMC42MVxuICAgIHJldHVybiBzdXBlci5jb21wdXRlU3RhdGVEaXNwbGF5KHRoaXMuaGFMb2NhbGl6ZSB8fCB0aGlzLmxvY2FsaXplLCBzdGF0ZU9iaik7XG4gIH1cblxuICBpc0NvbmZpcm1Db250cm9scyhzdGF0ZU9iaikge1xuICAgIHJldHVybiBzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbmZpcm1fY29udHJvbHMgfHxcbiAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlcy5jb25maXJtX2NvbnRyb2xzX3Nob3dfbG9jaztcbiAgfVxuXG4gIGNsaWNrSGFuZGxlcihlKSB7XG4gICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNvdmVybGF5Jykuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICBjb25zdCBsb2NrID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNsb2NrJyk7XG4gICAgaWYgKGxvY2spIHtcbiAgICAgIGxvY2suaWNvbiA9ICdtZGk6bG9jay1vcGVuLW91dGxpbmUnO1xuICAgICAgbG9jay5zdHlsZS5vcGFjaXR5ID0gJzAuMSc7XG4gICAgfVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcjb3ZlcmxheScpLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgIGxvY2suaWNvbiA9ICdtZGk6bG9jay1vdXRsaW5lJztcbiAgICAgICAgbG9jay5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICB9XG4gICAgfSwgNTAwMCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIGFwcGx5VGhlbWVzKGhhc3MsIGVsZW1lbnQsIHN0YXRlT2JqKSB7XG4gICAgY29uc3QgdGhlbWVOYW1lID0gc3RhdGVPYmouYXR0cmlidXRlcy50aGVtZSB8fCAnZGVmYXVsdCc7XG4gICAgYXBwbHlUaGVtZXNPbkVsZW1lbnQoXG4gICAgICBlbGVtZW50LCBoYXNzLnRoZW1lcyB8fCB7IGRlZmF1bHRfdGhlbWU6ICdkZWZhdWx0JywgdGhlbWVzOiB7fSB9LCB0aGVtZU5hbWUpO1xuICB9XG5cbiAgZXh0cmFEb21DaGFuZ2VkKCkge1xuICAgIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdoYS1zdGF0ZS1sYWJlbC1iYWRnZScpXG4gICAgICAuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5VGhlbWVzKHRoaXMuaGFzcywgZWxlbSwgZWxlbS5zdGF0ZSk7XG4gICAgICB9KTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkeW5hbWljLXdpdGgtZXh0cmEnLCBEeW5hbWljV2l0aEV4dHJhKTtcbiIsImltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9odG1sLXRhZy5qcyc7XG5pbXBvcnQgRXZlbnRzTWl4aW4gZnJvbSAnLi4vbWl4aW5zL2V2ZW50cy1taXhpbi5qcyc7XG5pbXBvcnQgJy4uL3V0aWxzL2hvb2tzLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBIYUNvbmZpZ0N1c3RvbVVpIGV4dGVuZHMgRXZlbnRzTWl4aW4oUG9seW1lci5FbGVtZW50KSB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlIGluY2x1ZGU9XCJoYS1zdHlsZVwiPjwvc3R5bGU+XG4gICAgPGFwcC1oZWFkZXItbGF5b3V0IGhhcy1zY3JvbGxpbmctcmVnaW9uPlxuICAgICAgPGFwcC1oZWFkZXIgc2xvdD1cImhlYWRlclwiIGZpeGVkPlxuICAgICAgICA8YXBwLXRvb2xiYXI+XG4gICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uXG4gICAgICAgICAgICBpY29uPSdtZGk6YXJyb3ctbGVmdCdcbiAgICAgICAgICAgIG9uLWNsaWNrPSdfYmFja0hhbmRsZXInXG4gICAgICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+XG4gICAgICAgICAgPGRpdiBtYWluLXRpdGxlPkN1c3RvbSBVSSBzZXR0aW5nczwvZGl2PlxuICAgICAgICA8L2FwcC10b29sYmFyPlxuICAgICAgPC9hcHAtaGVhZGVyPlxuXG4gICAgICA8aGEtY29uZmlnLXNlY3Rpb24gaXMtd2lkZT0nW1tpc1dpZGVdXSc+XG4gICAgICAgIDxwYXBlci1jYXJkIGhlYWRpbmc9J0RldmljZSBuYW1lJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdjYXJkLWNvbnRlbnQnPlxuICAgICAgICAgICAgU2V0IGRldmljZSBuYW1lIHNvIHRoYXQgeW91IGNhbiByZWZlcmVuY2UgaXQgaW4gcGVyLWRldmljZSBzZXR0aW5nc1xuICAgICAgICAgICAgPHBhcGVyLWlucHV0XG4gICAgICAgICAgICAgIGxhYmVsPSdOYW1lJ1xuICAgICAgICAgICAgICB2YWx1ZT0ne3tuYW1lfX0nXG4gICAgICAgICAgICA+PC9wYXBlci1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wYXBlci1jYXJkPlxuICAgICAgPC9oYS1jb25maWctc2VjdGlvbj5cbiAgICA8L2FwcC1oZWFkZXItbGF5b3V0PlxuICAgIGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzV2lkZTogQm9vbGVhbixcblxuICAgICAgbmFtZToge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIG9ic2VydmVyOiAnbmFtZUNoYW5nZWQnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmVhZHkoKSB7XG4gICAgc3VwZXIucmVhZHkoKTtcbiAgICB0aGlzLm5hbWUgPSB3aW5kb3cuY3VzdG9tVUkuZ2V0TmFtZSgpO1xuICB9XG5cbiAgbmFtZUNoYW5nZWQobmFtZSkge1xuICAgIHdpbmRvdy5jdXN0b21VSS5zZXROYW1lKG5hbWUpO1xuICB9XG5cbiAgX2JhY2tIYW5kbGVyKCkge1xuICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcbiAgICB0aGlzLmZpcmUoJ2xvY2F0aW9uLWNoYW5nZWQnKTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdoYS1jb25maWctY3VzdG9tLXVpJywgSGFDb25maWdDdXN0b21VaSk7XG4iLCJpbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvaHRtbC10YWcuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIEhhVGhlbWVkU2xpZGVyIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHtcbiAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICA8c3R5bGU+XG4gICAgICA6aG9zdCB7XG4gICAgICAgIG1hcmdpbjogdmFyKC0taGEtdGhlbWVkLXNsaWRlci1tYXJnaW4sIGluaXRpYWwpO1xuICAgICAgfVxuICAgICAgLmRpc2FibGUtb2ZmLXdoZW4tbWluIHtcbiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiAgdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcik7XG4gICAgICB9XG5cbiAgICAgIC5kaXNhYmxlLW9mZi13aGVuLW1pbi5pcy1vbiB7XG4gICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yKTtcbiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yKTtcbiAgICAgIH1cbiAgICAgIHBhcGVyLXNsaWRlciB7XG4gICAgICAgIG1hcmdpbjogNHB4IDA7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICAgICAgd2lkdGg6IHZhcigtLWhhLXBhcGVyLXNsaWRlci13aWR0aCwgMjAwcHgpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG5cbiAgICA8cGFwZXItc2xpZGVyXG4gICAgICAgICBtaW49J1tbX3RoZW1lZE1pbl1dJ1xuICAgICAgICAgbWF4PSdbW19jb21wdXRlQXR0cmlidXRlKHRoZW1lLCBcIm1heFwiLCBtYXgpXV0nXG4gICAgICAgICBwaW49J1tbX2NvbXB1dGVBdHRyaWJ1dGUodGhlbWUsIFwicGluXCIsIHBpbildXSdcbiAgICAgICAgIGNsYXNzJD0nW1tjb21wdXRlQ2xhc3ModGhlbWUsIGlzT24sIF90aGVtZWRNaW4pXV0nIHZhbHVlPSdbW3ZhbHVlXV0nXG4gICAgICAgICBvbi1jaGFuZ2U9J3ZhbHVlQ2hhbmdlZCc+XG4gICAgPC9wYXBlci1zbGlkZXI+XG4gICAgYDtcbiAgfVxuXG4gIHJlYWR5KCkge1xuICAgIHN1cGVyLnJlYWR5KCk7XG4gICAgdGhpcy5kaXNhYmxlT2ZmV2hlbk1pbiA9ICF0aGlzLl9jb21wdXRlQXR0cmlidXRlKHRoaXMudGhlbWUsICdvZmZfd2hlbl9taW4nLCAhdGhpcy5kaXNhYmxlT2ZmV2hlbk1pbik7XG4gICAgdGhpcy5jb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkKHRoaXMudGhlbWUsIHRoaXMuZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWluOiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgdmFsdWU6IDAsXG4gICAgICB9LFxuICAgICAgbWF4OiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgdmFsdWU6IDEwMCxcbiAgICAgIH0sXG4gICAgICBwaW46IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGlzT246IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGRpc2FibGVPZmZXaGVuTWluOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgbm90aWZ5OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGRpc2FibGVSZXBvcnRXaGVuTm90Q2hhbmdlZDoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuXG4gICAgICB0aGVtZTogT2JqZWN0LFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICBub3RpZnk6IHRydWUsXG4gICAgICB9LFxuICAgICAgX3RoZW1lZE1pbjoge1xuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIGNvbXB1dGVkOiAnX2NvbXB1dGVBdHRyaWJ1dGUodGhlbWUsIFwibWluXCIsIG1pbiknLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdjb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkKHRoZW1lLCBkaXNhYmxlUmVwb3J0V2hlbk5vdENoYW5nZWQpJyxcbiAgICBdO1xuICB9XG5cbiAgY29tcHV0ZUVuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCh0aGVtZSwgZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkKSB7XG4gICAgdGhpcy5fZW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkID0gdGhpcy5fY29tcHV0ZUF0dHJpYnV0ZShcbiAgICAgIHRoZW1lLCAncmVwb3J0X3doZW5fbm90X2NoYW5nZWQnLCAhZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkKTtcbiAgfVxuXG4gIF9jb21wdXRlQXR0cmlidXRlKHRoZW1lLCBhdHRyLCBkZWYpIHtcbiAgICBpZiAodGhlbWUpIHtcbiAgICAgIGlmIChhdHRyIGluIHRoZW1lKSB7XG4gICAgICAgIHJldHVybiB0aGVtZVthdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbiAgfVxuXG4gIGNvbXB1dGVDbGFzcyh0aGVtZSwgaXNPbiwgdGhlbWVkTWluKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGlmIChpc09uKSB7XG4gICAgICByZXN1bHQgKz0gJ2lzLW9uICc7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb21wdXRlQXR0cmlidXRlKHRoZW1lLCAnb2ZmX3doZW5fbWluJywgIXRoaXMuZGlzYWJsZU9mZldoZW5NaW4pIHx8IHRoZW1lZE1pbiA9PT0gMCkge1xuICAgICAgLy8gSWYgb2ZmV2hlbk1pbiBpcyBlbmFibGVkIGRvbid0IGN1c3RvbWl6ZS5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3Jlc3VsdH1kaXNhYmxlLW9mZi13aGVuLW1pbmA7XG4gIH1cblxuICB2YWx1ZUNoYW5nZWQoZXYpIHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWRUaGVtZWRSZXBvcnRXaGVuTm90Q2hhbmdlZCAmJiB0aGlzLnZhbHVlID09PSBldi50YXJnZXQudmFsdWUpIHtcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gZXYudGFyZ2V0LnZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2hhLXRoZW1lZC1zbGlkZXInLCBIYVRoZW1lZFNsaWRlcik7XG4iLCJpbXBvcnQgYXBwbHlUaGVtZXNPbkVsZW1lbnQgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9hcHBseV90aGVtZXNfb25fZWxlbWVudC5qcyc7XG5pbXBvcnQgY29tcHV0ZVN0YXRlRG9tYWluIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9lbnRpdHkvY29tcHV0ZV9zdGF0ZV9kb21haW4uanMnO1xuaW1wb3J0IGR5bmFtaWNDb250ZW50VXBkYXRlciBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZG9tL2R5bmFtaWNfY29udGVudF91cGRhdGVyLmpzJztcbmltcG9ydCBzdGF0ZUNhcmRUeXBlIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9lbnRpdHkvc3RhdGVfY2FyZF90eXBlLmpzJztcblxuaW1wb3J0ICcuLi91dGlscy9ob29rcy5qcyc7XG5pbXBvcnQgJy4vc3RhdGUtY2FyZC13aXRoLXNsaWRlci5qcyc7XG5pbXBvcnQgJy4vc3RhdGUtY2FyZC13aXRob3V0LXNsaWRlci5qcyc7XG5cbmNvbnN0IFNIT1dfTEFTVF9DSEFOR0VEX0JMQUNLTElTVEVEX0NBUkRTID0gWydjb25maWd1cmF0b3InXTtcbmNvbnN0IERPTUFJTl9UT19TTElERVJfU1VQUE9SVCA9IHtcbiAgbGlnaHQ6IDEsIC8vIFNVUFBPUlRfQlJJR0hUTkVTU1xuICBjb3ZlcjogNCwgLy8gU1VQUE9SVF9TRVRfUE9TSVRJT05cbiAgY2xpbWF0ZTogMSwgLy8gU1VQUE9SVF9UQVJHRVRfVEVNUEVSQVRVUkVcbn07XG5jb25zdCBUWVBFX1RPX0NPTlRST0wgPSB7XG4gIHRvZ2dsZTogJ2hhLWVudGl0eS10b2dnbGUnLFxuICBkaXNwbGF5OiAnJyxcbiAgY292ZXI6ICdoYS1jb3Zlci1jb250cm9scycsXG59O1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIFN0YXRlQ2FyZEN1c3RvbVVpIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNzOiBPYmplY3QsXG5cbiAgICAgIGluRGlhbG9nOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG5cbiAgICAgIHN0YXRlT2JqOiBPYmplY3QsXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnaW5wdXRDaGFuZ2VkKGhhc3MsIGluRGlhbG9nLCBzdGF0ZU9iaiknLFxuICAgIF07XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIGlmIChjb250YWluZXIudGFnTmFtZSA9PT0gJ0RJVicgJiZcbiAgICAgICAgKGNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YXRlJykgfHwgY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnY2hpbGQtY2FyZCcpKSkge1xuICAgICAgdGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyO1xuXG4gICAgICAvLyBTaW5jZSB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgY2hhbmdlIHRoZSBiYWNrZ3JvdW5kIC0gbm8gbmVlZCB0byBjbGVhciBpdC5cbiAgICAgIGNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgJ2JhY2tncm91bmQtY29sb3InLCAndmFyKC0tcGFwZXItY2FyZC1iYWNrZ3JvdW5kLWNvbG9yLCBpbmhlcml0KScpO1xuXG4gICAgICAvLyBQb2x5ZmlsbCAndXBkYXRlU3R5bGVzJy5cbiAgICAgIGlmICghY29udGFpbmVyLnVwZGF0ZVN0eWxlcykge1xuICAgICAgICBjb250YWluZXIudXBkYXRlU3R5bGVzID0gKHN0eWxlcykgPT4ge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCBzdHlsZXNba2V5XSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2lzQXR0YWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5wdXRDaGFuZ2VkKHRoaXMuaGFzcywgdGhpcy5pbkRpYWxvZywgdGhpcy5zdGF0ZU9iaik7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9pc0F0dGFjaGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgdGhpcy5fY29udGFpbmVyLnVwZGF0ZVN0eWxlcyh7IGRpc3BsYXk6ICcnLCBtYXJnaW46ICcnLCBwYWRkaW5nOiAnJyB9KTtcbiAgICAgIGFwcGx5VGhlbWVzT25FbGVtZW50KFxuICAgICAgICB0aGlzLl9jb250YWluZXIsIHRoaXMuaGFzcy50aGVtZXMgfHwgeyBkZWZhdWx0X3RoZW1lOiAnZGVmYXVsdCcsIHRoZW1lczoge30gfSwgJ2RlZmF1bHQnKTtcbiAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBiYWRnZU1vZGUoaGFzcywgc3RhdGVPYmosIGRvbWFpbikge1xuICAgIGNvbnN0IHN0YXRlcyA9IFtdO1xuICAgIGlmIChkb21haW4gPT09ICdncm91cCcpIHtcbiAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXMuZW50aXR5X2lkLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gaGFzcy5zdGF0ZXNbaWRdO1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBJRCAke2lkfSBpbiBncm91cCAke3N0YXRlT2JqLmVudGl0eV9pZH1gKTtcbiAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0ZU9iai5hdHRyaWJ1dGVzLmJhZGdlc19saXN0IHx8XG4gICAgICAgICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzLmJhZGdlc19saXN0LmluY2x1ZGVzKHN0YXRlLmVudGl0eV9pZCkpIHtcbiAgICAgICAgICBzdGF0ZXMucHVzaCh3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3QoXG4gICAgICAgICAgICB0aGlzLCBzdGF0ZSwgZmFsc2UgLyogaW5EaWFsb2cgKi8sIGZhbHNlIC8qIGFsbG93SGlkZGVuICovKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZXMucHVzaChzdGF0ZU9iaik7XG4gICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZGlzcGxheTogJ2lubGluZS1ibG9jaycgfTtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ3N0YXRlJykpIHtcbiAgICAgICAgICBwYXJhbXMubWFyZ2luID0gJ3ZhcigtLWhhLWJhZGdlcy1jYXJkLW1hcmdpbiwgMCknO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHBhcmFtcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGR5bmFtaWNDb250ZW50VXBkYXRlcihcbiAgICAgIHRoaXMsXG4gICAgICAnSEEtQkFER0VTLUNBUkQnLFxuICAgICAgeyBoYXNzLCBzdGF0ZXMgfSk7XG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgdGhpcy5fY29udGFpbmVyLnVwZGF0ZVN0eWxlcyh7XG4gICAgICAgIHdpZHRoOiAndmFyKC0taGEtYmFkZ2VzLWNhcmQtd2lkdGgsIGluaXRpYWwpJyxcbiAgICAgICAgJ3RleHQtYWxpZ24nOiAndmFyKC0taGEtYmFkZ2VzLWNhcmQtdGV4dC1hbGlnbiwgaW5pdGlhbCknLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubGFzdENoaWxkLnN0eWxlLmZvbnRTaXplID0gJzg1JSc7XG5cbiAgICAvLyBTaW5jZSB0aGlzIHZhcmlhYmxlIG9ubHkgYWZmZWN0cyBiYWRnZXMgbW9kZSAtIG5vIG5lZWQgdG8gY2xlYW4gaXQgdXAuXG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1oYS1zdGF0ZS1sYWJlbC1iYWRnZS1tYXJnaW4tYm90dG9tJywgJzAnKTtcbiAgfVxuXG4gIGNsZWFuQmFkZ2VTdHlsZSgpIHtcbiAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIudXBkYXRlU3R5bGVzKHtcbiAgICAgICAgZGlzcGxheTogJycsXG4gICAgICAgIHdpZHRoOiAnJyxcbiAgICAgICAgJ3RleHQtYWxpZ24nOiAnJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVN0eWxlcyh7IGRpc3BsYXk6ICcnLCBtYXJnaW46ICcnIH0pO1xuICB9XG5cbiAgYXBwbHlUaGVtZXMoaGFzcywgbW9kaWZpZWRPYmopIHtcbiAgICBsZXQgdGhlbWVUYXJnZXQgPSB0aGlzO1xuICAgIGxldCB0aGVtZU5hbWUgPSAnZGVmYXVsdCc7XG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgdGhlbWVUYXJnZXQgPSB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuICAgIGlmIChtb2RpZmllZE9iai5hdHRyaWJ1dGVzLnRoZW1lKSB7XG4gICAgICB0aGVtZU5hbWUgPSBtb2RpZmllZE9iai5hdHRyaWJ1dGVzLnRoZW1lO1xuICAgIH1cbiAgICBhcHBseVRoZW1lc09uRWxlbWVudChcbiAgICAgIHRoZW1lVGFyZ2V0LCBoYXNzLnRoZW1lcyB8fCB7IGRlZmF1bHRfdGhlbWU6ICdkZWZhdWx0JywgdGhlbWVzOiB7fSB9LCB0aGVtZU5hbWUpO1xuICB9XG5cbiAgbWF5YmVIaWRlRW50aXR5KG1vZGlmaWVkT2JqKSB7XG4gICAgaWYgKCFtb2RpZmllZE9iaikge1xuICAgICAgaWYgKHRoaXMubGFzdENoaWxkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5sYXN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICB0aGlzLl9jb250YWluZXIudXBkYXRlU3R5bGVzKHsgbWFyZ2luOiAnMCcsIHBhZGRpbmc6ICcwJyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIudXBkYXRlU3R5bGVzKHsgbWFyZ2luOiAnJywgcGFkZGluZzogJycgfSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNsaWRlckVsaWdpYmxlXyhkb21haW4sIG9iaiwgaW5EaWFsb2cpIHtcbiAgICBpZiAoaW5EaWFsb2cpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gRE9NQUlOX1RPX1NMSURFUl9TVVBQT1JUW2RvbWFpbl0gJiZcbiAgICAgIChET01BSU5fVE9fU0xJREVSX1NVUFBPUlRbZG9tYWluXSAmIG9iai5hdHRyaWJ1dGVzLnN1cHBvcnRlZF9mZWF0dXJlcykgJiZcbiAgICAgIG9iai5hdHRyaWJ1dGVzLnN0YXRlX2NhcmRfbW9kZSAmJiBvYmouYXR0cmlidXRlcy5zdGF0ZV9jYXJkX21vZGUgIT09ICduby1zbGlkZXInO1xuICB9XG5cbiAgaW5wdXRDaGFuZ2VkKGhhc3MsIGluRGlhbG9nLCBzdGF0ZU9iaikge1xuICAgIGlmICghc3RhdGVPYmogfHwgIWhhc3MgfHwgIXRoaXMuX2lzQXR0YWNoZWQpIHJldHVybjtcbiAgICBjb25zdCBkb21haW4gPSBjb21wdXRlU3RhdGVEb21haW4oc3RhdGVPYmopO1xuICAgIGNvbnN0IG1vZGlmaWVkT2JqID0gd2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0KFxuICAgICAgdGhpcywgc3RhdGVPYmosIGluRGlhbG9nLCB0cnVlIC8qIGFsbG93SGlkZGVuICovKTtcblxuICAgIGlmICh0aGlzLm1heWJlSGlkZUVudGl0eShtb2RpZmllZE9iaikpIHJldHVybjtcblxuICAgIHRoaXMuYXBwbHlUaGVtZXMoaGFzcywgbW9kaWZpZWRPYmopO1xuXG4gICAgaWYgKCFpbkRpYWxvZyAmJiBtb2RpZmllZE9iai5hdHRyaWJ1dGVzLnN0YXRlX2NhcmRfbW9kZSA9PT0gJ2JhZGdlcycpIHtcbiAgICAgIHRoaXMuYmFkZ2VNb2RlKGhhc3MsIG1vZGlmaWVkT2JqLCBkb21haW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZ3VsYXJNb2RlXyhoYXNzLCBpbkRpYWxvZywgbW9kaWZpZWRPYmosIGRvbWFpbik7XG4gICAgfVxuICB9XG5cbiAgcmVndWxhck1vZGVfKGhhc3MsIGluRGlhbG9nLCBzdGF0ZU9iaiwgZG9tYWluKSB7XG4gICAgdGhpcy5jbGVhbkJhZGdlU3R5bGUoKTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGhhc3MsXG4gICAgICBzdGF0ZU9iaixcbiAgICAgIGluRGlhbG9nLFxuICAgIH07XG4gICAgY29uc3Qgb3JpZ2luYWxTdGF0ZUNhcmRUeXBlID0gc3RhdGVDYXJkVHlwZShoYXNzLCBzdGF0ZU9iaik7XG4gICAgbGV0IGN1c3RvbVN0YXRlQ2FyZFR5cGU7XG4gICAgY29uc3Qgc2Vjb25kYXJ5U3RhdGVDYXJkVHlwZSA9IHN0YXRlT2JqLmF0dHJpYnV0ZXMuc3RhdGVfY2FyZF9jdXN0b21fdWlfc2Vjb25kYXJ5O1xuXG4gICAgaWYgKGRvbWFpbiA9PT0gJ2xpZ2h0JyAmJiB0aGlzLnNsaWRlckVsaWdpYmxlXyhkb21haW4sIHN0YXRlT2JqLCBpbkRpYWxvZykpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7XG4gICAgICAgIGNvbnRyb2xFbGVtZW50OiAnaGEtZW50aXR5LXRvZ2dsZScsXG4gICAgICAgIHNlcnZpY2VNaW46ICd0dXJuX29mZicsXG4gICAgICAgIHNlcnZpY2VNYXg6ICd0dXJuX29uJyxcbiAgICAgICAgdmFsdWVOYW1lOiAnYnJpZ2h0bmVzcycsXG4gICAgICAgIGRvbWFpbixcbiAgICAgIH0pO1xuICAgICAgY3VzdG9tU3RhdGVDYXJkVHlwZSA9ICdzdGF0ZS1jYXJkLXdpdGgtc2xpZGVyJztcbiAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gJ2NvdmVyJyAmJiB0aGlzLnNsaWRlckVsaWdpYmxlXyhkb21haW4sIHN0YXRlT2JqLCBpbkRpYWxvZykpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7XG4gICAgICAgIGNvbnRyb2xFbGVtZW50OiAnaGEtY292ZXItY29udHJvbHMnLFxuICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgc2VydmljZU1pbjogJ2Nsb3NlX2NvdmVyJyxcbiAgICAgICAgc2VydmljZU1heDogJ3NldF9jb3Zlcl9wb3NpdGlvbicsXG4gICAgICAgIHNldFZhbHVlTmFtZTogJ3Bvc2l0aW9uJyxcbiAgICAgICAgdmFsdWVOYW1lOiAnY3VycmVudF9wb3NpdGlvbicsXG4gICAgICAgIG5hbWVPbjogJ29wZW4nLFxuICAgICAgICBkb21haW4sXG4gICAgICB9KTtcbiAgICAgIGN1c3RvbVN0YXRlQ2FyZFR5cGUgPSAnc3RhdGUtY2FyZC13aXRoLXNsaWRlcic7XG4gICAgfSBlbHNlIGlmIChkb21haW4gPT09ICdjbGltYXRlJyAmJiB0aGlzLnNsaWRlckVsaWdpYmxlXyhkb21haW4sIHN0YXRlT2JqLCBpbkRpYWxvZykpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7XG4gICAgICAgIGNvbnRyb2xFbGVtZW50OiAnaGEtY2xpbWF0ZS1zdGF0ZScsXG4gICAgICAgIG1pbjogc3RhdGVPYmouYXR0cmlidXRlcy5taW5fdGVtcCB8fCAtMTAwLFxuICAgICAgICBtYXg6IHN0YXRlT2JqLmF0dHJpYnV0ZXMubWF4X3RlbXAgfHwgMjAwLFxuICAgICAgICBzZXJ2aWNlTWluOiAnc2V0X3RlbXBlcmF0dXJlJyxcbiAgICAgICAgc2VydmljZU1heDogJ3NldF90ZW1wZXJhdHVyZScsXG4gICAgICAgIHZhbHVlTmFtZTogJ3RlbXBlcmF0dXJlJyxcbiAgICAgICAgbmFtZU9uOiAnJyxcbiAgICAgICAgZG9tYWluLFxuICAgICAgfSk7XG4gICAgICBjdXN0b21TdGF0ZUNhcmRUeXBlID0gJ3N0YXRlLWNhcmQtd2l0aC1zbGlkZXInO1xuICAgIH0gZWxzZSBpZiAoVFlQRV9UT19DT05UUk9MW29yaWdpbmFsU3RhdGVDYXJkVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLmNvbnRyb2xFbGVtZW50ID0gVFlQRV9UT19DT05UUk9MW29yaWdpbmFsU3RhdGVDYXJkVHlwZV07XG4gICAgICBjdXN0b21TdGF0ZUNhcmRUeXBlID0gJ3N0YXRlLWNhcmQtd2l0aG91dC1zbGlkZXInO1xuICAgIH0gZWxzZSBpZiAoc3RhdGVPYmouYXR0cmlidXRlcy5zaG93X2xhc3RfY2hhbmdlZCAmJlxuICAgICAgICAgICAgICAgIVNIT1dfTEFTVF9DSEFOR0VEX0JMQUNLTElTVEVEX0NBUkRTLmluY2x1ZGVzKG9yaWdpbmFsU3RhdGVDYXJkVHlwZSkpIHtcbiAgICAgIHBhcmFtcy5pbkRpYWxvZyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0ZU9iai5zdGF0ZSA9PT0gJ3VuYXZhaWxhYmxlJykge1xuICAgICAgcGFyYW1zLmNvbnRyb2xFbGVtZW50ID0gJyc7XG4gICAgfVxuICAgIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbnRyb2xfZWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMuY29udHJvbEVsZW1lbnQgPSBzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbnRyb2xfZWxlbWVudDtcbiAgICB9XG5cbiAgICBkeW5hbWljQ29udGVudFVwZGF0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgKHNlY29uZGFyeVN0YXRlQ2FyZFR5cGUgfHwgY3VzdG9tU3RhdGVDYXJkVHlwZSB8fCBgU1RBVEUtQ0FSRC0ke29yaWdpbmFsU3RhdGVDYXJkVHlwZX1gKS50b1VwcGVyQ2FzZSgpLFxuICAgICAgcGFyYW1zKTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdzdGF0ZS1jYXJkLWN1c3RvbS11aScsIFN0YXRlQ2FyZEN1c3RvbVVpKTtcbiIsImltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9odG1sLXRhZy5qcyc7XG5pbXBvcnQgQ3VpQmFzZUVsZW1lbnQgZnJvbSAnLi9jdWktYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCAnLi9keW5hbWljLXdpdGgtZXh0cmEuanMnO1xuaW1wb3J0ICcuL2hhLXRoZW1lZC1zbGlkZXIuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIFN0YXRlQ2FyZFdpdGhTbGlkZXIgZXh0ZW5kcyBDdWlCYXNlRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlIGlzPVwiY3VzdG9tLXN0eWxlXCIgaW5jbHVkZT1cImlyb24tZmxleCBpcm9uLWZsZXgtYWxpZ25tZW50IGlyb24tZmxleC1mYWN0b3JzXCI+PC9zdHlsZT5cbiAgICA8c3R5bGU+XG4gICAgICAjY29udGFpbmVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgLnNlY29uZC1saW5lLCAuc3RhdGUtYW5kLXRvZ2dsZSwgLnN0YXRlLWluZm8ge1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAubm93cmFwIC5zdGF0ZS1hbmQtdG9nZ2xlIHtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgZmxleC1ncm93OiAwO1xuICAgICAgfVxuICAgICAgLm5vd3JhcCAuc2Vjb25kLWxpbmUge1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAuc2Vjb25kLWxpbmUge1xuICAgICAgICBwYWRkaW5nLXRvcDogMjBweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IC0yMHB4O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTZweDtcbiAgICAgIH1cbiAgICAgIC5zdHJldGNoIC5zZWNvbmQtbGluZSwgLnN0cmV0Y2ggaGEtdGhlbWVkLXNsaWRlciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAtLWhhLXBhcGVyLXNsaWRlci13aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC5ub3dyYXAgLnN0YXRlLWluZm8ge1xuICAgICAgICBtaW4td2lkdGg6IGluaXRpYWw7XG4gICAgICB9XG4gICAgICBoYS10aGVtZWQtc2xpZGVyLCAudG9wLXdyYXBwZXIge1xuICAgICAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAudG9wLXdyYXBwZXIuc3RyZXRjaCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuXG4gICAgICAuaGlkZGVuIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuXG4gICAgPGRpdiBpZD0nY29udGFpbmVyJyBjbGFzcyQ9J2hvcml6b250YWwgbGF5b3V0IGZsZXggdG9wLXdyYXBwZXIgW1tfY29tcHV0ZVdyYXBDbGFzcyhtb2RlLCBzdHJldGNoU2xpZGVyLCBsaW5lVG9vTG9uZywgaW5EaWFsb2cpXV0nPlxuICAgICAgPGRpdiBjbGFzcz0naG9yaXpvbnRhbCBsYXlvdXQganVzdGlmaWVkIGZsZXgtYXV0byBzdGF0ZS1hbmQtdG9nZ2xlJz5cbiAgICAgICAgPHN0YXRlLWluZm8gY2xhc3M9J3N0YXRlLWluZm8nIHN0YXRlLW9iaj0nW1tzdGF0ZU9ial1dJyBpbi1kaWFsb2c9J1tbc2hvd0xhc3RDaGFuZ2VkKHN0YXRlT2JqLCBpbkRpYWxvZywgZXh0cmEpXV0nIHNlY29uZGFyeS1saW5lJD0nW1toYXNFeHRyYShleHRyYSldXScgY2xhc3M9J2ZsZXgtYXV0byc+XG4gICAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20tcmVwZWF0JyBpdGVtcz0nW1tleHRyYV1dJz5cbiAgICAgICAgICAgIDxkaXY+W1tpdGVtXV08L2Rpdj5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L3N0YXRlLWluZm8+XG4gICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1ticmVha1NsaWRlcl1dJyBjbGFzcz0naGlkZGVuJz5cbiAgICAgICAgICA8ZHluYW1pYy13aXRoLWV4dHJhIGhhc3M9J1tbaGFzc11dJyBzdGF0ZS1vYmo9J1tbc3RhdGVPYmpdXScgY29udHJvbC1lbGVtZW50PSdbW2NvbnRyb2xFbGVtZW50XV0nIGluLWRpYWxvZz0nW1tpbkRpYWxvZ11dJz48L2R5bmFtaWMtd2l0aC1leHRyYT5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW3Nob3dTbGlkZXJdXScgcmVzdGFtcD5cbiAgICAgICAgPGRpdiBjbGFzcz0naG9yaXpvbnRhbCBsYXlvdXQgZmxleC1hdXRvIGVuZC1qdXN0aWZpZWQgc2Vjb25kLWxpbmUnPlxuICAgICAgICAgIDxoYS10aGVtZWQtc2xpZGVyXG4gICAgICAgICAgICBpZD0nc2xpZGVyJ1xuICAgICAgICAgICAgbWF4PVtbbWF4XV1cbiAgICAgICAgICAgIG1pbj1bW21pbl1dXG4gICAgICAgICAgICB0aGVtZT0nW1tzdGF0ZU9iai5hdHRyaWJ1dGVzLnNsaWRlcl90aGVtZV1dJ1xuICAgICAgICAgICAgaXMtb249J1tbaXNPbihzdGF0ZU9iaiwgbmFtZU9uKV1dJ1xuICAgICAgICAgICAgdmFsdWU9J3t7c2xpZGVyVmFsdWV9fSdcbiAgICAgICAgICAgIGRpc2FibGUtb2ZmLXdoZW4tbWluPSd7e2Rpc2FibGVPZmZXaGVuTWlufX0nXG4gICAgICAgICAgICBvbi1jaGFuZ2U9J3NsaWRlckNoYW5nZWQnXG4gICAgICAgICAgICBvbi1jbGljaz0nc3RvcFByb3BhZ2F0aW9uJz5cbiAgICAgICAgICA8L2hhLXRoZW1lZC1zbGlkZXI+XG4gICAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbWyFicmVha1NsaWRlcl1dJz5cbiAgICAgICAgICAgIDxkeW5hbWljLXdpdGgtZXh0cmEgaGFzcz0nW1toYXNzXV0nIHN0YXRlLW9iaj0nW1tzdGF0ZU9ial1dJyBjb250cm9sLWVsZW1lbnQ9J1tbY29udHJvbEVsZW1lbnRdXScgaW4tZGlhbG9nPSdbW2luRGlhbG9nXV0nPjwvZHluYW1pYy13aXRoLWV4dHJhPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkb21haW46IFN0cmluZyxcbiAgICAgIHNlcnZpY2VNaW46IFN0cmluZyxcbiAgICAgIHNlcnZpY2VNYXg6IFN0cmluZyxcbiAgICAgIHZhbHVlTmFtZTogU3RyaW5nLFxuICAgICAgc2V0VmFsdWVOYW1lOiBTdHJpbmcsXG4gICAgICBuYW1lT246IHsgdHlwZTogU3RyaW5nLCB2YWx1ZTogJ29uJyB9LFxuICAgICAgbWluOiB7IHR5cGU6IE51bWJlciwgdmFsdWU6IDAgfSxcbiAgICAgIG1heDogeyB0eXBlOiBOdW1iZXIsIHZhbHVlOiAyNTUgfSxcblxuICAgICAgc2xpZGVyVmFsdWU6IHtcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICB2YWx1ZTogMCxcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlT2ZmV2hlbk1pbjogQm9vbGVhbixcbiAgICAgIG1vZGU6IFN0cmluZyxcbiAgICAgIHN0cmV0Y2hTbGlkZXI6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGJyZWFrU2xpZGVyOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBoaWRlU2xpZGVyOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBsaW5lVG9vTG9uZzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgbWluTGluZUJyZWFrOiBOdW1iZXIsXG4gICAgICBtYXhMaW5lQnJlYWs6IE51bWJlcixcbiAgICAgIHNob3dTbGlkZXI6IHtcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICBjb21wdXRlZDogJ19zaG93U2xpZGVyKGluRGlhbG9nLCBzdGF0ZU9iaiwgaGlkZVNsaWRlciknLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmVhZHkoKSB7XG4gICAgc3VwZXIucmVhZHkoKTtcbiAgICB0aGlzLl9vbklyb25SZXNpemUgPSB0aGlzLl9vbklyb25SZXNpemUuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5faXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vbklyb25SZXNpemUpO1xuICAgIHRoaXMuX3dhaXRGb3JMYXlvdXQoKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vbklyb25SZXNpemUpO1xuICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnc3RhdGVPYmpDaGFuZ2VkKHN0YXRlT2JqLCBuYW1lT24sIHZhbHVlTmFtZSknLFxuICAgIF07XG4gIH1cblxuICBfd2FpdEZvckxheW91dCgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQ29ubmVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5fc2V0TW9kZSgpO1xuICAgIGlmICh0aGlzLl9mcmFtZUlkKSByZXR1cm47XG4gICAgdGhpcy5yZWFkeVRvQ29tcHV0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2ZyYW1lSWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgdGhpcy5yZWFkeVRvQ29tcHV0ZSA9IHRydWU7XG4gICAgICB0aGlzLl9vbklyb25SZXNpemUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9zZXRNb2RlKCkge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGhpZGVTbGlkZXI6IHRoaXMubW9kZSA9PT0gJ2hpZGUtc2xpZGVyJyAmJiB0aGlzLmxpbmVUb29Mb25nLFxuICAgICAgYnJlYWtTbGlkZXI6XG4gICAgICAgICAgICh0aGlzLm1vZGUgPT09ICdicmVhay1zbGlkZXInIHx8IHRoaXMubW9kZSA9PT0gJ2hpZGUtc2xpZGVyJykgJiZcbiAgICAgICAgICAgdGhpcy5saW5lVG9vTG9uZyxcbiAgICB9O1xuICAgIGlmICghdGhpcy5zaG93U2xpZGVyKSB7XG4gICAgICBvYmouYnJlYWtTbGlkZXIgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnRpZXMob2JqKTtcbiAgfVxuXG4gIF9vbklyb25SZXNpemUoKSB7XG4gICAgaWYgKCF0aGlzLnJlYWR5VG9Db21wdXRlKSByZXR1cm47XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ25vLXNsaWRlcicpIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydGllcyh7XG4gICAgICAgIGhpZGVTbGlkZXI6IHRydWUsXG4gICAgICAgIGJyZWFrU2xpZGVyOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByZXZCcmVha1NsaWRlciA9IHRoaXMuYnJlYWtTbGlkZXI7XG4gICAgY29uc3QgcHJldkhpZGVTbGlkZXIgPSB0aGlzLmhpZGVTbGlkZXI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0aWVzKHtcbiAgICAgIGxpbmVUb29Mb25nOiBmYWxzZSxcbiAgICAgIGhpZGVTbGlkZXI6IGZhbHNlLFxuICAgICAgYnJlYWtTbGlkZXI6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSB0aGlzLiQ7XG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XG4gICAgaWYgKGNvbnRhaW5lcldpZHRoID09PSAwKSByZXR1cm47XG4gICAgaWYgKGNvbnRhaW5lcldpZHRoIDw9IHRoaXMubWluTGluZUJyZWFrKSB7XG4gICAgICB0aGlzLmxpbmVUb29Mb25nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcldpZHRoID49IHRoaXMubWF4TGluZUJyZWFrKSB7XG4gICAgICB0aGlzLmxpbmVUb29Mb25nID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcmV2SGlkZVNsaWRlciAmJiB0aGlzLm1vZGUgPT09ICdoaWRlLXNsaWRlcicpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byB1bmhpZGUgdGhlIHNsaWRlciBpbiBvcmRlciB0byByZWNhbGN1bGF0ZSBoZWlnaHQuXG4gICAgICAgIHRoaXMuX3dhaXRGb3JMYXlvdXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHN0YXRlSGVpZ2h0ID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy5zdGF0ZS1pbmZvJykuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5saW5lVG9vTG9uZyA9IGNvbnRhaW5lckhlaWdodCA+IHN0YXRlSGVpZ2h0ICogMS41O1xuICAgICAgaWYgKHRoaXMubGluZVRvb0xvbmcpIHtcbiAgICAgICAgdGhpcy5taW5MaW5lQnJlYWsgPSBjb250YWluZXJXaWR0aDtcbiAgICAgIH0gZWxzZSBpZiAoIXByZXZCcmVha1NsaWRlcikge1xuICAgICAgICB0aGlzLm1heExpbmVCcmVhayA9IGNvbnRhaW5lcldpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zZXRNb2RlKCk7XG4gIH1cblxuICBfY29tcHV0ZVdyYXBDbGFzcyhtb2RlLCBzdHJldGNoU2xpZGVyLCBsaW5lVG9vTG9uZywgaW5EaWFsb2cpIHtcbiAgICBpZiAoaW5EaWFsb2cpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09ICdzaW5nbGUtbGluZScpIHtcbiAgICAgIHJldHVybiAnbm93cmFwJztcbiAgICB9XG4gICAgaWYgKHN0cmV0Y2hTbGlkZXIgJiYgbGluZVRvb0xvbmcpIHtcbiAgICAgIHJldHVybiAnc3RyZXRjaCB3cmFwJztcbiAgICB9XG4gICAgcmV0dXJuICd3cmFwJztcbiAgfVxuXG4gIF9zaG93U2xpZGVyKGluRGlhbG9nLCBzdGF0ZU9iaiwgaGlkZVNsaWRlcikge1xuICAgIGlmIChpbkRpYWxvZyB8fCBoaWRlU2xpZGVyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2xpZGVyQ2hhbmdlZChldikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoZXYudGFyZ2V0LnZhbHVlLCAxMCk7XG4gICAgY29uc3QgcGFyYW0gPSB7IGVudGl0eV9pZDogdGhpcy5zdGF0ZU9iai5lbnRpdHlfaWQgfTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuO1xuICAgIGxldCB0YXJnZXQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignI3NsaWRlcicpO1xuICAgIGlmIChldi50YXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgLy8gTm8gU2hhZG93IERPTSAtIHdlIGhhdmUgYWNjZXNzIHRvIG9yaWdpbmFsIHRhcmdldC5cbiAgICAgICh7IHRhcmdldCB9ID0gZXYpO1xuICAgIH0gZWxzZSBpZiAoZXYucGF0aCkge1xuICAgICAgW3RhcmdldF0gPSBldi5wYXRoO1xuICAgIH0gZWxzZSBpZiAoZXYuY29tcG9zZWRQYXRoKSB7XG4gICAgICBbdGFyZ2V0XSA9IGV2LmNvbXBvc2VkUGF0aCgpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IDAgfHwgKHZhbHVlIDw9IHRhcmdldC5taW4gJiYgIXRoaXMuZGlzYWJsZU9mZldoZW5NaW4pKSB7XG4gICAgICB0aGlzLmhhc3MuY2FsbFNlcnZpY2UodGhpcy5kb21haW4sIHRoaXMuc2VydmljZU1pbiwgcGFyYW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbVt0aGlzLnNldFZhbHVlTmFtZSB8fCB0aGlzLnZhbHVlTmFtZV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuaGFzcy5jYWxsU2VydmljZSh0aGlzLmRvbWFpbiwgdGhpcy5zZXJ2aWNlTWF4LCBwYXJhbSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGVPYmpDaGFuZ2VkKHN0YXRlT2JqLCBuYW1lT24sIHZhbHVlTmFtZSkge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIHNsaWRlclZhbHVlOiB0aGlzLmlzT24oc3RhdGVPYmosIG5hbWVPbikgPyBzdGF0ZU9iai5hdHRyaWJ1dGVzW3ZhbHVlTmFtZV0gOiAwLFxuICAgIH07XG4gICAgaWYgKHN0YXRlT2JqKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG9iaiwge1xuICAgICAgICBtaW5MaW5lQnJlYWs6IDAsXG4gICAgICAgIG1heExpbmVCcmVhazogOTk5LFxuICAgICAgICBoaWRlU2xpZGVyOiBmYWxzZSxcbiAgICAgICAgYnJlYWtTbGlkZXI6IGZhbHNlLFxuICAgICAgICBsaW5lVG9vTG9uZzogZmFsc2UsXG4gICAgICAgIG1vZGU6IHN0YXRlT2JqLmF0dHJpYnV0ZXMuc3RhdGVfY2FyZF9tb2RlLFxuICAgICAgICBzdHJldGNoU2xpZGVyOiAhIXN0YXRlT2JqLmF0dHJpYnV0ZXMuc3RyZXRjaF9zbGlkZXIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0aWVzKG9iaik7XG4gICAgaWYgKHN0YXRlT2JqKSB7XG4gICAgICB0aGlzLl93YWl0Rm9yTGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgaXNPbihzdGF0ZU9iaiwgbmFtZU9uKSB7XG4gICAgcmV0dXJuIHN0YXRlT2JqICYmICghbmFtZU9uIHx8IHN0YXRlT2JqLnN0YXRlID09PSBuYW1lT24pO1xuICB9XG5cbiAgc3RvcFByb3BhZ2F0aW9uKGV2KSB7XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc3RhdGUtY2FyZC13aXRoLXNsaWRlcicsIFN0YXRlQ2FyZFdpdGhTbGlkZXIpO1xuIiwiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzJztcbmltcG9ydCBDdWlCYXNlRWxlbWVudCBmcm9tICcuL2N1aS1iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0ICcuL2R5bmFtaWMtd2l0aC1leHRyYS5qcyc7XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgU3RhdGVDYXJkV2l0aG91dFNsaWRlciBleHRlbmRzIEN1aUJhc2VFbGVtZW50IHtcbiAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICA8c3R5bGUgaXM9XCJjdXN0b20tc3R5bGVcIiBpbmNsdWRlPVwiaXJvbi1mbGV4IGlyb24tZmxleC1hbGlnbm1lbnRcIj48L3N0eWxlPlxuICAgIDxzdHlsZT5cbiAgICAgICNjb250YWluZXIge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cblxuICAgIDxkaXYgaWQ9J2NvbnRhaW5lcicgY2xhc3M9J2hvcml6b250YWwgbGF5b3V0IGp1c3RpZmllZCc+XG4gICAgICA8c3RhdGUtaW5mb1xuICAgICAgICAgIGNsYXNzPSdzdGF0ZS1pbmZvJ1xuICAgICAgICAgIHN0YXRlLW9iaj0nW1tzdGF0ZU9ial1dJ1xuICAgICAgICAgIGluLWRpYWxvZz0nW1tzaG93TGFzdENoYW5nZWQoc3RhdGVPYmosIGluRGlhbG9nLCBleHRyYSldXSdcbiAgICAgICAgICBzZWNvbmRhcnktbGluZSQ9J1tbaGFzRXh0cmEoZXh0cmEpXV0nPlxuICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1yZXBlYXQnIGl0ZW1zPSdbW2V4dHJhXV0nPlxuICAgICAgICAgIDxkaXY+W1tpdGVtXV08L2Rpdj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvc3RhdGUtaW5mbz5cbiAgICAgIDxkeW5hbWljLXdpdGgtZXh0cmFcbiAgICAgICAgICBoYXNzPSdbW2hhc3NdXSdcbiAgICAgICAgICBzdGF0ZS1vYmo9J1tbc3RhdGVPYmpdXSdcbiAgICAgICAgICBjb250cm9sLWVsZW1lbnQ9J1tbY29udHJvbEVsZW1lbnRdXSdcbiAgICAgICAgICBpbi1kaWFsb2c9J1tbaW5EaWFsb2ddXSc+XG4gICAgICA8L2R5bmFtaWMtd2l0aC1leHRyYT5cbiAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3N0YXRlLWNhcmQtd2l0aG91dC1zbGlkZXInLCBTdGF0ZUNhcmRXaXRob3V0U2xpZGVyKTtcbiIsIi8vIFBvbHltZXIgbGVnYWN5IGV2ZW50IGhlbHBlcnMgdXNlZCBjb3VydGVzeSBvZiB0aGUgUG9seW1lciBwcm9qZWN0LlxuLy9cbi8vIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuLy8gbWV0OlxuLy9cbi8vICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbi8vICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuLy8gZGlzdHJpYnV0aW9uLlxuLy8gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4vLyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Jcbi8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbi8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5cbmV4cG9ydCBkZWZhdWx0IChzdXBlckNsYXNzKSA9PiB7XG4gIC8qKlxuICAgKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICAgKi9cbiAgY2xhc3MgRXZlbnRzTWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggYW4gb3B0aW9uYWwgZGV0YWlsIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgTmFtZSBvZiBldmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSB7Kj19IGRldGFpbCBEZXRhaWwgdmFsdWUgY29udGFpbmluZyBldmVudC1zcGVjaWZpY1xuICAgICAqICAgcGF5bG9hZC5cbiAgICAgKiBAcGFyYW0ge3sgYnViYmxlczogKGJvb2xlYW58dW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogKGJvb2xlYW58dW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgY29tcG9zZWQ6IChib29sZWFufHVuZGVmaW5lZCkgfT19XG4gICAgICogIG9wdGlvbnMgT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucy4gIFRoZXNlIG1heSBpbmNsdWRlOlxuICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksXG4gICAgICogIGBjYW5jZWxhYmxlYCAoYm9vbGVhbiwgZGVmYXVsdHMgdG8gZmFsc2UpLCBhbmRcbiAgICAgKiAgYG5vZGVgIG9uIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50IChIVE1MRWxlbWVudCwgZGVmYXVsdHMgdG8gYHRoaXNgKS5cbiAgICAgKiBAcmV0dXJuIHtFdmVudH0gVGhlIG5ldyBldmVudCB0aGF0IHdhcyBmaXJlZC5cbiAgICAgKi9cbiAgICBmaXJlKHR5cGUsIGRldGFpbCA9IHt9LCBvcHRpb25zID0ge30pIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHtcbiAgICAgICAgYnViYmxlczogb3B0aW9ucy5idWJibGVzID09PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0aW9ucy5idWJibGVzLFxuICAgICAgICBjYW5jZWxhYmxlOiBCb29sZWFuKG9wdGlvbnMuY2FuY2VsYWJsZSksXG4gICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0aW9ucy5jb21wb3NlZCxcbiAgICAgIH0pO1xuICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsO1xuICAgICAgY29uc3Qgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCB0aGlzO1xuICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEV2ZW50c01peGluO1xufTtcbiIsImltcG9ydCBhcHBseVRoZW1lc09uRWxlbWVudCBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZG9tL2FwcGx5X3RoZW1lc19vbl9lbGVtZW50LmpzJztcbmltcG9ydCBjb21wdXRlU3RhdGVEb21haW4gZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jb21wdXRlX3N0YXRlX2RvbWFpbi5qcyc7XG5pbXBvcnQgZ2V0Vmlld0VudGl0aWVzIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9lbnRpdHkvZ2V0X3ZpZXdfZW50aXRpZXMuanMnO1xuXG5pbXBvcnQgJy4uL2VsZW1lbnRzL2hhLWNvbmZpZy1jdXN0b20tdWkuanMnO1xuaW1wb3J0IFZFUlNJT04gZnJvbSAnLi92ZXJzaW9uLmpzJztcblxud2luZG93LmN1c3RvbVVJID0gd2luZG93LmN1c3RvbVVJIHx8IHtcbiAgU1VQUE9SVEVEX1NMSURFUl9NT0RFUzogW1xuICAgICdzaW5nbGUtbGluZScsICdicmVhay1zbGlkZXInLCAnYnJlYWstc2xpZGVyLXRvZ2dsZScsICdoaWRlLXNsaWRlcicsICduby1zbGlkZXInLFxuICBdLFxuXG4gIGRvbUhvc3QoZWxlbSkge1xuICAgIGlmIChlbGVtID09PSBkb2N1bWVudCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW0uZ2V0Um9vdE5vZGUoKTtcbiAgICByZXR1cm4gKHJvb3QgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSA/IC8qKiBAdHlwZSB7U2hhZG93Um9vdH0gKi8gKHJvb3QpLmhvc3QgOiByb290O1xuICB9LFxuXG4gIGxpZ2h0T3JTaGFkb3coZWxlbSwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gZWxlbS5zaGFkb3dSb290ID9cbiAgICAgIGVsZW0uc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSA6XG4gICAgICBlbGVtLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9LFxuXG4gIGdldEVsZW1lbnRIaWVyYXJjaHkocm9vdCwgaGllcmFyY2h5KSB7XG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGVsZW0gPSBoaWVyYXJjaHkuc2hpZnQoKTtcbiAgICBpZiAoZWxlbSkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KFxuICAgICAgICB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhyb290LCBlbGVtKSwgaGllcmFyY2h5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0sXG5cbiAgZ2V0Q29udGV4dChlbGVtKSB7XG4gICAgaWYgKGVsZW0uX2NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxlbS5fY29udGV4dCA9IFtdO1xuICAgICAgZm9yIChsZXQgZWxlbWVudCA9IChlbGVtLnRhZ05hbWUgPT09ICdIQS1FTlRJVElFUy1DQVJEJyA/IHdpbmRvdy5jdXN0b21VSS5kb21Ib3N0KGVsZW0pIDogZWxlbSk7XG4gICAgICAgIGVsZW1lbnQ7IGVsZW1lbnQgPSB3aW5kb3cuY3VzdG9tVUkuZG9tSG9zdChlbGVtZW50KSkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudGFnTmFtZSkge1xuICAgICAgICAgIGNhc2UgJ0hBLUVOVElUSUVTLUNBUkQnOlxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ3JvdXBFbnRpdHkpIHtcbiAgICAgICAgICAgICAgZWxlbS5fY29udGV4dC5wdXNoKGVsZW1lbnQuZ3JvdXBFbnRpdHkuZW50aXR5X2lkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ncm91cEVudGl0eSA9PT0gZmFsc2UgJiYgZWxlbWVudC5zdGF0ZXMgJiYgZWxlbWVudC5zdGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGVsZW0uX2NvbnRleHQucHVzaChgZ3JvdXAuJHtjb21wdXRlU3RhdGVEb21haW4oZWxlbWVudC5zdGF0ZXNbMF0pfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnTU9SRS1JTkZPLUdST1VQJzpcbiAgICAgICAgICBjYXNlICdTVEFURS1DQVJELUNPTlRFTlQnOlxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdGVPYmopIHtcbiAgICAgICAgICAgICAgZWxlbS5fY29udGV4dC5wdXNoKGVsZW1lbnQuc3RhdGVPYmouZW50aXR5X2lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0hBLUNBUkRTJzpcbiAgICAgICAgICAgIGVsZW0uX2NvbnRleHQucHVzaChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS12aWV3JykgfHwgJ2RlZmF1bHRfdmlldycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gbm8gZGVmYXVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbGVtLl9jb250ZXh0LnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW0uX2NvbnRleHQ7XG4gIH0sXG5cbiAgZmluZE1hdGNoKGtleSwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIG51bGw7XG4gICAgaWYgKG9wdGlvbnNba2V5XSkgcmV0dXJuIGtleTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob3B0aW9ucykuZmluZChvcHRpb24gPT4ga2V5Lm1hdGNoKGBeJHtvcHRpb259JGApKTtcbiAgfSxcblxuICBtYXliZUNoYW5nZU9iamVjdEJ5RGV2aWNlKHN0YXRlT2JqKSB7XG4gICAgY29uc3QgbmFtZSA9IHdpbmRvdy5jdXN0b21VSS5nZXROYW1lKCk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gc3RhdGVPYmo7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmZpbmRNYXRjaChuYW1lLCBzdGF0ZU9iai5hdHRyaWJ1dGVzLmRldmljZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIHN0YXRlT2JqO1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZU9iai5hdHRyaWJ1dGVzLmRldmljZVttYXRjaF0pO1xuXG4gICAgaWYgKCFPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5sZW5ndGgpIHJldHVybiBzdGF0ZU9iajtcbiAgICByZXR1cm4gd2luZG93LmN1c3RvbVVJLmFwcGx5QXR0cmlidXRlcyhzdGF0ZU9iaiwgYXR0cmlidXRlcyk7XG4gIH0sXG5cbiAgbWF5YmVDaGFuZ2VPYmplY3RCeUdyb3VwKGVsZW0sIHN0YXRlT2JqKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHdpbmRvdy5jdXN0b21VSS5nZXRDb250ZXh0KGVsZW0pO1xuICAgIGlmICghY29udGV4dCkgcmV0dXJuIHN0YXRlT2JqO1xuXG4gICAgaWYgKCFzdGF0ZU9iai5hdHRyaWJ1dGVzLmdyb3VwKSB7XG4gICAgICByZXR1cm4gc3RhdGVPYmo7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICBjb250ZXh0LmZvckVhY2goKGMpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5maW5kTWF0Y2goYywgc3RhdGVPYmouYXR0cmlidXRlcy5ncm91cCk7XG4gICAgICBpZiAoc3RhdGVPYmouYXR0cmlidXRlcy5ncm91cFttYXRjaF0pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCBzdGF0ZU9iai5hdHRyaWJ1dGVzLmdyb3VwW21hdGNoXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIU9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmxlbmd0aCkgcmV0dXJuIHN0YXRlT2JqO1xuXG4gICAgcmV0dXJuIHdpbmRvdy5jdXN0b21VSS5hcHBseUF0dHJpYnV0ZXMoc3RhdGVPYmosIGF0dHJpYnV0ZXMpO1xuICB9LFxuXG4gIF9zZXRLZWVwKG9iaiwgdmFsdWUpIHtcbiAgICBpZiAob2JqLl9jdWlfa2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYmouX2N1aV9rZWVwID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iai5fY3VpX2tlZXAgPSBvYmouX2N1aV9rZWVwICYmIHZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBtYXliZUFwcGx5VGVtcGxhdGVBdHRyaWJ1dGVzKGhhc3MsIHN0YXRlcywgc3RhdGVPYmosIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZXMudGVtcGxhdGVzKSB7XG4gICAgICB3aW5kb3cuY3VzdG9tVUkuX3NldEtlZXAoc3RhdGVPYmosIHRydWUpO1xuICAgICAgcmV0dXJuIHN0YXRlT2JqO1xuICAgIH1cbiAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0ge307XG4gICAgbGV0IGhhc0dsb2JhbCA9IGZhbHNlO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcy50ZW1wbGF0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBhdHRyaWJ1dGVzLnRlbXBsYXRlc1trZXldO1xuICAgICAgaWYgKHRlbXBsYXRlLm1hdGNoKC9cXGIoZW50aXRpZXN8aGFzcylcXGIvKSkge1xuICAgICAgICBoYXNHbG9iYWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSB3aW5kb3cuY3VzdG9tVUkuY29tcHV0ZVRlbXBsYXRlKFxuICAgICAgICB0ZW1wbGF0ZSwgaGFzcywgc3RhdGVzLCBzdGF0ZU9iaiwgYXR0cmlidXRlcyxcbiAgICAgICAgKHN0YXRlT2JqLnVudGVtcGxhdGVkX2F0dHJpYnV0ZXMgJiYgc3RhdGVPYmoudW50ZW1wbGF0ZWRfYXR0cmlidXRlc1trZXldKSB8fFxuICAgICAgICAgICAgYXR0cmlidXRlc1trZXldLFxuICAgICAgICBzdGF0ZU9iai51bnRlbXBsYXRlZF9zdGF0ZSB8fCBzdGF0ZU9iai5zdGF0ZSk7XG4gICAgICAvLyBJbiBjYXNlIG9mIG51bGwgZG9uJ3Qgc2V0IHRoZSB2YWx1ZS5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgbmV3QXR0cmlidXRlc1trZXldID0gdmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gc3RhdGVPYmouc3RhdGUpIHtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdfc3RhdGVEaXNwbGF5Jykge1xuICAgICAgICBpZiAodmFsdWUgIT09IHN0YXRlT2JqLl9zdGF0ZURpc3BsYXkpIHtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gYXR0cmlidXRlc1trZXldKSB7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5jdXN0b21VSS5fc2V0S2VlcChzdGF0ZU9iaiwgIWhhc0dsb2JhbCk7XG4gICAgaWYgKCFoYXNDaGFuZ2VzKSB7XG4gICAgICByZXR1cm4gc3RhdGVPYmo7XG4gICAgfVxuICAgIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzID09PSBhdHRyaWJ1dGVzKSB7XG4gICAgICAvLyBXZSBhcmUgb3BlcmF0aW5nIG9uIHJlYWwgYXR0cmlidXRlcy4gUmVwbGFjZSB0aGVtLlxuICAgICAgY29uc3QgcmVzdWx0ID0gd2luZG93LmN1c3RvbVVJLmFwcGx5QXR0cmlidXRlcyhzdGF0ZU9iaiwgbmV3QXR0cmlidXRlcyk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0F0dHJpYnV0ZXMsICdzdGF0ZScpKSB7XG4gICAgICAgIGlmIChuZXdBdHRyaWJ1dGVzLnN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0LnN0YXRlID0gU3RyaW5nKG5ld0F0dHJpYnV0ZXMuc3RhdGUpO1xuICAgICAgICAgIHJlc3VsdC51bnRlbXBsYXRlZF9zdGF0ZSA9IHN0YXRlT2JqLnN0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0F0dHJpYnV0ZXMsICdfc3RhdGVEaXNwbGF5JykpIHtcbiAgICAgICAgcmVzdWx0Ll9zdGF0ZURpc3BsYXkgPSBuZXdBdHRyaWJ1dGVzLl9zdGF0ZURpc3BsYXk7XG4gICAgICAgIHJlc3VsdC51bnRlbXBsYXRlZF9zdGF0ZURpc3BsYXkgPSBzdGF0ZU9iai5fc3RhdGVEaXNwbGF5O1xuICAgICAgfVxuICAgICAgd2luZG93LmN1c3RvbVVJLl9zZXRLZWVwKHJlc3VsdCwgIWhhc0dsb2JhbCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBPcGVyYXRpbmcgb24gY29udGV4dC1hd2FyZSBhdHRyaWJ1dGVzLiBSZXR1cm4gc2hhbGxvdyBjb3B5IG9mIG9iamVjdC5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGVPYmopO1xuICB9LFxuXG4gIG1heWJlQXBwbHlUZW1wbGF0ZXMoaGFzcywgc3RhdGVzLCBzdGF0ZU9iaikge1xuICAgIGNvbnN0IG5ld1Jlc3VsdCA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUFwcGx5VGVtcGxhdGVBdHRyaWJ1dGVzKFxuICAgICAgaGFzcywgc3RhdGVzLCBzdGF0ZU9iaiwgc3RhdGVPYmouYXR0cmlidXRlcyk7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSAobmV3UmVzdWx0ICE9PSBzdGF0ZU9iaik7XG5cbiAgICBmdW5jdGlvbiBjaGVja0F0dHJpYnV0ZXMob2JqKSB7XG4gICAgICBpZiAoIW9iaikgcmV0dXJuO1xuICAgICAgT2JqZWN0LnZhbHVlcyhvYmopLmZvckVhY2goKGF0dHJpYnV0ZXMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gd2luZG93LmN1c3RvbVVJLm1heWJlQXBwbHlUZW1wbGF0ZUF0dHJpYnV0ZXMoXG4gICAgICAgICAgaGFzcywgc3RhdGVzLCBuZXdSZXN1bHQsIGF0dHJpYnV0ZXMpO1xuICAgICAgICBoYXNDaGFuZ2VzIHw9IChyZXN1bHQgIT09IG5ld1Jlc3VsdCk7XG4gICAgICB9KTtcbiAgICAgIGNoZWNrQXR0cmlidXRlcyhvYmouZGV2aWNlKTtcbiAgICAgIGNoZWNrQXR0cmlidXRlcyhvYmouZ3JvdXApO1xuICAgIH1cblxuICAgIGNoZWNrQXR0cmlidXRlcyhzdGF0ZU9iai5hdHRyaWJ1dGVzLmRldmljZSk7XG4gICAgY2hlY2tBdHRyaWJ1dGVzKHN0YXRlT2JqLmF0dHJpYnV0ZXMuZ3JvdXApO1xuICAgIGlmIChuZXdSZXN1bHQgIT09IHN0YXRlT2JqKSByZXR1cm4gbmV3UmVzdWx0O1xuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGVPYmopO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGVPYmo7XG4gIH0sXG5cbiAgYXBwbHlBdHRyaWJ1dGVzKHN0YXRlT2JqLCBhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eV9pZDogc3RhdGVPYmouZW50aXR5X2lkLFxuICAgICAgc3RhdGU6IHN0YXRlT2JqLnN0YXRlLFxuICAgICAgYXR0cmlidXRlczogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGVPYmouYXR0cmlidXRlcywgYXR0cmlidXRlcyksXG4gICAgICB1bnRlbXBsYXRlZF9hdHRyaWJ1dGVzOiBzdGF0ZU9iai5hdHRyaWJ1dGVzLFxuICAgICAgbGFzdF9jaGFuZ2VkOiBzdGF0ZU9iai5sYXN0X2NoYW5nZWQsXG4gICAgfTtcbiAgfSxcblxuICBtYXliZUNoYW5nZU9iamVjdChlbGVtLCBzdGF0ZU9iaiwgaW5EaWFsb2csIGFsbG93SGlkZGVuKSB7XG4gICAgaWYgKGluRGlhbG9nKSByZXR1cm4gc3RhdGVPYmo7XG4gICAgbGV0IG9iaiA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdEJ5RGV2aWNlKHN0YXRlT2JqKTtcbiAgICBvYmogPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3RCeUdyb3VwKGVsZW0sIG9iaik7XG4gICAgb2JqID0gd2luZG93LmN1c3RvbVVJLm1heWJlQXBwbHlUZW1wbGF0ZUF0dHJpYnV0ZXMoXG4gICAgICBlbGVtLmhhc3MsIGVsZW0uaGFzcy5zdGF0ZXMsIG9iaiwgb2JqLmF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKG9iaiAhPT0gc3RhdGVPYmogJiYgb2JqLmF0dHJpYnV0ZXMuaGlkZGVuICYmIGFsbG93SGlkZGVuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcblxuICBmaXhHcm91cFRpdGxlcygpIHtcbiAgICBjb25zdCBob21lQXNzaXN0YW50TWFpbiA9IHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KGRvY3VtZW50LCBbXG4gICAgICAnaG9tZS1hc3Npc3RhbnQnLFxuICAgICAgJ2hvbWUtYXNzaXN0YW50LW1haW4nXSk7XG4gICAgaWYgKGhvbWVBc3Npc3RhbnRNYWluID09PSBudWxsKSB7XG4gICAgICAvLyBET00gbm90IHJlYWR5LiBXYWl0IDEgc2Vjb25kLlxuICAgICAgd2luZG93LnNldFRpbWVvdXQod2luZG93LmN1c3RvbVVJLmZpeEdyb3VwVGl0bGVzLCAxMDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYUNhcmRzID0gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoaG9tZUFzc2lzdGFudE1haW4sIFtcbiAgICAgICdwYXJ0aWFsLWNhcmRzJyxcbiAgICAgICdoYS1jYXJkc1t2aWV3LXZpc2libGVdJ10pO1xuICAgIGlmIChoYUNhcmRzID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgbWFpbiA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGhhQ2FyZHMsICcubWFpbicpIHx8IGhhQ2FyZHMuJC5tYWluO1xuICAgIGNvbnN0IGNhcmRzID0gbWFpbi5xdWVyeVNlbGVjdG9yQWxsKCdoYS1lbnRpdGllcy1jYXJkJyk7XG4gICAgY2FyZHMuZm9yRWFjaCgoY2FyZCkgPT4ge1xuICAgICAgaWYgKGNhcmQuZ3JvdXBFbnRpdHkpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gd2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0KFxuICAgICAgICAgIGNhcmQsXG4gICAgICAgICAgY2FyZC5ncm91cEVudGl0eSxcbiAgICAgICAgICBmYWxzZSAvKiBpbkRpYWxvZyAqLyxcbiAgICAgICAgICBmYWxzZSAvKiBhbGxvd0hpZGRlbiAqLyk7XG4gICAgICAgIGlmIChvYmogIT09IGNhcmQuZ3JvdXBFbnRpdHkgJiYgb2JqLmF0dHJpYnV0ZXMuZnJpZW5kbHlfbmFtZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWVFbGVtID0gd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3coY2FyZCwgJy5uYW1lJyk7XG4gICAgICAgICAgbmFtZUVsZW0udGV4dENvbnRlbnQgPSBvYmouYXR0cmlidXRlcy5mcmllbmRseV9uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgY29udHJvbENvbHVtbnMoY29sdW1ucykge1xuICAgIGNvbnN0IHBhcnRpYWxDYXJkcyA9IHdpbmRvdy5jdXN0b21VSS5nZXRFbGVtZW50SGllcmFyY2h5KGRvY3VtZW50LCBbXG4gICAgICAnaG9tZS1hc3Npc3RhbnQnLFxuICAgICAgJ2hvbWUtYXNzaXN0YW50LW1haW4nLFxuICAgICAgJ3BhcnRpYWwtY2FyZHMnXSk7XG4gICAgaWYgKHBhcnRpYWxDYXJkcyA9PT0gbnVsbCkge1xuICAgICAgLy8gRE9NIG5vdCByZWFkeS4gV2FpdCAxIHNlY29uZC5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICB3aW5kb3cuY3VzdG9tVUkuY29udHJvbENvbHVtbnMuYmluZChudWxsLCBjb2x1bW5zKSxcbiAgICAgICAgMTAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBhcnRpYWxDYXJkcy5tcWxzLmZvckVhY2goKG1xbCkgPT4ge1xuICAgICAgbXFsLnJlbW92ZUxpc3RlbmVyKHBhcnRpYWxDYXJkcy5oYW5kbGVXaW5kb3dDaGFuZ2UpO1xuICAgIH0pO1xuICAgIHBhcnRpYWxDYXJkcy5tcWxzID0gY29sdW1ucy5tYXAoKHdpZHRoKSA9PiB7XG4gICAgICBjb25zdCBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1pbi13aWR0aDogJHt3aWR0aH1weClgKTtcbiAgICAgIG1xbC5hZGRMaXN0ZW5lcihwYXJ0aWFsQ2FyZHMuaGFuZGxlV2luZG93Q2hhbmdlKTtcbiAgICAgIHJldHVybiBtcWw7XG4gICAgfSk7XG4gICAgcGFydGlhbENhcmRzLmhhbmRsZVdpbmRvd0NoYW5nZSgpO1xuICB9LFxuXG4gIHVzZUN1c3RvbWl6ZXIoKSB7XG4gICAgY29uc3QgbWFpbiA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGRvY3VtZW50LCAnaG9tZS1hc3Npc3RhbnQnKTtcbiAgICBjb25zdCBjdXN0b21pemVyID0gbWFpbi5oYXNzLnN0YXRlc1snY3VzdG9taXplci5jdXN0b21pemVyJ107XG4gICAgaWYgKCFjdXN0b21pemVyKSByZXR1cm47XG4gICAgaWYgKGN1c3RvbWl6ZXIuYXR0cmlidXRlcy5jb2x1bW5zKSB7XG4gICAgICB3aW5kb3cuY3VzdG9tVUkuY29udHJvbENvbHVtbnMoY3VzdG9taXplci5hdHRyaWJ1dGVzLmNvbHVtbnMpO1xuICAgIH1cbiAgICBpZiAoY3VzdG9taXplci5hdHRyaWJ1dGVzLmhpZGVfYXR0cmlidXRlcykge1xuICAgICAgLy8gVE9ETzogV29uJ3Qgd29ya2luZyBzdGFydGluZyBmcm9tIEhBIDAuNzFcbiAgICAgIGlmICh3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwgJiYgd2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMpIHtcbiAgICAgICAgY3VzdG9taXplci5hdHRyaWJ1dGVzLmhpZGVfYXR0cmlidXRlcy5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgICB3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFUywgYXR0cikpIHtcbiAgICAgICAgICAgIHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTW2F0dHJdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHVwZGF0ZUF0dHJpYnV0ZXMoKSB7XG4gICAgaWYgKCF3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwpIHtcbiAgICAgIC8vIEFwcC5qcyB3YXNuJ3QgcGFyc2VkIHlldC5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHdpbmRvdy5jdXN0b21VSS51cGRhdGVBdHRyaWJ1dGVzLCAxMDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21VaUF0dHJpYnV0ZXMgPSB7XG4gICAgICBncm91cDogdW5kZWZpbmVkLFxuICAgICAgZGV2aWNlOiB1bmRlZmluZWQsXG4gICAgICB0ZW1wbGF0ZXM6IHVuZGVmaW5lZCxcbiAgICAgIHN0YXRlX2NhcmRfbW9kZToge1xuICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbGlnaHQ6IHdpbmRvdy5jdXN0b21VSS5TVVBQT1JURURfU0xJREVSX01PREVTLmNvbmNhdCgnYmFkZ2VzJyksXG4gICAgICAgICAgY292ZXI6IHdpbmRvdy5jdXN0b21VSS5TVVBQT1JURURfU0xJREVSX01PREVTLmNvbmNhdCgnYmFkZ2VzJyksXG4gICAgICAgICAgJyonOiBbJ2JhZGdlcyddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXRlX2NhcmRfY3VzdG9tX3VpX3NlY29uZGFyeTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgYmFkZ2VzX2xpc3Q6IHsgdHlwZTogJ2pzb24nIH0sXG4gICAgICBzaG93X2xhc3RfY2hhbmdlZDogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgIGhpZGVfY29udHJvbDogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgIGV4dHJhX2RhdGFfdGVtcGxhdGU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIGV4dHJhX2JhZGdlOiB7IHR5cGU6ICdqc29uJyB9LFxuICAgICAgc3RyZXRjaF9zbGlkZXI6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICBzbGlkZXJfdGhlbWU6IHsgdHlwZTogJ2pzb24nIH0sXG4gICAgICB0aGVtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgY29uZmlybV9jb250cm9sczogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgIGNvbmZpcm1fY29udHJvbHNfc2hvd19sb2NrOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgaGlkZV9pbl9kZWZhdWx0X3ZpZXc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgfTtcbiAgICBpZiAod2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24od2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMsIGN1c3RvbVVpQXR0cmlidXRlcyk7XG4gICAgfVxuICB9LFxuXG4gIHVwZGF0ZUNvbmZpZ1BhbmVsKCkge1xuICAgIGlmICghd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9jb25maWcnKSkgcmV0dXJuO1xuICAgIGNvbnN0IGhhUGFuZWxDb25maWcgPSB3aW5kb3cuY3VzdG9tVUkuZ2V0RWxlbWVudEhpZXJhcmNoeShkb2N1bWVudCwgW1xuICAgICAgJ2hvbWUtYXNzaXN0YW50JyxcbiAgICAgICdob21lLWFzc2lzdGFudC1tYWluJyxcbiAgICAgICdwYXJ0aWFsLXBhbmVsLXJlc29sdmVyJyxcbiAgICAgICdoYS1wYW5lbC1jb25maWcnXSk7XG4gICAgaWYgKCFoYVBhbmVsQ29uZmlnKSB7XG4gICAgICAvLyBET00gbm90IHJlYWR5LiBXYWl0IDEwMG1zLlxuICAgICAgd2luZG93LnNldFRpbWVvdXQod2luZG93LmN1c3RvbVVJLnVwZGF0ZUNvbmZpZ1BhbmVsLCAxMDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoYUNvbmZpZ05hdmlnYXRpb24gPSB3aW5kb3cuY3VzdG9tVUkuZ2V0RWxlbWVudEhpZXJhcmNoeShoYVBhbmVsQ29uZmlnLCBbXG4gICAgICAnaGEtY29uZmlnLWRhc2hib2FyZCcsXG4gICAgICAnaGEtY29uZmlnLW5hdmlnYXRpb24nXSk7XG4gICAgaWYgKGhhQ29uZmlnTmF2aWdhdGlvbikge1xuICAgICAgLy8gSGFDb25maWdOYXZpZ2F0aW9uIHN0YXJ0ZWQgdXNpbmcgbG9jYWxpemUgb24gMjEuMDEuMjAxOFxuICAgICAgaWYgKGhhQ29uZmlnTmF2aWdhdGlvbi5sb2NhbGl6ZSAmJiAhaGFDb25maWdOYXZpZ2F0aW9uLmN1aVBhdGNoKSB7XG4gICAgICAgIGhhQ29uZmlnTmF2aWdhdGlvbi5jdWlQYXRjaCA9IHRydWU7XG4gICAgICAgIGhhQ29uZmlnTmF2aWdhdGlvbi5fb3JpZ2luYWxDb21wdXRlTG9hZGVkID0gaGFDb25maWdOYXZpZ2F0aW9uLl9jb21wdXRlTG9hZGVkO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX29yaWdpbmFsQ29tcHV0ZUNhcHRpb24gPSBoYUNvbmZpZ05hdmlnYXRpb24uX2NvbXB1dGVDYXB0aW9uO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX29yaWdpbmFsQ29tcHV0ZURlc2NyaXB0aW9uID0gaGFDb25maWdOYXZpZ2F0aW9uLl9jb21wdXRlRGVzY3JpcHRpb247XG4gICAgICAgIGhhQ29uZmlnTmF2aWdhdGlvbi5fY29tcHV0ZUxvYWRlZCA9IChoYXNzLCBwYWdlKSA9PlxuICAgICAgICAgIHBhZ2UgPT09ICdjdXN0b211aScgfHwgaGFDb25maWdOYXZpZ2F0aW9uLl9vcmlnaW5hbENvbXB1dGVMb2FkZWQoaGFzcywgcGFnZSk7XG4gICAgICAgIGhhQ29uZmlnTmF2aWdhdGlvbi5fY29tcHV0ZUNhcHRpb24gPSAocGFnZSwgbG9jYWxpemUpID0+XG4gICAgICAgICAgKHBhZ2UgPT09ICdjdXN0b211aScgPyAnQ3VzdG9tIFVJJyA6IGhhQ29uZmlnTmF2aWdhdGlvbi5fb3JpZ2luYWxDb21wdXRlQ2FwdGlvbihwYWdlLCBsb2NhbGl6ZSkpO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX2NvbXB1dGVEZXNjcmlwdGlvbiA9IChwYWdlLCBsb2NhbGl6ZSkgPT5cbiAgICAgICAgICAocGFnZSA9PT0gJ2N1c3RvbXVpJyA/ICdTZXRVSSB0d2Vha3MnIDogaGFDb25maWdOYXZpZ2F0aW9uLl9vcmlnaW5hbENvbXB1dGVEZXNjcmlwdGlvbihwYWdlLCBsb2NhbGl6ZSkpO1xuICAgICAgfVxuICAgICAgaWYgKCFoYUNvbmZpZ05hdmlnYXRpb24ucGFnZXMuc29tZShjb25mID0+IGNvbmYgPT09ICdjdXN0b211aScgfHwgY29uZi5kb21haW4gPT09ICdjdXN0b211aScpKSB7XG4gICAgICAgIGhhQ29uZmlnTmF2aWdhdGlvbi5wdXNoKCdwYWdlcycsIGhhQ29uZmlnTmF2aWdhdGlvbi5sb2NhbGl6ZSA/ICdjdXN0b211aScgOiB7XG4gICAgICAgICAgZG9tYWluOiAnY3VzdG9tdWknLFxuICAgICAgICAgIGNhcHRpb246ICdDdXN0b20gVUknLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2V0IFVJIHR3ZWFrcy4nLFxuICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGdldEhhQ29uZmlnQ3VzdG9tVWkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBoYUNvbmZpZ0N1c3RvbVVpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaGEtY29uZmlnLWN1c3RvbS11aScpO1xuICAgICAgaGFDb25maWdDdXN0b21VaS5pc1dpZGUgPSBoYVBhbmVsQ29uZmlnLmlzV2lkZTtcbiAgICAgIGhhQ29uZmlnQ3VzdG9tVWkuc2V0QXR0cmlidXRlKCdwYWdlLW5hbWUnLCAnY3VzdG9tdWknKTtcbiAgICAgIHJldHVybiBoYUNvbmZpZ0N1c3RvbVVpO1xuICAgIH07XG5cbiAgICBjb25zdCBpcm9uUGFnZXMgPSB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhoYVBhbmVsQ29uZmlnLCAnaXJvbi1wYWdlcycpO1xuICAgIGlmIChpcm9uUGFnZXMpIHtcbiAgICAgIGlmIChpcm9uUGFnZXMubGFzdEVsZW1lbnRDaGlsZC50YWdOYW1lICE9PSAnSEEtQ09ORklHLUNVU1RPTS1VSScpIHtcbiAgICAgICAgY29uc3QgaGFDb25maWdDdXN0b21VaSA9IGdldEhhQ29uZmlnQ3VzdG9tVWkoKTtcbiAgICAgICAgaXJvblBhZ2VzLmFwcGVuZENoaWxkKGhhQ29uZmlnQ3VzdG9tVWkpO1xuICAgICAgICBpcm9uUGFnZXMuYWRkRXZlbnRMaXN0ZW5lcignaXJvbi1pdGVtcy1jaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2NvbmZpZy9jdXN0b211aScpKSB7XG4gICAgICAgICAgICBpcm9uUGFnZXMuc2VsZWN0KCdjdXN0b211aScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBoYVBhbmVsQ29uZmlnLnNoYWRvd1Jvb3QgfHwgaGFQYW5lbENvbmZpZztcbiAgICAgIGlmIChyb290Lmxhc3RFbGVtZW50Q2hpbGQudGFnTmFtZSAhPT0gJ0hBLUNPTkZJRy1DVVNUT00tVUknKSB7XG4gICAgICAgIGNvbnN0IGhhQ29uZmlnQ3VzdG9tVWkgPSBnZXRIYUNvbmZpZ0N1c3RvbVVpKCk7XG4gICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoaGFDb25maWdDdXN0b21VaSk7XG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9jb25maWcvY3VzdG9tdWknKTtcbiAgICAgIHJvb3QubGFzdEVsZW1lbnRDaGlsZC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICAgIH1cbiAgfSxcblxuICBpbnN0YWxsU3RhdGVzSG9vaygpIHtcbiAgICBjb25zdCBob21lQXNzaXN0YW50ID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdob21lLWFzc2lzdGFudCcpO1xuICAgIGlmICghaG9tZUFzc2lzdGFudCB8fCAhaG9tZUFzc2lzdGFudC5wcm90b3R5cGUuX3VwZGF0ZUhhc3MpIHJldHVybjtcbiAgICBjb25zdCBvcmlnaW5hbFVwZGF0ZSA9IGhvbWVBc3Npc3RhbnQucHJvdG90eXBlLl91cGRhdGVIYXNzO1xuICAgIGhvbWVBc3Npc3RhbnQucHJvdG90eXBlLl91cGRhdGVIYXNzID0gZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgLy8gVXNlIG5hbWVkIGZ1bmN0aW9uIHRvIHByZXNlcnZlICd0aGlzJy5cbiAgICAgIGNvbnN0IHsgaGFzcyB9ID0gdGhpcztcbiAgICAgIGlmIChvYmouc3RhdGVzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9iai5zdGF0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IG9iai5zdGF0ZXNba2V5XTtcbiAgICAgICAgICBpZiAoZW50aXR5Ll9jdWlfa2VlcCkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG5ld0VudGl0eSA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUFwcGx5VGVtcGxhdGVzKGhhc3MsIG9iai5zdGF0ZXMsIGVudGl0eSk7XG4gICAgICAgICAgaWYgKGhhc3Muc3RhdGVzICYmIGVudGl0eSAhPT0gaGFzcy5zdGF0ZXNba2V5XSkge1xuICAgICAgICAgICAgLy8gTmV3IHN0YXRlIGFycml2ZWQuIFB1dCBtb2RpZmllZCBzdGF0ZSBpbi5cbiAgICAgICAgICAgIG9iai5zdGF0ZXNba2V5XSA9IG5ld0VudGl0eTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVudGl0eSAhPT0gbmV3RW50aXR5KSB7XG4gICAgICAgICAgICAvLyBJdCdzIHRoZSBzYW1lIHN0YXRlIGJ1dCBjb250ZW50cyBjaGFuZ2VkIGR1ZSB0byBvdGhlciBzdGF0ZSBjaGFuZ2VzLlxuICAgICAgICAgICAgb2JqLnN0YXRlc1trZXldID0gbmV3RW50aXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFVwZGF0ZS5jYWxsKHRoaXMsIG9iaik7XG4gICAgICBpZiAob2JqLnRoZW1lcyAmJiBoYXNzLl90aGVtZVdhaXRlcnMpIHtcbiAgICAgICAgaGFzcy5fdGhlbWVXYWl0ZXJzLmZvckVhY2god2FpdGVyID0+IHdhaXRlci5zdGF0ZUNoYW5nZWQod2FpdGVyLnN0YXRlKSk7XG4gICAgICAgIGhhc3MuX3RoZW1lV2FpdGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG1haW4gPSB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhkb2N1bWVudCwgJ2hvbWUtYXNzaXN0YW50Jyk7XG4gICAgaWYgKG1haW4uaGFzcyAmJiBtYWluLmhhc3Muc3RhdGVzKSB7XG4gICAgICBtYWluLl91cGRhdGVIYXNzKHsgc3RhdGVzOiBtYWluLmhhc3Muc3RhdGVzIH0pO1xuICAgIH1cbiAgfSxcblxuICBpbnN0YWxsUGFydGlhbENhcmRzKCkge1xuICAgIGNvbnN0IHBhcnRpYWxDYXJkcyA9IGN1c3RvbUVsZW1lbnRzLmdldCgncGFydGlhbC1jYXJkcycpO1xuICAgIGlmICghcGFydGlhbENhcmRzIHx8ICFwYXJ0aWFsQ2FyZHMucHJvdG90eXBlLl9kZWZhdWx0Vmlld0ZpbHRlcikgcmV0dXJuO1xuICAgIHBhcnRpYWxDYXJkcy5wcm90b3R5cGUuX2RlZmF1bHRWaWV3RmlsdGVyID0gKGhhc3MsIGVudGl0eUlkKSA9PiB7XG4gICAgICBpZiAoaGFzcy5zdGF0ZXNbZW50aXR5SWRdLmF0dHJpYnV0ZXMuaGlkZGVuKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBleGNsdWRlcyA9IHt9O1xuICAgICAgT2JqZWN0LnZhbHVlcyhoYXNzLnN0YXRlcykuZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICAgIGlmIChlbnRpdHkuYXR0cmlidXRlcyAmJiBlbnRpdHkuYXR0cmlidXRlcy5oaWRlX2luX2RlZmF1bHRfdmlldykge1xuICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVFbnRpdHlJZCA9IGVudGl0eS5lbnRpdHlfaWQ7XG4gICAgICAgICAgaWYgKGV4Y2x1ZGVzW2V4Y2x1ZGVFbnRpdHlJZF0pIHJldHVybjtcbiAgICAgICAgICBleGNsdWRlc1tleGNsdWRlRW50aXR5SWRdID0gZW50aXR5O1xuICAgICAgICAgIGlmIChlbnRpdHkuYXR0cmlidXRlcy52aWV3KSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBleGNsdWRlcywgZ2V0Vmlld0VudGl0aWVzKGhhc3Muc3RhdGVzLCBlbnRpdHkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICFleGNsdWRlc1tlbnRpdHlJZF07XG4gICAgfTtcbiAgfSxcblxuICAvLyBBbGxvd3MgY2hhbmdpbmcgdGhlICdFeGVjdXRlJyAvICdBY3RpdmF0ZScgdGV4dCBvbiBzY3JpcHQvc2NlbmUgY2FyZHMuXG4gIGluc3RhbGxBY3Rpb25OYW1lKGVsZW1lbnROYW1lKSB7XG4gICAgY29uc3Qga2xhc3MgPSBjdXN0b21FbGVtZW50cy5nZXQoZWxlbWVudE5hbWUpO1xuICAgIGlmICgha2xhc3MgfHwgIWtsYXNzLnByb3RvdHlwZSkgcmV0dXJuO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrbGFzcy5wcm90b3R5cGUsICdsb2NhbGl6ZScsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgZnVuY3Rpb24gY3VzdG9tTG9jYWxpemUodikge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlT2JqICYmIHRoaXMuc3RhdGVPYmouYXR0cmlidXRlcyAmJlxuICAgICAgICAgICAgICB0aGlzLnN0YXRlT2JqLmF0dHJpYnV0ZXMuYWN0aW9uX25hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlT2JqLmF0dHJpYnV0ZXMuYWN0aW9uX25hbWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YS5sb2NhbGl6ZSh2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VzdG9tTG9jYWxpemU7XG4gICAgICB9LFxuICAgICAgc2V0KCkge30sXG4gICAgfSk7XG4gIH0sXG5cbiAgLy8gQWxsb3dzIHRoZW1pbmcgXCJyZWd1bGFyXCIgdG9wIGJhZGdlcy5cbiAgaW5zdGFsbEhhU3RhdGVMYWJlbEJhZGdlKCkge1xuICAgIGNvbnN0IGhhU3RhdGVMYWJlbEJhZGdlID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdoYS1zdGF0ZS1sYWJlbC1iYWRnZScpO1xuICAgIGlmICghaGFTdGF0ZUxhYmVsQmFkZ2UgfHwgIWhhU3RhdGVMYWJlbEJhZGdlLnByb3RvdHlwZS5zdGF0ZUNoYW5nZWQpIHJldHVybjtcbiAgICAvLyBVc2UgbmFtZWQgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnLlxuICAgIGhhU3RhdGVMYWJlbEJhZGdlLnByb3RvdHlwZS5zdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbiB1cGRhdGUoc3RhdGVPYmopIHtcbiAgICAgIC8vIFRPRE86IENhbGwgd2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0XG4gICAgICBpZiAoc3RhdGVPYmouYXR0cmlidXRlcy50aGVtZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNzLnRoZW1lcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuaGFzcy5fdGhlbWVXYWl0ZXJzID0gdGhpcy5oYXNzLl90aGVtZVdhaXRlcnMgfHwgW107XG4gICAgICAgICAgdGhpcy5oYXNzLl90aGVtZVdhaXRlcnMucHVzaCh0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcHBseVRoZW1lc09uRWxlbWVudChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLmhhc3MudGhlbWVzIHx8IHsgZGVmYXVsdF90aGVtZTogJ2RlZmF1bHQnLCB0aGVtZXM6IHt9IH0sXG4gICAgICAgICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzLnRoZW1lIHx8ICdkZWZhdWx0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlU3R5bGVzKCk7XG4gICAgICBpZiAodGhpcy5zdGFydEludGVydmFsKSB7XG4gICAgICAgIC8vIEFkZGVkIG9uIDE5LjEuMjAxOFxuICAgICAgICB0aGlzLnN0YXJ0SW50ZXJ2YWwoc3RhdGVPYmopO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgaW5zdGFsbFN0YXRlQmFkZ2UoKSB7XG4gICAgY29uc3Qgc3RhdGVCYWRnZSA9IGN1c3RvbUVsZW1lbnRzLmdldCgnc3RhdGUtYmFkZ2UnKTtcbiAgICBpZiAoIXN0YXRlQmFkZ2UgfHwgIXN0YXRlQmFkZ2UucHJvdG90eXBlLnVwZGF0ZUljb25BcHBlYXJhbmNlKSByZXR1cm47XG4gICAgY29uc3Qgb3JpZ2luYWxVcGRhdGVJY29uQXBwZWFyYW5jZSA9IHN0YXRlQmFkZ2UucHJvdG90eXBlLnVwZGF0ZUljb25BcHBlYXJhbmNlO1xuICAgIC8vIFVzZSBuYW1lZCBmdW5jdGlvbiB0byBwcmVzZXJ2ZSAndGhpcycuXG4gICAgc3RhdGVCYWRnZS5wcm90b3R5cGUudXBkYXRlSWNvbkFwcGVhcmFuY2UgPSBmdW5jdGlvbiBjdXN0b21VcGRhdGVJY29uQXBwZWFyYW5jZShzdGF0ZU9iaikge1xuICAgICAgaWYgKHN0YXRlT2JqLmF0dHJpYnV0ZXMuaWNvbl9jb2xvciAmJiAhc3RhdGVPYmouYXR0cmlidXRlcy5lbnRpdHlfcGljdHVyZSkge1xuICAgICAgICB0aGlzLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICcnO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuJC5pY29uLnN0eWxlLCB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZScsXG4gICAgICAgICAgY29sb3I6IHN0YXRlT2JqLmF0dHJpYnV0ZXMuaWNvbl9jb2xvcixcbiAgICAgICAgICBmaWx0ZXI6ICcnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yaWdpbmFsVXBkYXRlSWNvbkFwcGVhcmFuY2UuY2FsbCh0aGlzLCBzdGF0ZU9iaik7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICBpbnN0YWxsQ2xhc3NIb29rcygpIHtcbiAgICBpZiAod2luZG93LmN1c3RvbVVJLmNsYXNzSW5pdERvbmUpIHJldHVybjtcbiAgICB3aW5kb3cuY3VzdG9tVUkuY2xhc3NJbml0RG9uZSA9IHRydWU7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxQYXJ0aWFsQ2FyZHMoKTtcbiAgICB3aW5kb3cuY3VzdG9tVUkuaW5zdGFsbFN0YXRlc0hvb2soKTtcbiAgICB3aW5kb3cuY3VzdG9tVUkuaW5zdGFsbEhhU3RhdGVMYWJlbEJhZGdlKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxTdGF0ZUJhZGdlKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxBY3Rpb25OYW1lKCdzdGF0ZS1jYXJkLXNjZW5lJyk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxBY3Rpb25OYW1lKCdzdGF0ZS1jYXJkLXNjcmlwdCcpO1xuICAgIC8vIFRPRE86IEZpeCwgbm90IHdvcmtpbmcgc2luY2UgSEEgMC43MVxuICAgIHdpbmRvdy5jdXN0b21VSS51cGRhdGVBdHRyaWJ1dGVzKCk7XG4gIH0sXG5cbiAgaW5pdCgpIHtcbiAgICBpZiAod2luZG93LmN1c3RvbVVJLmluaXREb25lKSByZXR1cm47XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxDbGFzc0hvb2tzKCk7XG4gICAgY29uc3QgbWFpbiA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGRvY3VtZW50LCAnaG9tZS1hc3Npc3RhbnQnKTtcbiAgICBpZiAoIW1haW4uaGFzcyB8fCAhbWFpbi5oYXNzLnN0YXRlcykge1xuICAgICAgLy8gQ29ubmVjdGlvbiB3YXNuJ3QgbWFkZSB5ZXQuIFRyeSBpbiAxIHNlY29uZC5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHdpbmRvdy5jdXN0b21VSS5pbml0LCAxMDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93LmN1c3RvbVVJLmluaXREb25lID0gdHJ1ZTtcblxuICAgIHdpbmRvdy5jdXN0b21VSS51c2VDdXN0b21pemVyKCk7XG5cbiAgICB3aW5kb3cuY3VzdG9tVUkucnVuSG9va3MoKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9jYXRpb24tY2hhbmdlZCcsIHdpbmRvdy5zZXRUaW1lb3V0LmJpbmQobnVsbCwgd2luZG93LmN1c3RvbVVJLnJ1bkhvb2tzLCAxMDApKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgY29uc29sZS5sb2coYExvYWRlZCBDdXN0b21VSSAke1ZFUlNJT059YCk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgaWYgKCF3aW5kb3cuQ1VTVE9NX1VJX0xJU1QpIHtcbiAgICAgIHdpbmRvdy5DVVNUT01fVUlfTElTVCA9IFtdO1xuICAgIH1cbiAgICB3aW5kb3cuQ1VTVE9NX1VJX0xJU1QucHVzaCh7XG4gICAgICBuYW1lOiAnQ3VzdG9tVUknLFxuICAgICAgdmVyc2lvbjogVkVSU0lPTixcbiAgICAgIHVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXktZ2l0L2hvbWUtYXNzaXN0YW50LWN1c3RvbS11aScsXG4gICAgfSk7XG4gIH0sXG5cbiAgcnVuSG9va3MoKSB7XG4gICAgd2luZG93LmN1c3RvbVVJLmZpeEdyb3VwVGl0bGVzKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLnVwZGF0ZUNvbmZpZ1BhbmVsKCk7XG4gIH0sXG5cbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoYS1kZXZpY2UtbmFtZScpIHx8ICcnO1xuICB9LFxuXG4gIHNldE5hbWUobmFtZSkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGEtZGV2aWNlLW5hbWUnLCBuYW1lIHx8ICcnKTtcbiAgfSxcblxuICBjb21wdXRlVGVtcGxhdGUodGVtcGxhdGUsIGhhc3MsIGVudGl0aWVzLCBlbnRpdHksIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZSwgc3RhdGUpIHtcbiAgICBjb25zdCBmdW5jdGlvbkJvZHkgPSAodGVtcGxhdGUuaW5kZXhPZigncmV0dXJuJykgPj0gMCkgPyB0ZW1wbGF0ZSA6IGByZXR1cm4gXFxgJHt0ZW1wbGF0ZX1cXGA7YDtcbiAgICB0cnkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMgKi9cbiAgICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oXG4gICAgICAgICdoYXNzJywgJ2VudGl0aWVzJywgJ2VudGl0eScsICdhdHRyaWJ1dGVzJywgJ2F0dHJpYnV0ZScsICdzdGF0ZScsIGZ1bmN0aW9uQm9keSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldy1mdW5jICovXG4gICAgICByZXR1cm4gZnVuYyhoYXNzLCBlbnRpdGllcywgZW50aXR5LCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUsIHN0YXRlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgICBpZiAoKGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikgfHwgZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtlLm5hbWV9OiAke2UubWVzc2FnZX0gaW4gdGVtcGxhdGUgJHtmdW5jdGlvbkJvZHl9YCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfSxcbn07XG53aW5kb3cuY3VzdG9tVUkuaW5pdCgpO1xuIiwiZXhwb3J0IGRlZmF1bHQgJzIwMTgwNTI4JztcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9jb25zdC5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9hcHBseV90aGVtZXNfb25fZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2RvbS9keW5hbWljX2NvbnRlbnRfdXBkYXRlci5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jYW5fdG9nZ2xlX2RvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jYW5fdG9nZ2xlX3N0YXRlLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfZG9tYWluLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzIiwid2VicGFjazovLy8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2dldF9ncm91cF9lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9nZXRfdmlld19lbnRpdGllcy5qcyIsIndlYnBhY2s6Ly8vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9zdGF0ZV9jYXJkX3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL3V0aWwvaGFzcy1hdHRyaWJ1dGVzLXV0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2Jvb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzIiwid2VicGFjazovLy8uL3NyYy9lbGVtZW50cy9jdWktYmFzZS1lbGVtZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9lbGVtZW50cy9keW5hbWljLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL2R5bmFtaWMtd2l0aC1leHRyYS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvaGEtY29uZmlnLWN1c3RvbS11aS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvaGEtdGhlbWVkLXNsaWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWxlbWVudHMvc3RhdGUtY2FyZC1jdXN0b20tdWkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL3N0YXRlLWNhcmQtd2l0aC1zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VsZW1lbnRzL3N0YXRlLWNhcmQtd2l0aG91dC1zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21peGlucy9ldmVudHMtbWl4aW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2hhc3MtYXR0cmlidXRlLXV0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2hvb2tzLmpzIiwid2VicGFjazovLy8uL3NyYy91dGlscy92ZXJzaW9uLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfRE9NQUlOX0lDT04iLCJET01BSU5TX1dJVEhfQ0FSRCIsIkRPTUFJTlNfTU9SRV9JTkZPX05PX0hJU1RPUlkiLCJTVEFURVNfT0ZGIiwiVU5JVF9DIiwiVU5JVF9GIiwiREVGQVVMVF9WSUVXX0VOVElUWV9JRCIsImFwcGx5VGhlbWVzT25FbGVtZW50IiwiZWxlbWVudCIsInRoZW1lcyIsImxvY2FsVGhlbWUiLCJ1cGRhdGVNZXRhIiwiX3RoZW1lcyIsInRoZW1lTmFtZSIsImRlZmF1bHRfdGhlbWUiLCJzdHlsZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJ0aGVtZSIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwicHJlZml4ZWRLZXkiLCJ1cGRhdGVTdHlsZXMiLCJ3aW5kb3ciLCJTaGFkeUNTUyIsInN0eWxlU3VidHJlZSIsIm1ldGEiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJoYXNBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJ0aGVtZUNvbG9yIiwiZHluYW1pY0NvbnRlbnRVcGRhdGVyIiwicm9vdCIsIm5ld0VsZW1lbnRUYWciLCJhdHRyaWJ1dGVzIiwicm9vdEVsIiwiY3VzdG9tRWwiLCJsYXN0Q2hpbGQiLCJ0YWdOYW1lIiwicmVtb3ZlQ2hpbGQiLCJjcmVhdGVFbGVtZW50IiwidG9Mb3dlckNhc2UiLCJzZXRQcm9wZXJ0aWVzIiwicGFyZW50Tm9kZSIsImFwcGVuZENoaWxkIiwiY2FuVG9nZ2xlRG9tYWluIiwiaGFzcyIsImRvbWFpbiIsInNlcnZpY2VzIiwiY29uZmlnIiwiY2FuVG9nZ2xlU3RhdGUiLCJzdGF0ZU9iaiIsImNvbXB1dGVTdGF0ZURvbWFpbiIsInN0YXRlIiwic3VwcG9ydGVkX2ZlYXR1cmVzIiwiY29tcHV0ZURvbWFpbiIsImVudGl0eUlkIiwic3Vic3RyIiwiaW5kZXhPZiIsIl9kb21haW4iLCJlbnRpdHlfaWQiLCJnZXRHcm91cEVudGl0aWVzIiwiZW50aXRpZXMiLCJncm91cCIsInJlc3VsdCIsImVudGl0eSIsImdldFZpZXdFbnRpdGllcyIsInZpZXciLCJ2aWV3RW50aXRpZXMiLCJoaWRkZW4iLCJncm91cEVudGl0aWVzIiwiZ3JFbnRpdHlJZCIsImdyRW50aXR5Iiwic3RhdGVDYXJkVHlwZSIsImluY2x1ZGVzIiwiY29udHJvbCIsImhhc3NBdHRyaWJ1dGVVdGlsIiwiRE9NQUlOX0RFVklDRV9DTEFTUyIsImJpbmFyeV9zZW5zb3IiLCJjb3ZlciIsInNlbnNvciIsIlVOS05PV05fVFlQRSIsIkFERF9UWVBFIiwiVFlQRV9UT19UQUciLCJzdHJpbmciLCJqc29uIiwiaWNvbiIsImJvb2xlYW4iLCJhcnJheSIsIkxPR0lDX1NUQVRFX0FUVFJJQlVURVMiLCJlbnRpdHlfcGljdHVyZSIsInVuZGVmaW5lZCIsImZyaWVuZGx5X25hbWUiLCJ0eXBlIiwiZGVzY3JpcHRpb24iLCJlbXVsYXRlZF9odWUiLCJkb21haW5zIiwiZW11bGF0ZWRfaHVlX25hbWUiLCJoYWFza2FfaGlkZGVuIiwiaGFhc2thX25hbWUiLCJob21lYnJpZGdlX2hpZGRlbiIsImhvbWVicmlkZ2VfbmFtZSIsImF0dHJpYnV0aW9uIiwiY3VzdG9tX3VpX21vcmVfaW5mbyIsImN1c3RvbV91aV9zdGF0ZV9jYXJkIiwiZGV2aWNlX2NsYXNzIiwib3B0aW9ucyIsImFzc3VtZWRfc3RhdGUiLCJpbml0aWFsX3N0YXRlIiwidW5pdF9vZl9tZWFzdXJlbWVudCIsIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCJwcm9wIiwiTGl0ZXJhbFN0cmluZyIsImNvbnN0cnVjdG9yIiwidmFsdWUiLCJ0b1N0cmluZyIsImxpdGVyYWxWYWx1ZSIsIkVycm9yIiwiaHRtbFZhbHVlIiwiSFRNTFRlbXBsYXRlRWxlbWVudCIsImlubmVySFRNTCIsImh0bWwiLCJzdHJpbmdzIiwidGVtcGxhdGUiLCJ2YWx1ZXMiLCJyZWR1Y2UiLCJhY2MiLCJ2IiwiaWR4IiwiaHRtbExpdGVyYWwiLCJDdWlCYXNlRWxlbWVudCIsIlBvbHltZXIiLCJFbGVtZW50IiwicHJvcGVydGllcyIsImluRGlhbG9nIiwiQm9vbGVhbiIsImNvbnRyb2xFbGVtZW50IiwiU3RyaW5nIiwiZXh0cmEiLCJBcnJheSIsImNvbXB1dGVkIiwiY29tcHV0ZUV4dHJhIiwiZXh0cmFzIiwiZXh0cmFfZGF0YV90ZW1wbGF0ZSIsImlzQXJyYXkiLCJtYXAiLCJjdXN0b21VSSIsImNvbXB1dGVUZW1wbGF0ZSIsInN0YXRlcyIsImZpbHRlciIsInNob3dMYXN0Q2hhbmdlZCIsImxlbmd0aCIsInNob3dfbGFzdF9jaGFuZ2VkIiwiaGFzRXh0cmEiLCJEeW5hbWljRWxlbWVudCIsImVsZW1lbnROYW1lIiwib2JzZXJ2ZXJzIiwib2JzZXJ2ZXJGdW5jIiwidG9VcHBlckNhc2UiLCJjdXN0b21FbGVtZW50cyIsImRlZmluZSIsIkR5bmFtaWNXaXRoRXh0cmEiLCJnZXQiLCJleHRyYU9iaiIsIl9hdHRhY2hlZCIsImV4dHJhT2JqVmlzaWJsZSIsImNvbm5lY3RlZENhbGxiYWNrIiwiZGlzY29ubmVjdGVkQ2FsbGJhY2siLCJfaXNBdHRhY2hlZCIsImF0dGFjaGVkIiwiZXh0cmFfYmFkZ2UiLCJleHRyYUJhZGdlcyIsImV4dHJhQmFkZ2UiLCJtYXliZUNoYW5nZU9iamVjdCIsImF0dHJpYnV0ZSIsInVuaXQiLCJibGFja2xpc3QiLCJibGFja2xpc3Rfc3RhdGVzIiwic29tZSIsIlJlZ0V4cCIsInRlc3QiLCJfZW50aXR5RGlzcGxheSIsImNvbXB1dGVFeHRyYVZpc2libGUiLCJleHRyYUNsYXNzIiwiX3Nob3dDb250cm9sIiwiaGlkZV9jb250cm9sIiwiY29tcHV0ZVN0YXRlRGlzcGxheSIsImhhTG9jYWxpemUiLCJsb2NhbGl6ZSIsImlzQ29uZmlybUNvbnRyb2xzIiwiY29uZmlybV9jb250cm9scyIsImNvbmZpcm1fY29udHJvbHNfc2hvd19sb2NrIiwiY2xpY2tIYW5kbGVyIiwiZSIsInN0eWxlIiwicG9pbnRlckV2ZW50cyIsImxvY2siLCJvcGFjaXR5Iiwic2V0VGltZW91dCIsInN0b3BQcm9wYWdhdGlvbiIsImFwcGx5VGhlbWVzIiwiZXh0cmFEb21DaGFuZ2VkIiwicXVlcnlTZWxlY3RvckFsbCIsImVsZW0iLCJIYUNvbmZpZ0N1c3RvbVVpIiwiRXZlbnRzTWl4aW4iLCJpc1dpZGUiLCJuYW1lIiwib2JzZXJ2ZXIiLCJyZWFkeSIsImdldE5hbWUiLCJuYW1lQ2hhbmdlZCIsInNldE5hbWUiLCJfYmFja0hhbmRsZXIiLCJoaXN0b3J5IiwiYmFjayIsImZpcmUiLCJIYVRoZW1lZFNsaWRlciIsImRpc2FibGVPZmZXaGVuTWluIiwiX2NvbXB1dGVBdHRyaWJ1dGUiLCJjb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwiZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwibWluIiwiTnVtYmVyIiwibWF4IiwicGluIiwiaXNPbiIsIm5vdGlmeSIsIl90aGVtZWRNaW4iLCJfZW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkIiwiYXR0ciIsImRlZiIsImNvbXB1dGVDbGFzcyIsInRoZW1lZE1pbiIsInZhbHVlQ2hhbmdlZCIsImV2IiwidGFyZ2V0IiwiU0hPV19MQVNUX0NIQU5HRURfQkxBQ0tMSVNURURfQ0FSRFMiLCJET01BSU5fVE9fU0xJREVSX1NVUFBPUlQiLCJsaWdodCIsImNsaW1hdGUiLCJUWVBFX1RPX0NPTlRST0wiLCJ0b2dnbGUiLCJkaXNwbGF5IiwiU3RhdGVDYXJkQ3VzdG9tVWkiLCJjb250YWluZXIiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsIl9jb250YWluZXIiLCJzZXRQcm9wZXJ0eSIsImlucHV0Q2hhbmdlZCIsIm1hcmdpbiIsInBhZGRpbmciLCJiYWRnZU1vZGUiLCJpZCIsImNvbnNvbGUiLCJ3YXJuIiwiYmFkZ2VzX2xpc3QiLCJwdXNoIiwicGFyYW1zIiwid2lkdGgiLCJmb250U2l6ZSIsImNsZWFuQmFkZ2VTdHlsZSIsIm1vZGlmaWVkT2JqIiwidGhlbWVUYXJnZXQiLCJtYXliZUhpZGVFbnRpdHkiLCJzbGlkZXJFbGlnaWJsZV8iLCJvYmoiLCJzdGF0ZV9jYXJkX21vZGUiLCJyZWd1bGFyTW9kZV8iLCJvcmlnaW5hbFN0YXRlQ2FyZFR5cGUiLCJjdXN0b21TdGF0ZUNhcmRUeXBlIiwic2Vjb25kYXJ5U3RhdGVDYXJkVHlwZSIsInN0YXRlX2NhcmRfY3VzdG9tX3VpX3NlY29uZGFyeSIsInNlcnZpY2VNaW4iLCJzZXJ2aWNlTWF4IiwidmFsdWVOYW1lIiwic2V0VmFsdWVOYW1lIiwibmFtZU9uIiwibWluX3RlbXAiLCJtYXhfdGVtcCIsImNvbnRyb2xfZWxlbWVudCIsIlN0YXRlQ2FyZFdpdGhTbGlkZXIiLCJzbGlkZXJWYWx1ZSIsIm1vZGUiLCJzdHJldGNoU2xpZGVyIiwiYnJlYWtTbGlkZXIiLCJoaWRlU2xpZGVyIiwibGluZVRvb0xvbmciLCJtaW5MaW5lQnJlYWsiLCJtYXhMaW5lQnJlYWsiLCJzaG93U2xpZGVyIiwiX29uSXJvblJlc2l6ZSIsImJpbmQiLCJfaXNDb25uZWN0ZWQiLCJhZGRFdmVudExpc3RlbmVyIiwiX3dhaXRGb3JMYXlvdXQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX3NldE1vZGUiLCJfZnJhbWVJZCIsInJlYWR5VG9Db21wdXRlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicHJldkJyZWFrU2xpZGVyIiwicHJldkhpZGVTbGlkZXIiLCIkIiwiY29udGFpbmVyV2lkdGgiLCJjbGllbnRXaWR0aCIsImNvbnRhaW5lckhlaWdodCIsImNsaWVudEhlaWdodCIsInN0YXRlSGVpZ2h0IiwiX2NvbXB1dGVXcmFwQ2xhc3MiLCJfc2hvd1NsaWRlciIsInNsaWRlckNoYW5nZWQiLCJwYXJzZUludCIsInBhcmFtIiwiaXNOYU4iLCJwYXRoIiwiY29tcG9zZWRQYXRoIiwiY2FsbFNlcnZpY2UiLCJzdGF0ZU9iakNoYW5nZWQiLCJzdHJldGNoX3NsaWRlciIsIlN0YXRlQ2FyZFdpdGhvdXRTbGlkZXIiLCJzdXBlckNsYXNzIiwiZGV0YWlsIiwiZXZlbnQiLCJFdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY29tcG9zZWQiLCJub2RlIiwiZGlzcGF0Y2hFdmVudCIsIlNVUFBPUlRFRF9TTElERVJfTU9ERVMiLCJjdXN0b21VaUF0dHJpYnV0ZXMiLCJkZXZpY2UiLCJ0ZW1wbGF0ZXMiLCJjb25jYXQiLCJzbGlkZXJfdGhlbWUiLCJoaWRlX2luX2RlZmF1bHRfdmlldyIsImhhc3NBdHRyaWJ1dGVzVXRpbCIsImRvbUhvc3QiLCJnZXRSb290Tm9kZSIsIkRvY3VtZW50RnJhZ21lbnQiLCJob3N0IiwibGlnaHRPclNoYWRvdyIsInNlbGVjdG9yIiwic2hhZG93Um9vdCIsImdldEVsZW1lbnRIaWVyYXJjaHkiLCJoaWVyYXJjaHkiLCJzaGlmdCIsImdldENvbnRleHQiLCJfY29udGV4dCIsImdyb3VwRW50aXR5IiwicmV2ZXJzZSIsImZpbmRNYXRjaCIsImZpbmQiLCJvcHRpb24iLCJtYXRjaCIsIm1heWJlQ2hhbmdlT2JqZWN0QnlEZXZpY2UiLCJhcHBseUF0dHJpYnV0ZXMiLCJtYXliZUNoYW5nZU9iamVjdEJ5R3JvdXAiLCJjb250ZXh0IiwiYyIsIl9zZXRLZWVwIiwiX2N1aV9rZWVwIiwibWF5YmVBcHBseVRlbXBsYXRlQXR0cmlidXRlcyIsIm5ld0F0dHJpYnV0ZXMiLCJoYXNHbG9iYWwiLCJoYXNDaGFuZ2VzIiwidW50ZW1wbGF0ZWRfYXR0cmlidXRlcyIsInVudGVtcGxhdGVkX3N0YXRlIiwiX3N0YXRlRGlzcGxheSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInVudGVtcGxhdGVkX3N0YXRlRGlzcGxheSIsIm1heWJlQXBwbHlUZW1wbGF0ZXMiLCJuZXdSZXN1bHQiLCJjaGVja0F0dHJpYnV0ZXMiLCJsYXN0X2NoYW5nZWQiLCJhbGxvd0hpZGRlbiIsImZpeEdyb3VwVGl0bGVzIiwiaG9tZUFzc2lzdGFudE1haW4iLCJoYUNhcmRzIiwibWFpbiIsImNhcmRzIiwiY2FyZCIsIm5hbWVFbGVtIiwidGV4dENvbnRlbnQiLCJjb250cm9sQ29sdW1ucyIsImNvbHVtbnMiLCJwYXJ0aWFsQ2FyZHMiLCJtcWxzIiwibXFsIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVXaW5kb3dDaGFuZ2UiLCJtYXRjaE1lZGlhIiwiYWRkTGlzdGVuZXIiLCJ1c2VDdXN0b21pemVyIiwiY3VzdG9taXplciIsImhpZGVfYXR0cmlidXRlcyIsInVwZGF0ZUNvbmZpZ1BhbmVsIiwibG9jYXRpb24iLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJoYVBhbmVsQ29uZmlnIiwiaGFDb25maWdOYXZpZ2F0aW9uIiwiY3VpUGF0Y2giLCJfb3JpZ2luYWxDb21wdXRlTG9hZGVkIiwiX2NvbXB1dGVMb2FkZWQiLCJfb3JpZ2luYWxDb21wdXRlQ2FwdGlvbiIsIl9jb21wdXRlQ2FwdGlvbiIsIl9vcmlnaW5hbENvbXB1dGVEZXNjcmlwdGlvbiIsIl9jb21wdXRlRGVzY3JpcHRpb24iLCJwYWdlIiwicGFnZXMiLCJjb25mIiwiY2FwdGlvbiIsImxvYWRlZCIsImdldEhhQ29uZmlnQ3VzdG9tVWkiLCJoYUNvbmZpZ0N1c3RvbVVpIiwiaXJvblBhZ2VzIiwibGFzdEVsZW1lbnRDaGlsZCIsInNlbGVjdCIsInZpc2libGUiLCJpbnN0YWxsU3RhdGVzSG9vayIsImhvbWVBc3Npc3RhbnQiLCJfdXBkYXRlSGFzcyIsIm9yaWdpbmFsVXBkYXRlIiwidXBkYXRlIiwibmV3RW50aXR5IiwiX3RoZW1lV2FpdGVycyIsIndhaXRlciIsInN0YXRlQ2hhbmdlZCIsImluc3RhbGxQYXJ0aWFsQ2FyZHMiLCJfZGVmYXVsdFZpZXdGaWx0ZXIiLCJleGNsdWRlcyIsImV4Y2x1ZGVFbnRpdHlJZCIsImluc3RhbGxBY3Rpb25OYW1lIiwia2xhc3MiLCJkZWZpbmVQcm9wZXJ0eSIsImN1c3RvbUxvY2FsaXplIiwiYWN0aW9uX25hbWUiLCJfX2RhdGEiLCJzZXQiLCJpbnN0YWxsSGFTdGF0ZUxhYmVsQmFkZ2UiLCJoYVN0YXRlTGFiZWxCYWRnZSIsInN0YXJ0SW50ZXJ2YWwiLCJpbnN0YWxsU3RhdGVCYWRnZSIsInN0YXRlQmFkZ2UiLCJ1cGRhdGVJY29uQXBwZWFyYW5jZSIsIm9yaWdpbmFsVXBkYXRlSWNvbkFwcGVhcmFuY2UiLCJjdXN0b21VcGRhdGVJY29uQXBwZWFyYW5jZSIsImljb25fY29sb3IiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJjb2xvciIsImluc3RhbGxIYUF0dHJpYnV0ZXMiLCJoYUF0dHJpYnV0ZXMiLCJjb21wdXRlRmlsdGVyc0FycmF5IiwiY3VzdG9tQ29tcHV0ZUZpbHRlcnNBcnJheSIsImV4dHJhRmlsdGVycyIsInNwbGl0IiwiaW5zdGFsbEhhRm9ybUN1c3RvbWl6ZSIsImhhRm9ybUN1c3RvbWl6ZSIsImhhRm9ybUN1c3RvbWl6ZUluaXREb25lIiwiX2NvbXB1dGVTaW5nbGVBdHRyaWJ1dGUiLCJjdXN0b21Db21wdXRlU2luZ2xlQXR0cmlidXRlIiwic2Vjb25kYXJ5IiwiX2luaXRPcGVuT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsImdldE5ld0F0dHJpYnV0ZXNPcHRpb25zIiwiY3VzdG9tZ2V0TmV3QXR0cmlidXRlc09wdGlvbnMiLCJsb2NhbEF0dHJpYnV0ZXMiLCJnbG9iYWxBdHRyaWJ1dGVzIiwiZXhpc3RpbmdBdHRyaWJ1dGVzIiwia25vd25LZXlzIiwiZmlsdGVyRnJvbUF0dHJpYnV0ZXMiLCJzb3J0IiwiaW5zdGFsbENsYXNzSG9va3MiLCJjbGFzc0luaXREb25lIiwiaW5pdCIsImluaXREb25lIiwicnVuSG9va3MiLCJsb2ciLCJDVVNUT01fVUlfTElTVCIsInZlcnNpb24iLCJ1cmwiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic2V0SXRlbSIsImZ1bmN0aW9uQm9keSIsImZ1bmMiLCJGdW5jdGlvbiIsIlN5bnRheEVycm9yIiwiUmVmZXJlbmNlRXJyb3IiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7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QUFSLEVBQWM7QUFDWjFMLFdBQU9rZCxZQUFQLENBQW9CRSxPQUFwQixDQUE0QixnQkFBNUIsRUFBOEMxUixRQUFRLEVBQXREO0FBQ0QsR0F6akJrQzs7QUEyakJuQzVELGtCQUFnQnhCLFFBQWhCLEVBQTBCN0UsSUFBMUIsRUFBZ0NnQixRQUFoQyxFQUEwQ0csTUFBMUMsRUFBa0QvQixVQUFsRCxFQUE4RDRJLFNBQTlELEVBQXlFekgsS0FBekUsRUFBZ0Y7QUFDOUUsUUFBTXFiLGVBQWdCL1csU0FBU2pFLE9BQVQsQ0FBaUIsUUFBakIsS0FBOEIsQ0FBL0IsR0FBb0NpRSxRQUFwQyxHQUFnRCxZQUFXQSxRQUFTLEtBQXpGO0FBQ0EsUUFBSTtBQUNGO0FBQ0EsVUFBTWdYLE9BQU8sSUFBSUMsUUFBSixDQUNYLE1BRFcsRUFDSCxVQURHLEVBQ1MsUUFEVCxFQUNtQixZQURuQixFQUNpQyxXQURqQyxFQUM4QyxPQUQ5QyxFQUN1REYsWUFEdkQsQ0FBYjtBQUVBO0FBQ0EsYUFBT0MsS0FBSzdiLElBQUwsRUFBV2dCLFFBQVgsRUFBcUJHLE1BQXJCLEVBQTZCL0IsVUFBN0IsRUFBeUM0SSxTQUF6QyxFQUFvRHpILEtBQXBELENBQVA7QUFDRCxLQU5ELENBTUUsT0FBTzRJLENBQVAsRUFBVTtBQUNWO0FBQ0EsVUFBS0EsYUFBYTRTLFdBQWQsSUFBOEI1UyxhQUFhNlMsY0FBL0MsRUFBK0Q7QUFDN0QvTyxnQkFBUUMsSUFBUixDQUFjLEdBQUUvRCxFQUFFYyxJQUFLLEtBQUlkLEVBQUU4UyxPQUFRLGdCQUFlTCxZQUFhLEVBQWpFO0FBQ0EsZUFBTyxJQUFQO0FBQ0Q7QUFDRDtBQUNBLFlBQU16UyxDQUFOO0FBQ0Q7QUFDRjtBQTVrQmtDLENBQXJDO0FBOGtCQTVLLE9BQU82SCxRQUFQLENBQWdCOFUsSUFBaEIsRzs7Ozs7Ozs7Ozs7OztBQ3RsQkEsK0RBQWUsVUFBZixFIiwiZmlsZSI6InNjcmlwdHMtZGJnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2VudHJ5cG9pbnRzL3NjcmlwdHMuanNcIik7XG4iLCIvKiogQ29uc3RhbnRzIHRvIGJlIHVzZWQgaW4gdGhlIGZyb250ZW5kLiAqL1xuXG4vLyBDb25zdGFudHMgc2hvdWxkIGJlIGFscGhhYmV0aWNhbGx5IHNvcnRlZCBieSBuYW1lLlxuLy8gQXJyYXlzIHdpdGggdmFsdWVzIHNob3VsZCBiZSBhbHBoYWJldGljYWxseSBzb3J0ZWQgaWYgb3JkZXIgZG9lc24ndCBtYXR0ZXIuXG4vLyBFYWNoIGNvbnN0YW50IHNob3VsZCBoYXZlIGEgZGVzY3JpcHRpb24gd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGZvci5cblxuLyoqIEljb24gdG8gdXNlIHdoZW4gbm8gaWNvbiBzcGVjaWZpZWQgZm9yIGRvbWFpbi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RPTUFJTl9JQ09OID0gJ21kaTpib29rbWFyayc7XG5cbi8qKiBEb21haW5zIHRoYXQgaGF2ZSBhIHN0YXRlIGNhcmQuICovXG5leHBvcnQgY29uc3QgRE9NQUlOU19XSVRIX0NBUkQgPSBbXG4gICdjbGltYXRlJyxcbiAgJ2NvdmVyJyxcbiAgJ2NvbmZpZ3VyYXRvcicsXG4gICdpbnB1dF9zZWxlY3QnLFxuICAnaW5wdXRfbnVtYmVyJyxcbiAgJ2lucHV0X3RleHQnLFxuICAnbWVkaWFfcGxheWVyJyxcbiAgJ3NjZW5lJyxcbiAgJ3NjcmlwdCcsXG4gICd0aW1lcicsXG4gICd3ZWJsaW5rJyxcbl07XG5cbi8qKiBEb21haW5zIHRoYXQgc2hvdWxkIGhhdmUgdGhlIGhpc3RvcnkgaGlkZGVuIGluIHRoZSBtb3JlIGluZm8gZGlhbG9nLiAqL1xuZXhwb3J0IGNvbnN0IERPTUFJTlNfTU9SRV9JTkZPX05PX0hJU1RPUlkgPSBbXG4gICdjYW1lcmEnLFxuICAnY29uZmlndXJhdG9yJyxcbiAgJ2hpc3RvcnlfZ3JhcGgnLFxuICAnc2NlbmUnLFxuXTtcblxuLyoqIFN0YXRlcyB0aGF0IHdlIGNvbnNpZGVyIFwib2ZmXCIuICovXG5leHBvcnQgY29uc3QgU1RBVEVTX09GRiA9IFtcbiAgJ2Nsb3NlZCcsXG4gICdvZmYnLFxuICAndW5sb2NrZWQnLFxuXTtcblxuLyoqIFRlbXBlcmF0dXJlIHVuaXRzLiAqL1xuZXhwb3J0IGNvbnN0IFVOSVRfQyA9ICfCsEMnO1xuZXhwb3J0IGNvbnN0IFVOSVRfRiA9ICfCsEYnO1xuXG4vKiogRW50aXR5IElEIG9mIHRoZSBkZWZhdWx0IHZpZXcuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9WSUVXX0VOVElUWV9JRCA9ICdncm91cC5kZWZhdWx0X3ZpZXcnO1xuIiwiLyoqXG4gKiBBcHBseSBhIHRoZW1lIHRvIGFuIGVsZW1lbnQgYnkgc2V0dGluZyB0aGUgQ1NTIHZhcmlhYmxlcyBvbiBpdC5cbiAqXG4gKiBlbGVtZW50OiBFbGVtZW50IHRvIGFwcGx5IHRoZW1lIG9uLlxuICogdGhlbWVzOiBIQVNTIFRoZW1lIGluZm9ybWF0aW9uXG4gKiBsb2NhbFRoZW1lOiBzZWxlY3RlZCB0aGVtZS5cbiAqIHVwZGF0ZU1ldGE6IGJvb2xlYW4gaWYgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgdGhlbWUtY29sb3IgbWV0YSBlbGVtZW50LlxuKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFwcGx5VGhlbWVzT25FbGVtZW50KGVsZW1lbnQsIHRoZW1lcywgbG9jYWxUaGVtZSwgdXBkYXRlTWV0YSA9IGZhbHNlKSB7XG4gIGlmICghZWxlbWVudC5fdGhlbWVzKSB7XG4gICAgZWxlbWVudC5fdGhlbWVzID0ge307XG4gIH1cbiAgbGV0IHRoZW1lTmFtZSA9IHRoZW1lcy5kZWZhdWx0X3RoZW1lO1xuICBpZiAobG9jYWxUaGVtZSA9PT0gJ2RlZmF1bHQnIHx8IChsb2NhbFRoZW1lICYmIHRoZW1lcy50aGVtZXNbbG9jYWxUaGVtZV0pKSB7XG4gICAgdGhlbWVOYW1lID0gbG9jYWxUaGVtZTtcbiAgfVxuICBjb25zdCBzdHlsZXMgPSBPYmplY3QuYXNzaWduKHt9LCBlbGVtZW50Ll90aGVtZXMpO1xuICBpZiAodGhlbWVOYW1lICE9PSAnZGVmYXVsdCcpIHtcbiAgICB2YXIgdGhlbWUgPSB0aGVtZXMudGhlbWVzW3RoZW1lTmFtZV07XG4gICAgT2JqZWN0LmtleXModGhlbWUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdmFyIHByZWZpeGVkS2V5ID0gJy0tJyArIGtleTtcbiAgICAgIGVsZW1lbnQuX3RoZW1lc1twcmVmaXhlZEtleV0gPSAnJztcbiAgICAgIHN0eWxlc1twcmVmaXhlZEtleV0gPSB0aGVtZVtrZXldO1xuICAgIH0pO1xuICB9XG4gIGlmIChlbGVtZW50LnVwZGF0ZVN0eWxlcykge1xuICAgIGVsZW1lbnQudXBkYXRlU3R5bGVzKHN0eWxlcyk7XG4gIH0gZWxzZSBpZiAod2luZG93LlNoYWR5Q1NTKSB7XG4gICAgLy8gaW1wbGVtZW50IHVwZGF0ZVN0eWxlcygpIG1ldGhvZCBvZiBQb2xlbWVyIGVsZW1lbnRzXG4gICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oZWxlbWVudCksIHN0eWxlcyk7XG4gIH1cblxuICBpZiAoIXVwZGF0ZU1ldGEpIHJldHVybjtcblxuICBjb25zdCBtZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPXRoZW1lLWNvbG9yXScpO1xuICBpZiAobWV0YSkge1xuICAgIGlmICghbWV0YS5oYXNBdHRyaWJ1dGUoJ2RlZmF1bHQtY29udGVudCcpKSB7XG4gICAgICBtZXRhLnNldEF0dHJpYnV0ZSgnZGVmYXVsdC1jb250ZW50JywgbWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSk7XG4gICAgfVxuICAgIGNvbnN0IHRoZW1lQ29sb3IgPSBzdHlsZXNbJy0tcHJpbWFyeS1jb2xvciddIHx8IG1ldGEuZ2V0QXR0cmlidXRlKCdkZWZhdWx0LWNvbnRlbnQnKTtcbiAgICBtZXRhLnNldEF0dHJpYnV0ZSgnY29udGVudCcsIHRoZW1lQ29sb3IpO1xuICB9XG59XG4iLCIvKipcbiAqIFVwZGF0ZSByb290J3MgY2hpbGQgZWxlbWVudCB0byBiZSBuZXdFbGVtZW50VGFnIHJlcGxhY2luZyBhbm90aGVyIGV4aXN0aW5nIGNoaWxkIGlmIGFueS5cbiAqIENvcHkgYXR0cmlidXRlcyBpbnRvIHRoZSBjaGlsZCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkeW5hbWljQ29udGVudFVwZGF0ZXIocm9vdCwgbmV3RWxlbWVudFRhZywgYXR0cmlidXRlcykge1xuICBjb25zdCByb290RWwgPSByb290O1xuICBsZXQgY3VzdG9tRWw7XG5cbiAgaWYgKHJvb3RFbC5sYXN0Q2hpbGQgJiYgcm9vdEVsLmxhc3RDaGlsZC50YWdOYW1lID09PSBuZXdFbGVtZW50VGFnKSB7XG4gICAgY3VzdG9tRWwgPSByb290RWwubGFzdENoaWxkO1xuICB9IGVsc2Uge1xuICAgIGlmIChyb290RWwubGFzdENoaWxkKSB7XG4gICAgICByb290RWwucmVtb3ZlQ2hpbGQocm9vdEVsLmxhc3RDaGlsZCk7XG4gICAgfVxuICAgIC8vIENyZWF0aW5nIGFuIGVsZW1lbnQgd2l0aCB1cHBlciBjYXNlIHdvcmtzIGZpbmUgaW4gQ2hyb21lLCBidXQgaW4gRkYgaXQgZG9lc24ndCBpbW1lZGlhdGVseVxuICAgIC8vIGJlY29tZSBhIGRlZmluZWQgQ3VzdG9tIEVsZW1lbnQuIFBvbHltZXIgZG9lcyB0aGF0IGluIHNvbWUgbGF0ZXIgcGFzcy5cbiAgICBjdXN0b21FbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3RWxlbWVudFRhZy50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIGlmIChjdXN0b21FbC5zZXRQcm9wZXJ0aWVzKSB7XG4gICAgY3VzdG9tRWwuc2V0UHJvcGVydGllcyhhdHRyaWJ1dGVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBjdXN0b20gZWxlbWVudCBkZWZpbml0aW9uIHdhc24ndCBsb2FkZWQgeWV0IC0gc2V0UHJvcGVydGllcyB3b3VsZCBiZVxuICAgIC8vIG1pc3NpbmcsIGJ1dCBubyBoYXJtIGluIHNldHRpbmcgYXR0cmlidXRlcyBvbmUtYnktb25lIHRoZW4uXG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjdXN0b21FbFtrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGN1c3RvbUVsLnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByb290RWwuYXBwZW5kQ2hpbGQoY3VzdG9tRWwpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYW5Ub2dnbGVEb21haW4oaGFzcywgZG9tYWluKSB7XG4gIGNvbnN0IHNlcnZpY2VzID0gaGFzcy5jb25maWcuc2VydmljZXNbZG9tYWluXTtcbiAgaWYgKCFzZXJ2aWNlcykgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoZG9tYWluID09PSAnbG9jaycpIHtcbiAgICByZXR1cm4gJ2xvY2snIGluIHNlcnZpY2VzO1xuICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gJ2NvdmVyJykge1xuICAgIHJldHVybiAnb3Blbl9jb3ZlcicgaW4gc2VydmljZXM7XG4gIH1cbiAgcmV0dXJuICd0dXJuX29uJyBpbiBzZXJ2aWNlcztcbn1cbiIsImltcG9ydCBjYW5Ub2dnbGVEb21haW4gZnJvbSAnLi9jYW5fdG9nZ2xlX2RvbWFpbi5qcyc7XG5pbXBvcnQgY29tcHV0ZVN0YXRlRG9tYWluIGZyb20gJy4vY29tcHV0ZV9zdGF0ZV9kb21haW4uanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYW5Ub2dnbGVTdGF0ZShoYXNzLCBzdGF0ZU9iaikge1xuICBjb25zdCBkb21haW4gPSBjb21wdXRlU3RhdGVEb21haW4oc3RhdGVPYmopO1xuICBpZiAoZG9tYWluID09PSAnZ3JvdXAnKSB7XG4gICAgcmV0dXJuIHN0YXRlT2JqLnN0YXRlID09PSAnb24nIHx8IHN0YXRlT2JqLnN0YXRlID09PSAnb2ZmJztcbiAgfVxuICBpZiAoZG9tYWluID09PSAnY2xpbWF0ZScpIHtcbiAgICByZXR1cm4gISEoKHN0YXRlT2JqLmF0dHJpYnV0ZXMgfHwge30pLnN1cHBvcnRlZF9mZWF0dXJlcyAmIDQwOTYpO1xuICB9XG5cbiAgcmV0dXJuIGNhblRvZ2dsZURvbWFpbihoYXNzLCBkb21haW4pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZURvbWFpbihlbnRpdHlJZCkge1xuICByZXR1cm4gZW50aXR5SWQuc3Vic3RyKDAsIGVudGl0eUlkLmluZGV4T2YoJy4nKSk7XG59XG4iLCJpbXBvcnQgY29tcHV0ZURvbWFpbiBmcm9tICcuL2NvbXB1dGVfZG9tYWluLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZVN0YXRlRG9tYWluKHN0YXRlT2JqKSB7XG4gIGlmICghc3RhdGVPYmouX2RvbWFpbikge1xuICAgIHN0YXRlT2JqLl9kb21haW4gPSBjb21wdXRlRG9tYWluKHN0YXRlT2JqLmVudGl0eV9pZCk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVPYmouX2RvbWFpbjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEdyb3VwRW50aXRpZXMoZW50aXRpZXMsIGdyb3VwKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gIGdyb3VwLmF0dHJpYnV0ZXMuZW50aXR5X2lkLmZvckVhY2goKGVudGl0eUlkKSA9PiB7XG4gICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbZW50aXR5SWRdO1xuXG4gICAgaWYgKGVudGl0eSkge1xuICAgICAgcmVzdWx0W2VudGl0eS5lbnRpdHlfaWRdID0gZW50aXR5O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCBjb21wdXRlRG9tYWluIGZyb20gJy4vY29tcHV0ZV9kb21haW4uanMnO1xuaW1wb3J0IGdldEdyb3VwRW50aXRpZXMgZnJvbSAnLi9nZXRfZ3JvdXBfZW50aXRpZXMuanMnO1xuXG4vLyBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGVudGl0aWVzIHRoYXQgdGhlIHZpZXcgd2lsbCBzaG93XG4vLyBpbmNsdWRpbmcgZW1iZWRkZWQgZ3JvdXBzLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld0VudGl0aWVzKGVudGl0aWVzLCB2aWV3KSB7XG4gIGNvbnN0IHZpZXdFbnRpdGllcyA9IHt9O1xuXG4gIHZpZXcuYXR0cmlidXRlcy5lbnRpdHlfaWQuZm9yRWFjaCgoZW50aXR5SWQpID0+IHtcbiAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllc1tlbnRpdHlJZF07XG5cbiAgICBpZiAoZW50aXR5ICYmICFlbnRpdHkuYXR0cmlidXRlcy5oaWRkZW4pIHtcbiAgICAgIHZpZXdFbnRpdGllc1tlbnRpdHkuZW50aXR5X2lkXSA9IGVudGl0eTtcblxuICAgICAgaWYgKGNvbXB1dGVEb21haW4oZW50aXR5LmVudGl0eV9pZCkgPT09ICdncm91cCcpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBFbnRpdGllcyA9IGdldEdyb3VwRW50aXRpZXMoZW50aXRpZXMsIGVudGl0eSk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXBFbnRpdGllcykuZm9yRWFjaCgoZ3JFbnRpdHlJZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdyRW50aXR5ID0gZ3JvdXBFbnRpdGllc1tnckVudGl0eUlkXTtcblxuICAgICAgICAgIGlmICghZ3JFbnRpdHkuYXR0cmlidXRlcy5oaWRkZW4pIHtcbiAgICAgICAgICAgIHZpZXdFbnRpdGllc1tnckVudGl0eUlkXSA9IGdyRW50aXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdmlld0VudGl0aWVzO1xufVxuIiwiaW1wb3J0IGNhblRvZ2dsZVN0YXRlIGZyb20gJy4vY2FuX3RvZ2dsZV9zdGF0ZS5qcyc7XG5pbXBvcnQgY29tcHV0ZVN0YXRlRG9tYWluIGZyb20gJy4vY29tcHV0ZV9zdGF0ZV9kb21haW4uanMnO1xuaW1wb3J0IHsgRE9NQUlOU19XSVRIX0NBUkQgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXRlQ2FyZFR5cGUoaGFzcywgc3RhdGVPYmopIHtcbiAgaWYgKHN0YXRlT2JqLnN0YXRlID09PSAndW5hdmFpbGFibGUnKSB7XG4gICAgcmV0dXJuICdkaXNwbGF5JztcbiAgfVxuXG4gIGNvbnN0IGRvbWFpbiA9IGNvbXB1dGVTdGF0ZURvbWFpbihzdGF0ZU9iaik7XG5cbiAgaWYgKERPTUFJTlNfV0lUSF9DQVJELmluY2x1ZGVzKGRvbWFpbikpIHtcbiAgICByZXR1cm4gZG9tYWluO1xuICB9IGVsc2UgaWYgKGNhblRvZ2dsZVN0YXRlKGhhc3MsIHN0YXRlT2JqKSAmJlxuICAgICAgICAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXMuY29udHJvbCAhPT0gJ2hpZGRlbicpIHtcbiAgICByZXR1cm4gJ3RvZ2dsZSc7XG4gIH1cbiAgcmV0dXJuICdkaXNwbGF5Jztcbn1cbiIsImNvbnN0IGhhc3NBdHRyaWJ1dGVVdGlsID0ge307XG5cbmhhc3NBdHRyaWJ1dGVVdGlsLkRPTUFJTl9ERVZJQ0VfQ0xBU1MgPSB7XG4gIGJpbmFyeV9zZW5zb3I6IFtcbiAgICAnYmF0dGVyeScsXG4gICAgJ2NvbGQnLFxuICAgICdjb25uZWN0aXZpdHknLFxuICAgICdkb29yJyxcbiAgICAnZ2FyYWdlX2Rvb3InLFxuICAgICdnYXMnLFxuICAgICdoZWF0JyxcbiAgICAnbGlnaHQnLFxuICAgICdsb2NrJyxcbiAgICAnbW9pc3R1cmUnLFxuICAgICdtb3Rpb24nLFxuICAgICdtb3ZpbmcnLFxuICAgICdvY2N1cGFuY3knLFxuICAgICdvcGVuaW5nJyxcbiAgICAncGx1ZycsXG4gICAgJ3Bvd2VyJyxcbiAgICAncHJlc2VuY2UnLFxuICAgICdwcm9ibGVtJyxcbiAgICAnc2FmZXR5JyxcbiAgICAnc21va2UnLFxuICAgICdzb3VuZCcsXG4gICAgJ3ZpYnJhdGlvbicsXG4gICAgJ3dpbmRvdydcbiAgXSxcbiAgY292ZXI6IFsnZ2FyYWdlJ10sXG4gIHNlbnNvcjogW1xuICAgICdiYXR0ZXJ5JyxcbiAgICAnaHVtaWRpdHknLFxuICAgICdpbGx1bWluYW5jZScsXG4gICAgJ3RlbXBlcmF0dXJlJ1xuICBdLFxufTtcblxuaGFzc0F0dHJpYnV0ZVV0aWwuVU5LTk9XTl9UWVBFID0gJ2pzb24nO1xuaGFzc0F0dHJpYnV0ZVV0aWwuQUREX1RZUEUgPSAna2V5LXZhbHVlJztcblxuaGFzc0F0dHJpYnV0ZVV0aWwuVFlQRV9UT19UQUcgPSB7XG4gIHN0cmluZzogJ2hhLWN1c3RvbWl6ZS1zdHJpbmcnLFxuICBqc29uOiAnaGEtY3VzdG9taXplLXN0cmluZycsXG4gIGljb246ICdoYS1jdXN0b21pemUtaWNvbicsXG4gIGJvb2xlYW46ICdoYS1jdXN0b21pemUtYm9vbGVhbicsXG4gIGFycmF5OiAnaGEtY3VzdG9taXplLWFycmF5JyxcbiAgJ2tleS12YWx1ZSc6ICdoYS1jdXN0b21pemUta2V5LXZhbHVlJyxcbn07XG5cbi8vIEF0dHJpYnV0ZXMgaGVyZSBzZXJ2ZSBkdWFsIHB1cnBvc2U6XG4vLyAxKSBBbnkga2V5IG9mIHRoaXMgb2JqZWN0IHdvbid0IGJlIHNob3duIGluIG1vcmUtaW5mbyB3aW5kb3cuXG4vLyAyKSBBbnkga2V5IHdoaWNoIGhhcyB2YWx1ZSBvdGhlciB0aGFuIHVuZGVmaW5lZCB3aWxsIGFwcGVhciBpbiBjdXN0b21pemF0aW9uXG4vLyAgICBjb25maWcgYWNjb3JkaW5nIHRvIGl0cyB2YWx1ZS5cbmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMgPVxuICBoYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTIHx8IHtcbiAgICBlbnRpdHlfcGljdHVyZTogdW5kZWZpbmVkLFxuICAgIGZyaWVuZGx5X25hbWU6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnTmFtZScgfSxcbiAgICBpY29uOiB7IHR5cGU6ICdpY29uJyB9LFxuICAgIGVtdWxhdGVkX2h1ZToge1xuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZG9tYWluczogWydlbXVsYXRlZF9odWUnXVxuICAgIH0sXG4gICAgZW11bGF0ZWRfaHVlX25hbWU6IHtcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZG9tYWluczogWydlbXVsYXRlZF9odWUnXVxuICAgIH0sXG4gICAgaGFhc2thX2hpZGRlbjogdW5kZWZpbmVkLFxuICAgIGhhYXNrYV9uYW1lOiB1bmRlZmluZWQsXG4gICAgaG9tZWJyaWRnZV9oaWRkZW46IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgaG9tZWJyaWRnZV9uYW1lOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgc3VwcG9ydGVkX2ZlYXR1cmVzOiB1bmRlZmluZWQsXG4gICAgYXR0cmlidXRpb246IHVuZGVmaW5lZCxcbiAgICBjdXN0b21fdWlfbW9yZV9pbmZvOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgY3VzdG9tX3VpX3N0YXRlX2NhcmQ6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICBkZXZpY2VfY2xhc3M6IHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICBvcHRpb25zOiBoYXNzQXR0cmlidXRlVXRpbC5ET01BSU5fREVWSUNFX0NMQVNTLFxuICAgICAgZGVzY3JpcHRpb246ICdEZXZpY2UgY2xhc3MnLFxuICAgICAgZG9tYWluczogWydiaW5hcnlfc2Vuc29yJywgJ2NvdmVyJywgJ3NlbnNvciddXG4gICAgfSxcbiAgICBoaWRkZW46IHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjcmlwdGlvbjogJ0hpZGUgZnJvbSBVSScgfSxcbiAgICBhc3N1bWVkX3N0YXRlOiB7XG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBkb21haW5zOiBbJ3N3aXRjaCcsICdsaWdodCcsICdjb3ZlcicsICdjbGltYXRlJywgJ2ZhbicsICdncm91cCddXG4gICAgfSxcbiAgICBpbml0aWFsX3N0YXRlOiB7XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRvbWFpbnM6IFsnYXV0b21hdGlvbiddXG4gICAgfSxcbiAgICB1bml0X29mX21lYXN1cmVtZW50OiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gIH07XG5cbmV4cG9ydCBkZWZhdWx0IGhhc3NBdHRyaWJ1dGVVdGlsO1xuIiwiLyoqXG5AbGljZW5zZVxuQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG5zdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cblxud2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wKSB7IHJldHVybiBwcm9wOyB9O1xuIiwiLyoqXG5AbGljZW5zZVxuQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG5zdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cbmltcG9ydCAnLi9ib290LmpzJztcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBzdGF0aWMgc3RyaW5nIHZhbHVlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbHRlclxuICogc3RyaW5ncyBieSBhc3NldGluZyB0aGF0IHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgdmlhIHRoaXMgY2xhc3MuIFRoZVxuICogYHZhbHVlYCBwcm9wZXJ0eSByZXR1cm5zIHRoZSBzdHJpbmcgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqL1xuY2xhc3MgTGl0ZXJhbFN0cmluZyB7XG4gIGNvbnN0cnVjdG9yKHN0cmluZykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIHRoaXMudmFsdWUgPSBzdHJpbmcudG9TdHJpbmcoKTtcbiAgfVxuICAvKipcbiAgICogQHJldHVybiB7c3RyaW5nfSBMaXRlcmFsU3RyaW5nIHN0cmluZyB2YWx1ZVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYFxuICovXG5mdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykge1xuICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbm9uLWxpdGVyYWwgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIncyBodG1sTGl0ZXJhbCBmdW5jdGlvbjogJHt2YWx1ZX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgT2JqZWN0IHRvIHN0cmluZ2lmeSBpbnRvIEhUTUxcbiAqIEByZXR1cm4ge3N0cmluZ30gSFRNTCBzdHJpbmdpZmllZCBmb3JtIG9mIGBvYmpgXG4gKi9cbmZ1bmN0aW9uIGh0bWxWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnQgfSAqLyh2YWx1ZSkuaW5uZXJIVE1MO1xuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykge1xuICAgIHJldHVybiBsaXRlcmFsVmFsdWUodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG5vbi10ZW1wbGF0ZSB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lcidzIGh0bWwgZnVuY3Rpb246ICR7dmFsdWV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRoYXQgY3JlYXRlcyBhbiBIVE1MIDx0ZW1wbGF0ZT4gZWxlbWVudCBmcm9tIHRoZVxuICogY29udGVudHMgb2YgdGhlIHN0cmluZy5cbiAqXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gd3JpdGUgYSBQb2x5bWVyIFRlbXBsYXRlIGluIEphdmFTY3JpcHQuXG4gKlxuICogVGVtcGxhdGVzIGNhbiBiZSBjb21wb3NlZCBieSBpbnRlcnBvbGF0aW5nIGBIVE1MVGVtcGxhdGVFbGVtZW50YHMgaW5cbiAqIGV4cHJlc3Npb25zIGluIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIGxpdGVyYWwuIFRoZSBuZXN0ZWQgdGVtcGxhdGUnc1xuICogYGlubmVySFRNTGAgaXMgaW5jbHVkZWQgaW4gdGhlIGNvbnRhaW5pbmcgdGVtcGxhdGUuICBUaGUgb25seSBvdGhlclxuICogdmFsdWVzIGFsbG93ZWQgaW4gZXhwcmVzc2lvbnMgYXJlIHRob3NlIHJldHVybmVkIGZyb20gYGh0bWxMaXRlcmFsYFxuICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvXG4gKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy5cbiAqXG4gKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1NcbiAqIGF0dGFja3M7IGhvd2V2ZXIsIGBodG1sTGl0ZXJhbGAgY2FuIGJlIHVzZWQgdG8gY29tcG9zZSBzdGF0aWNcbiAqIHN0cmluZyB2YWx1ZXMgaW50byB0ZW1wbGF0ZXMuIFRoaXMgaXMgdXNlZnVsIHRvIGNvbXBvc2Ugc3RyaW5ncyBpbnRvXG4gKiBwbGFjZXMgdGhhdCBkbyBub3QgYWNjZXB0IGh0bWwsIGxpa2UgdGhlIGNzcyB0ZXh0IG9mIGEgYHN0eWxlYFxuICogZWxlbWVudC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkge1xuICogICAgICAgcmV0dXJuIGh0bWxgXG4gKiAgICAgICAgIDxzdHlsZT46aG9zdHsgY29udGVudDpcIi4uLlwiIH08L3N0eWxlPlxuICogICAgICAgICA8ZGl2IGNsYXNzPVwic2hhZG93ZWRcIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PlxuICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfVxuICogICAgICAgYDtcbiAqICAgICB9XG4gKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBodG1sYDxzcGFuPlBhcnRpYWwhPC9zcGFuPmA7IH1cbiAqXG4gKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50XG4gKi9cbmV4cG9ydCBjb25zdCBodG1sID0gZnVuY3Rpb24gaHRtbChzdHJpbmdzLCAuLi52YWx1ZXMpIHtcbiAgY29uc3QgdGVtcGxhdGUgPSAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpKTtcbiAgdGVtcGxhdGUuaW5uZXJIVE1MID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB2LCBpZHgpID0+XG4gICAgICBhY2MgKyBodG1sVmFsdWUodikgKyBzdHJpbmdzW2lkeCArIDFdLCBzdHJpbmdzWzBdKTtcbiAgcmV0dXJuIHRlbXBsYXRlO1xufTtcblxuLyoqXG4gKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgaHRtbGAgdG8gY29tcG9zZS5cbiAqIGEgbGl0ZXJhbCBzdHJpbmcuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAqICAgICAgIHJldHVybiBodG1sYFxuICogICAgICAgICA8c3R5bGU+XG4gKiAgICAgICAgICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfVxuICogICAgICAgICAgICR7dGhpcy5zdHlsZVRlbXBsYXRlKCl9XG4gKiAgICAgICAgIDwvc3R5bGU+XG4gKiAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGFkb3dlZFwiPiR7c3RhdGljVmFsdWV9PC9kaXY+XG4gKiAgICAgICAgICR7c3VwZXIudGVtcGxhdGV9XG4gKiAgICAgICBgO1xuICogICAgIH1cbiAqICAgICBzdGF0aWMgZ2V0IHN0eWxlVGVtcGxhdGUoKSB7XG4gKiAgICAgICAgcmV0dXJuIGh0bWxMaXRlcmFsYC5zaGFkb3dlZCB7IGJhY2tncm91bmQ6IGdyYXk7IH1gO1xuICogICAgIH1cbiAqXG4gKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgaHRtbExpdGVyYWwgPSBmdW5jdGlvbihzdHJpbmdzLCAuLi52YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBMaXRlcmFsU3RyaW5nKHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PlxuICAgICAgYWNjICsgbGl0ZXJhbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSkpO1xufTtcbiIsImltcG9ydCAnLi4vdXRpbHMvaG9va3MuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIEN1aUJhc2VFbGVtZW50IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNzOiBPYmplY3QsXG4gICAgICBpbkRpYWxvZzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgc3RhdGVPYmo6IE9iamVjdCxcbiAgICAgIGNvbnRyb2xFbGVtZW50OiBTdHJpbmcsXG4gICAgICBleHRyYToge1xuICAgICAgICB0eXBlOiBBcnJheSxcbiAgICAgICAgY29tcHV0ZWQ6ICdjb21wdXRlRXh0cmEoaGFzcywgc3RhdGVPYmopJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbXB1dGVFeHRyYShoYXNzLCBzdGF0ZU9iaikge1xuICAgIGxldCBleHRyYXMgPSBzdGF0ZU9iai5hdHRyaWJ1dGVzLmV4dHJhX2RhdGFfdGVtcGxhdGU7XG4gICAgaWYgKGV4dHJhcykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV4dHJhcykpIHtcbiAgICAgICAgZXh0cmFzID0gW2V4dHJhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gZXh0cmFzLm1hcChleHRyYSA9PiB3aW5kb3cuY3VzdG9tVUkuY29tcHV0ZVRlbXBsYXRlKFxuICAgICAgICBleHRyYSxcbiAgICAgICAgaGFzcyxcbiAgICAgICAgaGFzcy5zdGF0ZXMsXG4gICAgICAgIHN0YXRlT2JqLFxuICAgICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzLFxuICAgICAgICAvKiBhdHRyaWJ1dGU9ICovIHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdGVPYmouc3RhdGUsXG4gICAgICApKS5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdCAhPT0gbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHNob3dMYXN0Q2hhbmdlZChzdGF0ZU9iaiwgaW5EaWFsb2csIGV4dHJhKSB7XG4gICAgaWYgKGluRGlhbG9nKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXh0cmEubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhc3RhdGVPYmouYXR0cmlidXRlcy5zaG93X2xhc3RfY2hhbmdlZDtcbiAgfVxuXG4gIGhhc0V4dHJhKGV4dHJhKSB7XG4gICAgcmV0dXJuIGV4dHJhLmxlbmd0aCA+IDA7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEN1aUJhc2VFbGVtZW50O1xuIiwiaW1wb3J0IGR5bmFtaWNDb250ZW50VXBkYXRlciBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZG9tL2R5bmFtaWNfY29udGVudF91cGRhdGVyLmpzJztcblxuLyoqXG4gKiBAZXh0ZW5kcyBIVE1MRWxlbWVudFxuICovXG5jbGFzcyBEeW5hbWljRWxlbWVudCBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzczogT2JqZWN0LFxuICAgICAgc3RhdGVPYmo6IE9iamVjdCxcbiAgICAgIGVsZW1lbnROYW1lOiBTdHJpbmcsXG5cbiAgICAgIGluRGlhbG9nOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnb2JzZXJ2ZXJGdW5jKGhhc3MsIHN0YXRlT2JqLCBlbGVtZW50TmFtZSwgaW5EaWFsb2cpJyxcbiAgICBdO1xuICB9XG5cbiAgb2JzZXJ2ZXJGdW5jKGhhc3MsIHN0YXRlT2JqLCBlbGVtZW50TmFtZSwgaW5EaWFsb2cpIHtcbiAgICBkeW5hbWljQ29udGVudFVwZGF0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgZWxlbWVudE5hbWUgPyBlbGVtZW50TmFtZS50b1VwcGVyQ2FzZSgpIDogJ0RJVicsXG4gICAgICB7IGhhc3MsIHN0YXRlT2JqLCBpbkRpYWxvZyB9KTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkeW5hbWljLWVsZW1lbnQnLCBEeW5hbWljRWxlbWVudCk7XG4iLCJpbXBvcnQgeyBodG1sIH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvaHRtbC10YWcuanMnO1xuaW1wb3J0IGFwcGx5VGhlbWVzT25FbGVtZW50IGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9kb20vYXBwbHlfdGhlbWVzX29uX2VsZW1lbnQuanMnO1xuXG5pbXBvcnQgJy4vZHluYW1pYy1lbGVtZW50LmpzJztcbmltcG9ydCAnLi4vdXRpbHMvaG9va3MuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIER5bmFtaWNXaXRoRXh0cmEgZXh0ZW5kcyBjdXN0b21FbGVtZW50cy5nZXQoJ3N0YXRlLWNhcmQtZGlzcGxheScpIHtcbiAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICA8c3R5bGUgaXM9XCJjdXN0b20tc3R5bGVcIiBpbmNsdWRlPVwiaXJvbi1mbGV4IGlyb24tZmxleC1hbGlnbm1lbnQgaXJvbi1mbGV4LWZhY3RvcnNcIj48L3N0eWxlPlxuICAgIDxzdHlsZT5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgfVxuICAgICAgLmNvbnRyb2wtd3JhcHBlciB7XG4gICAgICAgIG1hcmdpbjogLTRweCAtMTZweCAtNHB4IDA7XG4gICAgICAgIHBhZGRpbmc6IDRweCAxNnB4O1xuICAgICAgfVxuICAgICAgaGEtc3RhdGUtbGFiZWwtYmFkZ2Uge1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgICAgfVxuICAgICAgZHluYW1pYy1lbGVtZW50IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgfVxuICAgICAgI292ZXJsYXkge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgIHotaW5kZXg6IDE7XG4gICAgICB9XG4gICAgICAjbG9jayB7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICAgICAgb3BhY2l0eTogMC4zO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDdweDtcbiAgICAgIH1cbiAgICAgICNsb2NrLmhhLWNvdmVyLWNvbnRyb2xzIHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MnB4O1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICAgIH1cbiAgICAgIC5leHRyYSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IC0xNnB4O1xuICAgICAgICAtLWhhLWxhYmVsLWJhZGdlLXNpemU6IDM2cHg7XG4gICAgICAgIC0taGEtbGFiZWwtYmFkZ2UtZm9udC1zaXplOiAxLjJlbTtcbiAgICAgIH1cbiAgICAgIC5zdGF0ZSB7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtYm9keTE7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpO1xuICAgICAgICBtYXJnaW4tbGVmdDogMTZweDtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gICAgPGRpdiBjbGFzcyQ9J1tbZXh0cmFDbGFzcyhleHRyYU9ialZpc2libGUpXV0gaG9yaXpvbnRhbCBsYXlvdXQnPlxuICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW2V4dHJhT2JqVmlzaWJsZV1dJz5cbiAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20tcmVwZWF0J1xuICAgICAgICAgICAgICAgICAgaXRlbXM9J1tbZXh0cmFPYmpdXSdcbiAgICAgICAgICAgICAgICAgIG9uLWRvbS1jaGFuZ2U9J2V4dHJhRG9tQ2hhbmdlZCc+XG4gICAgICAgICAgPGhhLXN0YXRlLWxhYmVsLWJhZGdlIGhhc3M9J1tbaGFzc11dJyBzdGF0ZT0nW1tpdGVtXV0nPjwvaGEtc3RhdGUtbGFiZWwtYmFkZ2U+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbW19zaG93Q29udHJvbChpbkRpYWxvZywgc3RhdGVPYmopXV0nPlxuICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbY29udHJvbEVsZW1lbnRdXSc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtd3JhcHBlclwiPlxuICAgICAgICAgICAgPGR5bmFtaWMtZWxlbWVudFxuICAgICAgICAgICAgICAgIGNsYXNzPSdmbGV4J1xuICAgICAgICAgICAgICAgIHN0YXRlLW9iaj1cIltbc3RhdGVPYmpdXVwiXG4gICAgICAgICAgICAgICAgaGFzcz0nW1toYXNzXV0nXG4gICAgICAgICAgICAgICAgZWxlbWVudC1uYW1lPSdbW2NvbnRyb2xFbGVtZW50XV0nPlxuICAgICAgICAgICAgPC9keW5hbWljLWVsZW1lbnQ+XG4gICAgICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbaXNDb25maXJtQ29udHJvbHMoc3RhdGVPYmopXV0nPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwib3ZlcmxheVwiIG9uLWNsaWNrPSdjbGlja0hhbmRsZXInPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbmZpcm1fY29udHJvbHNfc2hvd19sb2NrXV0nPlxuICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBpZD1cImxvY2tcIiBjbGFzcyQ9XCJbW2NvbnRyb2xFbGVtZW50XV1cIiBpY29uPVwibWRpOmxvY2stb3V0bGluZVwiPjwvaXJvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20taWYnIGlmPSdbWyFjb250cm9sRWxlbWVudF1dJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdzdGF0ZSc+W1tjb21wdXRlU3RhdGVEaXNwbGF5KHN0YXRlT2JqKV1dPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc3M6IE9iamVjdCxcbiAgICAgIGluRGlhbG9nOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBzdGF0ZU9iajogT2JqZWN0LFxuICAgICAgY29udHJvbEVsZW1lbnQ6IFN0cmluZyxcbiAgICAgIGV4dHJhT2JqOiB7XG4gICAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgICBjb21wdXRlZDogJ2NvbXB1dGVFeHRyYShoYXNzLCBzdGF0ZU9iaiwgX2F0dGFjaGVkKScsXG4gICAgICB9LFxuICAgICAgX2F0dGFjaGVkOiBCb29sZWFuLFxuICAgICAgZXh0cmFPYmpWaXNpYmxlOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIGNvbXB1dGVkOiAnY29tcHV0ZUV4dHJhVmlzaWJsZShleHRyYU9iaiwgaW5EaWFsb2cpJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fYXR0YWNoZWQgPSB0cnVlO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5faXNBdHRhY2hlZCA9IGZhbHNlO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBjb21wdXRlRXh0cmEoaGFzcywgc3RhdGVPYmosIGF0dGFjaGVkKSB7XG4gICAgaWYgKCFzdGF0ZU9iai5hdHRyaWJ1dGVzLmV4dHJhX2JhZGdlIHx8ICFhdHRhY2hlZCkgcmV0dXJuIFtdO1xuICAgIGxldCBleHRyYUJhZGdlcyA9IHN0YXRlT2JqLmF0dHJpYnV0ZXMuZXh0cmFfYmFkZ2U7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4dHJhQmFkZ2VzKSkge1xuICAgICAgZXh0cmFCYWRnZXMgPSBbZXh0cmFCYWRnZXNdO1xuICAgIH1cbiAgICByZXR1cm4gZXh0cmFCYWRnZXMubWFwKChleHRyYUJhZGdlKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgIGlmIChleHRyYUJhZGdlLmVudGl0eV9pZCAmJiBoYXNzLnN0YXRlc1tleHRyYUJhZGdlLmVudGl0eV9pZF0pIHtcbiAgICAgICAgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgd2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0KFxuICAgICAgICAgIHRoaXMsIGhhc3Muc3RhdGVzW2V4dHJhQmFkZ2UuZW50aXR5X2lkXSwgdGhpcy5pbkRpYWxvZyxcbiAgICAgICAgICAvKiBhbGxvd0hpZGRlbj0gKi9mYWxzZSkpO1xuICAgICAgfSBlbHNlIGlmIChleHRyYUJhZGdlLmF0dHJpYnV0ZSAmJlxuICAgICAgICAgICAgICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzW2V4dHJhQmFkZ2UuYXR0cmlidXRlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICBzdGF0ZTogU3RyaW5nKHN0YXRlT2JqLmF0dHJpYnV0ZXNbZXh0cmFCYWRnZS5hdHRyaWJ1dGVdKSxcbiAgICAgICAgICBfZG9tYWluOiAnbm9uZScsXG4gICAgICAgICAgZW50aXR5X2lkOiBudWxsLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgdW5pdF9vZl9tZWFzdXJlbWVudDogZXh0cmFCYWRnZS51bml0IH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICBsZXQgYmxhY2tsaXN0ID0gZXh0cmFCYWRnZS5ibGFja2xpc3Rfc3RhdGVzO1xuICAgICAgaWYgKGJsYWNrbGlzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShibGFja2xpc3QpKSB7XG4gICAgICAgICAgYmxhY2tsaXN0ID0gW2JsYWNrbGlzdF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJsYWNrbGlzdC5zb21lKHYgPT4gUmVnRXhwKHYpLnRlc3QocmVzdWx0LnN0YXRlLnRvU3RyaW5nKCkpKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQuX2VudGl0eURpc3BsYXkgPSAnJztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkuZmlsdGVyKGV4dHJhQmFkZ2UgPT4gZXh0cmFCYWRnZSAhPSBudWxsKTtcbiAgfVxuXG4gIGNvbXB1dGVFeHRyYVZpc2libGUoZXh0cmFPYmosIGluRGlhbG9nKSB7XG4gICAgaWYgKGluRGlhbG9nIHx8ICFleHRyYU9iaikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBleHRyYU9iai5sZW5ndGggIT09IDA7XG4gIH1cblxuICBleHRyYUNsYXNzKGV4dHJhT2JqVmlzaWJsZSkge1xuICAgIHJldHVybiBleHRyYU9ialZpc2libGUgPyAnZXh0cmEnIDogJyc7XG4gIH1cblxuICBfc2hvd0NvbnRyb2woaW5EaWFsb2csIHN0YXRlT2JqKSB7XG4gICAgaWYgKGluRGlhbG9nKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gIXN0YXRlT2JqLmF0dHJpYnV0ZXMuaGlkZV9jb250cm9sO1xuICB9XG5cbiAgY29tcHV0ZVN0YXRlRGlzcGxheShzdGF0ZU9iaikge1xuICAgIC8vIGhhTG9jYWxpemUgcmVtb3ZlZCBpbiAwLjYxXG4gICAgcmV0dXJuIHN1cGVyLmNvbXB1dGVTdGF0ZURpc3BsYXkodGhpcy5oYUxvY2FsaXplIHx8IHRoaXMubG9jYWxpemUsIHN0YXRlT2JqKTtcbiAgfVxuXG4gIGlzQ29uZmlybUNvbnRyb2xzKHN0YXRlT2JqKSB7XG4gICAgcmV0dXJuIHN0YXRlT2JqLmF0dHJpYnV0ZXMuY29uZmlybV9jb250cm9scyB8fFxuICAgICAgICBzdGF0ZU9iai5hdHRyaWJ1dGVzLmNvbmZpcm1fY29udHJvbHNfc2hvd19sb2NrO1xuICB9XG5cbiAgY2xpY2tIYW5kbGVyKGUpIHtcbiAgICB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignI292ZXJsYXknKS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIGNvbnN0IGxvY2sgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignI2xvY2snKTtcbiAgICBpZiAobG9jaykge1xuICAgICAgbG9jay5pY29uID0gJ21kaTpsb2NrLW9wZW4tb3V0bGluZSc7XG4gICAgICBsb2NrLnN0eWxlLm9wYWNpdHkgPSAnMC4xJztcbiAgICB9XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNvdmVybGF5Jykuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgaWYgKGxvY2spIHtcbiAgICAgICAgbG9jay5pY29uID0gJ21kaTpsb2NrLW91dGxpbmUnO1xuICAgICAgICBsb2NrLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgIH1cbiAgICB9LCA1MDAwKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgYXBwbHlUaGVtZXMoaGFzcywgZWxlbWVudCwgc3RhdGVPYmopIHtcbiAgICBjb25zdCB0aGVtZU5hbWUgPSBzdGF0ZU9iai5hdHRyaWJ1dGVzLnRoZW1lIHx8ICdkZWZhdWx0JztcbiAgICBhcHBseVRoZW1lc09uRWxlbWVudChcbiAgICAgIGVsZW1lbnQsIGhhc3MudGhlbWVzIHx8IHsgZGVmYXVsdF90aGVtZTogJ2RlZmF1bHQnLCB0aGVtZXM6IHt9IH0sIHRoZW1lTmFtZSk7XG4gIH1cblxuICBleHRyYURvbUNoYW5nZWQoKSB7XG4gICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2hhLXN0YXRlLWxhYmVsLWJhZGdlJylcbiAgICAgIC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwbHlUaGVtZXModGhpcy5oYXNzLCBlbGVtLCBlbGVtLnN0YXRlKTtcbiAgICAgIH0pO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2R5bmFtaWMtd2l0aC1leHRyYScsIER5bmFtaWNXaXRoRXh0cmEpO1xuIiwiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzJztcbmltcG9ydCBFdmVudHNNaXhpbiBmcm9tICcuLi9taXhpbnMvZXZlbnRzLW1peGluLmpzJztcbmltcG9ydCAnLi4vdXRpbHMvaG9va3MuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIEhhQ29uZmlnQ3VzdG9tVWkgZXh0ZW5kcyBFdmVudHNNaXhpbihQb2x5bWVyLkVsZW1lbnQpIHtcbiAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICA8c3R5bGUgaW5jbHVkZT1cImhhLXN0eWxlXCI+PC9zdHlsZT5cbiAgICA8YXBwLWhlYWRlci1sYXlvdXQgaGFzLXNjcm9sbGluZy1yZWdpb24+XG4gICAgICA8YXBwLWhlYWRlciBzbG90PVwiaGVhZGVyXCIgZml4ZWQ+XG4gICAgICAgIDxhcHAtdG9vbGJhcj5cbiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b25cbiAgICAgICAgICAgIGljb249J21kaTphcnJvdy1sZWZ0J1xuICAgICAgICAgICAgb24tY2xpY2s9J19iYWNrSGFuZGxlcidcbiAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj5cbiAgICAgICAgICA8ZGl2IG1haW4tdGl0bGU+Q3VzdG9tIFVJIHNldHRpbmdzPC9kaXY+XG4gICAgICAgIDwvYXBwLXRvb2xiYXI+XG4gICAgICA8L2FwcC1oZWFkZXI+XG5cbiAgICAgIDxoYS1jb25maWctc2VjdGlvbiBpcy13aWRlPSdbW2lzV2lkZV1dJz5cbiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0nRGV2aWNlIG5hbWUnPlxuICAgICAgICAgIDxkaXYgY2xhc3M9J2NhcmQtY29udGVudCc+XG4gICAgICAgICAgICBTZXQgZGV2aWNlIG5hbWUgc28gdGhhdCB5b3UgY2FuIHJlZmVyZW5jZSBpdCBpbiBwZXItZGV2aWNlIHNldHRpbmdzXG4gICAgICAgICAgICA8cGFwZXItaW5wdXRcbiAgICAgICAgICAgICAgbGFiZWw9J05hbWUnXG4gICAgICAgICAgICAgIHZhbHVlPSd7e25hbWV9fSdcbiAgICAgICAgICAgID48L3BhcGVyLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3BhcGVyLWNhcmQ+XG4gICAgICA8L2hhLWNvbmZpZy1zZWN0aW9uPlxuICAgIDwvYXBwLWhlYWRlci1sYXlvdXQ+XG4gICAgYDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNXaWRlOiBCb29sZWFuLFxuXG4gICAgICBuYW1lOiB7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgb2JzZXJ2ZXI6ICduYW1lQ2hhbmdlZCcsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZWFkeSgpIHtcbiAgICBzdXBlci5yZWFkeSgpO1xuICAgIHRoaXMubmFtZSA9IHdpbmRvdy5jdXN0b21VSS5nZXROYW1lKCk7XG4gIH1cblxuICBuYW1lQ2hhbmdlZChuYW1lKSB7XG4gICAgd2luZG93LmN1c3RvbVVJLnNldE5hbWUobmFtZSk7XG4gIH1cblxuICBfYmFja0hhbmRsZXIoKSB7XG4gICAgd2luZG93Lmhpc3RvcnkuYmFjaygpO1xuICAgIHRoaXMuZmlyZSgnbG9jYXRpb24tY2hhbmdlZCcpO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2hhLWNvbmZpZy1jdXN0b20tdWknLCBIYUNvbmZpZ0N1c3RvbVVpKTtcbiIsImltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9odG1sLXRhZy5qcyc7XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgSGFUaGVtZWRTbGlkZXIgZXh0ZW5kcyBQb2x5bWVyLkVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgIDxzdHlsZT5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgbWFyZ2luOiB2YXIoLS1oYS10aGVtZWQtc2xpZGVyLW1hcmdpbiwgaW5pdGlhbCk7XG4gICAgICB9XG4gICAgICAuZGlzYWJsZS1vZmYtd2hlbi1taW4ge1xuICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6ICB2YXIoLS1wYXBlci1zbGlkZXItcGluLWNvbG9yKTtcbiAgICAgIH1cblxuICAgICAgLmRpc2FibGUtb2ZmLXdoZW4tbWluLmlzLW9uIHtcbiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IpO1xuICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IpO1xuICAgICAgfVxuICAgICAgcGFwZXItc2xpZGVyIHtcbiAgICAgICAgbWFyZ2luOiA0cHggMDtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgICAgICB3aWR0aDogdmFyKC0taGEtcGFwZXItc2xpZGVyLXdpZHRoLCAyMDBweCk7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cblxuICAgIDxwYXBlci1zbGlkZXJcbiAgICAgICAgIG1pbj0nW1tfdGhlbWVkTWluXV0nXG4gICAgICAgICBtYXg9J1tbX2NvbXB1dGVBdHRyaWJ1dGUodGhlbWUsIFwibWF4XCIsIG1heCldXSdcbiAgICAgICAgIHBpbj0nW1tfY29tcHV0ZUF0dHJpYnV0ZSh0aGVtZSwgXCJwaW5cIiwgcGluKV1dJ1xuICAgICAgICAgY2xhc3MkPSdbW2NvbXB1dGVDbGFzcyh0aGVtZSwgaXNPbiwgX3RoZW1lZE1pbildXScgdmFsdWU9J1tbdmFsdWVdXSdcbiAgICAgICAgIG9uLWNoYW5nZT0ndmFsdWVDaGFuZ2VkJz5cbiAgICA8L3BhcGVyLXNsaWRlcj5cbiAgICBgO1xuICB9XG5cbiAgcmVhZHkoKSB7XG4gICAgc3VwZXIucmVhZHkoKTtcbiAgICB0aGlzLmRpc2FibGVPZmZXaGVuTWluID0gIXRoaXMuX2NvbXB1dGVBdHRyaWJ1dGUodGhpcy50aGVtZSwgJ29mZl93aGVuX21pbicsICF0aGlzLmRpc2FibGVPZmZXaGVuTWluKTtcbiAgICB0aGlzLmNvbXB1dGVFbmFibGVkVGhlbWVkUmVwb3J0V2hlbk5vdENoYW5nZWQodGhpcy50aGVtZSwgdGhpcy5kaXNhYmxlUmVwb3J0V2hlbk5vdENoYW5nZWQpO1xuICB9XG5cbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtaW46IHtcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICB2YWx1ZTogMCxcbiAgICAgIH0sXG4gICAgICBtYXg6IHtcbiAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICB2YWx1ZTogMTAwLFxuICAgICAgfSxcbiAgICAgIHBpbjoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgaXNPbjoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZGlzYWJsZU9mZldoZW5NaW46IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICBub3RpZnk6IHRydWUsXG4gICAgICB9LFxuICAgICAgZGlzYWJsZVJlcG9ydFdoZW5Ob3RDaGFuZ2VkOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG5cbiAgICAgIHRoZW1lOiBPYmplY3QsXG4gICAgICB2YWx1ZToge1xuICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIG5vdGlmeTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBfdGhlbWVkTWluOiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgY29tcHV0ZWQ6ICdfY29tcHV0ZUF0dHJpYnV0ZSh0aGVtZSwgXCJtaW5cIiwgbWluKScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2NvbXB1dGVFbmFibGVkVGhlbWVkUmVwb3J0V2hlbk5vdENoYW5nZWQodGhlbWUsIGRpc2FibGVSZXBvcnRXaGVuTm90Q2hhbmdlZCknLFxuICAgIF07XG4gIH1cblxuICBjb21wdXRlRW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkKHRoZW1lLCBkaXNhYmxlUmVwb3J0V2hlbk5vdENoYW5nZWQpIHtcbiAgICB0aGlzLl9lbmFibGVkVGhlbWVkUmVwb3J0V2hlbk5vdENoYW5nZWQgPSB0aGlzLl9jb21wdXRlQXR0cmlidXRlKFxuICAgICAgdGhlbWUsICdyZXBvcnRfd2hlbl9ub3RfY2hhbmdlZCcsICFkaXNhYmxlUmVwb3J0V2hlbk5vdENoYW5nZWQpO1xuICB9XG5cbiAgX2NvbXB1dGVBdHRyaWJ1dGUodGhlbWUsIGF0dHIsIGRlZikge1xuICAgIGlmICh0aGVtZSkge1xuICAgICAgaWYgKGF0dHIgaW4gdGhlbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoZW1lW2F0dHJdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmO1xuICB9XG5cbiAgY29tcHV0ZUNsYXNzKHRoZW1lLCBpc09uLCB0aGVtZWRNaW4pIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgaWYgKGlzT24pIHtcbiAgICAgIHJlc3VsdCArPSAnaXMtb24gJztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbXB1dGVBdHRyaWJ1dGUodGhlbWUsICdvZmZfd2hlbl9taW4nLCAhdGhpcy5kaXNhYmxlT2ZmV2hlbk1pbikgfHwgdGhlbWVkTWluID09PSAwKSB7XG4gICAgICAvLyBJZiBvZmZXaGVuTWluIGlzIGVuYWJsZWQgZG9uJ3QgY3VzdG9taXplLlxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7cmVzdWx0fWRpc2FibGUtb2ZmLXdoZW4tbWluYDtcbiAgfVxuXG4gIHZhbHVlQ2hhbmdlZChldikge1xuICAgIGlmICghdGhpcy5fZW5hYmxlZFRoZW1lZFJlcG9ydFdoZW5Ob3RDaGFuZ2VkICYmIHRoaXMudmFsdWUgPT09IGV2LnRhcmdldC52YWx1ZSkge1xuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBldi50YXJnZXQudmFsdWU7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnaGEtdGhlbWVkLXNsaWRlcicsIEhhVGhlbWVkU2xpZGVyKTtcbiIsImltcG9ydCBhcHBseVRoZW1lc09uRWxlbWVudCBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZG9tL2FwcGx5X3RoZW1lc19vbl9lbGVtZW50LmpzJztcbmltcG9ydCBjb21wdXRlU3RhdGVEb21haW4gZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9jb21wdXRlX3N0YXRlX2RvbWFpbi5qcyc7XG5pbXBvcnQgZHluYW1pY0NvbnRlbnRVcGRhdGVyIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9kb20vZHluYW1pY19jb250ZW50X3VwZGF0ZXIuanMnO1xuaW1wb3J0IHN0YXRlQ2FyZFR5cGUgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9zdGF0ZV9jYXJkX3R5cGUuanMnO1xuXG5pbXBvcnQgJy4uL3V0aWxzL2hvb2tzLmpzJztcbmltcG9ydCAnLi9zdGF0ZS1jYXJkLXdpdGgtc2xpZGVyLmpzJztcbmltcG9ydCAnLi9zdGF0ZS1jYXJkLXdpdGhvdXQtc2xpZGVyLmpzJztcblxuY29uc3QgU0hPV19MQVNUX0NIQU5HRURfQkxBQ0tMSVNURURfQ0FSRFMgPSBbJ2NvbmZpZ3VyYXRvciddO1xuY29uc3QgRE9NQUlOX1RPX1NMSURFUl9TVVBQT1JUID0ge1xuICBsaWdodDogMSwgLy8gU1VQUE9SVF9CUklHSFRORVNTXG4gIGNvdmVyOiA0LCAvLyBTVVBQT1JUX1NFVF9QT1NJVElPTlxuICBjbGltYXRlOiAxLCAvLyBTVVBQT1JUX1RBUkdFVF9URU1QRVJBVFVSRVxufTtcbmNvbnN0IFRZUEVfVE9fQ09OVFJPTCA9IHtcbiAgdG9nZ2xlOiAnaGEtZW50aXR5LXRvZ2dsZScsXG4gIGRpc3BsYXk6ICcnLFxuICBjb3ZlcjogJ2hhLWNvdmVyLWNvbnRyb2xzJyxcbn07XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgU3RhdGVDYXJkQ3VzdG9tVWkgZXh0ZW5kcyBQb2x5bWVyLkVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc3M6IE9iamVjdCxcblxuICAgICAgaW5EaWFsb2c6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcblxuICAgICAgc3RhdGVPYmo6IE9iamVjdCxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdpbnB1dENoYW5nZWQoaGFzcywgaW5EaWFsb2csIHN0YXRlT2JqKScsXG4gICAgXTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgaWYgKGNvbnRhaW5lci50YWdOYW1lID09PSAnRElWJyAmJlxuICAgICAgICAoY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnc3RhdGUnKSB8fCBjb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGlsZC1jYXJkJykpKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7XG5cbiAgICAgIC8vIFNpbmNlIHRoaXMgZG9lc24ndCBhY3R1YWxseSBjaGFuZ2UgdGhlIGJhY2tncm91bmQgLSBubyBuZWVkIHRvIGNsZWFyIGl0LlxuICAgICAgY29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAnYmFja2dyb3VuZC1jb2xvcicsICd2YXIoLS1wYXBlci1jYXJkLWJhY2tncm91bmQtY29sb3IsIGluaGVyaXQpJyk7XG5cbiAgICAgIC8vIFBvbHlmaWxsICd1cGRhdGVTdHlsZXMnLlxuICAgICAgaWYgKCFjb250YWluZXIudXBkYXRlU3R5bGVzKSB7XG4gICAgICAgIGNvbnRhaW5lci51cGRhdGVTdHlsZXMgPSAoc3R5bGVzKSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHN0eWxlc1trZXldKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faXNBdHRhY2hlZCA9IHRydWU7XG4gICAgdGhpcy5pbnB1dENoYW5nZWQodGhpcy5oYXNzLCB0aGlzLmluRGlhbG9nLCB0aGlzLnN0YXRlT2JqKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2lzQXR0YWNoZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIudXBkYXRlU3R5bGVzKHsgZGlzcGxheTogJycsIG1hcmdpbjogJycsIHBhZGRpbmc6ICcnIH0pO1xuICAgICAgYXBwbHlUaGVtZXNPbkVsZW1lbnQoXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciwgdGhpcy5oYXNzLnRoZW1lcyB8fCB7IGRlZmF1bHRfdGhlbWU6ICdkZWZhdWx0JywgdGhlbWVzOiB7fSB9LCAnZGVmYXVsdCcpO1xuICAgICAgdGhpcy5fY29udGFpbmVyID0gbnVsbDtcbiAgICB9XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIGJhZGdlTW9kZShoYXNzLCBzdGF0ZU9iaiwgZG9tYWluKSB7XG4gICAgY29uc3Qgc3RhdGVzID0gW107XG4gICAgaWYgKGRvbWFpbiA9PT0gJ2dyb3VwJykge1xuICAgICAgc3RhdGVPYmouYXR0cmlidXRlcy5lbnRpdHlfaWQuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBoYXNzLnN0YXRlc1tpZF07XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgICAgICAgY29uc29sZS53YXJuKGBVbmtub3duIElEICR7aWR9IGluIGdyb3VwICR7c3RhdGVPYmouZW50aXR5X2lkfWApO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0YXRlT2JqLmF0dHJpYnV0ZXMuYmFkZ2VzX2xpc3QgfHxcbiAgICAgICAgICAgIHN0YXRlT2JqLmF0dHJpYnV0ZXMuYmFkZ2VzX2xpc3QuaW5jbHVkZXMoc3RhdGUuZW50aXR5X2lkKSkge1xuICAgICAgICAgIHN0YXRlcy5wdXNoKHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdChcbiAgICAgICAgICAgIHRoaXMsIHN0YXRlLCBmYWxzZSAvKiBpbkRpYWxvZyAqLywgZmFsc2UgLyogYWxsb3dIaWRkZW4gKi8pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlcy5wdXNoKHN0YXRlT2JqKTtcbiAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyB9O1xuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnc3RhdGUnKSkge1xuICAgICAgICAgIHBhcmFtcy5tYXJnaW4gPSAndmFyKC0taGEtYmFkZ2VzLWNhcmQtbWFyZ2luLCAwKSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMocGFyYW1zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZHluYW1pY0NvbnRlbnRVcGRhdGVyKFxuICAgICAgdGhpcyxcbiAgICAgICdIQS1CQURHRVMtQ0FSRCcsXG4gICAgICB7IGhhc3MsIHN0YXRlcyB9KTtcbiAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIudXBkYXRlU3R5bGVzKHtcbiAgICAgICAgd2lkdGg6ICd2YXIoLS1oYS1iYWRnZXMtY2FyZC13aWR0aCwgaW5pdGlhbCknLFxuICAgICAgICAndGV4dC1hbGlnbic6ICd2YXIoLS1oYS1iYWRnZXMtY2FyZC10ZXh0LWFsaWduLCBpbml0aWFsKScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5sYXN0Q2hpbGQuc3R5bGUuZm9udFNpemUgPSAnODUlJztcblxuICAgIC8vIFNpbmNlIHRoaXMgdmFyaWFibGUgb25seSBhZmZlY3RzIGJhZGdlcyBtb2RlIC0gbm8gbmVlZCB0byBjbGVhbiBpdCB1cC5cbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLWhhLXN0YXRlLWxhYmVsLWJhZGdlLW1hcmdpbi1ib3R0b20nLCAnMCcpO1xuICB9XG5cbiAgY2xlYW5CYWRnZVN0eWxlKCkge1xuICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5lci51cGRhdGVTdHlsZXMoe1xuICAgICAgICBkaXNwbGF5OiAnJyxcbiAgICAgICAgd2lkdGg6ICcnLFxuICAgICAgICAndGV4dC1hbGlnbic6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlU3R5bGVzKHsgZGlzcGxheTogJycsIG1hcmdpbjogJycgfSk7XG4gIH1cblxuICBhcHBseVRoZW1lcyhoYXNzLCBtb2RpZmllZE9iaikge1xuICAgIGxldCB0aGVtZVRhcmdldCA9IHRoaXM7XG4gICAgbGV0IHRoZW1lTmFtZSA9ICdkZWZhdWx0JztcbiAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICB0aGVtZVRhcmdldCA9IHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVkT2JqLmF0dHJpYnV0ZXMudGhlbWUpIHtcbiAgICAgIHRoZW1lTmFtZSA9IG1vZGlmaWVkT2JqLmF0dHJpYnV0ZXMudGhlbWU7XG4gICAgfVxuICAgIGFwcGx5VGhlbWVzT25FbGVtZW50KFxuICAgICAgdGhlbWVUYXJnZXQsIGhhc3MudGhlbWVzIHx8IHsgZGVmYXVsdF90aGVtZTogJ2RlZmF1bHQnLCB0aGVtZXM6IHt9IH0sIHRoZW1lTmFtZSk7XG4gIH1cblxuICBtYXliZUhpZGVFbnRpdHkobW9kaWZpZWRPYmopIHtcbiAgICBpZiAoIW1vZGlmaWVkT2JqKSB7XG4gICAgICBpZiAodGhpcy5sYXN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci51cGRhdGVTdHlsZXMoeyBtYXJnaW46ICcwJywgcGFkZGluZzogJzAnIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5lci51cGRhdGVTdHlsZXMoeyBtYXJnaW46ICcnLCBwYWRkaW5nOiAnJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2xpZGVyRWxpZ2libGVfKGRvbWFpbiwgb2JqLCBpbkRpYWxvZykge1xuICAgIGlmIChpbkRpYWxvZykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBET01BSU5fVE9fU0xJREVSX1NVUFBPUlRbZG9tYWluXSAmJlxuICAgICAgKERPTUFJTl9UT19TTElERVJfU1VQUE9SVFtkb21haW5dICYgb2JqLmF0dHJpYnV0ZXMuc3VwcG9ydGVkX2ZlYXR1cmVzKSAmJlxuICAgICAgb2JqLmF0dHJpYnV0ZXMuc3RhdGVfY2FyZF9tb2RlICYmIG9iai5hdHRyaWJ1dGVzLnN0YXRlX2NhcmRfbW9kZSAhPT0gJ25vLXNsaWRlcic7XG4gIH1cblxuICBpbnB1dENoYW5nZWQoaGFzcywgaW5EaWFsb2csIHN0YXRlT2JqKSB7XG4gICAgaWYgKCFzdGF0ZU9iaiB8fCAhaGFzcyB8fCAhdGhpcy5faXNBdHRhY2hlZCkgcmV0dXJuO1xuICAgIGNvbnN0IGRvbWFpbiA9IGNvbXB1dGVTdGF0ZURvbWFpbihzdGF0ZU9iaik7XG4gICAgY29uc3QgbW9kaWZpZWRPYmogPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3QoXG4gICAgICB0aGlzLCBzdGF0ZU9iaiwgaW5EaWFsb2csIHRydWUgLyogYWxsb3dIaWRkZW4gKi8pO1xuXG4gICAgaWYgKHRoaXMubWF5YmVIaWRlRW50aXR5KG1vZGlmaWVkT2JqKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5hcHBseVRoZW1lcyhoYXNzLCBtb2RpZmllZE9iaik7XG5cbiAgICBpZiAoIWluRGlhbG9nICYmIG1vZGlmaWVkT2JqLmF0dHJpYnV0ZXMuc3RhdGVfY2FyZF9tb2RlID09PSAnYmFkZ2VzJykge1xuICAgICAgdGhpcy5iYWRnZU1vZGUoaGFzcywgbW9kaWZpZWRPYmosIGRvbWFpbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVndWxhck1vZGVfKGhhc3MsIGluRGlhbG9nLCBtb2RpZmllZE9iaiwgZG9tYWluKTtcbiAgICB9XG4gIH1cblxuICByZWd1bGFyTW9kZV8oaGFzcywgaW5EaWFsb2csIHN0YXRlT2JqLCBkb21haW4pIHtcbiAgICB0aGlzLmNsZWFuQmFkZ2VTdHlsZSgpO1xuXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgaGFzcyxcbiAgICAgIHN0YXRlT2JqLFxuICAgICAgaW5EaWFsb2csXG4gICAgfTtcbiAgICBjb25zdCBvcmlnaW5hbFN0YXRlQ2FyZFR5cGUgPSBzdGF0ZUNhcmRUeXBlKGhhc3MsIHN0YXRlT2JqKTtcbiAgICBsZXQgY3VzdG9tU3RhdGVDYXJkVHlwZTtcbiAgICBjb25zdCBzZWNvbmRhcnlTdGF0ZUNhcmRUeXBlID0gc3RhdGVPYmouYXR0cmlidXRlcy5zdGF0ZV9jYXJkX2N1c3RvbV91aV9zZWNvbmRhcnk7XG5cbiAgICBpZiAoZG9tYWluID09PSAnbGlnaHQnICYmIHRoaXMuc2xpZGVyRWxpZ2libGVfKGRvbWFpbiwgc3RhdGVPYmosIGluRGlhbG9nKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtcbiAgICAgICAgY29udHJvbEVsZW1lbnQ6ICdoYS1lbnRpdHktdG9nZ2xlJyxcbiAgICAgICAgc2VydmljZU1pbjogJ3R1cm5fb2ZmJyxcbiAgICAgICAgc2VydmljZU1heDogJ3R1cm5fb24nLFxuICAgICAgICB2YWx1ZU5hbWU6ICdicmlnaHRuZXNzJyxcbiAgICAgICAgZG9tYWluLFxuICAgICAgfSk7XG4gICAgICBjdXN0b21TdGF0ZUNhcmRUeXBlID0gJ3N0YXRlLWNhcmQtd2l0aC1zbGlkZXInO1xuICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSAnY292ZXInICYmIHRoaXMuc2xpZGVyRWxpZ2libGVfKGRvbWFpbiwgc3RhdGVPYmosIGluRGlhbG9nKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtcbiAgICAgICAgY29udHJvbEVsZW1lbnQ6ICdoYS1jb3Zlci1jb250cm9scycsXG4gICAgICAgIG1heDogMTAwLFxuICAgICAgICBzZXJ2aWNlTWluOiAnY2xvc2VfY292ZXInLFxuICAgICAgICBzZXJ2aWNlTWF4OiAnc2V0X2NvdmVyX3Bvc2l0aW9uJyxcbiAgICAgICAgc2V0VmFsdWVOYW1lOiAncG9zaXRpb24nLFxuICAgICAgICB2YWx1ZU5hbWU6ICdjdXJyZW50X3Bvc2l0aW9uJyxcbiAgICAgICAgbmFtZU9uOiAnb3BlbicsXG4gICAgICAgIGRvbWFpbixcbiAgICAgIH0pO1xuICAgICAgY3VzdG9tU3RhdGVDYXJkVHlwZSA9ICdzdGF0ZS1jYXJkLXdpdGgtc2xpZGVyJztcbiAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gJ2NsaW1hdGUnICYmIHRoaXMuc2xpZGVyRWxpZ2libGVfKGRvbWFpbiwgc3RhdGVPYmosIGluRGlhbG9nKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtcbiAgICAgICAgY29udHJvbEVsZW1lbnQ6ICdoYS1jbGltYXRlLXN0YXRlJyxcbiAgICAgICAgbWluOiBzdGF0ZU9iai5hdHRyaWJ1dGVzLm1pbl90ZW1wIHx8IC0xMDAsXG4gICAgICAgIG1heDogc3RhdGVPYmouYXR0cmlidXRlcy5tYXhfdGVtcCB8fCAyMDAsXG4gICAgICAgIHNlcnZpY2VNaW46ICdzZXRfdGVtcGVyYXR1cmUnLFxuICAgICAgICBzZXJ2aWNlTWF4OiAnc2V0X3RlbXBlcmF0dXJlJyxcbiAgICAgICAgdmFsdWVOYW1lOiAndGVtcGVyYXR1cmUnLFxuICAgICAgICBuYW1lT246ICcnLFxuICAgICAgICBkb21haW4sXG4gICAgICB9KTtcbiAgICAgIGN1c3RvbVN0YXRlQ2FyZFR5cGUgPSAnc3RhdGUtY2FyZC13aXRoLXNsaWRlcic7XG4gICAgfSBlbHNlIGlmIChUWVBFX1RPX0NPTlRST0xbb3JpZ2luYWxTdGF0ZUNhcmRUeXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMuY29udHJvbEVsZW1lbnQgPSBUWVBFX1RPX0NPTlRST0xbb3JpZ2luYWxTdGF0ZUNhcmRUeXBlXTtcbiAgICAgIGN1c3RvbVN0YXRlQ2FyZFR5cGUgPSAnc3RhdGUtY2FyZC13aXRob3V0LXNsaWRlcic7XG4gICAgfSBlbHNlIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzLnNob3dfbGFzdF9jaGFuZ2VkICYmXG4gICAgICAgICAgICAgICAhU0hPV19MQVNUX0NIQU5HRURfQkxBQ0tMSVNURURfQ0FSRFMuaW5jbHVkZXMob3JpZ2luYWxTdGF0ZUNhcmRUeXBlKSkge1xuICAgICAgcGFyYW1zLmluRGlhbG9nID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHN0YXRlT2JqLnN0YXRlID09PSAndW5hdmFpbGFibGUnKSB7XG4gICAgICBwYXJhbXMuY29udHJvbEVsZW1lbnQgPSAnJztcbiAgICB9XG4gICAgaWYgKHN0YXRlT2JqLmF0dHJpYnV0ZXMuY29udHJvbF9lbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5jb250cm9sRWxlbWVudCA9IHN0YXRlT2JqLmF0dHJpYnV0ZXMuY29udHJvbF9lbGVtZW50O1xuICAgIH1cblxuICAgIGR5bmFtaWNDb250ZW50VXBkYXRlcihcbiAgICAgIHRoaXMsXG4gICAgICAoc2Vjb25kYXJ5U3RhdGVDYXJkVHlwZSB8fCBjdXN0b21TdGF0ZUNhcmRUeXBlIHx8IGBTVEFURS1DQVJELSR7b3JpZ2luYWxTdGF0ZUNhcmRUeXBlfWApLnRvVXBwZXJDYXNlKCksXG4gICAgICBwYXJhbXMpO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3N0YXRlLWNhcmQtY3VzdG9tLXVpJywgU3RhdGVDYXJkQ3VzdG9tVWkpO1xuIiwiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL3V0aWxzL2h0bWwtdGFnLmpzJztcbmltcG9ydCBDdWlCYXNlRWxlbWVudCBmcm9tICcuL2N1aS1iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0ICcuL2R5bmFtaWMtd2l0aC1leHRyYS5qcyc7XG5pbXBvcnQgJy4vaGEtdGhlbWVkLXNsaWRlci5qcyc7XG5cbi8qKlxuICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAqL1xuY2xhc3MgU3RhdGVDYXJkV2l0aFNsaWRlciBleHRlbmRzIEN1aUJhc2VFbGVtZW50IHtcbiAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICA8c3R5bGUgaXM9XCJjdXN0b20tc3R5bGVcIiBpbmNsdWRlPVwiaXJvbi1mbGV4IGlyb24tZmxleC1hbGlnbm1lbnQgaXJvbi1mbGV4LWZhY3RvcnNcIj48L3N0eWxlPlxuICAgIDxzdHlsZT5cbiAgICAgICNjb250YWluZXIge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgICAuc2Vjb25kLWxpbmUsIC5zdGF0ZS1hbmQtdG9nZ2xlLCAuc3RhdGUtaW5mbyB7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC5ub3dyYXAgLnN0YXRlLWFuZC10b2dnbGUge1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBmbGV4LWdyb3c6IDA7XG4gICAgICB9XG4gICAgICAubm93cmFwIC5zZWNvbmQtbGluZSB7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5zZWNvbmQtbGluZSB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAyMHB4O1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDtcbiAgICAgICAgbWFyZ2luLXRvcDogLTIwcHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IC0xNnB4O1xuICAgICAgfVxuICAgICAgLnN0cmV0Y2ggLnNlY29uZC1saW5lLCAuc3RyZXRjaCBoYS10aGVtZWQtc2xpZGVyIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIC0taGEtcGFwZXItc2xpZGVyLXdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgICAgLm5vd3JhcCAuc3RhdGUtaW5mbyB7XG4gICAgICAgIG1pbi13aWR0aDogaW5pdGlhbDtcbiAgICAgIH1cbiAgICAgIGhhLXRoZW1lZC1zbGlkZXIsIC50b3Atd3JhcHBlciB7XG4gICAgICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC50b3Atd3JhcHBlci5zdHJldGNoIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG5cbiAgICAgIC5oaWRkZW4ge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG5cbiAgICA8ZGl2IGlkPSdjb250YWluZXInIGNsYXNzJD0naG9yaXpvbnRhbCBsYXlvdXQgZmxleCB0b3Atd3JhcHBlciBbW19jb21wdXRlV3JhcENsYXNzKG1vZGUsIHN0cmV0Y2hTbGlkZXIsIGxpbmVUb29Mb25nLCBpbkRpYWxvZyldXSc+XG4gICAgICA8ZGl2IGNsYXNzPSdob3Jpem9udGFsIGxheW91dCBqdXN0aWZpZWQgZmxleC1hdXRvIHN0YXRlLWFuZC10b2dnbGUnPlxuICAgICAgICA8c3RhdGUtaW5mb1xuICAgICAgICAgICAgY2xhc3M9J3N0YXRlLWluZm8gZmxleC1hdXRvJ1xuICAgICAgICAgICAgaGFzcz0nW1toYXNzXV0nXG4gICAgICAgICAgICBzdGF0ZS1vYmo9J1tbc3RhdGVPYmpdXSdcbiAgICAgICAgICAgIGluLWRpYWxvZz0nW1tzaG93TGFzdENoYW5nZWQoc3RhdGVPYmosIGluRGlhbG9nLCBleHRyYSldXSdcbiAgICAgICAgICAgIHNlY29uZGFyeS1saW5lJD0nW1toYXNFeHRyYShleHRyYSldXSdcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLXJlcGVhdCcgaXRlbXM9J1tbZXh0cmFdXSc+XG4gICAgICAgICAgICA8ZGl2PltbaXRlbV1dPC9kaXY+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9zdGF0ZS1pbmZvPlxuICAgICAgICA8dGVtcGxhdGUgaXM9J2RvbS1pZicgaWY9J1tbYnJlYWtTbGlkZXJdXScgY2xhc3M9J2hpZGRlbic+XG4gICAgICAgICAgPGR5bmFtaWMtd2l0aC1leHRyYSBoYXNzPSdbW2hhc3NdXScgc3RhdGUtb2JqPSdbW3N0YXRlT2JqXV0nIGNvbnRyb2wtZWxlbWVudD0nW1tjb250cm9sRWxlbWVudF1dJyBpbi1kaWFsb2c9J1tbaW5EaWFsb2ddXSc+PC9keW5hbWljLXdpdGgtZXh0cmE+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1tzaG93U2xpZGVyXV0nIHJlc3RhbXA+XG4gICAgICAgIDxkaXYgY2xhc3M9J2hvcml6b250YWwgbGF5b3V0IGZsZXgtYXV0byBlbmQtanVzdGlmaWVkIHNlY29uZC1saW5lJz5cbiAgICAgICAgICA8aGEtdGhlbWVkLXNsaWRlclxuICAgICAgICAgICAgaWQ9J3NsaWRlcidcbiAgICAgICAgICAgIG1heD1bW21heF1dXG4gICAgICAgICAgICBtaW49W1ttaW5dXVxuICAgICAgICAgICAgdGhlbWU9J1tbc3RhdGVPYmouYXR0cmlidXRlcy5zbGlkZXJfdGhlbWVdXSdcbiAgICAgICAgICAgIGlzLW9uPSdbW2lzT24oc3RhdGVPYmosIG5hbWVPbildXSdcbiAgICAgICAgICAgIHZhbHVlPSd7e3NsaWRlclZhbHVlfX0nXG4gICAgICAgICAgICBkaXNhYmxlLW9mZi13aGVuLW1pbj0ne3tkaXNhYmxlT2ZmV2hlbk1pbn19J1xuICAgICAgICAgICAgb24tY2hhbmdlPSdzbGlkZXJDaGFuZ2VkJ1xuICAgICAgICAgICAgb24tY2xpY2s9J3N0b3BQcm9wYWdhdGlvbic+XG4gICAgICAgICAgPC9oYS10aGVtZWQtc2xpZGVyPlxuICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0nZG9tLWlmJyBpZj0nW1shYnJlYWtTbGlkZXJdXSc+XG4gICAgICAgICAgICA8ZHluYW1pYy13aXRoLWV4dHJhIGhhc3M9J1tbaGFzc11dJyBzdGF0ZS1vYmo9J1tbc3RhdGVPYmpdXScgY29udHJvbC1lbGVtZW50PSdbW2NvbnRyb2xFbGVtZW50XV0nIGluLWRpYWxvZz0nW1tpbkRpYWxvZ11dJz48L2R5bmFtaWMtd2l0aC1leHRyYT5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZG9tYWluOiBTdHJpbmcsXG4gICAgICBzZXJ2aWNlTWluOiBTdHJpbmcsXG4gICAgICBzZXJ2aWNlTWF4OiBTdHJpbmcsXG4gICAgICB2YWx1ZU5hbWU6IFN0cmluZyxcbiAgICAgIHNldFZhbHVlTmFtZTogU3RyaW5nLFxuICAgICAgbmFtZU9uOiB7IHR5cGU6IFN0cmluZywgdmFsdWU6ICdvbicgfSxcbiAgICAgIG1pbjogeyB0eXBlOiBOdW1iZXIsIHZhbHVlOiAwIH0sXG4gICAgICBtYXg6IHsgdHlwZTogTnVtYmVyLCB2YWx1ZTogMjU1IH0sXG5cbiAgICAgIHNsaWRlclZhbHVlOiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgdmFsdWU6IDAsXG4gICAgICB9LFxuICAgICAgZGlzYWJsZU9mZldoZW5NaW46IEJvb2xlYW4sXG4gICAgICBtb2RlOiBTdHJpbmcsXG4gICAgICBzdHJldGNoU2xpZGVyOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBicmVha1NsaWRlcjoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgaGlkZVNsaWRlcjoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgbGluZVRvb0xvbmc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG1pbkxpbmVCcmVhazogTnVtYmVyLFxuICAgICAgbWF4TGluZUJyZWFrOiBOdW1iZXIsXG4gICAgICBzaG93U2xpZGVyOiB7XG4gICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgY29tcHV0ZWQ6ICdfc2hvd1NsaWRlcihpbkRpYWxvZywgc3RhdGVPYmosIGhpZGVTbGlkZXIpJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJlYWR5KCkge1xuICAgIHN1cGVyLnJlYWR5KCk7XG4gICAgdGhpcy5fb25Jcm9uUmVzaXplID0gdGhpcy5fb25Jcm9uUmVzaXplLmJpbmQodGhpcyk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fb25Jcm9uUmVzaXplKTtcbiAgICB0aGlzLl93YWl0Rm9yTGF5b3V0KCk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fb25Jcm9uUmVzaXplKTtcbiAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3N0YXRlT2JqQ2hhbmdlZChzdGF0ZU9iaiwgbmFtZU9uLCB2YWx1ZU5hbWUpJyxcbiAgICBdO1xuICB9XG5cbiAgX3dhaXRGb3JMYXlvdXQoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0Nvbm5lY3RlZCkgcmV0dXJuO1xuICAgIHRoaXMuX3NldE1vZGUoKTtcbiAgICBpZiAodGhpcy5fZnJhbWVJZCkgcmV0dXJuO1xuICAgIHRoaXMucmVhZHlUb0NvbXB1dGUgPSBmYWxzZTtcbiAgICB0aGlzLl9mcmFtZUlkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcbiAgICAgIHRoaXMucmVhZHlUb0NvbXB1dGUgPSB0cnVlO1xuICAgICAgdGhpcy5fb25Jcm9uUmVzaXplKCk7XG4gICAgfSk7XG4gIH1cblxuICBfc2V0TW9kZSgpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBoaWRlU2xpZGVyOiB0aGlzLm1vZGUgPT09ICdoaWRlLXNsaWRlcicgJiYgdGhpcy5saW5lVG9vTG9uZyxcbiAgICAgIGJyZWFrU2xpZGVyOlxuICAgICAgICAgICAodGhpcy5tb2RlID09PSAnYnJlYWstc2xpZGVyJyB8fCB0aGlzLm1vZGUgPT09ICdoaWRlLXNsaWRlcicpICYmXG4gICAgICAgICAgIHRoaXMubGluZVRvb0xvbmcsXG4gICAgfTtcbiAgICBpZiAoIXRoaXMuc2hvd1NsaWRlcikge1xuICAgICAgb2JqLmJyZWFrU2xpZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0aWVzKG9iaik7XG4gIH1cblxuICBfb25Jcm9uUmVzaXplKCkge1xuICAgIGlmICghdGhpcy5yZWFkeVRvQ29tcHV0ZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICduby1zbGlkZXInKSB7XG4gICAgICB0aGlzLnNldFByb3BlcnRpZXMoe1xuICAgICAgICBoaWRlU2xpZGVyOiB0cnVlLFxuICAgICAgICBicmVha1NsaWRlcjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2QnJlYWtTbGlkZXIgPSB0aGlzLmJyZWFrU2xpZGVyO1xuICAgIGNvbnN0IHByZXZIaWRlU2xpZGVyID0gdGhpcy5oaWRlU2xpZGVyO1xuICAgIHRoaXMuc2V0UHJvcGVydGllcyh7XG4gICAgICBsaW5lVG9vTG9uZzogZmFsc2UsXG4gICAgICBoaWRlU2xpZGVyOiBmYWxzZSxcbiAgICAgIGJyZWFrU2xpZGVyOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGhpcy4kO1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgIGlmIChjb250YWluZXJXaWR0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGlmIChjb250YWluZXJXaWR0aCA8PSB0aGlzLm1pbkxpbmVCcmVhaykge1xuICAgICAgdGhpcy5saW5lVG9vTG9uZyA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChjb250YWluZXJXaWR0aCA+PSB0aGlzLm1heExpbmVCcmVhaykge1xuICAgICAgdGhpcy5saW5lVG9vTG9uZyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldkhpZGVTbGlkZXIgJiYgdGhpcy5tb2RlID09PSAnaGlkZS1zbGlkZXInKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdW5oaWRlIHRoZSBzbGlkZXIgaW4gb3JkZXIgdG8gcmVjYWxjdWxhdGUgaGVpZ2h0LlxuICAgICAgICB0aGlzLl93YWl0Rm9yTGF5b3V0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBzdGF0ZUhlaWdodCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuc3RhdGUtaW5mbycpLmNsaWVudEhlaWdodDtcbiAgICAgIHRoaXMubGluZVRvb0xvbmcgPSBjb250YWluZXJIZWlnaHQgPiBzdGF0ZUhlaWdodCAqIDEuNTtcbiAgICAgIGlmICh0aGlzLmxpbmVUb29Mb25nKSB7XG4gICAgICAgIHRoaXMubWluTGluZUJyZWFrID0gY29udGFpbmVyV2lkdGg7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2QnJlYWtTbGlkZXIpIHtcbiAgICAgICAgdGhpcy5tYXhMaW5lQnJlYWsgPSBjb250YWluZXJXaWR0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc2V0TW9kZSgpO1xuICB9XG5cbiAgX2NvbXB1dGVXcmFwQ2xhc3MobW9kZSwgc3RyZXRjaFNsaWRlciwgbGluZVRvb0xvbmcsIGluRGlhbG9nKSB7XG4gICAgaWYgKGluRGlhbG9nKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAnc2luZ2xlLWxpbmUnKSB7XG4gICAgICByZXR1cm4gJ25vd3JhcCc7XG4gICAgfVxuICAgIGlmIChzdHJldGNoU2xpZGVyICYmIGxpbmVUb29Mb25nKSB7XG4gICAgICByZXR1cm4gJ3N0cmV0Y2ggd3JhcCc7XG4gICAgfVxuICAgIHJldHVybiAnd3JhcCc7XG4gIH1cblxuICBfc2hvd1NsaWRlcihpbkRpYWxvZywgc3RhdGVPYmosIGhpZGVTbGlkZXIpIHtcbiAgICBpZiAoaW5EaWFsb2cgfHwgaGlkZVNsaWRlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNsaWRlckNoYW5nZWQoZXYpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGV2LnRhcmdldC52YWx1ZSwgMTApO1xuICAgIGNvbnN0IHBhcmFtID0geyBlbnRpdHlfaWQ6IHRoaXMuc3RhdGVPYmouZW50aXR5X2lkIH07XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNzbGlkZXInKTtcbiAgICBpZiAoZXYudGFyZ2V0ICE9PSB0YXJnZXQpIHtcbiAgICAgIC8vIE5vIFNoYWRvdyBET00gLSB3ZSBoYXZlIGFjY2VzcyB0byBvcmlnaW5hbCB0YXJnZXQuXG4gICAgICAoeyB0YXJnZXQgfSA9IGV2KTtcbiAgICB9IGVsc2UgaWYgKGV2LnBhdGgpIHtcbiAgICAgIFt0YXJnZXRdID0gZXYucGF0aDtcbiAgICB9IGVsc2UgaWYgKGV2LmNvbXBvc2VkUGF0aCkge1xuICAgICAgW3RhcmdldF0gPSBldi5jb21wb3NlZFBhdGgoKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAwIHx8ICh2YWx1ZSA8PSB0YXJnZXQubWluICYmICF0aGlzLmRpc2FibGVPZmZXaGVuTWluKSkge1xuICAgICAgdGhpcy5oYXNzLmNhbGxTZXJ2aWNlKHRoaXMuZG9tYWluLCB0aGlzLnNlcnZpY2VNaW4sIHBhcmFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1bdGhpcy5zZXRWYWx1ZU5hbWUgfHwgdGhpcy52YWx1ZU5hbWVdID0gdmFsdWU7XG4gICAgICB0aGlzLmhhc3MuY2FsbFNlcnZpY2UodGhpcy5kb21haW4sIHRoaXMuc2VydmljZU1heCwgcGFyYW0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlT2JqQ2hhbmdlZChzdGF0ZU9iaiwgbmFtZU9uLCB2YWx1ZU5hbWUpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBzbGlkZXJWYWx1ZTogdGhpcy5pc09uKHN0YXRlT2JqLCBuYW1lT24pID8gc3RhdGVPYmouYXR0cmlidXRlc1t2YWx1ZU5hbWVdIDogMCxcbiAgICB9O1xuICAgIGlmIChzdGF0ZU9iaikge1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHtcbiAgICAgICAgbWluTGluZUJyZWFrOiAwLFxuICAgICAgICBtYXhMaW5lQnJlYWs6IDk5OSxcbiAgICAgICAgaGlkZVNsaWRlcjogZmFsc2UsXG4gICAgICAgIGJyZWFrU2xpZGVyOiBmYWxzZSxcbiAgICAgICAgbGluZVRvb0xvbmc6IGZhbHNlLFxuICAgICAgICBtb2RlOiBzdGF0ZU9iai5hdHRyaWJ1dGVzLnN0YXRlX2NhcmRfbW9kZSxcbiAgICAgICAgc3RyZXRjaFNsaWRlcjogISFzdGF0ZU9iai5hdHRyaWJ1dGVzLnN0cmV0Y2hfc2xpZGVyLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydGllcyhvYmopO1xuICAgIGlmIChzdGF0ZU9iaikge1xuICAgICAgdGhpcy5fd2FpdEZvckxheW91dCgpO1xuICAgIH1cbiAgfVxuXG4gIGlzT24oc3RhdGVPYmosIG5hbWVPbikge1xuICAgIHJldHVybiBzdGF0ZU9iaiAmJiAoIW5hbWVPbiB8fCBzdGF0ZU9iai5zdGF0ZSA9PT0gbmFtZU9uKTtcbiAgfVxuXG4gIHN0b3BQcm9wYWdhdGlvbihldikge1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3N0YXRlLWNhcmQtd2l0aC1zbGlkZXInLCBTdGF0ZUNhcmRXaXRoU2xpZGVyKTtcbiIsImltcG9ydCB7IGh0bWwgfSBmcm9tICdAcG9seW1lci9wb2x5bWVyL2xpYi91dGlscy9odG1sLXRhZy5qcyc7XG5pbXBvcnQgQ3VpQmFzZUVsZW1lbnQgZnJvbSAnLi9jdWktYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCAnLi9keW5hbWljLXdpdGgtZXh0cmEuanMnO1xuXG4vKipcbiAqIEBleHRlbmRzIEhUTUxFbGVtZW50XG4gKi9cbmNsYXNzIFN0YXRlQ2FyZFdpdGhvdXRTbGlkZXIgZXh0ZW5kcyBDdWlCYXNlRWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlIGlzPVwiY3VzdG9tLXN0eWxlXCIgaW5jbHVkZT1cImlyb24tZmxleCBpcm9uLWZsZXgtYWxpZ25tZW50XCI+PC9zdHlsZT5cbiAgICA8c3R5bGU+XG4gICAgICAjY29udGFpbmVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG5cbiAgICA8ZGl2IGlkPSdjb250YWluZXInIGNsYXNzPSdob3Jpem9udGFsIGxheW91dCBqdXN0aWZpZWQnPlxuICAgICAgPHN0YXRlLWluZm9cbiAgICAgICAgICBoYXNzPSdbW2hhc3NdXSdcbiAgICAgICAgICBjbGFzcz0nc3RhdGUtaW5mbydcbiAgICAgICAgICBzdGF0ZS1vYmo9J1tbc3RhdGVPYmpdXSdcbiAgICAgICAgICBpbi1kaWFsb2c9J1tbc2hvd0xhc3RDaGFuZ2VkKHN0YXRlT2JqLCBpbkRpYWxvZywgZXh0cmEpXV0nXG4gICAgICAgICAgc2Vjb25kYXJ5LWxpbmUkPSdbW2hhc0V4dHJhKGV4dHJhKV1dJz5cbiAgICAgICAgPHRlbXBsYXRlIGlzPSdkb20tcmVwZWF0JyBpdGVtcz0nW1tleHRyYV1dJz5cbiAgICAgICAgICA8ZGl2PltbaXRlbV1dPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3N0YXRlLWluZm8+XG4gICAgICA8ZHluYW1pYy13aXRoLWV4dHJhXG4gICAgICAgICAgaGFzcz0nW1toYXNzXV0nXG4gICAgICAgICAgc3RhdGUtb2JqPSdbW3N0YXRlT2JqXV0nXG4gICAgICAgICAgY29udHJvbC1lbGVtZW50PSdbW2NvbnRyb2xFbGVtZW50XV0nXG4gICAgICAgICAgaW4tZGlhbG9nPSdbW2luRGlhbG9nXV0nPlxuICAgICAgPC9keW5hbWljLXdpdGgtZXh0cmE+XG4gICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdzdGF0ZS1jYXJkLXdpdGhvdXQtc2xpZGVyJywgU3RhdGVDYXJkV2l0aG91dFNsaWRlcik7XG4iLCIvLyBQb2x5bWVyIGxlZ2FjeSBldmVudCBoZWxwZXJzIHVzZWQgY291cnRlc3kgb2YgdGhlIFBvbHltZXIgcHJvamVjdC5cbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbi8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbi8vIG1ldDpcbi8vXG4vLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4vLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbi8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJcbi8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbi8vIGRpc3RyaWJ1dGlvbi5cbi8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbi8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4vL1xuLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuLy8gXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbi8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuXG5leHBvcnQgZGVmYXVsdCAoc3VwZXJDbGFzcykgPT4ge1xuICAvKipcbiAgICogQGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAgICovXG4gIGNsYXNzIEV2ZW50c01peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS5cbiAgICAgKiBAcGFyYW0geyo9fSBkZXRhaWwgRGV0YWlsIHZhbHVlIGNvbnRhaW5pbmcgZXZlbnQtc3BlY2lmaWNcbiAgICAgKiAgIHBheWxvYWQuXG4gICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fVxuICAgICAqICBvcHRpb25zIE9iamVjdCBzcGVjaWZ5aW5nIG9wdGlvbnMuICBUaGVzZSBtYXkgaW5jbHVkZTpcbiAgICAgKiAgYGJ1YmJsZXNgIChib29sZWFuLCBkZWZhdWx0cyB0byBgdHJ1ZWApLFxuICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kXG4gICAgICogIGBub2RlYCBvbiB3aGljaCB0byBmaXJlIHRoZSBldmVudCAoSFRNTEVsZW1lbnQsIGRlZmF1bHRzIHRvIGB0aGlzYCkuXG4gICAgICogQHJldHVybiB7RXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuXG4gICAgICovXG4gICAgZmlyZSh0eXBlLCBkZXRhaWwgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCh0eXBlLCB7XG4gICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcyxcbiAgICAgICAgY2FuY2VsYWJsZTogQm9vbGVhbihvcHRpb25zLmNhbmNlbGFibGUpLFxuICAgICAgICBjb21wb3NlZDogb3B0aW9ucy5jb21wb3NlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuY29tcG9zZWQsXG4gICAgICB9KTtcbiAgICAgIGV2ZW50LmRldGFpbCA9IGRldGFpbDtcbiAgICAgIGNvbnN0IG5vZGUgPSBvcHRpb25zLm5vZGUgfHwgdGhpcztcbiAgICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBFdmVudHNNaXhpbjtcbn07XG4iLCJpbXBvcnQgaGFzc0F0dHJpYnV0ZXNVdGlsIGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL3V0aWwvaGFzcy1hdHRyaWJ1dGVzLXV0aWwuanMnO1xuXG53aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwgPSB3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwgfHwge307XG5jb25zdCBTVVBQT1JURURfU0xJREVSX01PREVTID0gW1xuICAnc2luZ2xlLWxpbmUnLCAnYnJlYWstc2xpZGVyJywgJ2JyZWFrLXNsaWRlci10b2dnbGUnLCAnaGlkZS1zbGlkZXInLCAnbm8tc2xpZGVyJyxcbl07XG5cbmNvbnN0IGN1c3RvbVVpQXR0cmlidXRlcyA9IHtcbiAgZ3JvdXA6IHVuZGVmaW5lZCxcbiAgZGV2aWNlOiB1bmRlZmluZWQsXG4gIHRlbXBsYXRlczogdW5kZWZpbmVkLFxuICBjb250cm9sX2VsZW1lbnQ6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgc3RhdGVfY2FyZF9tb2RlOiB7XG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBsaWdodDogU1VQUE9SVEVEX1NMSURFUl9NT0RFUy5jb25jYXQoJ2JhZGdlcycpLFxuICAgICAgY292ZXI6IFNVUFBPUlRFRF9TTElERVJfTU9ERVMuY29uY2F0KCdiYWRnZXMnKSxcbiAgICAgIGNsaW1hdGU6IFNVUFBPUlRFRF9TTElERVJfTU9ERVMuY29uY2F0KCdiYWRnZXMnKSxcbiAgICAgICcqJzogWydiYWRnZXMnXSxcbiAgICB9LFxuICB9LFxuICBzdGF0ZV9jYXJkX2N1c3RvbV91aV9zZWNvbmRhcnk6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgYmFkZ2VzX2xpc3Q6IHsgdHlwZTogJ2pzb24nIH0sXG4gIHNob3dfbGFzdF9jaGFuZ2VkOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICBoaWRlX2NvbnRyb2w6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIGV4dHJhX2RhdGFfdGVtcGxhdGU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgZXh0cmFfYmFkZ2U6IHsgdHlwZTogJ2pzb24nIH0sXG4gIHN0cmV0Y2hfc2xpZGVyOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICBzbGlkZXJfdGhlbWU6IHsgdHlwZTogJ2pzb24nIH0sXG4gIHRoZW1lOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gIGNvbmZpcm1fY29udHJvbHM6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIGNvbmZpcm1fY29udHJvbHNfc2hvd19sb2NrOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICBoaWRlX2luX2RlZmF1bHRfdmlldzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbn07XG53aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFUyA9IGhhc3NBdHRyaWJ1dGVzVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTO1xud2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLlVOS05PV05fVFlQRSA9IGhhc3NBdHRyaWJ1dGVzVXRpbC5VTktOT1dOX1RZUEU7XG5PYmplY3QuYXNzaWduKHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTLCBjdXN0b21VaUF0dHJpYnV0ZXMpO1xuIiwiaW1wb3J0IGFwcGx5VGhlbWVzT25FbGVtZW50IGZyb20gJy4uLy4uL2hvbWUtYXNzaXN0YW50LXBvbHltZXIvc3JjL2NvbW1vbi9kb20vYXBwbHlfdGhlbWVzX29uX2VsZW1lbnQuanMnO1xuaW1wb3J0IGNvbXB1dGVTdGF0ZURvbWFpbiBmcm9tICcuLi8uLi9ob21lLWFzc2lzdGFudC1wb2x5bWVyL3NyYy9jb21tb24vZW50aXR5L2NvbXB1dGVfc3RhdGVfZG9tYWluLmpzJztcbmltcG9ydCBnZXRWaWV3RW50aXRpZXMgZnJvbSAnLi4vLi4vaG9tZS1hc3Npc3RhbnQtcG9seW1lci9zcmMvY29tbW9uL2VudGl0eS9nZXRfdmlld19lbnRpdGllcy5qcyc7XG5cbmltcG9ydCAnLi4vZWxlbWVudHMvaGEtY29uZmlnLWN1c3RvbS11aS5qcyc7XG5pbXBvcnQgVkVSU0lPTiBmcm9tICcuL3ZlcnNpb24uanMnO1xuaW1wb3J0ICcuL2hhc3MtYXR0cmlidXRlLXV0aWwuanMnO1xuXG53aW5kb3cuY3VzdG9tVUkgPSB3aW5kb3cuY3VzdG9tVUkgfHwge1xuICBTVVBQT1JURURfU0xJREVSX01PREVTOiBbXG4gICAgJ3NpbmdsZS1saW5lJywgJ2JyZWFrLXNsaWRlcicsICdicmVhay1zbGlkZXItdG9nZ2xlJywgJ2hpZGUtc2xpZGVyJywgJ25vLXNsaWRlcicsXG4gIF0sXG5cbiAgZG9tSG9zdChlbGVtKSB7XG4gICAgaWYgKGVsZW0gPT09IGRvY3VtZW50KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByb290ID0gZWxlbS5nZXRSb290Tm9kZSgpO1xuICAgIHJldHVybiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpID8gLyoqIEB0eXBlIHtTaGFkb3dSb290fSAqLyAocm9vdCkuaG9zdCA6IHJvb3Q7XG4gIH0sXG5cbiAgbGlnaHRPclNoYWRvdyhlbGVtLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBlbGVtLnNoYWRvd1Jvb3QgP1xuICAgICAgZWxlbS5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIDpcbiAgICAgIGVsZW0ucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0sXG5cbiAgZ2V0RWxlbWVudEhpZXJhcmNoeShyb290LCBoaWVyYXJjaHkpIHtcbiAgICBpZiAocm9vdCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZWxlbSA9IGhpZXJhcmNoeS5zaGlmdCgpO1xuICAgIGlmIChlbGVtKSB7XG4gICAgICByZXR1cm4gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoXG4gICAgICAgIHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KHJvb3QsIGVsZW0pLCBoaWVyYXJjaHkpO1xuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfSxcblxuICBnZXRDb250ZXh0KGVsZW0pIHtcbiAgICBpZiAoZWxlbS5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbGVtLl9jb250ZXh0ID0gW107XG4gICAgICBmb3IgKGxldCBlbGVtZW50ID0gKGVsZW0udGFnTmFtZSA9PT0gJ0hBLUVOVElUSUVTLUNBUkQnID8gd2luZG93LmN1c3RvbVVJLmRvbUhvc3QoZWxlbSkgOiBlbGVtKTtcbiAgICAgICAgZWxlbWVudDsgZWxlbWVudCA9IHdpbmRvdy5jdXN0b21VSS5kb21Ib3N0KGVsZW1lbnQpKSB7XG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50YWdOYW1lKSB7XG4gICAgICAgICAgY2FzZSAnSEEtRU5USVRJRVMtQ0FSRCc6XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5ncm91cEVudGl0eSkge1xuICAgICAgICAgICAgICBlbGVtLl9jb250ZXh0LnB1c2goZWxlbWVudC5ncm91cEVudGl0eS5lbnRpdHlfaWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lmdyb3VwRW50aXR5ID09PSBmYWxzZSAmJiBlbGVtZW50LnN0YXRlcyAmJiBlbGVtZW50LnN0YXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZWxlbS5fY29udGV4dC5wdXNoKGBncm91cC4ke2NvbXB1dGVTdGF0ZURvbWFpbihlbGVtZW50LnN0YXRlc1swXSl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdNT1JFLUlORk8tR1JPVVAnOlxuICAgICAgICAgIGNhc2UgJ1NUQVRFLUNBUkQtQ09OVEVOVCc6XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0ZU9iaikge1xuICAgICAgICAgICAgICBlbGVtLl9jb250ZXh0LnB1c2goZWxlbWVudC5zdGF0ZU9iai5lbnRpdHlfaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnSEEtQ0FSRFMnOlxuICAgICAgICAgICAgZWxlbS5fY29udGV4dC5wdXNoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZXcnKSB8fCAnZGVmYXVsdF92aWV3Jyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyBubyBkZWZhdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsZW0uX2NvbnRleHQucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbS5fY29udGV4dDtcbiAgfSxcblxuICBmaW5kTWF0Y2goa2V5LCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm4gbnVsbDtcbiAgICBpZiAob3B0aW9uc1trZXldKSByZXR1cm4ga2V5O1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvcHRpb25zKS5maW5kKG9wdGlvbiA9PiBrZXkubWF0Y2goYF4ke29wdGlvbn0kYCkpO1xuICB9LFxuXG4gIG1heWJlQ2hhbmdlT2JqZWN0QnlEZXZpY2Uoc3RhdGVPYmopIHtcbiAgICBjb25zdCBuYW1lID0gd2luZG93LmN1c3RvbVVJLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBzdGF0ZU9iajtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZmluZE1hdGNoKG5hbWUsIHN0YXRlT2JqLmF0dHJpYnV0ZXMuZGV2aWNlKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gc3RhdGVPYmo7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlT2JqLmF0dHJpYnV0ZXMuZGV2aWNlW21hdGNoXSk7XG5cbiAgICBpZiAoIU9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmxlbmd0aCkgcmV0dXJuIHN0YXRlT2JqO1xuICAgIHJldHVybiB3aW5kb3cuY3VzdG9tVUkuYXBwbHlBdHRyaWJ1dGVzKHN0YXRlT2JqLCBhdHRyaWJ1dGVzKTtcbiAgfSxcblxuICBtYXliZUNoYW5nZU9iamVjdEJ5R3JvdXAoZWxlbSwgc3RhdGVPYmopIHtcbiAgICBjb25zdCBjb250ZXh0ID0gd2luZG93LmN1c3RvbVVJLmdldENvbnRleHQoZWxlbSk7XG4gICAgaWYgKCFjb250ZXh0KSByZXR1cm4gc3RhdGVPYmo7XG5cbiAgICBpZiAoIXN0YXRlT2JqLmF0dHJpYnV0ZXMuZ3JvdXApIHtcbiAgICAgIHJldHVybiBzdGF0ZU9iajtcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgIGNvbnRleHQuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmZpbmRNYXRjaChjLCBzdGF0ZU9iai5hdHRyaWJ1dGVzLmdyb3VwKTtcbiAgICAgIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzLmdyb3VwW21hdGNoXSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGF0dHJpYnV0ZXMsIHN0YXRlT2JqLmF0dHJpYnV0ZXMuZ3JvdXBbbWF0Y2hdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghT2JqZWN0LmtleXMoYXR0cmlidXRlcykubGVuZ3RoKSByZXR1cm4gc3RhdGVPYmo7XG5cbiAgICByZXR1cm4gd2luZG93LmN1c3RvbVVJLmFwcGx5QXR0cmlidXRlcyhzdGF0ZU9iaiwgYXR0cmlidXRlcyk7XG4gIH0sXG5cbiAgX3NldEtlZXAob2JqLCB2YWx1ZSkge1xuICAgIGlmIChvYmouX2N1aV9rZWVwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9iai5fY3VpX2tlZXAgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqLl9jdWlfa2VlcCA9IG9iai5fY3VpX2tlZXAgJiYgdmFsdWU7XG4gICAgfVxuICB9LFxuXG4gIG1heWJlQXBwbHlUZW1wbGF0ZUF0dHJpYnV0ZXMoaGFzcywgc3RhdGVzLCBzdGF0ZU9iaiwgYXR0cmlidXRlcykge1xuICAgIGlmICghYXR0cmlidXRlcy50ZW1wbGF0ZXMpIHtcbiAgICAgIHdpbmRvdy5jdXN0b21VSS5fc2V0S2VlcChzdGF0ZU9iaiwgdHJ1ZSk7XG4gICAgICByZXR1cm4gc3RhdGVPYmo7XG4gICAgfVxuICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSB7fTtcbiAgICBsZXQgaGFzR2xvYmFsID0gZmFsc2U7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzLnRlbXBsYXRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF0dHJpYnV0ZXMudGVtcGxhdGVzW2tleV07XG4gICAgICBpZiAodGVtcGxhdGUubWF0Y2goL1xcYihlbnRpdGllc3xoYXNzKVxcYi8pKSB7XG4gICAgICAgIGhhc0dsb2JhbCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHdpbmRvdy5jdXN0b21VSS5jb21wdXRlVGVtcGxhdGUoXG4gICAgICAgIHRlbXBsYXRlLCBoYXNzLCBzdGF0ZXMsIHN0YXRlT2JqLCBhdHRyaWJ1dGVzLFxuICAgICAgICAoc3RhdGVPYmoudW50ZW1wbGF0ZWRfYXR0cmlidXRlcyAmJiBzdGF0ZU9iai51bnRlbXBsYXRlZF9hdHRyaWJ1dGVzW2tleV0pIHx8XG4gICAgICAgICAgICBhdHRyaWJ1dGVzW2tleV0sXG4gICAgICAgIHN0YXRlT2JqLnVudGVtcGxhdGVkX3N0YXRlIHx8IHN0YXRlT2JqLnN0YXRlKTtcbiAgICAgIC8vIEluIGNhc2Ugb2YgbnVsbCBkb24ndCBzZXQgdGhlIHZhbHVlLlxuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm47XG4gICAgICBuZXdBdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgIGlmIChrZXkgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBzdGF0ZU9iai5zdGF0ZSkge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ19zdGF0ZURpc3BsYXknKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gc3RhdGVPYmouX3N0YXRlRGlzcGxheSkge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBhdHRyaWJ1dGVzW2tleV0pIHtcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmN1c3RvbVVJLl9zZXRLZWVwKHN0YXRlT2JqLCAhaGFzR2xvYmFsKTtcbiAgICBpZiAoIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybiBzdGF0ZU9iajtcbiAgICB9XG4gICAgaWYgKHN0YXRlT2JqLmF0dHJpYnV0ZXMgPT09IGF0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIFdlIGFyZSBvcGVyYXRpbmcgb24gcmVhbCBhdHRyaWJ1dGVzLiBSZXBsYWNlIHRoZW0uXG4gICAgICBjb25zdCByZXN1bHQgPSB3aW5kb3cuY3VzdG9tVUkuYXBwbHlBdHRyaWJ1dGVzKHN0YXRlT2JqLCBuZXdBdHRyaWJ1dGVzKTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV3QXR0cmlidXRlcywgJ3N0YXRlJykpIHtcbiAgICAgICAgaWYgKG5ld0F0dHJpYnV0ZXMuc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHQuc3RhdGUgPSBTdHJpbmcobmV3QXR0cmlidXRlcy5zdGF0ZSk7XG4gICAgICAgICAgcmVzdWx0LnVudGVtcGxhdGVkX3N0YXRlID0gc3RhdGVPYmouc3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV3QXR0cmlidXRlcywgJ19zdGF0ZURpc3BsYXknKSkge1xuICAgICAgICByZXN1bHQuX3N0YXRlRGlzcGxheSA9IG5ld0F0dHJpYnV0ZXMuX3N0YXRlRGlzcGxheTtcbiAgICAgICAgcmVzdWx0LnVudGVtcGxhdGVkX3N0YXRlRGlzcGxheSA9IHN0YXRlT2JqLl9zdGF0ZURpc3BsYXk7XG4gICAgICB9XG4gICAgICB3aW5kb3cuY3VzdG9tVUkuX3NldEtlZXAocmVzdWx0LCAhaGFzR2xvYmFsKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIE9wZXJhdGluZyBvbiBjb250ZXh0LWF3YXJlIGF0dHJpYnV0ZXMuIFJldHVybiBzaGFsbG93IGNvcHkgb2Ygb2JqZWN0LlxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZU9iaik7XG4gIH0sXG5cbiAgbWF5YmVBcHBseVRlbXBsYXRlcyhoYXNzLCBzdGF0ZXMsIHN0YXRlT2JqKSB7XG4gICAgY29uc3QgbmV3UmVzdWx0ID0gd2luZG93LmN1c3RvbVVJLm1heWJlQXBwbHlUZW1wbGF0ZUF0dHJpYnV0ZXMoXG4gICAgICBoYXNzLCBzdGF0ZXMsIHN0YXRlT2JqLCBzdGF0ZU9iai5hdHRyaWJ1dGVzKTtcbiAgICBsZXQgaGFzQ2hhbmdlcyA9IChuZXdSZXN1bHQgIT09IHN0YXRlT2JqKTtcblxuICAgIGZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlcyhvYmopIHtcbiAgICAgIGlmICghb2JqKSByZXR1cm47XG4gICAgICBPYmplY3QudmFsdWVzKG9iaikuZm9yRWFjaCgoYXR0cmlidXRlcykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVBcHBseVRlbXBsYXRlQXR0cmlidXRlcyhcbiAgICAgICAgICBoYXNzLCBzdGF0ZXMsIG5ld1Jlc3VsdCwgYXR0cmlidXRlcyk7XG4gICAgICAgIGhhc0NoYW5nZXMgfD0gKHJlc3VsdCAhPT0gbmV3UmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgY2hlY2tBdHRyaWJ1dGVzKG9iai5kZXZpY2UpO1xuICAgICAgY2hlY2tBdHRyaWJ1dGVzKG9iai5ncm91cCk7XG4gICAgfVxuXG4gICAgY2hlY2tBdHRyaWJ1dGVzKHN0YXRlT2JqLmF0dHJpYnV0ZXMuZGV2aWNlKTtcbiAgICBjaGVja0F0dHJpYnV0ZXMoc3RhdGVPYmouYXR0cmlidXRlcy5ncm91cCk7XG4gICAgaWYgKG5ld1Jlc3VsdCAhPT0gc3RhdGVPYmopIHJldHVybiBuZXdSZXN1bHQ7XG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZU9iaik7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZU9iajtcbiAgfSxcblxuICBhcHBseUF0dHJpYnV0ZXMoc3RhdGVPYmosIGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5X2lkOiBzdGF0ZU9iai5lbnRpdHlfaWQsXG4gICAgICBzdGF0ZTogc3RhdGVPYmouc3RhdGUsXG4gICAgICBhdHRyaWJ1dGVzOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZU9iai5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKSxcbiAgICAgIHVudGVtcGxhdGVkX2F0dHJpYnV0ZXM6IHN0YXRlT2JqLmF0dHJpYnV0ZXMsXG4gICAgICBsYXN0X2NoYW5nZWQ6IHN0YXRlT2JqLmxhc3RfY2hhbmdlZCxcbiAgICB9O1xuICB9LFxuXG4gIG1heWJlQ2hhbmdlT2JqZWN0KGVsZW0sIHN0YXRlT2JqLCBpbkRpYWxvZywgYWxsb3dIaWRkZW4pIHtcbiAgICBpZiAoaW5EaWFsb2cpIHJldHVybiBzdGF0ZU9iajtcbiAgICBsZXQgb2JqID0gd2luZG93LmN1c3RvbVVJLm1heWJlQ2hhbmdlT2JqZWN0QnlEZXZpY2Uoc3RhdGVPYmopO1xuICAgIG9iaiA9IHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdEJ5R3JvdXAoZWxlbSwgb2JqKTtcbiAgICBvYmogPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVBcHBseVRlbXBsYXRlQXR0cmlidXRlcyhcbiAgICAgIGVsZW0uaGFzcywgZWxlbS5oYXNzLnN0YXRlcywgb2JqLCBvYmouYXR0cmlidXRlcyk7XG5cbiAgICBpZiAob2JqICE9PSBzdGF0ZU9iaiAmJiBvYmouYXR0cmlidXRlcy5oaWRkZW4gJiYgYWxsb3dIaWRkZW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9LFxuXG4gIGZpeEdyb3VwVGl0bGVzKCkge1xuICAgIGNvbnN0IGhvbWVBc3Npc3RhbnRNYWluID0gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoZG9jdW1lbnQsIFtcbiAgICAgICdob21lLWFzc2lzdGFudCcsXG4gICAgICAnaG9tZS1hc3Npc3RhbnQtbWFpbiddKTtcbiAgICBpZiAoaG9tZUFzc2lzdGFudE1haW4gPT09IG51bGwpIHtcbiAgICAgIC8vIERPTSBub3QgcmVhZHkuIFdhaXQgMSBzZWNvbmQuXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCh3aW5kb3cuY3VzdG9tVUkuZml4R3JvdXBUaXRsZXMsIDEwMDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhQ2FyZHMgPSB3aW5kb3cuY3VzdG9tVUkuZ2V0RWxlbWVudEhpZXJhcmNoeShob21lQXNzaXN0YW50TWFpbiwgW1xuICAgICAgJ3BhcnRpYWwtY2FyZHMnLFxuICAgICAgJ2hhLWNhcmRzW3ZpZXctdmlzaWJsZV0nXSk7XG4gICAgaWYgKGhhQ2FyZHMgPT09IG51bGwpIHJldHVybjtcbiAgICBjb25zdCBtYWluID0gd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3coaGFDYXJkcywgJy5tYWluJykgfHwgaGFDYXJkcy4kLm1haW47XG4gICAgY29uc3QgY2FyZHMgPSBtYWluLnF1ZXJ5U2VsZWN0b3JBbGwoJ2hhLWVudGl0aWVzLWNhcmQnKTtcbiAgICBjYXJkcy5mb3JFYWNoKChjYXJkKSA9PiB7XG4gICAgICBpZiAoY2FyZC5ncm91cEVudGl0eSkge1xuICAgICAgICBjb25zdCBvYmogPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVDaGFuZ2VPYmplY3QoXG4gICAgICAgICAgY2FyZCxcbiAgICAgICAgICBjYXJkLmdyb3VwRW50aXR5LFxuICAgICAgICAgIGZhbHNlIC8qIGluRGlhbG9nICovLFxuICAgICAgICAgIGZhbHNlIC8qIGFsbG93SGlkZGVuICovKTtcbiAgICAgICAgaWYgKG9iaiAhPT0gY2FyZC5ncm91cEVudGl0eSAmJiBvYmouYXR0cmlidXRlcy5mcmllbmRseV9uYW1lKSB7XG4gICAgICAgICAgY29uc3QgbmFtZUVsZW0gPSB3aW5kb3cuY3VzdG9tVUkubGlnaHRPclNoYWRvdyhjYXJkLCAnLm5hbWUnKTtcbiAgICAgICAgICBuYW1lRWxlbS50ZXh0Q29udGVudCA9IG9iai5hdHRyaWJ1dGVzLmZyaWVuZGx5X25hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBjb250cm9sQ29sdW1ucyhjb2x1bW5zKSB7XG4gICAgY29uc3QgcGFydGlhbENhcmRzID0gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoZG9jdW1lbnQsIFtcbiAgICAgICdob21lLWFzc2lzdGFudCcsXG4gICAgICAnaG9tZS1hc3Npc3RhbnQtbWFpbicsXG4gICAgICAncGFydGlhbC1jYXJkcyddKTtcbiAgICBpZiAocGFydGlhbENhcmRzID09PSBudWxsKSB7XG4gICAgICAvLyBET00gbm90IHJlYWR5LiBXYWl0IDEgc2Vjb25kLlxuICAgICAgd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgIHdpbmRvdy5jdXN0b21VSS5jb250cm9sQ29sdW1ucy5iaW5kKG51bGwsIGNvbHVtbnMpLFxuICAgICAgICAxMDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFydGlhbENhcmRzLm1xbHMuZm9yRWFjaCgobXFsKSA9PiB7XG4gICAgICBtcWwucmVtb3ZlTGlzdGVuZXIocGFydGlhbENhcmRzLmhhbmRsZVdpbmRvd0NoYW5nZSk7XG4gICAgfSk7XG4gICAgcGFydGlhbENhcmRzLm1xbHMgPSBjb2x1bW5zLm1hcCgod2lkdGgpID0+IHtcbiAgICAgIGNvbnN0IG1xbCA9IHdpbmRvdy5tYXRjaE1lZGlhKGAobWluLXdpZHRoOiAke3dpZHRofXB4KWApO1xuICAgICAgbXFsLmFkZExpc3RlbmVyKHBhcnRpYWxDYXJkcy5oYW5kbGVXaW5kb3dDaGFuZ2UpO1xuICAgICAgcmV0dXJuIG1xbDtcbiAgICB9KTtcbiAgICBwYXJ0aWFsQ2FyZHMuaGFuZGxlV2luZG93Q2hhbmdlKCk7XG4gIH0sXG5cbiAgdXNlQ3VzdG9taXplcigpIHtcbiAgICBjb25zdCBtYWluID0gd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3coZG9jdW1lbnQsICdob21lLWFzc2lzdGFudCcpO1xuICAgIGNvbnN0IGN1c3RvbWl6ZXIgPSBtYWluLmhhc3Muc3RhdGVzWydjdXN0b21pemVyLmN1c3RvbWl6ZXInXTtcbiAgICBpZiAoIWN1c3RvbWl6ZXIpIHJldHVybjtcbiAgICBpZiAoY3VzdG9taXplci5hdHRyaWJ1dGVzLmNvbHVtbnMpIHtcbiAgICAgIHdpbmRvdy5jdXN0b21VSS5jb250cm9sQ29sdW1ucyhjdXN0b21pemVyLmF0dHJpYnV0ZXMuY29sdW1ucyk7XG4gICAgfVxuICAgIGlmIChjdXN0b21pemVyLmF0dHJpYnV0ZXMuaGlkZV9hdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAod2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsICYmIHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5MT0dJQ19TVEFURV9BVFRSSUJVVEVTKSB7XG4gICAgICAgIGN1c3RvbWl6ZXIuYXR0cmlidXRlcy5oaWRlX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgd2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVMsIGF0dHIpKSB7XG4gICAgICAgICAgICB3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFU1thdHRyXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB1cGRhdGVDb25maWdQYW5lbCgpIHtcbiAgICBpZiAoIXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvY29uZmlnJykpIHJldHVybjtcbiAgICBjb25zdCBoYVBhbmVsQ29uZmlnID0gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoZG9jdW1lbnQsIFtcbiAgICAgICdob21lLWFzc2lzdGFudCcsXG4gICAgICAnaG9tZS1hc3Npc3RhbnQtbWFpbicsXG4gICAgICAncGFydGlhbC1wYW5lbC1yZXNvbHZlcicsXG4gICAgICAnaGEtcGFuZWwtY29uZmlnJ10pO1xuICAgIGlmICghaGFQYW5lbENvbmZpZykge1xuICAgICAgLy8gRE9NIG5vdCByZWFkeS4gV2FpdCAxMDBtcy5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHdpbmRvdy5jdXN0b21VSS51cGRhdGVDb25maWdQYW5lbCwgMTAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGFDb25maWdOYXZpZ2F0aW9uID0gd2luZG93LmN1c3RvbVVJLmdldEVsZW1lbnRIaWVyYXJjaHkoaGFQYW5lbENvbmZpZywgW1xuICAgICAgJ2hhLWNvbmZpZy1kYXNoYm9hcmQnLFxuICAgICAgJ2hhLWNvbmZpZy1uYXZpZ2F0aW9uJ10pO1xuICAgIGlmIChoYUNvbmZpZ05hdmlnYXRpb24pIHtcbiAgICAgIC8vIEhhQ29uZmlnTmF2aWdhdGlvbiBzdGFydGVkIHVzaW5nIGxvY2FsaXplIG9uIDIxLjAxLjIwMThcbiAgICAgIGlmIChoYUNvbmZpZ05hdmlnYXRpb24ubG9jYWxpemUgJiYgIWhhQ29uZmlnTmF2aWdhdGlvbi5jdWlQYXRjaCkge1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uY3VpUGF0Y2ggPSB0cnVlO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX29yaWdpbmFsQ29tcHV0ZUxvYWRlZCA9IGhhQ29uZmlnTmF2aWdhdGlvbi5fY29tcHV0ZUxvYWRlZDtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9vcmlnaW5hbENvbXB1dGVDYXB0aW9uID0gaGFDb25maWdOYXZpZ2F0aW9uLl9jb21wdXRlQ2FwdGlvbjtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9vcmlnaW5hbENvbXB1dGVEZXNjcmlwdGlvbiA9IGhhQ29uZmlnTmF2aWdhdGlvbi5fY29tcHV0ZURlc2NyaXB0aW9uO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX2NvbXB1dGVMb2FkZWQgPSAoaGFzcywgcGFnZSkgPT5cbiAgICAgICAgICBwYWdlID09PSAnY3VzdG9tdWknIHx8IGhhQ29uZmlnTmF2aWdhdGlvbi5fb3JpZ2luYWxDb21wdXRlTG9hZGVkKGhhc3MsIHBhZ2UpO1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24uX2NvbXB1dGVDYXB0aW9uID0gKHBhZ2UsIGxvY2FsaXplKSA9PlxuICAgICAgICAgIChwYWdlID09PSAnY3VzdG9tdWknID8gJ0N1c3RvbSBVSScgOiBoYUNvbmZpZ05hdmlnYXRpb24uX29yaWdpbmFsQ29tcHV0ZUNhcHRpb24ocGFnZSwgbG9jYWxpemUpKTtcbiAgICAgICAgaGFDb25maWdOYXZpZ2F0aW9uLl9jb21wdXRlRGVzY3JpcHRpb24gPSAocGFnZSwgbG9jYWxpemUpID0+XG4gICAgICAgICAgKHBhZ2UgPT09ICdjdXN0b211aScgPyAnU2V0VUkgdHdlYWtzJyA6IGhhQ29uZmlnTmF2aWdhdGlvbi5fb3JpZ2luYWxDb21wdXRlRGVzY3JpcHRpb24ocGFnZSwgbG9jYWxpemUpKTtcbiAgICAgIH1cbiAgICAgIGlmICghaGFDb25maWdOYXZpZ2F0aW9uLnBhZ2VzLnNvbWUoY29uZiA9PiBjb25mID09PSAnY3VzdG9tdWknIHx8IGNvbmYuZG9tYWluID09PSAnY3VzdG9tdWknKSkge1xuICAgICAgICBoYUNvbmZpZ05hdmlnYXRpb24ucHVzaCgncGFnZXMnLCBoYUNvbmZpZ05hdmlnYXRpb24ubG9jYWxpemUgPyAnY3VzdG9tdWknIDoge1xuICAgICAgICAgIGRvbWFpbjogJ2N1c3RvbXVpJyxcbiAgICAgICAgICBjYXB0aW9uOiAnQ3VzdG9tIFVJJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NldCBVSSB0d2Vha3MuJyxcbiAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBnZXRIYUNvbmZpZ0N1c3RvbVVpID0gKCkgPT4ge1xuICAgICAgY29uc3QgaGFDb25maWdDdXN0b21VaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hhLWNvbmZpZy1jdXN0b20tdWknKTtcbiAgICAgIGhhQ29uZmlnQ3VzdG9tVWkuaXNXaWRlID0gaGFQYW5lbENvbmZpZy5pc1dpZGU7XG4gICAgICBoYUNvbmZpZ0N1c3RvbVVpLnNldEF0dHJpYnV0ZSgncGFnZS1uYW1lJywgJ2N1c3RvbXVpJyk7XG4gICAgICByZXR1cm4gaGFDb25maWdDdXN0b21VaTtcbiAgICB9O1xuXG4gICAgY29uc3QgaXJvblBhZ2VzID0gd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3coaGFQYW5lbENvbmZpZywgJ2lyb24tcGFnZXMnKTtcbiAgICBpZiAoaXJvblBhZ2VzKSB7XG4gICAgICBpZiAoaXJvblBhZ2VzLmxhc3RFbGVtZW50Q2hpbGQudGFnTmFtZSAhPT0gJ0hBLUNPTkZJRy1DVVNUT00tVUknKSB7XG4gICAgICAgIGNvbnN0IGhhQ29uZmlnQ3VzdG9tVWkgPSBnZXRIYUNvbmZpZ0N1c3RvbVVpKCk7XG4gICAgICAgIGlyb25QYWdlcy5hcHBlbmRDaGlsZChoYUNvbmZpZ0N1c3RvbVVpKTtcbiAgICAgICAgaXJvblBhZ2VzLmFkZEV2ZW50TGlzdGVuZXIoJ2lyb24taXRlbXMtY2hhbmdlZCcsICgpID0+IHtcbiAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9jb25maWcvY3VzdG9tdWknKSkge1xuICAgICAgICAgICAgaXJvblBhZ2VzLnNlbGVjdCgnY3VzdG9tdWknKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByb290ID0gaGFQYW5lbENvbmZpZy5zaGFkb3dSb290IHx8IGhhUGFuZWxDb25maWc7XG4gICAgICBpZiAocm9vdC5sYXN0RWxlbWVudENoaWxkLnRhZ05hbWUgIT09ICdIQS1DT05GSUctQ1VTVE9NLVVJJykge1xuICAgICAgICBjb25zdCBoYUNvbmZpZ0N1c3RvbVVpID0gZ2V0SGFDb25maWdDdXN0b21VaSgpO1xuICAgICAgICByb290LmFwcGVuZENoaWxkKGhhQ29uZmlnQ3VzdG9tVWkpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmlzaWJsZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvY29uZmlnL2N1c3RvbXVpJyk7XG4gICAgICByb290Lmxhc3RFbGVtZW50Q2hpbGQuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICB9XG4gIH0sXG5cbiAgaW5zdGFsbFN0YXRlc0hvb2soKSB7XG4gICAgY29uc3QgaG9tZUFzc2lzdGFudCA9IGN1c3RvbUVsZW1lbnRzLmdldCgnaG9tZS1hc3Npc3RhbnQnKTtcbiAgICBpZiAoIWhvbWVBc3Npc3RhbnQgfHwgIWhvbWVBc3Npc3RhbnQucHJvdG90eXBlLl91cGRhdGVIYXNzKSByZXR1cm47XG4gICAgY29uc3Qgb3JpZ2luYWxVcGRhdGUgPSBob21lQXNzaXN0YW50LnByb3RvdHlwZS5fdXBkYXRlSGFzcztcbiAgICBob21lQXNzaXN0YW50LnByb3RvdHlwZS5fdXBkYXRlSGFzcyA9IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIC8vIFVzZSBuYW1lZCBmdW5jdGlvbiB0byBwcmVzZXJ2ZSAndGhpcycuXG4gICAgICBjb25zdCB7IGhhc3MgfSA9IHRoaXM7XG4gICAgICBpZiAob2JqLnN0YXRlcykge1xuICAgICAgICBPYmplY3Qua2V5cyhvYmouc3RhdGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBvYmouc3RhdGVzW2tleV07XG4gICAgICAgICAgaWYgKGVudGl0eS5fY3VpX2tlZXApIHJldHVybjtcbiAgICAgICAgICBjb25zdCBuZXdFbnRpdHkgPSB3aW5kb3cuY3VzdG9tVUkubWF5YmVBcHBseVRlbXBsYXRlcyhoYXNzLCBvYmouc3RhdGVzLCBlbnRpdHkpO1xuICAgICAgICAgIGlmIChoYXNzLnN0YXRlcyAmJiBlbnRpdHkgIT09IGhhc3Muc3RhdGVzW2tleV0pIHtcbiAgICAgICAgICAgIC8vIE5ldyBzdGF0ZSBhcnJpdmVkLiBQdXQgbW9kaWZpZWQgc3RhdGUgaW4uXG4gICAgICAgICAgICBvYmouc3RhdGVzW2tleV0gPSBuZXdFbnRpdHk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbnRpdHkgIT09IG5ld0VudGl0eSkge1xuICAgICAgICAgICAgLy8gSXQncyB0aGUgc2FtZSBzdGF0ZSBidXQgY29udGVudHMgY2hhbmdlZCBkdWUgdG8gb3RoZXIgc3RhdGUgY2hhbmdlcy5cbiAgICAgICAgICAgIG9iai5zdGF0ZXNba2V5XSA9IG5ld0VudGl0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxVcGRhdGUuY2FsbCh0aGlzLCBvYmopO1xuICAgICAgaWYgKG9iai50aGVtZXMgJiYgaGFzcy5fdGhlbWVXYWl0ZXJzKSB7XG4gICAgICAgIGhhc3MuX3RoZW1lV2FpdGVycy5mb3JFYWNoKHdhaXRlciA9PiB3YWl0ZXIuc3RhdGVDaGFuZ2VkKHdhaXRlci5zdGF0ZSkpO1xuICAgICAgICBoYXNzLl90aGVtZVdhaXRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBtYWluID0gd2luZG93LmN1c3RvbVVJLmxpZ2h0T3JTaGFkb3coZG9jdW1lbnQsICdob21lLWFzc2lzdGFudCcpO1xuICAgIGlmIChtYWluLmhhc3MgJiYgbWFpbi5oYXNzLnN0YXRlcykge1xuICAgICAgbWFpbi5fdXBkYXRlSGFzcyh7IHN0YXRlczogbWFpbi5oYXNzLnN0YXRlcyB9KTtcbiAgICB9XG4gIH0sXG5cbiAgaW5zdGFsbFBhcnRpYWxDYXJkcygpIHtcbiAgICBjb25zdCBwYXJ0aWFsQ2FyZHMgPSBjdXN0b21FbGVtZW50cy5nZXQoJ3BhcnRpYWwtY2FyZHMnKTtcbiAgICBpZiAoIXBhcnRpYWxDYXJkcyB8fCAhcGFydGlhbENhcmRzLnByb3RvdHlwZS5fZGVmYXVsdFZpZXdGaWx0ZXIpIHJldHVybjtcbiAgICBwYXJ0aWFsQ2FyZHMucHJvdG90eXBlLl9kZWZhdWx0Vmlld0ZpbHRlciA9IChoYXNzLCBlbnRpdHlJZCkgPT4ge1xuICAgICAgaWYgKGhhc3Muc3RhdGVzW2VudGl0eUlkXS5hdHRyaWJ1dGVzLmhpZGRlbikgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZXhjbHVkZXMgPSB7fTtcbiAgICAgIE9iamVjdC52YWx1ZXMoaGFzcy5zdGF0ZXMpLmZvckVhY2goKGVudGl0eSkgPT4ge1xuICAgICAgICBpZiAoZW50aXR5LmF0dHJpYnV0ZXMgJiYgZW50aXR5LmF0dHJpYnV0ZXMuaGlkZV9pbl9kZWZhdWx0X3ZpZXcpIHtcbiAgICAgICAgICBjb25zdCBleGNsdWRlRW50aXR5SWQgPSBlbnRpdHkuZW50aXR5X2lkO1xuICAgICAgICAgIGlmIChleGNsdWRlc1tleGNsdWRlRW50aXR5SWRdKSByZXR1cm47XG4gICAgICAgICAgZXhjbHVkZXNbZXhjbHVkZUVudGl0eUlkXSA9IGVudGl0eTtcbiAgICAgICAgICBpZiAoZW50aXR5LmF0dHJpYnV0ZXMudmlldykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgZXhjbHVkZXMsIGdldFZpZXdFbnRpdGllcyhoYXNzLnN0YXRlcywgZW50aXR5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhZXhjbHVkZXNbZW50aXR5SWRdO1xuICAgIH07XG4gIH0sXG5cbiAgLy8gQWxsb3dzIGNoYW5naW5nIHRoZSAnRXhlY3V0ZScgLyAnQWN0aXZhdGUnIHRleHQgb24gc2NyaXB0L3NjZW5lIGNhcmRzLlxuICBpbnN0YWxsQWN0aW9uTmFtZShlbGVtZW50TmFtZSkge1xuICAgIGNvbnN0IGtsYXNzID0gY3VzdG9tRWxlbWVudHMuZ2V0KGVsZW1lbnROYW1lKTtcbiAgICBpZiAoIWtsYXNzIHx8ICFrbGFzcy5wcm90b3R5cGUpIHJldHVybjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoa2xhc3MucHJvdG90eXBlLCAnbG9jYWxpemUnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGN1c3RvbUxvY2FsaXplKHYpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZU9iaiAmJiB0aGlzLnN0YXRlT2JqLmF0dHJpYnV0ZXMgJiZcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZU9iai5hdHRyaWJ1dGVzLmFjdGlvbl9uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZU9iai5hdHRyaWJ1dGVzLmFjdGlvbl9uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5fX2RhdGEubG9jYWxpemUodik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1c3RvbUxvY2FsaXplO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHt9LFxuICAgIH0pO1xuICB9LFxuXG4gIC8vIEFsbG93cyB0aGVtaW5nIFwicmVndWxhclwiIHRvcCBiYWRnZXMuXG4gIGluc3RhbGxIYVN0YXRlTGFiZWxCYWRnZSgpIHtcbiAgICBjb25zdCBoYVN0YXRlTGFiZWxCYWRnZSA9IGN1c3RvbUVsZW1lbnRzLmdldCgnaGEtc3RhdGUtbGFiZWwtYmFkZ2UnKTtcbiAgICBpZiAoIWhhU3RhdGVMYWJlbEJhZGdlIHx8ICFoYVN0YXRlTGFiZWxCYWRnZS5wcm90b3R5cGUuc3RhdGVDaGFuZ2VkKSByZXR1cm47XG4gICAgLy8gVXNlIG5hbWVkIGZ1bmN0aW9uIHRvIHByZXNlcnZlICd0aGlzJy5cbiAgICBoYVN0YXRlTGFiZWxCYWRnZS5wcm90b3R5cGUuc3RhdGVDaGFuZ2VkID0gZnVuY3Rpb24gdXBkYXRlKHN0YXRlT2JqKSB7XG4gICAgICAvLyBUT0RPOiBDYWxsIHdpbmRvdy5jdXN0b21VSS5tYXliZUNoYW5nZU9iamVjdFxuICAgICAgaWYgKHN0YXRlT2JqLmF0dHJpYnV0ZXMudGhlbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzcy50aGVtZXMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmhhc3MuX3RoZW1lV2FpdGVycyA9IHRoaXMuaGFzcy5fdGhlbWVXYWl0ZXJzIHx8IFtdO1xuICAgICAgICAgIHRoaXMuaGFzcy5fdGhlbWVXYWl0ZXJzLnB1c2godGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwbHlUaGVtZXNPbkVsZW1lbnQoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy5oYXNzLnRoZW1lcyB8fCB7IGRlZmF1bHRfdGhlbWU6ICdkZWZhdWx0JywgdGhlbWVzOiB7fSB9LFxuICAgICAgICAgICAgc3RhdGVPYmouYXR0cmlidXRlcy50aGVtZSB8fCAnZGVmYXVsdCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVN0eWxlcygpO1xuICAgICAgaWYgKHRoaXMuc3RhcnRJbnRlcnZhbCkge1xuICAgICAgICAvLyBBZGRlZCBvbiAxOS4xLjIwMThcbiAgICAgICAgdGhpcy5zdGFydEludGVydmFsKHN0YXRlT2JqKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIGluc3RhbGxTdGF0ZUJhZGdlKCkge1xuICAgIGNvbnN0IHN0YXRlQmFkZ2UgPSBjdXN0b21FbGVtZW50cy5nZXQoJ3N0YXRlLWJhZGdlJyk7XG4gICAgaWYgKCFzdGF0ZUJhZGdlIHx8ICFzdGF0ZUJhZGdlLnByb3RvdHlwZS51cGRhdGVJY29uQXBwZWFyYW5jZSkgcmV0dXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsVXBkYXRlSWNvbkFwcGVhcmFuY2UgPSBzdGF0ZUJhZGdlLnByb3RvdHlwZS51cGRhdGVJY29uQXBwZWFyYW5jZTtcbiAgICAvLyBVc2UgbmFtZWQgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnLlxuICAgIHN0YXRlQmFkZ2UucHJvdG90eXBlLnVwZGF0ZUljb25BcHBlYXJhbmNlID0gZnVuY3Rpb24gY3VzdG9tVXBkYXRlSWNvbkFwcGVhcmFuY2Uoc3RhdGVPYmopIHtcbiAgICAgIGlmIChzdGF0ZU9iai5hdHRyaWJ1dGVzLmljb25fY29sb3IgJiYgIXN0YXRlT2JqLmF0dHJpYnV0ZXMuZW50aXR5X3BpY3R1cmUpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnJztcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLiQuaWNvbi5zdHlsZSwge1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUnLFxuICAgICAgICAgIGNvbG9yOiBzdGF0ZU9iai5hdHRyaWJ1dGVzLmljb25fY29sb3IsXG4gICAgICAgICAgZmlsdGVyOiAnJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbFVwZGF0ZUljb25BcHBlYXJhbmNlLmNhbGwodGhpcywgc3RhdGVPYmopO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgaW5zdGFsbEhhQXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBoYUF0dHJpYnV0ZXMgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2hhLWF0dHJpYnV0ZXMnKTtcbiAgICBpZiAoIWhhQXR0cmlidXRlcyB8fCAhaGFBdHRyaWJ1dGVzLnByb3RvdHlwZS5jb21wdXRlRmlsdGVyc0FycmF5IHx8XG4gICAgICAgIXdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbCkgcmV0dXJuO1xuICAgIC8vIFVzZSBuYW1lZCBmdW5jdGlvbiB0byBwcmVzZXJ2ZSAndGhpcycuXG4gICAgaGFBdHRyaWJ1dGVzLnByb3RvdHlwZS5jb21wdXRlRmlsdGVyc0FycmF5ID0gZnVuY3Rpb24gY3VzdG9tQ29tcHV0ZUZpbHRlcnNBcnJheShleHRyYUZpbHRlcnMpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFUykuY29uY2F0KGV4dHJhRmlsdGVycyA/IGV4dHJhRmlsdGVycy5zcGxpdCgnLCcpIDogW10pO1xuICAgIH07XG4gIH0sXG5cbiAgaW5zdGFsbEhhRm9ybUN1c3RvbWl6ZSgpIHtcbiAgICBpZiAoIXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvY29uZmlnJykpIHJldHVybjtcbiAgICBjb25zdCBoYUZvcm1DdXN0b21pemUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2hhLWZvcm0tY3VzdG9taXplJyk7XG4gICAgaWYgKCFoYUZvcm1DdXN0b21pemUpIHtcbiAgICAgIC8vIERPTSBub3QgcmVhZHkuIFdhaXQgMTAwbXMuXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCh3aW5kb3cuY3VzdG9tVUkuaW5zdGFsbEhhRm9ybUN1c3RvbWl6ZSwgMTAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHdpbmRvdy5jdXN0b21VSS5oYUZvcm1DdXN0b21pemVJbml0RG9uZSkgcmV0dXJuO1xuICAgIHdpbmRvdy5jdXN0b21VSS5oYUZvcm1DdXN0b21pemVJbml0RG9uZSA9IHRydWU7XG5cbiAgICBpZiAoIXdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbCkgcmV0dXJuO1xuICAgIGlmIChoYUZvcm1DdXN0b21pemUucHJvdG90eXBlLl9jb21wdXRlU2luZ2xlQXR0cmlidXRlKSB7XG4gICAgICAvLyBVc2UgbmFtZWQgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnLlxuICAgICAgaGFGb3JtQ3VzdG9taXplLnByb3RvdHlwZS5fY29tcHV0ZVNpbmdsZUF0dHJpYnV0ZSA9XG4gICAgICAgIGZ1bmN0aW9uIGN1c3RvbUNvbXB1dGVTaW5nbGVBdHRyaWJ1dGUoa2V5LCB2YWx1ZSwgc2Vjb25kYXJ5KSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gd2luZG93Lmhhc3NBdHRyaWJ1dGVVdGlsLkxPR0lDX1NUQVRFX0FUVFJJQlVURVNba2V5XVxuICAgICAgICAgICAgICB8fCB7IHR5cGU6IHdpbmRvdy5oYXNzQXR0cmlidXRlVXRpbC5VTktOT1dOX1RZUEUgfTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdE9wZW5PYmplY3Qoa2V5LCBjb25maWcudHlwZSA9PT0gJ2pzb24nID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWUsIHNlY29uZGFyeSwgY29uZmlnKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGhhRm9ybUN1c3RvbWl6ZS5wcm90b3R5cGUuZ2V0TmV3QXR0cmlidXRlc09wdGlvbnMpIHtcbiAgICAgIC8vIFVzZSBuYW1lZCBmdW5jdGlvbiB0byBwcmVzZXJ2ZSAndGhpcycuXG4gICAgICBoYUZvcm1DdXN0b21pemUucHJvdG90eXBlLmdldE5ld0F0dHJpYnV0ZXNPcHRpb25zID1cbiAgICAgICAgZnVuY3Rpb24gY3VzdG9tZ2V0TmV3QXR0cmlidXRlc09wdGlvbnMoXG4gICAgICAgICAgbG9jYWxBdHRyaWJ1dGVzLCBnbG9iYWxBdHRyaWJ1dGVzLCBleGlzdGluZ0F0dHJpYnV0ZXMsIG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBjb25zdCBrbm93bktleXMgPVxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyh3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFUylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmYgPSB3aW5kb3cuaGFzc0F0dHJpYnV0ZVV0aWwuTE9HSUNfU1RBVEVfQVRUUklCVVRFU1trZXldO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmYgJiYgKCFjb25mLmRvbWFpbnMgfHwgIXRoaXMuZW50aXR5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLmRvbWFpbnMuaW5jbHVkZXMoY29tcHV0ZVN0YXRlRG9tYWluKHRoaXMuZW50aXR5KSkpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcih0aGlzLmZpbHRlckZyb21BdHRyaWJ1dGVzKGxvY2FsQXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgLmZpbHRlcih0aGlzLmZpbHRlckZyb21BdHRyaWJ1dGVzKGdsb2JhbEF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIodGhpcy5maWx0ZXJGcm9tQXR0cmlidXRlcyhleGlzdGluZ0F0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIodGhpcy5maWx0ZXJGcm9tQXR0cmlidXRlcyhuZXdBdHRyaWJ1dGVzKSk7XG4gICAgICAgICAgcmV0dXJuIGtub3duS2V5cy5zb3J0KCkuY29uY2F0KCdPdGhlcicpO1xuICAgICAgICB9O1xuICAgIH1cbiAgfSxcblxuICBpbnN0YWxsQ2xhc3NIb29rcygpIHtcbiAgICBpZiAod2luZG93LmN1c3RvbVVJLmNsYXNzSW5pdERvbmUpIHJldHVybjtcbiAgICB3aW5kb3cuY3VzdG9tVUkuY2xhc3NJbml0RG9uZSA9IHRydWU7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxQYXJ0aWFsQ2FyZHMoKTtcbiAgICB3aW5kb3cuY3VzdG9tVUkuaW5zdGFsbFN0YXRlc0hvb2soKTtcbiAgICB3aW5kb3cuY3VzdG9tVUkuaW5zdGFsbEhhU3RhdGVMYWJlbEJhZGdlKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxTdGF0ZUJhZGdlKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxIYUF0dHJpYnV0ZXMoKTtcbiAgICB3aW5kb3cuY3VzdG9tVUkuaW5zdGFsbEFjdGlvbk5hbWUoJ3N0YXRlLWNhcmQtc2NlbmUnKTtcbiAgICB3aW5kb3cuY3VzdG9tVUkuaW5zdGFsbEFjdGlvbk5hbWUoJ3N0YXRlLWNhcmQtc2NyaXB0Jyk7XG4gIH0sXG5cbiAgaW5pdCgpIHtcbiAgICBpZiAod2luZG93LmN1c3RvbVVJLmluaXREb25lKSByZXR1cm47XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxDbGFzc0hvb2tzKCk7XG4gICAgY29uc3QgbWFpbiA9IHdpbmRvdy5jdXN0b21VSS5saWdodE9yU2hhZG93KGRvY3VtZW50LCAnaG9tZS1hc3Npc3RhbnQnKTtcbiAgICBpZiAoIW1haW4uaGFzcyB8fCAhbWFpbi5oYXNzLnN0YXRlcykge1xuICAgICAgLy8gQ29ubmVjdGlvbiB3YXNuJ3QgbWFkZSB5ZXQuIFRyeSBpbiAxIHNlY29uZC5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHdpbmRvdy5jdXN0b21VSS5pbml0LCAxMDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93LmN1c3RvbVVJLmluaXREb25lID0gdHJ1ZTtcblxuICAgIHdpbmRvdy5jdXN0b21VSS51c2VDdXN0b21pemVyKCk7XG5cbiAgICB3aW5kb3cuY3VzdG9tVUkucnVuSG9va3MoKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9jYXRpb24tY2hhbmdlZCcsIHdpbmRvdy5zZXRUaW1lb3V0LmJpbmQobnVsbCwgd2luZG93LmN1c3RvbVVJLnJ1bkhvb2tzLCAxMDApKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgY29uc29sZS5sb2coYExvYWRlZCBDdXN0b21VSSAke1ZFUlNJT059YCk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgaWYgKCF3aW5kb3cuQ1VTVE9NX1VJX0xJU1QpIHtcbiAgICAgIHdpbmRvdy5DVVNUT01fVUlfTElTVCA9IFtdO1xuICAgIH1cbiAgICB3aW5kb3cuQ1VTVE9NX1VJX0xJU1QucHVzaCh7XG4gICAgICBuYW1lOiAnQ3VzdG9tVUknLFxuICAgICAgdmVyc2lvbjogVkVSU0lPTixcbiAgICAgIHVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXktZ2l0L2hvbWUtYXNzaXN0YW50LWN1c3RvbS11aScsXG4gICAgfSk7XG4gIH0sXG5cbiAgcnVuSG9va3MoKSB7XG4gICAgd2luZG93LmN1c3RvbVVJLmZpeEdyb3VwVGl0bGVzKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLnVwZGF0ZUNvbmZpZ1BhbmVsKCk7XG4gICAgd2luZG93LmN1c3RvbVVJLmluc3RhbGxIYUZvcm1DdXN0b21pemUoKTtcbiAgfSxcblxuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2hhLWRldmljZS1uYW1lJykgfHwgJyc7XG4gIH0sXG5cbiAgc2V0TmFtZShuYW1lKSB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoYS1kZXZpY2UtbmFtZScsIG5hbWUgfHwgJycpO1xuICB9LFxuXG4gIGNvbXB1dGVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaGFzcywgZW50aXRpZXMsIGVudGl0eSwgYXR0cmlidXRlcywgYXR0cmlidXRlLCBzdGF0ZSkge1xuICAgIGNvbnN0IGZ1bmN0aW9uQm9keSA9ICh0ZW1wbGF0ZS5pbmRleE9mKCdyZXR1cm4nKSA+PSAwKSA/IHRlbXBsYXRlIDogYHJldHVybiBcXGAke3RlbXBsYXRlfVxcYDtgO1xuICAgIHRyeSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXctZnVuYyAqL1xuICAgICAgY29uc3QgZnVuYyA9IG5ldyBGdW5jdGlvbihcbiAgICAgICAgJ2hhc3MnLCAnZW50aXRpZXMnLCAnZW50aXR5JywgJ2F0dHJpYnV0ZXMnLCAnYXR0cmlidXRlJywgJ3N0YXRlJywgZnVuY3Rpb25Cb2R5KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3LWZ1bmMgKi9cbiAgICAgIHJldHVybiBmdW5jKGhhc3MsIGVudGl0aWVzLCBlbnRpdHksIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZSwgc3RhdGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgIGlmICgoZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB8fCBlIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2UubmFtZX06ICR7ZS5tZXNzYWdlfSBpbiB0ZW1wbGF0ZSAke2Z1bmN0aW9uQm9keX1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9LFxufTtcbndpbmRvdy5jdXN0b21VSS5pbml0KCk7XG4iLCJleHBvcnQgZGVmYXVsdCAnMjAxODA2MDInO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/scripts-es5.js.map b/scripts-es5.js.map
index d3f4023..40e5626 100644
--- a/scripts-es5.js.map
+++ b/scripts-es5.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///../home-assistant-polymer/src/common/dom/apply_themes_on_element.js","webpack:///../home-assistant-polymer/src/common/entity/compute_domain.js","webpack:///../home-assistant-polymer/src/common/entity/compute_state_domain.js","webpack:///../home-assistant-polymer/src/common/dom/dynamic_content_updater.js","webpack:///../home-assistant-polymer/src/common/const.js","webpack:///../home-assistant-polymer/src/common/entity/state_card_type.js","webpack:///./node_modules/@polymer/polymer/lib/utils/html-tag.js","webpack:///./src/mixins/events-mixin.js","webpack:///./src/elements/ha-config-custom-ui.js","webpack:///./src/utils/hooks.js","webpack:///../home-assistant-polymer/src/common/entity/get_view_entities.js","webpack:///../home-assistant-polymer/src/common/entity/get_group_entities.js","webpack:///./src/utils/version.js","webpack:///./src/elements/cui-base-element.js","webpack:///./src/elements/dynamic-element.js","webpack:///./src/elements/dynamic-with-extra.js","webpack:///./src/elements/ha-themed-slider.js","webpack:///./src/elements/state-card-with-slider.js","webpack:///./src/elements/state-card-without-slider.js","webpack:///./src/elements/state-card-custom-ui.js","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_state.js","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_domain.js","webpack:///./node_modules/@polymer/polymer/lib/utils/boot.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","r","value","n","__esModule","default","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","applyThemesOnElement","element","themes","localTheme","updateMeta","arguments","length","_themes","themeName","default_theme","styles","assign","theme","keys","forEach","key","prefixedKey","updateStyles","window","ShadyCSS","styleSubtree","meta","document","querySelector","hasAttribute","setAttribute","getAttribute","themeColor","computeDomain","entityId","substr","indexOf","computeStateDomain","stateObj","_domain","entity_id","dynamicContentUpdater","root","newElementTag","attributes","rootEl","customEl","lastChild","tagName","removeChild","createElement","toLowerCase","setProperties","parentNode","appendChild","DOMAINS_WITH_CARD","_createClass","defineProperties","target","props","descriptor","writable","Constructor","protoProps","staticProps","LiteralString","string","this","toString","strings","raw","html","template","_len","values","Array","_key","innerHTML","reduce","acc","v","idx","HTMLTemplateElement","Error","literalValue","ha_config_custom_ui_createClass","_templateObject","freeze","ha_config_custom_ui_HaConfigCustomUi","superClass","Polymer","Element","_superClass","EventsMixin","instance","TypeError","__proto__","getPrototypeOf","apply","subClass","create","constructor","setPrototypeOf","events_mixin_createClass","type","detail","options","event","Event","bubbles","cancelable","Boolean","composed","node","dispatchEvent","HaConfigCustomUi","customUI","getName","setName","history","back","fire","isWide","String","observer","customElements","define","SUPPORTED_SLIDER_MODES","domHost","elem","getRootNode","DocumentFragment","host","lightOrShadow","selector","shadowRoot","getElementHierarchy","hierarchy","shift","getContext","_context","groupEntity","push","states","reverse","findMatch","find","option","match","maybeChangeObjectByDevice","device","applyAttributes","maybeChangeObjectByGroup","_this","context","group","_setKeep","obj","_cui_keep","maybeApplyTemplateAttributes","hass","templates","newAttributes","hasGlobal","hasChanges","computeTemplate","untemplated_attributes","untemplated_state","state","_stateDisplay","result","untemplated_stateDisplay","maybeApplyTemplates","newResult","checkAttributes","last_changed","maybeChangeObject","inDialog","allowHidden","hidden","fixGroupTitles","homeAssistantMain","haCards","$","main","querySelectorAll","card","friendly_name","textContent","setTimeout","controlColumns","columns","partialCards","mqls","mql","removeListener","handleWindowChange","map","width","matchMedia","addListener","bind","useCustomizer","customizer","hide_attributes","hassAttributeUtil","LOGIC_STATE_ATTRIBUTES","attr","updateAttributes","customUiAttributes","state_card_mode","light","concat","cover","*","state_card_custom_ui_secondary","badges_list","show_last_changed","hide_control","extra_data_template","extra_badge","stretch_slider","slider_theme","confirm_controls","confirm_controls_show_lock","hide_in_default_view","updateConfigPanel","location","pathname","startsWith","haPanelConfig","haConfigNavigation","localize","cuiPatch","_originalComputeLoaded","_computeLoaded","_originalComputeCaption","_computeCaption","_originalComputeDescription","_computeDescription","page","pages","some","conf","domain","caption","description","loaded","getHaConfigCustomUi","haConfigCustomUi","ironPages","lastElementChild","addEventListener","select","visible","style","display","installStatesHook","homeAssistant","_updateHass","originalUpdate","entity","newEntity","_themeWaiters","waiter","stateChanged","installPartialCards","_defaultViewFilter","excludes","excludeEntityId","view","entities","viewEntities","groupEntities","grEntityId","grEntity","installActionName","elementName","klass","action_name","__data","set","installHaStateLabelBadge","haStateLabelBadge","startInterval","installStateBadge","stateBadge","updateIconAppearance","originalUpdateIconAppearance","icon_color","entity_picture","backgroundImage","icon","color","filter","installClassHooks","classInitDone","init","initDone","runHooks","console","log","CUSTOM_UI_LIST","version","url","localStorage","getItem","setItem","attribute","functionBody","Function","e","SyntaxError","ReferenceError","warn","message","cui_base_element","extras","isArray","extra","controlElement","computed","CuiBaseElement","dynamic_element_createClass","dynamic_element_DynamicElement","toUpperCase","DynamicElement","dynamic_with_extra_DynamicWithExtra","dynamic_with_extra_createClass","DynamicWithExtra","dynamic_with_extra_get","_attached","_isAttached","attached","_this2","extraBadges","extraBadge","unit_of_measurement","unit","blacklist","blacklist_states","RegExp","test","_entityDisplay","extraObj","extraObjVisible","haLocalize","_this3","pointerEvents","lock","opacity","stopPropagation","_this4","applyThemes","dynamic_with_extra_templateObject","ha_themed_slider_HaThemedSlider","HaThemedSlider","disableOffWhenMin","_computeAttribute","computeEnabledThemedReportWhenNotChanged","disableReportWhenNotChanged","_enabledThemedReportWhenNotChanged","def","isOn","themedMin","ev","ha_themed_slider_templateObject","min","Number","max","pin","notify","_themedMin","state_card_with_slider_StateCardWithSlider","state_card_with_slider_get","StateCardWithSlider","_onIronResize","_isConnected","_waitForLayout","removeEventListener","_setMode","_frameId","readyToCompute","requestAnimationFrame","hideSlider","mode","lineTooLong","breakSlider","showSlider","prevBreakSlider","prevHideSlider","container","containerWidth","clientWidth","minLineBreak","maxLineBreak","containerHeight","clientHeight","stateHeight","stretchSlider","parseInt","param","isNaN","path","_slicedToArray","composedPath","_ev$composedPath","callService","serviceMin","setValueName","valueName","serviceMax","nameOn","sliderValue","state_card_with_slider_templateObject","state_card_without_slider_StateCardWithoutSlider","state_card_without_slider_templateObject","SHOW_LAST_CHANGED_BLACKLISTED_CARDS","DOMAIN_TO_SLIDER_SUPPORT","climate","TYPE_TO_CONTROL","toggle","state_card_custom_ui_StateCardCustomUi","state_card_custom_ui_get","StateCardCustomUi","classList","contains","_container","setProperty","inputChanged","margin","padding","id","includes","params","text-align","fontSize","modifiedObj","themeTarget","supported_features","maybeHideEntity","regularMode_","badgeMode","cleanBadgeStyle","originalStateCardType","services","config","control","stateCardType","customStateCardType","secondaryStateCardType","sliderEligible_","min_temp","max_temp","control_element","JSCompiler_renameProperty","prop"],"mappings":"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","file":"scripts-es5.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/**\n * Apply a theme to an element by setting the CSS variables on it.\n *\n * element: Element to apply theme on.\n * themes: HASS Theme information\n * localTheme: selected theme.\n * updateMeta: boolean if we should update the theme-color meta element.\n*/\nexport default function applyThemesOnElement(element, themes, localTheme, updateMeta = false) {\n if (!element._themes) {\n element._themes = {};\n }\n let themeName = themes.default_theme;\n if (localTheme === 'default' || (localTheme && themes.themes[localTheme])) {\n themeName = localTheme;\n }\n const styles = Object.assign({}, element._themes);\n if (themeName !== 'default') {\n var theme = themes.themes[themeName];\n Object.keys(theme).forEach((key) => {\n var prefixedKey = '--' + key;\n element._themes[prefixedKey] = '';\n styles[prefixedKey] = theme[key];\n });\n }\n if (element.updateStyles) {\n element.updateStyles(styles);\n } else if (window.ShadyCSS) {\n // implement updateStyles() method of Polemer elements\n window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(element), styles);\n }\n\n if (!updateMeta) return;\n\n const meta = document.querySelector('meta[name=theme-color]');\n if (meta) {\n if (!meta.hasAttribute('default-content')) {\n meta.setAttribute('default-content', meta.getAttribute('content'));\n }\n const themeColor = styles['--primary-color'] || meta.getAttribute('default-content');\n meta.setAttribute('content', themeColor);\n }\n}\n","export default function computeDomain(entityId) {\n return entityId.substr(0, entityId.indexOf('.'));\n}\n","import computeDomain from './compute_domain.js';\n\nexport default function computeStateDomain(stateObj) {\n if (!stateObj._domain) {\n stateObj._domain = computeDomain(stateObj.entity_id);\n }\n\n return stateObj._domain;\n}\n","/**\n * Update root's child element to be newElementTag replacing another existing child if any.\n * Copy attributes into the child element.\n */\nexport default function dynamicContentUpdater(root, newElementTag, attributes) {\n const rootEl = root;\n let customEl;\n\n if (rootEl.lastChild && rootEl.lastChild.tagName === newElementTag) {\n customEl = rootEl.lastChild;\n } else {\n if (rootEl.lastChild) {\n rootEl.removeChild(rootEl.lastChild);\n }\n // Creating an element with upper case works fine in Chrome, but in FF it doesn't immediately\n // become a defined Custom Element. Polymer does that in some later pass.\n customEl = document.createElement(newElementTag.toLowerCase());\n }\n\n if (customEl.setProperties) {\n customEl.setProperties(attributes);\n } else {\n // If custom element definition wasn't loaded yet - setProperties would be\n // missing, but no harm in setting attributes one-by-one then.\n Object.keys(attributes).forEach((key) => {\n customEl[key] = attributes[key];\n });\n }\n\n if (customEl.parentNode === null) {\n rootEl.appendChild(customEl);\n }\n}\n","/** Constants to be used in the frontend. */\n\n// Constants should be alphabetically sorted by name.\n// Arrays with values should be alphabetically sorted if order doesn't matter.\n// Each constant should have a description what it is supposed to be used for.\n\n/** Icon to use when no icon specified for domain. */\nexport const DEFAULT_DOMAIN_ICON = 'mdi:bookmark';\n\n/** Domains that have a state card. */\nexport const DOMAINS_WITH_CARD = [\n 'climate',\n 'cover',\n 'configurator',\n 'input_select',\n 'input_number',\n 'input_text',\n 'media_player',\n 'scene',\n 'script',\n 'timer',\n 'weblink',\n];\n\n/** Domains that should have the history hidden in the more info dialog. */\nexport const DOMAINS_MORE_INFO_NO_HISTORY = [\n 'camera',\n 'configurator',\n 'history_graph',\n 'scene',\n];\n\n/** States that we consider \"off\". */\nexport const STATES_OFF = [\n 'closed',\n 'off',\n 'unlocked',\n];\n\n/** Temperature units. */\nexport const UNIT_C = '°C';\nexport const UNIT_F = '°F';\n\n/** Entity ID of the default view. */\nexport const DEFAULT_VIEW_ENTITY_ID = 'group.default_view';\n","import canToggleState from './can_toggle_state.js';\nimport computeStateDomain from './compute_state_domain.js';\nimport { DOMAINS_WITH_CARD } from '../const.js';\n\nexport default function stateCardType(hass, stateObj) {\n if (stateObj.state === 'unavailable') {\n return 'display';\n }\n\n const domain = computeStateDomain(stateObj);\n\n if (DOMAINS_WITH_CARD.includes(domain)) {\n return domain;\n } else if (canToggleState(hass, stateObj) &&\n stateObj.attributes.control !== 'hidden') {\n return 'toggle';\n }\n return 'display';\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\n/**\n * Class representing a static string value which can be used to filter\n * strings by asseting that they have been created via this class. The\n * `value` property returns the string passed to the constructor.\n */\nclass LiteralString {\n constructor(string) {\n /** @type {string} */\n this.value = string.toString();\n }\n /**\n * @return {string} LiteralString string value\n */\n toString() {\n return this.value;\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction literalValue(value) {\n if (value instanceof LiteralString) {\n return /** @type {!LiteralString} */(value).value;\n } else {\n throw new Error(\n `non-literal value passed to Polymer's htmlLiteral function: ${value}`\n );\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction htmlValue(value) {\n if (value instanceof HTMLTemplateElement) {\n return /** @type {!HTMLTemplateElement } */(value).innerHTML;\n } else if (value instanceof LiteralString) {\n return literalValue(value);\n } else {\n throw new Error(\n `non-template value passed to Polymer's html function: ${value}`);\n }\n}\n\n/**\n * A template literal tag that creates an HTML element from the\n * contents of the string.\n *\n * This allows you to write a Polymer Template in JavaScript.\n *\n * Templates can be composed by interpolating `HTMLTemplateElement`s in\n * expressions in the JavaScript template literal. The nested template's\n * `innerHTML` is included in the containing template. The only other\n * values allowed in expressions are those returned from `htmlLiteral`\n * which ensures only literal values from JS source ever reach the HTML, to\n * guard against XSS risks.\n *\n * All other values are disallowed in expressions to help prevent XSS\n * attacks; however, `htmlLiteral` can be used to compose static\n * string values into templates. This is useful to compose strings into\n * places that do not accept html, like the css text of a `style`\n * element.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * \n * ${this.partialTemplate}
\n * ${super.template}\n * `;\n * }\n * static get partialTemplate() { return html`Partial!`; }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement\n */\nexport const html = function html(strings, ...values) {\n const template = /** @type {!HTMLTemplateElement} */(document.createElement('template'));\n template.innerHTML = values.reduce((acc, v, idx) =>\n acc + htmlValue(v) + strings[idx + 1], strings[0]);\n return template;\n};\n\n/**\n * An html literal tag that can be used with `html` to compose.\n * a literal string.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * \n * ${staticValue}
\n * ${super.template}\n * `;\n * }\n * static get styleTemplate() {\n * return htmlLiteral`.shadowed { background: gray; }`;\n * }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!LiteralString} Constructed literal string\n */\nexport const htmlLiteral = function(strings, ...values) {\n return new LiteralString(values.reduce((acc, v, idx) =>\n acc + literalValue(v) + strings[idx + 1], strings[0]));\n};\n","// Polymer legacy event helpers used courtesy of the Polymer project.\n//\n// Copyright (c) 2017 The Polymer Authors. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nexport default (superClass) => {\n /**\n * @extends HTMLElement\n */\n class EventsMixin extends superClass {\n /**\n * Dispatches a custom event with an optional detail value.\n *\n * @param {string} type Name of event type.\n * @param {*=} detail Detail value containing event-specific\n * payload.\n * @param {{ bubbles: (boolean|undefined),\n cancelable: (boolean|undefined),\n composed: (boolean|undefined) }=}\n * options Object specifying options. These may include:\n * `bubbles` (boolean, defaults to `true`),\n * `cancelable` (boolean, defaults to false), and\n * `node` on which to fire the event (HTMLElement, defaults to `this`).\n * @return {Event} The new event that was fired.\n */\n fire(type, detail = {}, options = {}) {\n const event = new Event(type, {\n bubbles: options.bubbles === undefined ? true : options.bubbles,\n cancelable: Boolean(options.cancelable),\n composed: options.composed === undefined ? true : options.composed,\n });\n event.detail = detail;\n const node = options.node || this;\n node.dispatchEvent(event);\n return event;\n }\n }\n return EventsMixin;\n};\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport EventsMixin from '../mixins/events-mixin.js';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaConfigCustomUi extends EventsMixin(Polymer.Element) {\n static get template() {\n return html`\n \n \n \n \n \n Custom UI settings
\n \n \n\n \n \n \n Set device name so that you can reference it in per-device settings\n
\n
\n \n \n \n `;\n }\n\n static get properties() {\n return {\n isWide: Boolean,\n\n name: {\n type: String,\n observer: 'nameChanged',\n },\n };\n }\n\n ready() {\n super.ready();\n this.name = window.customUI.getName();\n }\n\n nameChanged(name) {\n window.customUI.setName(name);\n }\n\n _backHandler() {\n window.history.back();\n this.fire('location-changed');\n }\n}\ncustomElements.define('ha-config-custom-ui', HaConfigCustomUi);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.js';\nimport getViewEntities from '../../home-assistant-polymer/src/common/entity/get_view_entities.js';\n\nimport '../elements/ha-config-custom-ui.js';\nimport VERSION from './version.js';\n\nwindow.customUI = window.customUI || {\n SUPPORTED_SLIDER_MODES: [\n 'single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider',\n ],\n\n domHost(elem) {\n if (elem === document) return null;\n const root = elem.getRootNode();\n return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;\n },\n\n lightOrShadow(elem, selector) {\n return elem.shadowRoot ?\n elem.shadowRoot.querySelector(selector) :\n elem.querySelector(selector);\n },\n\n getElementHierarchy(root, hierarchy) {\n if (root === null) return null;\n const elem = hierarchy.shift();\n if (elem) {\n return window.customUI.getElementHierarchy(\n window.customUI.lightOrShadow(root, elem), hierarchy);\n }\n return root;\n },\n\n getContext(elem) {\n if (elem._context === undefined) {\n elem._context = [];\n for (let element = (elem.tagName === 'HA-ENTITIES-CARD' ? window.customUI.domHost(elem) : elem);\n element; element = window.customUI.domHost(element)) {\n switch (element.tagName) {\n case 'HA-ENTITIES-CARD':\n if (element.groupEntity) {\n elem._context.push(element.groupEntity.entity_id);\n } else if (element.groupEntity === false && element.states && element.states.length) {\n elem._context.push(`group.${computeStateDomain(element.states[0])}`);\n }\n break;\n case 'MORE-INFO-GROUP':\n case 'STATE-CARD-CONTENT':\n if (element.stateObj) {\n elem._context.push(element.stateObj.entity_id);\n }\n break;\n case 'HA-CARDS':\n elem._context.push(element.getAttribute('data-view') || 'default_view');\n break;\n // no default\n }\n }\n elem._context.reverse();\n }\n return elem._context;\n },\n\n findMatch(key, options) {\n if (!options) return null;\n if (options[key]) return key;\n return Object.keys(options).find(option => key.match(`^${option}$`));\n },\n\n maybeChangeObjectByDevice(stateObj) {\n const name = window.customUI.getName();\n if (!name) return stateObj;\n const match = this.findMatch(name, stateObj.attributes.device);\n if (!match) return stateObj;\n const attributes = Object.assign({}, stateObj.attributes.device[match]);\n\n if (!Object.keys(attributes).length) return stateObj;\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n maybeChangeObjectByGroup(elem, stateObj) {\n const context = window.customUI.getContext(elem);\n if (!context) return stateObj;\n\n if (!stateObj.attributes.group) {\n return stateObj;\n }\n const attributes = {};\n context.forEach((c) => {\n const match = this.findMatch(c, stateObj.attributes.group);\n if (stateObj.attributes.group[match]) {\n Object.assign(attributes, stateObj.attributes.group[match]);\n }\n });\n\n if (!Object.keys(attributes).length) return stateObj;\n\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n _setKeep(obj, value) {\n if (obj._cui_keep === undefined) {\n obj._cui_keep = value;\n } else {\n obj._cui_keep = obj._cui_keep && value;\n }\n },\n\n maybeApplyTemplateAttributes(hass, states, stateObj, attributes) {\n if (!attributes.templates) {\n window.customUI._setKeep(stateObj, true);\n return stateObj;\n }\n const newAttributes = {};\n let hasGlobal = false;\n let hasChanges = false;\n Object.keys(attributes.templates).forEach((key) => {\n const template = attributes.templates[key];\n if (template.match(/\\b(entities|hass)\\b/)) {\n hasGlobal = true;\n }\n const value = window.customUI.computeTemplate(\n template, hass, states, stateObj, attributes,\n (stateObj.untemplated_attributes && stateObj.untemplated_attributes[key]) ||\n attributes[key],\n stateObj.untemplated_state || stateObj.state);\n // In case of null don't set the value.\n if (value === null) return;\n newAttributes[key] = value;\n if (key === 'state') {\n if (value !== stateObj.state) {\n hasChanges = true;\n }\n } else if (key === '_stateDisplay') {\n if (value !== stateObj._stateDisplay) {\n hasChanges = true;\n }\n } else if (value !== attributes[key]) {\n hasChanges = true;\n }\n });\n window.customUI._setKeep(stateObj, !hasGlobal);\n if (!hasChanges) {\n return stateObj;\n }\n if (stateObj.attributes === attributes) {\n // We are operating on real attributes. Replace them.\n const result = window.customUI.applyAttributes(stateObj, newAttributes);\n if (Object.prototype.hasOwnProperty.call(newAttributes, 'state')) {\n if (newAttributes.state !== null) {\n result.state = String(newAttributes.state);\n result.untemplated_state = stateObj.state;\n }\n }\n if (Object.prototype.hasOwnProperty.call(newAttributes, '_stateDisplay')) {\n result._stateDisplay = newAttributes._stateDisplay;\n result.untemplated_stateDisplay = stateObj._stateDisplay;\n }\n window.customUI._setKeep(result, !hasGlobal);\n return result;\n }\n // Operating on context-aware attributes. Return shallow copy of object.\n return Object.assign({}, stateObj);\n },\n\n maybeApplyTemplates(hass, states, stateObj) {\n const newResult = window.customUI.maybeApplyTemplateAttributes(\n hass, states, stateObj, stateObj.attributes);\n let hasChanges = (newResult !== stateObj);\n\n function checkAttributes(obj) {\n if (!obj) return;\n Object.values(obj).forEach((attributes) => {\n const result = window.customUI.maybeApplyTemplateAttributes(\n hass, states, newResult, attributes);\n hasChanges |= (result !== newResult);\n });\n checkAttributes(obj.device);\n checkAttributes(obj.group);\n }\n\n checkAttributes(stateObj.attributes.device);\n checkAttributes(stateObj.attributes.group);\n if (newResult !== stateObj) return newResult;\n if (hasChanges) {\n return Object.assign({}, stateObj);\n }\n return stateObj;\n },\n\n applyAttributes(stateObj, attributes) {\n return {\n entity_id: stateObj.entity_id,\n state: stateObj.state,\n attributes: Object.assign({}, stateObj.attributes, attributes),\n untemplated_attributes: stateObj.attributes,\n last_changed: stateObj.last_changed,\n };\n },\n\n maybeChangeObject(elem, stateObj, inDialog, allowHidden) {\n if (inDialog) return stateObj;\n let obj = window.customUI.maybeChangeObjectByDevice(stateObj);\n obj = window.customUI.maybeChangeObjectByGroup(elem, obj);\n obj = window.customUI.maybeApplyTemplateAttributes(\n elem.hass, elem.hass.states, obj, obj.attributes);\n\n if (obj !== stateObj && obj.attributes.hidden && allowHidden) {\n return null;\n }\n return obj;\n },\n\n fixGroupTitles() {\n const homeAssistantMain = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main']);\n if (homeAssistantMain === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(window.customUI.fixGroupTitles, 1000);\n return;\n }\n\n const haCards = window.customUI.getElementHierarchy(homeAssistantMain, [\n 'partial-cards',\n 'ha-cards[view-visible]']);\n if (haCards === null) return;\n const main = window.customUI.lightOrShadow(haCards, '.main') || haCards.$.main;\n const cards = main.querySelectorAll('ha-entities-card');\n cards.forEach((card) => {\n if (card.groupEntity) {\n const obj = window.customUI.maybeChangeObject(\n card,\n card.groupEntity,\n false /* inDialog */,\n false /* allowHidden */);\n if (obj !== card.groupEntity && obj.attributes.friendly_name) {\n const nameElem = window.customUI.lightOrShadow(card, '.name');\n nameElem.textContent = obj.attributes.friendly_name;\n }\n }\n });\n },\n\n controlColumns(columns) {\n const partialCards = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-cards']);\n if (partialCards === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(\n window.customUI.controlColumns.bind(null, columns),\n 1000);\n return;\n }\n partialCards.mqls.forEach((mql) => {\n mql.removeListener(partialCards.handleWindowChange);\n });\n partialCards.mqls = columns.map((width) => {\n const mql = window.matchMedia(`(min-width: ${width}px)`);\n mql.addListener(partialCards.handleWindowChange);\n return mql;\n });\n partialCards.handleWindowChange();\n },\n\n useCustomizer() {\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n const customizer = main.hass.states['customizer.customizer'];\n if (!customizer) return;\n if (customizer.attributes.columns) {\n window.customUI.controlColumns(customizer.attributes.columns);\n }\n if (customizer.attributes.hide_attributes) {\n // TODO: Won't working starting from HA 0.71\n if (window.hassAttributeUtil && window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {\n customizer.attributes.hide_attributes.forEach((attr) => {\n if (!Object.prototype.hasOwnProperty.call(\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, attr)) {\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[attr] = undefined;\n }\n });\n }\n }\n },\n\n updateAttributes() {\n if (!window.hassAttributeUtil) {\n // App.js wasn't parsed yet.\n window.setTimeout(window.customUI.updateAttributes, 1000);\n return;\n }\n\n const customUiAttributes = {\n group: undefined,\n device: undefined,\n templates: undefined,\n state_card_mode: {\n type: 'array',\n options: {\n light: window.customUI.SUPPORTED_SLIDER_MODES.concat('badges'),\n cover: window.customUI.SUPPORTED_SLIDER_MODES.concat('badges'),\n '*': ['badges'],\n },\n },\n state_card_custom_ui_secondary: { type: 'string' },\n badges_list: { type: 'json' },\n show_last_changed: { type: 'boolean' },\n hide_control: { type: 'boolean' },\n extra_data_template: { type: 'string' },\n extra_badge: { type: 'json' },\n stretch_slider: { type: 'boolean' },\n slider_theme: { type: 'json' },\n theme: { type: 'string' },\n confirm_controls: { type: 'boolean' },\n confirm_controls_show_lock: { type: 'boolean' },\n hide_in_default_view: { type: 'boolean' },\n };\n if (window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {\n Object.assign(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, customUiAttributes);\n }\n },\n\n updateConfigPanel() {\n if (!window.location.pathname.startsWith('/config')) return;\n const haPanelConfig = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-panel-resolver',\n 'ha-panel-config']);\n if (!haPanelConfig) {\n // DOM not ready. Wait 100ms.\n window.setTimeout(window.customUI.updateConfigPanel, 100);\n return;\n }\n const haConfigNavigation = window.customUI.getElementHierarchy(haPanelConfig, [\n 'ha-config-dashboard',\n 'ha-config-navigation']);\n if (haConfigNavigation) {\n // HaConfigNavigation started using localize on 21.01.2018\n if (haConfigNavigation.localize && !haConfigNavigation.cuiPatch) {\n haConfigNavigation.cuiPatch = true;\n haConfigNavigation._originalComputeLoaded = haConfigNavigation._computeLoaded;\n haConfigNavigation._originalComputeCaption = haConfigNavigation._computeCaption;\n haConfigNavigation._originalComputeDescription = haConfigNavigation._computeDescription;\n haConfigNavigation._computeLoaded = (hass, page) =>\n page === 'customui' || haConfigNavigation._originalComputeLoaded(hass, page);\n haConfigNavigation._computeCaption = (page, localize) =>\n (page === 'customui' ? 'Custom UI' : haConfigNavigation._originalComputeCaption(page, localize));\n haConfigNavigation._computeDescription = (page, localize) =>\n (page === 'customui' ? 'SetUI tweaks' : haConfigNavigation._originalComputeDescription(page, localize));\n }\n if (!haConfigNavigation.pages.some(conf => conf === 'customui' || conf.domain === 'customui')) {\n haConfigNavigation.push('pages', haConfigNavigation.localize ? 'customui' : {\n domain: 'customui',\n caption: 'Custom UI',\n description: 'Set UI tweaks.',\n loaded: true,\n });\n }\n }\n const getHaConfigCustomUi = () => {\n const haConfigCustomUi = document.createElement('ha-config-custom-ui');\n haConfigCustomUi.isWide = haPanelConfig.isWide;\n haConfigCustomUi.setAttribute('page-name', 'customui');\n return haConfigCustomUi;\n };\n\n const ironPages = window.customUI.lightOrShadow(haPanelConfig, 'iron-pages');\n if (ironPages) {\n if (ironPages.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n ironPages.appendChild(haConfigCustomUi);\n ironPages.addEventListener('iron-items-changed', () => {\n if (window.location.pathname.startsWith('/config/customui')) {\n ironPages.select('customui');\n }\n });\n }\n } else {\n const root = haPanelConfig.shadowRoot || haPanelConfig;\n if (root.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n root.appendChild(haConfigCustomUi);\n }\n const visible = window.location.pathname.startsWith('/config/customui');\n root.lastElementChild.style.display = visible ? '' : 'none';\n }\n },\n\n installStatesHook() {\n const homeAssistant = customElements.get('home-assistant');\n if (!homeAssistant || !homeAssistant.prototype._updateHass) return;\n const originalUpdate = homeAssistant.prototype._updateHass;\n homeAssistant.prototype._updateHass = function update(obj) {\n // Use named function to preserve 'this'.\n const { hass } = this;\n if (obj.states) {\n Object.keys(obj.states).forEach((key) => {\n const entity = obj.states[key];\n if (entity._cui_keep) return;\n const newEntity = window.customUI.maybeApplyTemplates(hass, obj.states, entity);\n if (hass.states && entity !== hass.states[key]) {\n // New state arrived. Put modified state in.\n obj.states[key] = newEntity;\n } else if (entity !== newEntity) {\n // It's the same state but contents changed due to other state changes.\n obj.states[key] = newEntity;\n }\n });\n }\n originalUpdate.call(this, obj);\n if (obj.themes && hass._themeWaiters) {\n hass._themeWaiters.forEach(waiter => waiter.stateChanged(waiter.state));\n hass._themeWaiters = undefined;\n }\n };\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (main.hass && main.hass.states) {\n main._updateHass({ states: main.hass.states });\n }\n },\n\n installPartialCards() {\n const partialCards = customElements.get('partial-cards');\n if (!partialCards || !partialCards.prototype._defaultViewFilter) return;\n partialCards.prototype._defaultViewFilter = (hass, entityId) => {\n if (hass.states[entityId].attributes.hidden) return false;\n const excludes = {};\n Object.values(hass.states).forEach((entity) => {\n if (entity.attributes && entity.attributes.hide_in_default_view) {\n const excludeEntityId = entity.entity_id;\n if (excludes[excludeEntityId]) return;\n excludes[excludeEntityId] = entity;\n if (entity.attributes.view) {\n Object.assign(\n excludes, getViewEntities(hass.states, entity));\n }\n }\n });\n return !excludes[entityId];\n };\n },\n\n // Allows changing the 'Execute' / 'Activate' text on script/scene cards.\n installActionName(elementName) {\n const klass = customElements.get(elementName);\n if (!klass || !klass.prototype) return;\n Object.defineProperty(klass.prototype, 'localize', {\n get() {\n function customLocalize(v) {\n if (this.stateObj && this.stateObj.attributes &&\n this.stateObj.attributes.action_name) {\n return this.stateObj.attributes.action_name;\n }\n return this.__data.localize(v);\n }\n return customLocalize;\n },\n set() {},\n });\n },\n\n // Allows theming \"regular\" top badges.\n installHaStateLabelBadge() {\n const haStateLabelBadge = customElements.get('ha-state-label-badge');\n if (!haStateLabelBadge || !haStateLabelBadge.prototype.stateChanged) return;\n // Use named function to preserve 'this'.\n haStateLabelBadge.prototype.stateChanged = function update(stateObj) {\n // TODO: Call window.customUI.maybeChangeObject\n if (stateObj.attributes.theme) {\n if (this.hass.themes === null) {\n this.hass._themeWaiters = this.hass._themeWaiters || [];\n this.hass._themeWaiters.push(this);\n } else {\n applyThemesOnElement(\n this,\n this.hass.themes || { default_theme: 'default', themes: {} },\n stateObj.attributes.theme || 'default');\n }\n }\n this.updateStyles();\n if (this.startInterval) {\n // Added on 19.1.2018\n this.startInterval(stateObj);\n }\n };\n },\n\n installStateBadge() {\n const stateBadge = customElements.get('state-badge');\n if (!stateBadge || !stateBadge.prototype.updateIconAppearance) return;\n const originalUpdateIconAppearance = stateBadge.prototype.updateIconAppearance;\n // Use named function to preserve 'this'.\n stateBadge.prototype.updateIconAppearance = function customUpdateIconAppearance(stateObj) {\n if (stateObj.attributes.icon_color && !stateObj.attributes.entity_picture) {\n this.style.backgroundImage = '';\n Object.assign(this.$.icon.style, {\n display: 'inline',\n color: stateObj.attributes.icon_color,\n filter: '',\n });\n } else {\n originalUpdateIconAppearance.call(this, stateObj);\n }\n };\n },\n\n installClassHooks() {\n if (window.customUI.classInitDone) return;\n window.customUI.classInitDone = true;\n window.customUI.installPartialCards();\n window.customUI.installStatesHook();\n window.customUI.installHaStateLabelBadge();\n window.customUI.installStateBadge();\n window.customUI.installActionName('state-card-scene');\n window.customUI.installActionName('state-card-script');\n // TODO: Fix, not working since HA 0.71\n window.customUI.updateAttributes();\n },\n\n init() {\n if (window.customUI.initDone) return;\n window.customUI.installClassHooks();\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (!main.hass || !main.hass.states) {\n // Connection wasn't made yet. Try in 1 second.\n window.setTimeout(window.customUI.init, 1000);\n return;\n }\n window.customUI.initDone = true;\n\n window.customUI.useCustomizer();\n\n window.customUI.runHooks();\n window.addEventListener('location-changed', window.setTimeout.bind(null, window.customUI.runHooks, 100));\n /* eslint-disable no-console */\n console.log(`Loaded CustomUI ${VERSION}`);\n /* eslint-enable no-console */\n if (!window.CUSTOM_UI_LIST) {\n window.CUSTOM_UI_LIST = [];\n }\n window.CUSTOM_UI_LIST.push({\n name: 'CustomUI',\n version: VERSION,\n url: 'https://github.com/andrey-git/home-assistant-custom-ui',\n });\n },\n\n runHooks() {\n window.customUI.fixGroupTitles();\n window.customUI.updateConfigPanel();\n },\n\n getName() {\n return window.localStorage.getItem('ha-device-name') || '';\n },\n\n setName(name) {\n window.localStorage.setItem('ha-device-name', name || '');\n },\n\n computeTemplate(template, hass, entities, entity, attributes, attribute, state) {\n const functionBody = (template.indexOf('return') >= 0) ? template : `return \\`${template}\\`;`;\n try {\n /* eslint-disable no-new-func */\n const func = new Function(\n 'hass', 'entities', 'entity', 'attributes', 'attribute', 'state', functionBody);\n /* eslint-enable no-new-func */\n return func(hass, entities, entity, attributes, attribute, state);\n } catch (e) {\n /* eslint-disable no-console */\n if ((e instanceof SyntaxError) || e instanceof ReferenceError) {\n console.warn(`${e.name}: ${e.message} in template ${functionBody}`);\n return null;\n }\n /* eslint-enable no-console */\n throw e;\n }\n },\n};\nwindow.customUI.init();\n","import computeDomain from './compute_domain.js';\nimport getGroupEntities from './get_group_entities.js';\n\n// Return an object containing all entities that the view will show\n// including embedded groups.\nexport default function getViewEntities(entities, view) {\n const viewEntities = {};\n\n view.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity && !entity.attributes.hidden) {\n viewEntities[entity.entity_id] = entity;\n\n if (computeDomain(entity.entity_id) === 'group') {\n const groupEntities = getGroupEntities(entities, entity);\n\n Object.keys(groupEntities).forEach((grEntityId) => {\n const grEntity = groupEntities[grEntityId];\n\n if (!grEntity.attributes.hidden) {\n viewEntities[grEntityId] = grEntity;\n }\n });\n }\n }\n });\n\n return viewEntities;\n}\n","export default function getGroupEntities(entities, group) {\n const result = {};\n\n group.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity) {\n result[entity.entity_id] = entity;\n }\n });\n\n return result;\n}\n","export default '20180528';\n","import '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass CuiBaseElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extra: {\n type: Array,\n computed: 'computeExtra(hass, stateObj)',\n },\n };\n }\n\n computeExtra(hass, stateObj) {\n let extras = stateObj.attributes.extra_data_template;\n if (extras) {\n if (!Array.isArray(extras)) {\n extras = [extras];\n }\n return extras.map(extra => window.customUI.computeTemplate(\n extra,\n hass,\n hass.states,\n stateObj,\n stateObj.attributes,\n /* attribute= */ undefined,\n stateObj.state,\n )).filter(result => result !== null);\n }\n return [];\n }\n\n showLastChanged(stateObj, inDialog, extra) {\n if (inDialog) return true;\n if (extra.length) return false;\n return !!stateObj.attributes.show_last_changed;\n }\n\n hasExtra(extra) {\n return extra.length > 0;\n }\n}\nexport default CuiBaseElement;\n","import dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.js';\n\n/**\n * @extends HTMLElement\n */\nclass DynamicElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n stateObj: Object,\n elementName: String,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n };\n }\n\n static get observers() {\n return [\n 'observerFunc(hass, stateObj, elementName, inDialog)',\n ];\n }\n\n observerFunc(hass, stateObj, elementName, inDialog) {\n dynamicContentUpdater(\n this,\n elementName ? elementName.toUpperCase() : 'DIV',\n { hass, stateObj, inDialog });\n }\n}\ncustomElements.define('dynamic-element', DynamicElement);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\n\nimport './dynamic-element.js';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass DynamicWithExtra extends customElements.get('state-card-display') {\n static get template() {\n return html`\n \n \n \n
\n \n \n \n \n
\n \n \n
\n \n
\n \n \n \n \n
\n \n
\n \n \n [[computeStateDisplay(stateObj)]]
\n \n \n
\n `;\n }\n\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extraObj: {\n type: Array,\n computed: 'computeExtra(hass, stateObj, _attached)',\n },\n _attached: Boolean,\n extraObjVisible: {\n type: Boolean,\n computed: 'computeExtraVisible(extraObj, inDialog)',\n },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._attached = true;\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n super.disconnectedCallback();\n }\n\n computeExtra(hass, stateObj, attached) {\n if (!stateObj.attributes.extra_badge || !attached) return [];\n let extraBadges = stateObj.attributes.extra_badge;\n if (!Array.isArray(extraBadges)) {\n extraBadges = [extraBadges];\n }\n return extraBadges.map((extraBadge) => {\n let result = null;\n if (extraBadge.entity_id && hass.states[extraBadge.entity_id]) {\n result = Object.assign({}, window.customUI.maybeChangeObject(\n this, hass.states[extraBadge.entity_id], this.inDialog,\n /* allowHidden= */false));\n } else if (extraBadge.attribute &&\n stateObj.attributes[extraBadge.attribute] !== undefined) {\n result = {\n state: String(stateObj.attributes[extraBadge.attribute]),\n _domain: 'none',\n entity_id: null,\n attributes: { unit_of_measurement: extraBadge.unit },\n };\n }\n if (!result) return null;\n let blacklist = extraBadge.blacklist_states;\n if (blacklist !== undefined) {\n if (!Array.isArray(blacklist)) {\n blacklist = [blacklist];\n }\n if (blacklist.some(v => RegExp(v).test(result.state.toString()))) {\n return null;\n }\n }\n result._entityDisplay = '';\n return result;\n }).filter(extraBadge => extraBadge != null);\n }\n\n computeExtraVisible(extraObj, inDialog) {\n if (inDialog || !extraObj) return false;\n return extraObj.length !== 0;\n }\n\n extraClass(extraObjVisible) {\n return extraObjVisible ? 'extra' : '';\n }\n\n _showControl(inDialog, stateObj) {\n if (inDialog) return true;\n return !stateObj.attributes.hide_control;\n }\n\n computeStateDisplay(stateObj) {\n // haLocalize removed in 0.61\n return super.computeStateDisplay(this.haLocalize || this.localize, stateObj);\n }\n\n isConfirmControls(stateObj) {\n return stateObj.attributes.confirm_controls ||\n stateObj.attributes.confirm_controls_show_lock;\n }\n\n clickHandler(e) {\n this.root.querySelector('#overlay').style.pointerEvents = 'none';\n const lock = this.root.querySelector('#lock');\n if (lock) {\n lock.icon = 'mdi:lock-open-outline';\n lock.style.opacity = '0.1';\n }\n window.setTimeout(() => {\n this.root.querySelector('#overlay').style.pointerEvents = '';\n if (lock) {\n lock.icon = 'mdi:lock-outline';\n lock.style.opacity = '';\n }\n }, 5000);\n e.stopPropagation();\n }\n\n applyThemes(hass, element, stateObj) {\n const themeName = stateObj.attributes.theme || 'default';\n applyThemesOnElement(\n element, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n extraDomChanged() {\n this.root.querySelectorAll('ha-state-label-badge')\n .forEach((elem) => {\n this.applyThemes(this.hass, elem, elem.state);\n });\n }\n}\ncustomElements.define('dynamic-with-extra', DynamicWithExtra);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaThemedSlider extends Polymer.Element {\n static get template() {\n return html`\n \n\n \n \n `;\n }\n\n ready() {\n super.ready();\n this.disableOffWhenMin = !this._computeAttribute(this.theme, 'off_when_min', !this.disableOffWhenMin);\n this.computeEnabledThemedReportWhenNotChanged(this.theme, this.disableReportWhenNotChanged);\n }\n\n static get properties() {\n return {\n min: {\n type: Number,\n value: 0,\n },\n max: {\n type: Number,\n value: 100,\n },\n pin: {\n type: Boolean,\n value: false,\n },\n isOn: {\n type: Boolean,\n value: false,\n },\n disableOffWhenMin: {\n type: Boolean,\n value: false,\n notify: true,\n },\n disableReportWhenNotChanged: {\n type: Boolean,\n value: false,\n },\n\n theme: Object,\n value: {\n type: Number,\n notify: true,\n },\n _themedMin: {\n type: Number,\n computed: '_computeAttribute(theme, \"min\", min)',\n },\n };\n }\n\n static get observers() {\n return [\n 'computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged)',\n ];\n }\n\n computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged) {\n this._enabledThemedReportWhenNotChanged = this._computeAttribute(\n theme, 'report_when_not_changed', !disableReportWhenNotChanged);\n }\n\n _computeAttribute(theme, attr, def) {\n if (theme) {\n if (attr in theme) {\n return theme[attr];\n }\n }\n return def;\n }\n\n computeClass(theme, isOn, themedMin) {\n let result = '';\n if (isOn) {\n result += 'is-on ';\n }\n if (this._computeAttribute(theme, 'off_when_min', !this.disableOffWhenMin) || themedMin === 0) {\n // If offWhenMin is enabled don't customize.\n return '';\n }\n return `${result}disable-off-when-min`;\n }\n\n valueChanged(ev) {\n if (!this._enabledThemedReportWhenNotChanged && this.value === ev.target.value) {\n ev.stopPropagation();\n return;\n }\n this.value = ev.target.value;\n }\n}\ncustomElements.define('ha-themed-slider', HaThemedSlider);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\nimport './ha-themed-slider.js';\n\n/**\n * @extends HTMLElement\n */\nclass StateCardWithSlider extends CuiBaseElement {\n static get template() {\n return html`\n \n \n\n \n
\n
\n \n [[item]]
\n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n
\n `;\n }\n\n static get properties() {\n return {\n domain: String,\n serviceMin: String,\n serviceMax: String,\n valueName: String,\n setValueName: String,\n nameOn: { type: String, value: 'on' },\n min: { type: Number, value: 0 },\n max: { type: Number, value: 255 },\n\n sliderValue: {\n type: Number,\n value: 0,\n },\n disableOffWhenMin: Boolean,\n mode: String,\n stretchSlider: {\n type: Boolean,\n value: false,\n },\n breakSlider: {\n type: Boolean,\n value: false,\n },\n hideSlider: {\n type: Boolean,\n value: false,\n },\n lineTooLong: {\n type: Boolean,\n value: false,\n },\n minLineBreak: Number,\n maxLineBreak: Number,\n showSlider: {\n type: Number,\n computed: '_showSlider(inDialog, stateObj, hideSlider)',\n },\n };\n }\n\n ready() {\n super.ready();\n this._onIronResize = this._onIronResize.bind(this);\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._isConnected = true;\n window.addEventListener('resize', this._onIronResize);\n this._waitForLayout();\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this._onIronResize);\n this._isConnected = false;\n super.disconnectedCallback();\n }\n\n static get observers() {\n return [\n 'stateObjChanged(stateObj, nameOn, valueName)',\n ];\n }\n\n _waitForLayout() {\n if (!this._isConnected) return;\n this._setMode();\n if (this._frameId) return;\n this.readyToCompute = false;\n this._frameId = window.requestAnimationFrame(() => {\n this._frameId = null;\n this.readyToCompute = true;\n this._onIronResize();\n });\n }\n\n _setMode() {\n const obj = {\n hideSlider: this.mode === 'hide-slider' && this.lineTooLong,\n breakSlider:\n (this.mode === 'break-slider' || this.mode === 'hide-slider') &&\n this.lineTooLong,\n };\n if (!this.showSlider) {\n obj.breakSlider = true;\n }\n this.setProperties(obj);\n }\n\n _onIronResize() {\n if (!this.readyToCompute) return;\n if (this.mode === 'no-slider') {\n this.setProperties({\n hideSlider: true,\n breakSlider: true,\n });\n return;\n }\n const prevBreakSlider = this.breakSlider;\n const prevHideSlider = this.hideSlider;\n this.setProperties({\n lineTooLong: false,\n hideSlider: false,\n breakSlider: false,\n });\n const { container } = this.$;\n const containerWidth = container.clientWidth;\n if (containerWidth === 0) return;\n if (containerWidth <= this.minLineBreak) {\n this.lineTooLong = true;\n } else if (containerWidth >= this.maxLineBreak) {\n this.lineTooLong = false;\n } else {\n if (prevHideSlider && this.mode === 'hide-slider') {\n // We need to unhide the slider in order to recalculate height.\n this._waitForLayout();\n return;\n }\n const containerHeight = container.clientHeight;\n const stateHeight = this.root.querySelector('.state-info').clientHeight;\n this.lineTooLong = containerHeight > stateHeight * 1.5;\n if (this.lineTooLong) {\n this.minLineBreak = containerWidth;\n } else if (!prevBreakSlider) {\n this.maxLineBreak = containerWidth;\n }\n }\n this._setMode();\n }\n\n _computeWrapClass(mode, stretchSlider, lineTooLong, inDialog) {\n if (inDialog) {\n return '';\n }\n if (mode === 'single-line') {\n return 'nowrap';\n }\n if (stretchSlider && lineTooLong) {\n return 'stretch wrap';\n }\n return 'wrap';\n }\n\n _showSlider(inDialog, stateObj, hideSlider) {\n if (inDialog || hideSlider) {\n return false;\n }\n return true;\n }\n\n sliderChanged(ev) {\n const value = parseInt(ev.target.value, 10);\n const param = { entity_id: this.stateObj.entity_id };\n if (Number.isNaN(value)) return;\n let target = this.root.querySelector('#slider');\n if (ev.target !== target) {\n // No Shadow DOM - we have access to original target.\n ({ target } = ev);\n } else if (ev.path) {\n [target] = ev.path;\n } else if (ev.composedPath) {\n [target] = ev.composedPath();\n }\n if (value === 0 || (value <= target.min && !this.disableOffWhenMin)) {\n this.hass.callService(this.domain, this.serviceMin, param);\n } else {\n param[this.setValueName || this.valueName] = value;\n this.hass.callService(this.domain, this.serviceMax, param);\n }\n }\n\n stateObjChanged(stateObj, nameOn, valueName) {\n const obj = {\n sliderValue: this.isOn(stateObj, nameOn) ? stateObj.attributes[valueName] : 0,\n };\n if (stateObj) {\n Object.assign(obj, {\n minLineBreak: 0,\n maxLineBreak: 999,\n hideSlider: false,\n breakSlider: false,\n lineTooLong: false,\n mode: stateObj.attributes.state_card_mode,\n stretchSlider: !!stateObj.attributes.stretch_slider,\n });\n }\n this.setProperties(obj);\n if (stateObj) {\n this._waitForLayout();\n }\n }\n\n isOn(stateObj, nameOn) {\n return stateObj && (!nameOn || stateObj.state === nameOn);\n }\n\n stopPropagation(ev) {\n ev.stopPropagation();\n }\n}\ncustomElements.define('state-card-with-slider', StateCardWithSlider);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\n\n/**\n * @extends HTMLElement\n */\nclass StateCardWithoutSlider extends CuiBaseElement {\n static get template() {\n return html`\n \n \n\n \n
\n \n [[item]]
\n \n \n
\n \n
\n `;\n }\n}\ncustomElements.define('state-card-without-slider', StateCardWithoutSlider);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.js';\nimport dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.js';\nimport stateCardType from '../../home-assistant-polymer/src/common/entity/state_card_type.js';\n\nimport '../utils/hooks.js';\nimport './state-card-with-slider.js';\nimport './state-card-without-slider.js';\n\nconst SHOW_LAST_CHANGED_BLACKLISTED_CARDS = ['configurator'];\nconst DOMAIN_TO_SLIDER_SUPPORT = {\n light: 1, // SUPPORT_BRIGHTNESS\n cover: 4, // SUPPORT_SET_POSITION\n climate: 1, // SUPPORT_TARGET_TEMPERATURE\n};\nconst TYPE_TO_CONTROL = {\n toggle: 'ha-entity-toggle',\n display: '',\n cover: 'ha-cover-controls',\n};\n\n/**\n * @extends HTMLElement\n */\nclass StateCardCustomUi extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n\n stateObj: Object,\n };\n }\n\n static get observers() {\n return [\n 'inputChanged(hass, inDialog, stateObj)',\n ];\n }\n\n connectedCallback() {\n super.connectedCallback();\n const container = this.parentNode.parentNode;\n if (container.tagName === 'DIV' &&\n (container.classList.contains('state') || container.classList.contains('child-card'))) {\n this._container = container;\n\n // Since this doesn't actually change the background - no need to clear it.\n container.style.setProperty(\n 'background-color', 'var(--paper-card-background-color, inherit)');\n\n // Polyfill 'updateStyles'.\n if (!container.updateStyles) {\n container.updateStyles = (styles) => {\n Object.keys(styles).forEach((key) => {\n container.style.setProperty(key, styles[key]);\n });\n };\n }\n }\n this._isAttached = true;\n this.inputChanged(this.hass, this.inDialog, this.stateObj);\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n if (this._container) {\n this._container.updateStyles({ display: '', margin: '', padding: '' });\n applyThemesOnElement(\n this._container, this.hass.themes || { default_theme: 'default', themes: {} }, 'default');\n this._container = null;\n }\n super.disconnectedCallback();\n }\n\n badgeMode(hass, stateObj, domain) {\n const states = [];\n if (domain === 'group') {\n stateObj.attributes.entity_id.forEach((id) => {\n const state = hass.states[id];\n if (!state) {\n /* eslint-disable no-console */\n console.warn(`Unknown ID ${id} in group ${stateObj.entity_id}`);\n /* eslint-enable no-console */\n return;\n }\n if (!stateObj.attributes.badges_list ||\n stateObj.attributes.badges_list.includes(state.entity_id)) {\n states.push(window.customUI.maybeChangeObject(\n this, state, false /* inDialog */, false /* allowHidden */));\n }\n });\n } else {\n states.push(stateObj);\n if (this._container) {\n this._container.style.display = 'inline-block';\n const params = { display: 'inline-block' };\n if (this._container.classList.contains('state')) {\n params.margin = 'var(--ha-badges-card-margin, 0)';\n }\n this.updateStyles(params);\n }\n }\n dynamicContentUpdater(\n this,\n 'HA-BADGES-CARD',\n { hass, states });\n if (this._container) {\n this._container.updateStyles({\n width: 'var(--ha-badges-card-width, initial)',\n 'text-align': 'var(--ha-badges-card-text-align, initial)',\n });\n }\n this.lastChild.style.fontSize = '85%';\n\n // Since this variable only affects badges mode - no need to clean it up.\n this.style.setProperty('--ha-state-label-badge-margin-bottom', '0');\n }\n\n cleanBadgeStyle() {\n if (this._container) {\n this._container.updateStyles({\n display: '',\n width: '',\n 'text-align': '',\n });\n }\n this.updateStyles({ display: '', margin: '' });\n }\n\n applyThemes(hass, modifiedObj) {\n let themeTarget = this;\n let themeName = 'default';\n if (this._container) {\n themeTarget = this._container;\n }\n if (modifiedObj.attributes.theme) {\n themeName = modifiedObj.attributes.theme;\n }\n applyThemesOnElement(\n themeTarget, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n maybeHideEntity(modifiedObj) {\n if (!modifiedObj) {\n if (this.lastChild) {\n this.removeChild(this.lastChild);\n }\n if (this._container) {\n this._container.updateStyles({ margin: '0', padding: '0' });\n }\n return true;\n }\n if (this._container) {\n this._container.updateStyles({ margin: '', padding: '' });\n }\n return false;\n }\n\n sliderEligible_(domain, obj, inDialog) {\n if (inDialog) return false;\n return DOMAIN_TO_SLIDER_SUPPORT[domain] &&\n (DOMAIN_TO_SLIDER_SUPPORT[domain] & obj.attributes.supported_features) &&\n obj.attributes.state_card_mode && obj.attributes.state_card_mode !== 'no-slider';\n }\n\n inputChanged(hass, inDialog, stateObj) {\n if (!stateObj || !hass || !this._isAttached) return;\n const domain = computeStateDomain(stateObj);\n const modifiedObj = window.customUI.maybeChangeObject(\n this, stateObj, inDialog, true /* allowHidden */);\n\n if (this.maybeHideEntity(modifiedObj)) return;\n\n this.applyThemes(hass, modifiedObj);\n\n if (!inDialog && modifiedObj.attributes.state_card_mode === 'badges') {\n this.badgeMode(hass, modifiedObj, domain);\n } else {\n this.regularMode_(hass, inDialog, modifiedObj, domain);\n }\n }\n\n regularMode_(hass, inDialog, stateObj, domain) {\n this.cleanBadgeStyle();\n\n const params = {\n hass,\n stateObj,\n inDialog,\n };\n const originalStateCardType = stateCardType(hass, stateObj);\n let customStateCardType;\n const secondaryStateCardType = stateObj.attributes.state_card_custom_ui_secondary;\n\n if (domain === 'light' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-entity-toggle',\n serviceMin: 'turn_off',\n serviceMax: 'turn_on',\n valueName: 'brightness',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'cover' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-cover-controls',\n max: 100,\n serviceMin: 'close_cover',\n serviceMax: 'set_cover_position',\n setValueName: 'position',\n valueName: 'current_position',\n nameOn: 'open',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'climate' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-climate-state',\n min: stateObj.attributes.min_temp || -100,\n max: stateObj.attributes.max_temp || 200,\n serviceMin: 'set_temperature',\n serviceMax: 'set_temperature',\n valueName: 'temperature',\n nameOn: '',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (TYPE_TO_CONTROL[originalStateCardType] !== undefined) {\n params.controlElement = TYPE_TO_CONTROL[originalStateCardType];\n customStateCardType = 'state-card-without-slider';\n } else if (stateObj.attributes.show_last_changed &&\n !SHOW_LAST_CHANGED_BLACKLISTED_CARDS.includes(originalStateCardType)) {\n params.inDialog = true;\n }\n if (stateObj.state === 'unavailable') {\n params.controlElement = '';\n }\n if (stateObj.attributes.control_element !== undefined) {\n params.controlElement = stateObj.attributes.control_element;\n }\n\n dynamicContentUpdater(\n this,\n (secondaryStateCardType || customStateCardType || `STATE-CARD-${originalStateCardType}`).toUpperCase(),\n params);\n }\n}\ncustomElements.define('state-card-custom-ui', StateCardCustomUi);\n","import canToggleDomain from './can_toggle_domain.js';\nimport computeStateDomain from './compute_state_domain.js';\n\nexport default function canToggleState(hass, stateObj) {\n const domain = computeStateDomain(stateObj);\n if (domain === 'group') {\n return stateObj.state === 'on' || stateObj.state === 'off';\n }\n if (domain === 'climate') {\n return !!((stateObj.attributes || {}).supported_features & 4096);\n }\n\n return canToggleDomain(hass, domain);\n}\n","export default function canToggleDomain(hass, domain) {\n const services = hass.config.services[domain];\n if (!services) { return false; }\n\n if (domain === 'lock') {\n return 'lock' in services;\n } else if (domain === 'cover') {\n return 'open_cover' in services;\n }\n return 'turn_on' in services;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nwindow.JSCompiler_renameProperty = function(prop) { return prop; };\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///../home-assistant-polymer/src/common/dom/apply_themes_on_element.js","webpack:///../home-assistant-polymer/src/common/entity/compute_domain.js","webpack:///../home-assistant-polymer/src/common/entity/compute_state_domain.js","webpack:///../home-assistant-polymer/src/common/dom/dynamic_content_updater.js","webpack:///../home-assistant-polymer/src/common/const.js","webpack:///../home-assistant-polymer/src/common/entity/state_card_type.js","webpack:///./node_modules/@polymer/polymer/lib/utils/html-tag.js","webpack:///./src/mixins/events-mixin.js","webpack:///./src/elements/ha-config-custom-ui.js","webpack:///./src/utils/version.js","webpack:///../home-assistant-polymer/src/util/hass-attributes-util.js","webpack:///./src/utils/hass-attribute-util.js","webpack:///./src/utils/hooks.js","webpack:///../home-assistant-polymer/src/common/entity/get_view_entities.js","webpack:///../home-assistant-polymer/src/common/entity/get_group_entities.js","webpack:///./src/elements/cui-base-element.js","webpack:///./src/elements/dynamic-element.js","webpack:///./src/elements/dynamic-with-extra.js","webpack:///./src/elements/ha-themed-slider.js","webpack:///./src/elements/state-card-with-slider.js","webpack:///./src/elements/state-card-without-slider.js","webpack:///./src/elements/state-card-custom-ui.js","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_state.js","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_domain.js","webpack:///./node_modules/@polymer/polymer/lib/utils/boot.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","r","value","n","__esModule","default","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","applyThemesOnElement","element","themes","localTheme","updateMeta","arguments","length","_themes","themeName","default_theme","styles","assign","theme","keys","forEach","key","prefixedKey","updateStyles","window","ShadyCSS","styleSubtree","meta","document","querySelector","hasAttribute","setAttribute","getAttribute","themeColor","computeDomain","entityId","substr","indexOf","computeStateDomain","stateObj","_domain","entity_id","dynamicContentUpdater","root","newElementTag","attributes","rootEl","customEl","lastChild","tagName","removeChild","createElement","toLowerCase","setProperties","parentNode","appendChild","DOMAINS_WITH_CARD","_createClass","defineProperties","target","props","descriptor","writable","Constructor","protoProps","staticProps","LiteralString","string","this","toString","strings","raw","html","template","_len","values","Array","_key","innerHTML","reduce","acc","v","idx","HTMLTemplateElement","Error","literalValue","ha_config_custom_ui_createClass","_templateObject","freeze","ha_config_custom_ui_HaConfigCustomUi","superClass","Polymer","Element","_superClass","EventsMixin","instance","TypeError","__proto__","getPrototypeOf","apply","subClass","create","constructor","setPrototypeOf","events_mixin_createClass","type","detail","options","event","Event","bubbles","cancelable","Boolean","composed","node","dispatchEvent","HaConfigCustomUi","customUI","getName","setName","history","back","fire","isWide","String","observer","customElements","define","hassAttributeUtil","binary_sensor","cover","sensor","json","icon","boolean","array","key-value","LOGIC_STATE_ATTRIBUTES","entity_picture","friendly_name","description","emulated_hue","domains","emulated_hue_name","haaska_hidden","haaska_name","homebridge_hidden","homebridge_name","supported_features","attribution","custom_ui_more_info","custom_ui_state_card","device_class","DOMAIN_DEVICE_CLASS","hidden","assumed_state","initial_state","unit_of_measurement","hass_attributes_util","SUPPORTED_SLIDER_MODES","customUiAttributes","group","device","templates","control_element","state_card_mode","light","concat","climate","*","state_card_custom_ui_secondary","badges_list","show_last_changed","hide_control","extra_data_template","extra_badge","stretch_slider","slider_theme","confirm_controls","confirm_controls_show_lock","hide_in_default_view","UNKNOWN_TYPE","domHost","elem","getRootNode","DocumentFragment","host","lightOrShadow","selector","shadowRoot","getElementHierarchy","hierarchy","shift","getContext","_context","groupEntity","push","states","reverse","findMatch","find","option","match","maybeChangeObjectByDevice","applyAttributes","maybeChangeObjectByGroup","_this","context","_setKeep","obj","_cui_keep","maybeApplyTemplateAttributes","hass","newAttributes","hasGlobal","hasChanges","computeTemplate","untemplated_attributes","untemplated_state","state","_stateDisplay","result","untemplated_stateDisplay","maybeApplyTemplates","newResult","checkAttributes","last_changed","maybeChangeObject","inDialog","allowHidden","fixGroupTitles","homeAssistantMain","haCards","$","main","querySelectorAll","card","textContent","setTimeout","controlColumns","columns","partialCards","mqls","mql","removeListener","handleWindowChange","map","width","matchMedia","addListener","bind","useCustomizer","customizer","hide_attributes","attr","updateConfigPanel","location","pathname","startsWith","haPanelConfig","haConfigNavigation","localize","cuiPatch","_originalComputeLoaded","_computeLoaded","_originalComputeCaption","_computeCaption","_originalComputeDescription","_computeDescription","page","pages","some","conf","domain","caption","loaded","getHaConfigCustomUi","haConfigCustomUi","ironPages","lastElementChild","addEventListener","select","visible","style","display","installStatesHook","homeAssistant","_updateHass","originalUpdate","entity","newEntity","_themeWaiters","waiter","stateChanged","installPartialCards","_defaultViewFilter","excludes","excludeEntityId","view","entities","viewEntities","groupEntities","grEntityId","grEntity","installActionName","elementName","klass","action_name","__data","set","installHaStateLabelBadge","haStateLabelBadge","startInterval","installStateBadge","stateBadge","updateIconAppearance","originalUpdateIconAppearance","icon_color","backgroundImage","color","filter","installHaAttributes","haAttributes","computeFiltersArray","extraFilters","split","installHaFormCustomize","haFormCustomize","haFormCustomizeInitDone","_computeSingleAttribute","secondary","config","_initOpenObject","JSON","stringify","getNewAttributesOptions","localAttributes","globalAttributes","existingAttributes","_this2","includes","filterFromAttributes","sort","installClassHooks","classInitDone","init","initDone","runHooks","console","log","CUSTOM_UI_LIST","version","url","localStorage","getItem","setItem","attribute","functionBody","Function","e","SyntaxError","ReferenceError","warn","message","cui_base_element","extras","isArray","extra","controlElement","computed","CuiBaseElement","dynamic_element_createClass","dynamic_element_DynamicElement","toUpperCase","DynamicElement","dynamic_with_extra_DynamicWithExtra","dynamic_with_extra_createClass","DynamicWithExtra","dynamic_with_extra_get","_attached","_isAttached","attached","extraBadges","extraBadge","unit","blacklist","blacklist_states","RegExp","test","_entityDisplay","extraObj","extraObjVisible","haLocalize","_this3","pointerEvents","lock","opacity","stopPropagation","_this4","applyThemes","dynamic_with_extra_templateObject","ha_themed_slider_HaThemedSlider","HaThemedSlider","disableOffWhenMin","_computeAttribute","computeEnabledThemedReportWhenNotChanged","disableReportWhenNotChanged","_enabledThemedReportWhenNotChanged","def","isOn","themedMin","ev","ha_themed_slider_templateObject","min","Number","max","pin","notify","_themedMin","state_card_with_slider_StateCardWithSlider","state_card_with_slider_get","StateCardWithSlider","_onIronResize","_isConnected","_waitForLayout","removeEventListener","_setMode","_frameId","readyToCompute","requestAnimationFrame","hideSlider","mode","lineTooLong","breakSlider","showSlider","prevBreakSlider","prevHideSlider","container","containerWidth","clientWidth","minLineBreak","maxLineBreak","containerHeight","clientHeight","stateHeight","stretchSlider","parseInt","param","isNaN","path","_slicedToArray","composedPath","_ev$composedPath","callService","serviceMin","setValueName","valueName","serviceMax","nameOn","sliderValue","state_card_with_slider_templateObject","state_card_without_slider_StateCardWithoutSlider","state_card_without_slider_templateObject","SHOW_LAST_CHANGED_BLACKLISTED_CARDS","DOMAIN_TO_SLIDER_SUPPORT","TYPE_TO_CONTROL","toggle","state_card_custom_ui_StateCardCustomUi","state_card_custom_ui_get","StateCardCustomUi","classList","contains","_container","setProperty","inputChanged","margin","padding","id","params","text-align","fontSize","modifiedObj","themeTarget","maybeHideEntity","regularMode_","badgeMode","cleanBadgeStyle","originalStateCardType","services","control","stateCardType","customStateCardType","secondaryStateCardType","sliderEligible_","min_temp","max_temp","JSCompiler_renameProperty","prop"],"mappings":"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","file":"scripts-es5.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/**\n * Apply a theme to an element by setting the CSS variables on it.\n *\n * element: Element to apply theme on.\n * themes: HASS Theme information\n * localTheme: selected theme.\n * updateMeta: boolean if we should update the theme-color meta element.\n*/\nexport default function applyThemesOnElement(element, themes, localTheme, updateMeta = false) {\n if (!element._themes) {\n element._themes = {};\n }\n let themeName = themes.default_theme;\n if (localTheme === 'default' || (localTheme && themes.themes[localTheme])) {\n themeName = localTheme;\n }\n const styles = Object.assign({}, element._themes);\n if (themeName !== 'default') {\n var theme = themes.themes[themeName];\n Object.keys(theme).forEach((key) => {\n var prefixedKey = '--' + key;\n element._themes[prefixedKey] = '';\n styles[prefixedKey] = theme[key];\n });\n }\n if (element.updateStyles) {\n element.updateStyles(styles);\n } else if (window.ShadyCSS) {\n // implement updateStyles() method of Polemer elements\n window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(element), styles);\n }\n\n if (!updateMeta) return;\n\n const meta = document.querySelector('meta[name=theme-color]');\n if (meta) {\n if (!meta.hasAttribute('default-content')) {\n meta.setAttribute('default-content', meta.getAttribute('content'));\n }\n const themeColor = styles['--primary-color'] || meta.getAttribute('default-content');\n meta.setAttribute('content', themeColor);\n }\n}\n","export default function computeDomain(entityId) {\n return entityId.substr(0, entityId.indexOf('.'));\n}\n","import computeDomain from './compute_domain.js';\n\nexport default function computeStateDomain(stateObj) {\n if (!stateObj._domain) {\n stateObj._domain = computeDomain(stateObj.entity_id);\n }\n\n return stateObj._domain;\n}\n","/**\n * Update root's child element to be newElementTag replacing another existing child if any.\n * Copy attributes into the child element.\n */\nexport default function dynamicContentUpdater(root, newElementTag, attributes) {\n const rootEl = root;\n let customEl;\n\n if (rootEl.lastChild && rootEl.lastChild.tagName === newElementTag) {\n customEl = rootEl.lastChild;\n } else {\n if (rootEl.lastChild) {\n rootEl.removeChild(rootEl.lastChild);\n }\n // Creating an element with upper case works fine in Chrome, but in FF it doesn't immediately\n // become a defined Custom Element. Polymer does that in some later pass.\n customEl = document.createElement(newElementTag.toLowerCase());\n }\n\n if (customEl.setProperties) {\n customEl.setProperties(attributes);\n } else {\n // If custom element definition wasn't loaded yet - setProperties would be\n // missing, but no harm in setting attributes one-by-one then.\n Object.keys(attributes).forEach((key) => {\n customEl[key] = attributes[key];\n });\n }\n\n if (customEl.parentNode === null) {\n rootEl.appendChild(customEl);\n }\n}\n","/** Constants to be used in the frontend. */\n\n// Constants should be alphabetically sorted by name.\n// Arrays with values should be alphabetically sorted if order doesn't matter.\n// Each constant should have a description what it is supposed to be used for.\n\n/** Icon to use when no icon specified for domain. */\nexport const DEFAULT_DOMAIN_ICON = 'mdi:bookmark';\n\n/** Domains that have a state card. */\nexport const DOMAINS_WITH_CARD = [\n 'climate',\n 'cover',\n 'configurator',\n 'input_select',\n 'input_number',\n 'input_text',\n 'media_player',\n 'scene',\n 'script',\n 'timer',\n 'weblink',\n];\n\n/** Domains that should have the history hidden in the more info dialog. */\nexport const DOMAINS_MORE_INFO_NO_HISTORY = [\n 'camera',\n 'configurator',\n 'history_graph',\n 'scene',\n];\n\n/** States that we consider \"off\". */\nexport const STATES_OFF = [\n 'closed',\n 'off',\n 'unlocked',\n];\n\n/** Temperature units. */\nexport const UNIT_C = '°C';\nexport const UNIT_F = '°F';\n\n/** Entity ID of the default view. */\nexport const DEFAULT_VIEW_ENTITY_ID = 'group.default_view';\n","import canToggleState from './can_toggle_state.js';\nimport computeStateDomain from './compute_state_domain.js';\nimport { DOMAINS_WITH_CARD } from '../const.js';\n\nexport default function stateCardType(hass, stateObj) {\n if (stateObj.state === 'unavailable') {\n return 'display';\n }\n\n const domain = computeStateDomain(stateObj);\n\n if (DOMAINS_WITH_CARD.includes(domain)) {\n return domain;\n } else if (canToggleState(hass, stateObj) &&\n stateObj.attributes.control !== 'hidden') {\n return 'toggle';\n }\n return 'display';\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\n/**\n * Class representing a static string value which can be used to filter\n * strings by asseting that they have been created via this class. The\n * `value` property returns the string passed to the constructor.\n */\nclass LiteralString {\n constructor(string) {\n /** @type {string} */\n this.value = string.toString();\n }\n /**\n * @return {string} LiteralString string value\n */\n toString() {\n return this.value;\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction literalValue(value) {\n if (value instanceof LiteralString) {\n return /** @type {!LiteralString} */(value).value;\n } else {\n throw new Error(\n `non-literal value passed to Polymer's htmlLiteral function: ${value}`\n );\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction htmlValue(value) {\n if (value instanceof HTMLTemplateElement) {\n return /** @type {!HTMLTemplateElement } */(value).innerHTML;\n } else if (value instanceof LiteralString) {\n return literalValue(value);\n } else {\n throw new Error(\n `non-template value passed to Polymer's html function: ${value}`);\n }\n}\n\n/**\n * A template literal tag that creates an HTML element from the\n * contents of the string.\n *\n * This allows you to write a Polymer Template in JavaScript.\n *\n * Templates can be composed by interpolating `HTMLTemplateElement`s in\n * expressions in the JavaScript template literal. The nested template's\n * `innerHTML` is included in the containing template. The only other\n * values allowed in expressions are those returned from `htmlLiteral`\n * which ensures only literal values from JS source ever reach the HTML, to\n * guard against XSS risks.\n *\n * All other values are disallowed in expressions to help prevent XSS\n * attacks; however, `htmlLiteral` can be used to compose static\n * string values into templates. This is useful to compose strings into\n * places that do not accept html, like the css text of a `style`\n * element.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * \n * ${this.partialTemplate}
\n * ${super.template}\n * `;\n * }\n * static get partialTemplate() { return html`Partial!`; }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement\n */\nexport const html = function html(strings, ...values) {\n const template = /** @type {!HTMLTemplateElement} */(document.createElement('template'));\n template.innerHTML = values.reduce((acc, v, idx) =>\n acc + htmlValue(v) + strings[idx + 1], strings[0]);\n return template;\n};\n\n/**\n * An html literal tag that can be used with `html` to compose.\n * a literal string.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * \n * ${staticValue}
\n * ${super.template}\n * `;\n * }\n * static get styleTemplate() {\n * return htmlLiteral`.shadowed { background: gray; }`;\n * }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!LiteralString} Constructed literal string\n */\nexport const htmlLiteral = function(strings, ...values) {\n return new LiteralString(values.reduce((acc, v, idx) =>\n acc + literalValue(v) + strings[idx + 1], strings[0]));\n};\n","// Polymer legacy event helpers used courtesy of the Polymer project.\n//\n// Copyright (c) 2017 The Polymer Authors. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nexport default (superClass) => {\n /**\n * @extends HTMLElement\n */\n class EventsMixin extends superClass {\n /**\n * Dispatches a custom event with an optional detail value.\n *\n * @param {string} type Name of event type.\n * @param {*=} detail Detail value containing event-specific\n * payload.\n * @param {{ bubbles: (boolean|undefined),\n cancelable: (boolean|undefined),\n composed: (boolean|undefined) }=}\n * options Object specifying options. These may include:\n * `bubbles` (boolean, defaults to `true`),\n * `cancelable` (boolean, defaults to false), and\n * `node` on which to fire the event (HTMLElement, defaults to `this`).\n * @return {Event} The new event that was fired.\n */\n fire(type, detail = {}, options = {}) {\n const event = new Event(type, {\n bubbles: options.bubbles === undefined ? true : options.bubbles,\n cancelable: Boolean(options.cancelable),\n composed: options.composed === undefined ? true : options.composed,\n });\n event.detail = detail;\n const node = options.node || this;\n node.dispatchEvent(event);\n return event;\n }\n }\n return EventsMixin;\n};\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport EventsMixin from '../mixins/events-mixin.js';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaConfigCustomUi extends EventsMixin(Polymer.Element) {\n static get template() {\n return html`\n \n \n \n \n \n Custom UI settings
\n \n \n\n \n \n \n Set device name so that you can reference it in per-device settings\n
\n
\n \n \n \n `;\n }\n\n static get properties() {\n return {\n isWide: Boolean,\n\n name: {\n type: String,\n observer: 'nameChanged',\n },\n };\n }\n\n ready() {\n super.ready();\n this.name = window.customUI.getName();\n }\n\n nameChanged(name) {\n window.customUI.setName(name);\n }\n\n _backHandler() {\n window.history.back();\n this.fire('location-changed');\n }\n}\ncustomElements.define('ha-config-custom-ui', HaConfigCustomUi);\n","export default '20180602';\n","const hassAttributeUtil = {};\n\nhassAttributeUtil.DOMAIN_DEVICE_CLASS = {\n binary_sensor: [\n 'battery',\n 'cold',\n 'connectivity',\n 'door',\n 'garage_door',\n 'gas',\n 'heat',\n 'light',\n 'lock',\n 'moisture',\n 'motion',\n 'moving',\n 'occupancy',\n 'opening',\n 'plug',\n 'power',\n 'presence',\n 'problem',\n 'safety',\n 'smoke',\n 'sound',\n 'vibration',\n 'window'\n ],\n cover: ['garage'],\n sensor: [\n 'battery',\n 'humidity',\n 'illuminance',\n 'temperature'\n ],\n};\n\nhassAttributeUtil.UNKNOWN_TYPE = 'json';\nhassAttributeUtil.ADD_TYPE = 'key-value';\n\nhassAttributeUtil.TYPE_TO_TAG = {\n string: 'ha-customize-string',\n json: 'ha-customize-string',\n icon: 'ha-customize-icon',\n boolean: 'ha-customize-boolean',\n array: 'ha-customize-array',\n 'key-value': 'ha-customize-key-value',\n};\n\n// Attributes here serve dual purpose:\n// 1) Any key of this object won't be shown in more-info window.\n// 2) Any key which has value other than undefined will appear in customization\n// config according to its value.\nhassAttributeUtil.LOGIC_STATE_ATTRIBUTES =\n hassAttributeUtil.LOGIC_STATE_ATTRIBUTES || {\n entity_picture: undefined,\n friendly_name: { type: 'string', description: 'Name' },\n icon: { type: 'icon' },\n emulated_hue: {\n type: 'boolean',\n domains: ['emulated_hue']\n },\n emulated_hue_name: {\n type: 'string',\n domains: ['emulated_hue']\n },\n haaska_hidden: undefined,\n haaska_name: undefined,\n homebridge_hidden: { type: 'boolean' },\n homebridge_name: { type: 'string' },\n supported_features: undefined,\n attribution: undefined,\n custom_ui_more_info: { type: 'string' },\n custom_ui_state_card: { type: 'string' },\n device_class: {\n type: 'array',\n options: hassAttributeUtil.DOMAIN_DEVICE_CLASS,\n description: 'Device class',\n domains: ['binary_sensor', 'cover', 'sensor']\n },\n hidden: { type: 'boolean', description: 'Hide from UI' },\n assumed_state: {\n type: 'boolean',\n domains: ['switch', 'light', 'cover', 'climate', 'fan', 'group']\n },\n initial_state: {\n type: 'string',\n domains: ['automation']\n },\n unit_of_measurement: { type: 'string' },\n };\n\nexport default hassAttributeUtil;\n","import hassAttributesUtil from '../../home-assistant-polymer/src/util/hass-attributes-util.js';\n\nwindow.hassAttributeUtil = window.hassAttributeUtil || {};\nconst SUPPORTED_SLIDER_MODES = [\n 'single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider',\n];\n\nconst customUiAttributes = {\n group: undefined,\n device: undefined,\n templates: undefined,\n control_element: { type: 'string' },\n state_card_mode: {\n type: 'array',\n options: {\n light: SUPPORTED_SLIDER_MODES.concat('badges'),\n cover: SUPPORTED_SLIDER_MODES.concat('badges'),\n climate: SUPPORTED_SLIDER_MODES.concat('badges'),\n '*': ['badges'],\n },\n },\n state_card_custom_ui_secondary: { type: 'string' },\n badges_list: { type: 'json' },\n show_last_changed: { type: 'boolean' },\n hide_control: { type: 'boolean' },\n extra_data_template: { type: 'string' },\n extra_badge: { type: 'json' },\n stretch_slider: { type: 'boolean' },\n slider_theme: { type: 'json' },\n theme: { type: 'string' },\n confirm_controls: { type: 'boolean' },\n confirm_controls_show_lock: { type: 'boolean' },\n hide_in_default_view: { type: 'boolean' },\n};\nwindow.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES = hassAttributesUtil.LOGIC_STATE_ATTRIBUTES;\nwindow.hassAttributeUtil.UNKNOWN_TYPE = hassAttributesUtil.UNKNOWN_TYPE;\nObject.assign(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, customUiAttributes);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.js';\nimport getViewEntities from '../../home-assistant-polymer/src/common/entity/get_view_entities.js';\n\nimport '../elements/ha-config-custom-ui.js';\nimport VERSION from './version.js';\nimport './hass-attribute-util.js';\n\nwindow.customUI = window.customUI || {\n SUPPORTED_SLIDER_MODES: [\n 'single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider',\n ],\n\n domHost(elem) {\n if (elem === document) return null;\n const root = elem.getRootNode();\n return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;\n },\n\n lightOrShadow(elem, selector) {\n return elem.shadowRoot ?\n elem.shadowRoot.querySelector(selector) :\n elem.querySelector(selector);\n },\n\n getElementHierarchy(root, hierarchy) {\n if (root === null) return null;\n const elem = hierarchy.shift();\n if (elem) {\n return window.customUI.getElementHierarchy(\n window.customUI.lightOrShadow(root, elem), hierarchy);\n }\n return root;\n },\n\n getContext(elem) {\n if (elem._context === undefined) {\n elem._context = [];\n for (let element = (elem.tagName === 'HA-ENTITIES-CARD' ? window.customUI.domHost(elem) : elem);\n element; element = window.customUI.domHost(element)) {\n switch (element.tagName) {\n case 'HA-ENTITIES-CARD':\n if (element.groupEntity) {\n elem._context.push(element.groupEntity.entity_id);\n } else if (element.groupEntity === false && element.states && element.states.length) {\n elem._context.push(`group.${computeStateDomain(element.states[0])}`);\n }\n break;\n case 'MORE-INFO-GROUP':\n case 'STATE-CARD-CONTENT':\n if (element.stateObj) {\n elem._context.push(element.stateObj.entity_id);\n }\n break;\n case 'HA-CARDS':\n elem._context.push(element.getAttribute('data-view') || 'default_view');\n break;\n // no default\n }\n }\n elem._context.reverse();\n }\n return elem._context;\n },\n\n findMatch(key, options) {\n if (!options) return null;\n if (options[key]) return key;\n return Object.keys(options).find(option => key.match(`^${option}$`));\n },\n\n maybeChangeObjectByDevice(stateObj) {\n const name = window.customUI.getName();\n if (!name) return stateObj;\n const match = this.findMatch(name, stateObj.attributes.device);\n if (!match) return stateObj;\n const attributes = Object.assign({}, stateObj.attributes.device[match]);\n\n if (!Object.keys(attributes).length) return stateObj;\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n maybeChangeObjectByGroup(elem, stateObj) {\n const context = window.customUI.getContext(elem);\n if (!context) return stateObj;\n\n if (!stateObj.attributes.group) {\n return stateObj;\n }\n const attributes = {};\n context.forEach((c) => {\n const match = this.findMatch(c, stateObj.attributes.group);\n if (stateObj.attributes.group[match]) {\n Object.assign(attributes, stateObj.attributes.group[match]);\n }\n });\n\n if (!Object.keys(attributes).length) return stateObj;\n\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n _setKeep(obj, value) {\n if (obj._cui_keep === undefined) {\n obj._cui_keep = value;\n } else {\n obj._cui_keep = obj._cui_keep && value;\n }\n },\n\n maybeApplyTemplateAttributes(hass, states, stateObj, attributes) {\n if (!attributes.templates) {\n window.customUI._setKeep(stateObj, true);\n return stateObj;\n }\n const newAttributes = {};\n let hasGlobal = false;\n let hasChanges = false;\n Object.keys(attributes.templates).forEach((key) => {\n const template = attributes.templates[key];\n if (template.match(/\\b(entities|hass)\\b/)) {\n hasGlobal = true;\n }\n const value = window.customUI.computeTemplate(\n template, hass, states, stateObj, attributes,\n (stateObj.untemplated_attributes && stateObj.untemplated_attributes[key]) ||\n attributes[key],\n stateObj.untemplated_state || stateObj.state);\n // In case of null don't set the value.\n if (value === null) return;\n newAttributes[key] = value;\n if (key === 'state') {\n if (value !== stateObj.state) {\n hasChanges = true;\n }\n } else if (key === '_stateDisplay') {\n if (value !== stateObj._stateDisplay) {\n hasChanges = true;\n }\n } else if (value !== attributes[key]) {\n hasChanges = true;\n }\n });\n window.customUI._setKeep(stateObj, !hasGlobal);\n if (!hasChanges) {\n return stateObj;\n }\n if (stateObj.attributes === attributes) {\n // We are operating on real attributes. Replace them.\n const result = window.customUI.applyAttributes(stateObj, newAttributes);\n if (Object.prototype.hasOwnProperty.call(newAttributes, 'state')) {\n if (newAttributes.state !== null) {\n result.state = String(newAttributes.state);\n result.untemplated_state = stateObj.state;\n }\n }\n if (Object.prototype.hasOwnProperty.call(newAttributes, '_stateDisplay')) {\n result._stateDisplay = newAttributes._stateDisplay;\n result.untemplated_stateDisplay = stateObj._stateDisplay;\n }\n window.customUI._setKeep(result, !hasGlobal);\n return result;\n }\n // Operating on context-aware attributes. Return shallow copy of object.\n return Object.assign({}, stateObj);\n },\n\n maybeApplyTemplates(hass, states, stateObj) {\n const newResult = window.customUI.maybeApplyTemplateAttributes(\n hass, states, stateObj, stateObj.attributes);\n let hasChanges = (newResult !== stateObj);\n\n function checkAttributes(obj) {\n if (!obj) return;\n Object.values(obj).forEach((attributes) => {\n const result = window.customUI.maybeApplyTemplateAttributes(\n hass, states, newResult, attributes);\n hasChanges |= (result !== newResult);\n });\n checkAttributes(obj.device);\n checkAttributes(obj.group);\n }\n\n checkAttributes(stateObj.attributes.device);\n checkAttributes(stateObj.attributes.group);\n if (newResult !== stateObj) return newResult;\n if (hasChanges) {\n return Object.assign({}, stateObj);\n }\n return stateObj;\n },\n\n applyAttributes(stateObj, attributes) {\n return {\n entity_id: stateObj.entity_id,\n state: stateObj.state,\n attributes: Object.assign({}, stateObj.attributes, attributes),\n untemplated_attributes: stateObj.attributes,\n last_changed: stateObj.last_changed,\n };\n },\n\n maybeChangeObject(elem, stateObj, inDialog, allowHidden) {\n if (inDialog) return stateObj;\n let obj = window.customUI.maybeChangeObjectByDevice(stateObj);\n obj = window.customUI.maybeChangeObjectByGroup(elem, obj);\n obj = window.customUI.maybeApplyTemplateAttributes(\n elem.hass, elem.hass.states, obj, obj.attributes);\n\n if (obj !== stateObj && obj.attributes.hidden && allowHidden) {\n return null;\n }\n return obj;\n },\n\n fixGroupTitles() {\n const homeAssistantMain = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main']);\n if (homeAssistantMain === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(window.customUI.fixGroupTitles, 1000);\n return;\n }\n\n const haCards = window.customUI.getElementHierarchy(homeAssistantMain, [\n 'partial-cards',\n 'ha-cards[view-visible]']);\n if (haCards === null) return;\n const main = window.customUI.lightOrShadow(haCards, '.main') || haCards.$.main;\n const cards = main.querySelectorAll('ha-entities-card');\n cards.forEach((card) => {\n if (card.groupEntity) {\n const obj = window.customUI.maybeChangeObject(\n card,\n card.groupEntity,\n false /* inDialog */,\n false /* allowHidden */);\n if (obj !== card.groupEntity && obj.attributes.friendly_name) {\n const nameElem = window.customUI.lightOrShadow(card, '.name');\n nameElem.textContent = obj.attributes.friendly_name;\n }\n }\n });\n },\n\n controlColumns(columns) {\n const partialCards = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-cards']);\n if (partialCards === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(\n window.customUI.controlColumns.bind(null, columns),\n 1000);\n return;\n }\n partialCards.mqls.forEach((mql) => {\n mql.removeListener(partialCards.handleWindowChange);\n });\n partialCards.mqls = columns.map((width) => {\n const mql = window.matchMedia(`(min-width: ${width}px)`);\n mql.addListener(partialCards.handleWindowChange);\n return mql;\n });\n partialCards.handleWindowChange();\n },\n\n useCustomizer() {\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n const customizer = main.hass.states['customizer.customizer'];\n if (!customizer) return;\n if (customizer.attributes.columns) {\n window.customUI.controlColumns(customizer.attributes.columns);\n }\n if (customizer.attributes.hide_attributes) {\n if (window.hassAttributeUtil && window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {\n customizer.attributes.hide_attributes.forEach((attr) => {\n if (!Object.prototype.hasOwnProperty.call(\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, attr)) {\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[attr] = undefined;\n }\n });\n }\n }\n },\n\n updateConfigPanel() {\n if (!window.location.pathname.startsWith('/config')) return;\n const haPanelConfig = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-panel-resolver',\n 'ha-panel-config']);\n if (!haPanelConfig) {\n // DOM not ready. Wait 100ms.\n window.setTimeout(window.customUI.updateConfigPanel, 100);\n return;\n }\n const haConfigNavigation = window.customUI.getElementHierarchy(haPanelConfig, [\n 'ha-config-dashboard',\n 'ha-config-navigation']);\n if (haConfigNavigation) {\n // HaConfigNavigation started using localize on 21.01.2018\n if (haConfigNavigation.localize && !haConfigNavigation.cuiPatch) {\n haConfigNavigation.cuiPatch = true;\n haConfigNavigation._originalComputeLoaded = haConfigNavigation._computeLoaded;\n haConfigNavigation._originalComputeCaption = haConfigNavigation._computeCaption;\n haConfigNavigation._originalComputeDescription = haConfigNavigation._computeDescription;\n haConfigNavigation._computeLoaded = (hass, page) =>\n page === 'customui' || haConfigNavigation._originalComputeLoaded(hass, page);\n haConfigNavigation._computeCaption = (page, localize) =>\n (page === 'customui' ? 'Custom UI' : haConfigNavigation._originalComputeCaption(page, localize));\n haConfigNavigation._computeDescription = (page, localize) =>\n (page === 'customui' ? 'SetUI tweaks' : haConfigNavigation._originalComputeDescription(page, localize));\n }\n if (!haConfigNavigation.pages.some(conf => conf === 'customui' || conf.domain === 'customui')) {\n haConfigNavigation.push('pages', haConfigNavigation.localize ? 'customui' : {\n domain: 'customui',\n caption: 'Custom UI',\n description: 'Set UI tweaks.',\n loaded: true,\n });\n }\n }\n const getHaConfigCustomUi = () => {\n const haConfigCustomUi = document.createElement('ha-config-custom-ui');\n haConfigCustomUi.isWide = haPanelConfig.isWide;\n haConfigCustomUi.setAttribute('page-name', 'customui');\n return haConfigCustomUi;\n };\n\n const ironPages = window.customUI.lightOrShadow(haPanelConfig, 'iron-pages');\n if (ironPages) {\n if (ironPages.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n ironPages.appendChild(haConfigCustomUi);\n ironPages.addEventListener('iron-items-changed', () => {\n if (window.location.pathname.startsWith('/config/customui')) {\n ironPages.select('customui');\n }\n });\n }\n } else {\n const root = haPanelConfig.shadowRoot || haPanelConfig;\n if (root.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n root.appendChild(haConfigCustomUi);\n }\n const visible = window.location.pathname.startsWith('/config/customui');\n root.lastElementChild.style.display = visible ? '' : 'none';\n }\n },\n\n installStatesHook() {\n const homeAssistant = customElements.get('home-assistant');\n if (!homeAssistant || !homeAssistant.prototype._updateHass) return;\n const originalUpdate = homeAssistant.prototype._updateHass;\n homeAssistant.prototype._updateHass = function update(obj) {\n // Use named function to preserve 'this'.\n const { hass } = this;\n if (obj.states) {\n Object.keys(obj.states).forEach((key) => {\n const entity = obj.states[key];\n if (entity._cui_keep) return;\n const newEntity = window.customUI.maybeApplyTemplates(hass, obj.states, entity);\n if (hass.states && entity !== hass.states[key]) {\n // New state arrived. Put modified state in.\n obj.states[key] = newEntity;\n } else if (entity !== newEntity) {\n // It's the same state but contents changed due to other state changes.\n obj.states[key] = newEntity;\n }\n });\n }\n originalUpdate.call(this, obj);\n if (obj.themes && hass._themeWaiters) {\n hass._themeWaiters.forEach(waiter => waiter.stateChanged(waiter.state));\n hass._themeWaiters = undefined;\n }\n };\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (main.hass && main.hass.states) {\n main._updateHass({ states: main.hass.states });\n }\n },\n\n installPartialCards() {\n const partialCards = customElements.get('partial-cards');\n if (!partialCards || !partialCards.prototype._defaultViewFilter) return;\n partialCards.prototype._defaultViewFilter = (hass, entityId) => {\n if (hass.states[entityId].attributes.hidden) return false;\n const excludes = {};\n Object.values(hass.states).forEach((entity) => {\n if (entity.attributes && entity.attributes.hide_in_default_view) {\n const excludeEntityId = entity.entity_id;\n if (excludes[excludeEntityId]) return;\n excludes[excludeEntityId] = entity;\n if (entity.attributes.view) {\n Object.assign(\n excludes, getViewEntities(hass.states, entity));\n }\n }\n });\n return !excludes[entityId];\n };\n },\n\n // Allows changing the 'Execute' / 'Activate' text on script/scene cards.\n installActionName(elementName) {\n const klass = customElements.get(elementName);\n if (!klass || !klass.prototype) return;\n Object.defineProperty(klass.prototype, 'localize', {\n get() {\n function customLocalize(v) {\n if (this.stateObj && this.stateObj.attributes &&\n this.stateObj.attributes.action_name) {\n return this.stateObj.attributes.action_name;\n }\n return this.__data.localize(v);\n }\n return customLocalize;\n },\n set() {},\n });\n },\n\n // Allows theming \"regular\" top badges.\n installHaStateLabelBadge() {\n const haStateLabelBadge = customElements.get('ha-state-label-badge');\n if (!haStateLabelBadge || !haStateLabelBadge.prototype.stateChanged) return;\n // Use named function to preserve 'this'.\n haStateLabelBadge.prototype.stateChanged = function update(stateObj) {\n // TODO: Call window.customUI.maybeChangeObject\n if (stateObj.attributes.theme) {\n if (this.hass.themes === null) {\n this.hass._themeWaiters = this.hass._themeWaiters || [];\n this.hass._themeWaiters.push(this);\n } else {\n applyThemesOnElement(\n this,\n this.hass.themes || { default_theme: 'default', themes: {} },\n stateObj.attributes.theme || 'default');\n }\n }\n this.updateStyles();\n if (this.startInterval) {\n // Added on 19.1.2018\n this.startInterval(stateObj);\n }\n };\n },\n\n installStateBadge() {\n const stateBadge = customElements.get('state-badge');\n if (!stateBadge || !stateBadge.prototype.updateIconAppearance) return;\n const originalUpdateIconAppearance = stateBadge.prototype.updateIconAppearance;\n // Use named function to preserve 'this'.\n stateBadge.prototype.updateIconAppearance = function customUpdateIconAppearance(stateObj) {\n if (stateObj.attributes.icon_color && !stateObj.attributes.entity_picture) {\n this.style.backgroundImage = '';\n Object.assign(this.$.icon.style, {\n display: 'inline',\n color: stateObj.attributes.icon_color,\n filter: '',\n });\n } else {\n originalUpdateIconAppearance.call(this, stateObj);\n }\n };\n },\n\n installHaAttributes() {\n const haAttributes = customElements.get('ha-attributes');\n if (!haAttributes || !haAttributes.prototype.computeFiltersArray ||\n !window.hassAttributeUtil) return;\n // Use named function to preserve 'this'.\n haAttributes.prototype.computeFiltersArray = function customComputeFiltersArray(extraFilters) {\n return Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES).concat(extraFilters ? extraFilters.split(',') : []);\n };\n },\n\n installHaFormCustomize() {\n if (!window.location.pathname.startsWith('/config')) return;\n const haFormCustomize = customElements.get('ha-form-customize');\n if (!haFormCustomize) {\n // DOM not ready. Wait 100ms.\n window.setTimeout(window.customUI.installHaFormCustomize, 100);\n return;\n }\n if (window.customUI.haFormCustomizeInitDone) return;\n window.customUI.haFormCustomizeInitDone = true;\n\n if (!window.hassAttributeUtil) return;\n if (haFormCustomize.prototype._computeSingleAttribute) {\n // Use named function to preserve 'this'.\n haFormCustomize.prototype._computeSingleAttribute =\n function customComputeSingleAttribute(key, value, secondary) {\n const config = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key]\n || { type: window.hassAttributeUtil.UNKNOWN_TYPE };\n return this._initOpenObject(key, config.type === 'json' ? JSON.stringify(value) : value, secondary, config);\n };\n }\n if (haFormCustomize.prototype.getNewAttributesOptions) {\n // Use named function to preserve 'this'.\n haFormCustomize.prototype.getNewAttributesOptions =\n function customgetNewAttributesOptions(\n localAttributes, globalAttributes, existingAttributes, newAttributes) {\n const knownKeys =\n Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES)\n .filter((key) => {\n const conf = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key];\n return conf && (!conf.domains || !this.entity ||\n conf.domains.includes(computeStateDomain(this.entity)));\n })\n .filter(this.filterFromAttributes(localAttributes))\n .filter(this.filterFromAttributes(globalAttributes))\n .filter(this.filterFromAttributes(existingAttributes))\n .filter(this.filterFromAttributes(newAttributes));\n return knownKeys.sort().concat('Other');\n };\n }\n },\n\n installClassHooks() {\n if (window.customUI.classInitDone) return;\n window.customUI.classInitDone = true;\n window.customUI.installPartialCards();\n window.customUI.installStatesHook();\n window.customUI.installHaStateLabelBadge();\n window.customUI.installStateBadge();\n window.customUI.installHaAttributes();\n window.customUI.installActionName('state-card-scene');\n window.customUI.installActionName('state-card-script');\n },\n\n init() {\n if (window.customUI.initDone) return;\n window.customUI.installClassHooks();\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (!main.hass || !main.hass.states) {\n // Connection wasn't made yet. Try in 1 second.\n window.setTimeout(window.customUI.init, 1000);\n return;\n }\n window.customUI.initDone = true;\n\n window.customUI.useCustomizer();\n\n window.customUI.runHooks();\n window.addEventListener('location-changed', window.setTimeout.bind(null, window.customUI.runHooks, 100));\n /* eslint-disable no-console */\n console.log(`Loaded CustomUI ${VERSION}`);\n /* eslint-enable no-console */\n if (!window.CUSTOM_UI_LIST) {\n window.CUSTOM_UI_LIST = [];\n }\n window.CUSTOM_UI_LIST.push({\n name: 'CustomUI',\n version: VERSION,\n url: 'https://github.com/andrey-git/home-assistant-custom-ui',\n });\n },\n\n runHooks() {\n window.customUI.fixGroupTitles();\n window.customUI.updateConfigPanel();\n window.customUI.installHaFormCustomize();\n },\n\n getName() {\n return window.localStorage.getItem('ha-device-name') || '';\n },\n\n setName(name) {\n window.localStorage.setItem('ha-device-name', name || '');\n },\n\n computeTemplate(template, hass, entities, entity, attributes, attribute, state) {\n const functionBody = (template.indexOf('return') >= 0) ? template : `return \\`${template}\\`;`;\n try {\n /* eslint-disable no-new-func */\n const func = new Function(\n 'hass', 'entities', 'entity', 'attributes', 'attribute', 'state', functionBody);\n /* eslint-enable no-new-func */\n return func(hass, entities, entity, attributes, attribute, state);\n } catch (e) {\n /* eslint-disable no-console */\n if ((e instanceof SyntaxError) || e instanceof ReferenceError) {\n console.warn(`${e.name}: ${e.message} in template ${functionBody}`);\n return null;\n }\n /* eslint-enable no-console */\n throw e;\n }\n },\n};\nwindow.customUI.init();\n","import computeDomain from './compute_domain.js';\nimport getGroupEntities from './get_group_entities.js';\n\n// Return an object containing all entities that the view will show\n// including embedded groups.\nexport default function getViewEntities(entities, view) {\n const viewEntities = {};\n\n view.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity && !entity.attributes.hidden) {\n viewEntities[entity.entity_id] = entity;\n\n if (computeDomain(entity.entity_id) === 'group') {\n const groupEntities = getGroupEntities(entities, entity);\n\n Object.keys(groupEntities).forEach((grEntityId) => {\n const grEntity = groupEntities[grEntityId];\n\n if (!grEntity.attributes.hidden) {\n viewEntities[grEntityId] = grEntity;\n }\n });\n }\n }\n });\n\n return viewEntities;\n}\n","export default function getGroupEntities(entities, group) {\n const result = {};\n\n group.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity) {\n result[entity.entity_id] = entity;\n }\n });\n\n return result;\n}\n","import '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass CuiBaseElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extra: {\n type: Array,\n computed: 'computeExtra(hass, stateObj)',\n },\n };\n }\n\n computeExtra(hass, stateObj) {\n let extras = stateObj.attributes.extra_data_template;\n if (extras) {\n if (!Array.isArray(extras)) {\n extras = [extras];\n }\n return extras.map(extra => window.customUI.computeTemplate(\n extra,\n hass,\n hass.states,\n stateObj,\n stateObj.attributes,\n /* attribute= */ undefined,\n stateObj.state,\n )).filter(result => result !== null);\n }\n return [];\n }\n\n showLastChanged(stateObj, inDialog, extra) {\n if (inDialog) return true;\n if (extra.length) return false;\n return !!stateObj.attributes.show_last_changed;\n }\n\n hasExtra(extra) {\n return extra.length > 0;\n }\n}\nexport default CuiBaseElement;\n","import dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.js';\n\n/**\n * @extends HTMLElement\n */\nclass DynamicElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n stateObj: Object,\n elementName: String,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n };\n }\n\n static get observers() {\n return [\n 'observerFunc(hass, stateObj, elementName, inDialog)',\n ];\n }\n\n observerFunc(hass, stateObj, elementName, inDialog) {\n dynamicContentUpdater(\n this,\n elementName ? elementName.toUpperCase() : 'DIV',\n { hass, stateObj, inDialog });\n }\n}\ncustomElements.define('dynamic-element', DynamicElement);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\n\nimport './dynamic-element.js';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass DynamicWithExtra extends customElements.get('state-card-display') {\n static get template() {\n return html`\n \n \n \n
\n \n \n \n \n
\n \n \n
\n \n
\n \n \n \n \n
\n \n
\n \n \n [[computeStateDisplay(stateObj)]]
\n \n \n
\n `;\n }\n\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extraObj: {\n type: Array,\n computed: 'computeExtra(hass, stateObj, _attached)',\n },\n _attached: Boolean,\n extraObjVisible: {\n type: Boolean,\n computed: 'computeExtraVisible(extraObj, inDialog)',\n },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._attached = true;\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n super.disconnectedCallback();\n }\n\n computeExtra(hass, stateObj, attached) {\n if (!stateObj.attributes.extra_badge || !attached) return [];\n let extraBadges = stateObj.attributes.extra_badge;\n if (!Array.isArray(extraBadges)) {\n extraBadges = [extraBadges];\n }\n return extraBadges.map((extraBadge) => {\n let result = null;\n if (extraBadge.entity_id && hass.states[extraBadge.entity_id]) {\n result = Object.assign({}, window.customUI.maybeChangeObject(\n this, hass.states[extraBadge.entity_id], this.inDialog,\n /* allowHidden= */false));\n } else if (extraBadge.attribute &&\n stateObj.attributes[extraBadge.attribute] !== undefined) {\n result = {\n state: String(stateObj.attributes[extraBadge.attribute]),\n _domain: 'none',\n entity_id: null,\n attributes: { unit_of_measurement: extraBadge.unit },\n };\n }\n if (!result) return null;\n let blacklist = extraBadge.blacklist_states;\n if (blacklist !== undefined) {\n if (!Array.isArray(blacklist)) {\n blacklist = [blacklist];\n }\n if (blacklist.some(v => RegExp(v).test(result.state.toString()))) {\n return null;\n }\n }\n result._entityDisplay = '';\n return result;\n }).filter(extraBadge => extraBadge != null);\n }\n\n computeExtraVisible(extraObj, inDialog) {\n if (inDialog || !extraObj) return false;\n return extraObj.length !== 0;\n }\n\n extraClass(extraObjVisible) {\n return extraObjVisible ? 'extra' : '';\n }\n\n _showControl(inDialog, stateObj) {\n if (inDialog) return true;\n return !stateObj.attributes.hide_control;\n }\n\n computeStateDisplay(stateObj) {\n // haLocalize removed in 0.61\n return super.computeStateDisplay(this.haLocalize || this.localize, stateObj);\n }\n\n isConfirmControls(stateObj) {\n return stateObj.attributes.confirm_controls ||\n stateObj.attributes.confirm_controls_show_lock;\n }\n\n clickHandler(e) {\n this.root.querySelector('#overlay').style.pointerEvents = 'none';\n const lock = this.root.querySelector('#lock');\n if (lock) {\n lock.icon = 'mdi:lock-open-outline';\n lock.style.opacity = '0.1';\n }\n window.setTimeout(() => {\n this.root.querySelector('#overlay').style.pointerEvents = '';\n if (lock) {\n lock.icon = 'mdi:lock-outline';\n lock.style.opacity = '';\n }\n }, 5000);\n e.stopPropagation();\n }\n\n applyThemes(hass, element, stateObj) {\n const themeName = stateObj.attributes.theme || 'default';\n applyThemesOnElement(\n element, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n extraDomChanged() {\n this.root.querySelectorAll('ha-state-label-badge')\n .forEach((elem) => {\n this.applyThemes(this.hass, elem, elem.state);\n });\n }\n}\ncustomElements.define('dynamic-with-extra', DynamicWithExtra);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaThemedSlider extends Polymer.Element {\n static get template() {\n return html`\n \n\n \n \n `;\n }\n\n ready() {\n super.ready();\n this.disableOffWhenMin = !this._computeAttribute(this.theme, 'off_when_min', !this.disableOffWhenMin);\n this.computeEnabledThemedReportWhenNotChanged(this.theme, this.disableReportWhenNotChanged);\n }\n\n static get properties() {\n return {\n min: {\n type: Number,\n value: 0,\n },\n max: {\n type: Number,\n value: 100,\n },\n pin: {\n type: Boolean,\n value: false,\n },\n isOn: {\n type: Boolean,\n value: false,\n },\n disableOffWhenMin: {\n type: Boolean,\n value: false,\n notify: true,\n },\n disableReportWhenNotChanged: {\n type: Boolean,\n value: false,\n },\n\n theme: Object,\n value: {\n type: Number,\n notify: true,\n },\n _themedMin: {\n type: Number,\n computed: '_computeAttribute(theme, \"min\", min)',\n },\n };\n }\n\n static get observers() {\n return [\n 'computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged)',\n ];\n }\n\n computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged) {\n this._enabledThemedReportWhenNotChanged = this._computeAttribute(\n theme, 'report_when_not_changed', !disableReportWhenNotChanged);\n }\n\n _computeAttribute(theme, attr, def) {\n if (theme) {\n if (attr in theme) {\n return theme[attr];\n }\n }\n return def;\n }\n\n computeClass(theme, isOn, themedMin) {\n let result = '';\n if (isOn) {\n result += 'is-on ';\n }\n if (this._computeAttribute(theme, 'off_when_min', !this.disableOffWhenMin) || themedMin === 0) {\n // If offWhenMin is enabled don't customize.\n return '';\n }\n return `${result}disable-off-when-min`;\n }\n\n valueChanged(ev) {\n if (!this._enabledThemedReportWhenNotChanged && this.value === ev.target.value) {\n ev.stopPropagation();\n return;\n }\n this.value = ev.target.value;\n }\n}\ncustomElements.define('ha-themed-slider', HaThemedSlider);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\nimport './ha-themed-slider.js';\n\n/**\n * @extends HTMLElement\n */\nclass StateCardWithSlider extends CuiBaseElement {\n static get template() {\n return html`\n \n \n\n \n
\n
\n \n [[item]]
\n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n
\n `;\n }\n\n static get properties() {\n return {\n domain: String,\n serviceMin: String,\n serviceMax: String,\n valueName: String,\n setValueName: String,\n nameOn: { type: String, value: 'on' },\n min: { type: Number, value: 0 },\n max: { type: Number, value: 255 },\n\n sliderValue: {\n type: Number,\n value: 0,\n },\n disableOffWhenMin: Boolean,\n mode: String,\n stretchSlider: {\n type: Boolean,\n value: false,\n },\n breakSlider: {\n type: Boolean,\n value: false,\n },\n hideSlider: {\n type: Boolean,\n value: false,\n },\n lineTooLong: {\n type: Boolean,\n value: false,\n },\n minLineBreak: Number,\n maxLineBreak: Number,\n showSlider: {\n type: Number,\n computed: '_showSlider(inDialog, stateObj, hideSlider)',\n },\n };\n }\n\n ready() {\n super.ready();\n this._onIronResize = this._onIronResize.bind(this);\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._isConnected = true;\n window.addEventListener('resize', this._onIronResize);\n this._waitForLayout();\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this._onIronResize);\n this._isConnected = false;\n super.disconnectedCallback();\n }\n\n static get observers() {\n return [\n 'stateObjChanged(stateObj, nameOn, valueName)',\n ];\n }\n\n _waitForLayout() {\n if (!this._isConnected) return;\n this._setMode();\n if (this._frameId) return;\n this.readyToCompute = false;\n this._frameId = window.requestAnimationFrame(() => {\n this._frameId = null;\n this.readyToCompute = true;\n this._onIronResize();\n });\n }\n\n _setMode() {\n const obj = {\n hideSlider: this.mode === 'hide-slider' && this.lineTooLong,\n breakSlider:\n (this.mode === 'break-slider' || this.mode === 'hide-slider') &&\n this.lineTooLong,\n };\n if (!this.showSlider) {\n obj.breakSlider = true;\n }\n this.setProperties(obj);\n }\n\n _onIronResize() {\n if (!this.readyToCompute) return;\n if (this.mode === 'no-slider') {\n this.setProperties({\n hideSlider: true,\n breakSlider: true,\n });\n return;\n }\n const prevBreakSlider = this.breakSlider;\n const prevHideSlider = this.hideSlider;\n this.setProperties({\n lineTooLong: false,\n hideSlider: false,\n breakSlider: false,\n });\n const { container } = this.$;\n const containerWidth = container.clientWidth;\n if (containerWidth === 0) return;\n if (containerWidth <= this.minLineBreak) {\n this.lineTooLong = true;\n } else if (containerWidth >= this.maxLineBreak) {\n this.lineTooLong = false;\n } else {\n if (prevHideSlider && this.mode === 'hide-slider') {\n // We need to unhide the slider in order to recalculate height.\n this._waitForLayout();\n return;\n }\n const containerHeight = container.clientHeight;\n const stateHeight = this.root.querySelector('.state-info').clientHeight;\n this.lineTooLong = containerHeight > stateHeight * 1.5;\n if (this.lineTooLong) {\n this.minLineBreak = containerWidth;\n } else if (!prevBreakSlider) {\n this.maxLineBreak = containerWidth;\n }\n }\n this._setMode();\n }\n\n _computeWrapClass(mode, stretchSlider, lineTooLong, inDialog) {\n if (inDialog) {\n return '';\n }\n if (mode === 'single-line') {\n return 'nowrap';\n }\n if (stretchSlider && lineTooLong) {\n return 'stretch wrap';\n }\n return 'wrap';\n }\n\n _showSlider(inDialog, stateObj, hideSlider) {\n if (inDialog || hideSlider) {\n return false;\n }\n return true;\n }\n\n sliderChanged(ev) {\n const value = parseInt(ev.target.value, 10);\n const param = { entity_id: this.stateObj.entity_id };\n if (Number.isNaN(value)) return;\n let target = this.root.querySelector('#slider');\n if (ev.target !== target) {\n // No Shadow DOM - we have access to original target.\n ({ target } = ev);\n } else if (ev.path) {\n [target] = ev.path;\n } else if (ev.composedPath) {\n [target] = ev.composedPath();\n }\n if (value === 0 || (value <= target.min && !this.disableOffWhenMin)) {\n this.hass.callService(this.domain, this.serviceMin, param);\n } else {\n param[this.setValueName || this.valueName] = value;\n this.hass.callService(this.domain, this.serviceMax, param);\n }\n }\n\n stateObjChanged(stateObj, nameOn, valueName) {\n const obj = {\n sliderValue: this.isOn(stateObj, nameOn) ? stateObj.attributes[valueName] : 0,\n };\n if (stateObj) {\n Object.assign(obj, {\n minLineBreak: 0,\n maxLineBreak: 999,\n hideSlider: false,\n breakSlider: false,\n lineTooLong: false,\n mode: stateObj.attributes.state_card_mode,\n stretchSlider: !!stateObj.attributes.stretch_slider,\n });\n }\n this.setProperties(obj);\n if (stateObj) {\n this._waitForLayout();\n }\n }\n\n isOn(stateObj, nameOn) {\n return stateObj && (!nameOn || stateObj.state === nameOn);\n }\n\n stopPropagation(ev) {\n ev.stopPropagation();\n }\n}\ncustomElements.define('state-card-with-slider', StateCardWithSlider);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\n\n/**\n * @extends HTMLElement\n */\nclass StateCardWithoutSlider extends CuiBaseElement {\n static get template() {\n return html`\n \n \n\n \n
\n \n [[item]]
\n \n \n
\n \n
\n `;\n }\n}\ncustomElements.define('state-card-without-slider', StateCardWithoutSlider);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.js';\nimport dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.js';\nimport stateCardType from '../../home-assistant-polymer/src/common/entity/state_card_type.js';\n\nimport '../utils/hooks.js';\nimport './state-card-with-slider.js';\nimport './state-card-without-slider.js';\n\nconst SHOW_LAST_CHANGED_BLACKLISTED_CARDS = ['configurator'];\nconst DOMAIN_TO_SLIDER_SUPPORT = {\n light: 1, // SUPPORT_BRIGHTNESS\n cover: 4, // SUPPORT_SET_POSITION\n climate: 1, // SUPPORT_TARGET_TEMPERATURE\n};\nconst TYPE_TO_CONTROL = {\n toggle: 'ha-entity-toggle',\n display: '',\n cover: 'ha-cover-controls',\n};\n\n/**\n * @extends HTMLElement\n */\nclass StateCardCustomUi extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n\n stateObj: Object,\n };\n }\n\n static get observers() {\n return [\n 'inputChanged(hass, inDialog, stateObj)',\n ];\n }\n\n connectedCallback() {\n super.connectedCallback();\n const container = this.parentNode.parentNode;\n if (container.tagName === 'DIV' &&\n (container.classList.contains('state') || container.classList.contains('child-card'))) {\n this._container = container;\n\n // Since this doesn't actually change the background - no need to clear it.\n container.style.setProperty(\n 'background-color', 'var(--paper-card-background-color, inherit)');\n\n // Polyfill 'updateStyles'.\n if (!container.updateStyles) {\n container.updateStyles = (styles) => {\n Object.keys(styles).forEach((key) => {\n container.style.setProperty(key, styles[key]);\n });\n };\n }\n }\n this._isAttached = true;\n this.inputChanged(this.hass, this.inDialog, this.stateObj);\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n if (this._container) {\n this._container.updateStyles({ display: '', margin: '', padding: '' });\n applyThemesOnElement(\n this._container, this.hass.themes || { default_theme: 'default', themes: {} }, 'default');\n this._container = null;\n }\n super.disconnectedCallback();\n }\n\n badgeMode(hass, stateObj, domain) {\n const states = [];\n if (domain === 'group') {\n stateObj.attributes.entity_id.forEach((id) => {\n const state = hass.states[id];\n if (!state) {\n /* eslint-disable no-console */\n console.warn(`Unknown ID ${id} in group ${stateObj.entity_id}`);\n /* eslint-enable no-console */\n return;\n }\n if (!stateObj.attributes.badges_list ||\n stateObj.attributes.badges_list.includes(state.entity_id)) {\n states.push(window.customUI.maybeChangeObject(\n this, state, false /* inDialog */, false /* allowHidden */));\n }\n });\n } else {\n states.push(stateObj);\n if (this._container) {\n this._container.style.display = 'inline-block';\n const params = { display: 'inline-block' };\n if (this._container.classList.contains('state')) {\n params.margin = 'var(--ha-badges-card-margin, 0)';\n }\n this.updateStyles(params);\n }\n }\n dynamicContentUpdater(\n this,\n 'HA-BADGES-CARD',\n { hass, states });\n if (this._container) {\n this._container.updateStyles({\n width: 'var(--ha-badges-card-width, initial)',\n 'text-align': 'var(--ha-badges-card-text-align, initial)',\n });\n }\n this.lastChild.style.fontSize = '85%';\n\n // Since this variable only affects badges mode - no need to clean it up.\n this.style.setProperty('--ha-state-label-badge-margin-bottom', '0');\n }\n\n cleanBadgeStyle() {\n if (this._container) {\n this._container.updateStyles({\n display: '',\n width: '',\n 'text-align': '',\n });\n }\n this.updateStyles({ display: '', margin: '' });\n }\n\n applyThemes(hass, modifiedObj) {\n let themeTarget = this;\n let themeName = 'default';\n if (this._container) {\n themeTarget = this._container;\n }\n if (modifiedObj.attributes.theme) {\n themeName = modifiedObj.attributes.theme;\n }\n applyThemesOnElement(\n themeTarget, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n maybeHideEntity(modifiedObj) {\n if (!modifiedObj) {\n if (this.lastChild) {\n this.removeChild(this.lastChild);\n }\n if (this._container) {\n this._container.updateStyles({ margin: '0', padding: '0' });\n }\n return true;\n }\n if (this._container) {\n this._container.updateStyles({ margin: '', padding: '' });\n }\n return false;\n }\n\n sliderEligible_(domain, obj, inDialog) {\n if (inDialog) return false;\n return DOMAIN_TO_SLIDER_SUPPORT[domain] &&\n (DOMAIN_TO_SLIDER_SUPPORT[domain] & obj.attributes.supported_features) &&\n obj.attributes.state_card_mode && obj.attributes.state_card_mode !== 'no-slider';\n }\n\n inputChanged(hass, inDialog, stateObj) {\n if (!stateObj || !hass || !this._isAttached) return;\n const domain = computeStateDomain(stateObj);\n const modifiedObj = window.customUI.maybeChangeObject(\n this, stateObj, inDialog, true /* allowHidden */);\n\n if (this.maybeHideEntity(modifiedObj)) return;\n\n this.applyThemes(hass, modifiedObj);\n\n if (!inDialog && modifiedObj.attributes.state_card_mode === 'badges') {\n this.badgeMode(hass, modifiedObj, domain);\n } else {\n this.regularMode_(hass, inDialog, modifiedObj, domain);\n }\n }\n\n regularMode_(hass, inDialog, stateObj, domain) {\n this.cleanBadgeStyle();\n\n const params = {\n hass,\n stateObj,\n inDialog,\n };\n const originalStateCardType = stateCardType(hass, stateObj);\n let customStateCardType;\n const secondaryStateCardType = stateObj.attributes.state_card_custom_ui_secondary;\n\n if (domain === 'light' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-entity-toggle',\n serviceMin: 'turn_off',\n serviceMax: 'turn_on',\n valueName: 'brightness',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'cover' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-cover-controls',\n max: 100,\n serviceMin: 'close_cover',\n serviceMax: 'set_cover_position',\n setValueName: 'position',\n valueName: 'current_position',\n nameOn: 'open',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'climate' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-climate-state',\n min: stateObj.attributes.min_temp || -100,\n max: stateObj.attributes.max_temp || 200,\n serviceMin: 'set_temperature',\n serviceMax: 'set_temperature',\n valueName: 'temperature',\n nameOn: '',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (TYPE_TO_CONTROL[originalStateCardType] !== undefined) {\n params.controlElement = TYPE_TO_CONTROL[originalStateCardType];\n customStateCardType = 'state-card-without-slider';\n } else if (stateObj.attributes.show_last_changed &&\n !SHOW_LAST_CHANGED_BLACKLISTED_CARDS.includes(originalStateCardType)) {\n params.inDialog = true;\n }\n if (stateObj.state === 'unavailable') {\n params.controlElement = '';\n }\n if (stateObj.attributes.control_element !== undefined) {\n params.controlElement = stateObj.attributes.control_element;\n }\n\n dynamicContentUpdater(\n this,\n (secondaryStateCardType || customStateCardType || `STATE-CARD-${originalStateCardType}`).toUpperCase(),\n params);\n }\n}\ncustomElements.define('state-card-custom-ui', StateCardCustomUi);\n","import canToggleDomain from './can_toggle_domain.js';\nimport computeStateDomain from './compute_state_domain.js';\n\nexport default function canToggleState(hass, stateObj) {\n const domain = computeStateDomain(stateObj);\n if (domain === 'group') {\n return stateObj.state === 'on' || stateObj.state === 'off';\n }\n if (domain === 'climate') {\n return !!((stateObj.attributes || {}).supported_features & 4096);\n }\n\n return canToggleDomain(hass, domain);\n}\n","export default function canToggleDomain(hass, domain) {\n const services = hass.config.services[domain];\n if (!services) { return false; }\n\n if (domain === 'lock') {\n return 'lock' in services;\n } else if (domain === 'cover') {\n return 'open_cover' in services;\n }\n return 'turn_on' in services;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nwindow.JSCompiler_renameProperty = function(prop) { return prop; };\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/scripts.js.map b/scripts.js.map
index 0a59331..f81c31a 100644
--- a/scripts.js.map
+++ b/scripts.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///../home-assistant-polymer/src/common/dom/apply_themes_on_element.js","webpack:///../home-assistant-polymer/src/common/entity/compute_domain.js","webpack:///../home-assistant-polymer/src/common/entity/compute_state_domain.js","webpack:///../home-assistant-polymer/src/common/dom/dynamic_content_updater.js","webpack:///../home-assistant-polymer/src/common/const.js","webpack:///../home-assistant-polymer/src/common/entity/state_card_type.js","webpack:///./node_modules/@polymer/polymer/lib/utils/html-tag.js","webpack:///./src/mixins/events-mixin.js","webpack:///./src/elements/ha-config-custom-ui.js","webpack:///./src/utils/hooks.js","webpack:///../home-assistant-polymer/src/common/entity/get_view_entities.js","webpack:///../home-assistant-polymer/src/common/entity/get_group_entities.js","webpack:///./src/utils/version.js","webpack:///./src/elements/cui-base-element.js","webpack:///./src/elements/dynamic-element.js","webpack:///./src/elements/dynamic-with-extra.js","webpack:///./src/elements/ha-themed-slider.js","webpack:///./src/elements/state-card-with-slider.js","webpack:///./src/elements/state-card-without-slider.js","webpack:///./src/elements/state-card-custom-ui.js","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_state.js","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_domain.js","webpack:///./node_modules/@polymer/polymer/lib/utils/boot.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","r","value","n","__esModule","default","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","applyThemesOnElement","element","themes","localTheme","updateMeta","arguments","length","_themes","themeName","default_theme","styles","assign","theme","keys","forEach","key","prefixedKey","updateStyles","window","ShadyCSS","styleSubtree","meta","document","querySelector","hasAttribute","setAttribute","getAttribute","themeColor","computeDomain","entityId","substr","indexOf","computeStateDomain","stateObj","_domain","entity_id","dynamicContentUpdater","root","newElementTag","attributes","rootEl","customEl","lastChild","tagName","removeChild","createElement","toLowerCase","setProperties","parentNode","appendChild","DOMAINS_WITH_CARD","LiteralString","constructor","string","this","toString","html","strings","template","_len","values","Array","_key","innerHTML","reduce","acc","v","idx","HTMLTemplateElement","Error","literalValue","events_mixin","superClass","fire","type","detail","options","event","Event","bubbles","cancelable","Boolean","composed","node","dispatchEvent","customElements","define","Polymer","Element","properties","isWide","String","observer","ready","super","customUI","getName","nameChanged","setName","_backHandler","history","back","SUPPORTED_SLIDER_MODES","domHost","elem","getRootNode","DocumentFragment","host","lightOrShadow","selector","shadowRoot","getElementHierarchy","hierarchy","shift","getContext","_context","groupEntity","push","states","reverse","findMatch","find","option","match","maybeChangeObjectByDevice","device","applyAttributes","maybeChangeObjectByGroup","context","group","_setKeep","obj","_cui_keep","maybeApplyTemplateAttributes","hass","templates","newAttributes","hasGlobal","hasChanges","computeTemplate","untemplated_attributes","untemplated_state","state","_stateDisplay","result","untemplated_stateDisplay","maybeApplyTemplates","newResult","checkAttributes","last_changed","maybeChangeObject","inDialog","allowHidden","hidden","fixGroupTitles","homeAssistantMain","haCards","$","main","querySelectorAll","card","friendly_name","textContent","setTimeout","controlColumns","columns","partialCards","mqls","mql","removeListener","handleWindowChange","map","width","matchMedia","addListener","bind","useCustomizer","customizer","hide_attributes","hassAttributeUtil","LOGIC_STATE_ATTRIBUTES","attr","updateAttributes","customUiAttributes","state_card_mode","light","concat","cover","*","state_card_custom_ui_secondary","badges_list","show_last_changed","hide_control","extra_data_template","extra_badge","stretch_slider","slider_theme","confirm_controls","confirm_controls_show_lock","hide_in_default_view","updateConfigPanel","location","pathname","startsWith","haPanelConfig","haConfigNavigation","localize","cuiPatch","_originalComputeLoaded","_computeLoaded","_originalComputeCaption","_computeCaption","_originalComputeDescription","_computeDescription","page","pages","some","conf","domain","caption","description","loaded","getHaConfigCustomUi","haConfigCustomUi","ironPages","lastElementChild","addEventListener","select","visible","style","display","installStatesHook","homeAssistant","_updateHass","originalUpdate","entity","newEntity","_themeWaiters","waiter","stateChanged","installPartialCards","entities","viewEntities","_defaultViewFilter","excludes","excludeEntityId","view","groupEntities","grEntityId","grEntity","installActionName","elementName","klass","action_name","__data","set","installHaStateLabelBadge","haStateLabelBadge","startInterval","installStateBadge","stateBadge","updateIconAppearance","originalUpdateIconAppearance","icon_color","entity_picture","backgroundImage","icon","color","filter","installClassHooks","classInitDone","init","initDone","runHooks","console","log","CUSTOM_UI_LIST","version","url","localStorage","getItem","setItem","attribute","functionBody","Function","e","SyntaxError","ReferenceError","warn","message","cui_base_element","controlElement","extra","computed","computeExtra","extras","isArray","showLastChanged","hasExtra","observers","observerFunc","toUpperCase","extraObj","_attached","extraObjVisible","connectedCallback","disconnectedCallback","_isAttached","attached","extraBadges","extraBadge","unit_of_measurement","unit","blacklist","blacklist_states","RegExp","test","_entityDisplay","computeExtraVisible","extraClass","_showControl","computeStateDisplay","haLocalize","isConfirmControls","clickHandler","pointerEvents","lock","opacity","stopPropagation","applyThemes","extraDomChanged","disableOffWhenMin","_computeAttribute","computeEnabledThemedReportWhenNotChanged","disableReportWhenNotChanged","min","Number","max","pin","isOn","notify","_themedMin","_enabledThemedReportWhenNotChanged","def","computeClass","themedMin","valueChanged","ev","target","serviceMin","serviceMax","valueName","setValueName","nameOn","sliderValue","mode","stretchSlider","breakSlider","hideSlider","lineTooLong","minLineBreak","maxLineBreak","showSlider","_onIronResize","_isConnected","_waitForLayout","removeEventListener","_setMode","_frameId","readyToCompute","requestAnimationFrame","prevBreakSlider","prevHideSlider","container","containerWidth","clientWidth","containerHeight","clientHeight","stateHeight","_computeWrapClass","_showSlider","sliderChanged","parseInt","param","isNaN","path","_slicedToArray","composedPath","_ev$composedPath","callService","stateObjChanged","SHOW_LAST_CHANGED_BLACKLISTED_CARDS","DOMAIN_TO_SLIDER_SUPPORT","climate","TYPE_TO_CONTROL","toggle","classList","contains","_container","setProperty","inputChanged","margin","padding","badgeMode","id","includes","params","text-align","fontSize","cleanBadgeStyle","modifiedObj","themeTarget","maybeHideEntity","sliderEligible_","supported_features","regularMode_","originalStateCardType","services","config","control","stateCardType","customStateCardType","secondaryStateCardType","min_temp","max_temp","control_element","JSCompiler_renameProperty","prop"],"mappings":"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","file":"scripts.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/**\n * Apply a theme to an element by setting the CSS variables on it.\n *\n * element: Element to apply theme on.\n * themes: HASS Theme information\n * localTheme: selected theme.\n * updateMeta: boolean if we should update the theme-color meta element.\n*/\nexport default function applyThemesOnElement(element, themes, localTheme, updateMeta = false) {\n if (!element._themes) {\n element._themes = {};\n }\n let themeName = themes.default_theme;\n if (localTheme === 'default' || (localTheme && themes.themes[localTheme])) {\n themeName = localTheme;\n }\n const styles = Object.assign({}, element._themes);\n if (themeName !== 'default') {\n var theme = themes.themes[themeName];\n Object.keys(theme).forEach((key) => {\n var prefixedKey = '--' + key;\n element._themes[prefixedKey] = '';\n styles[prefixedKey] = theme[key];\n });\n }\n if (element.updateStyles) {\n element.updateStyles(styles);\n } else if (window.ShadyCSS) {\n // implement updateStyles() method of Polemer elements\n window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(element), styles);\n }\n\n if (!updateMeta) return;\n\n const meta = document.querySelector('meta[name=theme-color]');\n if (meta) {\n if (!meta.hasAttribute('default-content')) {\n meta.setAttribute('default-content', meta.getAttribute('content'));\n }\n const themeColor = styles['--primary-color'] || meta.getAttribute('default-content');\n meta.setAttribute('content', themeColor);\n }\n}\n","export default function computeDomain(entityId) {\n return entityId.substr(0, entityId.indexOf('.'));\n}\n","import computeDomain from './compute_domain.js';\n\nexport default function computeStateDomain(stateObj) {\n if (!stateObj._domain) {\n stateObj._domain = computeDomain(stateObj.entity_id);\n }\n\n return stateObj._domain;\n}\n","/**\n * Update root's child element to be newElementTag replacing another existing child if any.\n * Copy attributes into the child element.\n */\nexport default function dynamicContentUpdater(root, newElementTag, attributes) {\n const rootEl = root;\n let customEl;\n\n if (rootEl.lastChild && rootEl.lastChild.tagName === newElementTag) {\n customEl = rootEl.lastChild;\n } else {\n if (rootEl.lastChild) {\n rootEl.removeChild(rootEl.lastChild);\n }\n // Creating an element with upper case works fine in Chrome, but in FF it doesn't immediately\n // become a defined Custom Element. Polymer does that in some later pass.\n customEl = document.createElement(newElementTag.toLowerCase());\n }\n\n if (customEl.setProperties) {\n customEl.setProperties(attributes);\n } else {\n // If custom element definition wasn't loaded yet - setProperties would be\n // missing, but no harm in setting attributes one-by-one then.\n Object.keys(attributes).forEach((key) => {\n customEl[key] = attributes[key];\n });\n }\n\n if (customEl.parentNode === null) {\n rootEl.appendChild(customEl);\n }\n}\n","/** Constants to be used in the frontend. */\n\n// Constants should be alphabetically sorted by name.\n// Arrays with values should be alphabetically sorted if order doesn't matter.\n// Each constant should have a description what it is supposed to be used for.\n\n/** Icon to use when no icon specified for domain. */\nexport const DEFAULT_DOMAIN_ICON = 'mdi:bookmark';\n\n/** Domains that have a state card. */\nexport const DOMAINS_WITH_CARD = [\n 'climate',\n 'cover',\n 'configurator',\n 'input_select',\n 'input_number',\n 'input_text',\n 'media_player',\n 'scene',\n 'script',\n 'timer',\n 'weblink',\n];\n\n/** Domains that should have the history hidden in the more info dialog. */\nexport const DOMAINS_MORE_INFO_NO_HISTORY = [\n 'camera',\n 'configurator',\n 'history_graph',\n 'scene',\n];\n\n/** States that we consider \"off\". */\nexport const STATES_OFF = [\n 'closed',\n 'off',\n 'unlocked',\n];\n\n/** Temperature units. */\nexport const UNIT_C = '°C';\nexport const UNIT_F = '°F';\n\n/** Entity ID of the default view. */\nexport const DEFAULT_VIEW_ENTITY_ID = 'group.default_view';\n","import canToggleState from './can_toggle_state.js';\nimport computeStateDomain from './compute_state_domain.js';\nimport { DOMAINS_WITH_CARD } from '../const.js';\n\nexport default function stateCardType(hass, stateObj) {\n if (stateObj.state === 'unavailable') {\n return 'display';\n }\n\n const domain = computeStateDomain(stateObj);\n\n if (DOMAINS_WITH_CARD.includes(domain)) {\n return domain;\n } else if (canToggleState(hass, stateObj) &&\n stateObj.attributes.control !== 'hidden') {\n return 'toggle';\n }\n return 'display';\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\n/**\n * Class representing a static string value which can be used to filter\n * strings by asseting that they have been created via this class. The\n * `value` property returns the string passed to the constructor.\n */\nclass LiteralString {\n constructor(string) {\n /** @type {string} */\n this.value = string.toString();\n }\n /**\n * @return {string} LiteralString string value\n */\n toString() {\n return this.value;\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction literalValue(value) {\n if (value instanceof LiteralString) {\n return /** @type {!LiteralString} */(value).value;\n } else {\n throw new Error(\n `non-literal value passed to Polymer's htmlLiteral function: ${value}`\n );\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction htmlValue(value) {\n if (value instanceof HTMLTemplateElement) {\n return /** @type {!HTMLTemplateElement } */(value).innerHTML;\n } else if (value instanceof LiteralString) {\n return literalValue(value);\n } else {\n throw new Error(\n `non-template value passed to Polymer's html function: ${value}`);\n }\n}\n\n/**\n * A template literal tag that creates an HTML element from the\n * contents of the string.\n *\n * This allows you to write a Polymer Template in JavaScript.\n *\n * Templates can be composed by interpolating `HTMLTemplateElement`s in\n * expressions in the JavaScript template literal. The nested template's\n * `innerHTML` is included in the containing template. The only other\n * values allowed in expressions are those returned from `htmlLiteral`\n * which ensures only literal values from JS source ever reach the HTML, to\n * guard against XSS risks.\n *\n * All other values are disallowed in expressions to help prevent XSS\n * attacks; however, `htmlLiteral` can be used to compose static\n * string values into templates. This is useful to compose strings into\n * places that do not accept html, like the css text of a `style`\n * element.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * \n * ${this.partialTemplate}
\n * ${super.template}\n * `;\n * }\n * static get partialTemplate() { return html`Partial!`; }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement\n */\nexport const html = function html(strings, ...values) {\n const template = /** @type {!HTMLTemplateElement} */(document.createElement('template'));\n template.innerHTML = values.reduce((acc, v, idx) =>\n acc + htmlValue(v) + strings[idx + 1], strings[0]);\n return template;\n};\n\n/**\n * An html literal tag that can be used with `html` to compose.\n * a literal string.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * \n * ${staticValue}
\n * ${super.template}\n * `;\n * }\n * static get styleTemplate() {\n * return htmlLiteral`.shadowed { background: gray; }`;\n * }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!LiteralString} Constructed literal string\n */\nexport const htmlLiteral = function(strings, ...values) {\n return new LiteralString(values.reduce((acc, v, idx) =>\n acc + literalValue(v) + strings[idx + 1], strings[0]));\n};\n","// Polymer legacy event helpers used courtesy of the Polymer project.\n//\n// Copyright (c) 2017 The Polymer Authors. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nexport default (superClass) => {\n /**\n * @extends HTMLElement\n */\n class EventsMixin extends superClass {\n /**\n * Dispatches a custom event with an optional detail value.\n *\n * @param {string} type Name of event type.\n * @param {*=} detail Detail value containing event-specific\n * payload.\n * @param {{ bubbles: (boolean|undefined),\n cancelable: (boolean|undefined),\n composed: (boolean|undefined) }=}\n * options Object specifying options. These may include:\n * `bubbles` (boolean, defaults to `true`),\n * `cancelable` (boolean, defaults to false), and\n * `node` on which to fire the event (HTMLElement, defaults to `this`).\n * @return {Event} The new event that was fired.\n */\n fire(type, detail = {}, options = {}) {\n const event = new Event(type, {\n bubbles: options.bubbles === undefined ? true : options.bubbles,\n cancelable: Boolean(options.cancelable),\n composed: options.composed === undefined ? true : options.composed,\n });\n event.detail = detail;\n const node = options.node || this;\n node.dispatchEvent(event);\n return event;\n }\n }\n return EventsMixin;\n};\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport EventsMixin from '../mixins/events-mixin.js';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaConfigCustomUi extends EventsMixin(Polymer.Element) {\n static get template() {\n return html`\n \n \n \n \n \n Custom UI settings
\n \n \n\n \n \n \n Set device name so that you can reference it in per-device settings\n
\n
\n \n \n \n `;\n }\n\n static get properties() {\n return {\n isWide: Boolean,\n\n name: {\n type: String,\n observer: 'nameChanged',\n },\n };\n }\n\n ready() {\n super.ready();\n this.name = window.customUI.getName();\n }\n\n nameChanged(name) {\n window.customUI.setName(name);\n }\n\n _backHandler() {\n window.history.back();\n this.fire('location-changed');\n }\n}\ncustomElements.define('ha-config-custom-ui', HaConfigCustomUi);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.js';\nimport getViewEntities from '../../home-assistant-polymer/src/common/entity/get_view_entities.js';\n\nimport '../elements/ha-config-custom-ui.js';\nimport VERSION from './version.js';\n\nwindow.customUI = window.customUI || {\n SUPPORTED_SLIDER_MODES: [\n 'single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider',\n ],\n\n domHost(elem) {\n if (elem === document) return null;\n const root = elem.getRootNode();\n return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;\n },\n\n lightOrShadow(elem, selector) {\n return elem.shadowRoot ?\n elem.shadowRoot.querySelector(selector) :\n elem.querySelector(selector);\n },\n\n getElementHierarchy(root, hierarchy) {\n if (root === null) return null;\n const elem = hierarchy.shift();\n if (elem) {\n return window.customUI.getElementHierarchy(\n window.customUI.lightOrShadow(root, elem), hierarchy);\n }\n return root;\n },\n\n getContext(elem) {\n if (elem._context === undefined) {\n elem._context = [];\n for (let element = (elem.tagName === 'HA-ENTITIES-CARD' ? window.customUI.domHost(elem) : elem);\n element; element = window.customUI.domHost(element)) {\n switch (element.tagName) {\n case 'HA-ENTITIES-CARD':\n if (element.groupEntity) {\n elem._context.push(element.groupEntity.entity_id);\n } else if (element.groupEntity === false && element.states && element.states.length) {\n elem._context.push(`group.${computeStateDomain(element.states[0])}`);\n }\n break;\n case 'MORE-INFO-GROUP':\n case 'STATE-CARD-CONTENT':\n if (element.stateObj) {\n elem._context.push(element.stateObj.entity_id);\n }\n break;\n case 'HA-CARDS':\n elem._context.push(element.getAttribute('data-view') || 'default_view');\n break;\n // no default\n }\n }\n elem._context.reverse();\n }\n return elem._context;\n },\n\n findMatch(key, options) {\n if (!options) return null;\n if (options[key]) return key;\n return Object.keys(options).find(option => key.match(`^${option}$`));\n },\n\n maybeChangeObjectByDevice(stateObj) {\n const name = window.customUI.getName();\n if (!name) return stateObj;\n const match = this.findMatch(name, stateObj.attributes.device);\n if (!match) return stateObj;\n const attributes = Object.assign({}, stateObj.attributes.device[match]);\n\n if (!Object.keys(attributes).length) return stateObj;\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n maybeChangeObjectByGroup(elem, stateObj) {\n const context = window.customUI.getContext(elem);\n if (!context) return stateObj;\n\n if (!stateObj.attributes.group) {\n return stateObj;\n }\n const attributes = {};\n context.forEach((c) => {\n const match = this.findMatch(c, stateObj.attributes.group);\n if (stateObj.attributes.group[match]) {\n Object.assign(attributes, stateObj.attributes.group[match]);\n }\n });\n\n if (!Object.keys(attributes).length) return stateObj;\n\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n _setKeep(obj, value) {\n if (obj._cui_keep === undefined) {\n obj._cui_keep = value;\n } else {\n obj._cui_keep = obj._cui_keep && value;\n }\n },\n\n maybeApplyTemplateAttributes(hass, states, stateObj, attributes) {\n if (!attributes.templates) {\n window.customUI._setKeep(stateObj, true);\n return stateObj;\n }\n const newAttributes = {};\n let hasGlobal = false;\n let hasChanges = false;\n Object.keys(attributes.templates).forEach((key) => {\n const template = attributes.templates[key];\n if (template.match(/\\b(entities|hass)\\b/)) {\n hasGlobal = true;\n }\n const value = window.customUI.computeTemplate(\n template, hass, states, stateObj, attributes,\n (stateObj.untemplated_attributes && stateObj.untemplated_attributes[key]) ||\n attributes[key],\n stateObj.untemplated_state || stateObj.state);\n // In case of null don't set the value.\n if (value === null) return;\n newAttributes[key] = value;\n if (key === 'state') {\n if (value !== stateObj.state) {\n hasChanges = true;\n }\n } else if (key === '_stateDisplay') {\n if (value !== stateObj._stateDisplay) {\n hasChanges = true;\n }\n } else if (value !== attributes[key]) {\n hasChanges = true;\n }\n });\n window.customUI._setKeep(stateObj, !hasGlobal);\n if (!hasChanges) {\n return stateObj;\n }\n if (stateObj.attributes === attributes) {\n // We are operating on real attributes. Replace them.\n const result = window.customUI.applyAttributes(stateObj, newAttributes);\n if (Object.prototype.hasOwnProperty.call(newAttributes, 'state')) {\n if (newAttributes.state !== null) {\n result.state = String(newAttributes.state);\n result.untemplated_state = stateObj.state;\n }\n }\n if (Object.prototype.hasOwnProperty.call(newAttributes, '_stateDisplay')) {\n result._stateDisplay = newAttributes._stateDisplay;\n result.untemplated_stateDisplay = stateObj._stateDisplay;\n }\n window.customUI._setKeep(result, !hasGlobal);\n return result;\n }\n // Operating on context-aware attributes. Return shallow copy of object.\n return Object.assign({}, stateObj);\n },\n\n maybeApplyTemplates(hass, states, stateObj) {\n const newResult = window.customUI.maybeApplyTemplateAttributes(\n hass, states, stateObj, stateObj.attributes);\n let hasChanges = (newResult !== stateObj);\n\n function checkAttributes(obj) {\n if (!obj) return;\n Object.values(obj).forEach((attributes) => {\n const result = window.customUI.maybeApplyTemplateAttributes(\n hass, states, newResult, attributes);\n hasChanges |= (result !== newResult);\n });\n checkAttributes(obj.device);\n checkAttributes(obj.group);\n }\n\n checkAttributes(stateObj.attributes.device);\n checkAttributes(stateObj.attributes.group);\n if (newResult !== stateObj) return newResult;\n if (hasChanges) {\n return Object.assign({}, stateObj);\n }\n return stateObj;\n },\n\n applyAttributes(stateObj, attributes) {\n return {\n entity_id: stateObj.entity_id,\n state: stateObj.state,\n attributes: Object.assign({}, stateObj.attributes, attributes),\n untemplated_attributes: stateObj.attributes,\n last_changed: stateObj.last_changed,\n };\n },\n\n maybeChangeObject(elem, stateObj, inDialog, allowHidden) {\n if (inDialog) return stateObj;\n let obj = window.customUI.maybeChangeObjectByDevice(stateObj);\n obj = window.customUI.maybeChangeObjectByGroup(elem, obj);\n obj = window.customUI.maybeApplyTemplateAttributes(\n elem.hass, elem.hass.states, obj, obj.attributes);\n\n if (obj !== stateObj && obj.attributes.hidden && allowHidden) {\n return null;\n }\n return obj;\n },\n\n fixGroupTitles() {\n const homeAssistantMain = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main']);\n if (homeAssistantMain === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(window.customUI.fixGroupTitles, 1000);\n return;\n }\n\n const haCards = window.customUI.getElementHierarchy(homeAssistantMain, [\n 'partial-cards',\n 'ha-cards[view-visible]']);\n if (haCards === null) return;\n const main = window.customUI.lightOrShadow(haCards, '.main') || haCards.$.main;\n const cards = main.querySelectorAll('ha-entities-card');\n cards.forEach((card) => {\n if (card.groupEntity) {\n const obj = window.customUI.maybeChangeObject(\n card,\n card.groupEntity,\n false /* inDialog */,\n false /* allowHidden */);\n if (obj !== card.groupEntity && obj.attributes.friendly_name) {\n const nameElem = window.customUI.lightOrShadow(card, '.name');\n nameElem.textContent = obj.attributes.friendly_name;\n }\n }\n });\n },\n\n controlColumns(columns) {\n const partialCards = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-cards']);\n if (partialCards === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(\n window.customUI.controlColumns.bind(null, columns),\n 1000);\n return;\n }\n partialCards.mqls.forEach((mql) => {\n mql.removeListener(partialCards.handleWindowChange);\n });\n partialCards.mqls = columns.map((width) => {\n const mql = window.matchMedia(`(min-width: ${width}px)`);\n mql.addListener(partialCards.handleWindowChange);\n return mql;\n });\n partialCards.handleWindowChange();\n },\n\n useCustomizer() {\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n const customizer = main.hass.states['customizer.customizer'];\n if (!customizer) return;\n if (customizer.attributes.columns) {\n window.customUI.controlColumns(customizer.attributes.columns);\n }\n if (customizer.attributes.hide_attributes) {\n // TODO: Won't working starting from HA 0.71\n if (window.hassAttributeUtil && window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {\n customizer.attributes.hide_attributes.forEach((attr) => {\n if (!Object.prototype.hasOwnProperty.call(\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, attr)) {\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[attr] = undefined;\n }\n });\n }\n }\n },\n\n updateAttributes() {\n if (!window.hassAttributeUtil) {\n // App.js wasn't parsed yet.\n window.setTimeout(window.customUI.updateAttributes, 1000);\n return;\n }\n\n const customUiAttributes = {\n group: undefined,\n device: undefined,\n templates: undefined,\n state_card_mode: {\n type: 'array',\n options: {\n light: window.customUI.SUPPORTED_SLIDER_MODES.concat('badges'),\n cover: window.customUI.SUPPORTED_SLIDER_MODES.concat('badges'),\n '*': ['badges'],\n },\n },\n state_card_custom_ui_secondary: { type: 'string' },\n badges_list: { type: 'json' },\n show_last_changed: { type: 'boolean' },\n hide_control: { type: 'boolean' },\n extra_data_template: { type: 'string' },\n extra_badge: { type: 'json' },\n stretch_slider: { type: 'boolean' },\n slider_theme: { type: 'json' },\n theme: { type: 'string' },\n confirm_controls: { type: 'boolean' },\n confirm_controls_show_lock: { type: 'boolean' },\n hide_in_default_view: { type: 'boolean' },\n };\n if (window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {\n Object.assign(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, customUiAttributes);\n }\n },\n\n updateConfigPanel() {\n if (!window.location.pathname.startsWith('/config')) return;\n const haPanelConfig = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-panel-resolver',\n 'ha-panel-config']);\n if (!haPanelConfig) {\n // DOM not ready. Wait 100ms.\n window.setTimeout(window.customUI.updateConfigPanel, 100);\n return;\n }\n const haConfigNavigation = window.customUI.getElementHierarchy(haPanelConfig, [\n 'ha-config-dashboard',\n 'ha-config-navigation']);\n if (haConfigNavigation) {\n // HaConfigNavigation started using localize on 21.01.2018\n if (haConfigNavigation.localize && !haConfigNavigation.cuiPatch) {\n haConfigNavigation.cuiPatch = true;\n haConfigNavigation._originalComputeLoaded = haConfigNavigation._computeLoaded;\n haConfigNavigation._originalComputeCaption = haConfigNavigation._computeCaption;\n haConfigNavigation._originalComputeDescription = haConfigNavigation._computeDescription;\n haConfigNavigation._computeLoaded = (hass, page) =>\n page === 'customui' || haConfigNavigation._originalComputeLoaded(hass, page);\n haConfigNavigation._computeCaption = (page, localize) =>\n (page === 'customui' ? 'Custom UI' : haConfigNavigation._originalComputeCaption(page, localize));\n haConfigNavigation._computeDescription = (page, localize) =>\n (page === 'customui' ? 'SetUI tweaks' : haConfigNavigation._originalComputeDescription(page, localize));\n }\n if (!haConfigNavigation.pages.some(conf => conf === 'customui' || conf.domain === 'customui')) {\n haConfigNavigation.push('pages', haConfigNavigation.localize ? 'customui' : {\n domain: 'customui',\n caption: 'Custom UI',\n description: 'Set UI tweaks.',\n loaded: true,\n });\n }\n }\n const getHaConfigCustomUi = () => {\n const haConfigCustomUi = document.createElement('ha-config-custom-ui');\n haConfigCustomUi.isWide = haPanelConfig.isWide;\n haConfigCustomUi.setAttribute('page-name', 'customui');\n return haConfigCustomUi;\n };\n\n const ironPages = window.customUI.lightOrShadow(haPanelConfig, 'iron-pages');\n if (ironPages) {\n if (ironPages.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n ironPages.appendChild(haConfigCustomUi);\n ironPages.addEventListener('iron-items-changed', () => {\n if (window.location.pathname.startsWith('/config/customui')) {\n ironPages.select('customui');\n }\n });\n }\n } else {\n const root = haPanelConfig.shadowRoot || haPanelConfig;\n if (root.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n root.appendChild(haConfigCustomUi);\n }\n const visible = window.location.pathname.startsWith('/config/customui');\n root.lastElementChild.style.display = visible ? '' : 'none';\n }\n },\n\n installStatesHook() {\n const homeAssistant = customElements.get('home-assistant');\n if (!homeAssistant || !homeAssistant.prototype._updateHass) return;\n const originalUpdate = homeAssistant.prototype._updateHass;\n homeAssistant.prototype._updateHass = function update(obj) {\n // Use named function to preserve 'this'.\n const { hass } = this;\n if (obj.states) {\n Object.keys(obj.states).forEach((key) => {\n const entity = obj.states[key];\n if (entity._cui_keep) return;\n const newEntity = window.customUI.maybeApplyTemplates(hass, obj.states, entity);\n if (hass.states && entity !== hass.states[key]) {\n // New state arrived. Put modified state in.\n obj.states[key] = newEntity;\n } else if (entity !== newEntity) {\n // It's the same state but contents changed due to other state changes.\n obj.states[key] = newEntity;\n }\n });\n }\n originalUpdate.call(this, obj);\n if (obj.themes && hass._themeWaiters) {\n hass._themeWaiters.forEach(waiter => waiter.stateChanged(waiter.state));\n hass._themeWaiters = undefined;\n }\n };\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (main.hass && main.hass.states) {\n main._updateHass({ states: main.hass.states });\n }\n },\n\n installPartialCards() {\n const partialCards = customElements.get('partial-cards');\n if (!partialCards || !partialCards.prototype._defaultViewFilter) return;\n partialCards.prototype._defaultViewFilter = (hass, entityId) => {\n if (hass.states[entityId].attributes.hidden) return false;\n const excludes = {};\n Object.values(hass.states).forEach((entity) => {\n if (entity.attributes && entity.attributes.hide_in_default_view) {\n const excludeEntityId = entity.entity_id;\n if (excludes[excludeEntityId]) return;\n excludes[excludeEntityId] = entity;\n if (entity.attributes.view) {\n Object.assign(\n excludes, getViewEntities(hass.states, entity));\n }\n }\n });\n return !excludes[entityId];\n };\n },\n\n // Allows changing the 'Execute' / 'Activate' text on script/scene cards.\n installActionName(elementName) {\n const klass = customElements.get(elementName);\n if (!klass || !klass.prototype) return;\n Object.defineProperty(klass.prototype, 'localize', {\n get() {\n function customLocalize(v) {\n if (this.stateObj && this.stateObj.attributes &&\n this.stateObj.attributes.action_name) {\n return this.stateObj.attributes.action_name;\n }\n return this.__data.localize(v);\n }\n return customLocalize;\n },\n set() {},\n });\n },\n\n // Allows theming \"regular\" top badges.\n installHaStateLabelBadge() {\n const haStateLabelBadge = customElements.get('ha-state-label-badge');\n if (!haStateLabelBadge || !haStateLabelBadge.prototype.stateChanged) return;\n // Use named function to preserve 'this'.\n haStateLabelBadge.prototype.stateChanged = function update(stateObj) {\n // TODO: Call window.customUI.maybeChangeObject\n if (stateObj.attributes.theme) {\n if (this.hass.themes === null) {\n this.hass._themeWaiters = this.hass._themeWaiters || [];\n this.hass._themeWaiters.push(this);\n } else {\n applyThemesOnElement(\n this,\n this.hass.themes || { default_theme: 'default', themes: {} },\n stateObj.attributes.theme || 'default');\n }\n }\n this.updateStyles();\n if (this.startInterval) {\n // Added on 19.1.2018\n this.startInterval(stateObj);\n }\n };\n },\n\n installStateBadge() {\n const stateBadge = customElements.get('state-badge');\n if (!stateBadge || !stateBadge.prototype.updateIconAppearance) return;\n const originalUpdateIconAppearance = stateBadge.prototype.updateIconAppearance;\n // Use named function to preserve 'this'.\n stateBadge.prototype.updateIconAppearance = function customUpdateIconAppearance(stateObj) {\n if (stateObj.attributes.icon_color && !stateObj.attributes.entity_picture) {\n this.style.backgroundImage = '';\n Object.assign(this.$.icon.style, {\n display: 'inline',\n color: stateObj.attributes.icon_color,\n filter: '',\n });\n } else {\n originalUpdateIconAppearance.call(this, stateObj);\n }\n };\n },\n\n installClassHooks() {\n if (window.customUI.classInitDone) return;\n window.customUI.classInitDone = true;\n window.customUI.installPartialCards();\n window.customUI.installStatesHook();\n window.customUI.installHaStateLabelBadge();\n window.customUI.installStateBadge();\n window.customUI.installActionName('state-card-scene');\n window.customUI.installActionName('state-card-script');\n // TODO: Fix, not working since HA 0.71\n window.customUI.updateAttributes();\n },\n\n init() {\n if (window.customUI.initDone) return;\n window.customUI.installClassHooks();\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (!main.hass || !main.hass.states) {\n // Connection wasn't made yet. Try in 1 second.\n window.setTimeout(window.customUI.init, 1000);\n return;\n }\n window.customUI.initDone = true;\n\n window.customUI.useCustomizer();\n\n window.customUI.runHooks();\n window.addEventListener('location-changed', window.setTimeout.bind(null, window.customUI.runHooks, 100));\n /* eslint-disable no-console */\n console.log(`Loaded CustomUI ${VERSION}`);\n /* eslint-enable no-console */\n if (!window.CUSTOM_UI_LIST) {\n window.CUSTOM_UI_LIST = [];\n }\n window.CUSTOM_UI_LIST.push({\n name: 'CustomUI',\n version: VERSION,\n url: 'https://github.com/andrey-git/home-assistant-custom-ui',\n });\n },\n\n runHooks() {\n window.customUI.fixGroupTitles();\n window.customUI.updateConfigPanel();\n },\n\n getName() {\n return window.localStorage.getItem('ha-device-name') || '';\n },\n\n setName(name) {\n window.localStorage.setItem('ha-device-name', name || '');\n },\n\n computeTemplate(template, hass, entities, entity, attributes, attribute, state) {\n const functionBody = (template.indexOf('return') >= 0) ? template : `return \\`${template}\\`;`;\n try {\n /* eslint-disable no-new-func */\n const func = new Function(\n 'hass', 'entities', 'entity', 'attributes', 'attribute', 'state', functionBody);\n /* eslint-enable no-new-func */\n return func(hass, entities, entity, attributes, attribute, state);\n } catch (e) {\n /* eslint-disable no-console */\n if ((e instanceof SyntaxError) || e instanceof ReferenceError) {\n console.warn(`${e.name}: ${e.message} in template ${functionBody}`);\n return null;\n }\n /* eslint-enable no-console */\n throw e;\n }\n },\n};\nwindow.customUI.init();\n","import computeDomain from './compute_domain.js';\nimport getGroupEntities from './get_group_entities.js';\n\n// Return an object containing all entities that the view will show\n// including embedded groups.\nexport default function getViewEntities(entities, view) {\n const viewEntities = {};\n\n view.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity && !entity.attributes.hidden) {\n viewEntities[entity.entity_id] = entity;\n\n if (computeDomain(entity.entity_id) === 'group') {\n const groupEntities = getGroupEntities(entities, entity);\n\n Object.keys(groupEntities).forEach((grEntityId) => {\n const grEntity = groupEntities[grEntityId];\n\n if (!grEntity.attributes.hidden) {\n viewEntities[grEntityId] = grEntity;\n }\n });\n }\n }\n });\n\n return viewEntities;\n}\n","export default function getGroupEntities(entities, group) {\n const result = {};\n\n group.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity) {\n result[entity.entity_id] = entity;\n }\n });\n\n return result;\n}\n","export default '20180528';\n","import '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass CuiBaseElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extra: {\n type: Array,\n computed: 'computeExtra(hass, stateObj)',\n },\n };\n }\n\n computeExtra(hass, stateObj) {\n let extras = stateObj.attributes.extra_data_template;\n if (extras) {\n if (!Array.isArray(extras)) {\n extras = [extras];\n }\n return extras.map(extra => window.customUI.computeTemplate(\n extra,\n hass,\n hass.states,\n stateObj,\n stateObj.attributes,\n /* attribute= */ undefined,\n stateObj.state,\n )).filter(result => result !== null);\n }\n return [];\n }\n\n showLastChanged(stateObj, inDialog, extra) {\n if (inDialog) return true;\n if (extra.length) return false;\n return !!stateObj.attributes.show_last_changed;\n }\n\n hasExtra(extra) {\n return extra.length > 0;\n }\n}\nexport default CuiBaseElement;\n","import dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.js';\n\n/**\n * @extends HTMLElement\n */\nclass DynamicElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n stateObj: Object,\n elementName: String,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n };\n }\n\n static get observers() {\n return [\n 'observerFunc(hass, stateObj, elementName, inDialog)',\n ];\n }\n\n observerFunc(hass, stateObj, elementName, inDialog) {\n dynamicContentUpdater(\n this,\n elementName ? elementName.toUpperCase() : 'DIV',\n { hass, stateObj, inDialog });\n }\n}\ncustomElements.define('dynamic-element', DynamicElement);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\n\nimport './dynamic-element.js';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass DynamicWithExtra extends customElements.get('state-card-display') {\n static get template() {\n return html`\n \n \n \n
\n \n \n \n \n
\n \n \n
\n \n
\n \n \n \n \n
\n \n
\n \n \n [[computeStateDisplay(stateObj)]]
\n \n \n
\n `;\n }\n\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extraObj: {\n type: Array,\n computed: 'computeExtra(hass, stateObj, _attached)',\n },\n _attached: Boolean,\n extraObjVisible: {\n type: Boolean,\n computed: 'computeExtraVisible(extraObj, inDialog)',\n },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._attached = true;\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n super.disconnectedCallback();\n }\n\n computeExtra(hass, stateObj, attached) {\n if (!stateObj.attributes.extra_badge || !attached) return [];\n let extraBadges = stateObj.attributes.extra_badge;\n if (!Array.isArray(extraBadges)) {\n extraBadges = [extraBadges];\n }\n return extraBadges.map((extraBadge) => {\n let result = null;\n if (extraBadge.entity_id && hass.states[extraBadge.entity_id]) {\n result = Object.assign({}, window.customUI.maybeChangeObject(\n this, hass.states[extraBadge.entity_id], this.inDialog,\n /* allowHidden= */false));\n } else if (extraBadge.attribute &&\n stateObj.attributes[extraBadge.attribute] !== undefined) {\n result = {\n state: String(stateObj.attributes[extraBadge.attribute]),\n _domain: 'none',\n entity_id: null,\n attributes: { unit_of_measurement: extraBadge.unit },\n };\n }\n if (!result) return null;\n let blacklist = extraBadge.blacklist_states;\n if (blacklist !== undefined) {\n if (!Array.isArray(blacklist)) {\n blacklist = [blacklist];\n }\n if (blacklist.some(v => RegExp(v).test(result.state.toString()))) {\n return null;\n }\n }\n result._entityDisplay = '';\n return result;\n }).filter(extraBadge => extraBadge != null);\n }\n\n computeExtraVisible(extraObj, inDialog) {\n if (inDialog || !extraObj) return false;\n return extraObj.length !== 0;\n }\n\n extraClass(extraObjVisible) {\n return extraObjVisible ? 'extra' : '';\n }\n\n _showControl(inDialog, stateObj) {\n if (inDialog) return true;\n return !stateObj.attributes.hide_control;\n }\n\n computeStateDisplay(stateObj) {\n // haLocalize removed in 0.61\n return super.computeStateDisplay(this.haLocalize || this.localize, stateObj);\n }\n\n isConfirmControls(stateObj) {\n return stateObj.attributes.confirm_controls ||\n stateObj.attributes.confirm_controls_show_lock;\n }\n\n clickHandler(e) {\n this.root.querySelector('#overlay').style.pointerEvents = 'none';\n const lock = this.root.querySelector('#lock');\n if (lock) {\n lock.icon = 'mdi:lock-open-outline';\n lock.style.opacity = '0.1';\n }\n window.setTimeout(() => {\n this.root.querySelector('#overlay').style.pointerEvents = '';\n if (lock) {\n lock.icon = 'mdi:lock-outline';\n lock.style.opacity = '';\n }\n }, 5000);\n e.stopPropagation();\n }\n\n applyThemes(hass, element, stateObj) {\n const themeName = stateObj.attributes.theme || 'default';\n applyThemesOnElement(\n element, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n extraDomChanged() {\n this.root.querySelectorAll('ha-state-label-badge')\n .forEach((elem) => {\n this.applyThemes(this.hass, elem, elem.state);\n });\n }\n}\ncustomElements.define('dynamic-with-extra', DynamicWithExtra);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaThemedSlider extends Polymer.Element {\n static get template() {\n return html`\n \n\n \n \n `;\n }\n\n ready() {\n super.ready();\n this.disableOffWhenMin = !this._computeAttribute(this.theme, 'off_when_min', !this.disableOffWhenMin);\n this.computeEnabledThemedReportWhenNotChanged(this.theme, this.disableReportWhenNotChanged);\n }\n\n static get properties() {\n return {\n min: {\n type: Number,\n value: 0,\n },\n max: {\n type: Number,\n value: 100,\n },\n pin: {\n type: Boolean,\n value: false,\n },\n isOn: {\n type: Boolean,\n value: false,\n },\n disableOffWhenMin: {\n type: Boolean,\n value: false,\n notify: true,\n },\n disableReportWhenNotChanged: {\n type: Boolean,\n value: false,\n },\n\n theme: Object,\n value: {\n type: Number,\n notify: true,\n },\n _themedMin: {\n type: Number,\n computed: '_computeAttribute(theme, \"min\", min)',\n },\n };\n }\n\n static get observers() {\n return [\n 'computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged)',\n ];\n }\n\n computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged) {\n this._enabledThemedReportWhenNotChanged = this._computeAttribute(\n theme, 'report_when_not_changed', !disableReportWhenNotChanged);\n }\n\n _computeAttribute(theme, attr, def) {\n if (theme) {\n if (attr in theme) {\n return theme[attr];\n }\n }\n return def;\n }\n\n computeClass(theme, isOn, themedMin) {\n let result = '';\n if (isOn) {\n result += 'is-on ';\n }\n if (this._computeAttribute(theme, 'off_when_min', !this.disableOffWhenMin) || themedMin === 0) {\n // If offWhenMin is enabled don't customize.\n return '';\n }\n return `${result}disable-off-when-min`;\n }\n\n valueChanged(ev) {\n if (!this._enabledThemedReportWhenNotChanged && this.value === ev.target.value) {\n ev.stopPropagation();\n return;\n }\n this.value = ev.target.value;\n }\n}\ncustomElements.define('ha-themed-slider', HaThemedSlider);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\nimport './ha-themed-slider.js';\n\n/**\n * @extends HTMLElement\n */\nclass StateCardWithSlider extends CuiBaseElement {\n static get template() {\n return html`\n \n \n\n \n
\n
\n \n [[item]]
\n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n
\n `;\n }\n\n static get properties() {\n return {\n domain: String,\n serviceMin: String,\n serviceMax: String,\n valueName: String,\n setValueName: String,\n nameOn: { type: String, value: 'on' },\n min: { type: Number, value: 0 },\n max: { type: Number, value: 255 },\n\n sliderValue: {\n type: Number,\n value: 0,\n },\n disableOffWhenMin: Boolean,\n mode: String,\n stretchSlider: {\n type: Boolean,\n value: false,\n },\n breakSlider: {\n type: Boolean,\n value: false,\n },\n hideSlider: {\n type: Boolean,\n value: false,\n },\n lineTooLong: {\n type: Boolean,\n value: false,\n },\n minLineBreak: Number,\n maxLineBreak: Number,\n showSlider: {\n type: Number,\n computed: '_showSlider(inDialog, stateObj, hideSlider)',\n },\n };\n }\n\n ready() {\n super.ready();\n this._onIronResize = this._onIronResize.bind(this);\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._isConnected = true;\n window.addEventListener('resize', this._onIronResize);\n this._waitForLayout();\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this._onIronResize);\n this._isConnected = false;\n super.disconnectedCallback();\n }\n\n static get observers() {\n return [\n 'stateObjChanged(stateObj, nameOn, valueName)',\n ];\n }\n\n _waitForLayout() {\n if (!this._isConnected) return;\n this._setMode();\n if (this._frameId) return;\n this.readyToCompute = false;\n this._frameId = window.requestAnimationFrame(() => {\n this._frameId = null;\n this.readyToCompute = true;\n this._onIronResize();\n });\n }\n\n _setMode() {\n const obj = {\n hideSlider: this.mode === 'hide-slider' && this.lineTooLong,\n breakSlider:\n (this.mode === 'break-slider' || this.mode === 'hide-slider') &&\n this.lineTooLong,\n };\n if (!this.showSlider) {\n obj.breakSlider = true;\n }\n this.setProperties(obj);\n }\n\n _onIronResize() {\n if (!this.readyToCompute) return;\n if (this.mode === 'no-slider') {\n this.setProperties({\n hideSlider: true,\n breakSlider: true,\n });\n return;\n }\n const prevBreakSlider = this.breakSlider;\n const prevHideSlider = this.hideSlider;\n this.setProperties({\n lineTooLong: false,\n hideSlider: false,\n breakSlider: false,\n });\n const { container } = this.$;\n const containerWidth = container.clientWidth;\n if (containerWidth === 0) return;\n if (containerWidth <= this.minLineBreak) {\n this.lineTooLong = true;\n } else if (containerWidth >= this.maxLineBreak) {\n this.lineTooLong = false;\n } else {\n if (prevHideSlider && this.mode === 'hide-slider') {\n // We need to unhide the slider in order to recalculate height.\n this._waitForLayout();\n return;\n }\n const containerHeight = container.clientHeight;\n const stateHeight = this.root.querySelector('.state-info').clientHeight;\n this.lineTooLong = containerHeight > stateHeight * 1.5;\n if (this.lineTooLong) {\n this.minLineBreak = containerWidth;\n } else if (!prevBreakSlider) {\n this.maxLineBreak = containerWidth;\n }\n }\n this._setMode();\n }\n\n _computeWrapClass(mode, stretchSlider, lineTooLong, inDialog) {\n if (inDialog) {\n return '';\n }\n if (mode === 'single-line') {\n return 'nowrap';\n }\n if (stretchSlider && lineTooLong) {\n return 'stretch wrap';\n }\n return 'wrap';\n }\n\n _showSlider(inDialog, stateObj, hideSlider) {\n if (inDialog || hideSlider) {\n return false;\n }\n return true;\n }\n\n sliderChanged(ev) {\n const value = parseInt(ev.target.value, 10);\n const param = { entity_id: this.stateObj.entity_id };\n if (Number.isNaN(value)) return;\n let target = this.root.querySelector('#slider');\n if (ev.target !== target) {\n // No Shadow DOM - we have access to original target.\n ({ target } = ev);\n } else if (ev.path) {\n [target] = ev.path;\n } else if (ev.composedPath) {\n [target] = ev.composedPath();\n }\n if (value === 0 || (value <= target.min && !this.disableOffWhenMin)) {\n this.hass.callService(this.domain, this.serviceMin, param);\n } else {\n param[this.setValueName || this.valueName] = value;\n this.hass.callService(this.domain, this.serviceMax, param);\n }\n }\n\n stateObjChanged(stateObj, nameOn, valueName) {\n const obj = {\n sliderValue: this.isOn(stateObj, nameOn) ? stateObj.attributes[valueName] : 0,\n };\n if (stateObj) {\n Object.assign(obj, {\n minLineBreak: 0,\n maxLineBreak: 999,\n hideSlider: false,\n breakSlider: false,\n lineTooLong: false,\n mode: stateObj.attributes.state_card_mode,\n stretchSlider: !!stateObj.attributes.stretch_slider,\n });\n }\n this.setProperties(obj);\n if (stateObj) {\n this._waitForLayout();\n }\n }\n\n isOn(stateObj, nameOn) {\n return stateObj && (!nameOn || stateObj.state === nameOn);\n }\n\n stopPropagation(ev) {\n ev.stopPropagation();\n }\n}\ncustomElements.define('state-card-with-slider', StateCardWithSlider);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\n\n/**\n * @extends HTMLElement\n */\nclass StateCardWithoutSlider extends CuiBaseElement {\n static get template() {\n return html`\n \n \n\n \n
\n \n [[item]]
\n \n \n
\n \n
\n `;\n }\n}\ncustomElements.define('state-card-without-slider', StateCardWithoutSlider);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.js';\nimport dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.js';\nimport stateCardType from '../../home-assistant-polymer/src/common/entity/state_card_type.js';\n\nimport '../utils/hooks.js';\nimport './state-card-with-slider.js';\nimport './state-card-without-slider.js';\n\nconst SHOW_LAST_CHANGED_BLACKLISTED_CARDS = ['configurator'];\nconst DOMAIN_TO_SLIDER_SUPPORT = {\n light: 1, // SUPPORT_BRIGHTNESS\n cover: 4, // SUPPORT_SET_POSITION\n climate: 1, // SUPPORT_TARGET_TEMPERATURE\n};\nconst TYPE_TO_CONTROL = {\n toggle: 'ha-entity-toggle',\n display: '',\n cover: 'ha-cover-controls',\n};\n\n/**\n * @extends HTMLElement\n */\nclass StateCardCustomUi extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n\n stateObj: Object,\n };\n }\n\n static get observers() {\n return [\n 'inputChanged(hass, inDialog, stateObj)',\n ];\n }\n\n connectedCallback() {\n super.connectedCallback();\n const container = this.parentNode.parentNode;\n if (container.tagName === 'DIV' &&\n (container.classList.contains('state') || container.classList.contains('child-card'))) {\n this._container = container;\n\n // Since this doesn't actually change the background - no need to clear it.\n container.style.setProperty(\n 'background-color', 'var(--paper-card-background-color, inherit)');\n\n // Polyfill 'updateStyles'.\n if (!container.updateStyles) {\n container.updateStyles = (styles) => {\n Object.keys(styles).forEach((key) => {\n container.style.setProperty(key, styles[key]);\n });\n };\n }\n }\n this._isAttached = true;\n this.inputChanged(this.hass, this.inDialog, this.stateObj);\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n if (this._container) {\n this._container.updateStyles({ display: '', margin: '', padding: '' });\n applyThemesOnElement(\n this._container, this.hass.themes || { default_theme: 'default', themes: {} }, 'default');\n this._container = null;\n }\n super.disconnectedCallback();\n }\n\n badgeMode(hass, stateObj, domain) {\n const states = [];\n if (domain === 'group') {\n stateObj.attributes.entity_id.forEach((id) => {\n const state = hass.states[id];\n if (!state) {\n /* eslint-disable no-console */\n console.warn(`Unknown ID ${id} in group ${stateObj.entity_id}`);\n /* eslint-enable no-console */\n return;\n }\n if (!stateObj.attributes.badges_list ||\n stateObj.attributes.badges_list.includes(state.entity_id)) {\n states.push(window.customUI.maybeChangeObject(\n this, state, false /* inDialog */, false /* allowHidden */));\n }\n });\n } else {\n states.push(stateObj);\n if (this._container) {\n this._container.style.display = 'inline-block';\n const params = { display: 'inline-block' };\n if (this._container.classList.contains('state')) {\n params.margin = 'var(--ha-badges-card-margin, 0)';\n }\n this.updateStyles(params);\n }\n }\n dynamicContentUpdater(\n this,\n 'HA-BADGES-CARD',\n { hass, states });\n if (this._container) {\n this._container.updateStyles({\n width: 'var(--ha-badges-card-width, initial)',\n 'text-align': 'var(--ha-badges-card-text-align, initial)',\n });\n }\n this.lastChild.style.fontSize = '85%';\n\n // Since this variable only affects badges mode - no need to clean it up.\n this.style.setProperty('--ha-state-label-badge-margin-bottom', '0');\n }\n\n cleanBadgeStyle() {\n if (this._container) {\n this._container.updateStyles({\n display: '',\n width: '',\n 'text-align': '',\n });\n }\n this.updateStyles({ display: '', margin: '' });\n }\n\n applyThemes(hass, modifiedObj) {\n let themeTarget = this;\n let themeName = 'default';\n if (this._container) {\n themeTarget = this._container;\n }\n if (modifiedObj.attributes.theme) {\n themeName = modifiedObj.attributes.theme;\n }\n applyThemesOnElement(\n themeTarget, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n maybeHideEntity(modifiedObj) {\n if (!modifiedObj) {\n if (this.lastChild) {\n this.removeChild(this.lastChild);\n }\n if (this._container) {\n this._container.updateStyles({ margin: '0', padding: '0' });\n }\n return true;\n }\n if (this._container) {\n this._container.updateStyles({ margin: '', padding: '' });\n }\n return false;\n }\n\n sliderEligible_(domain, obj, inDialog) {\n if (inDialog) return false;\n return DOMAIN_TO_SLIDER_SUPPORT[domain] &&\n (DOMAIN_TO_SLIDER_SUPPORT[domain] & obj.attributes.supported_features) &&\n obj.attributes.state_card_mode && obj.attributes.state_card_mode !== 'no-slider';\n }\n\n inputChanged(hass, inDialog, stateObj) {\n if (!stateObj || !hass || !this._isAttached) return;\n const domain = computeStateDomain(stateObj);\n const modifiedObj = window.customUI.maybeChangeObject(\n this, stateObj, inDialog, true /* allowHidden */);\n\n if (this.maybeHideEntity(modifiedObj)) return;\n\n this.applyThemes(hass, modifiedObj);\n\n if (!inDialog && modifiedObj.attributes.state_card_mode === 'badges') {\n this.badgeMode(hass, modifiedObj, domain);\n } else {\n this.regularMode_(hass, inDialog, modifiedObj, domain);\n }\n }\n\n regularMode_(hass, inDialog, stateObj, domain) {\n this.cleanBadgeStyle();\n\n const params = {\n hass,\n stateObj,\n inDialog,\n };\n const originalStateCardType = stateCardType(hass, stateObj);\n let customStateCardType;\n const secondaryStateCardType = stateObj.attributes.state_card_custom_ui_secondary;\n\n if (domain === 'light' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-entity-toggle',\n serviceMin: 'turn_off',\n serviceMax: 'turn_on',\n valueName: 'brightness',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'cover' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-cover-controls',\n max: 100,\n serviceMin: 'close_cover',\n serviceMax: 'set_cover_position',\n setValueName: 'position',\n valueName: 'current_position',\n nameOn: 'open',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'climate' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-climate-state',\n min: stateObj.attributes.min_temp || -100,\n max: stateObj.attributes.max_temp || 200,\n serviceMin: 'set_temperature',\n serviceMax: 'set_temperature',\n valueName: 'temperature',\n nameOn: '',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (TYPE_TO_CONTROL[originalStateCardType] !== undefined) {\n params.controlElement = TYPE_TO_CONTROL[originalStateCardType];\n customStateCardType = 'state-card-without-slider';\n } else if (stateObj.attributes.show_last_changed &&\n !SHOW_LAST_CHANGED_BLACKLISTED_CARDS.includes(originalStateCardType)) {\n params.inDialog = true;\n }\n if (stateObj.state === 'unavailable') {\n params.controlElement = '';\n }\n if (stateObj.attributes.control_element !== undefined) {\n params.controlElement = stateObj.attributes.control_element;\n }\n\n dynamicContentUpdater(\n this,\n (secondaryStateCardType || customStateCardType || `STATE-CARD-${originalStateCardType}`).toUpperCase(),\n params);\n }\n}\ncustomElements.define('state-card-custom-ui', StateCardCustomUi);\n","import canToggleDomain from './can_toggle_domain.js';\nimport computeStateDomain from './compute_state_domain.js';\n\nexport default function canToggleState(hass, stateObj) {\n const domain = computeStateDomain(stateObj);\n if (domain === 'group') {\n return stateObj.state === 'on' || stateObj.state === 'off';\n }\n if (domain === 'climate') {\n return !!((stateObj.attributes || {}).supported_features & 4096);\n }\n\n return canToggleDomain(hass, domain);\n}\n","export default function canToggleDomain(hass, domain) {\n const services = hass.config.services[domain];\n if (!services) { return false; }\n\n if (domain === 'lock') {\n return 'lock' in services;\n } else if (domain === 'cover') {\n return 'open_cover' in services;\n }\n return 'turn_on' in services;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nwindow.JSCompiler_renameProperty = function(prop) { return prop; };\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///../home-assistant-polymer/src/common/dom/apply_themes_on_element.js","webpack:///../home-assistant-polymer/src/common/entity/compute_domain.js","webpack:///../home-assistant-polymer/src/common/entity/compute_state_domain.js","webpack:///../home-assistant-polymer/src/common/dom/dynamic_content_updater.js","webpack:///../home-assistant-polymer/src/common/const.js","webpack:///../home-assistant-polymer/src/common/entity/state_card_type.js","webpack:///./node_modules/@polymer/polymer/lib/utils/html-tag.js","webpack:///./src/mixins/events-mixin.js","webpack:///./src/elements/ha-config-custom-ui.js","webpack:///./src/utils/version.js","webpack:///../home-assistant-polymer/src/util/hass-attributes-util.js","webpack:///./src/utils/hass-attribute-util.js","webpack:///./src/utils/hooks.js","webpack:///../home-assistant-polymer/src/common/entity/get_view_entities.js","webpack:///../home-assistant-polymer/src/common/entity/get_group_entities.js","webpack:///./src/elements/cui-base-element.js","webpack:///./src/elements/dynamic-element.js","webpack:///./src/elements/dynamic-with-extra.js","webpack:///./src/elements/ha-themed-slider.js","webpack:///./src/elements/state-card-with-slider.js","webpack:///./src/elements/state-card-without-slider.js","webpack:///./src/elements/state-card-custom-ui.js","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_state.js","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_domain.js","webpack:///./node_modules/@polymer/polymer/lib/utils/boot.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","r","value","n","__esModule","default","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","applyThemesOnElement","element","themes","localTheme","updateMeta","arguments","length","_themes","themeName","default_theme","styles","assign","theme","keys","forEach","key","prefixedKey","updateStyles","window","ShadyCSS","styleSubtree","meta","document","querySelector","hasAttribute","setAttribute","getAttribute","themeColor","computeDomain","entityId","substr","indexOf","computeStateDomain","stateObj","_domain","entity_id","dynamicContentUpdater","root","newElementTag","attributes","rootEl","customEl","lastChild","tagName","removeChild","createElement","toLowerCase","setProperties","parentNode","appendChild","DOMAINS_WITH_CARD","LiteralString","constructor","string","this","toString","html","strings","template","_len","values","Array","_key","innerHTML","reduce","acc","v","idx","HTMLTemplateElement","Error","literalValue","events_mixin","superClass","fire","type","detail","options","event","Event","bubbles","cancelable","Boolean","composed","node","dispatchEvent","customElements","define","Polymer","Element","properties","isWide","String","observer","ready","super","customUI","getName","nameChanged","setName","_backHandler","history","back","hassAttributeUtil","binary_sensor","cover","sensor","json","icon","boolean","array","key-value","LOGIC_STATE_ATTRIBUTES","entity_picture","friendly_name","description","emulated_hue","domains","emulated_hue_name","haaska_hidden","haaska_name","homebridge_hidden","homebridge_name","supported_features","attribution","custom_ui_more_info","custom_ui_state_card","device_class","DOMAIN_DEVICE_CLASS","hidden","assumed_state","initial_state","unit_of_measurement","hass_attributes_util","SUPPORTED_SLIDER_MODES","customUiAttributes","group","device","templates","control_element","state_card_mode","light","concat","climate","*","state_card_custom_ui_secondary","badges_list","show_last_changed","hide_control","extra_data_template","extra_badge","stretch_slider","slider_theme","confirm_controls","confirm_controls_show_lock","hide_in_default_view","UNKNOWN_TYPE","domHost","elem","getRootNode","DocumentFragment","host","lightOrShadow","selector","shadowRoot","getElementHierarchy","hierarchy","shift","getContext","_context","groupEntity","push","states","reverse","findMatch","find","option","match","maybeChangeObjectByDevice","applyAttributes","maybeChangeObjectByGroup","context","_setKeep","obj","_cui_keep","maybeApplyTemplateAttributes","hass","newAttributes","hasGlobal","hasChanges","computeTemplate","untemplated_attributes","untemplated_state","state","_stateDisplay","result","untemplated_stateDisplay","maybeApplyTemplates","newResult","checkAttributes","last_changed","maybeChangeObject","inDialog","allowHidden","fixGroupTitles","homeAssistantMain","haCards","$","main","querySelectorAll","card","textContent","setTimeout","controlColumns","columns","partialCards","mqls","mql","removeListener","handleWindowChange","map","width","matchMedia","addListener","bind","useCustomizer","customizer","hide_attributes","attr","updateConfigPanel","location","pathname","startsWith","haPanelConfig","haConfigNavigation","localize","cuiPatch","_originalComputeLoaded","_computeLoaded","_originalComputeCaption","_computeCaption","_originalComputeDescription","_computeDescription","page","pages","some","conf","domain","caption","loaded","getHaConfigCustomUi","haConfigCustomUi","ironPages","lastElementChild","addEventListener","select","visible","style","display","installStatesHook","homeAssistant","_updateHass","originalUpdate","entity","newEntity","_themeWaiters","waiter","stateChanged","installPartialCards","entities","viewEntities","_defaultViewFilter","excludes","excludeEntityId","view","groupEntities","grEntityId","grEntity","installActionName","elementName","klass","action_name","__data","set","installHaStateLabelBadge","haStateLabelBadge","startInterval","installStateBadge","stateBadge","updateIconAppearance","originalUpdateIconAppearance","icon_color","backgroundImage","color","filter","installHaAttributes","haAttributes","computeFiltersArray","extraFilters","split","installHaFormCustomize","haFormCustomize","haFormCustomizeInitDone","_computeSingleAttribute","secondary","config","_initOpenObject","JSON","stringify","getNewAttributesOptions","localAttributes","globalAttributes","existingAttributes","includes","filterFromAttributes","sort","installClassHooks","classInitDone","init","initDone","runHooks","console","log","CUSTOM_UI_LIST","version","url","localStorage","getItem","setItem","attribute","functionBody","Function","e","SyntaxError","ReferenceError","warn","message","cui_base_element","controlElement","extra","computed","computeExtra","extras","isArray","showLastChanged","hasExtra","observers","observerFunc","toUpperCase","extraObj","_attached","extraObjVisible","connectedCallback","disconnectedCallback","_isAttached","attached","extraBadges","extraBadge","unit","blacklist","blacklist_states","RegExp","test","_entityDisplay","computeExtraVisible","extraClass","_showControl","computeStateDisplay","haLocalize","isConfirmControls","clickHandler","pointerEvents","lock","opacity","stopPropagation","applyThemes","extraDomChanged","disableOffWhenMin","_computeAttribute","computeEnabledThemedReportWhenNotChanged","disableReportWhenNotChanged","min","Number","max","pin","isOn","notify","_themedMin","_enabledThemedReportWhenNotChanged","def","computeClass","themedMin","valueChanged","ev","target","serviceMin","serviceMax","valueName","setValueName","nameOn","sliderValue","mode","stretchSlider","breakSlider","hideSlider","lineTooLong","minLineBreak","maxLineBreak","showSlider","_onIronResize","_isConnected","_waitForLayout","removeEventListener","_setMode","_frameId","readyToCompute","requestAnimationFrame","prevBreakSlider","prevHideSlider","container","containerWidth","clientWidth","containerHeight","clientHeight","stateHeight","_computeWrapClass","_showSlider","sliderChanged","parseInt","param","isNaN","path","_slicedToArray","composedPath","_ev$composedPath","callService","stateObjChanged","SHOW_LAST_CHANGED_BLACKLISTED_CARDS","DOMAIN_TO_SLIDER_SUPPORT","TYPE_TO_CONTROL","toggle","classList","contains","_container","setProperty","inputChanged","margin","padding","badgeMode","id","params","text-align","fontSize","cleanBadgeStyle","modifiedObj","themeTarget","maybeHideEntity","sliderEligible_","regularMode_","originalStateCardType","services","control","stateCardType","customStateCardType","secondaryStateCardType","min_temp","max_temp","JSCompiler_renameProperty","prop"],"mappings":"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","file":"scripts.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/**\n * Apply a theme to an element by setting the CSS variables on it.\n *\n * element: Element to apply theme on.\n * themes: HASS Theme information\n * localTheme: selected theme.\n * updateMeta: boolean if we should update the theme-color meta element.\n*/\nexport default function applyThemesOnElement(element, themes, localTheme, updateMeta = false) {\n if (!element._themes) {\n element._themes = {};\n }\n let themeName = themes.default_theme;\n if (localTheme === 'default' || (localTheme && themes.themes[localTheme])) {\n themeName = localTheme;\n }\n const styles = Object.assign({}, element._themes);\n if (themeName !== 'default') {\n var theme = themes.themes[themeName];\n Object.keys(theme).forEach((key) => {\n var prefixedKey = '--' + key;\n element._themes[prefixedKey] = '';\n styles[prefixedKey] = theme[key];\n });\n }\n if (element.updateStyles) {\n element.updateStyles(styles);\n } else if (window.ShadyCSS) {\n // implement updateStyles() method of Polemer elements\n window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(element), styles);\n }\n\n if (!updateMeta) return;\n\n const meta = document.querySelector('meta[name=theme-color]');\n if (meta) {\n if (!meta.hasAttribute('default-content')) {\n meta.setAttribute('default-content', meta.getAttribute('content'));\n }\n const themeColor = styles['--primary-color'] || meta.getAttribute('default-content');\n meta.setAttribute('content', themeColor);\n }\n}\n","export default function computeDomain(entityId) {\n return entityId.substr(0, entityId.indexOf('.'));\n}\n","import computeDomain from './compute_domain.js';\n\nexport default function computeStateDomain(stateObj) {\n if (!stateObj._domain) {\n stateObj._domain = computeDomain(stateObj.entity_id);\n }\n\n return stateObj._domain;\n}\n","/**\n * Update root's child element to be newElementTag replacing another existing child if any.\n * Copy attributes into the child element.\n */\nexport default function dynamicContentUpdater(root, newElementTag, attributes) {\n const rootEl = root;\n let customEl;\n\n if (rootEl.lastChild && rootEl.lastChild.tagName === newElementTag) {\n customEl = rootEl.lastChild;\n } else {\n if (rootEl.lastChild) {\n rootEl.removeChild(rootEl.lastChild);\n }\n // Creating an element with upper case works fine in Chrome, but in FF it doesn't immediately\n // become a defined Custom Element. Polymer does that in some later pass.\n customEl = document.createElement(newElementTag.toLowerCase());\n }\n\n if (customEl.setProperties) {\n customEl.setProperties(attributes);\n } else {\n // If custom element definition wasn't loaded yet - setProperties would be\n // missing, but no harm in setting attributes one-by-one then.\n Object.keys(attributes).forEach((key) => {\n customEl[key] = attributes[key];\n });\n }\n\n if (customEl.parentNode === null) {\n rootEl.appendChild(customEl);\n }\n}\n","/** Constants to be used in the frontend. */\n\n// Constants should be alphabetically sorted by name.\n// Arrays with values should be alphabetically sorted if order doesn't matter.\n// Each constant should have a description what it is supposed to be used for.\n\n/** Icon to use when no icon specified for domain. */\nexport const DEFAULT_DOMAIN_ICON = 'mdi:bookmark';\n\n/** Domains that have a state card. */\nexport const DOMAINS_WITH_CARD = [\n 'climate',\n 'cover',\n 'configurator',\n 'input_select',\n 'input_number',\n 'input_text',\n 'media_player',\n 'scene',\n 'script',\n 'timer',\n 'weblink',\n];\n\n/** Domains that should have the history hidden in the more info dialog. */\nexport const DOMAINS_MORE_INFO_NO_HISTORY = [\n 'camera',\n 'configurator',\n 'history_graph',\n 'scene',\n];\n\n/** States that we consider \"off\". */\nexport const STATES_OFF = [\n 'closed',\n 'off',\n 'unlocked',\n];\n\n/** Temperature units. */\nexport const UNIT_C = '°C';\nexport const UNIT_F = '°F';\n\n/** Entity ID of the default view. */\nexport const DEFAULT_VIEW_ENTITY_ID = 'group.default_view';\n","import canToggleState from './can_toggle_state.js';\nimport computeStateDomain from './compute_state_domain.js';\nimport { DOMAINS_WITH_CARD } from '../const.js';\n\nexport default function stateCardType(hass, stateObj) {\n if (stateObj.state === 'unavailable') {\n return 'display';\n }\n\n const domain = computeStateDomain(stateObj);\n\n if (DOMAINS_WITH_CARD.includes(domain)) {\n return domain;\n } else if (canToggleState(hass, stateObj) &&\n stateObj.attributes.control !== 'hidden') {\n return 'toggle';\n }\n return 'display';\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\n/**\n * Class representing a static string value which can be used to filter\n * strings by asseting that they have been created via this class. The\n * `value` property returns the string passed to the constructor.\n */\nclass LiteralString {\n constructor(string) {\n /** @type {string} */\n this.value = string.toString();\n }\n /**\n * @return {string} LiteralString string value\n */\n toString() {\n return this.value;\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction literalValue(value) {\n if (value instanceof LiteralString) {\n return /** @type {!LiteralString} */(value).value;\n } else {\n throw new Error(\n `non-literal value passed to Polymer's htmlLiteral function: ${value}`\n );\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction htmlValue(value) {\n if (value instanceof HTMLTemplateElement) {\n return /** @type {!HTMLTemplateElement } */(value).innerHTML;\n } else if (value instanceof LiteralString) {\n return literalValue(value);\n } else {\n throw new Error(\n `non-template value passed to Polymer's html function: ${value}`);\n }\n}\n\n/**\n * A template literal tag that creates an HTML element from the\n * contents of the string.\n *\n * This allows you to write a Polymer Template in JavaScript.\n *\n * Templates can be composed by interpolating `HTMLTemplateElement`s in\n * expressions in the JavaScript template literal. The nested template's\n * `innerHTML` is included in the containing template. The only other\n * values allowed in expressions are those returned from `htmlLiteral`\n * which ensures only literal values from JS source ever reach the HTML, to\n * guard against XSS risks.\n *\n * All other values are disallowed in expressions to help prevent XSS\n * attacks; however, `htmlLiteral` can be used to compose static\n * string values into templates. This is useful to compose strings into\n * places that do not accept html, like the css text of a `style`\n * element.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * \n * ${this.partialTemplate}
\n * ${super.template}\n * `;\n * }\n * static get partialTemplate() { return html`Partial!`; }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement\n */\nexport const html = function html(strings, ...values) {\n const template = /** @type {!HTMLTemplateElement} */(document.createElement('template'));\n template.innerHTML = values.reduce((acc, v, idx) =>\n acc + htmlValue(v) + strings[idx + 1], strings[0]);\n return template;\n};\n\n/**\n * An html literal tag that can be used with `html` to compose.\n * a literal string.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * \n * ${staticValue}
\n * ${super.template}\n * `;\n * }\n * static get styleTemplate() {\n * return htmlLiteral`.shadowed { background: gray; }`;\n * }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!LiteralString} Constructed literal string\n */\nexport const htmlLiteral = function(strings, ...values) {\n return new LiteralString(values.reduce((acc, v, idx) =>\n acc + literalValue(v) + strings[idx + 1], strings[0]));\n};\n","// Polymer legacy event helpers used courtesy of the Polymer project.\n//\n// Copyright (c) 2017 The Polymer Authors. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nexport default (superClass) => {\n /**\n * @extends HTMLElement\n */\n class EventsMixin extends superClass {\n /**\n * Dispatches a custom event with an optional detail value.\n *\n * @param {string} type Name of event type.\n * @param {*=} detail Detail value containing event-specific\n * payload.\n * @param {{ bubbles: (boolean|undefined),\n cancelable: (boolean|undefined),\n composed: (boolean|undefined) }=}\n * options Object specifying options. These may include:\n * `bubbles` (boolean, defaults to `true`),\n * `cancelable` (boolean, defaults to false), and\n * `node` on which to fire the event (HTMLElement, defaults to `this`).\n * @return {Event} The new event that was fired.\n */\n fire(type, detail = {}, options = {}) {\n const event = new Event(type, {\n bubbles: options.bubbles === undefined ? true : options.bubbles,\n cancelable: Boolean(options.cancelable),\n composed: options.composed === undefined ? true : options.composed,\n });\n event.detail = detail;\n const node = options.node || this;\n node.dispatchEvent(event);\n return event;\n }\n }\n return EventsMixin;\n};\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport EventsMixin from '../mixins/events-mixin.js';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaConfigCustomUi extends EventsMixin(Polymer.Element) {\n static get template() {\n return html`\n \n \n \n \n \n Custom UI settings
\n \n \n\n \n \n \n Set device name so that you can reference it in per-device settings\n
\n
\n \n \n \n `;\n }\n\n static get properties() {\n return {\n isWide: Boolean,\n\n name: {\n type: String,\n observer: 'nameChanged',\n },\n };\n }\n\n ready() {\n super.ready();\n this.name = window.customUI.getName();\n }\n\n nameChanged(name) {\n window.customUI.setName(name);\n }\n\n _backHandler() {\n window.history.back();\n this.fire('location-changed');\n }\n}\ncustomElements.define('ha-config-custom-ui', HaConfigCustomUi);\n","export default '20180602';\n","const hassAttributeUtil = {};\n\nhassAttributeUtil.DOMAIN_DEVICE_CLASS = {\n binary_sensor: [\n 'battery',\n 'cold',\n 'connectivity',\n 'door',\n 'garage_door',\n 'gas',\n 'heat',\n 'light',\n 'lock',\n 'moisture',\n 'motion',\n 'moving',\n 'occupancy',\n 'opening',\n 'plug',\n 'power',\n 'presence',\n 'problem',\n 'safety',\n 'smoke',\n 'sound',\n 'vibration',\n 'window'\n ],\n cover: ['garage'],\n sensor: [\n 'battery',\n 'humidity',\n 'illuminance',\n 'temperature'\n ],\n};\n\nhassAttributeUtil.UNKNOWN_TYPE = 'json';\nhassAttributeUtil.ADD_TYPE = 'key-value';\n\nhassAttributeUtil.TYPE_TO_TAG = {\n string: 'ha-customize-string',\n json: 'ha-customize-string',\n icon: 'ha-customize-icon',\n boolean: 'ha-customize-boolean',\n array: 'ha-customize-array',\n 'key-value': 'ha-customize-key-value',\n};\n\n// Attributes here serve dual purpose:\n// 1) Any key of this object won't be shown in more-info window.\n// 2) Any key which has value other than undefined will appear in customization\n// config according to its value.\nhassAttributeUtil.LOGIC_STATE_ATTRIBUTES =\n hassAttributeUtil.LOGIC_STATE_ATTRIBUTES || {\n entity_picture: undefined,\n friendly_name: { type: 'string', description: 'Name' },\n icon: { type: 'icon' },\n emulated_hue: {\n type: 'boolean',\n domains: ['emulated_hue']\n },\n emulated_hue_name: {\n type: 'string',\n domains: ['emulated_hue']\n },\n haaska_hidden: undefined,\n haaska_name: undefined,\n homebridge_hidden: { type: 'boolean' },\n homebridge_name: { type: 'string' },\n supported_features: undefined,\n attribution: undefined,\n custom_ui_more_info: { type: 'string' },\n custom_ui_state_card: { type: 'string' },\n device_class: {\n type: 'array',\n options: hassAttributeUtil.DOMAIN_DEVICE_CLASS,\n description: 'Device class',\n domains: ['binary_sensor', 'cover', 'sensor']\n },\n hidden: { type: 'boolean', description: 'Hide from UI' },\n assumed_state: {\n type: 'boolean',\n domains: ['switch', 'light', 'cover', 'climate', 'fan', 'group']\n },\n initial_state: {\n type: 'string',\n domains: ['automation']\n },\n unit_of_measurement: { type: 'string' },\n };\n\nexport default hassAttributeUtil;\n","import hassAttributesUtil from '../../home-assistant-polymer/src/util/hass-attributes-util.js';\n\nwindow.hassAttributeUtil = window.hassAttributeUtil || {};\nconst SUPPORTED_SLIDER_MODES = [\n 'single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider',\n];\n\nconst customUiAttributes = {\n group: undefined,\n device: undefined,\n templates: undefined,\n control_element: { type: 'string' },\n state_card_mode: {\n type: 'array',\n options: {\n light: SUPPORTED_SLIDER_MODES.concat('badges'),\n cover: SUPPORTED_SLIDER_MODES.concat('badges'),\n climate: SUPPORTED_SLIDER_MODES.concat('badges'),\n '*': ['badges'],\n },\n },\n state_card_custom_ui_secondary: { type: 'string' },\n badges_list: { type: 'json' },\n show_last_changed: { type: 'boolean' },\n hide_control: { type: 'boolean' },\n extra_data_template: { type: 'string' },\n extra_badge: { type: 'json' },\n stretch_slider: { type: 'boolean' },\n slider_theme: { type: 'json' },\n theme: { type: 'string' },\n confirm_controls: { type: 'boolean' },\n confirm_controls_show_lock: { type: 'boolean' },\n hide_in_default_view: { type: 'boolean' },\n};\nwindow.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES = hassAttributesUtil.LOGIC_STATE_ATTRIBUTES;\nwindow.hassAttributeUtil.UNKNOWN_TYPE = hassAttributesUtil.UNKNOWN_TYPE;\nObject.assign(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, customUiAttributes);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.js';\nimport getViewEntities from '../../home-assistant-polymer/src/common/entity/get_view_entities.js';\n\nimport '../elements/ha-config-custom-ui.js';\nimport VERSION from './version.js';\nimport './hass-attribute-util.js';\n\nwindow.customUI = window.customUI || {\n SUPPORTED_SLIDER_MODES: [\n 'single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider',\n ],\n\n domHost(elem) {\n if (elem === document) return null;\n const root = elem.getRootNode();\n return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;\n },\n\n lightOrShadow(elem, selector) {\n return elem.shadowRoot ?\n elem.shadowRoot.querySelector(selector) :\n elem.querySelector(selector);\n },\n\n getElementHierarchy(root, hierarchy) {\n if (root === null) return null;\n const elem = hierarchy.shift();\n if (elem) {\n return window.customUI.getElementHierarchy(\n window.customUI.lightOrShadow(root, elem), hierarchy);\n }\n return root;\n },\n\n getContext(elem) {\n if (elem._context === undefined) {\n elem._context = [];\n for (let element = (elem.tagName === 'HA-ENTITIES-CARD' ? window.customUI.domHost(elem) : elem);\n element; element = window.customUI.domHost(element)) {\n switch (element.tagName) {\n case 'HA-ENTITIES-CARD':\n if (element.groupEntity) {\n elem._context.push(element.groupEntity.entity_id);\n } else if (element.groupEntity === false && element.states && element.states.length) {\n elem._context.push(`group.${computeStateDomain(element.states[0])}`);\n }\n break;\n case 'MORE-INFO-GROUP':\n case 'STATE-CARD-CONTENT':\n if (element.stateObj) {\n elem._context.push(element.stateObj.entity_id);\n }\n break;\n case 'HA-CARDS':\n elem._context.push(element.getAttribute('data-view') || 'default_view');\n break;\n // no default\n }\n }\n elem._context.reverse();\n }\n return elem._context;\n },\n\n findMatch(key, options) {\n if (!options) return null;\n if (options[key]) return key;\n return Object.keys(options).find(option => key.match(`^${option}$`));\n },\n\n maybeChangeObjectByDevice(stateObj) {\n const name = window.customUI.getName();\n if (!name) return stateObj;\n const match = this.findMatch(name, stateObj.attributes.device);\n if (!match) return stateObj;\n const attributes = Object.assign({}, stateObj.attributes.device[match]);\n\n if (!Object.keys(attributes).length) return stateObj;\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n maybeChangeObjectByGroup(elem, stateObj) {\n const context = window.customUI.getContext(elem);\n if (!context) return stateObj;\n\n if (!stateObj.attributes.group) {\n return stateObj;\n }\n const attributes = {};\n context.forEach((c) => {\n const match = this.findMatch(c, stateObj.attributes.group);\n if (stateObj.attributes.group[match]) {\n Object.assign(attributes, stateObj.attributes.group[match]);\n }\n });\n\n if (!Object.keys(attributes).length) return stateObj;\n\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n _setKeep(obj, value) {\n if (obj._cui_keep === undefined) {\n obj._cui_keep = value;\n } else {\n obj._cui_keep = obj._cui_keep && value;\n }\n },\n\n maybeApplyTemplateAttributes(hass, states, stateObj, attributes) {\n if (!attributes.templates) {\n window.customUI._setKeep(stateObj, true);\n return stateObj;\n }\n const newAttributes = {};\n let hasGlobal = false;\n let hasChanges = false;\n Object.keys(attributes.templates).forEach((key) => {\n const template = attributes.templates[key];\n if (template.match(/\\b(entities|hass)\\b/)) {\n hasGlobal = true;\n }\n const value = window.customUI.computeTemplate(\n template, hass, states, stateObj, attributes,\n (stateObj.untemplated_attributes && stateObj.untemplated_attributes[key]) ||\n attributes[key],\n stateObj.untemplated_state || stateObj.state);\n // In case of null don't set the value.\n if (value === null) return;\n newAttributes[key] = value;\n if (key === 'state') {\n if (value !== stateObj.state) {\n hasChanges = true;\n }\n } else if (key === '_stateDisplay') {\n if (value !== stateObj._stateDisplay) {\n hasChanges = true;\n }\n } else if (value !== attributes[key]) {\n hasChanges = true;\n }\n });\n window.customUI._setKeep(stateObj, !hasGlobal);\n if (!hasChanges) {\n return stateObj;\n }\n if (stateObj.attributes === attributes) {\n // We are operating on real attributes. Replace them.\n const result = window.customUI.applyAttributes(stateObj, newAttributes);\n if (Object.prototype.hasOwnProperty.call(newAttributes, 'state')) {\n if (newAttributes.state !== null) {\n result.state = String(newAttributes.state);\n result.untemplated_state = stateObj.state;\n }\n }\n if (Object.prototype.hasOwnProperty.call(newAttributes, '_stateDisplay')) {\n result._stateDisplay = newAttributes._stateDisplay;\n result.untemplated_stateDisplay = stateObj._stateDisplay;\n }\n window.customUI._setKeep(result, !hasGlobal);\n return result;\n }\n // Operating on context-aware attributes. Return shallow copy of object.\n return Object.assign({}, stateObj);\n },\n\n maybeApplyTemplates(hass, states, stateObj) {\n const newResult = window.customUI.maybeApplyTemplateAttributes(\n hass, states, stateObj, stateObj.attributes);\n let hasChanges = (newResult !== stateObj);\n\n function checkAttributes(obj) {\n if (!obj) return;\n Object.values(obj).forEach((attributes) => {\n const result = window.customUI.maybeApplyTemplateAttributes(\n hass, states, newResult, attributes);\n hasChanges |= (result !== newResult);\n });\n checkAttributes(obj.device);\n checkAttributes(obj.group);\n }\n\n checkAttributes(stateObj.attributes.device);\n checkAttributes(stateObj.attributes.group);\n if (newResult !== stateObj) return newResult;\n if (hasChanges) {\n return Object.assign({}, stateObj);\n }\n return stateObj;\n },\n\n applyAttributes(stateObj, attributes) {\n return {\n entity_id: stateObj.entity_id,\n state: stateObj.state,\n attributes: Object.assign({}, stateObj.attributes, attributes),\n untemplated_attributes: stateObj.attributes,\n last_changed: stateObj.last_changed,\n };\n },\n\n maybeChangeObject(elem, stateObj, inDialog, allowHidden) {\n if (inDialog) return stateObj;\n let obj = window.customUI.maybeChangeObjectByDevice(stateObj);\n obj = window.customUI.maybeChangeObjectByGroup(elem, obj);\n obj = window.customUI.maybeApplyTemplateAttributes(\n elem.hass, elem.hass.states, obj, obj.attributes);\n\n if (obj !== stateObj && obj.attributes.hidden && allowHidden) {\n return null;\n }\n return obj;\n },\n\n fixGroupTitles() {\n const homeAssistantMain = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main']);\n if (homeAssistantMain === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(window.customUI.fixGroupTitles, 1000);\n return;\n }\n\n const haCards = window.customUI.getElementHierarchy(homeAssistantMain, [\n 'partial-cards',\n 'ha-cards[view-visible]']);\n if (haCards === null) return;\n const main = window.customUI.lightOrShadow(haCards, '.main') || haCards.$.main;\n const cards = main.querySelectorAll('ha-entities-card');\n cards.forEach((card) => {\n if (card.groupEntity) {\n const obj = window.customUI.maybeChangeObject(\n card,\n card.groupEntity,\n false /* inDialog */,\n false /* allowHidden */);\n if (obj !== card.groupEntity && obj.attributes.friendly_name) {\n const nameElem = window.customUI.lightOrShadow(card, '.name');\n nameElem.textContent = obj.attributes.friendly_name;\n }\n }\n });\n },\n\n controlColumns(columns) {\n const partialCards = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-cards']);\n if (partialCards === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(\n window.customUI.controlColumns.bind(null, columns),\n 1000);\n return;\n }\n partialCards.mqls.forEach((mql) => {\n mql.removeListener(partialCards.handleWindowChange);\n });\n partialCards.mqls = columns.map((width) => {\n const mql = window.matchMedia(`(min-width: ${width}px)`);\n mql.addListener(partialCards.handleWindowChange);\n return mql;\n });\n partialCards.handleWindowChange();\n },\n\n useCustomizer() {\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n const customizer = main.hass.states['customizer.customizer'];\n if (!customizer) return;\n if (customizer.attributes.columns) {\n window.customUI.controlColumns(customizer.attributes.columns);\n }\n if (customizer.attributes.hide_attributes) {\n if (window.hassAttributeUtil && window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {\n customizer.attributes.hide_attributes.forEach((attr) => {\n if (!Object.prototype.hasOwnProperty.call(\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, attr)) {\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[attr] = undefined;\n }\n });\n }\n }\n },\n\n updateConfigPanel() {\n if (!window.location.pathname.startsWith('/config')) return;\n const haPanelConfig = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-panel-resolver',\n 'ha-panel-config']);\n if (!haPanelConfig) {\n // DOM not ready. Wait 100ms.\n window.setTimeout(window.customUI.updateConfigPanel, 100);\n return;\n }\n const haConfigNavigation = window.customUI.getElementHierarchy(haPanelConfig, [\n 'ha-config-dashboard',\n 'ha-config-navigation']);\n if (haConfigNavigation) {\n // HaConfigNavigation started using localize on 21.01.2018\n if (haConfigNavigation.localize && !haConfigNavigation.cuiPatch) {\n haConfigNavigation.cuiPatch = true;\n haConfigNavigation._originalComputeLoaded = haConfigNavigation._computeLoaded;\n haConfigNavigation._originalComputeCaption = haConfigNavigation._computeCaption;\n haConfigNavigation._originalComputeDescription = haConfigNavigation._computeDescription;\n haConfigNavigation._computeLoaded = (hass, page) =>\n page === 'customui' || haConfigNavigation._originalComputeLoaded(hass, page);\n haConfigNavigation._computeCaption = (page, localize) =>\n (page === 'customui' ? 'Custom UI' : haConfigNavigation._originalComputeCaption(page, localize));\n haConfigNavigation._computeDescription = (page, localize) =>\n (page === 'customui' ? 'SetUI tweaks' : haConfigNavigation._originalComputeDescription(page, localize));\n }\n if (!haConfigNavigation.pages.some(conf => conf === 'customui' || conf.domain === 'customui')) {\n haConfigNavigation.push('pages', haConfigNavigation.localize ? 'customui' : {\n domain: 'customui',\n caption: 'Custom UI',\n description: 'Set UI tweaks.',\n loaded: true,\n });\n }\n }\n const getHaConfigCustomUi = () => {\n const haConfigCustomUi = document.createElement('ha-config-custom-ui');\n haConfigCustomUi.isWide = haPanelConfig.isWide;\n haConfigCustomUi.setAttribute('page-name', 'customui');\n return haConfigCustomUi;\n };\n\n const ironPages = window.customUI.lightOrShadow(haPanelConfig, 'iron-pages');\n if (ironPages) {\n if (ironPages.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n ironPages.appendChild(haConfigCustomUi);\n ironPages.addEventListener('iron-items-changed', () => {\n if (window.location.pathname.startsWith('/config/customui')) {\n ironPages.select('customui');\n }\n });\n }\n } else {\n const root = haPanelConfig.shadowRoot || haPanelConfig;\n if (root.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n root.appendChild(haConfigCustomUi);\n }\n const visible = window.location.pathname.startsWith('/config/customui');\n root.lastElementChild.style.display = visible ? '' : 'none';\n }\n },\n\n installStatesHook() {\n const homeAssistant = customElements.get('home-assistant');\n if (!homeAssistant || !homeAssistant.prototype._updateHass) return;\n const originalUpdate = homeAssistant.prototype._updateHass;\n homeAssistant.prototype._updateHass = function update(obj) {\n // Use named function to preserve 'this'.\n const { hass } = this;\n if (obj.states) {\n Object.keys(obj.states).forEach((key) => {\n const entity = obj.states[key];\n if (entity._cui_keep) return;\n const newEntity = window.customUI.maybeApplyTemplates(hass, obj.states, entity);\n if (hass.states && entity !== hass.states[key]) {\n // New state arrived. Put modified state in.\n obj.states[key] = newEntity;\n } else if (entity !== newEntity) {\n // It's the same state but contents changed due to other state changes.\n obj.states[key] = newEntity;\n }\n });\n }\n originalUpdate.call(this, obj);\n if (obj.themes && hass._themeWaiters) {\n hass._themeWaiters.forEach(waiter => waiter.stateChanged(waiter.state));\n hass._themeWaiters = undefined;\n }\n };\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (main.hass && main.hass.states) {\n main._updateHass({ states: main.hass.states });\n }\n },\n\n installPartialCards() {\n const partialCards = customElements.get('partial-cards');\n if (!partialCards || !partialCards.prototype._defaultViewFilter) return;\n partialCards.prototype._defaultViewFilter = (hass, entityId) => {\n if (hass.states[entityId].attributes.hidden) return false;\n const excludes = {};\n Object.values(hass.states).forEach((entity) => {\n if (entity.attributes && entity.attributes.hide_in_default_view) {\n const excludeEntityId = entity.entity_id;\n if (excludes[excludeEntityId]) return;\n excludes[excludeEntityId] = entity;\n if (entity.attributes.view) {\n Object.assign(\n excludes, getViewEntities(hass.states, entity));\n }\n }\n });\n return !excludes[entityId];\n };\n },\n\n // Allows changing the 'Execute' / 'Activate' text on script/scene cards.\n installActionName(elementName) {\n const klass = customElements.get(elementName);\n if (!klass || !klass.prototype) return;\n Object.defineProperty(klass.prototype, 'localize', {\n get() {\n function customLocalize(v) {\n if (this.stateObj && this.stateObj.attributes &&\n this.stateObj.attributes.action_name) {\n return this.stateObj.attributes.action_name;\n }\n return this.__data.localize(v);\n }\n return customLocalize;\n },\n set() {},\n });\n },\n\n // Allows theming \"regular\" top badges.\n installHaStateLabelBadge() {\n const haStateLabelBadge = customElements.get('ha-state-label-badge');\n if (!haStateLabelBadge || !haStateLabelBadge.prototype.stateChanged) return;\n // Use named function to preserve 'this'.\n haStateLabelBadge.prototype.stateChanged = function update(stateObj) {\n // TODO: Call window.customUI.maybeChangeObject\n if (stateObj.attributes.theme) {\n if (this.hass.themes === null) {\n this.hass._themeWaiters = this.hass._themeWaiters || [];\n this.hass._themeWaiters.push(this);\n } else {\n applyThemesOnElement(\n this,\n this.hass.themes || { default_theme: 'default', themes: {} },\n stateObj.attributes.theme || 'default');\n }\n }\n this.updateStyles();\n if (this.startInterval) {\n // Added on 19.1.2018\n this.startInterval(stateObj);\n }\n };\n },\n\n installStateBadge() {\n const stateBadge = customElements.get('state-badge');\n if (!stateBadge || !stateBadge.prototype.updateIconAppearance) return;\n const originalUpdateIconAppearance = stateBadge.prototype.updateIconAppearance;\n // Use named function to preserve 'this'.\n stateBadge.prototype.updateIconAppearance = function customUpdateIconAppearance(stateObj) {\n if (stateObj.attributes.icon_color && !stateObj.attributes.entity_picture) {\n this.style.backgroundImage = '';\n Object.assign(this.$.icon.style, {\n display: 'inline',\n color: stateObj.attributes.icon_color,\n filter: '',\n });\n } else {\n originalUpdateIconAppearance.call(this, stateObj);\n }\n };\n },\n\n installHaAttributes() {\n const haAttributes = customElements.get('ha-attributes');\n if (!haAttributes || !haAttributes.prototype.computeFiltersArray ||\n !window.hassAttributeUtil) return;\n // Use named function to preserve 'this'.\n haAttributes.prototype.computeFiltersArray = function customComputeFiltersArray(extraFilters) {\n return Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES).concat(extraFilters ? extraFilters.split(',') : []);\n };\n },\n\n installHaFormCustomize() {\n if (!window.location.pathname.startsWith('/config')) return;\n const haFormCustomize = customElements.get('ha-form-customize');\n if (!haFormCustomize) {\n // DOM not ready. Wait 100ms.\n window.setTimeout(window.customUI.installHaFormCustomize, 100);\n return;\n }\n if (window.customUI.haFormCustomizeInitDone) return;\n window.customUI.haFormCustomizeInitDone = true;\n\n if (!window.hassAttributeUtil) return;\n if (haFormCustomize.prototype._computeSingleAttribute) {\n // Use named function to preserve 'this'.\n haFormCustomize.prototype._computeSingleAttribute =\n function customComputeSingleAttribute(key, value, secondary) {\n const config = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key]\n || { type: window.hassAttributeUtil.UNKNOWN_TYPE };\n return this._initOpenObject(key, config.type === 'json' ? JSON.stringify(value) : value, secondary, config);\n };\n }\n if (haFormCustomize.prototype.getNewAttributesOptions) {\n // Use named function to preserve 'this'.\n haFormCustomize.prototype.getNewAttributesOptions =\n function customgetNewAttributesOptions(\n localAttributes, globalAttributes, existingAttributes, newAttributes) {\n const knownKeys =\n Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES)\n .filter((key) => {\n const conf = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key];\n return conf && (!conf.domains || !this.entity ||\n conf.domains.includes(computeStateDomain(this.entity)));\n })\n .filter(this.filterFromAttributes(localAttributes))\n .filter(this.filterFromAttributes(globalAttributes))\n .filter(this.filterFromAttributes(existingAttributes))\n .filter(this.filterFromAttributes(newAttributes));\n return knownKeys.sort().concat('Other');\n };\n }\n },\n\n installClassHooks() {\n if (window.customUI.classInitDone) return;\n window.customUI.classInitDone = true;\n window.customUI.installPartialCards();\n window.customUI.installStatesHook();\n window.customUI.installHaStateLabelBadge();\n window.customUI.installStateBadge();\n window.customUI.installHaAttributes();\n window.customUI.installActionName('state-card-scene');\n window.customUI.installActionName('state-card-script');\n },\n\n init() {\n if (window.customUI.initDone) return;\n window.customUI.installClassHooks();\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (!main.hass || !main.hass.states) {\n // Connection wasn't made yet. Try in 1 second.\n window.setTimeout(window.customUI.init, 1000);\n return;\n }\n window.customUI.initDone = true;\n\n window.customUI.useCustomizer();\n\n window.customUI.runHooks();\n window.addEventListener('location-changed', window.setTimeout.bind(null, window.customUI.runHooks, 100));\n /* eslint-disable no-console */\n console.log(`Loaded CustomUI ${VERSION}`);\n /* eslint-enable no-console */\n if (!window.CUSTOM_UI_LIST) {\n window.CUSTOM_UI_LIST = [];\n }\n window.CUSTOM_UI_LIST.push({\n name: 'CustomUI',\n version: VERSION,\n url: 'https://github.com/andrey-git/home-assistant-custom-ui',\n });\n },\n\n runHooks() {\n window.customUI.fixGroupTitles();\n window.customUI.updateConfigPanel();\n window.customUI.installHaFormCustomize();\n },\n\n getName() {\n return window.localStorage.getItem('ha-device-name') || '';\n },\n\n setName(name) {\n window.localStorage.setItem('ha-device-name', name || '');\n },\n\n computeTemplate(template, hass, entities, entity, attributes, attribute, state) {\n const functionBody = (template.indexOf('return') >= 0) ? template : `return \\`${template}\\`;`;\n try {\n /* eslint-disable no-new-func */\n const func = new Function(\n 'hass', 'entities', 'entity', 'attributes', 'attribute', 'state', functionBody);\n /* eslint-enable no-new-func */\n return func(hass, entities, entity, attributes, attribute, state);\n } catch (e) {\n /* eslint-disable no-console */\n if ((e instanceof SyntaxError) || e instanceof ReferenceError) {\n console.warn(`${e.name}: ${e.message} in template ${functionBody}`);\n return null;\n }\n /* eslint-enable no-console */\n throw e;\n }\n },\n};\nwindow.customUI.init();\n","import computeDomain from './compute_domain.js';\nimport getGroupEntities from './get_group_entities.js';\n\n// Return an object containing all entities that the view will show\n// including embedded groups.\nexport default function getViewEntities(entities, view) {\n const viewEntities = {};\n\n view.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity && !entity.attributes.hidden) {\n viewEntities[entity.entity_id] = entity;\n\n if (computeDomain(entity.entity_id) === 'group') {\n const groupEntities = getGroupEntities(entities, entity);\n\n Object.keys(groupEntities).forEach((grEntityId) => {\n const grEntity = groupEntities[grEntityId];\n\n if (!grEntity.attributes.hidden) {\n viewEntities[grEntityId] = grEntity;\n }\n });\n }\n }\n });\n\n return viewEntities;\n}\n","export default function getGroupEntities(entities, group) {\n const result = {};\n\n group.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity) {\n result[entity.entity_id] = entity;\n }\n });\n\n return result;\n}\n","import '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass CuiBaseElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extra: {\n type: Array,\n computed: 'computeExtra(hass, stateObj)',\n },\n };\n }\n\n computeExtra(hass, stateObj) {\n let extras = stateObj.attributes.extra_data_template;\n if (extras) {\n if (!Array.isArray(extras)) {\n extras = [extras];\n }\n return extras.map(extra => window.customUI.computeTemplate(\n extra,\n hass,\n hass.states,\n stateObj,\n stateObj.attributes,\n /* attribute= */ undefined,\n stateObj.state,\n )).filter(result => result !== null);\n }\n return [];\n }\n\n showLastChanged(stateObj, inDialog, extra) {\n if (inDialog) return true;\n if (extra.length) return false;\n return !!stateObj.attributes.show_last_changed;\n }\n\n hasExtra(extra) {\n return extra.length > 0;\n }\n}\nexport default CuiBaseElement;\n","import dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.js';\n\n/**\n * @extends HTMLElement\n */\nclass DynamicElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n stateObj: Object,\n elementName: String,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n };\n }\n\n static get observers() {\n return [\n 'observerFunc(hass, stateObj, elementName, inDialog)',\n ];\n }\n\n observerFunc(hass, stateObj, elementName, inDialog) {\n dynamicContentUpdater(\n this,\n elementName ? elementName.toUpperCase() : 'DIV',\n { hass, stateObj, inDialog });\n }\n}\ncustomElements.define('dynamic-element', DynamicElement);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\n\nimport './dynamic-element.js';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass DynamicWithExtra extends customElements.get('state-card-display') {\n static get template() {\n return html`\n \n \n \n
\n \n \n \n \n
\n \n \n
\n \n
\n \n \n \n \n
\n \n
\n \n \n [[computeStateDisplay(stateObj)]]
\n \n \n
\n `;\n }\n\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extraObj: {\n type: Array,\n computed: 'computeExtra(hass, stateObj, _attached)',\n },\n _attached: Boolean,\n extraObjVisible: {\n type: Boolean,\n computed: 'computeExtraVisible(extraObj, inDialog)',\n },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._attached = true;\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n super.disconnectedCallback();\n }\n\n computeExtra(hass, stateObj, attached) {\n if (!stateObj.attributes.extra_badge || !attached) return [];\n let extraBadges = stateObj.attributes.extra_badge;\n if (!Array.isArray(extraBadges)) {\n extraBadges = [extraBadges];\n }\n return extraBadges.map((extraBadge) => {\n let result = null;\n if (extraBadge.entity_id && hass.states[extraBadge.entity_id]) {\n result = Object.assign({}, window.customUI.maybeChangeObject(\n this, hass.states[extraBadge.entity_id], this.inDialog,\n /* allowHidden= */false));\n } else if (extraBadge.attribute &&\n stateObj.attributes[extraBadge.attribute] !== undefined) {\n result = {\n state: String(stateObj.attributes[extraBadge.attribute]),\n _domain: 'none',\n entity_id: null,\n attributes: { unit_of_measurement: extraBadge.unit },\n };\n }\n if (!result) return null;\n let blacklist = extraBadge.blacklist_states;\n if (blacklist !== undefined) {\n if (!Array.isArray(blacklist)) {\n blacklist = [blacklist];\n }\n if (blacklist.some(v => RegExp(v).test(result.state.toString()))) {\n return null;\n }\n }\n result._entityDisplay = '';\n return result;\n }).filter(extraBadge => extraBadge != null);\n }\n\n computeExtraVisible(extraObj, inDialog) {\n if (inDialog || !extraObj) return false;\n return extraObj.length !== 0;\n }\n\n extraClass(extraObjVisible) {\n return extraObjVisible ? 'extra' : '';\n }\n\n _showControl(inDialog, stateObj) {\n if (inDialog) return true;\n return !stateObj.attributes.hide_control;\n }\n\n computeStateDisplay(stateObj) {\n // haLocalize removed in 0.61\n return super.computeStateDisplay(this.haLocalize || this.localize, stateObj);\n }\n\n isConfirmControls(stateObj) {\n return stateObj.attributes.confirm_controls ||\n stateObj.attributes.confirm_controls_show_lock;\n }\n\n clickHandler(e) {\n this.root.querySelector('#overlay').style.pointerEvents = 'none';\n const lock = this.root.querySelector('#lock');\n if (lock) {\n lock.icon = 'mdi:lock-open-outline';\n lock.style.opacity = '0.1';\n }\n window.setTimeout(() => {\n this.root.querySelector('#overlay').style.pointerEvents = '';\n if (lock) {\n lock.icon = 'mdi:lock-outline';\n lock.style.opacity = '';\n }\n }, 5000);\n e.stopPropagation();\n }\n\n applyThemes(hass, element, stateObj) {\n const themeName = stateObj.attributes.theme || 'default';\n applyThemesOnElement(\n element, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n extraDomChanged() {\n this.root.querySelectorAll('ha-state-label-badge')\n .forEach((elem) => {\n this.applyThemes(this.hass, elem, elem.state);\n });\n }\n}\ncustomElements.define('dynamic-with-extra', DynamicWithExtra);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaThemedSlider extends Polymer.Element {\n static get template() {\n return html`\n \n\n \n \n `;\n }\n\n ready() {\n super.ready();\n this.disableOffWhenMin = !this._computeAttribute(this.theme, 'off_when_min', !this.disableOffWhenMin);\n this.computeEnabledThemedReportWhenNotChanged(this.theme, this.disableReportWhenNotChanged);\n }\n\n static get properties() {\n return {\n min: {\n type: Number,\n value: 0,\n },\n max: {\n type: Number,\n value: 100,\n },\n pin: {\n type: Boolean,\n value: false,\n },\n isOn: {\n type: Boolean,\n value: false,\n },\n disableOffWhenMin: {\n type: Boolean,\n value: false,\n notify: true,\n },\n disableReportWhenNotChanged: {\n type: Boolean,\n value: false,\n },\n\n theme: Object,\n value: {\n type: Number,\n notify: true,\n },\n _themedMin: {\n type: Number,\n computed: '_computeAttribute(theme, \"min\", min)',\n },\n };\n }\n\n static get observers() {\n return [\n 'computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged)',\n ];\n }\n\n computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged) {\n this._enabledThemedReportWhenNotChanged = this._computeAttribute(\n theme, 'report_when_not_changed', !disableReportWhenNotChanged);\n }\n\n _computeAttribute(theme, attr, def) {\n if (theme) {\n if (attr in theme) {\n return theme[attr];\n }\n }\n return def;\n }\n\n computeClass(theme, isOn, themedMin) {\n let result = '';\n if (isOn) {\n result += 'is-on ';\n }\n if (this._computeAttribute(theme, 'off_when_min', !this.disableOffWhenMin) || themedMin === 0) {\n // If offWhenMin is enabled don't customize.\n return '';\n }\n return `${result}disable-off-when-min`;\n }\n\n valueChanged(ev) {\n if (!this._enabledThemedReportWhenNotChanged && this.value === ev.target.value) {\n ev.stopPropagation();\n return;\n }\n this.value = ev.target.value;\n }\n}\ncustomElements.define('ha-themed-slider', HaThemedSlider);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\nimport './ha-themed-slider.js';\n\n/**\n * @extends HTMLElement\n */\nclass StateCardWithSlider extends CuiBaseElement {\n static get template() {\n return html`\n \n \n\n \n
\n
\n \n [[item]]
\n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n
\n `;\n }\n\n static get properties() {\n return {\n domain: String,\n serviceMin: String,\n serviceMax: String,\n valueName: String,\n setValueName: String,\n nameOn: { type: String, value: 'on' },\n min: { type: Number, value: 0 },\n max: { type: Number, value: 255 },\n\n sliderValue: {\n type: Number,\n value: 0,\n },\n disableOffWhenMin: Boolean,\n mode: String,\n stretchSlider: {\n type: Boolean,\n value: false,\n },\n breakSlider: {\n type: Boolean,\n value: false,\n },\n hideSlider: {\n type: Boolean,\n value: false,\n },\n lineTooLong: {\n type: Boolean,\n value: false,\n },\n minLineBreak: Number,\n maxLineBreak: Number,\n showSlider: {\n type: Number,\n computed: '_showSlider(inDialog, stateObj, hideSlider)',\n },\n };\n }\n\n ready() {\n super.ready();\n this._onIronResize = this._onIronResize.bind(this);\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._isConnected = true;\n window.addEventListener('resize', this._onIronResize);\n this._waitForLayout();\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this._onIronResize);\n this._isConnected = false;\n super.disconnectedCallback();\n }\n\n static get observers() {\n return [\n 'stateObjChanged(stateObj, nameOn, valueName)',\n ];\n }\n\n _waitForLayout() {\n if (!this._isConnected) return;\n this._setMode();\n if (this._frameId) return;\n this.readyToCompute = false;\n this._frameId = window.requestAnimationFrame(() => {\n this._frameId = null;\n this.readyToCompute = true;\n this._onIronResize();\n });\n }\n\n _setMode() {\n const obj = {\n hideSlider: this.mode === 'hide-slider' && this.lineTooLong,\n breakSlider:\n (this.mode === 'break-slider' || this.mode === 'hide-slider') &&\n this.lineTooLong,\n };\n if (!this.showSlider) {\n obj.breakSlider = true;\n }\n this.setProperties(obj);\n }\n\n _onIronResize() {\n if (!this.readyToCompute) return;\n if (this.mode === 'no-slider') {\n this.setProperties({\n hideSlider: true,\n breakSlider: true,\n });\n return;\n }\n const prevBreakSlider = this.breakSlider;\n const prevHideSlider = this.hideSlider;\n this.setProperties({\n lineTooLong: false,\n hideSlider: false,\n breakSlider: false,\n });\n const { container } = this.$;\n const containerWidth = container.clientWidth;\n if (containerWidth === 0) return;\n if (containerWidth <= this.minLineBreak) {\n this.lineTooLong = true;\n } else if (containerWidth >= this.maxLineBreak) {\n this.lineTooLong = false;\n } else {\n if (prevHideSlider && this.mode === 'hide-slider') {\n // We need to unhide the slider in order to recalculate height.\n this._waitForLayout();\n return;\n }\n const containerHeight = container.clientHeight;\n const stateHeight = this.root.querySelector('.state-info').clientHeight;\n this.lineTooLong = containerHeight > stateHeight * 1.5;\n if (this.lineTooLong) {\n this.minLineBreak = containerWidth;\n } else if (!prevBreakSlider) {\n this.maxLineBreak = containerWidth;\n }\n }\n this._setMode();\n }\n\n _computeWrapClass(mode, stretchSlider, lineTooLong, inDialog) {\n if (inDialog) {\n return '';\n }\n if (mode === 'single-line') {\n return 'nowrap';\n }\n if (stretchSlider && lineTooLong) {\n return 'stretch wrap';\n }\n return 'wrap';\n }\n\n _showSlider(inDialog, stateObj, hideSlider) {\n if (inDialog || hideSlider) {\n return false;\n }\n return true;\n }\n\n sliderChanged(ev) {\n const value = parseInt(ev.target.value, 10);\n const param = { entity_id: this.stateObj.entity_id };\n if (Number.isNaN(value)) return;\n let target = this.root.querySelector('#slider');\n if (ev.target !== target) {\n // No Shadow DOM - we have access to original target.\n ({ target } = ev);\n } else if (ev.path) {\n [target] = ev.path;\n } else if (ev.composedPath) {\n [target] = ev.composedPath();\n }\n if (value === 0 || (value <= target.min && !this.disableOffWhenMin)) {\n this.hass.callService(this.domain, this.serviceMin, param);\n } else {\n param[this.setValueName || this.valueName] = value;\n this.hass.callService(this.domain, this.serviceMax, param);\n }\n }\n\n stateObjChanged(stateObj, nameOn, valueName) {\n const obj = {\n sliderValue: this.isOn(stateObj, nameOn) ? stateObj.attributes[valueName] : 0,\n };\n if (stateObj) {\n Object.assign(obj, {\n minLineBreak: 0,\n maxLineBreak: 999,\n hideSlider: false,\n breakSlider: false,\n lineTooLong: false,\n mode: stateObj.attributes.state_card_mode,\n stretchSlider: !!stateObj.attributes.stretch_slider,\n });\n }\n this.setProperties(obj);\n if (stateObj) {\n this._waitForLayout();\n }\n }\n\n isOn(stateObj, nameOn) {\n return stateObj && (!nameOn || stateObj.state === nameOn);\n }\n\n stopPropagation(ev) {\n ev.stopPropagation();\n }\n}\ncustomElements.define('state-card-with-slider', StateCardWithSlider);\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\n\n/**\n * @extends HTMLElement\n */\nclass StateCardWithoutSlider extends CuiBaseElement {\n static get template() {\n return html`\n \n \n\n \n
\n \n [[item]]
\n \n \n
\n \n
\n `;\n }\n}\ncustomElements.define('state-card-without-slider', StateCardWithoutSlider);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.js';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.js';\nimport dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.js';\nimport stateCardType from '../../home-assistant-polymer/src/common/entity/state_card_type.js';\n\nimport '../utils/hooks.js';\nimport './state-card-with-slider.js';\nimport './state-card-without-slider.js';\n\nconst SHOW_LAST_CHANGED_BLACKLISTED_CARDS = ['configurator'];\nconst DOMAIN_TO_SLIDER_SUPPORT = {\n light: 1, // SUPPORT_BRIGHTNESS\n cover: 4, // SUPPORT_SET_POSITION\n climate: 1, // SUPPORT_TARGET_TEMPERATURE\n};\nconst TYPE_TO_CONTROL = {\n toggle: 'ha-entity-toggle',\n display: '',\n cover: 'ha-cover-controls',\n};\n\n/**\n * @extends HTMLElement\n */\nclass StateCardCustomUi extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n\n stateObj: Object,\n };\n }\n\n static get observers() {\n return [\n 'inputChanged(hass, inDialog, stateObj)',\n ];\n }\n\n connectedCallback() {\n super.connectedCallback();\n const container = this.parentNode.parentNode;\n if (container.tagName === 'DIV' &&\n (container.classList.contains('state') || container.classList.contains('child-card'))) {\n this._container = container;\n\n // Since this doesn't actually change the background - no need to clear it.\n container.style.setProperty(\n 'background-color', 'var(--paper-card-background-color, inherit)');\n\n // Polyfill 'updateStyles'.\n if (!container.updateStyles) {\n container.updateStyles = (styles) => {\n Object.keys(styles).forEach((key) => {\n container.style.setProperty(key, styles[key]);\n });\n };\n }\n }\n this._isAttached = true;\n this.inputChanged(this.hass, this.inDialog, this.stateObj);\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n if (this._container) {\n this._container.updateStyles({ display: '', margin: '', padding: '' });\n applyThemesOnElement(\n this._container, this.hass.themes || { default_theme: 'default', themes: {} }, 'default');\n this._container = null;\n }\n super.disconnectedCallback();\n }\n\n badgeMode(hass, stateObj, domain) {\n const states = [];\n if (domain === 'group') {\n stateObj.attributes.entity_id.forEach((id) => {\n const state = hass.states[id];\n if (!state) {\n /* eslint-disable no-console */\n console.warn(`Unknown ID ${id} in group ${stateObj.entity_id}`);\n /* eslint-enable no-console */\n return;\n }\n if (!stateObj.attributes.badges_list ||\n stateObj.attributes.badges_list.includes(state.entity_id)) {\n states.push(window.customUI.maybeChangeObject(\n this, state, false /* inDialog */, false /* allowHidden */));\n }\n });\n } else {\n states.push(stateObj);\n if (this._container) {\n this._container.style.display = 'inline-block';\n const params = { display: 'inline-block' };\n if (this._container.classList.contains('state')) {\n params.margin = 'var(--ha-badges-card-margin, 0)';\n }\n this.updateStyles(params);\n }\n }\n dynamicContentUpdater(\n this,\n 'HA-BADGES-CARD',\n { hass, states });\n if (this._container) {\n this._container.updateStyles({\n width: 'var(--ha-badges-card-width, initial)',\n 'text-align': 'var(--ha-badges-card-text-align, initial)',\n });\n }\n this.lastChild.style.fontSize = '85%';\n\n // Since this variable only affects badges mode - no need to clean it up.\n this.style.setProperty('--ha-state-label-badge-margin-bottom', '0');\n }\n\n cleanBadgeStyle() {\n if (this._container) {\n this._container.updateStyles({\n display: '',\n width: '',\n 'text-align': '',\n });\n }\n this.updateStyles({ display: '', margin: '' });\n }\n\n applyThemes(hass, modifiedObj) {\n let themeTarget = this;\n let themeName = 'default';\n if (this._container) {\n themeTarget = this._container;\n }\n if (modifiedObj.attributes.theme) {\n themeName = modifiedObj.attributes.theme;\n }\n applyThemesOnElement(\n themeTarget, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n maybeHideEntity(modifiedObj) {\n if (!modifiedObj) {\n if (this.lastChild) {\n this.removeChild(this.lastChild);\n }\n if (this._container) {\n this._container.updateStyles({ margin: '0', padding: '0' });\n }\n return true;\n }\n if (this._container) {\n this._container.updateStyles({ margin: '', padding: '' });\n }\n return false;\n }\n\n sliderEligible_(domain, obj, inDialog) {\n if (inDialog) return false;\n return DOMAIN_TO_SLIDER_SUPPORT[domain] &&\n (DOMAIN_TO_SLIDER_SUPPORT[domain] & obj.attributes.supported_features) &&\n obj.attributes.state_card_mode && obj.attributes.state_card_mode !== 'no-slider';\n }\n\n inputChanged(hass, inDialog, stateObj) {\n if (!stateObj || !hass || !this._isAttached) return;\n const domain = computeStateDomain(stateObj);\n const modifiedObj = window.customUI.maybeChangeObject(\n this, stateObj, inDialog, true /* allowHidden */);\n\n if (this.maybeHideEntity(modifiedObj)) return;\n\n this.applyThemes(hass, modifiedObj);\n\n if (!inDialog && modifiedObj.attributes.state_card_mode === 'badges') {\n this.badgeMode(hass, modifiedObj, domain);\n } else {\n this.regularMode_(hass, inDialog, modifiedObj, domain);\n }\n }\n\n regularMode_(hass, inDialog, stateObj, domain) {\n this.cleanBadgeStyle();\n\n const params = {\n hass,\n stateObj,\n inDialog,\n };\n const originalStateCardType = stateCardType(hass, stateObj);\n let customStateCardType;\n const secondaryStateCardType = stateObj.attributes.state_card_custom_ui_secondary;\n\n if (domain === 'light' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-entity-toggle',\n serviceMin: 'turn_off',\n serviceMax: 'turn_on',\n valueName: 'brightness',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'cover' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-cover-controls',\n max: 100,\n serviceMin: 'close_cover',\n serviceMax: 'set_cover_position',\n setValueName: 'position',\n valueName: 'current_position',\n nameOn: 'open',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'climate' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-climate-state',\n min: stateObj.attributes.min_temp || -100,\n max: stateObj.attributes.max_temp || 200,\n serviceMin: 'set_temperature',\n serviceMax: 'set_temperature',\n valueName: 'temperature',\n nameOn: '',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (TYPE_TO_CONTROL[originalStateCardType] !== undefined) {\n params.controlElement = TYPE_TO_CONTROL[originalStateCardType];\n customStateCardType = 'state-card-without-slider';\n } else if (stateObj.attributes.show_last_changed &&\n !SHOW_LAST_CHANGED_BLACKLISTED_CARDS.includes(originalStateCardType)) {\n params.inDialog = true;\n }\n if (stateObj.state === 'unavailable') {\n params.controlElement = '';\n }\n if (stateObj.attributes.control_element !== undefined) {\n params.controlElement = stateObj.attributes.control_element;\n }\n\n dynamicContentUpdater(\n this,\n (secondaryStateCardType || customStateCardType || `STATE-CARD-${originalStateCardType}`).toUpperCase(),\n params);\n }\n}\ncustomElements.define('state-card-custom-ui', StateCardCustomUi);\n","import canToggleDomain from './can_toggle_domain.js';\nimport computeStateDomain from './compute_state_domain.js';\n\nexport default function canToggleState(hass, stateObj) {\n const domain = computeStateDomain(stateObj);\n if (domain === 'group') {\n return stateObj.state === 'on' || stateObj.state === 'off';\n }\n if (domain === 'climate') {\n return !!((stateObj.attributes || {}).supported_features & 4096);\n }\n\n return canToggleDomain(hass, domain);\n}\n","export default function canToggleDomain(hass, domain) {\n const services = hass.config.services[domain];\n if (!services) { return false; }\n\n if (domain === 'lock') {\n return 'lock' in services;\n } else if (domain === 'cover') {\n return 'open_cover' in services;\n }\n return 'turn_on' in services;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nwindow.JSCompiler_renameProperty = function(prop) { return prop; };\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/src/utils/version.js b/src/utils/version.js
index 6f66d9e..b09a99b 100644
--- a/src/utils/version.js
+++ b/src/utils/version.js
@@ -1 +1 @@
-export default '20180528';
+export default '20180602';
diff --git a/state-card-custom-ui-es5.html b/state-card-custom-ui-es5.html
index d6a9e5d..a524768 100644
--- a/state-card-custom-ui-es5.html
+++ b/state-card-custom-ui-es5.html
@@ -1,3 +1,3 @@
diff --git a/state-card-custom-ui-es5.html.gz b/state-card-custom-ui-es5.html.gz
index f4da9ba..292cc5a 100644
Binary files a/state-card-custom-ui-es5.html.gz and b/state-card-custom-ui-es5.html.gz differ
diff --git a/state-card-custom-ui.html b/state-card-custom-ui.html
index edfaf6d..a20d730 100644
--- a/state-card-custom-ui.html
+++ b/state-card-custom-ui.html
@@ -1,5 +1,5 @@
diff --git a/state-card-custom-ui.html.gz b/state-card-custom-ui.html.gz
index 68af86c..8671e2d 100644
Binary files a/state-card-custom-ui.html.gz and b/state-card-custom-ui.html.gz differ