apeman-react-upload
Version:
apeman react package for file upload components.
282 lines (240 loc) • 24.2 kB
JavaScript
/**
* apeman react package for file upload components.
* @class ApUpload
*/
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _async = require('async');
var _async2 = _interopRequireDefault(_async);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _uuid = require('uuid');
var _uuid2 = _interopRequireDefault(_uuid);
var _apemanReactImage = require('apeman-react-image');
var _apemanReactSpinner = require('apeman-react-spinner');
var _apemanReactButton = require('apeman-react-button');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/** @lends ApUpload */
var ApUpload = _react2.default.createClass({
displayName: 'ApUpload',
// --------------------
// Specs
// --------------------
propTypes: {
/** Name of input */
name: _react.PropTypes.string,
/** DOM id of input */
id: _react.PropTypes.string,
/** Allow multiple upload */
multiple: _react.PropTypes.bool,
/** Handler for change event */
onChange: _react.PropTypes.func,
/** Handler for load event */
onLoad: _react.PropTypes.func,
/** Handler for error event */
onError: _react.PropTypes.func,
/** Image width */
width: _react.PropTypes.number,
/** Image height */
height: _react.PropTypes.number,
/** Guide text */
text: _react.PropTypes.string,
/** Accept file type */
accept: _react.PropTypes.string,
/** Guide icon */
icon: _react.PropTypes.string,
/** Icon for close images */
closeIcon: _react.PropTypes.string,
/** Spinner theme */
spinner: _react.PropTypes.string,
/** Value of input */
value: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.array])
},
mixins: [],
statics: {
readFile: function readFile(file, callback) {
var reader = new window.FileReader();
reader.onerror = function onerror(err) {
callback(err);
};
reader.onload = function onload(ev) {
callback(null, ev.target.result);
};
reader.readAsDataURL(file);
},
isImageUrl: function isImageUrl(url) {
var imageExtensions = ['.jpg', '.jpeg', '.svg', '.gif', '.png'];
return (/^data:image/.test(url) || !!~imageExtensions.indexOf(_path2.default.extname(url))
);
}
},
getInitialState: function getInitialState() {
var s = this;
var props = s.props;
var hasValue = props.value && props.value.length > 0;
return {
spinning: false,
error: null,
urls: hasValue ? [].concat(props.value) : null
};
},
getDefaultProps: function getDefaultProps() {
return {
name: null,
id: 'ap-upload-' + _uuid2.default.v4(),
multiple: false,
width: 180,
height: 180,
accept: null,
text: 'Upload file',
icon: 'fa fa-cloud-upload',
closeIcon: 'fa fa-close',
spinnerIcon: _apemanReactSpinner.ApSpinner.DEFAULT_THEME,
onChange: null,
onLoad: null,
onError: null
};
},
render: function render() {
var s = this;
var state = s.state,
props = s.props;
var width = props.width,
height = props.height;
return _react2.default.createElement(
'div',
{ className: (0, _classnames2.default)('ap-upload', props.className),
style: (0, _assign2.default)({}, props.style) },
_react2.default.createElement('input', { type: 'file',
className: 'ap-upload-input',
multiple: props.multiple,
name: props.name,
id: props.id,
accept: props.accept,
onChange: s.handleChange,
style: { width: width, height: height }
}),
_react2.default.createElement(
'label',
{ className: 'ap-upload-label', htmlFor: props.id },
_react2.default.createElement('span', { className: 'ap-upload-aligner' }),
_react2.default.createElement(
'span',
{ className: 'ap-upload-label-inner' },
_react2.default.createElement('i', { className: (0, _classnames2.default)('ap-upload-icon', props.icon) }),
_react2.default.createElement(
'span',
{ className: 'ap-upload-text' },
props.text
),
props.children
)
),
s._renderPreviewImage(state.urls, width, height),
s._renderRemoveButton(!!(state.urls && state.urls.length > 0), props.closeIcon),
s._renderSpinner(state.spinning, props.spinner)
);
},
// --------------------
// Lifecycle
// --------------------
componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
var s = this;
var props = s.props;
var value = nextProps.value;
var hasValue = value && value.length > 0;
if (hasValue && props.value !== value) {
s.setState({ urls: [].concat(value) });
}
},
// ------------------
// Custom
// ------------------
handleChange: function handleChange(e) {
var s = this;
var props = s.props;
var target = e.target;
var files = Array.prototype.slice.call(target.files, 0);
var onChange = props.onChange,
onError = props.onError,
onLoad = props.onLoad;
s.setState({ spinning: true });
if (onChange) {
onChange(e);
}
_async2.default.concat(files, ApUpload.readFile, function (error, urls) {
s.setState({
spinning: false,
error: error,
urls: urls
});
if (error) {
if (onError) {
onError(error);
}
} else {
if (onLoad) {
var loaded = (0, _assign2.default)({ urls: urls, target: target });
onLoad(loaded);
}
}
});
},
handleRemove: function handleRemove() {
var s = this;
var props = s.props;
var onLoad = props.onLoad;
s.setState({
error: null,
urls: null
});
if (onLoad) {
onLoad([]);
}
},
// ------------------
// Private
// ------------------
_renderSpinner: function _renderSpinner(spinning, theme) {
var s = this;
return _react2.default.createElement(_apemanReactSpinner.ApSpinner, { enabled: spinning, theme: theme });
},
_renderRemoveButton: function _renderRemoveButton(removable, icon) {
var s = this;
if (!removable) {
return null;
}
return _react2.default.createElement(
_apemanReactButton.ApButton,
{ onTap: s.handleRemove, className: 'ap-upload-remove-button' },
_react2.default.createElement('i', { className: (0, _classnames2.default)('ap-upload-remove-icon', icon) })
);
},
_renderPreviewImage: function _renderPreviewImage(urls, width, height) {
if (!urls) {
return null;
}
var s = this;
return urls.filter(function (url) {
return ApUpload.isImageUrl(url);
}).map(function (url, i) {
return _react2.default.createElement(_apemanReactImage.ApImage, { key: url,
src: url,
height: height,
width: width,
className: (0, _classnames2.default)('ap-upload-preview-image'),
style: { left: i * 10 + '%', top: i * 10 + '%' },
scale: 'fit' });
});
}
});
exports.default = ApUpload;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwX3VwbG9hZC5qc3giXSwibmFtZXMiOlsiQXBVcGxvYWQiLCJjcmVhdGVDbGFzcyIsInByb3BUeXBlcyIsIm5hbWUiLCJzdHJpbmciLCJpZCIsIm11bHRpcGxlIiwiYm9vbCIsIm9uQ2hhbmdlIiwiZnVuYyIsIm9uTG9hZCIsIm9uRXJyb3IiLCJ3aWR0aCIsIm51bWJlciIsImhlaWdodCIsInRleHQiLCJhY2NlcHQiLCJpY29uIiwiY2xvc2VJY29uIiwic3Bpbm5lciIsInZhbHVlIiwib25lT2ZUeXBlIiwiYXJyYXkiLCJtaXhpbnMiLCJzdGF0aWNzIiwicmVhZEZpbGUiLCJmaWxlIiwiY2FsbGJhY2siLCJyZWFkZXIiLCJ3aW5kb3ciLCJGaWxlUmVhZGVyIiwib25lcnJvciIsImVyciIsIm9ubG9hZCIsImV2IiwidGFyZ2V0IiwicmVzdWx0IiwicmVhZEFzRGF0YVVSTCIsImlzSW1hZ2VVcmwiLCJ1cmwiLCJpbWFnZUV4dGVuc2lvbnMiLCJ0ZXN0IiwiaW5kZXhPZiIsImV4dG5hbWUiLCJnZXRJbml0aWFsU3RhdGUiLCJzIiwicHJvcHMiLCJoYXNWYWx1ZSIsImxlbmd0aCIsInNwaW5uaW5nIiwiZXJyb3IiLCJ1cmxzIiwiY29uY2F0IiwiZ2V0RGVmYXVsdFByb3BzIiwidjQiLCJzcGlubmVySWNvbiIsIkRFRkFVTFRfVEhFTUUiLCJyZW5kZXIiLCJzdGF0ZSIsImNsYXNzTmFtZSIsInN0eWxlIiwiaGFuZGxlQ2hhbmdlIiwiY2hpbGRyZW4iLCJfcmVuZGVyUHJldmlld0ltYWdlIiwiX3JlbmRlclJlbW92ZUJ1dHRvbiIsIl9yZW5kZXJTcGlubmVyIiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsIm5leHRQcm9wcyIsInNldFN0YXRlIiwiZSIsImZpbGVzIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJsb2FkZWQiLCJoYW5kbGVSZW1vdmUiLCJ0aGVtZSIsInJlbW92YWJsZSIsImZpbHRlciIsIm1hcCIsImkiLCJsZWZ0IiwidG9wIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7QUFLQTs7Ozs7Ozs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBO0FBQ0EsSUFBTUEsV0FBVyxnQkFBTUMsV0FBTixDQUFrQjtBQUFBOzs7QUFFakM7QUFDQTtBQUNBOztBQUVBQyxhQUFXO0FBQ1Q7QUFDQUMsVUFBTSxpQkFBTUMsTUFGSDtBQUdUO0FBQ0FDLFFBQUksaUJBQU1ELE1BSkQ7QUFLVDtBQUNBRSxjQUFVLGlCQUFNQyxJQU5QO0FBT1Q7QUFDQUMsY0FBVSxpQkFBTUMsSUFSUDtBQVNUO0FBQ0FDLFlBQVEsaUJBQU1ELElBVkw7QUFXVDtBQUNBRSxhQUFTLGlCQUFNRixJQVpOO0FBYVQ7QUFDQUcsV0FBTyxpQkFBTUMsTUFkSjtBQWVUO0FBQ0FDLFlBQVEsaUJBQU1ELE1BaEJMO0FBaUJUO0FBQ0FFLFVBQU0saUJBQU1YLE1BbEJIO0FBbUJUO0FBQ0FZLFlBQVEsaUJBQU1aLE1BcEJMO0FBcUJUO0FBQ0FhLFVBQU0saUJBQU1iLE1BdEJIO0FBdUJUO0FBQ0FjLGVBQVcsaUJBQU1kLE1BeEJSO0FBeUJUO0FBQ0FlLGFBQVMsaUJBQU1mLE1BMUJOO0FBMkJUO0FBQ0FnQixXQUFPLGlCQUFNQyxTQUFOLENBQWdCLENBQ3JCLGlCQUFNakIsTUFEZSxFQUVyQixpQkFBTWtCLEtBRmUsQ0FBaEI7QUE1QkUsR0FOc0I7O0FBd0NqQ0MsVUFBUSxFQXhDeUI7O0FBMENqQ0MsV0FBUztBQUNQQyxZQURPLG9CQUNHQyxJQURILEVBQ1NDLFFBRFQsRUFDbUI7QUFDeEIsVUFBSUMsU0FBUyxJQUFJQyxPQUFPQyxVQUFYLEVBQWI7QUFDQUYsYUFBT0csT0FBUCxHQUFpQixTQUFTQSxPQUFULENBQWtCQyxHQUFsQixFQUF1QjtBQUN0Q0wsaUJBQVNLLEdBQVQ7QUFDRCxPQUZEO0FBR0FKLGFBQU9LLE1BQVAsR0FBZ0IsU0FBU0EsTUFBVCxDQUFpQkMsRUFBakIsRUFBcUI7QUFDbkNQLGlCQUFTLElBQVQsRUFBZU8sR0FBR0MsTUFBSCxDQUFVQyxNQUF6QjtBQUNELE9BRkQ7QUFHQVIsYUFBT1MsYUFBUCxDQUFxQlgsSUFBckI7QUFDRCxLQVZNO0FBV1BZLGNBWE8sc0JBV0tDLEdBWEwsRUFXVTtBQUNmLFVBQU1DLGtCQUFrQixDQUN0QixNQURzQixFQUV0QixPQUZzQixFQUd0QixNQUhzQixFQUl0QixNQUpzQixFQUt0QixNQUxzQixDQUF4QjtBQU9BLGFBQU8sZUFBY0MsSUFBZCxDQUFtQkYsR0FBbkIsS0FBMkIsQ0FBQyxDQUFDLENBQUNDLGdCQUFnQkUsT0FBaEIsQ0FBd0IsZUFBS0MsT0FBTCxDQUFhSixHQUFiLENBQXhCO0FBQXJDO0FBQ0Q7QUFwQk0sR0ExQ3dCOztBQWlFakNLLGlCQWpFaUMsNkJBaUVkO0FBQ2pCLFFBQU1DLElBQUksSUFBVjtBQURpQixRQUVYQyxLQUZXLEdBRURELENBRkMsQ0FFWEMsS0FGVzs7QUFHakIsUUFBSUMsV0FBV0QsTUFBTTFCLEtBQU4sSUFBZTBCLE1BQU0xQixLQUFOLENBQVk0QixNQUFaLEdBQXFCLENBQW5EO0FBQ0EsV0FBTztBQUNMQyxnQkFBVSxLQURMO0FBRUxDLGFBQU8sSUFGRjtBQUdMQyxZQUFNSixXQUFXLEdBQUdLLE1BQUgsQ0FBVU4sTUFBTTFCLEtBQWhCLENBQVgsR0FBb0M7QUFIckMsS0FBUDtBQUtELEdBMUVnQztBQTRFakNpQyxpQkE1RWlDLDZCQTRFZDtBQUNqQixXQUFPO0FBQ0xsRCxZQUFNLElBREQ7QUFFTEUseUJBQWlCLGVBQUtpRCxFQUFMLEVBRlo7QUFHTGhELGdCQUFVLEtBSEw7QUFJTE0sYUFBTyxHQUpGO0FBS0xFLGNBQVEsR0FMSDtBQU1MRSxjQUFRLElBTkg7QUFPTEQsWUFBTSxhQVBEO0FBUUxFLFlBQU0sb0JBUkQ7QUFTTEMsaUJBQVcsYUFUTjtBQVVMcUMsbUJBQWEsOEJBQVVDLGFBVmxCO0FBV0xoRCxnQkFBVSxJQVhMO0FBWUxFLGNBQVEsSUFaSDtBQWFMQyxlQUFTO0FBYkosS0FBUDtBQWVELEdBNUZnQztBQThGakM4QyxRQTlGaUMsb0JBOEZ2QjtBQUNSLFFBQU1aLElBQUksSUFBVjtBQURRLFFBRUZhLEtBRkUsR0FFZWIsQ0FGZixDQUVGYSxLQUZFO0FBQUEsUUFFS1osS0FGTCxHQUVlRCxDQUZmLENBRUtDLEtBRkw7QUFBQSxRQUdGbEMsS0FIRSxHQUdnQmtDLEtBSGhCLENBR0ZsQyxLQUhFO0FBQUEsUUFHS0UsTUFITCxHQUdnQmdDLEtBSGhCLENBR0toQyxNQUhMOztBQUlSLFdBQ0U7QUFBQTtBQUFBLFFBQUssV0FBVywwQkFBVyxXQUFYLEVBQXdCZ0MsTUFBTWEsU0FBOUIsQ0FBaEI7QUFDSyxlQUFPLHNCQUFjLEVBQWQsRUFBa0JiLE1BQU1jLEtBQXhCLENBRFo7QUFFRSwrQ0FBTyxNQUFLLE1BQVo7QUFDTyxtQkFBVSxpQkFEakI7QUFFTyxrQkFBV2QsTUFBTXhDLFFBRnhCO0FBR08sY0FBT3dDLE1BQU0zQyxJQUhwQjtBQUlPLFlBQUsyQyxNQUFNekMsRUFKbEI7QUFLTyxnQkFBU3lDLE1BQU05QixNQUx0QjtBQU1PLGtCQUFVNkIsRUFBRWdCLFlBTm5CO0FBT08sZUFBTyxFQUFFakQsWUFBRixFQUFTRSxjQUFUO0FBUGQsUUFGRjtBQVdFO0FBQUE7QUFBQSxVQUFPLFdBQVUsaUJBQWpCLEVBQW1DLFNBQVVnQyxNQUFNekMsRUFBbkQ7QUFDWSxnREFBTSxXQUFVLG1CQUFoQixHQURaO0FBR0U7QUFBQTtBQUFBLFlBQU0sV0FBVSx1QkFBaEI7QUFDYywrQ0FBRyxXQUFZLDBCQUFXLGdCQUFYLEVBQTZCeUMsTUFBTTdCLElBQW5DLENBQWYsR0FEZDtBQUVjO0FBQUE7QUFBQSxjQUFNLFdBQVUsZ0JBQWhCO0FBQWtDNkIsa0JBQU0vQjtBQUF4QyxXQUZkO0FBR0krQixnQkFBTWdCO0FBSFY7QUFIRixPQVhGO0FBb0JJakIsUUFBRWtCLG1CQUFGLENBQXNCTCxNQUFNUCxJQUE1QixFQUFrQ3ZDLEtBQWxDLEVBQXlDRSxNQUF6QyxDQXBCSjtBQXFCSStCLFFBQUVtQixtQkFBRixDQUFzQixDQUFDLEVBQUVOLE1BQU1QLElBQU4sSUFBY08sTUFBTVAsSUFBTixDQUFXSCxNQUFYLEdBQW9CLENBQXBDLENBQXZCLEVBQStERixNQUFNNUIsU0FBckUsQ0FyQko7QUFzQkkyQixRQUFFb0IsY0FBRixDQUFpQlAsTUFBTVQsUUFBdkIsRUFBaUNILE1BQU0zQixPQUF2QztBQXRCSixLQURGO0FBMEJELEdBNUhnQzs7O0FBOEhqQztBQUNBO0FBQ0E7O0FBRUErQywyQkFsSWlDLHFDQWtJTkMsU0FsSU0sRUFrSUs7QUFDcEMsUUFBTXRCLElBQUksSUFBVjtBQURvQyxRQUU1QkMsS0FGNEIsR0FFbEJELENBRmtCLENBRTVCQyxLQUY0QjtBQUFBLFFBRzlCMUIsS0FIOEIsR0FHcEIrQyxTQUhvQixDQUc5Qi9DLEtBSDhCOztBQUlwQyxRQUFJMkIsV0FBVzNCLFNBQVNBLE1BQU00QixNQUFOLEdBQWUsQ0FBdkM7QUFDQSxRQUFJRCxZQUFhRCxNQUFNMUIsS0FBTixLQUFnQkEsS0FBakMsRUFBeUM7QUFDdkN5QixRQUFFdUIsUUFBRixDQUFXLEVBQUVqQixNQUFNLEdBQUdDLE1BQUgsQ0FBVWhDLEtBQVYsQ0FBUixFQUFYO0FBQ0Q7QUFDRixHQTFJZ0M7OztBQTRJakM7QUFDQTtBQUNBOztBQUVBeUMsY0FoSmlDLHdCQWdKbkJRLENBaEptQixFQWdKaEI7QUFDZixRQUFNeEIsSUFBSSxJQUFWO0FBRGUsUUFFVEMsS0FGUyxHQUVDRCxDQUZELENBRVRDLEtBRlM7QUFBQSxRQUdUWCxNQUhTLEdBR0VrQyxDQUhGLENBR1RsQyxNQUhTOztBQUlmLFFBQUltQyxRQUFRQyxNQUFNQyxTQUFOLENBQWdCQyxLQUFoQixDQUFzQkMsSUFBdEIsQ0FBMkJ2QyxPQUFPbUMsS0FBbEMsRUFBeUMsQ0FBekMsQ0FBWjtBQUplLFFBS1Q5RCxRQUxTLEdBS3FCc0MsS0FMckIsQ0FLVHRDLFFBTFM7QUFBQSxRQUtDRyxPQUxELEdBS3FCbUMsS0FMckIsQ0FLQ25DLE9BTEQ7QUFBQSxRQUtVRCxNQUxWLEdBS3FCb0MsS0FMckIsQ0FLVXBDLE1BTFY7OztBQU9mbUMsTUFBRXVCLFFBQUYsQ0FBVyxFQUFFbkIsVUFBVSxJQUFaLEVBQVg7QUFDQSxRQUFJekMsUUFBSixFQUFjO0FBQ1pBLGVBQVM2RCxDQUFUO0FBQ0Q7QUFDRCxvQkFBTWpCLE1BQU4sQ0FBYWtCLEtBQWIsRUFBb0J0RSxTQUFTeUIsUUFBN0IsRUFBdUMsVUFBQ3lCLEtBQUQsRUFBUUMsSUFBUixFQUFpQjtBQUN0RE4sUUFBRXVCLFFBQUYsQ0FBVztBQUNUbkIsa0JBQVUsS0FERDtBQUVUQyxvQkFGUztBQUdUQztBQUhTLE9BQVg7QUFLQSxVQUFJRCxLQUFKLEVBQVc7QUFDVCxZQUFJdkMsT0FBSixFQUFhO0FBQ1hBLGtCQUFRdUMsS0FBUjtBQUNEO0FBQ0YsT0FKRCxNQUlPO0FBQ0wsWUFBSXhDLE1BQUosRUFBWTtBQUNWLGNBQUlpRSxTQUFTLHNCQUFjLEVBQUV4QixVQUFGLEVBQVFoQixjQUFSLEVBQWQsQ0FBYjtBQUNBekIsaUJBQU9pRSxNQUFQO0FBQ0Q7QUFDRjtBQUNGLEtBaEJEO0FBaUJELEdBNUtnQztBQThLakNDLGNBOUtpQywwQkE4S2pCO0FBQ2QsUUFBTS9CLElBQUksSUFBVjtBQURjLFFBRVJDLEtBRlEsR0FFRUQsQ0FGRixDQUVSQyxLQUZRO0FBQUEsUUFHUnBDLE1BSFEsR0FHR29DLEtBSEgsQ0FHUnBDLE1BSFE7O0FBSWRtQyxNQUFFdUIsUUFBRixDQUFXO0FBQ1RsQixhQUFPLElBREU7QUFFVEMsWUFBTTtBQUZHLEtBQVg7QUFJQSxRQUFJekMsTUFBSixFQUFZO0FBQ1ZBLGFBQU8sRUFBUDtBQUNEO0FBQ0YsR0F6TGdDOzs7QUEyTGpDO0FBQ0E7QUFDQTs7QUFFQXVELGdCQS9MaUMsMEJBK0xqQmhCLFFBL0xpQixFQStMUDRCLEtBL0xPLEVBK0xBO0FBQy9CLFFBQU1oQyxJQUFJLElBQVY7QUFDQSxXQUNFLCtEQUFXLFNBQVNJLFFBQXBCLEVBQThCLE9BQU80QixLQUFyQyxHQURGO0FBSUQsR0FyTWdDO0FBdU1qQ2IscUJBdk1pQywrQkF1TVpjLFNBdk1ZLEVBdU1EN0QsSUF2TUMsRUF1TUs7QUFDcEMsUUFBTTRCLElBQUksSUFBVjtBQUNBLFFBQUksQ0FBQ2lDLFNBQUwsRUFBZ0I7QUFDZCxhQUFPLElBQVA7QUFDRDtBQUNELFdBQ0U7QUFBQTtBQUFBLFFBQVUsT0FBUWpDLEVBQUUrQixZQUFwQixFQUFtQyxXQUFVLHlCQUE3QztBQUNFLDJDQUFHLFdBQVksMEJBQVcsdUJBQVgsRUFBb0MzRCxJQUFwQyxDQUFmO0FBREYsS0FERjtBQUtELEdBak5nQztBQW1OakM4QyxxQkFuTmlDLCtCQW1OWlosSUFuTlksRUFtTk52QyxLQW5OTSxFQW1OQ0UsTUFuTkQsRUFtTlM7QUFDeEMsUUFBSSxDQUFDcUMsSUFBTCxFQUFXO0FBQ1QsYUFBTyxJQUFQO0FBQ0Q7QUFDRCxRQUFNTixJQUFJLElBQVY7QUFDQSxXQUFPTSxLQUNKNEIsTUFESSxDQUNHLFVBQUN4QyxHQUFEO0FBQUEsYUFBU3ZDLFNBQVNzQyxVQUFULENBQW9CQyxHQUFwQixDQUFUO0FBQUEsS0FESCxFQUVKeUMsR0FGSSxDQUVBLFVBQUN6QyxHQUFELEVBQU0wQyxDQUFOO0FBQUEsYUFDSCwyREFBUyxLQUFNMUMsR0FBZjtBQUNTLGFBQU1BLEdBRGY7QUFFUyxnQkFBU3pCLE1BRmxCO0FBR1MsZUFBUUYsS0FIakI7QUFJUyxtQkFBWSwwQkFBVyx5QkFBWCxDQUpyQjtBQUtTLGVBQVEsRUFBRXNFLE1BQVNELElBQUksRUFBYixNQUFGLEVBQXNCRSxLQUFRRixJQUFJLEVBQVosTUFBdEIsRUFMakI7QUFNUyxlQUFNLEtBTmYsR0FERztBQUFBLEtBRkEsQ0FBUDtBQVlEO0FBcE9nQyxDQUFsQixDQUFqQjs7a0JBdU9lakYsUSIsImZpbGUiOiJhcF91cGxvYWQuanN4Iiwic291cmNlUm9vdCI6ImxpYiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXBlbWFuIHJlYWN0IHBhY2thZ2UgZm9yIGZpbGUgdXBsb2FkIGNvbXBvbmVudHMuXG4gKiBAY2xhc3MgQXBVcGxvYWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcyBhcyB0eXBlcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcbmltcG9ydCBhc3luYyBmcm9tICdhc3luYydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgdXVpZCBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgQXBJbWFnZSB9IGZyb20gJ2FwZW1hbi1yZWFjdC1pbWFnZSdcbmltcG9ydCB7IEFwU3Bpbm5lciB9IGZyb20gJ2FwZW1hbi1yZWFjdC1zcGlubmVyJ1xuaW1wb3J0IHsgQXBCdXR0b24gfSBmcm9tICdhcGVtYW4tcmVhY3QtYnV0dG9uJ1xuXG4vKiogQGxlbmRzIEFwVXBsb2FkICovXG5jb25zdCBBcFVwbG9hZCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTcGVjc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByb3BUeXBlczoge1xuICAgIC8qKiBOYW1lIG9mIGlucHV0ICovXG4gICAgbmFtZTogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBET00gaWQgb2YgaW5wdXQgKi9cbiAgICBpZDogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBBbGxvdyBtdWx0aXBsZSB1cGxvYWQgKi9cbiAgICBtdWx0aXBsZTogdHlwZXMuYm9vbCxcbiAgICAvKiogSGFuZGxlciBmb3IgY2hhbmdlIGV2ZW50ICovXG4gICAgb25DaGFuZ2U6IHR5cGVzLmZ1bmMsXG4gICAgLyoqIEhhbmRsZXIgZm9yIGxvYWQgZXZlbnQgKi9cbiAgICBvbkxvYWQ6IHR5cGVzLmZ1bmMsXG4gICAgLyoqIEhhbmRsZXIgZm9yIGVycm9yIGV2ZW50ICovXG4gICAgb25FcnJvcjogdHlwZXMuZnVuYyxcbiAgICAvKiogSW1hZ2Ugd2lkdGggKi9cbiAgICB3aWR0aDogdHlwZXMubnVtYmVyLFxuICAgIC8qKiBJbWFnZSBoZWlnaHQgKi9cbiAgICBoZWlnaHQ6IHR5cGVzLm51bWJlcixcbiAgICAvKiogR3VpZGUgdGV4dCAqL1xuICAgIHRleHQ6IHR5cGVzLnN0cmluZyxcbiAgICAvKiogQWNjZXB0IGZpbGUgdHlwZSAqL1xuICAgIGFjY2VwdDogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBHdWlkZSBpY29uICovXG4gICAgaWNvbjogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBJY29uIGZvciBjbG9zZSBpbWFnZXMgKi9cbiAgICBjbG9zZUljb246IHR5cGVzLnN0cmluZyxcbiAgICAvKiogU3Bpbm5lciB0aGVtZSAqL1xuICAgIHNwaW5uZXI6IHR5cGVzLnN0cmluZyxcbiAgICAvKiogVmFsdWUgb2YgaW5wdXQgKi9cbiAgICB2YWx1ZTogdHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIHR5cGVzLnN0cmluZyxcbiAgICAgIHR5cGVzLmFycmF5XG4gICAgXSlcbiAgfSxcblxuICBtaXhpbnM6IFtdLFxuXG4gIHN0YXRpY3M6IHtcbiAgICByZWFkRmlsZSAoZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgIGxldCByZWFkZXIgPSBuZXcgd2luZG93LkZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIG9ubG9hZCAoZXYpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZXYudGFyZ2V0LnJlc3VsdClcbiAgICAgIH1cbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpXG4gICAgfSxcbiAgICBpc0ltYWdlVXJsICh1cmwpIHtcbiAgICAgIGNvbnN0IGltYWdlRXh0ZW5zaW9ucyA9IFtcbiAgICAgICAgJy5qcGcnLFxuICAgICAgICAnLmpwZWcnLFxuICAgICAgICAnLnN2ZycsXG4gICAgICAgICcuZ2lmJyxcbiAgICAgICAgJy5wbmcnXG4gICAgICBdXG4gICAgICByZXR1cm4gL15kYXRhOmltYWdlLy50ZXN0KHVybCkgfHwgISF+aW1hZ2VFeHRlbnNpb25zLmluZGV4T2YocGF0aC5leHRuYW1lKHVybCkpXG4gICAgfVxuICB9LFxuXG4gIGdldEluaXRpYWxTdGF0ZSAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIGxldCBoYXNWYWx1ZSA9IHByb3BzLnZhbHVlICYmIHByb3BzLnZhbHVlLmxlbmd0aCA+IDBcbiAgICByZXR1cm4ge1xuICAgICAgc3Bpbm5pbmc6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB1cmxzOiBoYXNWYWx1ZSA/IFtdLmNvbmNhdChwcm9wcy52YWx1ZSkgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG51bGwsXG4gICAgICBpZDogYGFwLXVwbG9hZC0ke3V1aWQudjQoKX1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgd2lkdGg6IDE4MCxcbiAgICAgIGhlaWdodDogMTgwLFxuICAgICAgYWNjZXB0OiBudWxsLFxuICAgICAgdGV4dDogJ1VwbG9hZCBmaWxlJyxcbiAgICAgIGljb246ICdmYSBmYS1jbG91ZC11cGxvYWQnLFxuICAgICAgY2xvc2VJY29uOiAnZmEgZmEtY2xvc2UnLFxuICAgICAgc3Bpbm5lckljb246IEFwU3Bpbm5lci5ERUZBVUxUX1RIRU1FLFxuICAgICAgb25DaGFuZ2U6IG51bGwsXG4gICAgICBvbkxvYWQ6IG51bGwsXG4gICAgICBvbkVycm9yOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBzdGF0ZSwgcHJvcHMgfSA9IHNcbiAgICBsZXQgeyB3aWR0aCwgaGVpZ2h0IH0gPSBwcm9wc1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnYXAtdXBsb2FkJywgcHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgc3R5bGU9e09iamVjdC5hc3NpZ24oe30sIHByb3BzLnN0eWxlKX0+XG4gICAgICAgIDxpbnB1dCB0eXBlPSdmaWxlJ1xuICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdhcC11cGxvYWQtaW5wdXQnXG4gICAgICAgICAgICAgICBtdWx0aXBsZT17IHByb3BzLm11bHRpcGxlIH1cbiAgICAgICAgICAgICAgIG5hbWU9eyBwcm9wcy5uYW1lIH1cbiAgICAgICAgICAgICAgIGlkPXsgcHJvcHMuaWQgfVxuICAgICAgICAgICAgICAgYWNjZXB0PXsgcHJvcHMuYWNjZXB0IH1cbiAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtzLmhhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgIHN0eWxlPXt7IHdpZHRoLCBoZWlnaHQgfX1cbiAgICAgICAgLz5cbiAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nYXAtdXBsb2FkLWxhYmVsJyBodG1sRm9yPXsgcHJvcHMuaWQgfT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdhcC11cGxvYWQtYWxpZ25lcic+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2FwLXVwbG9hZC1sYWJlbC1pbm5lcic+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9eyBjbGFzc25hbWVzKCdhcC11cGxvYWQtaWNvbicsIHByb3BzLmljb24pIH0vPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdhcC11cGxvYWQtdGV4dCc+e3Byb3BzLnRleHR9PC9zcGFuPlxuICAgICAgICAgICAgeyBwcm9wcy5jaGlsZHJlbiB9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgeyBzLl9yZW5kZXJQcmV2aWV3SW1hZ2Uoc3RhdGUudXJscywgd2lkdGgsIGhlaWdodCkgfVxuICAgICAgICB7IHMuX3JlbmRlclJlbW92ZUJ1dHRvbighIShzdGF0ZS51cmxzICYmIHN0YXRlLnVybHMubGVuZ3RoID4gMCksIHByb3BzLmNsb3NlSWNvbikgfVxuICAgICAgICB7IHMuX3JlbmRlclNwaW5uZXIoc3RhdGUuc3Bpbm5pbmcsIHByb3BzLnNwaW5uZXIpIH1cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGNvbnN0IHsgcHJvcHMgfSA9IHNcbiAgICBsZXQgeyB2YWx1ZSB9ID0gbmV4dFByb3BzXG4gICAgbGV0IGhhc1ZhbHVlID0gdmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMFxuICAgIGlmIChoYXNWYWx1ZSAmJiAocHJvcHMudmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgcy5zZXRTdGF0ZSh7IHVybHM6IFtdLmNvbmNhdCh2YWx1ZSkgfSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEN1c3RvbVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cblxuICBoYW5kbGVDaGFuZ2UgKGUpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHByb3BzIH0gPSBzXG4gICAgbGV0IHsgdGFyZ2V0IH0gPSBlXG4gICAgbGV0IGZpbGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGFyZ2V0LmZpbGVzLCAwKVxuICAgIGxldCB7IG9uQ2hhbmdlLCBvbkVycm9yLCBvbkxvYWQgfSA9IHByb3BzXG5cbiAgICBzLnNldFN0YXRlKHsgc3Bpbm5pbmc6IHRydWUgfSlcbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKGUpXG4gICAgfVxuICAgIGFzeW5jLmNvbmNhdChmaWxlcywgQXBVcGxvYWQucmVhZEZpbGUsIChlcnJvciwgdXJscykgPT4ge1xuICAgICAgcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNwaW5uaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHVybHNcbiAgICAgIH0pXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgICBvbkVycm9yKGVycm9yKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob25Mb2FkKSB7XG4gICAgICAgICAgbGV0IGxvYWRlZCA9IE9iamVjdC5hc3NpZ24oeyB1cmxzLCB0YXJnZXQgfSlcbiAgICAgICAgICBvbkxvYWQobG9hZGVkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBoYW5kbGVSZW1vdmUgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHsgcHJvcHMgfSA9IHNcbiAgICBsZXQgeyBvbkxvYWQgfSA9IHByb3BzXG4gICAgcy5zZXRTdGF0ZSh7XG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIHVybHM6IG51bGxcbiAgICB9KVxuICAgIGlmIChvbkxvYWQpIHtcbiAgICAgIG9uTG9hZChbXSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgX3JlbmRlclNwaW5uZXIgKHNwaW5uaW5nLCB0aGVtZSkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgcmV0dXJuIChcbiAgICAgIDxBcFNwaW5uZXIgZW5hYmxlZD17c3Bpbm5pbmd9IHRoZW1lPXt0aGVtZX0+XG4gICAgICA8L0FwU3Bpbm5lcj5cbiAgICApXG4gIH0sXG5cbiAgX3JlbmRlclJlbW92ZUJ1dHRvbiAocmVtb3ZhYmxlLCBpY29uKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBpZiAoIXJlbW92YWJsZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxBcEJ1dHRvbiBvblRhcD17IHMuaGFuZGxlUmVtb3ZlIH0gY2xhc3NOYW1lPSdhcC11cGxvYWQtcmVtb3ZlLWJ1dHRvbic+XG4gICAgICAgIDxpIGNsYXNzTmFtZT17IGNsYXNzbmFtZXMoJ2FwLXVwbG9hZC1yZW1vdmUtaWNvbicsIGljb24pIH0vPlxuICAgICAgPC9BcEJ1dHRvbj5cbiAgICApXG4gIH0sXG5cbiAgX3JlbmRlclByZXZpZXdJbWFnZSAodXJscywgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmICghdXJscykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICByZXR1cm4gdXJsc1xuICAgICAgLmZpbHRlcigodXJsKSA9PiBBcFVwbG9hZC5pc0ltYWdlVXJsKHVybCkpXG4gICAgICAubWFwKCh1cmwsIGkpID0+IChcbiAgICAgICAgPEFwSW1hZ2Uga2V5PXsgdXJsIH1cbiAgICAgICAgICAgICAgICAgc3JjPXsgdXJsIH1cbiAgICAgICAgICAgICAgICAgaGVpZ2h0PXsgaGVpZ2h0IH1cbiAgICAgICAgICAgICAgICAgd2lkdGg9eyB3aWR0aCB9XG4gICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17IGNsYXNzbmFtZXMoJ2FwLXVwbG9hZC1wcmV2aWV3LWltYWdlJykgfVxuICAgICAgICAgICAgICAgICBzdHlsZT17IHsgbGVmdDogYCR7aSAqIDEwfSVgLCB0b3A6IGAke2kgKiAxMH0lYCB9IH1cbiAgICAgICAgICAgICAgICAgc2NhbGU9J2ZpdCc+XG4gICAgICAgIDwvQXBJbWFnZT5cbiAgICAgICkpXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IEFwVXBsb2FkXG4iXX0=