advanced.reporting.asset.php
1 month ago
advanced.reporting.js
1 month ago
calculated.field.asset.php
1 month ago
calculated.field.js
1 month ago
conditional.block.asset.php
1 month ago
conditional.block.js
1 month ago
dynamic.value.asset.php
1 month ago
dynamic.value.js
1 month ago
main.asset.php
1 month ago
main.css
1 month ago
main.js
1 month ago
media.field.asset.php
1 month ago
media.field.js
1 month ago
media.field.restrictions.asset.php
1 month ago
media.field.restrictions.js
1 month ago
multi.step.asset.php
1 month ago
multi.step.js
1 month ago
dynamic.value.js
444 lines
| 1 | /******/ (() => { // webpackBootstrap |
| 2 | /******/ "use strict"; |
| 3 | /******/ var __webpack_modules__ = ({ |
| 4 | |
| 5 | /***/ "./frontend/dynamic.value/BaseReactiveProperty.js" |
| 6 | /*!********************************************************!*\ |
| 7 | !*** ./frontend/dynamic.value/BaseReactiveProperty.js ***! |
| 8 | \********************************************************/ |
| 9 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 10 | |
| 11 | __webpack_require__.r(__webpack_exports__); |
| 12 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 13 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) |
| 14 | /* harmony export */ }); |
| 15 | const { |
| 16 | CalculatedFormula |
| 17 | } = JetFormBuilderAbstract; |
| 18 | function BaseReactiveProperty(name = '') { |
| 19 | this.attrName = name; |
| 20 | } |
| 21 | BaseReactiveProperty.prototype = { |
| 22 | /** |
| 23 | * Name of data attribute |
| 24 | */ |
| 25 | attrName: '', |
| 26 | /** |
| 27 | * If you need specific check, |
| 28 | * you can rewrite this function |
| 29 | * |
| 30 | * @param input {InputData} |
| 31 | * @return {boolean} |
| 32 | */ |
| 33 | isSupported(input) { |
| 34 | return input.attrs.hasOwnProperty(this.attrName); |
| 35 | }, |
| 36 | /** |
| 37 | * @param input {InputData} |
| 38 | */ |
| 39 | runObserve(input) { |
| 40 | /** |
| 41 | * @type {BaseHtmlAttr} |
| 42 | */ |
| 43 | const htmlAttr = input.attrs[this.attrName]; |
| 44 | const formula = new CalculatedFormula(input); |
| 45 | formula.observe(htmlAttr.initial); |
| 46 | this.observe(htmlAttr, formula); |
| 47 | }, |
| 48 | /** |
| 49 | * @param attr {BaseHtmlAttr} |
| 50 | * @param formula {CalculatedFormula} |
| 51 | */ |
| 52 | observe(attr, formula) { |
| 53 | formula.setResult = () => { |
| 54 | attr.value.current = formula.calculate(); |
| 55 | }; |
| 56 | formula.setResult(); |
| 57 | } |
| 58 | }; |
| 59 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BaseReactiveProperty); |
| 60 | |
| 61 | /***/ }, |
| 62 | |
| 63 | /***/ "./frontend/dynamic.value/MultipleValueItem.js" |
| 64 | /*!*****************************************************!*\ |
| 65 | !*** ./frontend/dynamic.value/MultipleValueItem.js ***! |
| 66 | \*****************************************************/ |
| 67 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 68 | |
| 69 | __webpack_require__.r(__webpack_exports__); |
| 70 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 71 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) |
| 72 | /* harmony export */ }); |
| 73 | /* harmony import */ var _ValueItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ValueItem */ "./frontend/dynamic.value/ValueItem.js"); |
| 74 | |
| 75 | const { |
| 76 | CalculatedFormula |
| 77 | } = JetFormBuilderAbstract; |
| 78 | function MultipleValueItem(...props) { |
| 79 | _ValueItem__WEBPACK_IMPORTED_MODULE_0__["default"].call(this, ...props); |
| 80 | } |
| 81 | MultipleValueItem.prototype = Object.create(_ValueItem__WEBPACK_IMPORTED_MODULE_0__["default"].prototype); |
| 82 | MultipleValueItem.prototype.isSupported = function (input) { |
| 83 | return input.isArray(); |
| 84 | }; |
| 85 | MultipleValueItem.prototype.observeSetValue = function (conditions, input) { |
| 86 | let toSet = []; |
| 87 | if (!Array.isArray(this.to_set)) { |
| 88 | toSet = this.to_set.split(',').map(item => item.trim()); |
| 89 | } |
| 90 | this.to_set = {}; |
| 91 | for (const [index, toSetElement] of Object.entries(toSet)) { |
| 92 | const formula = new CalculatedFormula(input); |
| 93 | formula.observe(toSetElement); |
| 94 | formula.setResult = () => { |
| 95 | this.to_set[index] = '' + formula.calculate(); |
| 96 | this.to_set = Object.values(this.to_set).filter(Boolean); |
| 97 | }; |
| 98 | formula.setResult(); |
| 99 | this.formulas.push(formula); |
| 100 | } |
| 101 | }; |
| 102 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MultipleValueItem); |
| 103 | |
| 104 | /***/ }, |
| 105 | |
| 106 | /***/ "./frontend/dynamic.value/ReactiveValue.js" |
| 107 | /*!*************************************************!*\ |
| 108 | !*** ./frontend/dynamic.value/ReactiveValue.js ***! |
| 109 | \*************************************************/ |
| 110 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 111 | |
| 112 | __webpack_require__.r(__webpack_exports__); |
| 113 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 114 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) |
| 115 | /* harmony export */ }); |
| 116 | /* harmony import */ var _BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseReactiveProperty */ "./frontend/dynamic.value/BaseReactiveProperty.js"); |
| 117 | |
| 118 | const { |
| 119 | CalculatedFormula |
| 120 | } = JetFormBuilderAbstract; |
| 121 | function ReactiveValue() { |
| 122 | this.isSupported = function (input) { |
| 123 | const [node] = input.nodes; |
| 124 | return node.dataset.hasOwnProperty('value'); |
| 125 | }; |
| 126 | this.runObserve = function (input) { |
| 127 | const [node] = input.nodes; |
| 128 | const formula = new CalculatedFormula(input); |
| 129 | formula.observe(node.dataset.value); |
| 130 | formula.setResult = () => { |
| 131 | input.value.current = formula.calculate(); |
| 132 | }; |
| 133 | formula.setResult(); |
| 134 | }; |
| 135 | } |
| 136 | ReactiveValue.prototype = Object.create(_BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_0__["default"].prototype); |
| 137 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ReactiveValue); |
| 138 | |
| 139 | /***/ }, |
| 140 | |
| 141 | /***/ "./frontend/dynamic.value/ValueItem.js" |
| 142 | /*!*********************************************!*\ |
| 143 | !*** ./frontend/dynamic.value/ValueItem.js ***! |
| 144 | \*********************************************/ |
| 145 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 146 | |
| 147 | __webpack_require__.r(__webpack_exports__); |
| 148 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 149 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) |
| 150 | /* harmony export */ }); |
| 151 | const { |
| 152 | CalculatedFormula, |
| 153 | ConditionsList |
| 154 | } = JetFormBuilderAbstract; |
| 155 | |
| 156 | /** |
| 157 | * @type {Function} |
| 158 | * @class |
| 159 | */ |
| 160 | function ValueItem() {} |
| 161 | ValueItem.prototype = { |
| 162 | to_set: '', |
| 163 | prevResult: null, |
| 164 | prevValue: null, |
| 165 | /** |
| 166 | * @type {InputData} |
| 167 | */ |
| 168 | input: null, |
| 169 | frequency: '', |
| 170 | set_on_empty: false, |
| 171 | /** |
| 172 | * @type {CalculatedFormula[]} |
| 173 | */ |
| 174 | formulas: [], |
| 175 | /** |
| 176 | * @param input {InputData} |
| 177 | * @return {boolean} |
| 178 | */ |
| 179 | // eslint-disable-next-line no-unused-vars |
| 180 | isSupported(input) { |
| 181 | return true; |
| 182 | }, |
| 183 | observe({ |
| 184 | to_set: toSet, |
| 185 | conditions = [], |
| 186 | set_on_empty: setOnEmpty = false, |
| 187 | frequency = 'on_change' |
| 188 | }, input) { |
| 189 | this.input = input; |
| 190 | this.frequency = frequency; |
| 191 | this.set_on_empty = setOnEmpty; |
| 192 | this.prevResult = null; |
| 193 | this.prevValue = null; |
| 194 | this.to_set = toSet; |
| 195 | this.formulas = []; |
| 196 | this.observeSetValue(conditions, input); |
| 197 | const list = new ConditionsList(conditions, input.root); |
| 198 | if (list.conditions?.length) { |
| 199 | list.onChangeRelated = () => this.applyValue(list); |
| 200 | list.observe(); |
| 201 | list.onChangeRelated(); |
| 202 | return; |
| 203 | } |
| 204 | for (const formula of this.formulas) { |
| 205 | const resultCallback = formula.setResult.bind(formula); |
| 206 | formula.setResult = () => { |
| 207 | resultCallback(); |
| 208 | this.applyValue(false, true); |
| 209 | }; |
| 210 | formula.setResult(); |
| 211 | } |
| 212 | }, |
| 213 | observeSetValue(conditions, input) { |
| 214 | const formula = new CalculatedFormula(input); |
| 215 | formula.observe(this.to_set); |
| 216 | formula.setResult = () => { |
| 217 | this.to_set = '' + formula.calculate(); |
| 218 | }; |
| 219 | formula.setResult(); |
| 220 | this.formulas.push(formula); |
| 221 | }, |
| 222 | /** |
| 223 | * @param list {ConditionsList|boolean} |
| 224 | * @param forceResult {boolean|null} |
| 225 | */ |
| 226 | applyValue(list, forceResult = null) { |
| 227 | let result = false; |
| 228 | if (list) { |
| 229 | result = list.getResult(); |
| 230 | } else { |
| 231 | result = forceResult; |
| 232 | } |
| 233 | switch (this.frequency) { |
| 234 | case 'always': |
| 235 | this.setValue(result); |
| 236 | break; |
| 237 | case 'on_change': |
| 238 | if (this.prevResult === result) { |
| 239 | break; |
| 240 | } |
| 241 | this.prevResult = result; |
| 242 | this.setValue(result); |
| 243 | break; |
| 244 | case 'once': |
| 245 | if (!result) { |
| 246 | break; |
| 247 | } |
| 248 | this.setValue(); |
| 249 | if (list) { |
| 250 | list.onChangeRelated = () => {}; |
| 251 | } |
| 252 | this.formulas.forEach(current => current.clearWatchers()); |
| 253 | break; |
| 254 | } |
| 255 | }, |
| 256 | setValue(result = true) { |
| 257 | if (!result) { |
| 258 | return; |
| 259 | } |
| 260 | if (this.set_on_empty) { |
| 261 | this.input.value.setIfEmpty(this.to_set); |
| 262 | } else { |
| 263 | this.input.value.current = this.to_set; |
| 264 | } |
| 265 | } |
| 266 | }; |
| 267 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ValueItem); |
| 268 | |
| 269 | /***/ }, |
| 270 | |
| 271 | /***/ "./frontend/dynamic.value/functions.js" |
| 272 | /*!*********************************************!*\ |
| 273 | !*** ./frontend/dynamic.value/functions.js ***! |
| 274 | \*********************************************/ |
| 275 | (__unused_webpack_module, __webpack_exports__, __webpack_require__) { |
| 276 | |
| 277 | __webpack_require__.r(__webpack_exports__); |
| 278 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { |
| 279 | /* harmony export */ getProperties: () => (/* binding */ getProperties), |
| 280 | /* harmony export */ parseInput: () => (/* binding */ parseInput) |
| 281 | /* harmony export */ }); |
| 282 | /* harmony import */ var _ValueItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ValueItem */ "./frontend/dynamic.value/ValueItem.js"); |
| 283 | /* harmony import */ var _MultipleValueItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MultipleValueItem */ "./frontend/dynamic.value/MultipleValueItem.js"); |
| 284 | /* harmony import */ var _ReactiveValue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ReactiveValue */ "./frontend/dynamic.value/ReactiveValue.js"); |
| 285 | /* harmony import */ var _BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BaseReactiveProperty */ "./frontend/dynamic.value/BaseReactiveProperty.js"); |
| 286 | |
| 287 | |
| 288 | |
| 289 | const { |
| 290 | applyFilters |
| 291 | } = JetPlugins.hooks; |
| 292 | const getValues = () => applyFilters('jet.fb.dynamic.value.types', [_MultipleValueItem__WEBPACK_IMPORTED_MODULE_1__["default"], _ValueItem__WEBPACK_IMPORTED_MODULE_0__["default"]]); |
| 293 | /** |
| 294 | * @type {ValueItem[]} |
| 295 | */ |
| 296 | let values = []; |
| 297 | |
| 298 | /** |
| 299 | * @param input |
| 300 | * @return {ValueItem} |
| 301 | */ |
| 302 | const getValue = input => { |
| 303 | if (!values.length) { |
| 304 | values = getValues(); |
| 305 | } |
| 306 | for (const value of values) { |
| 307 | const current = new value(); |
| 308 | if (!current.isSupported(input)) { |
| 309 | continue; |
| 310 | } |
| 311 | return current; |
| 312 | } |
| 313 | }; |
| 314 | function createValues(json, input) { |
| 315 | const groups = JSON.parse(json); |
| 316 | for (const group of groups) { |
| 317 | const value = getValue(input); |
| 318 | value.observe(group, input); |
| 319 | } |
| 320 | } |
| 321 | function parseInput(input) { |
| 322 | const [node] = input.nodes; |
| 323 | const wrapper = node.closest('.jet-form-builder-row'); |
| 324 | if (wrapper && wrapper.dataset.hasOwnProperty('value')) { |
| 325 | createValues(wrapper.dataset.value, input); |
| 326 | } |
| 327 | // for hidden-field case |
| 328 | else if (node.dataset.hasOwnProperty('dynamicValue')) { |
| 329 | createValues(node.dataset.dynamicValue, input); |
| 330 | } |
| 331 | for (const property of getProperties(input)) { |
| 332 | property.runObserve(input); |
| 333 | } |
| 334 | } |
| 335 | |
| 336 | |
| 337 | /** |
| 338 | * @type {BaseReactiveProperty[]} |
| 339 | */ |
| 340 | const reactProperties = [new _BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_3__["default"]('min'), new _BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_3__["default"]('max'), new _ReactiveValue__WEBPACK_IMPORTED_MODULE_2__["default"]()]; |
| 341 | |
| 342 | /** |
| 343 | * @param input {InputData} |
| 344 | * @return {Generator<BaseReactiveProperty>} |
| 345 | */ |
| 346 | function* getProperties(input) { |
| 347 | for (const reactProperty of reactProperties) { |
| 348 | if (reactProperty.isSupported(input)) { |
| 349 | yield reactProperty; |
| 350 | } |
| 351 | } |
| 352 | } |
| 353 | |
| 354 | |
| 355 | /***/ } |
| 356 | |
| 357 | /******/ }); |
| 358 | /************************************************************************/ |
| 359 | /******/ // The module cache |
| 360 | /******/ var __webpack_module_cache__ = {}; |
| 361 | /******/ |
| 362 | /******/ // The require function |
| 363 | /******/ function __webpack_require__(moduleId) { |
| 364 | /******/ // Check if module is in cache |
| 365 | /******/ var cachedModule = __webpack_module_cache__[moduleId]; |
| 366 | /******/ if (cachedModule !== undefined) { |
| 367 | /******/ return cachedModule.exports; |
| 368 | /******/ } |
| 369 | /******/ // Create a new module (and put it into the cache) |
| 370 | /******/ var module = __webpack_module_cache__[moduleId] = { |
| 371 | /******/ // no module.id needed |
| 372 | /******/ // no module.loaded needed |
| 373 | /******/ exports: {} |
| 374 | /******/ }; |
| 375 | /******/ |
| 376 | /******/ // Execute the module function |
| 377 | /******/ if (!(moduleId in __webpack_modules__)) { |
| 378 | /******/ delete __webpack_module_cache__[moduleId]; |
| 379 | /******/ var e = new Error("Cannot find module '" + moduleId + "'"); |
| 380 | /******/ e.code = 'MODULE_NOT_FOUND'; |
| 381 | /******/ throw e; |
| 382 | /******/ } |
| 383 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); |
| 384 | /******/ |
| 385 | /******/ // Return the exports of the module |
| 386 | /******/ return module.exports; |
| 387 | /******/ } |
| 388 | /******/ |
| 389 | /************************************************************************/ |
| 390 | /******/ /* webpack/runtime/define property getters */ |
| 391 | /******/ (() => { |
| 392 | /******/ // define getter functions for harmony exports |
| 393 | /******/ __webpack_require__.d = (exports, definition) => { |
| 394 | /******/ for(var key in definition) { |
| 395 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { |
| 396 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); |
| 397 | /******/ } |
| 398 | /******/ } |
| 399 | /******/ }; |
| 400 | /******/ })(); |
| 401 | /******/ |
| 402 | /******/ /* webpack/runtime/hasOwnProperty shorthand */ |
| 403 | /******/ (() => { |
| 404 | /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) |
| 405 | /******/ })(); |
| 406 | /******/ |
| 407 | /******/ /* webpack/runtime/make namespace object */ |
| 408 | /******/ (() => { |
| 409 | /******/ // define __esModule on exports |
| 410 | /******/ __webpack_require__.r = (exports) => { |
| 411 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
| 412 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
| 413 | /******/ } |
| 414 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); |
| 415 | /******/ }; |
| 416 | /******/ })(); |
| 417 | /******/ |
| 418 | /************************************************************************/ |
| 419 | var __webpack_exports__ = {}; |
| 420 | // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. |
| 421 | (() => { |
| 422 | /*!****************************************!*\ |
| 423 | !*** ./frontend/dynamic.value/main.js ***! |
| 424 | \****************************************/ |
| 425 | __webpack_require__.r(__webpack_exports__); |
| 426 | /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ "./frontend/dynamic.value/functions.js"); |
| 427 | |
| 428 | const { |
| 429 | addAction |
| 430 | } = JetPlugins.hooks; |
| 431 | addAction('jet.fb.observe.after', 'jet-form-builder/dynamic-value', |
| 432 | /** |
| 433 | * @param observable {Observable} |
| 434 | */ |
| 435 | function (observable) { |
| 436 | for (const dataInput of observable.getInputs()) { |
| 437 | (0,_functions__WEBPACK_IMPORTED_MODULE_0__.parseInput)(dataInput); |
| 438 | } |
| 439 | }); |
| 440 | })(); |
| 441 | |
| 442 | /******/ })() |
| 443 | ; |
| 444 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQvZHluYW1pYy52YWx1ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDaERBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ3ZDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeklBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2R5bmFtaWMudmFsdWUvQmFzZVJlYWN0aXZlUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvZHluYW1pYy52YWx1ZS9NdWx0aXBsZVZhbHVlSXRlbS5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9keW5hbWljLnZhbHVlL1JlYWN0aXZlVmFsdWUuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvZHluYW1pYy52YWx1ZS9WYWx1ZUl0ZW0uanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvZHluYW1pYy52YWx1ZS9mdW5jdGlvbnMuanMiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2pmYi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvZHluYW1pYy52YWx1ZS9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHsgQ2FsY3VsYXRlZEZvcm11bGEgfSA9IEpldEZvcm1CdWlsZGVyQWJzdHJhY3Q7XG5cbmZ1bmN0aW9uIEJhc2VSZWFjdGl2ZVByb3BlcnR5KCBuYW1lID0gJycgKSB7XG5cdHRoaXMuYXR0ck5hbWUgPSBuYW1lO1xufVxuXG5CYXNlUmVhY3RpdmVQcm9wZXJ0eS5wcm90b3R5cGUgPSB7XG5cdC8qKlxuXHQgKiBOYW1lIG9mIGRhdGEgYXR0cmlidXRlXG5cdCAqL1xuXHRhdHRyTmFtZTogJycsXG5cdC8qKlxuXHQgKiBJZiB5b3UgbmVlZCBzcGVjaWZpYyBjaGVjayxcblx0ICogeW91IGNhbiByZXdyaXRlIHRoaXMgZnVuY3Rpb25cblx0ICpcblx0ICogQHBhcmFtICBpbnB1dCB7SW5wdXREYXRhfVxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0aXNTdXBwb3J0ZWQoIGlucHV0ICkge1xuXHRcdHJldHVybiBpbnB1dC5hdHRycy5oYXNPd25Qcm9wZXJ0eSggdGhpcy5hdHRyTmFtZSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gaW5wdXQge0lucHV0RGF0YX1cblx0ICovXG5cdHJ1bk9ic2VydmUoIGlucHV0ICkge1xuXHRcdC8qKlxuXHRcdCAqIEB0eXBlIHtCYXNlSHRtbEF0dHJ9XG5cdFx0ICovXG5cdFx0Y29uc3QgaHRtbEF0dHIgPSBpbnB1dC5hdHRyc1sgdGhpcy5hdHRyTmFtZSBdO1xuXG5cdFx0Y29uc3QgZm9ybXVsYSA9IG5ldyBDYWxjdWxhdGVkRm9ybXVsYSggaW5wdXQgKTtcblx0XHRmb3JtdWxhLm9ic2VydmUoIGh0bWxBdHRyLmluaXRpYWwgKTtcblxuXHRcdHRoaXMub2JzZXJ2ZSggaHRtbEF0dHIsIGZvcm11bGEgKTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSBhdHRyICAgIHtCYXNlSHRtbEF0dHJ9XG5cdCAqIEBwYXJhbSBmb3JtdWxhIHtDYWxjdWxhdGVkRm9ybXVsYX1cblx0ICovXG5cdG9ic2VydmUoIGF0dHIsIGZvcm11bGEgKSB7XG5cdFx0Zm9ybXVsYS5zZXRSZXN1bHQgPSAoKSA9PiB7XG5cdFx0XHRhdHRyLnZhbHVlLmN1cnJlbnQgPSBmb3JtdWxhLmNhbGN1bGF0ZSgpO1xuXHRcdH07XG5cdFx0Zm9ybXVsYS5zZXRSZXN1bHQoKTtcblx0fSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VSZWFjdGl2ZVByb3BlcnR5OyIsImltcG9ydCBWYWx1ZUl0ZW0gZnJvbSAnLi9WYWx1ZUl0ZW0nO1xuXG5jb25zdCB7XG5cdCAgICAgIENhbGN1bGF0ZWRGb3JtdWxhLFxuICAgICAgfSA9IEpldEZvcm1CdWlsZGVyQWJzdHJhY3Q7XG5cbmZ1bmN0aW9uIE11bHRpcGxlVmFsdWVJdGVtKCAuLi5wcm9wcyApIHtcblx0VmFsdWVJdGVtLmNhbGwoIHRoaXMsIC4uLnByb3BzICk7XG59XG5cbk11bHRpcGxlVmFsdWVJdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFZhbHVlSXRlbS5wcm90b3R5cGUgKTtcblxuTXVsdGlwbGVWYWx1ZUl0ZW0ucHJvdG90eXBlLmlzU3VwcG9ydGVkICAgICA9IGZ1bmN0aW9uICggaW5wdXQgKSB7XG5cdHJldHVybiBpbnB1dC5pc0FycmF5KCk7XG59O1xuTXVsdGlwbGVWYWx1ZUl0ZW0ucHJvdG90eXBlLm9ic2VydmVTZXRWYWx1ZSA9IGZ1bmN0aW9uICggY29uZGl0aW9ucywgaW5wdXQgKSB7XG5cdGxldCB0b1NldCA9IFtdO1xuXG5cdGlmICggIUFycmF5LmlzQXJyYXkoIHRoaXMudG9fc2V0ICkgKSB7XG5cdFx0dG9TZXQgPSB0aGlzLnRvX3NldC5zcGxpdCggJywnICkubWFwKCBpdGVtID0+IGl0ZW0udHJpbSgpICk7XG5cdH1cblx0dGhpcy50b19zZXQgPSB7fTtcblxuXHRmb3IgKCBjb25zdCBbIGluZGV4LCB0b1NldEVsZW1lbnQgXSBvZiBPYmplY3QuZW50cmllcyggdG9TZXQgKSApIHtcblx0XHRjb25zdCBmb3JtdWxhID0gbmV3IENhbGN1bGF0ZWRGb3JtdWxhKCBpbnB1dCApO1xuXG5cdFx0Zm9ybXVsYS5vYnNlcnZlKCB0b1NldEVsZW1lbnQgKTtcblx0XHRmb3JtdWxhLnNldFJlc3VsdCA9ICgpID0+IHtcblx0XHRcdHRoaXMudG9fc2V0WyBpbmRleCBdID0gJycgKyBmb3JtdWxhLmNhbGN1bGF0ZSgpO1xuXG5cdFx0XHR0aGlzLnRvX3NldCA9IE9iamVjdC52YWx1ZXMoIHRoaXMudG9fc2V0ICkuZmlsdGVyKCBCb29sZWFuICk7XG5cdFx0fTtcblxuXHRcdGZvcm11bGEuc2V0UmVzdWx0KCk7XG5cblx0XHR0aGlzLmZvcm11bGFzLnB1c2goIGZvcm11bGEgKTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTXVsdGlwbGVWYWx1ZUl0ZW07IiwiaW1wb3J0IEJhc2VSZWFjdGl2ZVByb3BlcnR5IGZyb20gJy4vQmFzZVJlYWN0aXZlUHJvcGVydHknO1xuXG5jb25zdCB7IENhbGN1bGF0ZWRGb3JtdWxhIH0gPSBKZXRGb3JtQnVpbGRlckFic3RyYWN0O1xuXG5mdW5jdGlvbiBSZWFjdGl2ZVZhbHVlKCkge1xuXG5cdHRoaXMuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoIGlucHV0ICkge1xuXHRcdGNvbnN0IFsgbm9kZSBdID0gaW5wdXQubm9kZXM7XG5cblx0XHRyZXR1cm4gbm9kZS5kYXRhc2V0Lmhhc093blByb3BlcnR5KCAndmFsdWUnICk7XG5cdH07XG5cblx0dGhpcy5ydW5PYnNlcnZlID0gZnVuY3Rpb24gKCBpbnB1dCApIHtcblx0XHRjb25zdCBbIG5vZGUgXSA9IGlucHV0Lm5vZGVzO1xuXG5cdFx0Y29uc3QgZm9ybXVsYSA9IG5ldyBDYWxjdWxhdGVkRm9ybXVsYSggaW5wdXQgKTtcblxuXHRcdGZvcm11bGEub2JzZXJ2ZSggbm9kZS5kYXRhc2V0LnZhbHVlICk7XG5cdFx0Zm9ybXVsYS5zZXRSZXN1bHQgPSAoKSA9PiB7XG5cdFx0XHRpbnB1dC52YWx1ZS5jdXJyZW50ID0gZm9ybXVsYS5jYWxjdWxhdGUoKTtcblx0XHR9O1xuXHRcdGZvcm11bGEuc2V0UmVzdWx0KCk7XG5cdH07XG59XG5cblJlYWN0aXZlVmFsdWUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQmFzZVJlYWN0aXZlUHJvcGVydHkucHJvdG90eXBlICk7XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0aXZlVmFsdWU7IiwiY29uc3Qge1xuXHQgICAgICBDYWxjdWxhdGVkRm9ybXVsYSxcblx0ICAgICAgQ29uZGl0aW9uc0xpc3QsXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJBYnN0cmFjdDtcblxuLyoqXG4gKiBAdHlwZSB7RnVuY3Rpb259XG4gKiBAY2xhc3NcbiAqL1xuZnVuY3Rpb24gVmFsdWVJdGVtKCkge1xufVxuXG5WYWx1ZUl0ZW0ucHJvdG90eXBlID0ge1xuXHR0b19zZXQ6ICcnLFxuXHRwcmV2UmVzdWx0OiBudWxsLFxuXHRwcmV2VmFsdWU6IG51bGwsXG5cdC8qKlxuXHQgKiBAdHlwZSB7SW5wdXREYXRhfVxuXHQgKi9cblx0aW5wdXQ6IG51bGwsXG5cdGZyZXF1ZW5jeTogJycsXG5cdHNldF9vbl9lbXB0eTogZmFsc2UsXG5cdC8qKlxuXHQgKiBAdHlwZSB7Q2FsY3VsYXRlZEZvcm11bGFbXX1cblx0ICovXG5cdGZvcm11bGFzOiBbXSxcblx0LyoqXG5cdCAqIEBwYXJhbSAgaW5wdXQge0lucHV0RGF0YX1cblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXHRpc1N1cHBvcnRlZCggaW5wdXQgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdG9ic2VydmUoXG5cdFx0e1xuXHRcdFx0dG9fc2V0OiB0b1NldCxcblx0XHRcdGNvbmRpdGlvbnMgPSBbXSxcblx0XHRcdHNldF9vbl9lbXB0eTogc2V0T25FbXB0eSA9IGZhbHNlLFxuXHRcdFx0ZnJlcXVlbmN5ID0gJ29uX2NoYW5nZScsXG5cdFx0fSxcblx0XHRpbnB1dCxcblx0KSB7XG5cdFx0dGhpcy5pbnB1dCAgICAgICAgPSBpbnB1dDtcblx0XHR0aGlzLmZyZXF1ZW5jeSAgICA9IGZyZXF1ZW5jeTtcblx0XHR0aGlzLnNldF9vbl9lbXB0eSA9IHNldE9uRW1wdHk7XG5cdFx0dGhpcy5wcmV2UmVzdWx0ICAgPSBudWxsO1xuXHRcdHRoaXMucHJldlZhbHVlICAgID0gbnVsbDtcblx0XHR0aGlzLnRvX3NldCAgICAgICA9IHRvU2V0O1xuXHRcdHRoaXMuZm9ybXVsYXMgICAgID0gW107XG5cblx0XHR0aGlzLm9ic2VydmVTZXRWYWx1ZSggY29uZGl0aW9ucywgaW5wdXQgKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgQ29uZGl0aW9uc0xpc3QoIGNvbmRpdGlvbnMsIGlucHV0LnJvb3QgKTtcblxuXHRcdGlmICggbGlzdC5jb25kaXRpb25zPy5sZW5ndGggKSB7XG5cdFx0XHRsaXN0Lm9uQ2hhbmdlUmVsYXRlZCA9ICgpID0+IHRoaXMuYXBwbHlWYWx1ZSggbGlzdCApO1xuXHRcdFx0bGlzdC5vYnNlcnZlKCk7XG5cdFx0XHRsaXN0Lm9uQ2hhbmdlUmVsYXRlZCgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yICggY29uc3QgZm9ybXVsYSBvZiB0aGlzLmZvcm11bGFzICkge1xuXHRcdFx0Y29uc3QgcmVzdWx0Q2FsbGJhY2sgPSBmb3JtdWxhLnNldFJlc3VsdC5iaW5kKCBmb3JtdWxhICk7XG5cblx0XHRcdGZvcm11bGEuc2V0UmVzdWx0ID0gKCkgPT4ge1xuXHRcdFx0XHRyZXN1bHRDYWxsYmFjaygpO1xuXHRcdFx0XHR0aGlzLmFwcGx5VmFsdWUoIGZhbHNlLCB0cnVlICk7XG5cdFx0XHR9O1xuXHRcdFx0Zm9ybXVsYS5zZXRSZXN1bHQoKTtcblx0XHR9XG5cdH0sXG5cdG9ic2VydmVTZXRWYWx1ZSggY29uZGl0aW9ucywgaW5wdXQgKSB7XG5cdFx0Y29uc3QgZm9ybXVsYSA9IG5ldyBDYWxjdWxhdGVkRm9ybXVsYSggaW5wdXQgKTtcblxuXHRcdGZvcm11bGEub2JzZXJ2ZSggdGhpcy50b19zZXQgKTtcblx0XHRmb3JtdWxhLnNldFJlc3VsdCA9ICgpID0+IHtcblx0XHRcdHRoaXMudG9fc2V0ID0gJycgKyBmb3JtdWxhLmNhbGN1bGF0ZSgpO1xuXHRcdH07XG5cdFx0Zm9ybXVsYS5zZXRSZXN1bHQoKTtcblxuXHRcdHRoaXMuZm9ybXVsYXMucHVzaCggZm9ybXVsYSApO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIGxpc3QgICAgICAgIHtDb25kaXRpb25zTGlzdHxib29sZWFufVxuXHQgKiBAcGFyYW0gZm9yY2VSZXN1bHQge2Jvb2xlYW58bnVsbH1cblx0ICovXG5cdGFwcGx5VmFsdWUoIGxpc3QsIGZvcmNlUmVzdWx0ID0gbnVsbCApIHtcblx0XHRsZXQgcmVzdWx0ID0gZmFsc2U7XG5cblx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRyZXN1bHQgPSBsaXN0LmdldFJlc3VsdCgpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHJlc3VsdCA9IGZvcmNlUmVzdWx0O1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoIHRoaXMuZnJlcXVlbmN5ICkge1xuXHRcdFx0Y2FzZSAnYWx3YXlzJzpcblx0XHRcdFx0dGhpcy5zZXRWYWx1ZSggcmVzdWx0ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnb25fY2hhbmdlJzpcblx0XHRcdFx0aWYgKCB0aGlzLnByZXZSZXN1bHQgPT09IHJlc3VsdCApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnByZXZSZXN1bHQgPSByZXN1bHQ7XG5cdFx0XHRcdHRoaXMuc2V0VmFsdWUoIHJlc3VsdCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ29uY2UnOlxuXHRcdFx0XHRpZiAoICFyZXN1bHQgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zZXRWYWx1ZSgpO1xuXG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0Lm9uQ2hhbmdlUmVsYXRlZCA9ICgpID0+IHt9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5mb3JtdWxhcy5mb3JFYWNoKCBjdXJyZW50ID0+IGN1cnJlbnQuY2xlYXJXYXRjaGVycygpICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9LFxuXHRzZXRWYWx1ZSggcmVzdWx0ID0gdHJ1ZSApIHtcblx0XHRpZiAoICFyZXN1bHQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICggdGhpcy5zZXRfb25fZW1wdHkgKSB7XG5cdFx0XHR0aGlzLmlucHV0LnZhbHVlLnNldElmRW1wdHkoIHRoaXMudG9fc2V0ICk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5pbnB1dC52YWx1ZS5jdXJyZW50ID0gdGhpcy50b19zZXQ7XG5cdFx0fVxuXHR9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgVmFsdWVJdGVtOyIsImltcG9ydCBWYWx1ZUl0ZW0gZnJvbSAnLi9WYWx1ZUl0ZW0nO1xuaW1wb3J0IE11bHRpcGxlVmFsdWVJdGVtIGZyb20gJy4vTXVsdGlwbGVWYWx1ZUl0ZW0nO1xuaW1wb3J0IFJlYWN0aXZlVmFsdWUgZnJvbSAnLi9SZWFjdGl2ZVZhbHVlJztcblxuY29uc3QgeyBhcHBseUZpbHRlcnMgfSA9IEpldFBsdWdpbnMuaG9va3M7XG5cbmNvbnN0IGdldFZhbHVlcyA9ICgpID0+IGFwcGx5RmlsdGVycyhcblx0J2pldC5mYi5keW5hbWljLnZhbHVlLnR5cGVzJyxcblx0W1xuXHRcdE11bHRpcGxlVmFsdWVJdGVtLFxuXHRcdFZhbHVlSXRlbSxcblx0XSxcbik7XG4vKipcbiAqIEB0eXBlIHtWYWx1ZUl0ZW1bXX1cbiAqL1xubGV0IHZhbHVlcyAgICAgID0gW107XG5cbi8qKlxuICogQHBhcmFtICBpbnB1dFxuICogQHJldHVybiB7VmFsdWVJdGVtfVxuICovXG5jb25zdCBnZXRWYWx1ZSA9ICggaW5wdXQgKSA9PiB7XG5cdGlmICggIXZhbHVlcy5sZW5ndGggKSB7XG5cdFx0dmFsdWVzID0gZ2V0VmFsdWVzKCk7XG5cdH1cblxuXHRmb3IgKCBjb25zdCB2YWx1ZSBvZiB2YWx1ZXMgKSB7XG5cdFx0Y29uc3QgY3VycmVudCA9IG5ldyB2YWx1ZSgpO1xuXG5cdFx0aWYgKCAhY3VycmVudC5pc1N1cHBvcnRlZCggaW5wdXQgKSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gY3VycmVudDtcblx0fVxufTtcblxuZnVuY3Rpb24gY3JlYXRlVmFsdWVzKCBqc29uLCBpbnB1dCApIHtcblx0Y29uc3QgZ3JvdXBzID0gSlNPTi5wYXJzZSgganNvbiApO1x0XG5cblx0Zm9yICggY29uc3QgZ3JvdXAgb2YgZ3JvdXBzICkge1xuXHRcdGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUoIGlucHV0ICk7XG5cblx0XHR2YWx1ZS5vYnNlcnZlKCBncm91cCwgaW5wdXQgKTtcblx0fVxufVxuXG5mdW5jdGlvbiBwYXJzZUlucHV0KCBpbnB1dCApIHtcblx0Y29uc3QgWyBub2RlIF0gPSBpbnB1dC5ub2Rlcztcblx0Y29uc3Qgd3JhcHBlciAgPSBub2RlLmNsb3Nlc3QoICcuamV0LWZvcm0tYnVpbGRlci1yb3cnICk7XG5cblx0aWYgKCB3cmFwcGVyICYmIHdyYXBwZXIuZGF0YXNldC5oYXNPd25Qcm9wZXJ0eSggJ3ZhbHVlJyApICkge1xuXHRcdGNyZWF0ZVZhbHVlcyggd3JhcHBlci5kYXRhc2V0LnZhbHVlLCBpbnB1dCApO1xuXHR9XG5cdC8vIGZvciBoaWRkZW4tZmllbGQgY2FzZVxuXHRlbHNlIGlmICggbm9kZS5kYXRhc2V0Lmhhc093blByb3BlcnR5KCAnZHluYW1pY1ZhbHVlJyApICkge1xuXHRcdGNyZWF0ZVZhbHVlcyggbm9kZS5kYXRhc2V0LmR5bmFtaWNWYWx1ZSwgaW5wdXQgKTtcblx0fVxuXG5cdGZvciAoIGNvbnN0IHByb3BlcnR5IG9mIGdldFByb3BlcnRpZXMoIGlucHV0ICkgKSB7XG5cdFx0cHJvcGVydHkucnVuT2JzZXJ2ZSggaW5wdXQgKTtcblx0fVxuXG59XG5cbmltcG9ydCBCYXNlUmVhY3RpdmVQcm9wZXJ0eSBmcm9tICcuL0Jhc2VSZWFjdGl2ZVByb3BlcnR5JztcblxuLyoqXG4gKiBAdHlwZSB7QmFzZVJlYWN0aXZlUHJvcGVydHlbXX1cbiAqL1xuY29uc3QgcmVhY3RQcm9wZXJ0aWVzID0gW1xuXHRuZXcgQmFzZVJlYWN0aXZlUHJvcGVydHkoICdtaW4nICksXG5cdG5ldyBCYXNlUmVhY3RpdmVQcm9wZXJ0eSggJ21heCcgKSxcblx0bmV3IFJlYWN0aXZlVmFsdWUoKSxcbl07XG5cbi8qKlxuICogQHBhcmFtICBpbnB1dCB7SW5wdXREYXRhfVxuICogQHJldHVybiB7R2VuZXJhdG9yPEJhc2VSZWFjdGl2ZVByb3BlcnR5Pn1cbiAqL1xuZnVuY3Rpb24qIGdldFByb3BlcnRpZXMoIGlucHV0ICkge1xuXHRmb3IgKCBjb25zdCByZWFjdFByb3BlcnR5IG9mIHJlYWN0UHJvcGVydGllcyApIHtcblx0XHRpZiAoXG5cdFx0XHRyZWFjdFByb3BlcnR5LmlzU3VwcG9ydGVkKCBpbnB1dCApXG5cdFx0KSB7XG5cdFx0XHR5aWVsZCByZWFjdFByb3BlcnR5O1xuXHRcdH1cblx0fVxuXG59XG5cbmV4cG9ydCB7IHBhcnNlSW5wdXQsIGdldFByb3BlcnRpZXMgfTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgcGFyc2VJbnB1dCB9IGZyb20gJy4vZnVuY3Rpb25zJztcblxuY29uc3QgeyBhZGRBY3Rpb24gfSA9IEpldFBsdWdpbnMuaG9va3M7XG5cbmFkZEFjdGlvbihcblx0J2pldC5mYi5vYnNlcnZlLmFmdGVyJyxcblx0J2pldC1mb3JtLWJ1aWxkZXIvZHluYW1pYy12YWx1ZScsXG5cdC8qKlxuXHQgKiBAcGFyYW0gb2JzZXJ2YWJsZSB7T2JzZXJ2YWJsZX1cblx0ICovXG5cdGZ1bmN0aW9uICggb2JzZXJ2YWJsZSApIHtcblx0XHRmb3IgKCBjb25zdCBkYXRhSW5wdXQgb2Ygb2JzZXJ2YWJsZS5nZXRJbnB1dHMoKSApIHtcblx0XHRcdHBhcnNlSW5wdXQoIGRhdGFJbnB1dCApO1xuXHRcdH1cblx0fVxuKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== |