UNPKG

react-scripts

Version:
933 lines (802 loc) 79.7 kB
'use strict'; exports.__esModule = true; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _declaration = require('./declaration'); var _declaration2 = _interopRequireDefault(_declaration); var _warnOnce = require('./warn-once'); var _warnOnce2 = _interopRequireDefault(_warnOnce); var _comment = require('./comment'); var _comment2 = _interopRequireDefault(_comment); var _node = require('./node'); var _node2 = _interopRequireDefault(_node); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 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; } function cleanSource(nodes) { return nodes.map(function (i) { if (i.nodes) i.nodes = cleanSource(i.nodes); delete i.source; return i; }); } /** * @callback childCondition * @param {Node} node - container child * @param {number} index - child index * @param {Node[]} nodes - all container children * @return {boolean} */ /** * @callback childIterator * @param {Node} node - container child * @param {number} index - child index * @return {false|undefined} returning `false` will break iteration */ /** * The {@link Root}, {@link AtRule}, and {@link Rule} container nodes * inherit some common methods to help work with their children. * * Note that all containers can store any content. If you write a rule inside * a rule, PostCSS will parse it. * * @extends Node * @abstract */ var Container = function (_Node) { _inherits(Container, _Node); function Container() { _classCallCheck(this, Container); return _possibleConstructorReturn(this, _Node.apply(this, arguments)); } Container.prototype.push = function push(child) { child.parent = this; this.nodes.push(child); return this; }; /** * Iterates through the container’s immediate children, * calling `callback` for each child. * * Returning `false` in the callback will break iteration. * * This method only iterates through the container’s immediate children. * If you need to recursively iterate through all the container’s descendant * nodes, use {@link Container#walk}. * * Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe * if you are mutating the array of child nodes during iteration. * PostCSS will adjust the current index to match the mutations. * * @param {childIterator} callback - iterator receives each node and index * * @return {false|undefined} returns `false` if iteration was broke * * @example * const root = postcss.parse('a { color: black; z-index: 1 }'); * const rule = root.first; * * for ( let decl of rule.nodes ) { * decl.cloneBefore({ prop: '-webkit-' + decl.prop }); * // Cycle will be infinite, because cloneBefore moves the current node * // to the next index * } * * rule.each(decl => { * decl.cloneBefore({ prop: '-webkit-' + decl.prop }); * // Will be executed only for color and z-index * }); */ Container.prototype.each = function each(callback) { if (!this.lastEach) this.lastEach = 0; if (!this.indexes) this.indexes = {}; this.lastEach += 1; var id = this.lastEach; this.indexes[id] = 0; if (!this.nodes) return undefined; var index = void 0, result = void 0; while (this.indexes[id] < this.nodes.length) { index = this.indexes[id]; result = callback(this.nodes[index], index); if (result === false) break; this.indexes[id] += 1; } delete this.indexes[id]; return result; }; /** * Traverses the container’s descendant nodes, calling callback * for each node. * * Like container.each(), this method is safe to use * if you are mutating arrays during iteration. * * If you only need to iterate through the container’s immediate children, * use {@link Container#each}. * * @param {childIterator} callback - iterator receives each node and index * * @return {false|undefined} returns `false` if iteration was broke * * @example * root.walk(node => { * // Traverses all descendant nodes. * }); */ Container.prototype.walk = function walk(callback) { return this.each(function (child, i) { var result = callback(child, i); if (result !== false && child.walk) { result = child.walk(callback); } return result; }); }; /** * Traverses the container’s descendant nodes, calling callback * for each declaration node. * * If you pass a filter, iteration will only happen over declarations * with matching properties. * * Like {@link Container#each}, this method is safe * to use if you are mutating arrays during iteration. * * @param {string|RegExp} [prop] - string or regular expression * to filter declarations by property name * @param {childIterator} callback - iterator receives each node and index * * @return {false|undefined} returns `false` if iteration was broke * * @example * root.walkDecls(decl => { * checkPropertySupport(decl.prop); * }); * * root.walkDecls('border-radius', decl => { * decl.remove(); * }); * * root.walkDecls(/^background/, decl => { * decl.value = takeFirstColorFromGradient(decl.value); * }); */ Container.prototype.walkDecls = function walkDecls(prop, callback) { if (!callback) { callback = prop; return this.walk(function (child, i) { if (child.type === 'decl') { return callback(child, i); } }); } else if (prop instanceof RegExp) { return this.walk(function (child, i) { if (child.type === 'decl' && prop.test(child.prop)) { return callback(child, i); } }); } else { return this.walk(function (child, i) { if (child.type === 'decl' && child.prop === prop) { return callback(child, i); } }); } }; /** * Traverses the container’s descendant nodes, calling callback * for each rule node. * * If you pass a filter, iteration will only happen over rules * with matching selectors. * * Like {@link Container#each}, this method is safe * to use if you are mutating arrays during iteration. * * @param {string|RegExp} [selector] - string or regular expression * to filter rules by selector * @param {childIterator} callback - iterator receives each node and index * * @return {false|undefined} returns `false` if iteration was broke * * @example * const selectors = []; * root.walkRules(rule => { * selectors.push(rule.selector); * }); * console.log(`Your CSS uses ${selectors.length} selectors`); */ Container.prototype.walkRules = function walkRules(selector, callback) { if (!callback) { callback = selector; return this.walk(function (child, i) { if (child.type === 'rule') { return callback(child, i); } }); } else if (selector instanceof RegExp) { return this.walk(function (child, i) { if (child.type === 'rule' && selector.test(child.selector)) { return callback(child, i); } }); } else { return this.walk(function (child, i) { if (child.type === 'rule' && child.selector === selector) { return callback(child, i); } }); } }; /** * Traverses the container’s descendant nodes, calling callback * for each at-rule node. * * If you pass a filter, iteration will only happen over at-rules * that have matching names. * * Like {@link Container#each}, this method is safe * to use if you are mutating arrays during iteration. * * @param {string|RegExp} [name] - string or regular expression * to filter at-rules by name * @param {childIterator} callback - iterator receives each node and index * * @return {false|undefined} returns `false` if iteration was broke * * @example * root.walkAtRules(rule => { * if ( isOld(rule.name) ) rule.remove(); * }); * * let first = false; * root.walkAtRules('charset', rule => { * if ( !first ) { * first = true; * } else { * rule.remove(); * } * }); */ Container.prototype.walkAtRules = function walkAtRules(name, callback) { if (!callback) { callback = name; return this.walk(function (child, i) { if (child.type === 'atrule') { return callback(child, i); } }); } else if (name instanceof RegExp) { return this.walk(function (child, i) { if (child.type === 'atrule' && name.test(child.name)) { return callback(child, i); } }); } else { return this.walk(function (child, i) { if (child.type === 'atrule' && child.name === name) { return callback(child, i); } }); } }; /** * Traverses the container’s descendant nodes, calling callback * for each comment node. * * Like {@link Container#each}, this method is safe * to use if you are mutating arrays during iteration. * * @param {childIterator} callback - iterator receives each node and index * * @return {false|undefined} returns `false` if iteration was broke * * @example * root.walkComments(comment => { * comment.remove(); * }); */ Container.prototype.walkComments = function walkComments(callback) { return this.walk(function (child, i) { if (child.type === 'comment') { return callback(child, i); } }); }; /** * Inserts new nodes to the start of the container. * * @param {...(Node|object|string|Node[])} children - new nodes * * @return {Node} this node for methods chain * * @example * const decl1 = postcss.decl({ prop: 'color', value: 'black' }); * const decl2 = postcss.decl({ prop: 'background-color', value: 'white' }); * rule.append(decl1, decl2); * * root.append({ name: 'charset', params: '"UTF-8"' }); // at-rule * root.append({ selector: 'a' }); // rule * rule.append({ prop: 'color', value: 'black' }); // declaration * rule.append({ text: 'Comment' }) // comment * * root.append('a {}'); * root.first.append('color: black; z-index: 1'); */ Container.prototype.append = function append() { for (var _len = arguments.length, children = Array(_len), _key = 0; _key < _len; _key++) { children[_key] = arguments[_key]; } for (var _iterator = children, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var child = _ref; var nodes = this.normalize(child, this.last); for (var _iterator2 = nodes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var node = _ref2; this.nodes.push(node); } } return this; }; /** * Inserts new nodes to the end of the container. * * @param {...(Node|object|string|Node[])} children - new nodes * * @return {Node} this node for methods chain * * @example * const decl1 = postcss.decl({ prop: 'color', value: 'black' }); * const decl2 = postcss.decl({ prop: 'background-color', value: 'white' }); * rule.prepend(decl1, decl2); * * root.append({ name: 'charset', params: '"UTF-8"' }); // at-rule * root.append({ selector: 'a' }); // rule * rule.append({ prop: 'color', value: 'black' }); // declaration * rule.append({ text: 'Comment' }) // comment * * root.append('a {}'); * root.first.append('color: black; z-index: 1'); */ Container.prototype.prepend = function prepend() { for (var _len2 = arguments.length, children = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { children[_key2] = arguments[_key2]; } children = children.reverse(); for (var _iterator3 = children, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var child = _ref3; var nodes = this.normalize(child, this.first, 'prepend').reverse(); for (var _iterator4 = nodes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var node = _ref4; this.nodes.unshift(node); }for (var id in this.indexes) { this.indexes[id] = this.indexes[id] + nodes.length; } } return this; }; Container.prototype.cleanRaws = function cleanRaws(keepBetween) { _Node.prototype.cleanRaws.call(this, keepBetween); if (this.nodes) { for (var _iterator5 = this.nodes, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } var node = _ref5; node.cleanRaws(keepBetween); } } }; /** * Insert new node before old node within the container. * * @param {Node|number} exist - child or child’s index. * @param {Node|object|string|Node[]} add - new node * * @return {Node} this node for methods chain * * @example * rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop })); */ Container.prototype.insertBefore = function insertBefore(exist, add) { exist = this.index(exist); var type = exist === 0 ? 'prepend' : false; var nodes = this.normalize(add, this.nodes[exist], type).reverse(); for (var _iterator6 = nodes, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref6 = _i6.value; } var node = _ref6; this.nodes.splice(exist, 0, node); }var index = void 0; for (var id in this.indexes) { index = this.indexes[id]; if (exist <= index) { this.indexes[id] = index + nodes.length; } } return this; }; /** * Insert new node after old node within the container. * * @param {Node|number} exist - child or child’s index * @param {Node|object|string|Node[]} add - new node * * @return {Node} this node for methods chain */ Container.prototype.insertAfter = function insertAfter(exist, add) { exist = this.index(exist); var nodes = this.normalize(add, this.nodes[exist]).reverse(); for (var _iterator7 = nodes, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref7; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref7 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref7 = _i7.value; } var node = _ref7; this.nodes.splice(exist + 1, 0, node); }var index = void 0; for (var id in this.indexes) { index = this.indexes[id]; if (exist < index) { this.indexes[id] = index + nodes.length; } } return this; }; Container.prototype.remove = function remove(child) { if (typeof child !== 'undefined') { (0, _warnOnce2.default)('Container#remove is deprecated. ' + 'Use Container#removeChild'); this.removeChild(child); } else { _Node.prototype.remove.call(this); } return this; }; /** * Removes node from the container and cleans the parent properties * from the node and its children. * * @param {Node|number} child - child or child’s index * * @return {Node} this node for methods chain * * @example * rule.nodes.length //=> 5 * rule.removeChild(decl); * rule.nodes.length //=> 4 * decl.parent //=> undefined */ Container.prototype.removeChild = function removeChild(child) { child = this.index(child); this.nodes[child].parent = undefined; this.nodes.splice(child, 1); var index = void 0; for (var id in this.indexes) { index = this.indexes[id]; if (index >= child) { this.indexes[id] = index - 1; } } return this; }; /** * Removes all children from the container * and cleans their parent properties. * * @return {Node} this node for methods chain * * @example * rule.removeAll(); * rule.nodes.length //=> 0 */ Container.prototype.removeAll = function removeAll() { for (var _iterator8 = this.nodes, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { var _ref8; if (_isArray8) { if (_i8 >= _iterator8.length) break; _ref8 = _iterator8[_i8++]; } else { _i8 = _iterator8.next(); if (_i8.done) break; _ref8 = _i8.value; } var node = _ref8; node.parent = undefined; }this.nodes = []; return this; }; /** * Passes all declaration values within the container that match pattern * through callback, replacing those values with the returned result * of callback. * * This method is useful if you are using a custom unit or function * and need to iterate through all values. * * @param {string|RegExp} pattern - replace pattern * @param {object} opts - options to speed up the search * @param {string} opts.prop - an array of property names * @param {string} opts.fast - string that’s used * to narrow down values and speed up * the regexp search * @param {function|string} callback - string to replace pattern * or callback that returns a new value. * The callback will receive * the same arguments as those passed * to a function parameter * of `String#replace`. * * @return {Node} this node for methods chain * * @example * root.replaceValues(/\d+rem/, { fast: 'rem' }, string => { * return 15 * parseInt(string) + 'px'; * }); */ Container.prototype.replaceValues = function replaceValues(pattern, opts, callback) { if (!callback) { callback = opts; opts = {}; } this.walkDecls(function (decl) { if (opts.props && opts.props.indexOf(decl.prop) === -1) return; if (opts.fast && decl.value.indexOf(opts.fast) === -1) return; decl.value = decl.value.replace(pattern, callback); }); return this; }; /** * Returns `true` if callback returns `true` * for all of the container’s children. * * @param {childCondition} condition - iterator returns true or false. * * @return {boolean} is every child pass condition * * @example * const noPrefixes = rule.every(i => i.prop[0] !== '-'); */ Container.prototype.every = function every(condition) { return this.nodes.every(condition); }; /** * Returns `true` if callback returns `true` for (at least) one * of the container’s children. * * @param {childCondition} condition - iterator returns true or false. * * @return {boolean} is every child pass condition * * @example * const hasPrefix = rule.every(i => i.prop[0] === '-'); */ Container.prototype.some = function some(condition) { return this.nodes.some(condition); }; /** * Returns a `child`’s index within the {@link Container#nodes} array. * * @param {Node} child - child of the current container. * * @return {number} child index * * @example * rule.index( rule.nodes[2] ) //=> 2 */ Container.prototype.index = function index(child) { if (typeof child === 'number') { return child; } else { return this.nodes.indexOf(child); } }; /** * The container’s first child. * * @type {Node} * * @example * rule.first == rules.nodes[0]; */ Container.prototype.normalize = function normalize(nodes, sample) { var _this2 = this; if (typeof nodes === 'string') { var parse = require('./parse'); nodes = cleanSource(parse(nodes).nodes); } else if (!Array.isArray(nodes)) { if (nodes.type === 'root') { nodes = nodes.nodes; } else if (nodes.type) { nodes = [nodes]; } else if (nodes.prop) { if (typeof nodes.value === 'undefined') { throw new Error('Value field is missed in node creation'); } else if (typeof nodes.value !== 'string') { nodes.value = String(nodes.value); } nodes = [new _declaration2.default(nodes)]; } else if (nodes.selector) { var Rule = require('./rule'); nodes = [new Rule(nodes)]; } else if (nodes.name) { var AtRule = require('./at-rule'); nodes = [new AtRule(nodes)]; } else if (nodes.text) { nodes = [new _comment2.default(nodes)]; } else { throw new Error('Unknown node type in node creation'); } } var processed = nodes.map(function (i) { if (typeof i.raws === 'undefined') i = _this2.rebuild(i); if (i.parent) i = i.clone(); if (typeof i.raws.before === 'undefined') { if (sample && typeof sample.raws.before !== 'undefined') { i.raws.before = sample.raws.before.replace(/[^\s]/g, ''); } } i.parent = _this2; return i; }); return processed; }; Container.prototype.rebuild = function rebuild(node, parent) { var _this3 = this; var fix = void 0; if (node.type === 'root') { var Root = require('./root'); fix = new Root(); } else if (node.type === 'atrule') { var AtRule = require('./at-rule'); fix = new AtRule(); } else if (node.type === 'rule') { var Rule = require('./rule'); fix = new Rule(); } else if (node.type === 'decl') { fix = new _declaration2.default(); } else if (node.type === 'comment') { fix = new _comment2.default(); } for (var i in node) { if (i === 'nodes') { fix.nodes = node.nodes.map(function (j) { return _this3.rebuild(j, fix); }); } else if (i === 'parent' && parent) { fix.parent = parent; } else if (node.hasOwnProperty(i)) { fix[i] = node[i]; } } return fix; }; Container.prototype.eachInside = function eachInside(callback) { (0, _warnOnce2.default)('Container#eachInside is deprecated. ' + 'Use Container#walk instead.'); return this.walk(callback); }; Container.prototype.eachDecl = function eachDecl(prop, callback) { (0, _warnOnce2.default)('Container#eachDecl is deprecated. ' + 'Use Container#walkDecls instead.'); return this.walkDecls(prop, callback); }; Container.prototype.eachRule = function eachRule(selector, callback) { (0, _warnOnce2.default)('Container#eachRule is deprecated. ' + 'Use Container#walkRules instead.'); return this.walkRules(selector, callback); }; Container.prototype.eachAtRule = function eachAtRule(name, callback) { (0, _warnOnce2.default)('Container#eachAtRule is deprecated. ' + 'Use Container#walkAtRules instead.'); return this.walkAtRules(name, callback); }; Container.prototype.eachComment = function eachComment(callback) { (0, _warnOnce2.default)('Container#eachComment is deprecated. ' + 'Use Container#walkComments instead.'); return this.walkComments(callback); }; _createClass(Container, [{ key: 'first', get: function get() { if (!this.nodes) return undefined; return this.nodes[0]; } /** * The container’s last child. * * @type {Node} * * @example * rule.last == rule.nodes[rule.nodes.length - 1]; */ }, { key: 'last', get: function get() { if (!this.nodes) return undefined; return this.nodes[this.nodes.length - 1]; } }, { key: 'semicolon', get: function get() { (0, _warnOnce2.default)('Node#semicolon is deprecated. Use Node#raws.semicolon'); return this.raws.semicolon; }, set: function set(val) { (0, _warnOnce2.default)('Node#semicolon is deprecated. Use Node#raws.semicolon'); this.raws.semicolon = val; } }, { key: 'after', get: function get() { (0, _warnOnce2.default)('Node#after is deprecated. Use Node#raws.after'); return this.raws.after; }, set: function set(val) { (0, _warnOnce2.default)('Node#after is deprecated. Use Node#raws.after'); this.raws.after = val; } /** * @memberof Container# * @member {Node[]} nodes - an array containing the container’s children * * @example * const root = postcss.parse('a { color: black }'); * root.nodes.length //=> 1 * root.nodes[0].selector //=> 'a' * root.nodes[0].nodes[0].prop //=> 'color' */ }]); return Container; }(_node2.default); exports.default = Container; module.exports = exports['default']; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5lczYiXSwibmFtZXMiOlsiY2xlYW5Tb3VyY2UiLCJub2RlcyIsIm1hcCIsImkiLCJzb3VyY2UiLCJDb250YWluZXIiLCJwdXNoIiwiY2hpbGQiLCJwYXJlbnQiLCJlYWNoIiwiY2FsbGJhY2siLCJsYXN0RWFjaCIsImluZGV4ZXMiLCJpZCIsInVuZGVmaW5lZCIsImluZGV4IiwicmVzdWx0IiwibGVuZ3RoIiwid2FsayIsIndhbGtEZWNscyIsInByb3AiLCJ0eXBlIiwiUmVnRXhwIiwidGVzdCIsIndhbGtSdWxlcyIsInNlbGVjdG9yIiwid2Fsa0F0UnVsZXMiLCJuYW1lIiwid2Fsa0NvbW1lbnRzIiwiYXBwZW5kIiwiY2hpbGRyZW4iLCJub3JtYWxpemUiLCJsYXN0Iiwibm9kZSIsInByZXBlbmQiLCJyZXZlcnNlIiwiZmlyc3QiLCJ1bnNoaWZ0IiwiY2xlYW5SYXdzIiwia2VlcEJldHdlZW4iLCJpbnNlcnRCZWZvcmUiLCJleGlzdCIsImFkZCIsInNwbGljZSIsImluc2VydEFmdGVyIiwicmVtb3ZlIiwicmVtb3ZlQ2hpbGQiLCJyZW1vdmVBbGwiLCJyZXBsYWNlVmFsdWVzIiwicGF0dGVybiIsIm9wdHMiLCJwcm9wcyIsImluZGV4T2YiLCJkZWNsIiwiZmFzdCIsInZhbHVlIiwicmVwbGFjZSIsImV2ZXJ5IiwiY29uZGl0aW9uIiwic29tZSIsInNhbXBsZSIsInBhcnNlIiwicmVxdWlyZSIsIkFycmF5IiwiaXNBcnJheSIsIkVycm9yIiwiU3RyaW5nIiwiUnVsZSIsIkF0UnVsZSIsInRleHQiLCJwcm9jZXNzZWQiLCJyYXdzIiwicmVidWlsZCIsImNsb25lIiwiYmVmb3JlIiwiZml4IiwiUm9vdCIsImoiLCJoYXNPd25Qcm9wZXJ0eSIsImVhY2hJbnNpZGUiLCJlYWNoRGVjbCIsImVhY2hSdWxlIiwiZWFjaEF0UnVsZSIsImVhY2hDb21tZW50Iiwic2VtaWNvbG9uIiwidmFsIiwiYWZ0ZXIiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFB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TyxLQUFLa0IsWUFBTCxDQUFrQmxCLFFBQWxCLENBQVA7QUFDSCxLOzs7OzRCQXpIVztBQUNSLGdCQUFLLENBQUMsS0FBS1QsS0FBWCxFQUFtQixPQUFPYSxTQUFQO0FBQ25CLG1CQUFPLEtBQUtiLEtBQUwsQ0FBVyxDQUFYLENBQVA7QUFDSDs7QUFFRDs7Ozs7Ozs7Ozs7NEJBUVc7QUFDUCxnQkFBSyxDQUFDLEtBQUtBLEtBQVgsRUFBbUIsT0FBT2EsU0FBUDtBQUNuQixtQkFBTyxLQUFLYixLQUFMLENBQVcsS0FBS0EsS0FBTCxDQUFXZ0IsTUFBWCxHQUFvQixDQUEvQixDQUFQO0FBQ0g7Ozs0QkEyR2U7QUFDWixvQ0FBUyx1REFBVDtBQUNBLG1CQUFPLEtBQUtzRCxJQUFMLENBQVVhLFNBQWpCO0FBQ0gsUzswQkFFYUMsRyxFQUFLO0FBQ2Ysb0NBQVMsdURBQVQ7QUFDQSxpQkFBS2QsSUFBTCxDQUFVYSxTQUFWLEdBQXNCQyxHQUF0QjtBQUNIOzs7NEJBRVc7QUFDUixvQ0FBUywrQ0FBVDtBQUNBLG1CQUFPLEtBQUtkLElBQUwsQ0FBVWUsS0FBakI7QUFDSCxTOzBCQUVTRCxHLEVBQUs7QUFDWCxvQ0FBUywrQ0FBVDtBQUNBLGlCQUFLZCxJQUFMLENBQVVlLEtBQVYsR0FBa0JELEdBQWxCO0FBQ0g7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBYVdoRixTIiwiZmlsZSI6ImNvbnRhaW5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEZWNsYXJhdGlvbiBmcm9tICcuL2RlY2xhcmF0aW9uJztcbmltcG9ydCB3YXJuT25jZSAgICBmcm9tICcuL3dhcm4tb25jZSc7XG5pbXBvcnQgQ29tbWVudCAgICAgZnJvbSAnLi9jb21tZW50JztcbmltcG9ydCBOb2RlICAgICAgICBmcm9tICcuL25vZGUnO1xuXG5mdW5jdGlvbiBjbGVhblNvdXJjZShub2Rlcykge1xuICAgIHJldHVybiBub2Rlcy5tYXAoIGkgPT4ge1xuICAgICAgICBpZiAoIGkubm9kZXMgKSBpLm5vZGVzID0gY2xlYW5Tb3VyY2UoaS5ub2Rlcyk7XG4gICAgICAgIGRlbGV0ZSBpLnNvdXJjZTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIGNoaWxkQ29uZGl0aW9uXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgICAgLSBjb250YWluZXIgY2hpbGRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIGNoaWxkIGluZGV4XG4gKiBAcGFyYW0ge05vZGVbXX0gbm9kZXMgLSBhbGwgY29udGFpbmVyIGNoaWxkcmVuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbiAvKipcbiAgKiBAY2FsbGJhY2sgY2hpbGRJdGVyYXRvclxuICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAgICAtIGNvbnRhaW5lciBjaGlsZFxuICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIGNoaWxkIGluZGV4XG4gICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSByZXR1cm5pbmcgYGZhbHNlYCB3aWxsIGJyZWFrIGl0ZXJhdGlvblxuICAqL1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgUm9vdH0sIHtAbGluayBBdFJ1bGV9LCBhbmQge0BsaW5rIFJ1bGV9IGNvbnRhaW5lciBub2Rlc1xuICogaW5oZXJpdCBzb21lIGNvbW1vbiBtZXRob2RzIHRvIGhlbHAgd29yayB3aXRoIHRoZWlyIGNoaWxkcmVuLlxuICpcbiAqIE5vdGUgdGhhdCBhbGwgY29udGFpbmVycyBjYW4gc3RvcmUgYW55IGNvbnRlbnQuIElmIHlvdSB3cml0ZSBhIHJ1bGUgaW5zaWRlXG4gKiBhIHJ1bGUsIFBvc3RDU1Mgd2lsbCBwYXJzZSBpdC5cbiAqXG4gKiBAZXh0ZW5kcyBOb2RlXG4gKiBAYWJzdHJhY3RcbiAqL1xuY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgTm9kZSB7XG5cbiAgICBwdXNoKGNoaWxkKSB7XG4gICAgICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgICAgIHRoaXMubm9kZXMucHVzaChjaGlsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGNvbnRhaW5lcuKAmXMgaW1tZWRpYXRlIGNoaWxkcmVuLFxuICAgICAqIGNhbGxpbmcgYGNhbGxiYWNrYCBmb3IgZWFjaCBjaGlsZC5cbiAgICAgKlxuICAgICAqIFJldHVybmluZyBgZmFsc2VgIGluIHRoZSBjYWxsYmFjayB3aWxsIGJyZWFrIGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgY29udGFpbmVy4oCZcyBpbW1lZGlhdGUgY2hpbGRyZW4uXG4gICAgICogSWYgeW91IG5lZWQgdG8gcmVjdXJzaXZlbHkgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgY29udGFpbmVy4oCZcyBkZXNjZW5kYW50XG4gICAgICogbm9kZXMsIHVzZSB7QGxpbmsgQ29udGFpbmVyI3dhbGt9LlxuICAgICAqXG4gICAgICogVW5saWtlIHRoZSBmb3IgYHt9YC1jeWNsZSBvciBgQXJyYXkjZm9yRWFjaGAgdGhpcyBpdGVyYXRvciBpcyBzYWZlXG4gICAgICogaWYgeW91IGFyZSBtdXRhdGluZyB0aGUgYXJyYXkgb2YgY2hpbGQgbm9kZXMgZHVyaW5nIGl0ZXJhdGlvbi5cbiAgICAgKiBQb3N0Q1NTIHdpbGwgYWRqdXN0IHRoZSBjdX