@i-novus/n2o-components 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/index.js +0 -0
  2. package/lib/display/Alerts/Alert.d.ts +2 -0
  3. package/lib/display/Alerts/Alert.js +121 -0
  4. package/lib/display/Alerts/AlertSection.d.ts +18 -0
  5. package/lib/display/Alerts/AlertSection.js +64 -0
  6. package/lib/display/Alerts/AlertWrapper.d.ts +6 -0
  7. package/lib/display/Alerts/AlertWrapper.js +39 -0
  8. package/lib/display/Alerts/DefaultAlert.d.ts +6 -0
  9. package/lib/display/Alerts/DefaultAlert.js +125 -0
  10. package/lib/display/Alerts/LoaderAlert.d.ts +5 -0
  11. package/lib/display/Alerts/LoaderAlert.js +36 -0
  12. package/lib/display/Alerts/types.d.ts +49 -0
  13. package/lib/display/Alerts/types.js +24 -0
  14. package/lib/display/Alerts/utils.d.ts +15 -0
  15. package/lib/display/Alerts/utils.js +102 -0
  16. package/lib/display/Badge/Badge.d.ts +16 -0
  17. package/lib/display/Badge/Badge.js +77 -0
  18. package/lib/display/Badge/enums.d.ts +9 -0
  19. package/lib/display/Badge/enums.js +23 -0
  20. package/lib/display/Badge/utils.d.ts +9 -0
  21. package/lib/display/Badge/utils.js +49 -0
  22. package/lib/display/Block.d.ts +369 -0
  23. package/lib/display/Block.js +38 -0
  24. package/lib/display/CodeViewer/CodeViewer.d.ts +13 -0
  25. package/lib/display/CodeViewer/CodeViewer.js +96 -0
  26. package/lib/display/Drawer/Drawer.d.ts +25 -0
  27. package/lib/display/Drawer/Drawer.js +99 -0
  28. package/lib/display/DropdownCustomItem.d.ts +7 -0
  29. package/lib/display/DropdownCustomItem.js +23 -0
  30. package/lib/display/Filter/Buttons.d.ts +11 -0
  31. package/lib/display/Filter/Buttons.js +42 -0
  32. package/lib/display/Filter/Filter.d.ts +8 -0
  33. package/lib/display/Filter/Filter.js +38 -0
  34. package/lib/display/HelpPopover.d.ts +16 -0
  35. package/lib/display/HelpPopover.js +104 -0
  36. package/lib/display/Html.d.ts +8 -0
  37. package/lib/display/Html.js +29 -0
  38. package/lib/display/Icon/Icon.d.ts +11 -0
  39. package/lib/display/Icon/Icon.js +42 -0
  40. package/lib/display/Image/Image.d.ts +30 -0
  41. package/lib/display/Image/Image.js +93 -0
  42. package/lib/display/Image/ImageInfo.d.ts +7 -0
  43. package/lib/display/Image/ImageInfo.js +23 -0
  44. package/lib/display/InputIcon.d.ts +13 -0
  45. package/lib/display/InputIcon.js +33 -0
  46. package/lib/display/NavItemImage/NavItemImage.d.ts +9 -0
  47. package/lib/display/NavItemImage/NavItemImage.js +35 -0
  48. package/lib/display/OutputList.d.ts +12 -0
  49. package/lib/display/OutputList.js +46 -0
  50. package/lib/display/OutputListItem.d.ts +10 -0
  51. package/lib/display/OutputListItem.js +58 -0
  52. package/lib/display/OutputText.d.ts +15 -0
  53. package/lib/display/OutputText.js +170 -0
  54. package/lib/display/Pagination/Pagination.d.ts +2 -0
  55. package/lib/display/Pagination/Pagination.js +273 -0
  56. package/lib/display/Pagination/PaginationButton.d.ts +13 -0
  57. package/lib/display/Pagination/PaginationButton.js +53 -0
  58. package/lib/display/Pagination/types.d.ts +62 -0
  59. package/lib/display/Pagination/types.js +36 -0
  60. package/lib/display/PopoverConfirm/PopoverConfirm.d.ts +30 -0
  61. package/lib/display/PopoverConfirm/PopoverConfirm.js +87 -0
  62. package/lib/display/ProgressControl/ProgressControl.d.ts +17 -0
  63. package/lib/display/ProgressControl/ProgressControl.js +68 -0
  64. package/lib/display/Slider.d.ts +23 -0
  65. package/lib/display/Slider.js +107 -0
  66. package/lib/display/Status.d.ts +9 -0
  67. package/lib/display/Status.js +40 -0
  68. package/lib/display/StatusText/StatusText.d.ts +10 -0
  69. package/lib/display/StatusText/StatusText.js +35 -0
  70. package/lib/display/StatusText/types.d.ts +18 -0
  71. package/lib/display/StatusText/types.js +19 -0
  72. package/lib/display/StatusText/utils.d.ts +3 -0
  73. package/lib/display/StatusText/utils.js +29 -0
  74. package/lib/display/Text.d.ts +12 -0
  75. package/lib/display/Text.js +38 -0
  76. package/lib/display/Typography/Base.d.ts +32 -0
  77. package/lib/display/Typography/Base.js +259 -0
  78. package/lib/display/Typography/ContentEditable.d.ts +15 -0
  79. package/lib/display/Typography/ContentEditable.js +86 -0
  80. package/lib/display/Typography/Paragraph.d.ts +4 -0
  81. package/lib/display/Typography/Paragraph.js +23 -0
  82. package/lib/display/Typography/Text.d.ts +9 -0
  83. package/lib/display/Typography/Text.js +37 -0
  84. package/lib/display/Typography/Title.d.ts +7 -0
  85. package/lib/display/Typography/Title.js +28 -0
  86. package/lib/display/Typography/utils.d.ts +13 -0
  87. package/lib/display/Typography/utils.js +75 -0
  88. package/lib/helpers/HelpPopover.d.ts +9 -0
  89. package/lib/helpers/HelpPopover.js +46 -0
  90. package/lib/helpers/withRightPlaceholder.d.ts +9 -0
  91. package/lib/helpers/withRightPlaceholder.js +35 -0
  92. package/lib/inputs/Checkbox/Checkbox.d.ts +29 -0
  93. package/lib/inputs/Checkbox/Checkbox.js +117 -0
  94. package/lib/inputs/Checkbox/CheckboxControl.d.ts +7 -0
  95. package/lib/inputs/Checkbox/CheckboxControl.js +33 -0
  96. package/lib/inputs/CheckboxGroup/CheckboxGroup.d.ts +11 -0
  97. package/lib/inputs/CheckboxGroup/CheckboxGroup.js +84 -0
  98. package/lib/inputs/CodeEditor/CodeEditor.d.ts +21 -0
  99. package/lib/inputs/CodeEditor/CodeEditor.js +85 -0
  100. package/lib/inputs/DatePicker/Calendar.d.ts +65 -0
  101. package/lib/inputs/DatePicker/Calendar.js +556 -0
  102. package/lib/inputs/DatePicker/CalendarHeader.d.ts +26 -0
  103. package/lib/inputs/DatePicker/CalendarHeader.js +213 -0
  104. package/lib/inputs/DatePicker/Clock.d.ts +10 -0
  105. package/lib/inputs/DatePicker/Clock.js +45 -0
  106. package/lib/inputs/DatePicker/DateInput.d.ts +44 -0
  107. package/lib/inputs/DatePicker/DateInput.js +262 -0
  108. package/lib/inputs/DatePicker/DateInputGroup.d.ts +20 -0
  109. package/lib/inputs/DatePicker/DateInputGroup.js +77 -0
  110. package/lib/inputs/DatePicker/DateInterval.d.ts +24 -0
  111. package/lib/inputs/DatePicker/DateInterval.js +92 -0
  112. package/lib/inputs/DatePicker/DatePicker.d.ts +22 -0
  113. package/lib/inputs/DatePicker/DatePicker.js +36 -0
  114. package/lib/inputs/DatePicker/DateTimeControl.d.ts +98 -0
  115. package/lib/inputs/DatePicker/DateTimeControl.js +452 -0
  116. package/lib/inputs/DatePicker/Day.d.ts +14 -0
  117. package/lib/inputs/DatePicker/Day.js +50 -0
  118. package/lib/inputs/DatePicker/PopUp.d.ts +19 -0
  119. package/lib/inputs/DatePicker/PopUp.js +71 -0
  120. package/lib/inputs/DatePicker/types.d.ts +31 -0
  121. package/lib/inputs/DatePicker/types.js +25 -0
  122. package/lib/inputs/DatePicker/utils.d.ts +39 -0
  123. package/lib/inputs/DatePicker/utils.js +304 -0
  124. package/lib/inputs/Input.d.ts +51 -0
  125. package/lib/inputs/Input.js +200 -0
  126. package/lib/inputs/InputMask/InputMask.d.ts +23 -0
  127. package/lib/inputs/InputMask/InputMask.js +310 -0
  128. package/lib/inputs/InputMoney/InputMoney.d.ts +101 -0
  129. package/lib/inputs/InputMoney/InputMoney.js +258 -0
  130. package/lib/inputs/InputNumber/InputNumber.d.ts +29 -0
  131. package/lib/inputs/InputNumber/InputNumber.js +316 -0
  132. package/lib/inputs/InputNumber/index.d.ts +1 -0
  133. package/lib/inputs/InputNumber/index.js +14 -0
  134. package/lib/inputs/InputNumber/types.d.ts +18 -0
  135. package/lib/inputs/InputNumber/types.js +14 -0
  136. package/lib/inputs/InputNumber/utils.d.ts +6 -0
  137. package/lib/inputs/InputNumber/utils.js +86 -0
  138. package/lib/inputs/InputPassword/InputPassword.d.ts +10 -0
  139. package/lib/inputs/InputPassword/InputPassword.js +81 -0
  140. package/lib/inputs/InputSelect/InputAddon.d.ts +17 -0
  141. package/lib/inputs/InputSelect/InputAddon.js +31 -0
  142. package/lib/inputs/InputSelect/InputContent.d.ts +63 -0
  143. package/lib/inputs/InputSelect/InputContent.js +188 -0
  144. package/lib/inputs/InputSelect/InputSelect.d.ts +296 -0
  145. package/lib/inputs/InputSelect/InputSelect.js +795 -0
  146. package/lib/inputs/InputSelect/InputSelectGroup.d.ts +43 -0
  147. package/lib/inputs/InputSelect/InputSelectGroup.js +113 -0
  148. package/lib/inputs/InputSelect/PopupItems.d.ts +55 -0
  149. package/lib/inputs/InputSelect/PopupItems.js +357 -0
  150. package/lib/inputs/InputSelect/PopupList.d.ts +82 -0
  151. package/lib/inputs/InputSelect/PopupList.js +138 -0
  152. package/lib/inputs/InputSelect/SelectedItems.d.ts +17 -0
  153. package/lib/inputs/InputSelect/SelectedItems.js +125 -0
  154. package/lib/inputs/InputSelect/constants.d.ts +4 -0
  155. package/lib/inputs/InputSelect/constants.js +15 -0
  156. package/lib/inputs/InputSelect/types.d.ts +16 -0
  157. package/lib/inputs/InputSelect/types.js +16 -0
  158. package/lib/inputs/InputSelect/utils.d.ts +9 -0
  159. package/lib/inputs/InputSelect/utils.js +142 -0
  160. package/lib/inputs/InputSelectTree/InputSelectTree.d.ts +114 -0
  161. package/lib/inputs/InputSelectTree/InputSelectTree.js +466 -0
  162. package/lib/inputs/InputSelectTree/TreeSelectNode.d.ts +36 -0
  163. package/lib/inputs/InputSelectTree/TreeSelectNode.js +63 -0
  164. package/lib/inputs/InputSelectTree/allProps.d.ts +123 -0
  165. package/lib/inputs/InputSelectTree/allProps.js +48 -0
  166. package/lib/inputs/InputSelectTree/until.d.ts +4 -0
  167. package/lib/inputs/InputSelectTree/until.js +83 -0
  168. package/lib/inputs/InputText.d.ts +41 -0
  169. package/lib/inputs/InputText.js +170 -0
  170. package/lib/inputs/NumberPicker/NumberPicker.d.ts +15 -0
  171. package/lib/inputs/NumberPicker/NumberPicker.js +129 -0
  172. package/lib/inputs/NumberPicker/NumberPickerButton.d.ts +8 -0
  173. package/lib/inputs/NumberPicker/NumberPickerButton.js +64 -0
  174. package/lib/inputs/NumberPicker/index.d.ts +1 -0
  175. package/lib/inputs/NumberPicker/index.js +14 -0
  176. package/lib/inputs/NumberPicker/utils.d.ts +2 -0
  177. package/lib/inputs/NumberPicker/utils.js +31 -0
  178. package/lib/inputs/RadioGroup/default/Group.d.ts +15 -0
  179. package/lib/inputs/RadioGroup/default/Group.js +63 -0
  180. package/lib/inputs/RadioGroup/default/Input.d.ts +17 -0
  181. package/lib/inputs/RadioGroup/default/Input.js +77 -0
  182. package/lib/inputs/RadioGroup/tabs/Group.d.ts +3 -0
  183. package/lib/inputs/RadioGroup/tabs/Group.js +24 -0
  184. package/lib/inputs/RadioGroup/tabs/Input.d.ts +3 -0
  185. package/lib/inputs/RadioGroup/tabs/Input.js +21 -0
  186. package/lib/inputs/Rating/Rating.d.ts +30 -0
  187. package/lib/inputs/Rating/Rating.js +212 -0
  188. package/lib/inputs/Select/Popup.d.ts +31 -0
  189. package/lib/inputs/Select/Popup.js +131 -0
  190. package/lib/inputs/Select/Select.d.ts +225 -0
  191. package/lib/inputs/Select/Select.js +705 -0
  192. package/lib/inputs/Select/SelectInput.d.ts +19 -0
  193. package/lib/inputs/Select/SelectInput.js +85 -0
  194. package/lib/inputs/Select/utils.d.ts +1 -0
  195. package/lib/inputs/Select/utils.js +28 -0
  196. package/lib/inputs/Switch/Switch.d.ts +11 -0
  197. package/lib/inputs/Switch/Switch.js +41 -0
  198. package/lib/inputs/TextArea.d.ts +12 -0
  199. package/lib/inputs/TextArea.js +54 -0
  200. package/lib/inputs/TextEditor/TextEditor.d.ts +11 -0
  201. package/lib/inputs/TextEditor/TextEditor.js +89 -0
  202. package/lib/inputs/TimePicker/TimePicker.d.ts +50 -0
  203. package/lib/inputs/TimePicker/TimePicker.js +398 -0
  204. package/lib/inputs/utils.d.ts +5 -0
  205. package/lib/inputs/utils.js +39 -0
  206. package/lib/layouts/ScrollContainer.d.ts +218 -0
  207. package/lib/layouts/ScrollContainer.js +128 -0
  208. package/lib/layouts/Spinner/CoverSpinner.d.ts +29 -0
  209. package/lib/layouts/Spinner/CoverSpinner.js +153 -0
  210. package/lib/layouts/Spinner/InlineSpinner.d.ts +5 -0
  211. package/lib/layouts/Spinner/InlineSpinner.js +27 -0
  212. package/lib/layouts/Spinner/Spinner.d.ts +31 -0
  213. package/lib/layouts/Spinner/Spinner.js +178 -0
  214. package/lib/styles/components/Calendar.scss +125 -0
  215. package/lib/styles/components/CalendarHeader.scss +75 -0
  216. package/lib/styles/components/DateInputGroup.scss +39 -0
  217. package/lib/styles/components/DatePicker.scss +18 -0
  218. package/lib/styles/components/Day.scss +29 -0
  219. package/lib/styles/components/OutputList.scss +14 -0
  220. package/lib/styles/components/OutputText.scss +50 -0
  221. package/lib/styles/controls/CodeEditor.scss +4 -0
  222. package/lib/styles/controls/InputNumber.scss +36 -0
  223. package/lib/styles/controls/InputPassword.scss +17 -0
  224. package/lib/styles/controls/InputText.scss +59 -0
  225. package/lib/styles/controls/NumberPicker.scss +36 -0
  226. package/lib/styles/controls/ProgressControl.scss +3 -0
  227. package/lib/styles/controls/Slider.scss +32 -0
  228. package/lib/styles/controls/Switch.scss +105 -0
  229. package/lib/styles/controls/TextEditor.scss +23 -0
  230. package/lib/styles/controls/TimePicker.scss +32 -0
  231. package/lib/styles/n2o/variables.scss +328 -0
  232. package/lib/styles/theme/variables.scss +81 -0
  233. package/lib/styles/variables.scss +10 -0
  234. package/lib/types.d.ts +25 -0
  235. package/lib/types.js +6 -0
  236. package/lib/utils/id.d.ts +3 -0
  237. package/lib/utils/id.js +46 -0
  238. package/lib/utils/isEmptyModel.d.ts +1 -0
  239. package/lib/utils/isEmptyModel.js +21 -0
  240. package/lib/utils/parseFormatter.js +153 -0
  241. package/package.json +196 -0
@@ -0,0 +1,705 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof3 = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.Select = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
+
16
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
17
+
18
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
19
+
20
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
21
+
22
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
23
+
24
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
25
+
26
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
27
+
28
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
29
+
30
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
31
+
32
+ var _react = _interopRequireWildcard(require("react"));
33
+
34
+ var _reactOnclickoutside = _interopRequireDefault(require("react-onclickoutside"));
35
+
36
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
37
+
38
+ var _get = _interopRequireDefault(require("lodash/get"));
39
+
40
+ var _first = _interopRequireDefault(require("lodash/first"));
41
+
42
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
43
+
44
+ var _find = _interopRequireDefault(require("lodash/find"));
45
+
46
+ var _reactstrap = require("reactstrap");
47
+
48
+ var _InputSelectGroup = require("../InputSelect/InputSelectGroup");
49
+
50
+ var _PopupList = require("../InputSelect/PopupList");
51
+
52
+ var _utils = require("./utils");
53
+
54
+ var _Popup = require("./Popup");
55
+
56
+ var _SelectInput = require("./SelectInput");
57
+
58
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
59
+
60
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
61
+
62
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
63
+
64
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
65
+
66
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
67
+
68
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
69
+
70
+ /**
71
+ * N2OSelect
72
+ * @reactProps {boolean} loading - флаг анимации загрузки
73
+ * @reactProps {array} options - данные
74
+ * @reactProps {string} valueFieldId - значение ключа value в данных
75
+ * @reactProps {string} labelFieldId - значение ключа label в данных
76
+ * @reactProps {string} iconFieldId - поле для иконки
77
+ * @reactProps {string} imageFieldId - поле для картинки
78
+ * @reactProps {string} statusFieldId - поле для статуса
79
+ * @reactProps {object} badge - данные для баджа
80
+ * @reactProps {boolean} disabled - флаг неактивности
81
+ * @reactProps {array} disabledValues - неактивные данные
82
+ * @reactProps {string} enabledFieldId - поле для активности
83
+ * @reactProps {string} filter - варианты фильтрации
84
+ * @reactProps {string} value - текущее значение
85
+ * @reactProps {function} onInput - callback при вводе в инпут
86
+ * @reactProps {function} onChange - callback при выборе значения или вводе
87
+ * @reactProps {string} placeHolder - подсказка в инпуте
88
+ * @reactProps {boolean} resetOnBlur - фича, при которой сбрасывается значение контрола, если оно не выбрано из popup
89
+ * @reactProps {function} onClose - callback на закрытие попапа
90
+ * @reactProps {string} groupFieldId - поле для группировки
91
+ * @reactProps {boolean} closePopupOnSelect - флаг закрытия попапа при выборе
92
+ * @reactProps {boolean} hasCheckboxes - флаг наличия чекбоксов
93
+ * @reactProps {string} format - формат
94
+ * @reactProps {boolean} searchByTap - поиск по нажатию кнопки
95
+ */
96
+ var selectType = {
97
+ SINGLE: 'single',
98
+ CHECKBOXES: 'checkboxes'
99
+ };
100
+
101
+ function getSelected(value) {
102
+ if (Array.isArray(value)) {
103
+ return value;
104
+ }
105
+
106
+ if (!(0, _isEmpty["default"])(value)) {
107
+ return [value];
108
+ }
109
+
110
+ return [];
111
+ }
112
+
113
+ var SelectComponent = /*#__PURE__*/function (_React$Component) {
114
+ (0, _inherits2["default"])(SelectComponent, _React$Component);
115
+
116
+ var _super = _createSuper(SelectComponent);
117
+
118
+ function SelectComponent(props) {
119
+ var _this;
120
+
121
+ (0, _classCallCheck2["default"])(this, SelectComponent);
122
+ _this = _super.call(this, props);
123
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "control", null);
124
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleDataSearch", function (input, delay, callback) {
125
+ var _this$props = _this.props,
126
+ onSearch = _this$props.onSearch,
127
+ filter = _this$props.filter,
128
+ options = _this$props.options,
129
+ labelFieldId = _this$props.labelFieldId;
130
+
131
+ if (filter) {
132
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
133
+ var filterFunc = function filterFunc(item) {
134
+ return String.prototype[filter].call(item, input);
135
+ };
136
+
137
+ var filteredOptions = options.filter(function (item) {
138
+ return filterFunc(item[labelFieldId].toString());
139
+ });
140
+
141
+ _this.setState({
142
+ options: filteredOptions
143
+ });
144
+ } else {
145
+ onSearch(input, delay === false ? delay : true, callback);
146
+ }
147
+ });
148
+ var _this$props2 = _this.props,
149
+ value = _this$props2.value,
150
+ _options = _this$props2.options,
151
+ type = _this$props2.type;
152
+ _this.state = {
153
+ value: '',
154
+ isExpanded: false,
155
+ options: _options,
156
+ selected: getSelected(value),
157
+ hasCheckboxes: type === selectType.CHECKBOXES
158
+ };
159
+ _this.control = null;
160
+ _this.n2oSelectRef = /*#__PURE__*/(0, _react.createRef)();
161
+ _this.handleButtonClick = _this.handleButtonClick.bind((0, _assertThisInitialized2["default"])(_this));
162
+ _this.handleInputChange = _this.handleInputChange.bind((0, _assertThisInitialized2["default"])(_this));
163
+ _this.handleInputFocus = _this.handleInputFocus.bind((0, _assertThisInitialized2["default"])(_this));
164
+ _this.hideOptionsList = _this.hideOptionsList.bind((0, _assertThisInitialized2["default"])(_this));
165
+ _this.handleItemSelect = _this.handleItemSelect.bind((0, _assertThisInitialized2["default"])(_this));
166
+ _this.removeSelectedItem = _this.removeSelectedItem.bind((0, _assertThisInitialized2["default"])(_this));
167
+ _this.clearSelected = _this.clearSelected.bind((0, _assertThisInitialized2["default"])(_this));
168
+ _this.handleSearchButton = _this.handleSearchButton.bind((0, _assertThisInitialized2["default"])(_this));
169
+ _this.handleOnBlur = _this.handleOnBlur.bind((0, _assertThisInitialized2["default"])(_this));
170
+ _this.setControlRef = _this.setControlRef.bind((0, _assertThisInitialized2["default"])(_this));
171
+ return _this;
172
+ }
173
+
174
+ (0, _createClass2["default"])(SelectComponent, [{
175
+ key: "componentDidMount",
176
+ value: function componentDidMount() {
177
+ var _this$props3 = this.props,
178
+ initial = _this$props3.initial,
179
+ options = _this$props3.options,
180
+ valueFieldId = _this$props3.valueFieldId;
181
+
182
+ if (Array.isArray(initial)) {
183
+ this.setStateFromInitial(initial, options, valueFieldId);
184
+ }
185
+ } // eslint-disable-next-line react/no-deprecated
186
+
187
+ }, {
188
+ key: "componentWillReceiveProps",
189
+ value: function componentWillReceiveProps(nextProps) {
190
+ var options = this.props.options;
191
+ var state = {};
192
+
193
+ if (!(0, _isEqual["default"])(options, nextProps.options)) {
194
+ state.options = nextProps.options;
195
+ }
196
+
197
+ this.setState(state);
198
+ }
199
+ }, {
200
+ key: "componentDidUpdate",
201
+ value: function componentDidUpdate(prevProps) {
202
+ var _this$props4 = this.props,
203
+ initial = _this$props4.initial,
204
+ options = _this$props4.options,
205
+ valueFieldId = _this$props4.valueFieldId,
206
+ value = _this$props4.value;
207
+
208
+ if (Array.isArray(initial) && !(0, _isEqual["default"])(initial, prevProps.initial)) {
209
+ this.setStateFromInitial(initial, options, valueFieldId);
210
+ return;
211
+ }
212
+
213
+ if (!(0, _isEqual["default"])(value, prevProps.value)) {
214
+ this.setState({
215
+ selected: getSelected(value)
216
+ });
217
+ }
218
+ }
219
+ /**
220
+ * Хак для мапинга айдишников, которые берутся из адресной строки в виде строк, но ожидается число
221
+ * TODO удалить после того, как починится поведение парсинга адресной строки будет опираться на указанные типы
222
+ * @param {Array.<object>} [initial]
223
+ * @param options
224
+ * @param {String} valueFieldId
225
+ * @private
226
+ */
227
+
228
+ }, {
229
+ key: "setStateFromInitial",
230
+ value: function setStateFromInitial(initial, options, valueFieldId) {
231
+ var mapOptions = function mapOptions(options) {
232
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'string';
233
+ return options.map(function (option) {
234
+ return _objectSpread(_objectSpread({}, option), (0, _defineProperty2["default"])({}, valueFieldId, type === 'number' ? Number(option[valueFieldId]) : String(option[valueFieldId])));
235
+ });
236
+ };
237
+
238
+ if ((0, _isEmpty["default"])(options)) {
239
+ this.setState({
240
+ selected: mapOptions(initial)
241
+ });
242
+ } else {
243
+ var selected = options.filter(function (option) {
244
+ var idType = (0, _typeof2["default"])(option[valueFieldId]);
245
+ return (0, _find["default"])(mapOptions(initial, idType), option);
246
+ });
247
+ this.setState({
248
+ selected: selected
249
+ });
250
+ }
251
+ }
252
+ /**
253
+ * Удаляет элемент из списка выбранных
254
+ * @param item - элемент
255
+ * @private
256
+ */
257
+
258
+ }, {
259
+ key: "removeSelectedItem",
260
+ value: function removeSelectedItem(item) {
261
+ var _this$props5 = this.props,
262
+ valueFieldId = _this$props5.valueFieldId,
263
+ onChange = _this$props5.onChange;
264
+ var stateSelected = this.state.selected;
265
+ var selected = typeof stateSelected !== 'string' ? stateSelected.filter(function (i) {
266
+ return i[valueFieldId] !== item[valueFieldId];
267
+ }) : stateSelected;
268
+ this.setState({
269
+ selected: selected
270
+ });
271
+
272
+ if (onChange) {
273
+ onChange(selected);
274
+ }
275
+ }
276
+ /**
277
+ * Изменение видимости попапа
278
+ * @param newIsExpanded - новое значение видимости
279
+ * @private
280
+ */
281
+
282
+ }, {
283
+ key: "changePopUpVision",
284
+ value: function changePopUpVision(newIsExpanded) {
285
+ var _this$props6 = this.props,
286
+ fetchData = _this$props6.fetchData,
287
+ onClose = _this$props6.onClose;
288
+ var isExpanded = this.state.isExpanded;
289
+
290
+ if (isExpanded === newIsExpanded) {
291
+ return;
292
+ }
293
+
294
+ var onOpen = fetchData({
295
+ page: 1
296
+ });
297
+ this.setState({
298
+ isExpanded: newIsExpanded
299
+ }, newIsExpanded ? onOpen : onClose);
300
+ }
301
+ /**
302
+ * Обрабатывает нажатие на кнопку
303
+ * @private
304
+ */
305
+
306
+ }, {
307
+ key: "handleButtonClick",
308
+ value: function handleButtonClick() {
309
+ var disabled = this.props.disabled;
310
+ var isExpanded = this.state.isExpanded;
311
+
312
+ if (!disabled) {
313
+ this.changePopUpVision(!isExpanded);
314
+ }
315
+ }
316
+ /**
317
+ * Обрабатывает форкус на инпуте
318
+ * @private
319
+ */
320
+
321
+ }, {
322
+ key: "handleInputFocus",
323
+ value: function handleInputFocus() {
324
+ this.changePopUpVision(true);
325
+ }
326
+ /**
327
+ * Скрывает popUp
328
+ * @private
329
+ */
330
+
331
+ }, {
332
+ key: "hideOptionsList",
333
+ value: function hideOptionsList() {
334
+ this.changePopUpVision(false);
335
+ }
336
+ /**
337
+ * Уставнавливает новое значение инпута
338
+ * @param newValue - новое значение
339
+ * @private
340
+ */
341
+
342
+ }, {
343
+ key: "setNewValue",
344
+ value: function setNewValue(newValue) {
345
+ this.setState({
346
+ value: newValue
347
+ });
348
+ }
349
+ /**
350
+ * Удаляет выбранные элементы
351
+ * @private
352
+ */
353
+
354
+ }, {
355
+ key: "clearSelected",
356
+ value: function clearSelected(e) {
357
+ e.stopPropagation();
358
+ e.preventDefault();
359
+ var _this$props7 = this.props,
360
+ disabled = _this$props7.disabled,
361
+ onChange = _this$props7.onChange,
362
+ onBlur = _this$props7.onBlur;
363
+
364
+ if (disabled) {
365
+ return;
366
+ }
367
+
368
+ this.setState({
369
+ selected: []
370
+ });
371
+ onChange(null);
372
+ onBlur(null);
373
+ }
374
+ /**
375
+ * Выполняет поиск элементов для popUp, если установлен фильтр
376
+ * @param input - значение для поиска
377
+ * @param {boolean} delay
378
+ * @param {Function} callback
379
+ * @private
380
+ */
381
+
382
+ }, {
383
+ key: "insertSelected",
384
+ value:
385
+ /**
386
+ * Устанавливает выбранный элемент
387
+ * @param item - элемент массива options
388
+ * @private
389
+ */
390
+ function insertSelected(item) {
391
+ var _this$props8 = this.props,
392
+ onChange = _this$props8.onChange,
393
+ onBlur = _this$props8.onBlur;
394
+ var _this$state = this.state,
395
+ stateSelected = _this$state.selected,
396
+ hasCheckboxes = _this$state.hasCheckboxes;
397
+ var selected = [item];
398
+ var value = item;
399
+
400
+ if (hasCheckboxes) {
401
+ selected = [].concat((0, _toConsumableArray2["default"])(stateSelected || []), [item]);
402
+ value = selected;
403
+ }
404
+
405
+ this.setState({
406
+ selected: selected
407
+ });
408
+
409
+ if (onChange) {
410
+ onChange(value);
411
+ onBlur(value);
412
+ }
413
+ }
414
+ /**
415
+ * Обрабатывает изменение инпута
416
+ * @param newValue - новое значение
417
+ * @private
418
+ */
419
+
420
+ }, {
421
+ key: "handleInputChange",
422
+ value: function handleInputChange(newValue) {
423
+ var _this$props9 = this.props,
424
+ searchByTap = _this$props9.searchByTap,
425
+ onChange = _this$props9.onChange,
426
+ onInput = _this$props9.onInput,
427
+ resetOnBlur = _this$props9.resetOnBlur;
428
+ this.setNewValue(newValue);
429
+
430
+ if (!searchByTap) {
431
+ this.handleDataSearch(newValue);
432
+ }
433
+
434
+ if (!resetOnBlur) {
435
+ onChange(newValue);
436
+ }
437
+
438
+ onInput(newValue);
439
+ }
440
+ /**
441
+ * Обрабатывает поиск по нажатию
442
+ * @private
443
+ */
444
+
445
+ }, {
446
+ key: "handleSearchButton",
447
+ value: function handleSearchButton() {
448
+ var value = this.state.value;
449
+ this.handleDataSearch(value);
450
+ }
451
+ /**
452
+ * Очищает инпут и результаты поиска
453
+ * @private
454
+ */
455
+
456
+ }, {
457
+ key: "clearSearchField",
458
+ value: function clearSearchField() {
459
+ var options = this.props.options;
460
+ this.setState({
461
+ value: '',
462
+ options: options
463
+ });
464
+ }
465
+ /**
466
+ * Обрабатывает выбор элемента из popUp
467
+ * @param item - элемент массива options
468
+ * @private
469
+ */
470
+
471
+ }, {
472
+ key: "handleItemSelect",
473
+ value: function handleItemSelect(item) {
474
+ var closePopupOnSelect = this.props.closePopupOnSelect;
475
+ this.insertSelected(item);
476
+
477
+ if (closePopupOnSelect) {
478
+ this.hideOptionsList();
479
+ }
480
+
481
+ this.clearSearchField();
482
+
483
+ if (this.control) {
484
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
485
+ this.control.focus();
486
+ }
487
+ }
488
+ /**
489
+ * Обрабатывает поведение инпута при потери фокуса, если есть resetOnBlur
490
+ * @private
491
+ */
492
+
493
+ }, {
494
+ key: "handleResetOnBlur",
495
+ value: function handleResetOnBlur() {
496
+ var selected = this.state.selected;
497
+ var _this$props10 = this.props,
498
+ resetOnBlur = _this$props10.resetOnBlur,
499
+ options = _this$props10.options;
500
+
501
+ if (resetOnBlur && !selected) {
502
+ this.setState({
503
+ value: '',
504
+ options: options
505
+ });
506
+ }
507
+ }
508
+ /**
509
+ * Обрабатывает клик за пределы компонента
510
+ * вызывается библиотекой react-onclickoutside
511
+ */
512
+
513
+ }, {
514
+ key: "handleClickOutside",
515
+ value: function handleClickOutside() {
516
+ var _this$props11 = this.props,
517
+ onBlur = _this$props11.onBlur,
518
+ value = _this$props11.value;
519
+ var isExpanded = this.state.isExpanded;
520
+
521
+ if (isExpanded) {
522
+ this.hideOptionsList();
523
+ onBlur(value);
524
+ }
525
+ }
526
+ }, {
527
+ key: "handleOnBlur",
528
+ value: function handleOnBlur(e) {
529
+ e.preventDefault();
530
+ this.handleResetOnBlur();
531
+ }
532
+ }, {
533
+ key: "setControlRef",
534
+ value: function setControlRef(el) {
535
+ this.control = el;
536
+ }
537
+ }, {
538
+ key: "renderPlaceholder",
539
+ value: function renderPlaceholder() {
540
+ var _this$props12 = this.props,
541
+ _this$props12$selectF = _this$props12.selectFormat,
542
+ selectFormat = _this$props12$selectF === void 0 ? 'Объектов {size} шт' : _this$props12$selectF,
543
+ _this$props12$selectF2 = _this$props12.selectFormatOne,
544
+ selectFormatOne = _this$props12$selectF2 === void 0 ? '' : _this$props12$selectF2,
545
+ _this$props12$selectF3 = _this$props12.selectFormatFew,
546
+ selectFormatFew = _this$props12$selectF3 === void 0 ? '' : _this$props12$selectF3,
547
+ _this$props12$selectF4 = _this$props12.selectFormatMany,
548
+ selectFormatMany = _this$props12$selectF4 === void 0 ? '' : _this$props12$selectF4;
549
+ var _this$state2 = this.state,
550
+ selected = _this$state2.selected,
551
+ hasCheckboxes = _this$state2.hasCheckboxes;
552
+ var selectedCount = selected.length;
553
+ var text;
554
+
555
+ if (!(0, _isEmpty["default"])(selectFormatOne) && !(0, _isEmpty["default"])(selectFormatFew) && !(0, _isEmpty["default"])(selectFormatMany) && selectedCount >= 1 && hasCheckboxes) {
556
+ text = (0, _utils.getNoun)(selectedCount, selectFormatOne, selectFormatFew, selectFormatMany).replace('{size}', "".concat(selectedCount));
557
+ } else if (selectedCount >= 1 && hasCheckboxes) {
558
+ text = selectFormat.replace('{size}', "".concat(selectedCount));
559
+ } else {
560
+ text = null;
561
+ }
562
+
563
+ return text;
564
+ }
565
+ }, {
566
+ key: "renderValue",
567
+ value: function renderValue() {
568
+ var _this$props13 = this.props,
569
+ labelFieldId = _this$props13.labelFieldId,
570
+ _this$props13$placeho = _this$props13.placeholder,
571
+ placeholder = _this$props13$placeho === void 0 ? '' : _this$props13$placeho;
572
+ var selected = this.state.selected;
573
+
574
+ if ((0, _isEmpty["default"])(selected)) {
575
+ return placeholder;
576
+ }
577
+
578
+ var _selected = (0, _slicedToArray2["default"])(selected, 1),
579
+ selectedElement = _selected[0];
580
+
581
+ return (0, _get["default"])(selectedElement, labelFieldId);
582
+ }
583
+ }, {
584
+ key: "render",
585
+ value: function render() {
586
+ var _this$props14 = this.props,
587
+ loading = _this$props14.loading,
588
+ className = _this$props14.className,
589
+ valueFieldId = _this$props14.valueFieldId,
590
+ labelFieldId = _this$props14.labelFieldId,
591
+ iconFieldId = _this$props14.iconFieldId,
592
+ disabled = _this$props14.disabled,
593
+ disabledValues = _this$props14.disabledValues,
594
+ enabledFieldId = _this$props14.enabledFieldId,
595
+ imageFieldId = _this$props14.imageFieldId,
596
+ statusFieldId = _this$props14.statusFieldId,
597
+ groupFieldId = _this$props14.groupFieldId,
598
+ descriptionFieldId = _this$props14.descriptionFieldId,
599
+ format = _this$props14.format,
600
+ placeholder = _this$props14.placeholder,
601
+ badge = _this$props14.badge,
602
+ fetchData = _this$props14.fetchData,
603
+ page = _this$props14.page,
604
+ hasSearch = _this$props14.hasSearch,
605
+ cleanable = _this$props14.cleanable,
606
+ style = _this$props14.style;
607
+
608
+ var inputSelectStyle = _objectSpread({
609
+ width: '100%'
610
+ }, style);
611
+
612
+ var _this$state3 = this.state,
613
+ selected = _this$state3.selected,
614
+ isExpanded = _this$state3.isExpanded,
615
+ hasCheckboxes = _this$state3.hasCheckboxes,
616
+ value = _this$state3.value,
617
+ options = _this$state3.options;
618
+ var title = (0, _get["default"])((0, _first["default"])(selected), "".concat(labelFieldId));
619
+ return /*#__PURE__*/_react["default"].createElement("div", {
620
+ className: "n2o-input-select",
621
+ title: title,
622
+ style: inputSelectStyle,
623
+ onBlur: this.handleOnBlur,
624
+ ref: this.n2oSelectRef
625
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
626
+ innerRef: this.setControlRef,
627
+ onClick: this.handleButtonClick
628
+ }, /*#__PURE__*/_react["default"].createElement(_InputSelectGroup.InputSelectGroup, {
629
+ className: className,
630
+ isExpanded: isExpanded,
631
+ loading: loading,
632
+ disabled: disabled,
633
+ iconFieldId: iconFieldId,
634
+ imageFieldId: imageFieldId,
635
+ cleanable: cleanable,
636
+ selected: selected,
637
+ onClearClick: this.clearSelected
638
+ }, /*#__PURE__*/_react["default"].createElement("span", {
639
+ className: "valueText"
640
+ }, hasCheckboxes ? this.renderPlaceholder() : this.renderValue()))), /*#__PURE__*/_react["default"].createElement(_Popup.Popup, {
641
+ isExpanded: isExpanded,
642
+ inputSelect: this.n2oSelectRef.current
643
+ }, /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, hasSearch && /*#__PURE__*/_react["default"].createElement(_SelectInput.N2OSelectInput, {
644
+ placeholder: placeholder || '',
645
+ onChange: this.handleInputChange,
646
+ onSearch: this.handleSearchButton,
647
+ value: value
648
+ }), /*#__PURE__*/_react["default"].createElement(_PopupList.PopupList, {
649
+ options: options,
650
+ valueFieldId: valueFieldId,
651
+ labelFieldId: labelFieldId,
652
+ iconFieldId: iconFieldId,
653
+ imageFieldId: imageFieldId,
654
+ statusFieldId: statusFieldId,
655
+ badge: badge,
656
+ descriptionFieldId: descriptionFieldId,
657
+ enabledFieldId: enabledFieldId,
658
+ onSelect: this.handleItemSelect,
659
+ fetchData: fetchData,
660
+ page: page,
661
+ isExpanded: isExpanded,
662
+ selected: selected,
663
+ disabledValues: disabledValues,
664
+ groupFieldId: groupFieldId,
665
+ hasCheckboxes: hasCheckboxes,
666
+ onRemoveItem: this.removeSelectedItem,
667
+ format: format,
668
+ loading: loading
669
+ }))));
670
+ }
671
+ }]);
672
+ return SelectComponent;
673
+ }(_react["default"].Component);
674
+
675
+ (0, _defineProperty2["default"])(SelectComponent, "defaultProps", {
676
+ cleanable: true,
677
+ valueFieldId: 'id',
678
+ labelFieldId: 'name',
679
+ iconFieldId: 'icon',
680
+ loading: false,
681
+ disabled: false,
682
+ disabledValues: [],
683
+ resetOnBlur: false,
684
+ searchByTap: false,
685
+ hasSearch: false,
686
+ options: [],
687
+ value: {},
688
+ descriptionFieldId: '',
689
+ enabledFieldId: '',
690
+ statusFieldId: '',
691
+ groupFieldId: '',
692
+ imageFieldId: '',
693
+ closePopupOnSelect: true,
694
+ onSearch: function onSearch() {},
695
+ onChange: function onChange() {},
696
+ fetchData: function fetchData() {
697
+ return function () {};
698
+ },
699
+ onInput: function onInput() {},
700
+ onClose: function onClose() {},
701
+ onBlur: function onBlur() {}
702
+ });
703
+ var Select = (0, _reactOnclickoutside["default"])(SelectComponent);
704
+ exports.Select = Select;
705
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnB1dHMvU2VsZWN0L1NlbGVjdC50c3giXSwibmFtZXMiOlsic2VsZWN0VHlwZSIsIlNJTkdMRSIsIkNIRUNLQk9YRVMiLCJnZXRTZWxlY3RlZCIsInZhbHVlIiwiQXJyYXkiLCJpc0FycmF5IiwiU2VsZWN0Q29tcG9uZW50IiwicHJvcHMiLCJpbnB1dCIsImRlbGF5IiwiY2FsbGJhY2siLCJvblNlYXJjaCIsImZpbHRlciIsIm9wdGlvbnMiLCJsYWJlbEZpZWxkSWQiLCJmaWx0ZXJGdW5jIiwiaXRlbSIsIlN0cmluZyIsInByb3RvdHlwZSIsImNhbGwiLCJmaWx0ZXJlZE9wdGlvbnMiLCJ0b1N0cmluZyIsInNldFN0YXRlIiwidHlwZSIsInN0YXRlIiwiaXNFeHBhbmRlZCIsInNlbGVjdGVkIiwiaGFzQ2hlY2tib3hlcyIsImNvbnRyb2wiLCJuMm9TZWxlY3RSZWYiLCJoYW5kbGVCdXR0b25DbGljayIsImJpbmQiLCJoYW5kbGVJbnB1dENoYW5nZSIsImhhbmRsZUlucHV0Rm9jdXMiLCJoaWRlT3B0aW9uc0xpc3QiLCJoYW5kbGVJdGVtU2VsZWN0IiwicmVtb3ZlU2VsZWN0ZWRJdGVtIiwiY2xlYXJTZWxlY3RlZCIsImhhbmRsZVNlYXJjaEJ1dHRvbiIsImhhbmRsZU9uQmx1ciIsInNldENvbnRyb2xSZWYiLCJpbml0aWFsIiwidmFsdWVGaWVsZElkIiwic2V0U3RhdGVGcm9tSW5pdGlhbCIsIm5leHRQcm9wcyIsInByZXZQcm9wcyIsIm1hcE9wdGlvbnMiLCJtYXAiLCJvcHRpb24iLCJOdW1iZXIiLCJpZFR5cGUiLCJvbkNoYW5nZSIsInN0YXRlU2VsZWN0ZWQiLCJpIiwibmV3SXNFeHBhbmRlZCIsImZldGNoRGF0YSIsIm9uQ2xvc2UiLCJvbk9wZW4iLCJwYWdlIiwiZGlzYWJsZWQiLCJjaGFuZ2VQb3BVcFZpc2lvbiIsIm5ld1ZhbHVlIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0Iiwib25CbHVyIiwic2VhcmNoQnlUYXAiLCJvbklucHV0IiwicmVzZXRPbkJsdXIiLCJzZXROZXdWYWx1ZSIsImhhbmRsZURhdGFTZWFyY2giLCJjbG9zZVBvcHVwT25TZWxlY3QiLCJpbnNlcnRTZWxlY3RlZCIsImNsZWFyU2VhcmNoRmllbGQiLCJmb2N1cyIsImhhbmRsZVJlc2V0T25CbHVyIiwiZWwiLCJzZWxlY3RGb3JtYXQiLCJzZWxlY3RGb3JtYXRPbmUiLCJzZWxlY3RGb3JtYXRGZXciLCJzZWxlY3RGb3JtYXRNYW55Iiwic2VsZWN0ZWRDb3VudCIsImxlbmd0aCIsInRleHQiLCJyZXBsYWNlIiwicGxhY2Vob2xkZXIiLCJzZWxlY3RlZEVsZW1lbnQiLCJsb2FkaW5nIiwiY2xhc3NOYW1lIiwiaWNvbkZpZWxkSWQiLCJkaXNhYmxlZFZhbHVlcyIsImVuYWJsZWRGaWVsZElkIiwiaW1hZ2VGaWVsZElkIiwic3RhdHVzRmllbGRJZCIsImdyb3VwRmllbGRJZCIsImRlc2NyaXB0aW9uRmllbGRJZCIsImZvcm1hdCIsImJhZGdlIiwiaGFzU2VhcmNoIiwiY2xlYW5hYmxlIiwic3R5bGUiLCJpbnB1dFNlbGVjdFN0eWxlIiwid2lkdGgiLCJ0aXRsZSIsInJlbmRlclBsYWNlaG9sZGVyIiwicmVuZGVyVmFsdWUiLCJjdXJyZW50IiwiUmVhY3QiLCJDb21wb25lbnQiLCJTZWxlY3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBTUEsVUFBVSxHQUFHO0FBQ2ZDLEVBQUFBLE1BQU0s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ZWxCRSxFQUFBQSxhQUFhLEVBQUUsRUFmRztBQWdCbEJDLEVBQUFBLFlBQVksRUFBRSxFQWhCSTtBQWlCbEJGLEVBQUFBLFlBQVksRUFBRSxFQWpCSTtBQWtCbEJyQixFQUFBQSxrQkFBa0IsRUFBRSxJQWxCRjtBQW1CbEI1RCxFQUFBQSxRQW5Ca0Isc0JBbUJQLENBQUUsQ0FuQks7QUFvQmxCd0MsRUFBQUEsUUFwQmtCLHNCQW9CUCxDQUFFLENBcEJLO0FBcUJsQkksRUFBQUEsU0FBUyxFQUFFO0FBQUEsV0FBTSxZQUFNLENBQUUsQ0FBZDtBQUFBLEdBckJPO0FBc0JsQlksRUFBQUEsT0F0QmtCLHFCQXNCUixDQUFFLENBdEJNO0FBdUJsQlgsRUFBQUEsT0F2QmtCLHFCQXVCUixDQUFFLENBdkJNO0FBd0JsQlMsRUFBQUEsTUF4QmtCLG9CQXdCVCxDQUFFO0FBeEJPLEM7QUF3SW5CLElBQU00QyxNQUFNLEdBQUcscUNBQWV2RyxlQUFmLENBQWYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgRm9jdXNFdmVudCwgUmVmT2JqZWN0LCBjcmVhdGVSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBvbkNsaWNrT3V0c2lkZSBmcm9tICdyZWFjdC1vbmNsaWNrb3V0c2lkZSdcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC9pc0VxdWFsJ1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZ2V0J1xuaW1wb3J0IGZpcnN0IGZyb20gJ2xvZGFzaC9maXJzdCdcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5J1xuaW1wb3J0IGZpbmQgZnJvbSAnbG9kYXNoL2ZpbmQnXG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICdyZWFjdHN0cmFwJ1xuXG5pbXBvcnQgeyBJbnB1dFNlbGVjdEdyb3VwIH0gZnJvbSAnLi4vSW5wdXRTZWxlY3QvSW5wdXRTZWxlY3RHcm91cCdcbmltcG9ydCB7IEZpbHRlciwgVE9wdGlvbiB9IGZyb20gJy4uL0lucHV0U2VsZWN0L3R5cGVzJ1xuaW1wb3J0IHsgQmFkZ2VUeXBlLCBQb3B1cExpc3QgfSBmcm9tICcuLi9JbnB1dFNlbGVjdC9Qb3B1cExpc3QnXG5cbmltcG9ydCB7IGdldE5vdW4gfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgUG9wdXAgfSBmcm9tICcuL1BvcHVwJ1xuaW1wb3J0IHsgTjJPU2VsZWN0SW5wdXQgfSBmcm9tICcuL1NlbGVjdElucHV0J1xuXG4vKipcbiAqIE4yT1NlbGVjdFxuICogQHJlYWN0UHJvcHMge2Jvb2xlYW59IGxvYWRpbmcgLSDRhNC70LDQsyDQsNC90LjQvNCw0YbQuNC4INC30LDQs9GA0YPQt9C60LhcbiAqIEByZWFjdFByb3BzIHthcnJheX0gb3B0aW9ucyAtINC00LDQvdC90YvQtVxuICogQHJlYWN0UHJvcHMge3N0cmluZ30gdmFsdWVGaWVsZElkIC0g0LfQvdCw0YfQtdC90LjQtSDQutC70Y7Rh9CwIHZhbHVlINCyINC00LDQvdC90YvRhVxuICogQHJlYWN0UHJvcHMge3N0cmluZ30gbGFiZWxGaWVsZElkIC0g0LfQvdCw0YfQtdC90LjQtSDQutC70Y7Rh9CwIGxhYmVsINCyINC00LDQvdC90YvRhVxuICogQHJlYWN0UHJvcHMge3N0cmluZ30gaWNvbkZpZWxkSWQgLSDQv9C+0LvQtSDQtNC70Y8g0LjQutC+0L3QutC4XG4gKiBAcmVhY3RQcm9wcyB7c3RyaW5nfSBpbWFnZUZpZWxkSWQgLSDQv9C+0LvQtSDQtNC70Y8g0LrQsNGA0YLQuNC90LrQuFxuICogQHJlYWN0UHJvcHMge3N0cmluZ30gc3RhdHVzRmllbGRJZCAtINC/0L7Qu9C1INC00LvRjyDRgdGC0LDRgtGD0YHQsFxuICogQHJlYWN0UHJvcHMge29iamVjdH0gYmFkZ2UgLSDQtNCw0L3QvdGL0LUg0LTQu9GPINCx0LDQtNC20LBcbiAqIEByZWFjdFByb3BzIHtib29sZWFufSBkaXNhYmxlZCAtINGE0LvQsNCzINC90LXQsNC60YLQuNCy0L3QvtGB0YLQuFxuICogQHJlYWN0UHJvcHMge2FycmF5fSBkaXNhYmxlZFZhbHVlcyAtINC90LXQsNC60YLQuNCy0L3Ri9C1INC00LDQvdC90YvQtVxuICogQHJlYWN0UHJvcHMge3N0cmluZ30gZW5hYmxlZEZpZWxkSWQgLSDQv9C+0LvQtSDQtNC70Y8g0LDQutGC0LjQstC90L7RgdGC0LhcbiAqIEByZWFjdFByb3BzIHtzdHJpbmd9IGZpbHRlciAtINCy0LDRgNC40LDQvdGC0Ysg0YTQuNC70YzRgtGA0LDRhtC40LhcbiAqIEByZWFjdFByb3BzIHtzdHJpbmd9IHZhbHVlIC0g0YLQtdC60YPRidC10LUg0LfQvdCw0YfQtdC90LjQtVxuICogQHJlYWN0UHJvcHMge2Z1bmN0aW9ufSBvbklucHV0IC0gY2FsbGJhY2sg0L/RgNC4INCy0LLQvtC00LUg0LIg0LjQvdC/0YPRglxuICogQHJlYWN0UHJvcHMge2Z1bmN0aW9ufSBvbkNoYW5nZSAtIGNhbGxiYWNrINC/0YDQuCDQstGL0LHQvtGA0LUg0LfQvdCw0YfQtdC90LjRjyDQuNC70Lgg0LLQstC+0LTQtVxuICogQHJlYWN0UHJvcHMge3N0cmluZ30gcGxhY2VIb2xkZXIgLSDQv9C+0LTRgdC60LDQt9C60LAg0LIg0LjQvdC/0YPRgtC1XG4gKiBAcmVhY3RQcm9wcyB7Ym9vbGVhbn0gcmVzZXRPbkJsdXIgLSDRhNC40YfQsCwg0L/RgNC4INC60L7RgtC+0YDQvtC5INGB0LHRgNCw0YHRi9Cy0LDQtdGC0YHRjyDQt9C90LDRh9C10L3QuNC1INC60L7QvdGC0YDQvtC70LAsINC10YHQu9C4INC+0L3QviDQvdC1INCy0YvQsdGA0LDQvdC+INC40LcgcG9wdXBcbiAqIEByZWFjdFByb3BzIHtmdW5jdGlvbn0gb25DbG9zZSAtIGNhbGxiYWNrINC90LAg0LfQsNC60YDRi9GC0LjQtSDQv9C+0L/QsNC/0LBcbiAqIEByZWFjdFByb3BzIHtzdHJpbmd9IGdyb3VwRmllbGRJZCAtINC/0L7Qu9C1INC00LvRjyDQs9GA0YPQv9C/0LjRgNC+0LLQutC4XG4gKiBAcmVhY3RQcm9wcyB7Ym9vbGVhbn0gY2xvc2VQb3B1cE9uU2VsZWN0IC0g0YTQu9Cw0LMg0LfQsNC60YDRi9GC0LjRjyDQv9C+0L/QsNC/0LAg0L/RgNC4INCy0YvQsdC+0YDQtVxuICogQHJlYWN0UHJvcHMge2Jvb2xlYW59IGhhc0NoZWNrYm94ZXMgLSDRhNC70LDQsyDQvdCw0LvQuNGH0LjRjyDRh9C10LrQsdC+0LrRgdC+0LJcbiAqIEByZWFjdFByb3BzIHtzdHJpbmd9IGZvcm1hdCAtINGE0L7RgNC80LDRglxuICogQHJlYWN0UHJvcHMge2Jvb2xlYW59IHNlYXJjaEJ5VGFwIC0g0L/QvtC40YHQuiDQv9C+INC90LDQttCw0YLQuNGOINC60L3QvtC/0LrQuFxuICovXG5cbmNvbnN0IHNlbGVjdFR5cGUgPSB7XG4gICAgU0lOR0xFOiAnc2luZ2xlJyxcbiAgICBDSEVDS0JPWEVTOiAnY2hlY2tib3hlcycsXG59XG5cbnR5cGUgU3RhdGUgPSB7XG4gICAgaGFzQ2hlY2tib3hlczogYm9vbGVhbixcbiAgICBpbnB1dD86IHN0cmluZ1xuICAgIGlzRXhwYW5kZWQ6IGJvb2xlYW4sXG4gICAgb3B0aW9ucz86IFRPcHRpb25bXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHNlbGVjdGVkOiBhbnlbXVxuICAgIHZhbHVlOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0ZWQodmFsdWU6IFByb3BzWyd2YWx1ZSddKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICBpZiAoIWlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBbdmFsdWVdXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG59XG5cbmNsYXNzIFNlbGVjdENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxQcm9wcywgU3RhdGU+IHtcbiAgICBwcml2YXRlIGNvbnRyb2w6IG51bGwgfCBIVE1MQnV0dG9uRWxlbWVudCA9IG51bGxcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbjJvU2VsZWN0UmVmOiBSZWZPYmplY3Q8YW55PlxuXG4gICAgY29uc3RydWN0b3IocHJvcHM6IFByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKVxuICAgICAgICBjb25zdCB7IHZhbHVlLCBvcHRpb25zLCB0eXBlIH0gPSB0aGlzLnByb3BzXG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIGlzRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHNlbGVjdGVkOiBnZXRTZWxlY3RlZCh2YWx1ZSksXG4gICAgICAgICAgICBoYXNDaGVja2JveGVzOiB0eXBlID09PSBzZWxlY3RUeXBlLkNIRUNLQk9YRVMsXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2wgPSBudWxsXG4gICAgICAgIHRoaXMubjJvU2VsZWN0UmVmID0gY3JlYXRlUmVmKClcblxuICAgICAgICB0aGlzLmhhbmRsZUJ1dHRvbkNsaWNrID0gdGhpcy5oYW5kbGVCdXR0b25DbGljay5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2UgPSB0aGlzLmhhbmRsZUlucHV0Q2hhbmdlLmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5oYW5kbGVJbnB1dEZvY3VzID0gdGhpcy5oYW5kbGVJbnB1dEZvY3VzLmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5oaWRlT3B0aW9uc0xpc3QgPSB0aGlzLmhpZGVPcHRpb25zTGlzdC5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMuaGFuZGxlSXRlbVNlbGVjdCA9IHRoaXMuaGFuZGxlSXRlbVNlbGVjdC5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRJdGVtID0gdGhpcy5yZW1vdmVTZWxlY3RlZEl0ZW0uYmluZCh0aGlzKVxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0ZWQgPSB0aGlzLmNsZWFyU2VsZWN0ZWQuYmluZCh0aGlzKVxuICAgICAgICB0aGlzLmhhbmRsZVNlYXJjaEJ1dHRvbiA9IHRoaXMuaGFuZGxlU2VhcmNoQnV0dG9uLmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5oYW5kbGVPbkJsdXIgPSB0aGlzLmhhbmRsZU9uQmx1ci5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMuc2V0Q29udHJvbFJlZiA9IHRoaXMuc2V0Q29udHJvbFJlZi5iaW5kKHRoaXMpXG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGNvbnN0IHsgaW5pdGlhbCwgb3B0aW9ucywgdmFsdWVGaWVsZElkIH0gPSB0aGlzLnByb3BzXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdGlhbCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGVGcm9tSW5pdGlhbChpbml0aWFsLCBvcHRpb25zLCB2YWx1ZUZpZWxkSWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tZGVwcmVjYXRlZFxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBQcm9wcykge1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMgfSA9IHRoaXMucHJvcHNcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7fSBhcyBTdGF0ZVxuXG4gICAgICAgIGlmICghaXNFcXVhbChvcHRpb25zLCBuZXh0UHJvcHMub3B0aW9ucykpIHtcbiAgICAgICAgICAgIHN0YXRlLm9wdGlvbnMgPSBuZXh0UHJvcHMub3B0aW9uc1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoc3RhdGUpXG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogUHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBpbml0aWFsLCBvcHRpb25zLCB2YWx1ZUZpZWxkSWQsIHZhbHVlIH0gPSB0aGlzLnByb3BzXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdGlhbCkgJiYgIWlzRXF1YWwoaW5pdGlhbCwgcHJldlByb3BzLmluaXRpYWwpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlRnJvbUluaXRpYWwoaW5pdGlhbCwgb3B0aW9ucywgdmFsdWVGaWVsZElkKVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwodmFsdWUsIHByZXZQcm9wcy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBnZXRTZWxlY3RlZCh2YWx1ZSksXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KXQsNC6INC00LvRjyDQvNCw0L/QuNC90LPQsCDQsNC50LTQuNGI0L3QuNC60L7Qsiwg0LrQvtGC0L7RgNGL0LUg0LHQtdGA0YPRgtGB0Y8g0LjQtyDQsNC00YDQtdGB0L3QvtC5INGB0YLRgNC+0LrQuCDQsiDQstC40LTQtSDRgdGC0YDQvtC6LCDQvdC+INC+0LbQuNC00LDQtdGC0YHRjyDRh9C40YHQu9C+XG4gICAgICogVE9ETyDRg9C00LDQu9C40YLRjCDQv9C+0YHQu9C1INGC0L7Qs9C+LCDQutCw0Log0L/QvtGH0LjQvdC40YLRgdGPINC/0L7QstC10LTQtdC90LjQtSDQv9Cw0YDRgdC40L3Qs9CwINCw0LTRgNC10YHQvdC+0Lkg0YHRgtGA0L7QutC4INCx0YPQtNC10YIg0L7Qv9C40YDQsNGC0YzRgdGPINC90LAg0YPQutCw0LfQsNC90L3Ri9C1INGC0LjQv9GLXG4gICAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gW2luaXRpYWxdXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVGaWVsZElkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRTdGF0ZUZyb21Jbml0aWFsKGluaXRpYWw6IFByb3BzWydvcHRpb25zJ10sIG9wdGlvbnM6IFByb3BzWydvcHRpb25zJ10sIHZhbHVlRmllbGRJZDogUHJvcHNbJ3ZhbHVlRmllbGRJZCddKSB7XG4gICAgICAgIGNvbnN0IG1hcE9wdGlvbnMgPSAob3B0aW9uczogUHJvcHNbJ29wdGlvbnMnXSwgdHlwZSA9ICdzdHJpbmcnKSA9PiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIC4uLntcbiAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZElkXTpcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICAgICAgICAgID8gTnVtYmVyKG9wdGlvblt2YWx1ZUZpZWxkSWQgYXMga2V5b2YgVE9wdGlvbl0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhvcHRpb25bdmFsdWVGaWVsZElkIGFzIGtleW9mIFRPcHRpb25dKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pKVxuXG4gICAgICAgIGlmIChpc0VtcHR5KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogbWFwT3B0aW9ucyhpbml0aWFsKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZFR5cGUgPSB0eXBlb2Ygb3B0aW9uW3ZhbHVlRmllbGRJZCBhcyBrZXlvZiBUT3B0aW9uXVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmQobWFwT3B0aW9ucyhpbml0aWFsLCBpZFR5cGUpLCBvcHRpb24pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9C00LDQu9GP0LXRgiDRjdC70LXQvNC10L3RgiDQuNC3INGB0L/QuNGB0LrQsCDQstGL0LHRgNCw0L3QvdGL0YVcbiAgICAgKiBAcGFyYW0gaXRlbSAtINGN0LvQtdC80LXQvdGCXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZW1vdmVTZWxlY3RlZEl0ZW0oaXRlbTogVE9wdGlvbikge1xuICAgICAgICBjb25zdCB7IHZhbHVlRmllbGRJZCwgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHNcbiAgICAgICAgY29uc3QgeyBzZWxlY3RlZDogc3RhdGVTZWxlY3RlZCB9ID0gdGhpcy5zdGF0ZVxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHR5cGVvZiBzdGF0ZVNlbGVjdGVkICE9PSAnc3RyaW5nJyA/IHN0YXRlU2VsZWN0ZWQuZmlsdGVyKFxuICAgICAgICAgICAgaSA9PiBpW3ZhbHVlRmllbGRJZF0gIT09IGl0ZW1bdmFsdWVGaWVsZElkIGFzIGtleW9mIFRPcHRpb25dLFxuICAgICAgICApIDogc3RhdGVTZWxlY3RlZFxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgb25DaGFuZ2Uoc2VsZWN0ZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQmNC30LzQtdC90LXQvdC40LUg0LLQuNC00LjQvNC+0YHRgtC4INC/0L7Qv9Cw0L/QsFxuICAgICAqIEBwYXJhbSBuZXdJc0V4cGFuZGVkIC0g0L3QvtCy0L7QtSDQt9C90LDRh9C10L3QuNC1INCy0LjQtNC40LzQvtGB0YLQuFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY2hhbmdlUG9wVXBWaXNpb24obmV3SXNFeHBhbmRlZDogU3RhdGVbJ2lzRXhwYW5kZWQnXSkge1xuICAgICAgICBjb25zdCB7IGZldGNoRGF0YSwgb25DbG9zZSB9ID0gdGhpcy5wcm9wc1xuICAgICAgICBjb25zdCB7IGlzRXhwYW5kZWQgfSA9IHRoaXMuc3RhdGVcblxuICAgICAgICBpZiAoaXNFeHBhbmRlZCA9PT0gbmV3SXNFeHBhbmRlZCkgeyByZXR1cm4gfVxuXG4gICAgICAgIGNvbnN0IG9uT3BlbiA9IGZldGNoRGF0YSh7IHBhZ2U6IDEgfSlcblxuICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlzRXhwYW5kZWQ6IG5ld0lzRXhwYW5kZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV3SXNFeHBhbmRlZCA/IG9uT3BlbiA6IG9uQ2xvc2UsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0L3QsNC20LDRgtC40LUg0L3QsCDQutC90L7Qv9C60YNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGhhbmRsZUJ1dHRvbkNsaWNrKCkge1xuICAgICAgICBjb25zdCB7IGRpc2FibGVkIH0gPSB0aGlzLnByb3BzXG4gICAgICAgIGNvbnN0IHsgaXNFeHBhbmRlZCB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUG9wVXBWaXNpb24oIWlzRXhwYW5kZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0YTQvtGA0LrRg9GBINC90LAg0LjQvdC/0YPRgtC1XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBoYW5kbGVJbnB1dEZvY3VzKCkge1xuICAgICAgICB0aGlzLmNoYW5nZVBvcFVwVmlzaW9uKHRydWUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQutGA0YvQstCw0LXRgiBwb3BVcFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaGlkZU9wdGlvbnNMaXN0KCkge1xuICAgICAgICB0aGlzLmNoYW5nZVBvcFVwVmlzaW9uKGZhbHNlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0LLQvdCw0LLQu9C40LLQsNC10YIg0L3QvtCy0L7QtSDQt9C90LDRh9C10L3QuNC1INC40L3Qv9GD0YLQsFxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSAtINC90L7QstC+0LUg0LfQvdCw0YfQtdC90LjQtVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0TmV3VmFsdWUobmV3VmFsdWU6IFN0YXRlWyd2YWx1ZSddKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0LTQsNC70Y/QtdGCINCy0YvQsdGA0LDQvdC90YvQtSDRjdC70LXQvNC10L3RgtGLXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhclNlbGVjdGVkKGU6IEV2ZW50KSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgY29uc3QgeyBkaXNhYmxlZCwgb25DaGFuZ2UsIG9uQmx1ciB9ID0gdGhpcy5wcm9wc1xuXG4gICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiBbXSxcbiAgICAgICAgfSlcbiAgICAgICAgb25DaGFuZ2UobnVsbClcbiAgICAgICAgb25CbHVyKG51bGwpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRi9C/0L7Qu9C90Y/QtdGCINC/0L7QuNGB0Log0Y3Qu9C10LzQtdC90YLQvtCyINC00LvRjyBwb3BVcCwg0LXRgdC70Lgg0YPRgdGC0LDQvdC+0LLQu9C10L0g0YTQuNC70YzRgtGAXG4gICAgICogQHBhcmFtIGlucHV0IC0g0LfQvdCw0YfQtdC90LjQtSDQtNC70Y8g0L/QvtC40YHQutCwXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZWxheVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBoYW5kbGVEYXRhU2VhcmNoOiBQcm9wc1snb25TZWFyY2gnXSA9IChpbnB1dCwgZGVsYXksIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb25TZWFyY2gsIGZpbHRlciwgb3B0aW9ucywgbGFiZWxGaWVsZElkIH0gPSB0aGlzLnByb3BzXG5cbiAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckZ1bmMgPSAoaXRlbTogVE9wdGlvbikgPT4gKFN0cmluZy5wcm90b3R5cGVbZmlsdGVyIGFzIGFueV0gYXMgYW55KS5jYWxsKGl0ZW0sIGlucHV0KVxuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gb3B0aW9ucy5maWx0ZXIoaXRlbSA9PiBmaWx0ZXJGdW5jKGl0ZW1bbGFiZWxGaWVsZElkIGFzIGtleW9mIFRPcHRpb25dLnRvU3RyaW5nKCkpKVxuXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvblNlYXJjaChpbnB1dCwgZGVsYXkgPT09IGZhbHNlID8gZGVsYXkgOiB0cnVlLCBjYWxsYmFjaylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINCy0YvQsdGA0LDQvdC90YvQuSDRjdC70LXQvNC10L3RglxuICAgICAqIEBwYXJhbSBpdGVtIC0g0Y3Qu9C10LzQtdC90YIg0LzQsNGB0YHQuNCy0LAgb3B0aW9uc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaW5zZXJ0U2VsZWN0ZWQoaXRlbTogVE9wdGlvbikge1xuICAgICAgICBjb25zdCB7IG9uQ2hhbmdlLCBvbkJsdXIgfSA9IHRoaXMucHJvcHNcbiAgICAgICAgY29uc3QgeyBzZWxlY3RlZDogc3RhdGVTZWxlY3RlZCwgaGFzQ2hlY2tib3hlcyB9ID0gdGhpcy5zdGF0ZVxuICAgICAgICBsZXQgc2VsZWN0ZWQgPSBbaXRlbV1cbiAgICAgICAgbGV0IHZhbHVlOiBUT3B0aW9uIHwgVE9wdGlvbltdID0gaXRlbVxuXG4gICAgICAgIGlmIChoYXNDaGVja2JveGVzKSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IFsuLi4oc3RhdGVTZWxlY3RlZCB8fCBbXSksIGl0ZW1dXG4gICAgICAgICAgICB2YWx1ZSA9IHNlbGVjdGVkXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgb25DaGFuZ2UodmFsdWUpXG4gICAgICAgICAgICBvbkJsdXIodmFsdWUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0LjQt9C80LXQvdC10L3QuNC1INC40L3Qv9GD0YLQsFxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSAtINC90L7QstC+0LUg0LfQvdCw0YfQtdC90LjQtVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaGFuZGxlSW5wdXRDaGFuZ2UobmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCB7IHNlYXJjaEJ5VGFwLCBvbkNoYW5nZSwgb25JbnB1dCwgcmVzZXRPbkJsdXIgfSA9IHRoaXMucHJvcHNcblxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKVxuXG4gICAgICAgIGlmICghc2VhcmNoQnlUYXApIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGF0YVNlYXJjaChuZXdWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc2V0T25CbHVyKSB7XG4gICAgICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgICBvbklucHV0KG5ld1ZhbHVlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiDQv9C+0LjRgdC6INC/0L4g0L3QsNC20LDRgtC40Y5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGhhbmRsZVNlYXJjaEJ1dHRvbigpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgICAgIHRoaXMuaGFuZGxlRGF0YVNlYXJjaCh2YWx1ZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGH0LjRidCw0LXRgiDQuNC90L/Rg9GCINC4INGA0LXQt9GD0LvRjNGC0LDRgtGLINC/0L7QuNGB0LrQsFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY2xlYXJTZWFyY2hGaWVsZCgpIHtcbiAgICAgICAgY29uc3QgeyBvcHRpb25zIH0gPSB0aGlzLnByb3BzXG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiDQstGL0LHQvtGAINGN0LvQtdC80LXQvdGC0LAg0LjQtyBwb3BVcFxuICAgICAqIEBwYXJhbSBpdGVtIC0g0Y3Qu9C10LzQtdC90YIg0LzQsNGB0YHQuNCy0LAgb3B0aW9uc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaGFuZGxlSXRlbVNlbGVjdChpdGVtOiBUT3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VQb3B1cE9uU2VsZWN0IH0gPSB0aGlzLnByb3BzXG5cbiAgICAgICAgdGhpcy5pbnNlcnRTZWxlY3RlZChpdGVtKVxuXG4gICAgICAgIGlmIChjbG9zZVBvcHVwT25TZWxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU9wdGlvbnNMaXN0KClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2hGaWVsZCgpXG5cbiAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICh0aGlzLmNvbnRyb2wgYXMgYW55KS5mb2N1cygpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0L/QvtCy0LXQtNC10L3QuNC1INC40L3Qv9GD0YLQsCDQv9GA0Lgg0L/QvtGC0LXRgNC4INGE0L7QutGD0YHQsCwg0LXRgdC70Lgg0LXRgdGC0YwgcmVzZXRPbkJsdXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGhhbmRsZVJlc2V0T25CbHVyKCkge1xuICAgICAgICBjb25zdCB7IHNlbGVjdGVkIH0gPSB0aGlzLnN0YXRlXG4gICAgICAgIGNvbnN0IHsgcmVzZXRPbkJsdXIsIG9wdGlvbnMgfSA9IHRoaXMucHJvcHNcblxuICAgICAgICBpZiAocmVzZXRPbkJsdXIgJiYgIXNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0LrQu9C40Log0LfQsCDQv9GA0LXQtNC10LvRiyDQutC+0LzQv9C+0L3QtdC90YLQsFxuICAgICAqINCy0YvQt9GL0LLQsNC10YLRgdGPINCx0LjQsdC70LjQvtGC0LXQutC+0LkgcmVhY3Qtb25jbGlja291dHNpZGVcbiAgICAgKi9cbiAgICBoYW5kbGVDbGlja091dHNpZGUoKSB7XG4gICAgICAgIGNvbnN0IHsgb25CbHVyLCB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgICAgICBjb25zdCB7IGlzRXhwYW5kZWQgfSA9IHRoaXMuc3RhdGVcblxuICAgICAgICBpZiAoaXNFeHBhbmRlZCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlT3B0aW9uc0xpc3QoKVxuICAgICAgICAgICAgb25CbHVyKHZhbHVlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT25CbHVyKGU6IEZvY3VzRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICB0aGlzLmhhbmRsZVJlc2V0T25CbHVyKClcbiAgICB9XG5cbiAgICBzZXRDb250cm9sUmVmKGVsOiBIVE1MQnV0dG9uRWxlbWVudCkge1xuICAgICAgICB0aGlzLmNvbnRyb2wgPSBlbFxuICAgIH1cblxuICAgIHJlbmRlclBsYWNlaG9sZGVyKCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBzZWxlY3RGb3JtYXQgPSAn0J7QsdGK0LXQutGC0L7QsiB7c2l6ZX0g0YjRgicsXG4gICAgICAgICAgICBzZWxlY3RGb3JtYXRPbmUgPSAnJyxcbiAgICAgICAgICAgIHNlbGVjdEZvcm1hdEZldyA9ICcnLFxuICAgICAgICAgICAgc2VsZWN0Rm9ybWF0TWFueSA9ICcnLFxuICAgICAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgICAgIGNvbnN0IHsgc2VsZWN0ZWQsIGhhc0NoZWNrYm94ZXMgfSA9IHRoaXMuc3RhdGVcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHNlbGVjdGVkLmxlbmd0aFxuICAgICAgICBsZXQgdGV4dFxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc0VtcHR5KHNlbGVjdEZvcm1hdE9uZSkgJiZcbiAgICAgICAgICAgICFpc0VtcHR5KHNlbGVjdEZvcm1hdEZldykgJiZcbiAgICAgICAgICAgICFpc0VtcHR5KHNlbGVjdEZvcm1hdE1hbnkpICYmXG4gICAgICAgICAgICBzZWxlY3RlZENvdW50ID49IDEgJiZcbiAgICAgICAgICAgIGhhc0NoZWNrYm94ZXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0ZXh0ID0gZ2V0Tm91bihcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENvdW50LFxuICAgICAgICAgICAgICAgIHNlbGVjdEZvcm1hdE9uZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RGb3JtYXRGZXcsXG4gICAgICAgICAgICAgICAgc2VsZWN0Rm9ybWF0TWFueSxcbiAgICAgICAgICAgICkucmVwbGFjZSgne3NpemV9JywgYCR7c2VsZWN0ZWRDb3VudH1gKVxuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ291bnQgPj0gMSAmJiBoYXNDaGVja2JveGVzKSB7XG4gICAgICAgICAgICB0ZXh0ID0gc2VsZWN0Rm9ybWF0LnJlcGxhY2UoJ3tzaXplfScsIGAke3NlbGVjdGVkQ291bnR9YClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIHJlbmRlclZhbHVlKCkge1xuICAgICAgICBjb25zdCB7IGxhYmVsRmllbGRJZCwgcGxhY2Vob2xkZXIgPSAnJyB9ID0gdGhpcy5wcm9wc1xuICAgICAgICBjb25zdCB7IHNlbGVjdGVkIH0gPSB0aGlzLnN0YXRlXG5cbiAgICAgICAgaWYgKGlzRW1wdHkoc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXJcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtzZWxlY3RlZEVsZW1lbnRdID0gc2VsZWN0ZWRcblxuICAgICAgICByZXR1cm4gZ2V0KHNlbGVjdGVkRWxlbWVudCwgbGFiZWxGaWVsZElkKVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbG9hZGluZyxcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgIHZhbHVlRmllbGRJZCxcbiAgICAgICAgICAgIGxhYmVsRmllbGRJZCxcbiAgICAgICAgICAgIGljb25GaWVsZElkLFxuICAgICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgICBkaXNhYmxlZFZhbHVlcyxcbiAgICAgICAgICAgIGVuYWJsZWRGaWVsZElkLFxuICAgICAgICAgICAgaW1hZ2VGaWVsZElkLFxuICAgICAgICAgICAgc3RhdHVzRmllbGRJZCxcbiAgICAgICAgICAgIGdyb3VwRmllbGRJZCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uRmllbGRJZCxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgYmFkZ2UsXG4gICAgICAgICAgICBmZXRjaERhdGEsXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgaGFzU2VhcmNoLFxuICAgICAgICAgICAgY2xlYW5hYmxlLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgIH0gPSB0aGlzLnByb3BzXG4gICAgICAgIGNvbnN0IGlucHV0U2VsZWN0U3R5bGUgPSB7IHdpZHRoOiAnMTAwJScsIC4uLnN0eWxlIH1cblxuICAgICAgICBjb25zdCB7IHNlbGVjdGVkLCBpc0V4cGFuZGVkLCBoYXNDaGVja2JveGVzLCB2YWx1ZSwgb3B0aW9ucyB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZ2V0KGZpcnN0KHNlbGVjdGVkKSwgYCR7bGFiZWxGaWVsZElkfWApXG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJuMm8taW5wdXQtc2VsZWN0XCJcbiAgICAgICAgICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICAgICAgICAgICAgc3R5bGU9e2lucHV0U2VsZWN0U3R5bGV9XG4gICAgICAgICAgICAgICAgb25CbHVyPXt0aGlzLmhhbmRsZU9uQmx1cn1cbiAgICAgICAgICAgICAgICByZWY9e3RoaXMubjJvU2VsZWN0UmVmfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gaW5uZXJSZWY9e3RoaXMuc2V0Q29udHJvbFJlZn0gb25DbGljaz17dGhpcy5oYW5kbGVCdXR0b25DbGlja30+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFNlbGVjdEdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRXhwYW5kZWQ9e2lzRXhwYW5kZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkZpZWxkSWQ9e2ljb25GaWVsZElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGaWVsZElkPXtpbWFnZUZpZWxkSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhbmFibGU9e2NsZWFuYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xlYXJDbGljaz17dGhpcy5jbGVhclNlbGVjdGVkfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ2YWx1ZVRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoZWNrYm94ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJQbGFjZWhvbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMucmVuZGVyVmFsdWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9JbnB1dFNlbGVjdEdyb3VwPlxuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDxQb3B1cCBpc0V4cGFuZGVkPXtpc0V4cGFuZGVkfSBpbnB1dFNlbGVjdD17dGhpcy5uMm9TZWxlY3RSZWYuY3VycmVudH0+XG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aGFzU2VhcmNoICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TjJPU2VsZWN0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyIHx8ICcnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWFyY2g9e3RoaXMuaGFuZGxlU2VhcmNoQnV0dG9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8UG9wdXBMaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUZpZWxkSWQ9e3ZhbHVlRmllbGRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEZpZWxkSWQ9e2xhYmVsRmllbGRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uRmllbGRJZD17aWNvbkZpZWxkSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGaWVsZElkPXtpbWFnZUZpZWxkSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzRmllbGRJZD17c3RhdHVzRmllbGRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZT17YmFkZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25GaWVsZElkPXtkZXNjcmlwdGlvbkZpZWxkSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZEZpZWxkSWQ9e2VuYWJsZWRGaWVsZElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLmhhbmRsZUl0ZW1TZWxlY3R9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hEYXRhPXtmZXRjaERhdGF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZT17cGFnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXtpc0V4cGFuZGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFZhbHVlcz17ZGlzYWJsZWRWYWx1ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZElkPXtncm91cEZpZWxkSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2hlY2tib3hlcz17aGFzQ2hlY2tib3hlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblJlbW92ZUl0ZW09e3RoaXMucmVtb3ZlU2VsZWN0ZWRJdGVtfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD17Zm9ybWF0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICA8L1BvcHVwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjbGVhbmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlRmllbGRJZDogJ2lkJyxcbiAgICAgICAgbGFiZWxGaWVsZElkOiAnbmFtZScsXG4gICAgICAgIGljb25GaWVsZElkOiAnaWNvbicsXG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIGRpc2FibGVkVmFsdWVzOiBbXSxcbiAgICAgICAgcmVzZXRPbkJsdXI6IGZhbHNlLFxuICAgICAgICBzZWFyY2hCeVRhcDogZmFsc2UsXG4gICAgICAgIGhhc1NlYXJjaDogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICB2YWx1ZToge30sXG4gICAgICAgIGRlc2NyaXB0aW9uRmllbGRJZDogJycsXG4gICAgICAgIGVuYWJsZWRGaWVsZElkOiAnJyxcbiAgICAgICAgc3RhdHVzRmllbGRJZDogJycsXG4gICAgICAgIGdyb3VwRmllbGRJZDogJycsXG4gICAgICAgIGltYWdlRmllbGRJZDogJycsXG4gICAgICAgIGNsb3NlUG9wdXBPblNlbGVjdDogdHJ1ZSxcbiAgICAgICAgb25TZWFyY2goKSB7fSxcbiAgICAgICAgb25DaGFuZ2UoKSB7fSxcbiAgICAgICAgZmV0Y2hEYXRhOiAoKSA9PiAoKSA9PiB7fSxcbiAgICAgICAgb25JbnB1dCgpIHt9LFxuICAgICAgICBvbkNsb3NlKCkge30sXG4gICAgICAgIG9uQmx1cigpIHt9LFxuICAgIH0gYXMgUHJvcHNcbn1cblxudHlwZSBQcm9wcyA9IHtcbiAgICAvKipcbiAgICAgKiDQlNCw0L3QvdGL0LUg0LTQu9GPIGJhZGdlXG4gICAgICovXG4gICAgYmFkZ2U/OiBCYWRnZVR5cGUsXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nLFxuICAgIGNsZWFuYWJsZTogYm9vbGVhbixcbiAgICBjbG9zZVBvcHVwT25TZWxlY3Q6IGJvb2xlYW4sXG4gICAgZGVzY3JpcHRpb25GaWVsZElkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog0KTQu9Cw0LMg0LDQutGC0LjQstC90L7RgdGC0LhcbiAgICAgKi9cbiAgICBkaXNhYmxlZDogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiDQndC10LDQutGC0LjQstC90YvQtSDQtNCw0L3QvdGL0LVcbiAgICAgKi9cbiAgICBkaXNhYmxlZFZhbHVlczogW10sXG4gICAgLyoqXG4gICAgICog0JrQu9GO0YcgZW5hYmxlZCDQsiDQtNCw0L3QvdGL0YVcbiAgICAgKi9cbiAgICBlbmFibGVkRmllbGRJZDogc3RyaW5nLFxuICAgIGZldGNoRGF0YShhcmc6IG9iamVjdCk6ICgpID0+IHZvaWQsXG4gICAgLyoqXG4gICAgICog0KTQuNC70YzRgtGA0LDRhtC40Y9cbiAgICAgKi9cbiAgICBmaWx0ZXI/OiBGaWx0ZXIsXG4gICAgLyoqXG4gICAgICog0KTQvtGA0LzQsNGCXG4gICAgICovXG4gICAgZm9ybWF0Pzogc3RyaW5nLFxuICAgIGdyb3VwRmllbGRJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqINCk0LvQsNCzINC90LDQu9C40YfQuNGPINC/0L7QuNGB0LrQsFxuICAgICAqL1xuICAgIGhhc1NlYXJjaDogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiDQmtC70Y7RhyBpY29uINCyINC00LDQvdC90YvRhVxuICAgICAqL1xuICAgIGljb25GaWVsZElkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog0JrQu9GO0YcgaW1hZ2Ug0LIg0LTQsNC90L3Ri9GFXG4gICAgICovXG4gICAgaW1hZ2VGaWVsZElkOiBzdHJpbmcsXG4gICAgaW5pdGlhbD86IHN0cmluZyB8IG51bWJlcixcbiAgICAvKipcbiAgICAgKiDQmtC70Y7RhyBsYWJlbCDQsiDQtNCw0L3QvdGL0YVcbiAgICAgKi9cbiAgICBsYWJlbEZpZWxkSWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDQpNC70LDQsyDQt9Cw0LPRgNGD0LfQutC4XG4gICAgICovXG4gICAgbG9hZGluZzogYm9vbGVhbixcbiAgICBvbkJsdXIoYXJnOiBQcm9wc1sndmFsdWUnXSk6IHZvaWQsXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sg0L3QsCDQuNC30LzQtdC90LXQvdC40LVcbiAgICAgKi9cbiAgICBvbkNoYW5nZShhcmc6IFRPcHRpb24gfCBUT3B0aW9uW10gfCBudWxsIHwgc3RyaW5nKTogdm9pZCxcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayDQvdCwINC30LDQutGA0YvRgtC40LUg0L/QvtC/0LDQv9CwXG4gICAgICovXG4gICAgb25DbG9zZSgpOiB2b2lkLFxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrINC/0YDQuCDQstCy0L7QtNC1INCyINC40L3Qv9GD0YJcbiAgICAgKi9cbiAgICBvbklucHV0KGlucHV0OiBzdHJpbmcpOiB2b2lkLFxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrINC90LAg0L/QvtC40YHQulxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25TZWFyY2goaW5wdXQ6IFN0YXRlWydpbnB1dCddLCBkZWxheT86IGJvb2xlYW4sIGNhbGxiYWNrPzogYW55KTogdm9pZCxcbiAgICAvKipcbiAgICAgKiDQlNCw0L3QvdGL0LVcbiAgICAgKi9cbiAgICBvcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcGFnZT86IG51bWJlcixcbiAgICAvKipcbiAgICAgKiBQbGFjZWhvbGRlciDQutC+0L3RgtGA0L7Qu9CwXG4gICAgICovXG4gICAgcGxhY2Vob2xkZXI/OiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog0KHQsdGA0L7RgSDQt9C90LDRh9C10L3QuNGPINC/0YDQuCDQv9C+0YLQtdGA0LUg0YTQvtC60YPRgdCwXG4gICAgICovXG4gICAgcmVzZXRPbkJsdXI6IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICog0J/QvtC40YHQuiDQv9C+INC90LDQttCw0YLQuNGOINC60L3QvtC/0LrQuFxuICAgICAqL1xuICAgIHNlYXJjaEJ5VGFwOiBib29sZWFuLFxuICAgIHNlbGVjdEZvcm1hdD86IHN0cmluZyxcbiAgICBzZWxlY3RGb3JtYXRGZXc/OiBzdHJpbmcsXG4gICAgc2VsZWN0Rm9ybWF0TWFueT86IHN0cmluZyxcbiAgICBzZWxlY3RGb3JtYXRPbmU/OiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog0JrQu9GO0YcgaW1hZ2Ug0LIg0LTQsNC90L3Ri9GFXG4gICAgICovXG4gICAgc3RhdHVzRmllbGRJZDogc3RyaW5nLFxuICAgIHN0eWxlPzogb2JqZWN0LFxuICAgIHR5cGU/OiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog0JfQvdCw0YfQtdC90LjQtVxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdmFsdWU6IGFueSxcbiAgICAvKipcbiAgICAgKiDQmtC70Y7RhyBpZCDQsiDQtNCw0L3QvdGL0YVcbiAgICAgKi9cbiAgICB2YWx1ZUZpZWxkSWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2VsZWN0ID0gb25DbGlja091dHNpZGUoU2VsZWN0Q29tcG9uZW50KVxuIl19