UNPKG

array-includes-polyfill

Version:

Exposing a richer set of Array features for JavaScript

366 lines (283 loc) 34.9 kB
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ function inherit (extendthis, fromthese) { var keys=[]; if(extendthis.prototype == undefined){ var Empty = function(){} Empty.prototype = Object.prototype; extendthis.prototype = Empty.prototype; } fromthese.map(function(fromthis){ keys = Object.getOwnPropertyNames(fromthis.prototype); keys.shift(); keys.map(function(key){ extendthis.prototype[key]= fromthis.prototype[key]; }); }); } module.exports = inherit; },{}],2:[function(require,module,exports){ 'use strict'; var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var includes = require('./polyfills/includes'); var lookup = require('./polyfills/find-object'); var trash = require('./polyfills/trash'); var copy = require('./polyfills/copy'); var clear = require('./polyfills/clear'); var inherit = require('inherit-prototypes'); var dependencies = [includes, lookup, copy, clear, trash]; var ArrayIncludesPollyfills = (function (_Array) { _inherits(ArrayIncludesPollyfills, _Array); function ArrayIncludesPollyfills(array) { var _this = this; _classCallCheck(this, ArrayIncludesPollyfills); _get(Object.getPrototypeOf(ArrayIncludesPollyfills.prototype), 'constructor', this).call(this); this.length = 0; if (typeof array == 'array') array.map(function (element) { _this.push(element); }); if (typeof array == 'object') { var keys = Object.keys(array); keys.map(function (key) { _this.push(array[key]); }); } } return ArrayIncludesPollyfills; })(Array); inherit(ArrayIncludesPollyfills, dependencies); module.exports = ArrayIncludesPollyfills; },{"./polyfills/clear":4,"./polyfills/copy":5,"./polyfills/find-object":6,"./polyfills/includes":7,"./polyfills/trash":8,"inherit-prototypes":1}],3:[function(require,module,exports){ 'use strict'; var arrES6 = require('./array-includes-polyfill-es6'); var arr = new arrES6(); var defaultLength = new arrES6(); console.log(defaultLength); arr.push('Has includes polyfill'); console.log(arr.includes('Has includes polyfill')); console.log(arr); var obj1 = { id: '_$1QA2WS3ED', user: 'john doe', details: { dob: '01/01/99' } }; var obj2 = { id: '_$1QA2WS3EF', user: 'john doe', details: { dob: '01/02/99' } }; var obj3 = { id: '_$1QA2WS3EG', user: 'john doe', details: { dob: '01/01/99' } }; var obj4 = { id: '_$1QA2WS3EH', user: 'jane doe', details: { dob: '01/02/99' } }; var obj5 = { id: '_$1QA2WS3EI', user: 'jack doe', details: { dob: '01/05/99' } }; var obj6 = { id: '_$1QA2WS3EJ', user: 'july doe', details: { dob: '01/06/99' } }; arr.push(obj1, obj2, obj3, obj4, obj6); arr.lookup({ id: '_$1QA2WS3ED' }).details.occupation = "programmer"; console.log(arr.lookup({ id: '_$1QA2WS3ED' })); arr.lookup({ user: 'john doe', details: { dob: '01/02/99' } }).details.occupation = "programmer"; console.log(arr.lookup({ user: 'john doe', details: { dob: '01/02/99' } })); arr.trash({ id: '_$1QA2WS3EJ' }); console.log(arr); //<-- Deletes user july doe from the array permanently. var destination = arr.copy(); arr.copy(destination); var test = [{ hello: 'world', id: 1234 }]; var arr = new arrES6(test); //<-- will return a new array-inc-polyfill object generated from test array console.log(arr.lookup({ id: 1234 })); //<-- will return the object from lookup method. var arr = new arrES6([{ id: 123 }, { id: 321 }, { id: 213 }]); console.log(arr); //<-- should equal an empty an Array like object; arr.clear(); var arr = new arrES6({ test: 123, testa: 321, testb: 213 }); console.log(arr); arr.clear(); },{"./array-includes-polyfill-es6":2}],4:[function(require,module,exports){ "use strict"; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Clear = (function () { function Clear() { _classCallCheck(this, Clear); } _createClass(Clear, [{ key: "clear", value: function clear() { this.splice(0, this.length); if (this.length == 0) return true; return false; } }]); return Clear; })(); module.exports = Clear; },{}],5:[function(require,module,exports){ "use strict"; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Copy = (function () { function Copy() { _classCallCheck(this, Copy); } _createClass(Copy, [{ key: "copy", value: function copy(arr) { if (arr) { this.map(function (data) { arr.push(data); }); } else { var x = []; this.map(function (data) { x.push(data); }); return x; } } }]); return Copy; })(); module.exports = Copy; },{}],6:[function(require,module,exports){ "use strict"; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Lookup = (function () { function Lookup() { _classCallCheck(this, Lookup); } _createClass(Lookup, [{ key: "lookup", value: function lookup(obj, withIndex) { var O = Object(this); var result = []; O.map(function (object, index) { if (_isFlat(object)) { if (_compareObjs(obj, object)) { if (withIndex) _define$$index(object, index); result.push(object); } } if (!_isFlat(object)) { var tempObj1 = _flattenObjs(object, withIndex, index); var tempObj2 = _flattenObjs(obj, withIndex, index); if (_compareObjs(tempObj2, tempObj1)) { _define$$index(object, index); result.push(object); } } }); var x = result; result = []; if (x.length === 1) x = x[0]; if (x === undefined || x === null || x == '') x = false; return x; } }]); return Lookup; })(); function _define$$index(object, index) { Object.defineProperty(object, "_$$index_", { enumerable: true, configurable: true, writable: false, value: index }); } function _compareObjs(obj1, obj2) { var validate = []; var keys = Object.keys(obj1); var state; keys.map(function (key) { if (obj1[key] === obj2[key]) validate.push(true); }); validate.length === keys.length ? state = true : state = false; return state; } var _flattend = {}; var _recursion = false; function _flattenObjs(object, withIndex, index) { if (!_recursion) _flattend = {}; var keys = Object.keys(object); keys.map(function (key) { if (!_isObject(object[key])) _flattend[key] = object[key]; if (_isObject(object[key])) { _recursion = true; _flattenObjs(object[key]); } }); _recursion = false; if (withIndex) _define$$index(_flattend, index); return _flattend; } function _isFlat(object) { var validate = []; if (object instanceof Object) { var keys = Object.keys(object); keys.map(function (key) { if (object[key] instanceof Object) validate.push(true); }); } if (validate.length > 0) return false; return true; } function _isObject(object) { if (object instanceof Object) return true; return false; } module.exports = Lookup; },{}],7:[function(require,module,exports){ "use strict"; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Includes = (function () { function Includes() { _classCallCheck(this, Includes); } _createClass(Includes, [{ key: "includes", value: function includes(searchElement /*, fromIndex*/) { var O = Object(this); var len = parseInt(O.length) || 0; if (len === 0) { return false; } var n = parseInt(arguments[1]) || 0; var k; if (n >= 0) { k = n; } else { k = len + n; if (k < 0) { k = 0; } } var currentElement; while (k < len) { currentElement = O[k]; if (searchElement === currentElement || searchElement !== searchElement && currentElement !== currentElement) { return true; } k++; } return false; } }]); return Includes; })(); module.exports = Includes; },{}],8:[function(require,module,exports){ 'use strict'; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var Trash = (function () { function Trash() { _classCallCheck(this, Trash); } _createClass(Trash, [{ key: 'trash', value: function trash(obj) { if (typeof obj == 'object' && Object.keys(obj).length != 0) { if (this.lookup(obj)) { var index = this.lookup(obj, true)._$$index_; this.splice(index, 1); return true; } return false; } } }]); return Trash; })(); module.exports = Trash; },{}]},{},[3]) //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvaW5oZXJpdC1wcm90b3R5cGVzL3NyYy9pbmhlcml0LXByb3RvdHlwZXMuanMiLCIvVm9sdW1lcy9kYW5pZWxIRC9QZXJzb25hbC9ucG1fcGFja2FnZXMvYXJyYXktaW5jbHVkZXMtcG9seWZpbGwvc3JjL2FycmF5LWluY2x1ZGVzLXBvbHlmaWxsLWVzNi5qcyIsIi9Wb2x1bWVzL2RhbmllbEhEL1BlcnNvbmFsL25wbV9wYWNrYWdlcy9hcnJheS1pbmNsdWRlcy1wb2x5ZmlsbC9zcmMvZXhhbXBsZS5qcyIsIi9Wb2x1bWVzL2RhbmllbEhEL1BlcnNvbmFsL25wbV9wYWNrYWdlcy9hcnJheS1pbmNsdWRlcy1wb2x5ZmlsbC9zcmMvcG9seWZpbGxzL2NsZWFyLmpzIiwiL1ZvbHVtZXMvZGFuaWVsSEQvUGVyc29uYWwvbnBtX3BhY2thZ2VzL2FycmF5LWluY2x1ZGVzLXBvbHlmaWxsL3NyYy9wb2x5ZmlsbHMvY29weS5qcyIsIi9Wb2x1bWVzL2RhbmllbEhEL1BlcnNvbmFsL25wbV9wYWNrYWdlcy9hcnJheS1pbmNsdWRlcy1wb2x5ZmlsbC9zcmMvcG9seWZpbGxzL2ZpbmQtb2JqZWN0LmpzIiwiL1ZvbHVtZXMvZGFuaWVsSEQvUGVyc29uYWwvbnBtX3BhY2thZ2VzL2FycmF5LWluY2x1ZGVzLXBvbHlmaWxsL3NyYy9wb2x5ZmlsbHMvaW5jbHVkZXMuanMiLCIvVm9sdW1lcy9kYW5pZWxIRC9QZXJzb25hbC9ucG1fcGFja2FnZXMvYXJyYXktaW5jbHVkZXMtcG9seWZpbGwvc3JjL3BvbHlmaWxscy90cmFzaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7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LENBQUM7QUFDbkIsYUFBTyxDQUFDLEdBQUcsR0FBRyxFQUFFO0FBQ2Qsc0JBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsWUFBSSxhQUFhLEtBQUssY0FBYyxJQUNoQyxhQUFhLEtBQUssYUFBYSxJQUFJLGNBQWMsS0FBSyxjQUFjLEFBQUMsRUFBRTtBQUN6RSxpQkFBTyxJQUFJLENBQUM7U0FDYjtBQUNELFNBQUMsRUFBRSxDQUFDO09BQ0w7QUFDRCxhQUFPLEtBQUssQ0FBQztLQUNkOzs7U0F6QkcsUUFBUTs7O0FBNEJaLE1BQU0sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDOzs7Ozs7Ozs7SUM1QnRCLEtBQUs7V0FBTCxLQUFLOzBCQUFMLEtBQUs7OztlQUFMLEtBQUs7O1dBQ0osZUFBQyxHQUFHLEVBQUM7QUFDUixVQUFHLE9BQU8sR0FBRyxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUM7QUFDeEQsWUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0FBQ2hCLGNBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM3QyxjQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixpQkFBTyxJQUFJLENBQUM7U0FDZjtBQUNELGVBQU8sS0FBSyxDQUFDO09BQ2Q7S0FDRjs7O1NBVkcsS0FBSzs7O0FBY1gsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiZnVuY3Rpb24gaW5oZXJpdCAoZXh0ZW5kdGhpcywgZnJvbXRoZXNlKSB7XG4gIHZhciBrZXlzPVtdO1xuICBpZihleHRlbmR0aGlzLnByb3RvdHlwZSA9PSB1bmRlZmluZWQpe1xuICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24oKXt9XG4gICAgICBFbXB0eS5wcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuICAgICAgZXh0ZW5kdGhpcy5wcm90b3R5cGUgPSBFbXB0eS5wcm90b3R5cGU7XG4gIH1cbiAgZnJvbXRoZXNlLm1hcChmdW5jdGlvbihmcm9tdGhpcyl7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZyb210aGlzLnByb3RvdHlwZSk7XG4gICAga2V5cy5zaGlmdCgpO1xuICAgIGtleXMubWFwKGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIGV4dGVuZHRoaXMucHJvdG90eXBlW2tleV09IGZyb210aGlzLnByb3RvdHlwZVtrZXldO1xuICAgIH0pO1xuICB9KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5oZXJpdDtcbiIsInZhciBpbmNsdWRlcyAgICA9IHJlcXVpcmUoJy4vcG9seWZpbGxzL2luY2x1ZGVzJyk7XG52YXIgbG9va3VwICAgICAgPSByZXF1aXJlKCcuL3BvbHlmaWxscy9maW5kLW9iamVjdCcpO1xudmFyIHRyYXNoICAgICAgID0gcmVxdWlyZSgnLi9wb2x5ZmlsbHMvdHJhc2gnKTtcbnZhciBjb3B5ICAgICAgICA9IHJlcXVpcmUoJy4vcG9seWZpbGxzL2NvcHknKTtcbnZhciBjbGVhciAgICAgICA9IHJlcXVpcmUoJy4vcG9seWZpbGxzL2NsZWFyJyk7XG5cbnZhciBpbmhlcml0ID0gcmVxdWlyZSgnaW5oZXJpdC1wcm90b3R5cGVzJyk7XG5cblxubGV0IGRlcGVuZGVuY2llcyA9IFtpbmNsdWRlcywgbG9va3VwLCBjb3B5LCBjbGVhciwgdHJhc2hdO1xuXG5jbGFzcyBBcnJheUluY2x1ZGVzUG9sbHlmaWxscyBleHRlbmRzIEFycmF5IHtcbiAgY29uc3RydWN0b3IoYXJyYXkpe1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIGlmKHR5cGVvZiBhcnJheSA9PSAnYXJyYXknKVxuICAgIGFycmF5Lm1hcCgoZWxlbWVudCk9PntcbiAgICAgIHRoaXMucHVzaChlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIGlmKHR5cGVvZiBhcnJheSA9PSAnb2JqZWN0Jyl7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFycmF5KTtcbiAgICAgIGtleXMubWFwKChrZXkpPT57XG4gICAgICAgIHRoaXMucHVzaChhcnJheVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG59XG5cblxuaW5oZXJpdChBcnJheUluY2x1ZGVzUG9sbHlmaWxscywgZGVwZW5kZW5jaWVzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheUluY2x1ZGVzUG9sbHlmaWxsc1xuIiwidmFyIGFyckVTNiA9IHJlcXVpcmUoJy4vYXJyYXktaW5jbHVkZXMtcG9seWZpbGwtZXM2Jyk7XG52YXIgYXJyID0gbmV3IGFyckVTNigpO1xudmFyIGRlZmF1bHRMZW5ndGggPSBuZXcgYXJyRVM2KCk7XG5jb25zb2xlLmxvZyhkZWZhdWx0TGVuZ3RoKTtcblxuYXJyLnB1c2goJ0hhcyBpbmNsdWRlcyBwb2x5ZmlsbCcpO1xuY29uc29sZS5sb2coYXJyLmluY2x1ZGVzKCdIYXMgaW5jbHVkZXMgcG9seWZpbGwnKSk7XG5jb25zb2xlLmxvZyhhcnIpO1xuXG52YXIgb2JqMSA9IHtpZDonXyQxUUEyV1MzRUQnLCB1c2VyOidqb2huIGRvZScsIGRldGFpbHM6e2RvYjonMDEvMDEvOTknfX07XG52YXIgb2JqMiA9IHtpZDonXyQxUUEyV1MzRUYnLCB1c2VyOidqb2huIGRvZScsIGRldGFpbHM6e2RvYjonMDEvMDIvOTknfX07XG52YXIgb2JqMyA9IHtpZDonXyQxUUEyV1MzRUcnLCB1c2VyOidqb2huIGRvZScsIGRldGFpbHM6e2RvYjonMDEvMDEvOTknfX07XG5cbnZhciBvYmo0ID0ge2lkOidfJDFRQTJXUzNFSCcsIHVzZXI6J2phbmUgZG9lJywgZGV0YWlsczp7ZG9iOicwMS8wMi85OSd9fTtcbnZhciBvYmo1ID0ge2lkOidfJDFRQTJXUzNFSScsIHVzZXI6J2phY2sgZG9lJywgZGV0YWlsczp7ZG9iOicwMS8wNS85OSd9fTtcbnZhciBvYmo2ID0ge2lkOidfJDFRQTJXUzNFSicsIHVzZXI6J2p1bHkgZG9lJywgZGV0YWlsczp7ZG9iOicwMS8wNi85OSd9fTtcblxuYXJyLnB1c2gob2JqMSwgb2JqMiwgb2JqMywgb2JqNCwgb2JqNik7XG5cbmFyci5sb29rdXAoe2lkOidfJDFRQTJXUzNFRCd9KS5kZXRhaWxzLm9jY3VwYXRpb249XCJwcm9ncmFtbWVyXCI7XG5jb25zb2xlLmxvZyhhcnIubG9va3VwKHtpZDonXyQxUUEyV1MzRUQnfSkpO1xuXG5hcnIubG9va3VwKHt1c2VyOidqb2huIGRvZScsIGRldGFpbHM6e2RvYjonMDEvMDIvOTknfX0pLmRldGFpbHMub2NjdXBhdGlvbj1cInByb2dyYW1tZXJcIjtcbmNvbnNvbGUubG9nKGFyci5sb29rdXAoe3VzZXI6J2pvaG4gZG9lJywgZGV0YWlsczp7ZG9iOicwMS8wMi85OSd9fSkpO1xuXG5hcnIudHJhc2goe2lkOidfJDFRQTJXUzNFSid9KTtcbmNvbnNvbGUubG9nKGFycik7IC8vPC0tIERlbGV0ZXMgdXNlciBqdWx5IGRvZSBmcm9tIHRoZSBhcnJheSBwZXJtYW5lbnRseS5cblxudmFyIGRlc3RpbmF0aW9uID0gYXJyLmNvcHkoKTtcbmFyci5jb3B5KGRlc3RpbmF0aW9uKTtcblxudmFyIHRlc3QgPSBbe2hlbGxvOid3b3JsZCcsIGlkOjEyMzR9XTtcbnZhciBhcnIgPSBuZXcgYXJyRVM2KHRlc3QpOyAvLzwtLSB3aWxsIHJldHVybiBhIG5ldyBhcnJheS1pbmMtcG9seWZpbGwgb2JqZWN0IGdlbmVyYXRlZCBmcm9tIHRlc3QgYXJyYXlcbmNvbnNvbGUubG9nKGFyci5sb29rdXAoe2lkOjEyMzR9KSk7IC8vPC0tIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgZnJvbSBsb29rdXAgbWV0aG9kLlxuXG52YXIgYXJyID0gbmV3IGFyckVTNihbe2lkOjEyM30sIHtpZDozMjF9LCB7aWQ6MjEzfV0pO1xuY29uc29sZS5sb2coYXJyKTsgLy88LS0gc2hvdWxkIGVxdWFsIGFuIGVtcHR5IGFuIEFycmF5IGxpa2Ugb2JqZWN0O1xuYXJyLmNsZWFyKCk7XG5cbnZhciBhcnIgPSBuZXcgYXJyRVM2KHt0ZXN0OjEyMywgdGVzdGE6MzIxLCB0ZXN0YjoyMTN9KTtcbmNvbnNvbGUubG9nKGFycik7XG5hcnIuY2xlYXIoKTtcbiIsImNsYXNzIENsZWFye1xuICBjbGVhcigpe1xuICAgIHRoaXMuc3BsaWNlKDAsdGhpcy5sZW5ndGgpO1xuICAgIGlmKHRoaXMubGVuZ3RoPT0wKVxuICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENsZWFyO1xuIiwiY2xhc3MgQ29weXtcbiAgY29weShhcnIpe1xuICAgIGlmKGFycil7XG4gICAgICB0aGlzLm1hcCgoZGF0YSk9PntcbiAgICAgICAgYXJyLnB1c2goZGF0YSk7XG4gICAgICB9KTtcbiAgICB9ZWxzZXtcbiAgICAgIHZhciB4ID0gW107XG4gICAgICB0aGlzLm1hcCgoZGF0YSk9PntcbiAgICAgICAgeC5wdXNoKGRhdGEpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb3B5O1xuIiwiY2xhc3MgTG9va3Vwe1xuXG4gIGxvb2t1cChvYmosIHdpdGhJbmRleCkge1xuICAgIGxldCBPID0gT2JqZWN0KHRoaXMpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgIE8ubWFwKGZ1bmN0aW9uKG9iamVjdCwgaW5kZXgpe1xuICAgICAgaWYoX2lzRmxhdChvYmplY3QpKXtcbiAgICAgICAgaWYoX2NvbXBhcmVPYmpzKG9iaiwgb2JqZWN0KSl7XG5cbiAgICAgICAgICBpZih3aXRoSW5kZXgpXG4gICAgICAgICAgX2RlZmluZSQkaW5kZXgob2JqZWN0LCBpbmRleCk7XG4gICAgICAgICAgcmVzdWx0LnB1c2gob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZighX2lzRmxhdChvYmplY3QpKXtcbiAgICAgICAgdmFyIHRlbXBPYmoxID0gX2ZsYXR0ZW5PYmpzKG9iamVjdCwgd2l0aEluZGV4LCBpbmRleCk7XG4gICAgICAgIHZhciB0ZW1wT2JqMiA9IF9mbGF0dGVuT2JqcyhvYmosIHdpdGhJbmRleCwgaW5kZXgpO1xuICAgICAgICBpZihfY29tcGFyZU9ianModGVtcE9iajIsIHRlbXBPYmoxKSl7XG4gICAgICAgICAgX2RlZmluZSQkaW5kZXgob2JqZWN0LCBpbmRleCk7XG4gICAgICAgICAgcmVzdWx0LnB1c2gob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSk7XG4gICAgdmFyIHggPSByZXN1bHQ7XG4gICAgcmVzdWx0ID0gW107XG5cblxuICAgIGlmKHgubGVuZ3RoID09PSAxKVxuICAgIHggPSB4WzBdO1xuXG4gICAgaWYoeCA9PT0gdW5kZWZpbmVkIHx8IHggPT09IG51bGwgfHwgeCA9PSAnJylcbiAgICB4ID0gZmFsc2U7XG5cbiAgICByZXR1cm4geDtcblxuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmUkJGluZGV4KG9iamVjdCwgaW5kZXgpe1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBcIl8kJGluZGV4X1wiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOmluZGV4LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gX2NvbXBhcmVPYmpzIChvYmoxLCBvYmoyKXtcbiAgdmFyIHZhbGlkYXRlID0gW107XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqMSk7XG4gIHZhciBzdGF0ZTtcblxuICBrZXlzLm1hcChmdW5jdGlvbihrZXkpe1xuICAgIGlmKG9iajFba2V5XSA9PT0gb2JqMltrZXldKVxuICAgIHZhbGlkYXRlLnB1c2godHJ1ZSk7XG4gIH0pO1xuXG4gICh2YWxpZGF0ZS5sZW5ndGggPT09IGtleXMubGVuZ3RoKSA/IHN0YXRlPXRydWUgOiBzdGF0ZT1mYWxzZTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5sZXQgX2ZsYXR0ZW5kID0ge307XG5sZXQgX3JlY3Vyc2lvbiA9IGZhbHNlO1xuXG5mdW5jdGlvbiBfZmxhdHRlbk9ianMob2JqZWN0LCB3aXRoSW5kZXgsIGluZGV4KXtcbiAgaWYoIV9yZWN1cnNpb24pIF9mbGF0dGVuZCA9IHt9O1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBrZXlzLm1hcChmdW5jdGlvbihrZXkpe1xuXG4gICAgaWYoIV9pc09iamVjdChvYmplY3Rba2V5XSkpXG4gICAgICBfZmxhdHRlbmRba2V5XSA9IG9iamVjdFtrZXldO1xuICAgIGlmKF9pc09iamVjdChvYmplY3Rba2V5XSkpe1xuICAgICAgX3JlY3Vyc2lvbiA9IHRydWU7XG4gICAgICBfZmxhdHRlbk9ianMob2JqZWN0W2tleV0pO1xuICAgIH1cbiAgfSk7XG5cbiAgX3JlY3Vyc2lvbiA9IGZhbHNlO1xuICBpZih3aXRoSW5kZXgpXG4gIF9kZWZpbmUkJGluZGV4KF9mbGF0dGVuZCwgaW5kZXgpO1xuICByZXR1cm4gX2ZsYXR0ZW5kO1xufVxuXG5mdW5jdGlvbiBfaXNGbGF0KG9iamVjdCl7XG4gICAgdmFyIHZhbGlkYXRlID0gW107XG4gICAgaWYob2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0KXtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG4gICAgICBrZXlzLm1hcChmdW5jdGlvbihrZXkpe1xuICAgICAgICBpZihvYmplY3Rba2V5XSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgdmFsaWRhdGUucHVzaCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZS5sZW5ndGggPiAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiBmdW5jdGlvbiBfaXNPYmplY3Qob2JqZWN0KXtcbiAgIGlmKG9iamVjdCBpbnN0YW5jZW9mIE9iamVjdClcbiAgIHJldHVybiB0cnVlO1xuICAgcmV0dXJuIGZhbHNlO1xuIH1cblxubW9kdWxlLmV4cG9ydHMgPSBMb29rdXA7XG4iLCJjbGFzcyBJbmNsdWRlcyB7XG4gaW5jbHVkZXMgKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCovICl7XG4gICAgdmFyIE8gPSBPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IHBhcnNlSW50KE8ubGVuZ3RoKSB8fCAwO1xuICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIG4gPSBwYXJzZUludChhcmd1bWVudHNbMV0pIHx8IDA7XG4gICAgdmFyIGs7XG4gICAgaWYgKG4gPj0gMCkge1xuICAgICAgayA9IG47XG4gICAgfSBlbHNlIHtcbiAgICAgIGsgPSBsZW4gKyBuO1xuICAgICAgaWYgKGsgPCAwKSB7ayA9IDA7fVxuICAgIH1cbiAgICB2YXIgY3VycmVudEVsZW1lbnQ7XG4gICAgd2hpbGUgKGsgPCBsZW4pIHtcbiAgICAgIGN1cnJlbnRFbGVtZW50ID0gT1trXTtcbiAgICAgIGlmIChzZWFyY2hFbGVtZW50ID09PSBjdXJyZW50RWxlbWVudCB8fFxuICAgICAgICAgKHNlYXJjaEVsZW1lbnQgIT09IHNlYXJjaEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgIT09IGN1cnJlbnRFbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGsrKztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG59XG4gIG1vZHVsZS5leHBvcnRzID0gSW5jbHVkZXM7XG4iLCJjbGFzcyBUcmFzaHtcbiAgdHJhc2gob2JqKXtcbiAgICBpZih0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoICE9IDApe1xuICAgICAgaWYodGhpcy5sb29rdXAob2JqKSl7XG4gICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sb29rdXAob2JqLCB0cnVlKS5fJCRpbmRleF87XG4gICAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFzaDtcbiJdfQ==