jade-integration-utils
Version:
A tool made for any type of http requisitions and to manage localstorage. This package works into Angular and Ionic projects (maybe you can run this in ReactNative, MAYBE!).
266 lines • 34.2 kB
JavaScript
import { StorageService } from '../services/storage.service';
import { XHRManager } from '../services/xhr-manager.service';
export class DataService {
constructor(api_url, endpoint) {
this._endpoint = "";
this.xMan = new XHRManager(api_url, endpoint);
this.element_list = new Array();
this.loading = false;
this._endpoint = endpoint;
}
remove_e_query(query) {
query = query.startsWith("&") ? query.replace(query.charAt(0), "") : query;
return query;
}
getById(id, callbackHandler) {
this.loading = true;
this.xMan.getById(id, this._endpoint)
.then((result) => {
this.bind_results(result);
if (callbackHandler)
callbackHandler(result);
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
bind_results(result) {
var _a, _b, _c;
this.page = (_a = result === null || result === void 0 ? void 0 : result.page) !== null && _a !== void 0 ? _a : this.page;
this.fetch = (_b = result === null || result === void 0 ? void 0 : result.fetch) !== null && _b !== void 0 ? _b : this.fetch;
this.itemsCount = (_c = result === null || result === void 0 ? void 0 : result.itemsCount) !== null && _c !== void 0 ? _c : this.itemsCount;
if (result.objects != null)
this.element_list = result.objects;
this.results = result;
this.get_pages_array();
}
get(filter, callbackHandler, pagination = false) {
this.loading = true;
let query = this.serialize_query(filter) + (pagination ? '&' + this.get_pagination_query() : '');
console.log(query);
this.xMan.get(this._endpoint, query)
.then((result) => {
this.bind_results(result);
if (callbackHandler)
callbackHandler(result);
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
getAll(callbackHandler, pagination = false) {
this.loading = true;
let pagination_query = (pagination ? this.get_pagination_query() : '');
console.log(pagination);
this.xMan.get(this._endpoint, pagination_query)
.then((result) => {
this.bind_results(result);
if (callbackHandler)
callbackHandler(result);
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
next(filter) {
this.page += 1;
this.get(filter, true);
}
previous(filter) {
if (this.page > 1)
this.page -= 1;
this.get(filter, true);
}
/**
* calls a http get to not configured endpoint
*
* @param endpoint another endpoint
*/
get_by_endpoint(endpoint, callbackHandler, query_params, pagination = false) {
this.loading = true;
console.log(pagination);
this.xMan.get(endpoint + (pagination ? this.get_pagination_query() : ''))
.then((result) => {
this.bind_results(result);
if (callbackHandler)
callbackHandler(result);
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
/**
* this function calls a http post from before configured api
*
* @param body parameter that send's a different custom body
* @param callbackHandler @optional function to call when requests finish
* @param message @optional string to show after requests finish
*/
post(body, callbackHandler) {
this.loading = true;
this.xMan.post(this.remove_resource(body), this._endpoint)
.then((result) => {
this.results = result;
if (callbackHandler)
callbackHandler(result);
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
/**
* this function calls a http post from before configured api
*
* @param body parameter that send's a custom body
* @param callbackHandler @optional function to call when requests finish
* @param message @optional string to show after requests finish
*/
create(body, callbackHandler) {
this.loading = true;
this.xMan.post(this.remove_resource(body), this._endpoint)
.then((result) => {
this.results = result;
if (callbackHandler)
callbackHandler(result);
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
/**
* call's a Put method to the url before configured
* @param body of requisition of request
* @param callbackHandler function that call's on request's finished
* @param message @optional string to show after requests finish
*/
update(body, callbackHandler) {
this.loading = true;
this.xMan.put(this.remove_resource(body), this._endpoint)
.then((result) => {
this.results = result;
if (callbackHandler)
callbackHandler(result);
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
/**
* call's a Put method to the url before configured
* @param body of requisition of request
* @param callbackHandler function that call's on request's finished
* @param message @optional string to show after requests finish
*/
put(body, callbackHandler) {
this.loading = true;
this.xMan.put(body, this._endpoint)
.then((result) => {
this.results = result;
if (callbackHandler)
callbackHandler(result);
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
/**
* calls http DELETE to configured endpoint
*
* @param id Id to delete
* @param callbackHandler a function to run after delete function as done
*/
delete(id, callbackHandler) {
this.loading = true;
this.xMan.delete(id, this._endpoint)
.then((results) => {
if (results.target) {
if (callbackHandler)
callbackHandler(results);
}
else {
alert("Ocorreu um erro!");
}
})
.catch((error) => this.showError(error))
.finally(() => this.loading = false);
}
/**
* Set's Authentication bearer
* @param auth strings containing authentication bearer
*/
set_auth(auth) {
this.xMan.set_token(auth);
}
get_auth() {
return this.xMan.get_token();
}
get_pages_array() {
this.page_array = new Array();
let pagesCount = this.itemsCount / this.fetch;
for (let index = 1; index <= pagesCount; index++) {
this.page_array.push(index);
}
}
get_pagination_query() {
return "fetch=" + this.fetch + "&page=" + this.page;
}
show_success(msg) {
alert(msg || 'Saved with success');
}
showError(error) {
console.log("***API ERROR REPORT***");
console.log(error);
console.log("--------------------");
}
logout() {
StorageService.clear();
this.xMan.auth = '';
window.location.reload();
}
serialize_query(obj) {
var str = [];
for (var p in obj) {
if (typeof obj[p] === 'object') {
for (const key in obj[p]) {
if (p == 'resource')
continue;
if (Object.prototype.hasOwnProperty.call(obj[p], key)) {
const element = obj[p][key];
if (this.serialize_query(obj[p]))
str.push(encodeURIComponent(p) + "." + this.serialize_query(obj[p]));
}
}
}
else if (obj.hasOwnProperty(p)) {
if (encodeURIComponent(obj[p]))
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
}
var results = str.join("&");
return results;
}
auto_bind(result, target) {
for (var p in result) {
if (target.hasOwnProperty(p) && result.hasOwnProperty(p)) {
target[p] = result[p];
}
}
}
remove_resource(target) {
this.target = JSON.parse(JSON.stringify(target));
for (var p in this.target) {
if (this.target.hasOwnProperty(p)) {
if (p == 'resource' || p == 'endpoint') {
delete this.target[p];
}
;
}
}
return this.target;
}
static normalizeString(text) {
text = text.toLowerCase();
text = text.replace(new RegExp('[ÁÀÂÃ]', 'gi'), 'a');
text = text.replace(new RegExp('[ÉÈÊ]', 'gi'), 'e');
text = text.replace(new RegExp('[ÍÌÎ]', 'gi'), 'i');
text = text.replace(new RegExp('[ÓÒÔÕ]', 'gi'), 'o');
text = text.replace(new RegExp('[ÚÙÛ]', 'gi'), 'u');
text = text.replace(new RegExp('[Ç]', 'gi'), 'c');
text = text.replace(/[^a-z0-9 -]/g, '');
return text;
}
}
DataService.user_session = "session-user";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9qYWRlLWludGVncmF0aW9uLXV0aWxzLyIsInNvdXJjZXMiOlsibGliL01vZGVscy9EYXRhU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTdELE1BQU0sT0FBTyxXQUFXO0lBY3RCLFlBQ0UsT0FBZSxFQUNmLFFBQWU7UUFMVCxjQUFTLEdBQVcsRUFBRSxDQUFDO1FBTzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM1QixDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQWE7UUFDbEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRTFFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLE9BQU8sQ0FBQyxFQUFVLEVBQUMsZUFBcUI7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUksRUFBRSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDdEMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FB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Ozs7Ozs7T0FNRztJQUNJLElBQUksQ0FBQyxJQUFTLEVBQUUsZUFBcUI7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQy9ELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsSUFBRyxlQUFlO2dCQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEMsT0FBTyxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxJQUFPLEVBQUUsZUFBcUI7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQy9ELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsSUFBRyxlQUFlO2dCQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEMsT0FBTyxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLElBQU0sRUFBQyxlQUFxQjtRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBUyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDL0QsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFDLEVBQUU7WUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUN0QixJQUFHLGVBQWU7Z0JBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QyxPQUFPLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0g7Ozs7O09BS0c7SUFDTSxHQUFHLENBQUMsSUFBUSxFQUFDLGVBQXFCO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFTLElBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ3pDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsSUFBRyxlQUFlO2dCQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEMsT0FBTyxDQUFDLEdBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEVBQVMsRUFBRSxlQUFxQjtRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBSSxFQUFFLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUNyQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUMsRUFBRTtZQUNmLElBQUcsT0FBTyxDQUFDLE1BQU0sRUFBQztnQkFDaEIsSUFBRyxlQUFlO29CQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM5QztpQkFBSTtnQkFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMzQjtRQUNILENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QyxPQUFPLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksUUFBUSxDQUFDLElBQVk7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ3RDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM5QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUNNLG9CQUFvQjtRQUN6QixPQUFPLFFBQVEsR0FBQyxJQUFJLENBQUMsS0FBSyxHQUFDLFFBQVEsR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ2hELENBQUM7SUFFTSxZQUFZLENBQUMsR0FBWTtRQUM5QixLQUFLLENBQUMsR0FBRyxJQUFJLG9CQUFvQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxLQUFTO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sTUFBTTtRQUNYLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sZUFBZSxDQUFDLEdBQUc7UUFDeEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUM7WUFDaEIsSUFBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUM7Z0JBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN4QixJQUFHLENBQUMsSUFBSSxVQUFVO3dCQUFFLFNBQVM7b0JBQzdCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTt3QkFDckQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUU1QixJQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3hFO2lCQUNGO2FBQ0Y7aUJBQUssSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixJQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25HO1NBQ0Y7UUFDRCxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDTSxTQUFTLENBQUMsTUFBTSxFQUFDLE1BQU07UUFDNUIsS0FBSyxJQUFJLENBQUMsSUFBSSxNQUFNLEVBQUM7WUFDbkIsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3hELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkI7U0FDRjtJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsTUFBTTtRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRWpELEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBQztZQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNqQyxJQUFHLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLFVBQVUsRUFBQztvQkFDcEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2QjtnQkFBQSxDQUFDO2FBQ0g7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJO1FBQ3pCLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUFuU2Esd0JBQVksR0FBVyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBJRGF0YVNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lEYXRhU2VydmljZSc7XG5pbXBvcnQgeyBYSFJNYW5hZ2VyIH0gZnJvbSAnLi4vc2VydmljZXMveGhyLW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBSZXN1bHQgfSBmcm9tICcuL1BhZ2luYXRvcic7XG5cblxuZXhwb3J0IGNsYXNzIERhdGFTZXJ2aWNlPFQ+IGltcGxlbWVudHMgSURhdGFTZXJ2aWNle1xuICBwdWJsaWMgc3RhdGljIHVzZXJfc2Vzc2lvbjogc3RyaW5nID0gXCJzZXNzaW9uLXVzZXJcIjtcbiAgcHVibGljIGVsZW1lbnRfbGlzdDogQXJyYXk8VD47XG4gIHB1YmxpYyBwYWdlX2FycmF5IDogQXJyYXk8bnVtYmVyPjtcbiAgcHVibGljIHBhZ2UgOiBudW1iZXI7XG4gIHB1YmxpYyBmZXRjaCA6IG51bWJlcjtcbiAgcHVibGljIGl0ZW1zQ291bnQgOiBudW1iZXI7XG4gIHB1YmxpYyBhcmdzOiBhbnk7XG4gIHB1YmxpYyByZXN1bHRzOiBhbnk7XG4gIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuO1xuICBwdWJsaWMgeE1hbiA6IFhIUk1hbmFnZXI7XG4gIHByaXZhdGUgX2VuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIHRhcmdldDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFwaV91cmw6IHN0cmluZyxcbiAgICBlbmRwb2ludDpzdHJpbmdcbiAgICApIHtcbiAgICB0aGlzLnhNYW4gPSBuZXcgWEhSTWFuYWdlcihhcGlfdXJsLGVuZHBvaW50KTtcbiAgICB0aGlzLmVsZW1lbnRfbGlzdCA9IG5ldyBBcnJheTxUPigpO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2VuZHBvaW50ID0gZW5kcG9pbnQ7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZV9lX3F1ZXJ5KHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmd7XG4gICAgcXVlcnkgPSBxdWVyeS5zdGFydHNXaXRoKFwiJlwiKSA/IHF1ZXJ5LnJlcGxhY2UocXVlcnkuY2hhckF0KDApLFwiXCIpIDogcXVlcnk7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QnlJZChpZDogbnVtYmVyLGNhbGxiYWNrSGFuZGxlcj86IGFueSk6IHZvaWR7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMueE1hbi5nZXRCeUlkPFQ+KGlkLHRoaXMuX2VuZHBvaW50KVxuICAgIC50aGVuKChyZXN1bHQpID0+IHsgXG4gICAgICB0aGlzLmJpbmRfcmVzdWx0cyhyZXN1bHQpO1xuICAgICAgaWYoY2FsbGJhY2tIYW5kbGVyKSAgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKT0+IHRoaXMuc2hvd0Vycm9yKGVycm9yKSlcbiAgICAuZmluYWxseSgoKT0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZF9yZXN1bHRzKHJlc3VsdDogUmVzdWx0PFQ+KTogYW55IHtcbiAgICB0aGlzLnBhZ2UgPSByZXN1bHQ/LnBhZ2UgPz8gdGhpcy5wYWdlO1xuICAgIHRoaXMuZmV0Y2ggPSByZXN1bHQ/LmZldGNoID8/IHRoaXMuZmV0Y2g7XG4gICAgdGhpcy5pdGVtc0NvdW50ID0gcmVzdWx0Py5pdGVtc0NvdW50ID8/IHRoaXMuaXRlbXNDb3VudDtcbiAgICBpZihyZXN1bHQub2JqZWN0cyAhPSBudWxsKSB0aGlzLmVsZW1lbnRfbGlzdCA9IHJlc3VsdC5vYmplY3RzO1xuICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdDtcblxuICAgIHRoaXMuZ2V0X3BhZ2VzX2FycmF5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGZpbHRlcj86IFQsIGNhbGxiYWNrSGFuZGxlcj86YW55LHBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5zZXJpYWxpemVfcXVlcnkoZmlsdGVyKSsgKHBhZ2luYXRpb24gPyAnJicrdGhpcy5nZXRfcGFnaW5hdGlvbl9xdWVyeSgpOiAnJyk7XG4gICAgY29uc29sZS5sb2cocXVlcnkpO1xuXG4gICAgdGhpcy54TWFuLmdldDxUPih0aGlzLl9lbmRwb2ludCxxdWVyeSlcbiAgICAudGhlbigocmVzdWx0KT0+IHsgXG4gICAgICB0aGlzLmJpbmRfcmVzdWx0cyhyZXN1bHQpO1xuICAgICAgaWYoY2FsbGJhY2tIYW5kbGVyKSAgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKT0+IHRoaXMuc2hvd0Vycm9yKGVycm9yKSlcbiAgICAuZmluYWxseSgoKT0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoY2FsbGJhY2tIYW5kbGVyPzphbnkscGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBsZXQgcGFnaW5hdGlvbl9xdWVyeSA9IChwYWdpbmF0aW9uID8gdGhpcy5nZXRfcGFnaW5hdGlvbl9xdWVyeSgpOiAnJyk7XG5cbiAgICBjb25zb2xlLmxvZyhwYWdpbmF0aW9uKTtcblxuICAgIHRoaXMueE1hbi5nZXQ8VD4odGhpcy5fZW5kcG9pbnQsIHBhZ2luYXRpb25fcXVlcnkpXG4gICAgLnRoZW4oKHJlc3VsdCk9PiAgeyBcbiAgICAgIHRoaXMuYmluZF9yZXN1bHRzKHJlc3VsdCk7XG4gICAgICBpZihjYWxsYmFja0hhbmRsZXIpICBjYWxsYmFja0hhbmRsZXIocmVzdWx0KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpPT4gdGhpcy5zaG93RXJyb3IoZXJyb3IpKVxuICAgIC5maW5hbGx5KCgpPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIG5leHQoZmlsdGVyPzpUKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlICs9IDE7XG4gICAgdGhpcy5nZXQoZmlsdGVyLHRydWUpO1xuICB9XG5cbiAgcHVibGljIHByZXZpb3VzKGZpbHRlcj86IFQpOiB2b2lkIHtcbiAgICBpZih0aGlzLnBhZ2UgPiAxKSB0aGlzLnBhZ2UgLT0gMTtcbiAgICB0aGlzLmdldChmaWx0ZXIsdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogY2FsbHMgYSBodHRwIGdldCB0byBub3QgY29uZmlndXJlZCBlbmRwb2ludFxuICAgKlxuICAgKiBAcGFyYW0gZW5kcG9pbnQgYW5vdGhlciBlbmRwb2ludFxuICAgKi9cbiAgcHVibGljIGdldF9ieV9lbmRwb2ludChlbmRwb2ludDpzdHJpbmcsY2FsbGJhY2tIYW5kbGVyPzphbnkscXVlcnlfcGFyYW1zPzphbnkscGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogdm9pZHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgY29uc29sZS5sb2cocGFnaW5hdGlvbik7XG5cbiAgICB0aGlzLnhNYW4uZ2V0PFQ+KGVuZHBvaW50KyhwYWdpbmF0aW9uID8gdGhpcy5nZXRfcGFnaW5hdGlvbl9xdWVyeSgpOiAnJykpXG4gICAgLnRoZW4oKHJlc3VsdCk9PiAgeyBcbiAgICAgIHRoaXMuYmluZF9yZXN1bHRzKHJlc3VsdCk7XG4gICAgICBpZihjYWxsYmFja0hhbmRsZXIpICBjYWxsYmFja0hhbmRsZXIocmVzdWx0KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpPT4gdGhpcy5zaG93RXJyb3IoZXJyb3IpKVxuICAgIC5maW5hbGx5KCgpPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgZnVuY3Rpb24gY2FsbHMgYSBodHRwIHBvc3QgZnJvbSBiZWZvcmUgY29uZmlndXJlZCBhcGlcbiAgICpcbiAgICogQHBhcmFtIGJvZHkgIHBhcmFtZXRlciB0aGF0IHNlbmQncyBhIGRpZmZlcmVudCBjdXN0b20gYm9keVxuICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIEBvcHRpb25hbCBmdW5jdGlvbiB0byBjYWxsIHdoZW4gcmVxdWVzdHMgZmluaXNoXG4gICAqIEBwYXJhbSBtZXNzYWdlIEBvcHRpb25hbCBzdHJpbmcgdG8gc2hvdyBhZnRlciByZXF1ZXN0cyBmaW5pc2hcbiAgICovXG4gIHB1YmxpYyBwb3N0KGJvZHk6IGFueSwgY2FsbGJhY2tIYW5kbGVyPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMueE1hbi5wb3N0PFQsYW55Pih0aGlzLnJlbW92ZV9yZXNvdXJjZShib2R5KSx0aGlzLl9lbmRwb2ludClcbiAgICAudGhlbigocmVzdWx0KT0+e1xuICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0O1xuICAgICAgaWYoY2FsbGJhY2tIYW5kbGVyKSBjYWxsYmFja0hhbmRsZXIocmVzdWx0KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpPT4gdGhpcy5zaG93RXJyb3IoZXJyb3IpKVxuICAgIC5maW5hbGx5KCgpPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgZnVuY3Rpb24gY2FsbHMgYSBodHRwIHBvc3QgZnJvbSBiZWZvcmUgY29uZmlndXJlZCBhcGlcbiAgICpcbiAgICogQHBhcmFtIGJvZHkgcGFyYW1ldGVyIHRoYXQgc2VuZCdzIGEgY3VzdG9tIGJvZHlcbiAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciBAb3B0aW9uYWwgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHJlcXVlc3RzIGZpbmlzaFxuICAgKiBAcGFyYW0gbWVzc2FnZSBAb3B0aW9uYWwgc3RyaW5nIHRvIHNob3cgYWZ0ZXIgcmVxdWVzdHMgZmluaXNoXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlKGJvZHk6IFQsIGNhbGxiYWNrSGFuZGxlcj86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLnhNYW4ucG9zdDxULGFueT4odGhpcy5yZW1vdmVfcmVzb3VyY2UoYm9keSksdGhpcy5fZW5kcG9pbnQpXG4gICAgLnRoZW4oKHJlc3VsdCk9PntcbiAgICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdDtcbiAgICAgIGlmKGNhbGxiYWNrSGFuZGxlcikgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKT0+IHRoaXMuc2hvd0Vycm9yKGVycm9yKSlcbiAgICAuZmluYWxseSgoKT0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsJ3MgYSBQdXQgbWV0aG9kIHRvIHRoZSB1cmwgYmVmb3JlIGNvbmZpZ3VyZWRcbiAgICogQHBhcmFtIGJvZHkgb2YgcmVxdWlzaXRpb24gb2YgcmVxdWVzdFxuICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIGZ1bmN0aW9uIHRoYXQgY2FsbCdzIG9uIHJlcXVlc3QncyBmaW5pc2hlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSBAb3B0aW9uYWwgc3RyaW5nIHRvIHNob3cgYWZ0ZXIgcmVxdWVzdHMgZmluaXNoXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlKGJvZHk6VCxjYWxsYmFja0hhbmRsZXI/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMueE1hbi5wdXQ8YW55LCBUPih0aGlzLnJlbW92ZV9yZXNvdXJjZShib2R5KSx0aGlzLl9lbmRwb2ludClcbiAgICAudGhlbigocmVzdWx0KT0+e1xuICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0O1xuICAgICAgaWYoY2FsbGJhY2tIYW5kbGVyKSBjYWxsYmFja0hhbmRsZXIocmVzdWx0KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpPT4gdGhpcy5zaG93RXJyb3IoZXJyb3IpKVxuICAgIC5maW5hbGx5KCgpPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xuICB9XG4vKipcbiAqIGNhbGwncyBhIFB1dCBtZXRob2QgdG8gdGhlIHVybCBiZWZvcmUgY29uZmlndXJlZFxuICogQHBhcmFtIGJvZHkgb2YgcmVxdWlzaXRpb24gb2YgcmVxdWVzdFxuICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciBmdW5jdGlvbiB0aGF0IGNhbGwncyBvbiByZXF1ZXN0J3MgZmluaXNoZWRcbiogQHBhcmFtIG1lc3NhZ2UgQG9wdGlvbmFsIHN0cmluZyB0byBzaG93IGFmdGVyIHJlcXVlc3RzIGZpbmlzaCBcbiAqL1xuICBwdWJsaWMgcHV0KGJvZHk6YW55LGNhbGxiYWNrSGFuZGxlcj86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy54TWFuLnB1dDxhbnksIFQ+KGJvZHksdGhpcy5fZW5kcG9pbnQpXG4gICAgLnRoZW4oKHJlc3VsdCk9PntcbiAgICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdDtcbiAgICAgIGlmKGNhbGxiYWNrSGFuZGxlcikgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKT0+IHRoaXMuc2hvd0Vycm9yKGVycm9yKSlcbiAgICAuZmluYWxseSgoKT0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxscyBodHRwIERFTEVURSB0byBjb25maWd1cmVkIGVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSBpZCBJZCB0byBkZWxldGVcbiAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciBhIGZ1bmN0aW9uIHRvIHJ1biBhZnRlciBkZWxldGUgZnVuY3Rpb24gYXMgZG9uZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZShpZDpudW1iZXIsIGNhbGxiYWNrSGFuZGxlcj86IGFueSk6IHZvaWR7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnhNYW4uZGVsZXRlPFQ+KGlkLHRoaXMuX2VuZHBvaW50KVxuICAgIC50aGVuKChyZXN1bHRzKT0+IHtcbiAgICAgIGlmKHJlc3VsdHMudGFyZ2V0KXtcbiAgICAgICAgaWYoY2FsbGJhY2tIYW5kbGVyKSBjYWxsYmFja0hhbmRsZXIocmVzdWx0cyk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgYWxlcnQoXCJPY29ycmV1IHVtIGVycm8hXCIpO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcik9PiB0aGlzLnNob3dFcnJvcihlcnJvcikpXG4gICAgLmZpbmFsbHkoKCk9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0J3MgQXV0aGVudGljYXRpb24gYmVhcmVyXG4gICAqIEBwYXJhbSBhdXRoIHN0cmluZ3MgY29udGFpbmluZyBhdXRoZW50aWNhdGlvbiBiZWFyZXJcbiAgICovXG4gIHB1YmxpYyBzZXRfYXV0aChhdXRoOiBzdHJpbmcpOnZvaWQge1xuICAgIHRoaXMueE1hbi5zZXRfdG9rZW4oYXV0aCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0X2F1dGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy54TWFuLmdldF90b2tlbigpO1xuICB9XG4gIHB1YmxpYyBnZXRfcGFnZXNfYXJyYXkoKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlX2FycmF5ID0gbmV3IEFycmF5PG51bWJlcj4oKTtcbiAgICBsZXQgcGFnZXNDb3VudCA9IHRoaXMuaXRlbXNDb3VudCAvIHRoaXMuZmV0Y2g7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBwYWdlc0NvdW50OyBpbmRleCsrKSB7XG4gICAgICB0aGlzLnBhZ2VfYXJyYXkucHVzaChpbmRleCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRfcGFnaW5hdGlvbl9xdWVyeSgpOiBzdHJpbmd7XG4gICAgcmV0dXJuIFwiZmV0Y2g9XCIrdGhpcy5mZXRjaCtcIiZwYWdlPVwiK3RoaXMucGFnZTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93X3N1Y2Nlc3MobXNnPzogc3RyaW5nKTogdm9pZCB7XG4gICAgYWxlcnQobXNnIHx8ICdTYXZlZCB3aXRoIHN1Y2Nlc3MnKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93RXJyb3IoZXJyb3I6YW55KTp2b2lke1xuICAgIGNvbnNvbGUubG9nKFwiKioqQVBJIEVSUk9SIFJFUE9SVCoqKlwiKTtcbiAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tLS0tLS0tLVwiKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2dvdXQoKTp2b2lke1xuICAgIFN0b3JhZ2VTZXJ2aWNlLmNsZWFyKCk7XG4gICAgdGhpcy54TWFuLmF1dGggPSAnJztcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplX3F1ZXJ5KG9iaikge1xuICAgIHZhciBzdHIgPSBbXTtcbiAgICBmb3IgKHZhciBwIGluIG9iail7XG4gICAgICBpZih0eXBlb2Ygb2JqW3BdID09PSAnb2JqZWN0Jyl7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9ialtwXSkge1xuICAgICAgICAgIGlmKHAgPT0gJ3Jlc291cmNlJykgY29udGludWU7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpbcF0sIGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvYmpbcF1ba2V5XTtcblxuICAgICAgICAgICAgaWYodGhpcy5zZXJpYWxpemVfcXVlcnkob2JqW3BdKSlcbiAgICAgICAgICAgICAgc3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHApICsgXCIuXCIgKyB0aGlzLnNlcmlhbGl6ZV9xdWVyeShvYmpbcF0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1lbHNlIGlmIChvYmouaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgaWYoZW5jb2RlVVJJQ29tcG9uZW50KG9ialtwXSkpIHN0ci5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChwKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9ialtwXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmVzdWx0cyA9IHN0ci5qb2luKFwiJlwiKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIHB1YmxpYyBhdXRvX2JpbmQocmVzdWx0LHRhcmdldCkgOiB2b2lkIHtcbiAgICBmb3IgKHZhciBwIGluIHJlc3VsdCl7XG4gICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KHApICYmIHJlc3VsdC5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICB0YXJnZXRbcF0gPSByZXN1bHRbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZV9yZXNvdXJjZSh0YXJnZXQpIDogYW55IHtcbiAgICB0aGlzLnRhcmdldCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGFyZ2V0KSk7XG5cbiAgICBmb3IgKHZhciBwIGluIHRoaXMudGFyZ2V0KXtcbiAgICAgIGlmICh0aGlzLnRhcmdldC5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBpZihwID09ICdyZXNvdXJjZScgfHwgcCA9PSAnZW5kcG9pbnQnKXtcbiAgICAgICAgICBkZWxldGUgdGhpcy50YXJnZXRbcF07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGFyZ2V0O1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZVN0cmluZyh0ZXh0KXtcbiAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cCgnW8OBw4DDgsODXScsJ2dpJyksICdhJyk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZShuZXcgUmVnRXhwKCdbw4nDiMOKXScsJ2dpJyksICdlJyk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZShuZXcgUmVnRXhwKCdbw43DjMOOXScsJ2dpJyksICdpJyk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZShuZXcgUmVnRXhwKCdbw5PDksOUw5VdJywnZ2knKSwgJ28nKTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1vDmsOZw5tdJywnZ2knKSwgJ3UnKTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1vDh10nLCdnaScpLCAnYycpO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1teYS16MC05IC1dL2csICcnKTtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxufVxuIl19