compute-bmi
Version:
Compute BMI and breakdown nutrients
257 lines (242 loc) • 21.6 kB
JavaScript
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./src/index.ts":
/*!**********************!*\
!*** ./src/index.ts ***!
\**********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => __WEBPACK_DEFAULT_EXPORT__
/* harmony export */ });
/* harmony import */ var _lib_calculate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/calculate */ "./src/lib/calculate.ts");
var BMICalculator = /** @class */ (function () {
function BMICalculator(measurements) {
if (!measurements)
throw new Error('Measurement required!');
this.height = measurements.height;
this.weight = measurements.weight;
}
/**
*
* Generate the whole result
*
*/
BMICalculator.prototype.results = function () {
var data = {
height: this.height,
weight: this.weight
};
return (0,_lib_calculate__WEBPACK_IMPORTED_MODULE_0__.generateResults)(data);
};
return BMICalculator;
}());
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BMICalculator);
/***/ }),
/***/ "./src/lib/calculate.ts":
/*!******************************!*\
!*** ./src/lib/calculate.ts ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "generateResults": () => /* binding */ generateResults,
/* harmony export */ "computeBMI": () => /* binding */ computeBMI,
/* harmony export */ "getBmiClassification": () => /* binding */ getBmiClassification,
/* harmony export */ "computeDesirableBodyWeight": () => /* binding */ computeDesirableBodyWeight,
/* harmony export */ "computeCalories": () => /* binding */ computeCalories,
/* harmony export */ "getNutrientsBreakdown": () => /* binding */ getNutrientsBreakdown
/* harmony export */ });
/* harmony import */ var _reference__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./reference */ "./src/lib/reference.ts");
/**
*
* Generate the final result
* @param {number} height
* @param {number} weight
* @return {Object} final results
*
*/
var generateResults = function (measurements) {
var bmi = computeBMI(measurements);
var bmiUserClassification = getBmiClassification(bmi);
var desirableBodyWeight = computeDesirableBodyWeight(measurements.height);
var kcal = computeCalories(desirableBodyWeight, bmiUserClassification);
var nutrients = getNutrientsBreakdown(kcal);
return {
bmi: bmi,
bmiClassification: bmiUserClassification,
dbw: desirableBodyWeight,
kcal: kcal,
nutrients: nutrients
};
};
/**
*
* Calculate BMI based on the measurement value given
* @param {number} height
* @param {number} weight
* @return {number} bmi result
*
*/
var computeBMI = function (measurements) {
var heightToMeter = measurements.height / 100;
var heightSquared = Math.pow(heightToMeter, 2);
var bmi = measurements.weight / heightSquared;
return Math.round((bmi + Number.EPSILON) * 100) / 100;
};
/**
*
* @param {*} bmi computed BMI
* @return {string} BMI Clasification
*/
var getBmiClassification = function (bmi) {
switch (true) {
case (bmi < _reference__WEBPACK_IMPORTED_MODULE_0__.low):
return _reference__WEBPACK_IMPORTED_MODULE_0__.underweight;
case (bmi >= _reference__WEBPACK_IMPORTED_MODULE_0__.low && bmi <= _reference__WEBPACK_IMPORTED_MODULE_0__.high):
return _reference__WEBPACK_IMPORTED_MODULE_0__.normal;
case (bmi > _reference__WEBPACK_IMPORTED_MODULE_0__.high):
return _reference__WEBPACK_IMPORTED_MODULE_0__.overweight;
default:
return _reference__WEBPACK_IMPORTED_MODULE_0__.defaultMessage;
}
};
/**
*
* Compute the Desirable Body Weight
* @param {*} height
* @return {number}
*
*/
var computeDesirableBodyWeight = function (height) {
var heightMinusOneHundred = height - 100;
var heightTenPercent = heightMinusOneHundred * 0.10;
var desirableBodyWeight = heightMinusOneHundred - heightTenPercent;
return desirableBodyWeight;
};
/**
*
* Compute the Calories
* @param {*} dbw Desirable Body Weight
* @param {*} classification BMI classification
*
*/
var computeCalories = function (dbw, classification) {
var kcal;
var computedDbw;
switch (classification) {
case _reference__WEBPACK_IMPORTED_MODULE_0__.underweight:
computedDbw = dbw + (dbw * 0.10);
kcal = computedDbw * 35;
return kcal;
case _reference__WEBPACK_IMPORTED_MODULE_0__.normal:
kcal = dbw * 30;
return kcal;
case _reference__WEBPACK_IMPORTED_MODULE_0__.overweight:
computedDbw = dbw - (dbw * 0.10);
kcal = computedDbw * 25;
return kcal;
default:
return _reference__WEBPACK_IMPORTED_MODULE_0__.defaultValue;
}
};
/**
*
* Getting the nutrients breakdown
* @param {*} kcal calories
* @returns {Object} list nutrients
*/
var getNutrientsBreakdown = function (kcal) {
return {
carbohydrates: (kcal * 0.6) / 4,
protein: (kcal * 0.15) / 4,
fat: (kcal * 0.25) / 9
};
};
/***/ }),
/***/ "./src/lib/reference.ts":
/*!******************************!*\
!*** ./src/lib/reference.ts ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "low": () => /* binding */ low,
/* harmony export */ "high": () => /* binding */ high,
/* harmony export */ "underweight": () => /* binding */ underweight,
/* harmony export */ "normal": () => /* binding */ normal,
/* harmony export */ "overweight": () => /* binding */ overweight,
/* harmony export */ "defaultMessage": () => /* binding */ defaultMessage,
/* harmony export */ "defaultValue": () => /* binding */ defaultValue
/* harmony export */ });
var low = 18.5;
var high = 24.9;
var underweight = 'underweight';
var normal = 'normal';
var overweight = 'overweight';
var defaultMessage = 'Unable to get classification';
var defaultValue = 0;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(__webpack_module_cache__[moduleId]) {
/******/ return __webpack_module_cache__[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
/******/ // startup
/******/ // Load entry module
/******/ __webpack_require__("./src/index.ts");
/******/ // This entry module used 'exports' so it can't be inlined
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb21wdXRlLWJtaS8uL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9jb21wdXRlLWJtaS8uL3NyYy9saWIvY2FsY3VsYXRlLnRzIiwid2VicGFjazovL2NvbXB1dGUtYm1pLy4vc3JjL2xpYi9yZWZlcmVuY2UudHMiLCJ3ZWJwYWNrOi8vY29tcHV0ZS1ibWkvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vY29tcHV0ZS1ibWkvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2NvbXB1dGUtYm1pL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vY29tcHV0ZS1ibWkvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9jb21wdXRlLWJtaS93ZWJwYWNrL3N0YXJ0dXAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQWtEO0FBT2xEO0lBcUJFLHVCQUFZLFlBQThCO1FBQ3hDLElBQUksQ0FBQyxZQUFZO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBRTVELElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFJLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFFckMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSwrQkFBTyxHQUFkO1FBRUUsSUFBTSxJQUFJLEdBQUc7WUFDWCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3BCO1FBRUQsT0FBTywrREFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFSCxvQkFBQztBQUFELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRGtDO0FBT25DOzs7Ozs7O0dBT0c7QUFDSSxJ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O1FBQzFCLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0tBQ3pCO0FBQ0gsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdklNLElBQU0sR0FBRyxHQUFHLElBQUk7QUFDaEIsSUFBTSxJQUFJLEdBQUcsSUFBSTtBQUVqQixJQUFNLFdBQVcsR0FBRyxhQUFhO0FBQ2pDLElBQU0sTUFBTSxHQUFHLFFBQVE7QUFDdkIsSUFBTSxVQUFVLEdBQUcsWUFBWTtBQUMvQixJQUFNLGNBQWMsR0FBRyw4QkFBOEI7QUFDckQsSUFBTSxZQUFZLEdBQUcsQ0FBQzs7Ozs7OztVQ1A3QjtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0NyQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx3Q0FBd0MseUNBQXlDO1dBQ2pGO1dBQ0E7V0FDQSxFOzs7OztXQ1BBLHNGOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHNEQUFzRCxrQkFBa0I7V0FDeEU7V0FDQSwrQ0FBK0MsY0FBYztXQUM3RCxFOzs7O1VDTkE7VUFDQTtVQUNBO1VBQ0EiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2VuZXJhdGVSZXN1bHRzIH0gZnJvbSBcIi4vbGliL2NhbGN1bGF0ZVwiO1xyXG5cclxuaW50ZXJmYWNlIE1lYXN1cmVtZW50VmFsdWUge1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIHdlaWdodDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCTUlDYWxjdWxhdG9yIHtcclxuXHJcbiAgLyoqXHJcbiAgICogSGVpZ2h0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoZWlnaHQ6IG51bWJlcjtcclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFdlaWdodFxyXG4gICAqL1xyXG4gIHByaXZhdGUgd2VpZ2h0OiBudW1iZXI7XHJcblxyXG5cclxuICAvKipcclxuICAgKiBDYWxjdWxhdGUgdGhlIHJlc3VsdCBiYXNlZCBcclxuICAgKiBvbiB0aGUgbWVzdXJlbWVudCB2YWx1ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZW5lcmF0ZTogb2JqZWN0O1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IobWVhc3VyZW1lbnRzOiBNZWFzdXJlbWVudFZhbHVlKSB7XHJcbiAgICBpZiAoIW1lYXN1cmVtZW50cykgdGhyb3cgbmV3IEVycm9yKCdNZWFzdXJlbWVudCByZXF1aXJlZCEnKTtcclxuXHJcbiAgICB0aGlzLmhlaWdodCA9IG1lYXN1cmVtZW50cy5oZWlnaHQ7XHJcbiAgICB0aGlzLndlaWdodCA9ICBtZWFzdXJlbWVudHMud2VpZ2h0O1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEdlbmVyYXRlIHRoZSB3aG9sZSByZXN1bHRcclxuICAgKiBcclxuICAgKi9cclxuICBwdWJsaWMgcmVzdWx0cygpIHtcclxuXHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxyXG4gICAgICB3ZWlnaHQ6IHRoaXMud2VpZ2h0XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdlbmVyYXRlUmVzdWx0cyhkYXRhKTtcclxuICB9XHJcblxyXG59IiwiaW1wb3J0ICogYXMgcmVmIGZyb20gXCIuL3JlZmVyZW5jZVwiO1xyXG5cclxuaW50ZXJmYWNlIE1lYXN1cmVtZW50VmFsdWUge1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIHdlaWdodDogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogXHJcbiAqIEdlbmVyYXRlIHRoZSBmaW5hbCByZXN1bHRcclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBcclxuICogQHBhcmFtIHtudW1iZXJ9IHdlaWdodFxyXG4gKiBAcmV0dXJuIHtPYmplY3R9IGZpbmFsIHJlc3VsdHNcclxuICogIFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUmVzdWx0cyA9IChtZWFzdXJlbWVudHM6IE1lYXN1cmVtZW50VmFsdWUpID0+IHtcclxuXHJcbiAgICBjb25zdCBibWkgPSBjb21wdXRlQk1JKG1lYXN1cmVtZW50cyk7XHJcbiAgICBjb25zdCBibWlVc2VyQ2xhc3NpZmljYXRpb24gPSBnZXRCbWlDbGFzc2lmaWNhdGlvbihibWkpO1xyXG4gICAgY29uc3QgZGVzaXJhYmxlQm9keVdlaWdodCA9IGNvbXB1dGVEZXNpcmFibGVCb2R5V2VpZ2h0KG1lYXN1cmVtZW50cy5oZWlnaHQpXHJcbiAgICBjb25zdCBrY2FsID0gY29tcHV0ZUNhbG9yaWVzKGRlc2lyYWJsZUJvZHlXZWlnaHQsIGJtaVVzZXJDbGFzc2lmaWNhdGlvbilcclxuICAgIGNvbnN0IG51dHJpZW50cyA9IGdldE51dHJpZW50c0JyZWFrZG93bihrY2FsKVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGJtaTogYm1pLFxyXG4gICAgICBibWlDbGFzc2lmaWNhdGlvbjogYm1pVXNlckNsYXNzaWZpY2F0aW9uLFxyXG4gICAgICBkYnc6IGRlc2lyYWJsZUJvZHlXZWlnaHQsXHJcbiAgICAgIGtjYWw6IGtjYWwsXHJcbiAgICAgIG51dHJpZW50czogbnV0cmllbnRzXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogXHJcbiAqIENhbGN1bGF0ZSBCTUkgYmFzZWQgb24gdGhlIG1lYXN1cmVtZW50IHZhbHVlIGdpdmVuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3ZWlnaHRcclxuICogQHJldHVybiB7bnVtYmVyfSBibWkgcmVzdWx0XHJcbiAqIFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXB1dGVCTUkgPSAobWVhc3VyZW1lbnRzOiBNZWFzdXJlbWVudFZhbHVlKSA9PiB7XHJcblxyXG4gICAgY29uc3QgaGVpZ2h0VG9NZXRlciA9IG1lYXN1cmVtZW50cy5oZWlnaHQgLyAxMDBcclxuICAgIGNvbnN0IGhlaWdodFNxdWFyZWQgPSBNYXRoLnBvdyhoZWlnaHRUb01ldGVyLCAyKTtcclxuICAgIGNvbnN0IGJtaSA9IG1lYXN1cmVtZW50cy53ZWlnaHQgLyBoZWlnaHRTcXVhcmVkO1xyXG5cclxuICAgIHJldHVybiBNYXRoLnJvdW5kKChibWkgKyBOdW1iZXIuRVBTSUxPTikgKiAxMDApIC8gMTAwO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBAcGFyYW0geyp9IGJtaSBjb21wdXRlZCBCTUlcclxuICogQHJldHVybiB7c3RyaW5nfSBCTUkgQ2xhc2lmaWNhdGlvblxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldEJtaUNsYXNzaWZpY2F0aW9uID0gKGJtaTogbnVtYmVyKSA9PiB7XHJcbiAgc3dpdGNoKHRydWUpe1xyXG4gICAgY2FzZSAoYm1pIDwgcmVmLmxvdyk6XHJcbiAgICAgICAgcmV0dXJuIHJlZi51bmRlcndlaWdodFxyXG5cclxuICAgIGNhc2UgKGJtaSA+PSByZWYubG93ICYmIGJtaSA8PSByZWYuaGlnaCk6XHJcbiAgICAgICAgcmV0dXJuIHJlZi5ub3JtYWxcclxuXHJcbiAgICBjYXNlIChibWkgPiByZWYuaGlnaCk6XHJcbiAgICAgICAgcmV0dXJuIHJlZi5vdmVyd2VpZ2h0XHJcbiAgICAgICAgXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiByZWYuZGVmYXVsdE1lc3NhZ2VcclxuICB9XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogXHJcbiAqIENvbXB1dGUgdGhlIERlc2lyYWJsZSBCb2R5IFdlaWdodFxyXG4gKiBAcGFyYW0geyp9IGhlaWdodCBcclxuICogQHJldHVybiB7bnVtYmVyfSBcclxuICogXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29tcHV0ZURlc2lyYWJsZUJvZHlXZWlnaHQgPSAoaGVpZ2h0OiBudW1iZXIpID0+IHtcclxuXHJcbiAgY29uc3QgaGVpZ2h0TWludXNPbmVIdW5kcmVkID0gaGVpZ2h0IC0gMTAwXHJcbiAgY29uc3QgaGVpZ2h0VGVuUGVyY2VudCA9IGhlaWdodE1pbnVzT25lSHVuZHJlZCAqIDAuMTBcclxuICBjb25zdCBkZXNpcmFibGVCb2R5V2VpZ2h0ID0gaGVpZ2h0TWludXNPbmVIdW5kcmVkIC0gaGVpZ2h0VGVuUGVyY2VudFxyXG5cclxuICByZXR1cm4gZGVzaXJhYmxlQm9keVdlaWdodFxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBDb21wdXRlIHRoZSBDYWxvcmllc1xyXG4gKiBAcGFyYW0geyp9IGRidyBEZXNpcmFibGUgQm9keSBXZWlnaHRcclxuICogQHBhcmFtIHsqfSBjbGFzc2lmaWNhdGlvbiBCTUkgY2xhc3NpZmljYXRpb25cclxuICogXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29tcHV0ZUNhbG9yaWVzID0gKGRidzogbnVtYmVyLCBjbGFzc2lmaWNhdGlvbjogc3RyaW5nKSA9PiB7XHJcblxyXG4gIGxldCBrY2FsXHJcbiAgbGV0IGNvbXB1dGVkRGJ3XHJcblxyXG4gIHN3aXRjaCAoY2xhc3NpZmljYXRpb24pe1xyXG4gICAgICBjYXNlIHJlZi51bmRlcndlaWdodDpcclxuICAgICAgICAgIGNvbXB1dGVkRGJ3ID0gZGJ3ICsgKGRidyAqIDAuMTApXHJcbiAgICAgICAgICBrY2FsID0gY29tcHV0ZWREYncgKiAzNVxyXG4gICAgICAgICAgcmV0dXJuIGtjYWxcclxuXHJcbiAgICAgIGNhc2UgcmVmLm5vcm1hbDpcclxuICAgICAgICAgIGtjYWwgPSBkYncgKiAzMFxyXG4gICAgICAgICAgcmV0dXJuIGtjYWxcclxuXHJcbiAgICAgIGNhc2UgcmVmLm92ZXJ3ZWlnaHQ6XHJcbiAgICAgICAgICBjb21wdXRlZERidyA9IGRidyAtIChkYncgKiAwLjEwKVxyXG4gICAgICAgICAga2NhbCA9IGNvbXB1dGVkRGJ3ICogMjVcclxuICAgICAgICAgIHJldHVybiBrY2FsXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcmV0dXJuIHJlZi5kZWZhdWx0VmFsdWVcclxuICB9XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogXHJcbiAqIEdldHRpbmcgdGhlIG51dHJpZW50cyBicmVha2Rvd25cclxuICogQHBhcmFtIHsqfSBrY2FsIGNhbG9yaWVzXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IGxpc3QgbnV0cmllbnRzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0TnV0cmllbnRzQnJlYWtkb3duID0gKGtjYWw6IG51bWJlcikgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICAgIGNhcmJvaHlkcmF0ZXM6IChrY2FsICogMC42KSAvIDQsXHJcbiAgICAgIHByb3RlaW46IChrY2FsICogMC4xNSkgLyA0LFxyXG4gICAgICBmYXQ6IChrY2FsICogMC4yNSkgLyA5XHJcbiAgfVxyXG59IiwiZXhwb3J0IGNvbnN0IGxvdyA9IDE4LjVcclxuZXhwb3J0IGNvbnN0IGhpZ2ggPSAyNC45XHJcblxyXG5leHBvcnQgY29uc3QgdW5kZXJ3ZWlnaHQgPSAndW5kZXJ3ZWlnaHQnXHJcbmV4cG9ydCBjb25zdCBub3JtYWwgPSAnbm9ybWFsJ1xyXG5leHBvcnQgY29uc3Qgb3ZlcndlaWdodCA9ICdvdmVyd2VpZ2h0J1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSAnVW5hYmxlIHRvIGdldCBjbGFzc2lmaWNhdGlvbidcclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRWYWx1ZSA9IDAiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHRpZihfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdKSB7XG5cdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGVcbl9fd2VicGFja19yZXF1aXJlX18oXCIuL3NyYy9pbmRleC50c1wiKTtcbi8vIFRoaXMgZW50cnkgbW9kdWxlIHVzZWQgJ2V4cG9ydHMnIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbiJdLCJzb3VyY2VSb290IjoiIn0=