UNPKG

ng-devui

Version:

DevUI components based on Angular

294 lines 44.2 kB
import { HttpEventType, HttpParams } from '@angular/common/http'; import { Directive, HostListener, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class HelperUtils { static { this._browserName = null; } static { this._browserVersion = null; } static getBrowserName() { !this._browserName && this.getBrowserInfo(); return this._browserName; } static getBrowserVersion() { !this._browserVersion && this.getBrowserInfo(); return this._browserVersion; } static getBrowserInfo() { if (typeof navigator !== 'undefined') { const ua = navigator.userAgent.toLowerCase(); const results = [ ua.match(/rv:([\d.]+)\) like gecko/) || ua.match(/msie ([\d\.]+)/), ua.match(/edge\/([\d\.]+)/), ua.match(/firefox\/([\d\.]+)/), ua.match(/(?:opera|opr).([\d\.]+)/), ua.match(/edg\/([\d\.]+)/), ua.match(/chrome\/([\d\.]+)/), ua.match(/version\/([\d\.]+).*safari/), ]; const index = results.findIndex((item) => item); const infos = results[index]; const browserNames = ["IE" /* Browser.IE */, "ClassicEdge" /* Browser.ClassicEdge */, "Firefox" /* Browser.Firefox */, "Opera" /* Browser.Opera */, "Edge" /* Browser.Edge */, "Chrome" /* Browser.Chrome */, "Safari" /* Browser.Safari */]; this._browserName = browserNames[index] || "Other" /* Browser.Other */; this._browserVersion = infos ? parseInt(infos[1], 10) : 0; } } static jumpOuterUrl(url, target = '_blank') { if (url !== undefined && typeof document !== 'undefined') { 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链接才会生效 const event = document.createEvent('MouseEvents'); event.initEvent('click', false, true); tempLink.dispatchEvent(event); document.body.removeChild(tempLink); // for IE 11 } } static downloadFile(url, option, onError) { if (typeof document === 'undefined') { return; } if (document.querySelector(`iframe[name='${option?.iframename || 'download'}]`)) { document.body.removeChild(document.querySelector(`iframe[name='${option?.iframename || 'download'}]`)); } const tempiframe = document.createElement('iframe'); tempiframe.name = (option && option.iframename) || 'download'; tempiframe.style.display = 'none'; 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((key) => { const opt = document.createElement('input'); opt.name = key; opt.value = option.params[key]; tempform.appendChild(opt); }); } 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', (event) => { try { const iframeDoc = tempiframe.contentDocument; if (onError !== undefined) { 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(); } static downloadFileByHttpClient(httpClient, url, option, onError, onSuccess, onProgress) { const requestMethod = (option && option.method && option.method.toLowerCase()) || 'post'; const requestHeaderContentType = option.enctype || 'application/x-www-form-urlencoded'; const requestParams = option.params ? new HttpParams({ fromObject: option.params, }) : null; const requestUrl = url; const requestOptionParams = requestMethod === 'get' ? requestParams : undefined; const requestBody = requestMethod === 'post' ? requestParams && requestParams.toString() : undefined; const responseOption = option.responseOption; /* eslint-disable-next-line prefer-object-spread */ const requestOption = Object.assign({}, { body: requestBody, observe: (option.observe || option.reportProgress ? 'events' : 'response'), params: requestOptionParams, headers: { 'Content-Type': requestHeaderContentType, }, withCredentials: option.withCredentials, reportProgress: option.reportProgress, responseType: (option.responseType || option.reportProgress ? 'blob' : 'arraybuffer'), }, { headers: option.header, }); const handleResponse = ((resOption) => { switch (resOption) { case 'response': return (res) => res; case 'body': return (res) => { const arrayBuffer = res.body || res.error; const body = HelperUtils.utf8ArrayToStr(arrayBuffer); return body; }; case 'json': default: return (res) => { const arrayBuffer = res.body || res.error; let response; try { const body = HelperUtils.utf8ArrayToStr(arrayBuffer); try { response = JSON.parse(body); } catch (e) { const parser = new DOMParser(); 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); const downloadFileFromArrayBuffer = (data, filename, contentType) => { if (typeof document === 'undefined' || typeof window === 'undefined') { return; } if (window.navigator?.msSaveOrOpenBlob) { // IE11 support const blob = new Blob([data], { type: contentType }); window.navigator.msSaveOrOpenBlob(blob, filename); } else { // other browsers if ('download' in document.createElement('a')) { const blob = new Blob([data], { type: contentType }); 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 const file = new File([data], filename, { type: contentType }); const exportUrl = URL.createObjectURL(file); window.location.assign(exportUrl); URL.revokeObjectURL(exportUrl); } } }; const getFilenameFromDisposition = (disposition) => { const filenamePair = disposition .split(';') .filter((str) => /^filename=/.test(str.trim())) .pop(); if (filenamePair) { let str = filenamePair.trim(); str = str.split('=')[1]; str = str.replace(/['"]/g, ''); return decodeURIComponent(str); } else { return null; } }; const subscriber = httpClient.request(requestMethod, requestUrl, requestOption).subscribe((res) => { if (res.type === HttpEventType.DownloadProgress) { if (onProgress) { onProgress(res); } } else if (res.type === HttpEventType.Response) { const httpResponse = res; const disposition = httpResponse.headers.get('content-disposition'); const contentType = httpResponse.headers.get('content-type'); if (/^attachment/i.test(disposition) || option.downloadWithoutDispositionHeader) { const downloadFilename = option.filename || (disposition && getFilenameFromDisposition(disposition)) || url; downloadFileFromArrayBuffer(httpResponse.body, downloadFilename, contentType); if (onSuccess) { onSuccess(httpResponse); } } else { if (onError) { let response; try { response = handleResponse(httpResponse); } catch (e) { response = httpResponse; } onError(response); } } } }, (err) => { if (onError) { let response; try { response = handleResponse(err); } catch (e) { response = err; } onError(response); } }); return subscriber; } 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'; } onClick() { HelperUtils.jumpOuterUrl(this.href, this.target); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SimulateATagDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: SimulateATagDirective, selector: "[dSimulateATag]", inputs: { href: "href", target: "target" }, host: { listeners: { "click": "onClick()" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SimulateATagDirective, decorators: [{ type: Directive, args: [{ selector: '[dSimulateATag]', }] }], ctorParameters: () => [], propDecorators: { href: [{ type: Input }], target: [{ type: Input }], onClick: [{ type: HostListener, args: ['click'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvY29tbW9uL2hlbHBlci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRDLGFBQWEsRUFBZSxVQUFVLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFDdEksT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQWMvRCxNQUFNLE9BQU8sV0FBVzthQUNQLGlCQUFZLEdBQVksSUFBSSxDQUFDO2FBQzdCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO0lBRXRDLE1BQU0sQ0FBQyxjQUFjO1FBQ25CLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCO1FBQ3RCLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFTyxNQUFNLENBQUMsY0FBYztRQUMzQixJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsRUFBRSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2xFLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7Z0JBQzNCLEVBQUUsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7Z0JBQzlCLEVBQUUsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUM7Z0JBQ25DLEVBQUUs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LHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2lCQUM1Qjt3REFFVSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUVpQixPQUFPO3NCQUE3QixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlLCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmNvbnN0IGVudW0gQnJvd3NlciB7XHJcbiAgSUUgPSAnSUUnLFxyXG4gIENsYXNzaWNFZGdlID0gJ0NsYXNzaWNFZGdlJyxcclxuICBGaXJlZm94ID0gJ0ZpcmVmb3gnLFxyXG4gIE9wZXJhID0gJ09wZXJhJyxcclxuICBFZGdlID0gJ0VkZ2UnLFxyXG4gIENocm9tZSA9ICdDaHJvbWUnLFxyXG4gIFNhZmFyaSA9ICdTYWZhcmknLFxyXG4gIE90aGVyID0gJ090aGVyJyxcclxufVxyXG5kZWNsYXJlIHR5cGUgSHR0cE9ic2VydmUgPSAnYm9keScgfCAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XHJcbmRlY2xhcmUgdHlwZSBSZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xyXG5leHBvcnQgY2xhc3MgSGVscGVyVXRpbHMge1xyXG4gIHByaXZhdGUgc3RhdGljIF9icm93c2VyTmFtZTogQnJvd3NlciA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2Jyb3dzZXJWZXJzaW9uID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIGdldEJyb3dzZXJOYW1lKCkge1xyXG4gICAgIXRoaXMuX2Jyb3dzZXJOYW1lICYmIHRoaXMuZ2V0QnJvd3NlckluZm8oKTtcclxuICAgIHJldHVybiB0aGlzLl9icm93c2VyTmFtZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRCcm93c2VyVmVyc2lvbigpIHtcclxuICAgICF0aGlzLl9icm93c2VyVmVyc2lvbiAmJiB0aGlzLmdldEJyb3dzZXJJbmZvKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fYnJvd3NlclZlcnNpb247XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRCcm93c2VySW5mbygpIHtcclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgcmVzdWx0cyA9IFtcclxuICAgICAgICB1YS5tYXRjaCgvcnY6KFtcXGQuXSspXFwpIGxpa2UgZ2Vja28vKSB8fCB1YS5tYXRjaCgvbXNpZSAoW1xcZFxcLl0rKS8pLFxyXG4gICAgICAgIHVhLm1hdGNoKC9lZGdlXFwvKFtcXGRcXC5dKykvKSxcclxuICAgICAgICB1YS5tYXRjaCgvZmlyZWZveFxcLyhbXFxkXFwuXSspLyksXHJcbiAgICAgICAgdWEubWF0Y2goLyg/Om9wZXJhfG9wcikuKFtcXGRcXC5dKykvKSxcclxuICAgICAgICB1YS5tYXRjaCgvZWRnXFwvKFtcXGRcXC5dKykvKSxcclxuICAgICAgICB1YS5tYXRjaCgvY2hyb21lXFwvKFtcXGRcXC5dKykvKSxcclxuICAgICAgICB1YS5tYXRjaCgvdmVyc2lvblxcLyhbXFxkXFwuXSspLipzYWZhcmkvKSxcclxuICAgICAgXTtcclxuICAgICAgY29uc3QgaW5kZXggPSByZXN1bHRzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSk7XHJcbiAgICAgIGNvbnN0IGluZm9zID0gcmVzdWx0c1tpbmRleF07XHJcbiAgICAgIGNvbnN0IGJyb3dzZXJOYW1lcyA9IFtCcm93c2VyLklFLCBCcm93c2VyLkNsYXNzaWNFZGdlLCBCcm93c2VyLkZpcmVmb3gsIEJyb3dzZXIuT3BlcmEsIEJyb3dzZXIuRWRnZSwgQnJvd3Nlci5DaHJvbWUsIEJyb3dzZXIuU2FmYXJpXTtcclxuICAgICAgdGhpcy5fYnJvd3Nlck5hbWUgPSBicm93c2VyTmFtZXNbaW5kZXhdIHx8IEJyb3dzZXIuT3RoZXI7XHJcbiAgICAgIHRoaXMuX2Jyb3dzZXJWZXJzaW9uID0gaW5mb3MgPyBwYXJzZUludChpbmZvc1sxXSwgMTApIDogMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBqdW1wT3V0ZXJVcmwodXJsLCB0YXJnZXQgPSAnX2JsYW5rJykge1xyXG4gICAgaWYgKHVybCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY29uc3QgdGVtcExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgIHRlbXBMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IC8vIGZvciBJRSAxMVxyXG4gICAgICB0ZW1wTGluay50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgIHRlbXBMaW5rLmhyZWYgPSB1cmw7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcExpbmspOyAvLyBmb3IgSUUgMTEsIElFMTHpnIDopoFhcHBlbmTliLBkb2N1bWVudC5ib2R56YeM6Z2i55qEYemTvuaOpeaJjeS8mueUn+aViFxyXG4gICAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xyXG4gICAgICBldmVudC5pbml0RXZlbnQoJ2NsaWNrJywgZmFsc2UsIHRydWUpO1xyXG4gICAgICB0ZW1wTGluay5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wTGluayk7IC8vIGZvciBJRSAxMVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRvd25sb2FkRmlsZShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgb3B0aW9uPzoge1xyXG4gICAgICBtZXRob2Q/OiAnUE9TVCcgfCAnR0VUJyB8ICdwb3N0JyB8ICdnZXQnO1xyXG4gICAgICBwYXJhbXM/OiB7IFtwcm9wZXJ0eTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAgICAgIGVuY3R5cGU/OiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB8ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8ICd0ZXh0L3BsYWluJztcclxuICAgICAgaWZyYW1lbmFtZT86IHN0cmluZztcclxuICAgIH0sXHJcbiAgICBvbkVycm9yPzogKHJlc3BvbnNlKSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaWZyYW1lW25hbWU9JyR7b3B0aW9uPy5pZnJhbWVuYW1lIHx8ICdkb3dubG9hZCd9XWApKSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaWZyYW1lW25hbWU9JyR7b3B0aW9uPy5pZnJhbWVuYW1lIHx8ICdkb3dubG9hZCd9XWApKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRlbXBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgIHRlbXBpZnJhbWUubmFtZSA9IChvcHRpb24gJiYgb3B0aW9uLmlmcmFtZW5hbWUpIHx8ICdkb3dubG9hZCc7XHJcbiAgICB0ZW1waWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgY29uc3QgdGVtcGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XHJcbiAgICB0ZW1wZm9ybS5hY3Rpb24gPSB1cmw7XHJcbiAgICB0ZW1wZm9ybS5tZXRob2QgPSAob3B0aW9uICYmIG9wdGlvbi5tZXRob2QpIHx8ICdwb3N0JztcclxuICAgIHRlbXBmb3JtLnRhcmdldCA9IChvcHRpb24gJiYgb3B0aW9uLmlmcmFtZW5hbWUpIHx8ICdkb3dubG9hZCc7XHJcbiAgICB0ZW1wZm9ybS5lbmN0eXBlID0gKG9wdGlvbiAmJiBvcHRpb24uZW5jdHlwZSkgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcbiAgICB0ZW1wZm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgIGlmIChvcHRpb24gJiYgb3B0aW9uLnBhcmFtcykge1xyXG4gICAgICBPYmplY3Qua2V5cyhvcHRpb24ucGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgIG9wdC5uYW1lID0ga2V5O1xyXG4gICAgICAgIG9wdC52YWx1ZSA9IG9wdGlvbi5wYXJhbXNba2V5XTtcclxuICAgICAgICB0ZW1wZm9ybS5hcHBlbmRDaGlsZChvcHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdWJtaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgc3VibWl0LnR5cGUgPSAnc3VibWl0JztcclxuXHJcbiAgICB0ZW1wZm9ybS5hcHBlbmRDaGlsZChzdWJtaXQpO1xyXG4gICAgdGVtcGlmcmFtZS5hcHBlbmRDaGlsZCh0ZW1wZm9ybSk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBpZnJhbWUpO1xyXG5cclxuICAgIC8vIOS4i+i9vemUmeivr+WkhOeQhuOAguS4i+i9veaIkOWKn+W5tuS4jeS8muWTjeW6lO+8jOWboOS4uuWTjeW6lOWktOS4reW4puaciUNvbnRlbnQtRGlzcG9zaXRpb27vvIjkuIvovb3lpLTvvInnmoR1cmzvvIzml6Dms5Xnm5HlkKxpZnJhbWXnmoRsb2Fk5LqL5Lu277yMbG9hZOS6i+S7tuS4jeS8muinpuWPkVxyXG4gICAgdGVtcGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgaWZyYW1lRG9jID0gdGVtcGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKGlmcmFtZURvYy5ib2R5ICYmIGlmcmFtZURvYy5ib2R5LnRleHRDb250ZW50KTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBpZnJhbWVEb2MuYm9keSAmJiBpZnJhbWVEb2MuYm9keS50ZXh0Q29udGVudDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSAnRXJyb3InO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgb25FcnJvcignRXJyb3InKTtcclxuICAgICAgfVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXBpZnJhbWUpO1xyXG4gICAgfSk7XHJcbiAgICB0ZW1wZm9ybS5zdWJtaXQoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZEZpbGVCeUh0dHBDbGllbnQoXHJcbiAgICBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBvcHRpb24/OiB7XHJcbiAgICAgIG1ldGhvZD86ICdQT1NUJyB8ICdHRVQnIHwgJ3Bvc3QnIHwgJ2dldCc7XHJcbiAgICAgIHBhcmFtcz86IHsgW3Byb3BlcnR5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICAgICAgZW5jdHlwZT86ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ211bHRpcGFydC9mb3JtLWRhdGEnIHwgJ3RleHQvcGxhaW4nO1xyXG4gICAgICBoZWFkZXI/OiB7XHJcbiAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICAgIH07XHJcbiAgICAgIG9ic2VydmU/OiAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XHJcbiAgICAgIHJlc3BvbnNlT3B0aW9uPzogJ3Jlc3BvbnNlJyB8ICdib2R5JyB8ICdqc29uJztcclxuICAgICAgcmVzcG9uc2VUeXBlPzogJ2Jsb2InIHwgJ2FycmF5YnVmZmVyJztcclxuICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG4gICAgICBmaWxlbmFtZT86IHN0cmluZztcclxuICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcclxuICAgICAgZG93bmxvYWRXaXRob3V0RGlzcG9zaXRpb25IZWFkZXI/OiBib29sZWFuO1xyXG4gICAgfSxcclxuICAgIG9uRXJyb3I/OiAocmVzcG9uc2UpID0+IHZvaWQsXHJcbiAgICBvblN1Y2Nlc3M/OiAocmVzcG9uc2UpID0+IHZvaWQsXHJcbiAgICBvblByb2dyZXNzPzogKHJlc3BvbnNlKSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBjb25zdCByZXF1ZXN0TWV0aG9kID0gKG9wdGlvbiAmJiBvcHRpb24ubWV0aG9kICYmIG9wdGlvbi5tZXRob2QudG9Mb3dlckNhc2UoKSkgfHwgJ3Bvc3QnO1xyXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlckNvbnRlbnRUeXBlID0gb3B0aW9uLmVuY3R5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gb3B0aW9uLnBhcmFtc1xyXG4gICAgICA/IG5ldyBIdHRwUGFyYW1zKHtcclxuICAgICAgICBmcm9tT2JqZWN0OiBvcHRpb24ucGFyYW1zLFxyXG4gICAgICB9KVxyXG4gICAgICA6IG51bGw7XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdFVybCA9IHVybDtcclxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25QYXJhbXMgPSByZXF1ZXN0TWV0aG9kID09PSAnZ2V0JyA/IHJlcXVlc3RQYXJhbXMgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHJlcXVlc3RNZXRob2QgPT09ICdwb3N0JyA/IHJlcXVlc3RQYXJhbXMgJiYgcmVxdWVzdFBhcmFtcy50b1N0cmluZygpIDogdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlT3B0aW9uID0gb3B0aW9uLnJlc3BvbnNlT3B0aW9uO1xyXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1vYmplY3Qtc3ByZWFkICovXHJcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9uID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAge30sXHJcbiAgICAgIHtcclxuICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcclxuICAgICAgICBvYnNlcnZlOiAob3B0aW9uLm9ic2VydmUgfHwgb3B0aW9uLnJlcG9ydFByb2dyZXNzID8gJ2V2ZW50cycgOiAncmVzcG9uc2UnKSBhcyBIdHRwT2JzZXJ2ZSxcclxuICAgICAgICBwYXJhbXM6IHJlcXVlc3RPcHRpb25QYXJhbXMsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IHJlcXVlc3RIZWFkZXJDb250ZW50VHlwZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogb3B0aW9uLnJlcG9ydFByb2dyZXNzLFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogKG9wdGlvbi5yZXNwb25zZVR5cGUgfHwgb3B0aW9uLnJlcG9ydFByb2dyZXNzID8gJ2Jsb2InIDogJ2FycmF5YnVmZmVyJykgYXMgUmVzcG9uc2VUeXBlLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyczogb3B0aW9uLmhlYWRlcixcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9ICgocmVzT3B0aW9uKSA9PiB7XHJcbiAgICAgIHN3aXRjaCAocmVzT3B0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ3Jlc3BvbnNlJzpcclxuICAgICAgICByZXR1cm4gKHJlczogSHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPikgPT4gcmVzO1xyXG4gICAgICBjYXNlICdib2R5JzpcclxuICAgICAgICByZXR1cm4gKHJlczogSHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPiB8IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IDxBcnJheUJ1ZmZlcj4oPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+cmVzKS5ib2R5IHx8ICg8SHR0cEVycm9yUmVzcG9uc2U+cmVzKS5lcnJvcjtcclxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBIZWxwZXJVdGlscy51dGY4QXJyYXlUb1N0cihhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICByZXR1cm4gYm9keTtcclxuICAgICAgICB9O1xyXG4gICAgICBjYXNlICdqc29uJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gKHJlczogSHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPiB8IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IDxBcnJheUJ1ZmZlcj4oPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+cmVzKS5ib2R5IHx8ICg8SHR0cEVycm9yUmVzcG9uc2U+cmVzKS5lcnJvcjtcclxuICAgICAgICAgIGxldCByZXNwb25zZTtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBIZWxwZXJVdGlscy51dGY4QXJyYXlUb1N0cihhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKGJvZHkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGJvZHksICd0ZXh0L2h0bWwnKTtcclxuICAgICAgICAgICAgICByZXNwb25zZSA9IGh0bWwuYm9keS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNpbmcgRXJyb3I6JyArIGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXNwb25zZSA9ICdFcnJvcic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSkocmVzcG9uc2VPcHRpb24pO1xyXG5cclxuICAgIGNvbnN0IGRvd25sb2FkRmlsZUZyb21BcnJheUJ1ZmZlciA9IChkYXRhOiBBcnJheUJ1ZmZlciwgZmlsZW5hbWU6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KT8ubXNTYXZlT3JPcGVuQmxvYikge1xyXG4gICAgICAgIC8vIElFMTEgc3VwcG9ydFxyXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZTogY29udGVudFR5cGUgfSk7XHJcbiAgICAgICAgKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KS5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIGZpbGVuYW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBvdGhlciBicm93c2Vyc1xyXG4gICAgICAgIGlmICgnZG93bmxvYWQnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSkge1xyXG4gICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcclxuICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVuYW1lO1xyXG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XHJcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGxpbmsuaHJlZik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIG5vdCBzdXBwb3J0IHRhZyBhIGRvd25sb2FkIGF0dHJpYnV0ZSB1c2UgZmlsZSBkb3dubG9hZCwgZmlsZW5hbWUgd29uJ3Qgc3VwcG9ydFxyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtkYXRhXSwgZmlsZW5hbWUsIHsgdHlwZTogY29udGVudFR5cGUgfSk7XHJcbiAgICAgICAgICBjb25zdCBleHBvcnRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihleHBvcnRVcmwpO1xyXG4gICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChleHBvcnRVcmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBnZXRGaWxlbmFtZUZyb21EaXNwb3NpdGlvbiA9IChkaXNwb3NpdGlvbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGVuYW1lUGFpciA9IGRpc3Bvc2l0aW9uXHJcbiAgICAgICAgLnNwbGl0KCc7JylcclxuICAgICAgICAuZmlsdGVyKChzdHIpID0+IC9eZmlsZW5hbWU9Ly50ZXN0KHN0ci50cmltKCkpKVxyXG4gICAgICAgIC5wb3AoKTtcclxuICAgICAgaWYgKGZpbGVuYW1lUGFpcikge1xyXG4gICAgICAgIGxldCBzdHIgPSBmaWxlbmFtZVBhaXIudHJpbSgpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnPScpWzFdO1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XHJcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHN1YnNjcmliZXIgPSBodHRwQ2xpZW50LnJlcXVlc3QocmVxdWVzdE1ldGhvZCwgcmVxdWVzdFVybCwgcmVxdWVzdE9wdGlvbikuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBIdHRwRXZlbnQ8YW55PikgPT4ge1xyXG4gICAgICAgIGlmIChyZXMudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzKSB7XHJcbiAgICAgICAgICBpZiAob25Qcm9ncmVzcykge1xyXG4gICAgICAgICAgICBvblByb2dyZXNzKHJlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXMudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkge1xyXG4gICAgICAgICAgY29uc3QgaHR0cFJlc3BvbnNlID0gcmVzIGFzIEh0dHBSZXNwb25zZTxhbnk+O1xyXG4gICAgICAgICAgY29uc3QgZGlzcG9zaXRpb24gPSAoPEh0dHBIZWFkZXJzPmh0dHBSZXNwb25zZS5oZWFkZXJzKS5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKTtcclxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gKDxIdHRwSGVhZGVycz5odHRwUmVzcG9uc2UuaGVhZGVycykuZ2V0KCdjb250ZW50LXR5cGUnKTtcclxuXHJcbiAgICAgICAgICBpZiAoL15hdHRhY2htZW50L2kudGVzdChkaXNwb3NpdGlvbikgfHwgb3B0aW9uLmRvd25sb2FkV2l0aG91dERpc3Bvc2l0aW9uSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvd25sb2FkRmlsZW5hbWUgPSBvcHRpb24uZmlsZW5hbWUgfHwgKGRpc3Bvc2l0aW9uICYmIGdldEZpbGVuYW1lRnJvbURpc3Bvc2l0aW9uKGRpc3Bvc2l0aW9uKSkgfHwgdXJsO1xyXG4gICAgICAgICAgICBkb3dubG9hZEZpbGVGcm9tQXJyYXlCdWZmZXIoaHR0cFJlc3BvbnNlLmJvZHksIGRvd25sb2FkRmlsZW5hbWUsIGNvbnRlbnRUeXBlKTtcclxuICAgICAgICAgICAgaWYgKG9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgIG9uU3VjY2VzcyhodHRwUmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob25FcnJvcikge1xyXG4gICAgICAgICAgICAgIGxldCByZXNwb25zZTtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBoYW5kbGVSZXNwb25zZShodHRwUmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaHR0cFJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgIGlmIChvbkVycm9yKSB7XHJcbiAgICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwb25zZSA9IGhhbmRsZVJlc3BvbnNlKGVycik7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gZXJyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBzdWJzY3JpYmVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXRmOEFycmF5VG9TdHIoYXJyYXlCdWZmZXIpIHtcclxuICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JykuZGVjb2RlKGFycmF5QnVmZmVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBmYWxsYmFjayDmlrnmoYjvvIzml6BUZXh0RGVjb2RlcuWcuuaZr+S9v+eUqOebtOaOpeino+aekO+8jOiLseaWh+aXoOmXrumimO+8jOS4reaWh+S8muWtmOWcqOS5seeggVxyXG4gICAgICAgKiBpZSAxMSDkuIvmlK/mjIHkuK3mlofpnIDopoHkvb/nlKhNRE7mjqjojZDnmoQgZmFzdGVzdHNtYWxsZXN0dGV4dGVuY29kZXJkZWNvZGVy5Lul5pSv5oyBVGV4dERlY29kZXJcclxuICAgICAgICogbnBtIGluc3RhbGwgZmFzdGVzdHNtYWxsZXN0dGV4dGVuY29kZXJkZWNvZGVyXHJcbiAgICAgICAqIHBvbHlmaWxsLnRzIGluY2x1ZGVzXHJcbiAgICAgICAqIGBgYFxyXG4gICAgICAgKiAvLyBwb2x5ZmlsbCBmb3IgVGV4dERlY29kZXIgb24gSUUgMTFcclxuICAgICAgICogaW1wb3J0ICdmYXN0ZXN0c21hbGxlc3R0ZXh0ZW5jb2RlcmRlY29kZXInO1xyXG4gICAgICAgKiBgYGBcclxuICAgICAgICovXHJcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkU2ltdWxhdGVBVGFnXScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW11bGF0ZUFUYWdEaXJlY3RpdmUge1xyXG4gIEBJbnB1dCgpIGhyZWY6IHN0cmluZztcclxuICBASW5wdXQoKSB0YXJnZXQ6ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJyB8IHN0cmluZyA9ICdfYmxhbmsnO1xyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycpIG9uQ2xpY2soKSB7XHJcbiAgICBIZWxwZXJVdGlscy5qdW1wT3V0ZXJVcmwodGhpcy5ocmVmLCB0aGlzLnRhcmdldCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==