UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

360 lines 38.3 kB
/** * @fileoverview added by tsickle * Generated from: helper-utils.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, HostListener, Input } from '@angular/core'; import { HttpParams } from '@angular/common/http'; export class HelperUtils { /** * @param {?} url * @param {?=} target * @return {?} */ static jumpOuterUrl(url, target = '_blank') { if (url !== undefined) { /** @type {?} */ const tempLink = document.createElement('a'); tempLink.style.display = 'none'; // for IE 11 tempLink.target = target; tempLink.href = url; document.body.appendChild(tempLink); // for IE 11, IE11需要append到document.body里面的a链接才会生效 // for IE 11, IE11需要append到document.body里面的a链接才会生效 /** @type {?} */ const event = document.createEvent('MouseEvents'); event.initEvent('click', false, true); tempLink.dispatchEvent(event); document.body.removeChild(tempLink); // for IE 11 } } /** * @param {?} url * @param {?=} option * @param {?=} onError * @return {?} */ static downloadFile(url, option, onError) { if (document.querySelector('iframe[name=' + (option && option.iframename || 'download') + ']')) { document.body.removeChild(document.querySelector('iframe[name=' + (option && option.iframename || 'download') + ']')); } /** @type {?} */ const tempiframe = document.createElement('iframe'); tempiframe.name = option && option.iframename || 'download'; tempiframe.style.display = 'none'; /** @type {?} */ const tempform = document.createElement('form'); tempform.action = url; tempform.method = option && option.method || 'post'; tempform.target = option && option.iframename || 'download'; tempform.enctype = option && option.enctype || 'application/x-www-form-urlencoded'; tempform.style.display = 'none'; if (option && option.params) { Object.keys(option.params).forEach((/** * @param {?} key * @return {?} */ key => { /** @type {?} */ const opt = document.createElement('input'); opt.name = key; opt.value = option.params[key]; tempform.appendChild(opt); })); } /** @type {?} */ const submit = document.createElement('input'); submit.type = 'submit'; tempform.appendChild(submit); tempiframe.appendChild(tempform); document.body.appendChild(tempiframe); // 下载错误处理。下载成功并不会响应,因为响应头中带有Content-Disposition(下载头)的url,无法监听iframe的load事件,load事件不会触发 tempiframe.addEventListener('load', (/** * @param {?} event * @return {?} */ (event) => { try { /** @type {?} */ const iframeDoc = tempiframe.contentDocument; if (onError !== undefined) { /** @type {?} */ let response; try { response = JSON.parse(iframeDoc.body && iframeDoc.body.textContent); } catch (e) { response = iframeDoc.body && iframeDoc.body.textContent; } if (!response) { response = 'Error'; } onError(response); } } catch (e) { onError('Error'); } document.body.removeChild(tempiframe); })); tempform.submit(); } /** * @param {?} httpClient * @param {?} url * @param {?=} option * @param {?=} onError * @param {?=} onSuccess * @return {?} */ static downloadFileByHttpClient(httpClient, url, option, onError, onSuccess) { /** @type {?} */ const requestMethod = option && option.method && option.method.toLowerCase() || 'post'; /** @type {?} */ const requestHeaderContentType = option.enctype || 'application/x-www-form-urlencoded'; /** @type {?} */ const requestParams = option.params ? new HttpParams({ fromObject: option.params }) : null; /** @type {?} */ const requestUrl = url; /** @type {?} */ const requestOptionParams = requestMethod === 'get' ? requestParams : undefined; /** @type {?} */ const requestBody = requestMethod === 'post' ? requestParams && requestParams.toString() : undefined; /** @type {?} */ const responseOption = option.responseOption; /** @type {?} */ const requestOption = Object.assign({}, { body: requestBody, observe: 'response', params: requestOptionParams, headers: { 'Content-Type': requestHeaderContentType }, responseType: 'arraybuffer' }, { headers: option.header }); /** @type {?} */ const handleResponse = ((/** * @param {?} resOption * @return {?} */ resOption => { switch (resOption) { case 'response': return (/** * @param {?} res * @return {?} */ (res) => res); case 'body': return (/** * @param {?} res * @return {?} */ (res) => { /** @type {?} */ const arrayBuffer = (/** @type {?} */ (((/** @type {?} */ (res))).body)) || ((/** @type {?} */ (res))).error; /** @type {?} */ const body = HelperUtils.utf8ArrayToStr(arrayBuffer); return body; }); case 'json': default: return (/** * @param {?} res * @return {?} */ (res) => { /** @type {?} */ const arrayBuffer = (/** @type {?} */ (((/** @type {?} */ (res))).body)) || ((/** @type {?} */ (res))).error; /** @type {?} */ let response; try { /** @type {?} */ const body = HelperUtils.utf8ArrayToStr(arrayBuffer); try { response = JSON.parse(body); } catch (e) { /** @type {?} */ const parser = new DOMParser(); /** @type {?} */ const html = parser.parseFromString(body, 'text/html'); response = html.body.textContent; } } catch (e) { throw new Error('Parsing Error:' + e); } if (!response) { response = 'Error'; } return response; }); } }))(responseOption); /** @type {?} */ const downloadFileFromArrayBuffer = (/** * @param {?} data * @param {?} filename * @param {?} contentType * @return {?} */ (data, filename, contentType) => { if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE11 support // IE11 support /** @type {?} */ const blob = new Blob([data], { type: contentType }); window.navigator.msSaveOrOpenBlob(blob, filename); } else { // other browsers if ('download' in document.createElement('a')) { /** @type {?} */ const blob = new Blob([data], { type: contentType }); /** @type {?} */ const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(link.href); } else { // not support tag a download attribute use file download, filename won't support /** @type {?} */ const file = new File([data], filename, { type: contentType }); /** @type {?} */ const exportUrl = URL.createObjectURL(file); window.location.assign(exportUrl); URL.revokeObjectURL(exportUrl); } } }); /** @type {?} */ const getFilenameFromDisposition = (/** * @param {?} disposition * @return {?} */ (disposition) => { /** @type {?} */ const filenamePair = disposition.split(';').filter((/** * @param {?} str * @return {?} */ str => /^filename=/.test(str.trim()))).pop(); if (filenamePair) { /** @type {?} */ let str = filenamePair.trim(); str = str.split('=')[1]; str = str.replace(/['"]/g, ''); return decodeURIComponent(str); } else { return null; } }); httpClient.request(requestMethod, requestUrl, requestOption).subscribe((/** * @param {?} res * @return {?} */ (res) => { /** @type {?} */ const disposition = ((/** @type {?} */ (res.headers))).get('content-disposition'); /** @type {?} */ const contentType = ((/** @type {?} */ (res.headers))).get('content-type'); if (/^attachment/i.test(disposition) || option.downloadWithoutDispositionHeader) { /** @type {?} */ const downloadFilename = option.filename || disposition && getFilenameFromDisposition(disposition) || url; downloadFileFromArrayBuffer(res.body, downloadFilename, contentType); if (onSuccess) { onSuccess(res); } } else { if (onError) { /** @type {?} */ let response; try { response = handleResponse(res); } catch (e) { response = res; } onError(response); } } }), (/** * @param {?} err * @return {?} */ err => { if (onError) { /** @type {?} */ let response; try { response = handleResponse(err); } catch (e) { response = err; } onError(response); } })); } /** * @private * @param {?} arrayBuffer * @return {?} */ static utf8ArrayToStr(arrayBuffer) { if (typeof TextDecoder !== 'undefined') { return new TextDecoder('utf-8').decode(arrayBuffer); } else { /** * fallback 方案,无TextDecoder场景使用直接解析,英文无问题,中文会存在乱码 * ie 11 下支持中文需要使用MDN推荐的 fastestsmallesttextencoderdecoder以支持TextDecoder * npm install fastestsmallesttextencoderdecoder * polyfill.ts includes * ``` * // polyfill for TextDecoder on IE 11 * import 'fastestsmallesttextencoderdecoder'; * ``` */ return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)); } } } export class SimulateATagDirective { constructor() { this.target = '_blank'; } /** * @return {?} */ onClick() { HelperUtils.jumpOuterUrl(this.href, this.target); } } SimulateATagDirective.decorators = [ { type: Directive, args: [{ selector: '[dSimulateATag]' },] } ]; /** @nocollapse */ SimulateATagDirective.ctorParameters = () => []; SimulateATagDirective.propDecorators = { href: [{ type: Input }], target: [{ type: Input }], onClick: [{ type: HostListener, args: ['click',] }] }; if (false) { /** @type {?} */ SimulateATagDirective.prototype.href; /** @type {?} */ SimulateATagDirective.prototype.target; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvY29tbW9uLyIsInNvdXJjZXMiOlsiaGVscGVyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBMkIsVUFBVSxFQUFtQyxNQUFNLHNCQUFzQixDQUFDO0FBRTVHLE1BQU0sT0FBTyxXQUFXOzs7Ozs7SUFDdEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLFFBQVE7UUFDckMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFOztrQkFDZCxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDNUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUssWUFBWTtZQUNqRCxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUN6QixRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtEQUFrRDs7O2tCQUNqRixLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDakQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZO1NBQ3BEO0lBQ0wsQ0FBQzs7Ozs7OztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQ2YsR0FBVyxFQUNYLE1BS0MsRUFDRCxPQUE0QjtRQUU1QixJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMs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Q3ZDLElBQUksT0FBTyxXQUFXLEtBQUssV0FBVyxFQUFFO1lBQ3RDLE9BQU8sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDTDs7Ozs7Ozs7O2VBU0c7WUFDSCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztDQUNGO0FBS0QsTUFBTSxPQUFPLHFCQUFxQjtJQUc5QjtRQURTLFdBQU0sR0FBdUQsUUFBUSxDQUFDO0lBQ2hFLENBQUM7Ozs7SUFDTyxPQUFPO1FBQzFCLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQzs7O1lBVEosU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7YUFDNUI7Ozs7O21CQUVJLEtBQUs7cUJBQ0wsS0FBSztzQkFFTCxZQUFZLFNBQUMsT0FBTzs7OztJQUhyQixxQ0FBc0I7O0lBQ3RCLHVDQUErRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlc3BvbnNlLCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbmV4cG9ydCBjbGFzcyBIZWxwZXJVdGlscyB7XHJcbiAgc3RhdGljIGp1bXBPdXRlclVybCh1cmwsIHRhcmdldCA9ICdfYmxhbmsnKSB7XHJcbiAgICAgICBpZiAodXJsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbnN0IHRlbXBMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgdGVtcExpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgICAgIC8vIGZvciBJRSAxMVxyXG4gICAgICAgICAgdGVtcExpbmsudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgdGVtcExpbmsuaHJlZiA9IHVybDtcclxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcExpbmspOyAvLyBmb3IgSUUgMTEsIElFMTHpnIDopoFhcHBlbmTliLBkb2N1bWVudC5ib2R56YeM6Z2i55qEYemTvuaOpeaJjeS8mueUn+aViFxyXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcclxuICAgICAgICAgIGV2ZW50LmluaXRFdmVudCgnY2xpY2snLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB0ZW1wTGluay5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcExpbmspOyAvLyBmb3IgSUUgMTFcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRvd25sb2FkRmlsZShcclxuICAgICAgdXJsOiBzdHJpbmcsXHJcbiAgICAgIG9wdGlvbj86IHtcclxuICAgICAgICAgIG1ldGhvZD86ICdQT1NUJ3wgJ0dFVCcgfCAncG9zdCcgfCAnZ2V0JyxcclxuICAgICAgICAgIHBhcmFtcz86IHtbcHJvcGVydHk6IHN0cmluZ106IHN0cmluZ30sXHJcbiAgICAgICAgICBlbmN0eXBlPzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSd8ICd0ZXh0L3BsYWluJyxcclxuICAgICAgICAgIGlmcmFtZW5hbWU/OiBzdHJpbmdcclxuICAgICAgfSxcclxuICAgICAgb25FcnJvcj86IChyZXNwb25zZSkgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaWZyYW1lW25hbWU9JyArIChvcHRpb24gJiYgb3B0aW9uLmlmcmFtZW5hbWUgfHwgJ2Rvd25sb2FkJykgKyAnXScpKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpZnJhbWVbbmFtZT0nICsgKG9wdGlvbiAmJiBvcHRpb24uaWZyYW1lbmFtZSB8fCAnZG93bmxvYWQnKSArICddJykpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRlbXBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgdGVtcGlmcmFtZS5uYW1lID0gb3B0aW9uICYmIG9wdGlvbi5pZnJhbWVuYW1lIHx8ICdkb3dubG9hZCc7XHJcbiAgICAgIHRlbXBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgIGNvbnN0IHRlbXBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xyXG4gICAgICB0ZW1wZm9ybS5hY3Rpb24gPSB1cmw7XHJcbiAgICAgIHRlbXBmb3JtLm1ldGhvZCA9IG9wdGlvbiAmJiBvcHRpb24ubWV0aG9kIHx8ICdwb3N0JztcclxuICAgICAgdGVtcGZvcm0udGFyZ2V0ID0gb3B0aW9uICYmIG9wdGlvbi5pZnJhbWVuYW1lIHx8ICdkb3dubG9hZCc7XHJcbiAgICAgIHRlbXBmb3JtLmVuY3R5cGUgPSBvcHRpb24gJiYgb3B0aW9uLmVuY3R5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcbiAgICAgIHRlbXBmb3JtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICBpZiAob3B0aW9uICYmIG9wdGlvbi5wYXJhbXMpIHtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbi5wYXJhbXMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgICAgICAgIG9wdC5uYW1lID0ga2V5O1xyXG4gICAgICAgICAgICAgIG9wdC52YWx1ZSA9IG9wdGlvbi5wYXJhbXNba2V5XTtcclxuICAgICAgICAgICAgICB0ZW1wZm9ybS5hcHBlbmRDaGlsZChvcHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHN1Ym1pdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgIHN1Ym1pdC50eXBlID0gJ3N1Ym1pdCc7XHJcblxyXG4gICAgICB0ZW1wZm9ybS5hcHBlbmRDaGlsZChzdWJtaXQpO1xyXG4gICAgICB0ZW1waWZyYW1lLmFwcGVuZENoaWxkKHRlbXBmb3JtKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1waWZyYW1lKTtcclxuXHJcbiAgICAgIC8vIOS4i+i9vemUmeivr+WkhOeQhuOAguS4i+i9veaIkOWKn+W5tuS4jeS8muWTjeW6lO+8jOWboOS4uuWTjeW6lOWktOS4reW4puaciUNvbnRlbnQtRGlzcG9zaXRpb27vvIjkuIvovb3lpLTvvInnmoR1cmzvvIzml6Dms5Xnm5HlkKxpZnJhbWXnmoRsb2Fk5LqL5Lu277yMbG9hZOS6i+S7tuS4jeS8muinpuWPkVxyXG4gICAgICB0ZW1waWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZURvYyA9ICB0ZW1waWZyYW1lLmNvbnRlbnREb2N1bWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShpZnJhbWVEb2MuYm9keSAmJiBpZnJhbWVEb2MuYm9keS50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBpZnJhbWVEb2MuYm9keSAmJiBpZnJhbWVEb2MuYm9keS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9ICdFcnJvcic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBvbkVycm9yKCdFcnJvcicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcGlmcmFtZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0ZW1wZm9ybS5zdWJtaXQoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZEZpbGVCeUh0dHBDbGllbnQoXHJcbiAgICBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBvcHRpb24/OiB7XHJcbiAgICAgIG1ldGhvZD86ICdQT1NUJyB8ICdHRVQnIHwgJ3Bvc3QnIHwgJ2dldCcsXHJcbiAgICAgIHBhcmFtcz86IHtbcHJvcGVydHk6IHN0cmluZ106IHN0cmluZ30sXHJcbiAgICAgIGVuY3R5cGU/OiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB8ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8ICd0ZXh0L3BsYWluJyxcclxuICAgICAgaGVhZGVyPzoge1xyXG4gICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICB9LFxyXG4gICAgICByZXNwb25zZU9wdGlvbj86ICdyZXNwb25zZScgfCAnYm9keScgfCAnanNvbicsXHJcbiAgICAgIGZpbGVuYW1lPzogc3RyaW5nLFxyXG4gICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuLFxyXG4gICAgICBkb3dubG9hZFdpdGhvdXREaXNwb3NpdGlvbkhlYWRlcj86IGJvb2xlYW5cclxuICAgIH0sXHJcbiAgICBvbkVycm9yPzogKHJlc3BvbnNlKSA9PiB2b2lkLFxyXG4gICAgb25TdWNjZXNzPzogKHJlc3BvbnNlKSA9PiB2b2lkLFxyXG4gICkge1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RNZXRob2QgPSBvcHRpb24gJiYgb3B0aW9uLm1ldGhvZCAmJiBvcHRpb24ubWV0aG9kLnRvTG93ZXJDYXNlKCkgfHwgJ3Bvc3QnO1xyXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlckNvbnRlbnRUeXBlID0gb3B0aW9uLmVuY3R5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gb3B0aW9uLnBhcmFtcyA/IG5ldyBIdHRwUGFyYW1zKHtcclxuICAgICAgZnJvbU9iamVjdDogb3B0aW9uLnBhcmFtc1xyXG4gICAgfSkgOiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RVcmwgPSB1cmw7XHJcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9uUGFyYW1zID0gcmVxdWVzdE1ldGhvZCA9PT0gJ2dldCcgPyByZXF1ZXN0UGFyYW1zIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0TWV0aG9kID09PSAncG9zdCcgPyByZXF1ZXN0UGFyYW1zICYmIHJlcXVlc3RQYXJhbXMudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZU9wdGlvbiA9IG9wdGlvbi5yZXNwb25zZU9wdGlvbjtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9uID0gT2JqZWN0LmFzc2lnbih7fSwge1xyXG4gICAgICBib2R5OiByZXF1ZXN0Qm9keSxcclxuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgcGFyYW1zOiByZXF1ZXN0T3B0aW9uUGFyYW1zLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IHJlcXVlc3RIZWFkZXJDb250ZW50VHlwZVxyXG4gICAgICB9LFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcclxuICAgIH0sIHtcclxuICAgICAgaGVhZGVyczogb3B0aW9uLmhlYWRlclxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSAocmVzT3B0aW9uID0+IHtcclxuICAgICAgc3dpdGNoIChyZXNPcHRpb24pIHtcclxuICAgICAgICBjYXNlICdyZXNwb25zZSc6XHJcbiAgICAgICAgICByZXR1cm4gKHJlczogSHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPikgPT4gcmVzO1xyXG4gICAgICAgIGNhc2UgJ2JvZHknOlxyXG4gICAgICAgICAgcmV0dXJuIChyZXM6IEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4gfCBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IDxBcnJheUJ1ZmZlcj4oPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+cmVzKS5ib2R5IHx8ICg8SHR0cEVycm9yUmVzcG9uc2U+cmVzKS5lcnJvcjtcclxuICAgICAgICAgICAgY29uc3QgYm9keSA9IEhlbHBlclV0aWxzLnV0ZjhBcnJheVRvU3RyKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIGNhc2UgJ2pzb24nOlxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICByZXR1cm4gKHJlczogSHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPiB8IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gPEFycmF5QnVmZmVyPig8SHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPj5yZXMpLmJvZHkgfHwgKDxIdHRwRXJyb3JSZXNwb25zZT5yZXMpLmVycm9yO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEhlbHBlclV0aWxzLnV0ZjhBcnJheVRvU3RyKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKGJvZHkpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGJvZHksICd0ZXh0L2h0bWwnKTtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaHRtbC5ib2R5LnRleHRDb250ZW50O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyc2luZyBFcnJvcjonICsgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSAnRXJyb3InO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH0pKHJlc3BvbnNlT3B0aW9uKTtcclxuXHJcbiAgICBjb25zdCBkb3dubG9hZEZpbGVGcm9tQXJyYXlCdWZmZXIgPSAoZGF0YTogQXJyYXlCdWZmZXIsIGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnRUeXBlOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSB7IC8vIElFMTEgc3VwcG9ydFxyXG4gICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwge3R5cGU6IGNvbnRlbnRUeXBlfSk7XHJcbiAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoYmxvYiwgZmlsZW5hbWUpO1xyXG4gICAgICB9IGVsc2Ugey8vIG90aGVyIGJyb3dzZXJzXHJcbiAgICAgICAgICBpZiAoJ2Rvd25sb2FkJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykpIHtcclxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwge3R5cGU6IGNvbnRlbnRUeXBlfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgICAgICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGxpbmsuaHJlZik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBub3Qgc3VwcG9ydCB0YWcgYSBkb3dubG9hZCBhdHRyaWJ1dGUgdXNlIGZpbGUgZG93bmxvYWQsIGZpbGVuYW1lIHdvbid0IHN1cHBvcnRcclxuICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtkYXRhXSwgZmlsZW5hbWUsIHt0eXBlOiBjb250ZW50VHlwZX0pO1xyXG4gICAgICAgICAgICBjb25zdCBleHBvcnRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGV4cG9ydFVybCk7XHJcbiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoZXhwb3J0VXJsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBnZXRGaWxlbmFtZUZyb21EaXNwb3NpdGlvbiA9IChkaXNwb3NpdGlvbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGVuYW1lUGFpciA9ICBkaXNwb3NpdGlvbi5zcGxpdCgnOycpLmZpbHRlcihzdHIgPT4gL15maWxlbmFtZT0vLnRlc3Qoc3RyLnRyaW0oKSkpLnBvcCgpO1xyXG4gICAgICBpZiAoZmlsZW5hbWVQYWlyKSB7XHJcbiAgICAgICAgbGV0IHN0ciA9IGZpbGVuYW1lUGFpci50cmltKCk7XHJcbiAgICAgICAgc3RyID0gc3RyLnNwbGl0KCc9JylbMV07XHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1snXCJdL2csICcnKTtcclxuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIGh0dHBDbGllbnQucmVxdWVzdChyZXF1ZXN0TWV0aG9kLCByZXF1ZXN0VXJsLCByZXF1ZXN0T3B0aW9uKS5zdWJzY3JpYmUoKHJlczogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgY29uc3QgZGlzcG9zaXRpb24gPSAoPEh0dHBIZWFkZXJzPnJlcy5oZWFkZXJzKS5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKTtcclxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSAoPEh0dHBIZWFkZXJzPnJlcy5oZWFkZXJzKS5nZXQoJ2NvbnRlbnQtdHlwZScpO1xyXG4gICAgICBpZiAoL15hdHRhY2htZW50L2kudGVzdChkaXNwb3NpdGlvbikgfHwgb3B0aW9uLmRvd25sb2FkV2l0aG91dERpc3Bvc2l0aW9uSGVhZGVyICkge1xyXG4gICAgICAgIGNvbnN0IGRvd25sb2FkRmlsZW5hbWUgPSBvcHRpb24uZmlsZW5hbWUgfHwgZGlzcG9zaXRpb24gJiYgZ2V0RmlsZW5hbWVGcm9tRGlzcG9zaXRpb24oZGlzcG9zaXRpb24pIHx8IHVybCA7XHJcbiAgICAgICAgZG93bmxvYWRGaWxlRnJvbUFycmF5QnVmZmVyKHJlcy5ib2R5LCBkb3dubG9hZEZpbGVuYW1lLCBjb250ZW50VHlwZSk7XHJcbiAgICAgICAgaWYgKG9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgb25TdWNjZXNzKHJlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChvbkVycm9yKSB7XHJcbiAgICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwb25zZSA9IGhhbmRsZVJlc3BvbnNlKHJlcyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfSwgZXJyID0+IHtcclxuICAgICAgaWYgKG9uRXJyb3IpIHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHJlc3BvbnNlID0gaGFuZGxlUmVzcG9uc2UoZXJyKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGVycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXRmOEFycmF5VG9TdHIoYXJyYXlCdWZmZXIpIHtcclxuICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JykuZGVjb2RlKGFycmF5QnVmZmVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBmYWxsYmFjayDmlrnmoYjvvIzml6BUZXh0RGVjb2RlcuWcuuaZr+S9v+eUqOebtOaOpeino+aekO+8jOiLseaWh+aXoOmXrumimO+8jOS4reaWh+S8muWtmOWcqOS5seeggVxyXG4gICAgICAgKiBpZSAxMSDkuIvmlK/mjIHkuK3mlofpnIDopoHkvb/nlKhNRE7mjqjojZDnmoQgZmFzdGVzdHNtYWxsZXN0dGV4dGVuY29kZXJkZWNvZGVy5Lul5pSv5oyBVGV4dERlY29kZXJcclxuICAgICAgICogbnBtIGluc3RhbGwgZmFzdGVzdHNtYWxsZXN0dGV4dGVuY29kZXJkZWNvZGVyXHJcbiAgICAgICAqIHBvbHlmaWxsLnRzIGluY2x1ZGVzXHJcbiAgICAgICAqIGBgYFxyXG4gICAgICAgKiAvLyBwb2x5ZmlsbCBmb3IgVGV4dERlY29kZXIgb24gSUUgMTFcclxuICAgICAgICogaW1wb3J0ICdmYXN0ZXN0c21hbGxlc3R0ZXh0ZW5jb2RlcmRlY29kZXInO1xyXG4gICAgICAgKiBgYGBcclxuICAgICAgICovXHJcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkU2ltdWxhdGVBVGFnXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXVsYXRlQVRhZ0RpcmVjdGl2ZSB7XHJcbiAgICBASW5wdXQoKSBocmVmOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSB0YXJnZXQ6ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJyB8IHN0cmluZyAgID0gJ19ibGFuayc7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycpIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgSGVscGVyVXRpbHMuanVtcE91dGVyVXJsKHRoaXMuaHJlZiwgdGhpcy50YXJnZXQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==