Comparing version 3.0.6 to 4.0.0
@@ -1,2 +0,2 @@ | ||
import { RequestOptions, ObjectRequestOptions, ArrayRequestOptions, QueryParams, FilterOperators, RequestBody, ResponseBody, ObjectResponseBody, ArrayResponseBody } from './models'; | ||
import { RequestOptions, ObjectRequestOptions, ArrayRequestOptions, QueryParams, FilterDataTypes, FilterOperators, RequestBody, ResponseBody, ObjectResponseBody, ArrayResponseBody } from './models'; | ||
export = domo; | ||
@@ -23,8 +23,39 @@ declare class domo { | ||
/** | ||
* Let the domoapp optionally handle other events | ||
*/ | ||
static channel?: MessageChannel; | ||
static connected: boolean; | ||
static listeners: { | ||
[index: string]: Function[]; | ||
}; | ||
static connect: () => void; | ||
/** | ||
* Let the domoapp handle its own filter updates | ||
*/ | ||
static onFiltersUpdate: (callback: Function) => () => void; | ||
/** | ||
* Request a navigation change | ||
*/ | ||
static navigate(url: string, isNewWindow: boolean): void; | ||
static filterContainer(column: string, operator: FilterOperators, values: string[], dataType: 'STRING'): void; | ||
static filterContainer(column: string, operator: FilterOperators, values: number[], dataType: 'NUMERIC'): void; | ||
static filterContainer(column: string, operator: FilterOperators, values: Date[], dataType: 'DATE' | 'DATETIME'): void; | ||
static filterContainer(filters: ({ | ||
column: string; | ||
operator: FilterOperators; | ||
values: (string | number | Date)[]; | ||
dataType: FilterDataTypes; | ||
} | { | ||
column: string; | ||
operator: FilterOperators; | ||
values: Date[]; | ||
dataType: 'DATE' | 'DATETIME'; | ||
} | { | ||
column: string; | ||
operator: FilterOperators; | ||
values: number[]; | ||
dataType: 'NUMERIC'; | ||
} | { | ||
column: string; | ||
operator: FilterOperators; | ||
values: string[]; | ||
dataType: 'STRING'; | ||
})[]): void; | ||
static env: QueryParams; | ||
@@ -31,0 +62,0 @@ static __util: { |
/*! | ||
* domo.js v3.0.6 | ||
* domo.js v4.0.0 | ||
* Optional utility library for Custom Apps | ||
*/ | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.domo=t():e.domo=t()}(window,(function(){return function(e){var t={};function o(r){if(t[r])return t[r].exports;var n=t[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(r,n,function(t){return e[t]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=1)}([function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=o(2);t.RequestMethods=r.RequestMethods;var n=o(3);t.DataFormats=n.DataFormats},function(e,t,o){"use strict";var r=o(0),n=o(4),a=function(){function e(){}return e.post=function(e,t,o){return s(r.RequestMethods.POST,e,o,!0,t)},e.put=function(e,t,o){return s(r.RequestMethods.PUT,e,o,!0,t)},e.get=function(e,t){return s(r.RequestMethods.GET,e,t)},e.delete=function(e,t){return s(r.RequestMethods.DELETE,e,t)},e.getAll=function(t,o){return Promise.all(t.map((function(t){return e.get(t,o)})))},e.onDataUpdate=function(e){window.addEventListener("message",(function(t){if(u(t.origin)&&"string"==typeof t.data&&t.data.length>0)try{var o=JSON.parse(t.data);if(!o.hasOwnProperty("alias"))return;var r=o.alias,n=JSON.stringify({event:"ack",alias:r});t.source instanceof Window&&t.source.postMessage(n,t.origin),e(r)}catch(e){console.warn("There was an error in onDataUpdate! It may be that our event listener caught a message from another source and tried to parse it, so your update still may have worked. If you would like more info, here is the error: \n",e)}}))},e.navigate=function(e,t){var o=JSON.stringify({event:"navigate",url:e,isNewWindow:t});window.parent.postMessage(o,"*")},e.filterContainer=function(e,t,o,r){var n=window.navigator.userAgent.toLowerCase(),a=/safari/.test(n),s=/iphone|ipod|ipad/.test(n),i=JSON.stringify({event:"filter",filter:{columnName:e,operator:t,values:o,dataType:r}});s&&!a?window.webkit.messageHandlers.domofilter.postMessage({column:e,operand:t,values:o,dataType:r}):window.parent.postMessage(i,"*")},e.env=c(),e.__util={isVerifiedOrigin:u,getQueryParams:c,setFormatHeaders:f,isSuccess:i},e}();function s(e,t,o,n,a){return o=o||{},new Promise((function(s,u){var c=new XMLHttpRequest;if(n?c.open(e,t,n):c.open(e,t),f(c,t,o),function(e,t){t.contentType?"multipart"!==t.contentType&&e.setRequestHeader("Content-Type",t.contentType):e.setRequestHeader("Content-Type",r.DataFormats.JSON)}(c,o),function(e,t){void 0!==t.responseType&&(e.responseType=t.responseType)}(c,o),c.onload=function(){var e;if(i(c.status)){!["csv","excel"].includes(o.format)&&c.response||s(c.response),"blob"===o.responseType&&s(new Blob([c.response],{type:c.getResponseHeader("content-type")}));var t=c.response;try{e=JSON.parse(t)}catch(e){return void u(Error("Invalid JSON response"))}s(e)}else u(Error(c.statusText))},c.onerror=function(){u(Error("Network Error"))},a)if(o.contentType&&o.contentType!==r.DataFormats.JSON)c.send(a);else{var p=JSON.stringify(a);c.send(p)}else c.send()}))}function i(e){return e>=200&&e<300}function u(e){var t=e.match("^https?://([^/]+[.])?(domo|domotech|domorig).(com|io)?(/.*)?$"),o=e.match("(.*).(domoapps).(.*)");return!!t&&!o}function c(){var e=location.search.substr(1),t={};return e.split("&").forEach((function(e){var o=e.split("=");t[o[0]]=decodeURIComponent(o[1])})),t}function f(e,t,o){if(-1!==t.indexOf("data/v1")){var a=void 0!==o.format?n.domoFormatToRequestFormat(o.format):r.DataFormats.DEFAULT;e.setRequestHeader("Accept",a)}}e.exports=a},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.get="GET",e.GET="GET",e.post="POST",e.POST="POST",e.put="PUT",e.PUT="PUT",e.delete="DELETE",e.DELETE="DELETE"}(t.RequestMethods||(t.RequestMethods={}))},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.DEFAULT="application/array-of-objects",e.ARRAY_OF_OBJECTS="application/array-of-objects",e.JSON="application/json",e.CSV="text/csv",e.EXCEL="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",e.PLAIN="text/plain"}(t.DataFormats||(t.DataFormats={}))},function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=o(0);t.domoFormatToRequestFormat=function(e){switch(e){case"array-of-objects":return r.DataFormats.ARRAY_OF_OBJECTS;case"array-of-arrays":return r.DataFormats.JSON;case"excel":return r.DataFormats.EXCEL;case"csv":return r.DataFormats.CSV;default:return r.DataFormats.DEFAULT}}}])})); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kb21vL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9kb21vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2RvbW8vLi9zcmMvbW9kZWxzL2luZGV4LnRzIiwid2VicGFjazovL2RvbW8vLi9zcmMvZG9tby50cyIsIndlYnBhY2s6Ly9kb21vLy4vc3JjL21vZGVscy9lbnVtcy9yZXF1ZXN0LW1ldGhvZHMudHMiLCJ3ZWJwYWNrOi8vZG9tby8uL3NyYy9tb2RlbHMvZW51bXMvZGF0YS1mb3JtYXRzLnRzIiwid2VicGFjazovL2RvbW8vLi9zcmMvdXRpbHMvZGF0YS1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsIndpbmRvdyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJSZXF1ZXN0TWV0aG9kcyIsIkRhdGFGb3JtYXRzIiwicG9zdCIsInVybCIsImJvZHkiLCJvcHRpb25zIiwiZG9tb0h0dHAiLCJQT1NUIiwicHV0IiwiUFVUIiwiR0VUIiwiZGVsZXRlIiwiREVMRVRFIiwiZ2V0QWxsIiwidXJscyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJkb21vIiwib25EYXRhVXBkYXRlIiwiY2IiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJpc1ZlcmlmaWVkT3JpZ2luIiwib3JpZ2luIiwiZGF0YSIsImxlbmd0aCIsIm1lc3NhZ2UiLCJKU09OIiwicGFyc2UiLCJhbGlhcyIsImFjayIsInN0cmluZ2lmeSIsInNvdXJjZSIsIldpbmRvdyIsInBvc3RNZXNzYWdlIiwiZXJyIiwiY29uc29sZSIsIndhcm4iLCJuYXZpZ2F0ZSIsImlzTmV3V2luZG93IiwicGFyZW50IiwiZmlsdGVyQ29udGFpbmVyIiwiY29sdW1uIiwib3BlcmF0b3IiLCJ2YWx1ZXMiLCJkYXRhVHlwZSIsInVzZXJBZ2VudCIsIm5hdmlnYXRvciIsInRvTG93ZXJDYXNlIiwic2FmYXJpIiwidGVzdCIsImlvcyIsImZpbHRlciIsImNvbHVtbk5hbWUiLCJ3ZWJraXQiLCJtZXNzYWdlSGFuZGxlcnMiLCJkb21vZmlsdGVyIiwib3BlcmFuZCIsImVudiIsImdldFF1ZXJ5UGFyYW1zIiwiX191dGlsIiwic2V0Rm9ybWF0SGVhZGVycyIsImlzU3VjY2VzcyIsIm1ldGhvZCIsImFzeW5jIiwicmVzb2x2ZSIsInJlamVjdCIsInJlcSIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsImNvbnRlbnRUeXBlIiwic2V0UmVxdWVzdEhlYWRlciIsInNldENvbnRlbnRIZWFkZXJzIiwidW5kZWZpbmVkIiwicmVzcG9uc2VUeXBlIiwic2V0UmVzcG9uc2VUeXBlIiwib25sb2FkIiwic3RhdHVzIiwiaW5jbHVkZXMiLCJmb3JtYXQiLCJyZXNwb25zZSIsIkJsb2IiLCJ0eXBlIiwiZ2V0UmVzcG9uc2VIZWFkZXIiLCJyZXNwb25zZVN0ciIsImV4IiwiRXJyb3IiLCJzdGF0dXNUZXh0Iiwib25lcnJvciIsInNlbmQiLCJqc29uIiwid2hpdGVsaXN0ZWQiLCJtYXRjaCIsImJsYWNrbGlzdGVkIiwicXVlcnkiLCJsb2NhdGlvbiIsInNlYXJjaCIsInN1YnN0ciIsInJlc3VsdCIsInNwbGl0IiwiZm9yRWFjaCIsInBhcnQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaW5kZXhPZiIsInJlcXVlc3RGb3JtYXQiLCJkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0IiwiQVJSQVlfT0ZfT0JKRUNUUyIsIkVYQ0VMIiwiQ1NWIiwiREVGQVVMVCJdLCJtYXBwaW5ncyI6Ijs7OztDQUFBLFNBQTJDQSxFQUFNQyxHQUMxQixpQkFBWkMsU0FBMEMsaUJBQVhDLE9BQ3hDQSxPQUFPRCxRQUFVRCxJQUNRLG1CQUFYRyxRQUF5QkEsT0FBT0MsSUFDOUNELE9BQU8sR0FBSUgsR0FDZSxpQkFBWkMsUUFDZEEsUUFBYyxLQUFJRCxJQUVsQkQsRUFBVyxLQUFJQyxJQVJqQixDQVNHSyxRQUFRLFdBQ1gsTyxZQ1RFLElBQUlDLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVQLFFBR25DLElBQUlDLEVBQVNJLEVBQWlCRSxHQUFZLENBQ3pDQyxFQUFHRCxFQUNIRSxHQUFHLEVBQ0hULFFBQVMsSUFVVixPQU5BVSxFQUFRSCxHQUFVSSxLQUFLVixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTTSxHQUcvREwsRUFBT1EsR0FBSSxFQUdKUixFQUFPRCxRQTBEZixPQXJEQU0sRUFBb0JNLEVBQUlGLEVBR3hCSixFQUFvQk8sRUFBSVIsRUFHeEJDLEVBQW9CUSxFQUFJLFNBQVNkLEVBQVNlLEVBQU1DLEdBQzNDVixFQUFvQlcsRUFBRWpCLEVBQVNlLElBQ2xDRyxPQUFPQyxlQUFlbkIsRUFBU2UsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFVixFQUFvQmdCLEVBQUksU0FBU3RCLEdBQ1gsb0JBQVh1QixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWVuQixFQUFTdUIsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlbkIsRUFBUyxhQUFjLENBQUV5QixPQUFPLEtBUXZEbkIsRUFBb0JvQixFQUFJLFNBQVNELEVBQU9FLEdBRXZDLEdBRFUsRUFBUEEsSUFBVUYsRUFBUW5CLEVBQW9CbUIsSUFD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U0FBWWxCLEdBQ1YsWUFDQSxZQUNBLGNBQ0EsY0FDQSxZQUNBLFlBQ0Esa0JBQ0Esa0JBUkYsQ0FBWSxFQUFBQSxpQkFBQSxFQUFBQSxlQUFjLE0sOEVDTzFCLFNBQVlDLEdBQ1YseUNBQ0Esa0RBQ0EsMEJBQ0EsaUJBQ0EsNEVBQ0EscUJBTkYsQ0FBWSxFQUFBQSxjQUFBLEVBQUFBLFlBQVcsTSw4RUNQdkIsV0FFQSxxQ0FBMEMrRSxHQUN4QyxPQUFRQSxHQUNOLElBQUssbUJBQ0gsT0FBTyxFQUFBL0UsWUFBWTJHLGlCQUVyQixJQUFLLGtCQUNILE9BQU8sRUFBQTNHLFlBQVkyQixLQUVyQixJQUFLLFFBQ0gsT0FBTyxFQUFBM0IsWUFBWTRHLE1BRXJCLElBQUssTUFDSCxPQUFPLEVBQUE1RyxZQUFZNkcsSUFFckIsUUFDRSxPQUFPLEVBQUE3RyxZQUFZOEciLCJmaWxlIjoiZG9tby5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImRvbW9cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZG9tb1wiXSA9IGZhY3RvcnkoKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEpO1xuIiwiZXhwb3J0IHsgUmVxdWVzdE1ldGhvZHMgfSBmcm9tICcuL2VudW1zL3JlcXVlc3QtbWV0aG9kcyc7XG5leHBvcnQgeyBEb21vRGF0YUZvcm1hdHMgfSBmcm9tICcuL2ludGVyZmFjZXMvZG9tby1kYXRhLWZvcm1hdHMnO1xuZXhwb3J0IHsgRGF0YUZvcm1hdHMgfSBmcm9tICcuL2VudW1zL2RhdGEtZm9ybWF0cyc7XG5leHBvcnQgeyBGaWx0ZXJEYXRhVHlwZXMgfSBmcm9tICcuL2ludGVyZmFjZXMvZmlsdGVyLWRhdGEtdHlwZXMnO1xuZXhwb3J0IHsgRmlsdGVyT3BlcmF0b3JzIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ZpbHRlci1vcGVyYXRvcnMnO1xuXG5leHBvcnQgeyBSZXF1ZXN0T3B0aW9ucywgT2JqZWN0UmVxdWVzdE9wdGlvbnMsIEFycmF5UmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVxdWVzdC1vcHRpb25zJztcbmV4cG9ydCB7IFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3F1ZXJ5LXBhcmFtcyc7XG5leHBvcnQgeyBSZXF1ZXN0Qm9keSwgWE1MSHR0cFJlcXVlc3RCb2R5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcXVlc3QtYm9keSc7XG5leHBvcnQgeyBSZXNwb25zZUJvZHksIE9iamVjdFJlc3BvbnNlQm9keSwgQXJyYXlSZXNwb25zZUJvZHkgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVzcG9uc2UtYm9keSc7XG5leHBvcnQgeyBKc29uIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2pzb24nO1xuIiwiaW1wb3J0IHtcbiAgUmVxdWVzdE1ldGhvZHMsXG4gIFJlcXVlc3RPcHRpb25zLFxuICBPYmplY3RSZXF1ZXN0T3B0aW9ucyxcbiAgQXJyYXlSZXF1ZXN0T3B0aW9ucyxcbiAgRGF0YUZvcm1hdHMsXG4gIFF1ZXJ5UGFyYW1zLFxuICBGaWx0ZXJEYXRhVHlwZXMsXG4gIEZpbHRlck9wZXJhdG9ycyxcbiAgUmVxdWVzdEJvZHksXG4gIFhNTEh0dHBSZXF1ZXN0Qm9keSxcbiAgUmVzcG9uc2VCb2R5LFxuICBPYmplY3RSZXNwb25zZUJvZHksXG4gIEFycmF5UmVzcG9uc2VCb2R5LFxufSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0IH0gZnJvbSAnLi91dGlscy9kYXRhLWhlbHBlcnMnO1xuXG5leHBvcnQgPSBkb21vO1xuXG5jbGFzcyBkb21vIHtcbiAgc3RhdGljIHBvc3QodXJsOiBzdHJpbmcsIGJvZHk/OiBSZXF1ZXN0Qm9keSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxSZXNwb25zZUJvZHk+O1xuICBzdGF0aWMgcG9zdDxUPih1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+O1xuICBzdGF0aWMgcG9zdDxUPih1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gZG9tb0h0dHA8VD4oUmVxdWVzdE1ldGhvZHMuUE9TVCwgdXJsLCBvcHRpb25zLCB0cnVlLCBib2R5KTtcbiAgfVxuICBcbiAgc3RhdGljIHB1dCh1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBwdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZXF1ZXN0Qm9keSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUPjtcbiAgc3RhdGljIHB1dDxUPih1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gZG9tb0h0dHA8VD4oUmVxdWVzdE1ldGhvZHMuUFVULCB1cmwsIG9wdGlvbnMsIHRydWUsIGJvZHkpO1xuICB9XG4gIFxuICBzdGF0aWMgZ2V0KHVybDogc3RyaW5nLCBvcHRpb25zOiBPYmplY3RSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8T2JqZWN0UmVzcG9uc2VCb2R5W10+O1xuICBzdGF0aWMgZ2V0KHVybDogc3RyaW5nLCBvcHRpb25zOiBBcnJheVJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxBcnJheVJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBnZXQodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8UmVzcG9uc2VCb2R5PjtcbiAgc3RhdGljIGdldDxUPih1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUPjtcbiAgc3RhdGljIGdldDxUPih1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGRvbW9IdHRwPFQ+KFJlcXVlc3RNZXRob2RzLkdFVCwgdXJsLCBvcHRpb25zKTtcbiAgfVxuICBcbiAgc3RhdGljIGRlbGV0ZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxSZXNwb25zZUJvZHk+O1xuICBzdGF0aWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+O1xuICBzdGF0aWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gZG9tb0h0dHA8VD4oUmVxdWVzdE1ldGhvZHMuREVMRVRFLCB1cmwsIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIGdldEFsbCh1cmxzOiBzdHJpbmdbXSwgb3B0aW9uczogT2JqZWN0UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPE9iamVjdFJlc3BvbnNlQm9keVtdW10+O1xuICBzdGF0aWMgZ2V0QWxsKHVybHM6IHN0cmluZ1tdLCBvcHRpb25zOiBBcnJheVJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxBcnJheVJlc3BvbnNlQm9keVtdPjtcbiAgc3RhdGljIGdldEFsbCh1cmxzOiBzdHJpbmdbXSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxSZXNwb25zZUJvZHlbXT47XG4gIHN0YXRpYyBnZXRBbGw8VD4odXJsczogc3RyaW5nW10sIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VFtdPjtcbiAgc3RhdGljIGdldEFsbDxUPih1cmxzOiBzdHJpbmdbXSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUW10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodXJscy5tYXAoZnVuY3Rpb24odXJsKXtcbiAgICAgIHJldHVybiBkb21vLmdldDxUPih1cmwsIG9wdGlvbnMpO1xuICAgIH0pKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBMZXQgdGhlIGRvbW9hcHAgb3B0aW9uYWxseSBoYW5kbGUgaXRzIG93biBkYXRhIHVwZGF0ZXMuXG4gICAqL1xuICBzdGF0aWMgb25EYXRhVXBkYXRlKGNiOiAoYWxpYXM6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgICAgaWYgKCFpc1ZlcmlmaWVkT3JpZ2luKGV2ZW50Lm9yaWdpbikpXG4gICAgICAgIHJldHVybjtcbiAgXG4gICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnICYmIGV2ZW50LmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgIGlmICghbWVzc2FnZS5oYXNPd25Qcm9wZXJ0eSgnYWxpYXMnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgXG4gICAgICAgICAgY29uc3QgYWxpYXMgPSBtZXNzYWdlLmFsaWFzO1xuICBcbiAgICAgICAgICAvLyBzZW5kIGFja25vd2xlZGdlbWVudCB0byBwcmV2ZW50IGF1dG9yZWZyZXNoXG4gICAgICAgICAgY29uc3QgYWNrID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6ICdhY2snLFxuICAgICAgICAgICAgYWxpYXM6IGFsaWFzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmKGV2ZW50LnNvdXJjZSBpbnN0YW5jZW9mIFdpbmRvdykge1xuICAgICAgICAgICAgZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKGFjaywgZXZlbnQub3JpZ2luKTtcbiAgICAgICAgICB9XG4gIFxuICAgICAgICAgIC8vIGluZm9ybSBkb21vIGFwcCB3aGljaCBhbGlhcyBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgICAgY2IoYWxpYXMpO1xuICAgICAgICB9IGNhdGNoKGVycikge1xuICAgICAgICAgIGNvbnN0IGluZm8gPSAnVGhlcmUgd2FzIGFuIGVycm9yIGluIG9uRGF0YVVwZGF0ZSEgSXQgbWF5IGJlIHRoYXQgb3VyIGV2ZW50IGxpc3RlbmVyIGNhdWdodCAnICtcbiAgICAgICAgICAgICAgICAgICAgICdhIG1lc3NhZ2UgZnJvbSBhbm90aGVyIHNvdXJjZSBhbmQgdHJpZWQgdG8gcGFyc2UgaXQsIHNvIHlvdXIgdXBkYXRlIHN0aWxsIG1heSBoYXZlIHdvcmtlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAnSWYgeW91IHdvdWxkIGxpa2UgbW9yZSBpbmZvLCBoZXJlIGlzIHRoZSBlcnJvcjogXFxuJ1xuICAgICAgICAgIGNvbnNvbGUud2FybihpbmZvLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVxdWVzdCBhIG5hdmlnYXRpb24gY2hhbmdlXG4gICAqL1xuICBzdGF0aWMgbmF2aWdhdGUodXJsOiBzdHJpbmcsIGlzTmV3V2luZG93OiBib29sZWFuKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50OiAnbmF2aWdhdGUnLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBpc05ld1dpbmRvdzogaXNOZXdXaW5kb3dcbiAgICB9KTtcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIFwiKlwiKTtcbiAgfVxuICBcbiAgc3RhdGljIGZpbHRlckNvbnRhaW5lcihjb2x1bW46IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9ycywgdmFsdWVzOiBzdHJpbmdbXSwgZGF0YVR5cGU6ICdTVFJJTkcnKTogdm9pZDtcbiAgc3RhdGljIGZpbHRlckNvbnRhaW5lcihjb2x1bW46IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9ycywgdmFsdWVzOiBudW1iZXJbXSwgZGF0YVR5cGU6ICdOVU1FUklDJyk6IHZvaWQ7XG4gIHN0YXRpYyBmaWx0ZXJDb250YWluZXIoY29sdW1uOiBzdHJpbmcsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcnMsIHZhbHVlczogRGF0ZVtdLCBkYXRhVHlwZTogJ0RBVEUnIHwgJ0RBVEVUSU1FJyk6IHZvaWQ7XG4gIHN0YXRpYyBmaWx0ZXJDb250YWluZXIoY29sdW1uOiBzdHJpbmcsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcnMsIHZhbHVlczogKHN0cmluZyB8IG51bWJlciB8IERhdGUpW10sIGRhdGFUeXBlOiBGaWx0ZXJEYXRhVHlwZXMpOiB2b2lkIHtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLFxuICAgICAgc2FmYXJpID0gL3NhZmFyaS8udGVzdCggdXNlckFnZW50ICksXG4gICAgICBpb3MgPSAvaXBob25lfGlwb2R8aXBhZC8udGVzdCggdXNlckFnZW50ICk7XG4gIFxuICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudDogJ2ZpbHRlcicsXG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLFxuICAgICAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICBkYXRhVHlwZTogZGF0YVR5cGVcbiAgICAgIH1cbiAgICB9KTtcbiAgXG4gICAgaWYoaW9zICYmICFzYWZhcmkpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzLmRvbW9maWx0ZXIucG9zdE1lc3NhZ2UoeyBjb2x1bW46IGNvbHVtbiwgb3BlcmFuZDogb3BlcmF0b3IsIHZhbHVlczogdmFsdWVzLCBkYXRhVHlwZTogZGF0YVR5cGUgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShtZXNzYWdlLCBcIipcIik7XG4gICAgfVxuICB9XG4gIFxuICBzdGF0aWMgZW52ID0gZ2V0UXVlcnlQYXJhbXMoKTtcbiAgXG4gIHN0YXRpYyBfX3V0aWwgPSB7XG4gICAgaXNWZXJpZmllZE9yaWdpbixcbiAgICBnZXRRdWVyeVBhcmFtcyxcbiAgICBzZXRGb3JtYXRIZWFkZXJzLCBcbiAgICBpc1N1Y2Nlc3NcbiAgfVxuXG59O1xuXG5mdW5jdGlvbiBkb21vSHR0cChtZXRob2Q6IFJlcXVlc3RNZXRob2RzLCB1cmw6IHN0cmluZywgb3B0aW9uczogT2JqZWN0UmVxdWVzdE9wdGlvbnMsIGFzeW5jPzogYm9vbGVhbiwgYm9keT86IFJlcXVlc3RCb2R5KTogUHJvbWlzZTxPYmplY3RSZXNwb25zZUJvZHlbXT47XG5mdW5jdGlvbiBkb21vSHR0cChtZXRob2Q6IFJlcXVlc3RNZXRob2RzLCB1cmw6IHN0cmluZywgb3B0aW9uczogQXJyYXlSZXF1ZXN0T3B0aW9ucywgYXN5bmM/OiBib29sZWFuLCBib2R5PzogUmVxdWVzdEJvZHkpOiBQcm9taXNlPEFycmF5UmVzcG9uc2VCb2R5PjtcbmZ1bmN0aW9uIGRvbW9IdHRwKG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucywgYXN5bmM/OiBib29sZWFuLCBib2R5PzogUmVxdWVzdEJvZHkpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG5mdW5jdGlvbiBkb21vSHR0cDxUPihtZXRob2Q6IFJlcXVlc3RNZXRob2RzLCB1cmw6IHN0cmluZywgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMsIGFzeW5jPzogYm9vbGVhbiwgYm9keT86IFJlcXVlc3RCb2R5KTogUHJvbWlzZTxUPjtcbmZ1bmN0aW9uIGRvbW9IdHRwKG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucywgYXN5bmM/OiBib29sZWFuLCBib2R5PzogUmVxdWVzdEJvZHkpOiBQcm9taXNlPFJlc3BvbnNlQm9keT4ge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZT86IFJlc3BvbnNlQm9keSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogRXJyb3IpID0+IHZvaWQpIHtcbiAgICAvLyBEbyB0aGUgdXN1YWwgWEhSIHN0dWZmXG4gICAgbGV0IHJlcTogWE1MSHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBpZihhc3luYykge1xuICAgICAgcmVxLm9wZW4obWV0aG9kLCB1cmwsIGFzeW5jKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXEub3BlbihtZXRob2QsIHVybCk7XG4gICAgfVxuICAgIHNldEZvcm1hdEhlYWRlcnMocmVxLCB1cmwsIG9wdGlvbnMpO1xuICAgIHNldENvbnRlbnRIZWFkZXJzKHJlcSwgb3B0aW9ucyk7XG4gICAgc2V0UmVzcG9uc2VUeXBlKHJlcSwgb3B0aW9ucyk7XG5cbiAgICByZXEub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBsZXQgZGF0YTtcbiAgICAgIC8vIFRoaXMgaXMgY2FsbGVkIGV2ZW4gb24gNDA0IGV0YyBzbyBjaGVjayB0aGUgc3RhdHVzXG4gICAgICBpZiAoaXNTdWNjZXNzKHJlcS5zdGF0dXMpKSB7XG4gICAgICAgIFxuICAgICAgICBpZiAoWydjc3YnLCAnZXhjZWwnXS5pbmNsdWRlcyhvcHRpb25zLmZvcm1hdCkgfHwgIXJlcS5yZXNwb25zZSl7XG4gICAgICAgICAgcmVzb2x2ZShyZXEucmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmKG9wdGlvbnMucmVzcG9uc2VUeXBlID09PSAnYmxvYicpIHtcbiAgICAgICAgICByZXNvbHZlKG5ldyBCbG9iKFtyZXEucmVzcG9uc2VdLCB7dHlwZTogcmVxLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKX0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVN0ciA9IHJlcS5yZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZighcmVzcG9uc2VTdHIpIHtcbiAgICAgICAgICAvLyAgIHJlc3BvbnNlU3RyID0gXCJ7fVwiO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KXtcbiAgICAgICAgICByZWplY3QoRXJyb3IoJ0ludmFsaWQgSlNPTiByZXNwb25zZScpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIHRoZSByZXNwb25zZSB0ZXh0XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIHJlamVjdCB3aXRoIHRoZSBzdGF0dXMgdGV4dFxuICAgICAgICAvLyB3aGljaCB3aWxsIGhvcGVmdWxseSBiZSBhIG1lYW5pbmdmdWwgZXJyb3JcbiAgICAgICAgcmVqZWN0KEVycm9yKHJlcS5zdGF0dXNUZXh0KSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBuZXR3b3JrIGVycm9yc1xuICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QoRXJyb3IoXCJOZXR3b3JrIEVycm9yXCIpKTtcbiAgICB9O1xuXG4gICAgLy8gTWFrZSB0aGUgcmVxdWVzdFxuICAgIGlmKGJvZHkpIHtcbiAgICAgIGlmICghb3B0aW9ucy5jb250ZW50VHlwZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlID09PSBEYXRhRm9ybWF0cy5KU09OKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICAgICAgLy8gTWFrZSB0aGUgcmVxdWVzdFxuICAgICAgICByZXEuc2VuZChqc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGJvZHkgY2FuIG5vIGxvbmdlciBiZSBKU09OXG4gICAgICAgIHJlcS5zZW5kKGJvZHkgYXMgWE1MSHR0cFJlcXVlc3RCb2R5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXEuc2VuZCgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzU3VjY2VzcyhzdGF0dXM6IG51bWJlcikge1xuICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG59XG5cbmZ1bmN0aW9uIGlzVmVyaWZpZWRPcmlnaW4ob3JpZ2luOiBzdHJpbmcpIHtcbiAgY29uc3Qgd2hpdGVsaXN0ZWQgPSBvcmlnaW4ubWF0Y2goJ15odHRwcz86Ly8oW14vXStbLl0pPyhkb21vfGRvbW90ZWNofGRvbW9yaWcpXFwuKGNvbXxpbyk/KC8uKik/JCcpO1xuICBjb25zdCBibGFja2xpc3RlZCA9IG9yaWdpbi5tYXRjaCgnKC4qKVxcLihkb21vYXBwcylcXC4oLiopJyk7XG4gIHJldHVybiAhIXdoaXRlbGlzdGVkICYmICFibGFja2xpc3RlZDtcbn1cblxuZnVuY3Rpb24gZ2V0UXVlcnlQYXJhbXMoKTogUXVlcnlQYXJhbXMge1xuICBjb25zdCBxdWVyeSA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSk7XG4gIGxldCByZXN1bHQgOiB7IFtpbmRleCA6IHN0cmluZ10gOiBzdHJpbmd9ID0ge307XG4gIHF1ZXJ5LnNwbGl0KFwiJlwiKS5mb3JFYWNoKGZ1bmN0aW9uKHBhcnQpIHtcbiAgICBjb25zdCBpdGVtID0gcGFydC5zcGxpdChcIj1cIik7XG4gICAgcmVzdWx0W2l0ZW1bMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW1bMV0pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2V0Rm9ybWF0SGVhZGVycyhyZXE6IFhNTEh0dHBSZXF1ZXN0LCB1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKXtcbiAgaWYgKHVybC5pbmRleE9mKCdkYXRhL3YxJykgPT09IC0xICkgeyByZXR1cm47IH1cbiAgLy8gc2V0IGZvcm1hdFxuICBjb25zdCByZXF1ZXN0Rm9ybWF0OiBEYXRhRm9ybWF0cyA9IChvcHRpb25zLmZvcm1hdCAhPT0gdW5kZWZpbmVkKVxuICAgID8gKGRvbW9Gb3JtYXRUb1JlcXVlc3RGb3JtYXQob3B0aW9ucy5mb3JtYXQpKSBcbiAgICA6IChEYXRhRm9ybWF0cy5ERUZBVUxUKTtcblxuICByZXEuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgcmVxdWVzdEZvcm1hdCk7XG59XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRIZWFkZXJzKHJlcTogWE1MSHR0cFJlcXVlc3QsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykge1xuICBpZiAob3B0aW9ucy5jb250ZW50VHlwZSkge1xuICAgIC8vIHNldCBjb250ZW50IHR5cGUgaWYgdXNlciBwYXNzZWQgb3B0aW9uXG4gICAgaWYob3B0aW9ucy5jb250ZW50VHlwZSAhPT0gJ211bHRpcGFydCcpe1xuICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIG9wdGlvbnMuY29udGVudFR5cGUpO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgRGF0YUZvcm1hdHMuSlNPTik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0UmVzcG9uc2VUeXBlKHJlcTogWE1MSHR0cFJlcXVlc3QsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykge1xuICAvL3NldCByZXNwb25zZSB0eXBlIGlmIHVzZXIgcGFzc2VkIG9wdGlvblxuICBpZiAob3B0aW9ucy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcS5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZTtcbiAgfVxufSIsImV4cG9ydCBlbnVtIFJlcXVlc3RNZXRob2RzIHtcbiAgZ2V0ID0gJ0dFVCcsXG4gIEdFVCA9ICdHRVQnLFxuICBwb3N0ID0gJ1BPU1QnLFxuICBQT1NUID0gJ1BPU1QnLFxuICBwdXQgPSAnUFVUJyxcbiAgUFVUID0gJ1BVVCcsXG4gIGRlbGV0ZSA9ICdERUxFVEUnLFxuICBERUxFVEUgPSAnREVMRVRFJyxcbn1cbiIsIi8qKlxuICogU3VwcG9ydGVkIGBhY2NlcHRgIGhlYWRlcnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBmb3JtYXRcbiAqIG9mIHRoZSBkYXRhIHJldHVybmVkIGZyb20gRG9tby5cbiAqXG4gKiBTZWUgW2RldmVsb3Blci5kb21vLmNvbV0oaHR0cHM6Ly9kZXZlbG9wZXIuZG9tby5jb20vZG9jcy9kZXYtc3R1ZGlvLXJlZmVyZW5jZXMvZGF0YS1hcGkjRGF0YSUyMEZvcm1hdHMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgZW51bSBEYXRhRm9ybWF0cyB7XG4gIERFRkFVTFQgPSAnYXBwbGljYXRpb24vYXJyYXktb2Ytb2JqZWN0cycsXG4gIEFSUkFZX09GX09CSkVDVFMgPSAnYXBwbGljYXRpb24vYXJyYXktb2Ytb2JqZWN0cycsXG4gIEpTT04gPSAnYXBwbGljYXRpb24vanNvbicsXG4gIENTViA9ICd0ZXh0L2NzdicsXG4gIEVYQ0VMID0gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JyxcbiAgUExBSU4gPSAndGV4dC9wbGFpbidcbn0iLCJpbXBvcnQgeyBEb21vRGF0YUZvcm1hdHMsIERhdGFGb3JtYXRzIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvbW9Gb3JtYXRUb1JlcXVlc3RGb3JtYXQoZm9ybWF0OiBEb21vRGF0YUZvcm1hdHMpOiBEYXRhRm9ybWF0cyB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnYXJyYXktb2Ytb2JqZWN0cyc6IHtcbiAgICAgIHJldHVybiBEYXRhRm9ybWF0cy5BUlJBWV9PRl9PQkpFQ1RTO1xuICAgIH1cbiAgICBjYXNlICdhcnJheS1vZi1hcnJheXMnOiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuSlNPTjtcbiAgICB9XG4gICAgY2FzZSAnZXhjZWwnOiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuRVhDRUw7XG4gICAgfVxuICAgIGNhc2UgJ2Nzdic6IHtcbiAgICAgIHJldHVybiBEYXRhRm9ybWF0cy5DU1Y7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBEYXRhRm9ybWF0cy5ERUZBVUxUO1xuICAgIH1cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.domo=t():e.domo=t()}(window,(function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(2);t.RequestMethods=o.RequestMethods;var r=n(3);t.DataFormats=r.DataFormats},function(e,t,n){"use strict";var o=n(0),r=n(4),a=function(){function e(){}return e.post=function(e,t,n){return s(o.RequestMethods.POST,e,n,!0,t)},e.put=function(e,t,n){return s(o.RequestMethods.PUT,e,n,!0,t)},e.get=function(e,t){return s(o.RequestMethods.GET,e,t)},e.delete=function(e,t){return s(o.RequestMethods.DELETE,e,t)},e.getAll=function(t,n){return Promise.all(t.map((function(t){return e.get(t,n)})))},e.onDataUpdate=function(e){window.addEventListener("message",(function(t){if(u(t.origin)&&"string"==typeof t.data&&t.data.length>0)try{var n=JSON.parse(t.data);if(!n.hasOwnProperty("alias"))return;var o=n.alias,r=JSON.stringify({event:"ack",alias:o});t.source instanceof Window&&t.source.postMessage(r,t.origin),e(o)}catch(e){console.warn("There was an error in onDataUpdate! It may be that our event listener caught a message from another source and tried to parse it, so your update still may have worked. If you would like more info, here is the error: \n",e)}}))},e.navigate=function(e,t){var n=JSON.stringify({event:"navigate",url:e,isNewWindow:t});window.parent.postMessage(n,"*")},e.filterContainer=function(e){var t=window.navigator.userAgent.toLowerCase(),n=/safari/.test(t),o=/iphone|ipod|ipad/.test(t),r=JSON.stringify({event:"filter",filter:e.map((function(e){return{columnName:e.column,operator:e.operator,values:e.values,dataType:e.dataType}}))});o&&!n?window.webkit.messageHandlers.domofilter.postMessage(e.map((function(e){return{column:e.column,operand:e.operator,values:e.values,dataType:e.dataType}}))):window.parent.postMessage(r,"*")},e.connected=!1,e.listeners={onFiltersUpdate:[]},e.connect=function(){e.connected||(e.connected=!0,e.channel=new MessageChannel,window.parent.postMessage(JSON.stringify({event:"subscribe"}),"*",[e.channel.port2]))},e.onFiltersUpdate=function(t){e.connect();var n=e.listeners.onFiltersUpdate.push(t)-1;return e.channel.port1.onmessage=function(t){var n=t.ports[0];void 0!==n&&"filtersUpdated"===t.data.event&&e.listeners.onFiltersUpdate.length>0&&(n.postMessage({}),e.listeners.onFiltersUpdate.forEach((function(e){return e(t.data.filters)})))},function(){e.listeners.onFiltersUpdate.splice(n,1)}},e.env=c(),e.__util={isVerifiedOrigin:u,getQueryParams:c,setFormatHeaders:p,isSuccess:i},e}();function s(e,t,n,r,a){return n=n||{},new Promise((function(s,u){var c=new XMLHttpRequest;if(r?c.open(e,t,r):c.open(e,t),p(c,t,n),function(e,t){t.contentType?"multipart"!==t.contentType&&e.setRequestHeader("Content-Type",t.contentType):e.setRequestHeader("Content-Type",o.DataFormats.JSON)}(c,n),function(e,t){void 0!==t.responseType&&(e.responseType=t.responseType)}(c,n),c.onload=function(){var e;if(i(c.status)){!["csv","excel"].includes(n.format)&&c.response||s(c.response),"blob"===n.responseType&&s(new Blob([c.response],{type:c.getResponseHeader("content-type")}));var t=c.response;try{e=JSON.parse(t)}catch(e){return void u(Error("Invalid JSON response"))}s(e)}else u(Error(c.statusText))},c.onerror=function(){u(Error("Network Error"))},a)if(n.contentType&&n.contentType!==o.DataFormats.JSON)c.send(a);else{var d=JSON.stringify(a);c.send(d)}else c.send()}))}function i(e){return e>=200&&e<300}function u(e){var t=e.match("^https?://([^/]+[.])?(domo|domotech|domorig).(com|io)?(/.*)?$"),n=e.match("(.*).(domoapps).(.*)");return!!t&&!n}function c(){var e=location.search.substr(1),t={};return e.split("&").forEach((function(e){var n=e.split("=");t[n[0]]=decodeURIComponent(n[1])})),t}function p(e,t,n){if(-1!==t.indexOf("data/v1")){var a=void 0!==n.format?r.domoFormatToRequestFormat(n.format):o.DataFormats.DEFAULT;e.setRequestHeader("Accept",a)}}e.exports=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.get="GET",e.GET="GET",e.post="POST",e.POST="POST",e.put="PUT",e.PUT="PUT",e.delete="DELETE",e.DELETE="DELETE"}(t.RequestMethods||(t.RequestMethods={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.DEFAULT="application/array-of-objects",e.ARRAY_OF_OBJECTS="application/array-of-objects",e.JSON="application/json",e.CSV="text/csv",e.EXCEL="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",e.PLAIN="text/plain"}(t.DataFormats||(t.DataFormats={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(0);t.domoFormatToRequestFormat=function(e){switch(e){case"array-of-objects":return o.DataFormats.ARRAY_OF_OBJECTS;case"array-of-arrays":return o.DataFormats.JSON;case"excel":return o.DataFormats.EXCEL;case"csv":return o.DataFormats.CSV;default:return o.DataFormats.DEFAULT}}}])})); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kb21vL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9kb21vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2RvbW8vLi9zcmMvbW9kZWxzL2luZGV4LnRzIiwid2VicGFjazovL2RvbW8vLi9zcmMvZG9tby50cyIsIndlYnBhY2s6Ly9kb21vLy4vc3JjL21vZGVscy9lbnVtcy9yZXF1ZXN0LW1ldGhvZHMudHMiLCJ3ZWJwYWNrOi8vZG9tby8uL3NyYy9tb2RlbHMvZW51bXMvZGF0YS1mb3JtYXRzLnRzIiwid2VicGFjazovL2RvbW8vLi9zcmMvdXRpbHMvZGF0YS1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsIndpbmRvdyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJSZXF1ZXN0TWV0aG9kcyIsIkRhdGFGb3JtYXRzIiwicG9zdCIsInVybCIsImJvZHkiLCJvcHRpb25zIiwiZG9tb0h0dHAiLCJQT1NUIiwicHV0IiwiUFVUIiwiR0VUIiwiZGVsZXRlIiwiREVMRVRFIiwiZ2V0QWxsIiwidXJscyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJkb21vIiwib25EYXRhVXBkYXRlIiwiY2IiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJpc1ZlcmlmaWVkT3JpZ2luIiwib3JpZ2luIiwiZGF0YSIsImxlbmd0aCIsIm1lc3NhZ2UiLCJKU09OIiwicGFyc2UiLCJhbGlhcyIsImFjayIsInN0cmluZ2lmeSIsInNvdXJjZSIsIldpbmRvdyIsInBvc3RNZXNzYWdlIiwiZXJyIiwiY29uc29sZSIsIndhcm4iLCJuYXZpZ2F0ZSIsImlzTmV3V2luZG93IiwicGFyZW50IiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsInVzZXJBZ2VudCIsIm5hdmlnYXRvciIsInRvTG93ZXJDYXNlIiwic2FmYXJpIiwidGVzdCIsImlvcyIsImZpbHRlciIsImNvbHVtbk5hbWUiLCJjb2x1bW4iLCJvcGVyYXRvciIsInZhbHVlcyIsImRhdGFUeXBlIiwid2Via2l0IiwibWVzc2FnZUhhbmRsZXJzIiwiZG9tb2ZpbHRlciIsIm9wZXJhbmQiLCJjb25uZWN0ZWQiLCJsaXN0ZW5lcnMiLCJvbkZpbHRlcnNVcGRhdGUiLCJjb25uZWN0IiwiY2hhbm5lbCIsIk1lc3NhZ2VDaGFubmVsIiwicG9ydDIiLCJjYWxsYmFjayIsImluZGV4IiwicHVzaCIsInBvcnQxIiwib25tZXNzYWdlIiwiZSIsInJlc3BvbnNlUG9ydCIsInVuZGVmaW5lZCIsImZvckVhY2giLCJzcGxpY2UiLCJlbnYiLCJnZXRRdWVyeVBhcmFtcyIsIl9fdXRpbCIsInNldEZvcm1hdEhlYWRlcnMiLCJpc1N1Y2Nlc3MiLCJtZXRob2QiLCJhc3luYyIsInJlc29sdmUiLCJyZWplY3QiLCJyZXEiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJjb250ZW50VHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJzZXRDb250ZW50SGVhZGVycyIsInJlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIm9ubG9hZCIsInN0YXR1cyIsImluY2x1ZGVzIiwiZm9ybWF0IiwicmVzcG9uc2UiLCJCbG9iIiwidHlwZSIsImdldFJlc3BvbnNlSGVhZGVyIiwicmVzcG9uc2VTdHIiLCJleCIsIkVycm9yIiwic3RhdHVzVGV4dCIsIm9uZXJyb3IiLCJzZW5kIiwianNvbiIsIndoaXRlbGlzdGVkIiwibWF0Y2giLCJibGFja2xpc3RlZCIsInF1ZXJ5IiwibG9jYXRpb24iLCJzZWFyY2giLCJzdWJzdHIiLCJyZXN1bHQiLCJzcGxpdCIsInBhcnQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaW5kZXhPZiIsInJlcXVlc3RGb3JtYXQiLCJkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0IiwiQVJSQVlfT0ZfT0JKRUNUUyIsIkVYQ0VMIiwiQ1NWIiwiREVGQVVMVCJdLCJtYXBwaW5ncyI6Ijs7OztDQUFBLFNBQTJDQSxFQUFNQyxHQUMxQixpQkFBWkMsU0FBMEMsaUJBQVhDLE9BQ3hDQSxPQUFPRCxRQUFVRCxJQUNRLG1CQUFYRyxRQUF5QkEsT0FBT0MsSUFDOUNELE9BQU8sR0FBSUgsR0FDZSxpQkFBWkMsUUFDZEEsUUFBYyxLQUFJRCxJQUVsQkQsRUFBVyxLQUFJQyxJQVJqQixDQVNHSyxRQUFRLFdBQ1gsTyxZQ1RFLElBQUlDLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVQLFFBR25DLElBQUlDLEVBQVNJLEVBQWlCRSxHQUFZLENBQ3pDQyxFQUFHRCxFQUNIRSxHQUFHLEVBQ0hULFFBQVMsSUFVVixPQU5BVSxFQUFRSCxHQUFVSSxLQUFLVixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTTSxHQUcvREwsRUFBT1EsR0FBSSxFQUdKUixFQUFPRCxRQTBEZixPQXJEQU0sRUFBb0JNLEVBQUlGLEVBR3hCSixFQUFvQk8sRUFBSVIsRUFHeEJDLEVBQW9CUSxFQUFJLFNBQVNkLEVBQVNlLEVBQU1DLEdBQzNDVixFQUFvQlcsRUFBRWpCLEVBQVNlLElBQ2xDRyxPQUFPQyxlQUFlbkIsRUFBU2UsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFVixFQUFvQmdCLEVBQUksU0FBU3RCLEdBQ1gsb0JBQVh1QixRQUEwQkEs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QWMsTSw4RUNPMUIsU0FBWUMsR0FDVix5Q0FDQSxrREFDQSwwQkFDQSxpQkFDQSw0RUFDQSxxQkFORixDQUFZLEVBQUFBLGNBQUEsRUFBQUEsWUFBVyxNLDhFQ1B2QixXQUVBLHFDQUEwQ2dHLEdBQ3hDLE9BQVFBLEdBQ04sSUFBSyxtQkFDSCxPQUFPLEVBQUFoRyxZQUFZMkgsaUJBRXJCLElBQUssa0JBQ0gsT0FBTyxFQUFBM0gsWUFBWTJCLEtBRXJCLElBQUssUUFDSCxPQUFPLEVBQUEzQixZQUFZNEgsTUFFckIsSUFBSyxNQUNILE9BQU8sRUFBQTVILFlBQVk2SCxJQUVyQixRQUNFLE9BQU8sRUFBQTdILFlBQVk4SCIsImZpbGUiOiJkb21vLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZG9tb1wiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJkb21vXCJdID0gZmFjdG9yeSgpO1xufSkod2luZG93LCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMSk7XG4iLCJleHBvcnQgeyBSZXF1ZXN0TWV0aG9kcyB9IGZyb20gJy4vZW51bXMvcmVxdWVzdC1tZXRob2RzJztcbmV4cG9ydCB7IERvbW9EYXRhRm9ybWF0cyB9IGZyb20gJy4vaW50ZXJmYWNlcy9kb21vLWRhdGEtZm9ybWF0cyc7XG5leHBvcnQgeyBEYXRhRm9ybWF0cyB9IGZyb20gJy4vZW51bXMvZGF0YS1mb3JtYXRzJztcbmV4cG9ydCB7IEZpbHRlckRhdGFUeXBlcyB9IGZyb20gJy4vaW50ZXJmYWNlcy9maWx0ZXItZGF0YS10eXBlcyc7XG5leHBvcnQgeyBGaWx0ZXJPcGVyYXRvcnMgfSBmcm9tICcuL2ludGVyZmFjZXMvZmlsdGVyLW9wZXJhdG9ycyc7XG5cbmV4cG9ydCB7IFJlcXVlc3RPcHRpb25zLCBPYmplY3RSZXF1ZXN0T3B0aW9ucywgQXJyYXlSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXF1ZXN0LW9wdGlvbnMnO1xuZXhwb3J0IHsgUXVlcnlQYXJhbXMgfSBmcm9tICcuL2ludGVyZmFjZXMvcXVlcnktcGFyYW1zJztcbmV4cG9ydCB7IFJlcXVlc3RCb2R5LCBYTUxIdHRwUmVxdWVzdEJvZHkgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVxdWVzdC1ib2R5JztcbmV4cG9ydCB7IFJlc3BvbnNlQm9keSwgT2JqZWN0UmVzcG9uc2VCb2R5LCBBcnJheVJlc3BvbnNlQm9keSB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXNwb25zZS1ib2R5JztcbmV4cG9ydCB7IEpzb24gfSBmcm9tICcuL2ludGVyZmFjZXMvanNvbic7XG4iLCJpbXBvcnQge1xuICBSZXF1ZXN0TWV0aG9kcyxcbiAgUmVxdWVzdE9wdGlvbnMsXG4gIE9iamVjdFJlcXVlc3RPcHRpb25zLFxuICBBcnJheVJlcXVlc3RPcHRpb25zLFxuICBEYXRhRm9ybWF0cyxcbiAgUXVlcnlQYXJhbXMsXG4gIEZpbHRlckRhdGFUeXBlcyxcbiAgRmlsdGVyT3BlcmF0b3JzLFxuICBSZXF1ZXN0Qm9keSxcbiAgWE1MSHR0cFJlcXVlc3RCb2R5LFxuICBSZXNwb25zZUJvZHksXG4gIE9iamVjdFJlc3BvbnNlQm9keSxcbiAgQXJyYXlSZXNwb25zZUJvZHksXG59IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IGRvbW9Gb3JtYXRUb1JlcXVlc3RGb3JtYXQgfSBmcm9tICcuL3V0aWxzL2RhdGEtaGVscGVycyc7XG5cbmV4cG9ydCA9IGRvbW87XG5cbmNsYXNzIGRvbW8ge1xuICBzdGF0aWMgcG9zdCh1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBwb3N0PFQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVxdWVzdEJvZHksIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBwb3N0PFQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVxdWVzdEJvZHksIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5QT1NULCB1cmwsIG9wdGlvbnMsIHRydWUsIGJvZHkpO1xuICB9XG5cbiAgc3RhdGljIHB1dCh1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBwdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZXF1ZXN0Qm9keSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUPjtcbiAgc3RhdGljIHB1dDxUPih1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gZG9tb0h0dHA8VD4oUmVxdWVzdE1ldGhvZHMuUFVULCB1cmwsIG9wdGlvbnMsIHRydWUsIGJvZHkpO1xuICB9XG5cbiAgc3RhdGljIGdldCh1cmw6IHN0cmluZywgb3B0aW9uczogT2JqZWN0UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPE9iamVjdFJlc3BvbnNlQm9keVtdPjtcbiAgc3RhdGljIGdldCh1cmw6IHN0cmluZywgb3B0aW9uczogQXJyYXlSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8QXJyYXlSZXNwb25zZUJvZHk+O1xuICBzdGF0aWMgZ2V0KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBnZXQ8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBnZXQ8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5HRVQsIHVybCwgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZGVsZXRlKHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBkZWxldGU8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBkZWxldGU8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5ERUxFVEUsIHVybCwgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsKHVybHM6IHN0cmluZ1tdLCBvcHRpb25zOiBPYmplY3RSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8T2JqZWN0UmVzcG9uc2VCb2R5W11bXT47XG4gIHN0YXRpYyBnZXRBbGwodXJsczogc3RyaW5nW10sIG9wdGlvbnM6IEFycmF5UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEFycmF5UmVzcG9uc2VCb2R5W10+O1xuICBzdGF0aWMgZ2V0QWxsKHVybHM6IHN0cmluZ1tdLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keVtdPjtcbiAgc3RhdGljIGdldEFsbDxUPih1cmxzOiBzdHJpbmdbXSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUW10+O1xuICBzdGF0aWMgZ2V0QWxsPFQ+KHVybHM6IHN0cmluZ1tdLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbCh1cmxzLm1hcChmdW5jdGlvbiAodXJsKSB7XG4gICAgICByZXR1cm4gZG9tby5nZXQ8VD4odXJsLCBvcHRpb25zKTtcbiAgICB9KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExldCB0aGUgZG9tb2FwcCBvcHRpb25hbGx5IGhhbmRsZSBpdHMgb3duIGRhdGEgdXBkYXRlcy5cbiAgICovXG4gIHN0YXRpYyBvbkRhdGFVcGRhdGUoY2I6IChhbGlhczogc3RyaW5nKSA9PiB2b2lkKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgICAgaWYgKCFpc1ZlcmlmaWVkT3JpZ2luKGV2ZW50Lm9yaWdpbikpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhID09PSAnc3RyaW5nJyAmJiBldmVudC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcbiAgICAgICAgICBpZiAoIW1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2FsaWFzJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhbGlhcyA9IG1lc3NhZ2UuYWxpYXM7XG5cbiAgICAgICAgICAvLyBzZW5kIGFja25vd2xlZGdlbWVudCB0byBwcmV2ZW50IGF1dG9yZWZyZXNoXG4gICAgICAgICAgY29uc3QgYWNrID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6ICdhY2snLFxuICAgICAgICAgICAgYWxpYXM6IGFsaWFzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgaW5zdGFuY2VvZiBXaW5kb3cpIHtcbiAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShhY2ssIGV2ZW50Lm9yaWdpbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5mb3JtIGRvbW8gYXBwIHdoaWNoIGFsaWFzIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICAgICAgICBjYihhbGlhcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGluZm8gPSAnVGhlcmUgd2FzIGFuIGVycm9yIGluIG9uRGF0YVVwZGF0ZSEgSXQgbWF5IGJlIHRoYXQgb3VyIGV2ZW50IGxpc3RlbmVyIGNhdWdodCAnICtcbiAgICAgICAgICAgICdhIG1lc3NhZ2UgZnJvbSBhbm90aGVyIHNvdXJjZSBhbmQgdHJpZWQgdG8gcGFyc2UgaXQsIHNvIHlvdXIgdXBkYXRlIHN0aWxsIG1heSBoYXZlIHdvcmtlZC4gJyArXG4gICAgICAgICAgICAnSWYgeW91IHdvdWxkIGxpa2UgbW9yZSBpbmZvLCBoZXJlIGlzIHRoZSBlcnJvcjogXFxuJ1xuICAgICAgICAgIGNvbnNvbGUud2FybihpbmZvLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExldCB0aGUgZG9tb2FwcCBvcHRpb25hbGx5IGhhbmRsZSBvdGhlciBldmVudHNcbiAgICovXG4gIHN0YXRpYyBjaGFubmVsPzogTWVzc2FnZUNoYW5uZWw7XG4gIHN0YXRpYyBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgc3RhdGljIGxpc3RlbmVyczogeyBbaW5kZXg6IHN0cmluZ106IEZ1bmN0aW9uW10gfSA9IHtcbiAgICBvbkZpbHRlcnNVcGRhdGU6IFtdLFxuICB9O1xuXG4gIHN0YXRpYyBjb25uZWN0ID0gKCkgPT4ge1xuICAgIGlmIChkb21vLmNvbm5lY3RlZCkgcmV0dXJuO1xuICAgIGRvbW8uY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBkb21vLmNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHsgZXZlbnQ6ICdzdWJzY3JpYmUnIH0pLCAnKicsIFtcbiAgICAgIGRvbW8uY2hhbm5lbC5wb3J0MixcbiAgICBdKTtcbiAgfTtcblxuICAvKipcbiAgICogTGV0IHRoZSBkb21vYXBwIGhhbmRsZSBpdHMgb3duIGZpbHRlciB1cGRhdGVzXG4gICAqL1xuICBzdGF0aWMgb25GaWx0ZXJzVXBkYXRlID0gKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4ge1xuICAgIGRvbW8uY29ubmVjdCgpO1xuICAgIGNvbnN0IGluZGV4ID0gZG9tby5saXN0ZW5lcnMub25GaWx0ZXJzVXBkYXRlLnB1c2goY2FsbGJhY2spIC0gMTtcblxuICAgIGRvbW8uY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSAoZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBbcmVzcG9uc2VQb3J0XSA9IGUucG9ydHM7XG4gICAgICBpZiAocmVzcG9uc2VQb3J0ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgaWYgKGUuZGF0YS5ldmVudCA9PT0gJ2ZpbHRlcnNVcGRhdGVkJyAmJiBkb21vLmxpc3RlbmVycy5vbkZpbHRlcnNVcGRhdGUubGVuZ3RoID4gMCkge1xuICAgICAgICByZXNwb25zZVBvcnQucG9zdE1lc3NhZ2Uoe30pOyAvLyBQcmV2ZW50cyB0aGUgYXBwIGZyb20gcmVsb2FkaW5nLiBTYXlzIHdlJ3ZlIGhhbmRsZWQgaXRcbiAgICAgICAgZG9tby5saXN0ZW5lcnMub25GaWx0ZXJzVXBkYXRlLmZvckVhY2goKGNiKSA9PiBjYihlLmRhdGEuZmlsdGVycykpOyAvLyA8LSBzcGxpdCBvdXQgb25GaWx0ZXJzVXBkYXRlIHNvIHRoYXQgeW91IGNhbiBoYW5kbGUgZWFjaCBtZXNzYWdlIGRpZmZlcmVudGx5IGhlcmVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gdW5yZWdpc3RlclxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb21vLmxpc3RlbmVycy5vbkZpbHRlcnNVcGRhdGUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgbmF2aWdhdGlvbiBjaGFuZ2VcbiAgICovXG4gIHN0YXRpYyBuYXZpZ2F0ZSh1cmw6IHN0cmluZywgaXNOZXdXaW5kb3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnQ6ICduYXZpZ2F0ZScsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGlzTmV3V2luZG93OiBpc05ld1dpbmRvd1xuICAgIH0pO1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UobWVzc2FnZSwgXCIqXCIpO1xuICB9XG5cbiAgc3RhdGljIGZpbHRlckNvbnRhaW5lcihmaWx0ZXJzOlxuICAgICh7IGNvbHVtbjogc3RyaW5nLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3JzLCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIgfCBEYXRlKVtdLCBkYXRhVHlwZTogRmlsdGVyRGF0YVR5cGVzIH1cbiAgICAgIHwgeyBjb2x1bW46IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9ycywgdmFsdWVzOiBEYXRlW10sIGRhdGFUeXBlOiAnREFURScgfCAnREFURVRJTUUnIH1cbiAgICAgIHwgeyBjb2x1bW46IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9ycywgdmFsdWVzOiBudW1iZXJbXSwgZGF0YVR5cGU6ICdOVU1FUklDJyB9XG4gICAgICB8IHsgY29sdW1uOiBzdHJpbmcsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcnMsIHZhbHVlczogc3RyaW5nW10sIGRhdGFUeXBlOiAnU1RSSU5HJyB9KVtdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksXG4gICAgICBzYWZhcmkgPSAvc2FmYXJpLy50ZXN0KHVzZXJBZ2VudCksXG4gICAgICBpb3MgPSAvaXBob25lfGlwb2R8aXBhZC8udGVzdCh1c2VyQWdlbnQpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50OiAnZmlsdGVyJyxcbiAgICAgIGZpbHRlcjogZmlsdGVycy5tYXAoZmlsdGVyID0+ICh7XG4gICAgICAgIGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW4sXG4gICAgICAgIG9wZXJhdG9yOiBmaWx0ZXIub3BlcmF0b3IsXG4gICAgICAgIHZhbHVlczogZmlsdGVyLnZhbHVlcyxcbiAgICAgICAgZGF0YVR5cGU6IGZpbHRlci5kYXRhVHlwZVxuICAgICAgfSkpXG4gICAgfSk7XG5cbiAgICBpZiAoaW9zICYmICFzYWZhcmkpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzLmRvbW9maWx0ZXIucG9zdE1lc3NhZ2UoXG4gICAgICAgIGZpbHRlcnMubWFwKGZpbHRlciA9PlxuICAgICAgICAgICh7IGNvbHVtbjogZmlsdGVyLmNvbHVtbiwgb3BlcmFuZDogZmlsdGVyLm9wZXJhdG9yLCB2YWx1ZXM6IGZpbHRlci52YWx1ZXMsIGRhdGFUeXBlOiBmaWx0ZXIuZGF0YVR5cGUgfSkpXG4gICAgICApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UobWVzc2FnZSwgXCIqXCIpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBlbnYgPSBnZXRRdWVyeVBhcmFtcygpO1xuXG4gIHN0YXRpYyBfX3V0aWwgPSB7XG4gICAgaXNWZXJpZmllZE9yaWdpbixcbiAgICBnZXRRdWVyeVBhcmFtcyxcbiAgICBzZXRGb3JtYXRIZWFkZXJzLFxuICAgIGlzU3VjY2Vzc1xuICB9XG5cbn07XG5cbmZ1bmN0aW9uIGRvbW9IdHRwKG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBvcHRpb25zOiBPYmplY3RSZXF1ZXN0T3B0aW9ucywgYXN5bmM/OiBib29sZWFuLCBib2R5PzogUmVxdWVzdEJvZHkpOiBQcm9taXNlPE9iamVjdFJlc3BvbnNlQm9keVtdPjtcbmZ1bmN0aW9uIGRvbW9IdHRwKG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBvcHRpb25zOiBBcnJheVJlcXVlc3RPcHRpb25zLCBhc3luYz86IGJvb2xlYW4sIGJvZHk/OiBSZXF1ZXN0Qm9keSk6IFByb21pc2U8QXJyYXlSZXNwb25zZUJvZHk+O1xuZnVuY3Rpb24gZG9tb0h0dHAobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLCBhc3luYz86IGJvb2xlYW4sIGJvZHk/OiBSZXF1ZXN0Qm9keSk6IFByb21pc2U8UmVzcG9uc2VCb2R5PjtcbmZ1bmN0aW9uIGRvbW9IdHRwPFQ+KG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucywgYXN5bmM/OiBib29sZWFuLCBib2R5PzogUmVxdWVzdEJvZHkpOiBQcm9taXNlPFQ+O1xuZnVuY3Rpb24gZG9tb0h0dHAobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLCBhc3luYz86IGJvb2xlYW4sIGJvZHk/OiBSZXF1ZXN0Qm9keSk6IFByb21pc2U8UmVzcG9uc2VCb2R5PiB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZT86IFJlc3BvbnNlQm9keSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogRXJyb3IpID0+IHZvaWQpIHtcbiAgICAvLyBEbyB0aGUgdXN1YWwgWEhSIHN0dWZmXG4gICAgbGV0IHJlcTogWE1MSHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIHJlcS5vcGVuKG1ldGhvZCwgdXJsLCBhc3luYyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmVxLm9wZW4obWV0aG9kLCB1cmwpO1xuICAgIH1cbiAgICBzZXRGb3JtYXRIZWFkZXJzKHJlcSwgdXJsLCBvcHRpb25zKTtcbiAgICBzZXRDb250ZW50SGVhZGVycyhyZXEsIG9wdGlvbnMpO1xuICAgIHNldFJlc3BvbnNlVHlwZShyZXEsIG9wdGlvbnMpO1xuXG4gICAgcmVxLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBkYXRhO1xuICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgZXZlbiBvbiA0MDQgZXRjIHNvIGNoZWNrIHRoZSBzdGF0dXNcbiAgICAgIGlmIChpc1N1Y2Nlc3MocmVxLnN0YXR1cykpIHtcblxuICAgICAgICBpZiAoWydjc3YnLCAnZXhjZWwnXS5pbmNsdWRlcyhvcHRpb25zLmZvcm1hdCkgfHwgIXJlcS5yZXNwb25zZSkge1xuICAgICAgICAgIHJlc29sdmUocmVxLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5yZXNwb25zZVR5cGUgPT09ICdibG9iJykge1xuICAgICAgICAgIHJlc29sdmUobmV3IEJsb2IoW3JlcS5yZXNwb25zZV0sIHsgdHlwZTogcmVxLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKSB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VTdHIgPSByZXEucmVzcG9uc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYoIXJlc3BvbnNlU3RyKSB7XG4gICAgICAgICAgLy8gICByZXNwb25zZVN0ciA9IFwie31cIjtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2VTdHIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgIHJlamVjdChFcnJvcignSW52YWxpZCBKU09OIHJlc3BvbnNlJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIHdpdGggdGhlIHJlc3BvbnNlIHRleHRcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UgcmVqZWN0IHdpdGggdGhlIHN0YXR1cyB0ZXh0XG4gICAgICAgIC8vIHdoaWNoIHdpbGwgaG9wZWZ1bGx5IGJlIGEgbWVhbmluZ2Z1bCBlcnJvclxuICAgICAgICByZWplY3QoRXJyb3IocmVxLnN0YXR1c1RleHQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZWplY3QoRXJyb3IoXCJOZXR3b3JrIEVycm9yXCIpKTtcbiAgICB9O1xuXG4gICAgLy8gTWFrZSB0aGUgcmVxdWVzdFxuICAgIGlmIChib2R5KSB7XG4gICAgICBpZiAoIW9wdGlvbnMuY29udGVudFR5cGUgfHwgb3B0aW9ucy5jb250ZW50VHlwZSA9PT0gRGF0YUZvcm1hdHMuSlNPTikge1xuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgICAgIC8vIE1ha2UgdGhlIHJlcXVlc3RcbiAgICAgICAgcmVxLnNlbmQoanNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBib2R5IGNhbiBubyBsb25nZXIgYmUgSlNPTlxuICAgICAgICByZXEuc2VuZChib2R5IGFzIFhNTEh0dHBSZXF1ZXN0Qm9keSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmVxLnNlbmQoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1N1Y2Nlc3Moc3RhdHVzOiBudW1iZXIpIHtcbiAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xufVxuXG5mdW5jdGlvbiBpc1ZlcmlmaWVkT3JpZ2luKG9yaWdpbjogc3RyaW5nKSB7XG4gIGNvbnN0IHdoaXRlbGlzdGVkID0gb3JpZ2luLm1hdGNoKCdeaHR0cHM/Oi8vKFteL10rWy5dKT8oZG9tb3xkb21vdGVjaHxkb21vcmlnKVxcLihjb218aW8pPygvLiopPyQnKTtcbiAgY29uc3QgYmxhY2tsaXN0ZWQgPSBvcmlnaW4ubWF0Y2goJyguKilcXC4oZG9tb2FwcHMpXFwuKC4qKScpO1xuICByZXR1cm4gISF3aGl0ZWxpc3RlZCAmJiAhYmxhY2tsaXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFF1ZXJ5UGFyYW1zKCk6IFF1ZXJ5UGFyYW1zIHtcbiAgY29uc3QgcXVlcnkgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpO1xuICBsZXQgcmVzdWx0OiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcXVlcnkuc3BsaXQoXCImXCIpLmZvckVhY2goZnVuY3Rpb24gKHBhcnQpIHtcbiAgICBjb25zdCBpdGVtID0gcGFydC5zcGxpdChcIj1cIik7XG4gICAgcmVzdWx0W2l0ZW1bMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW1bMV0pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2V0Rm9ybWF0SGVhZGVycyhyZXE6IFhNTEh0dHBSZXF1ZXN0LCB1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSB7XG4gIGlmICh1cmwuaW5kZXhPZignZGF0YS92MScpID09PSAtMSkgeyByZXR1cm47IH1cbiAgLy8gc2V0IGZvcm1hdFxuICBjb25zdCByZXF1ZXN0Rm9ybWF0OiBEYXRhRm9ybWF0cyA9IChvcHRpb25zLmZvcm1hdCAhPT0gdW5kZWZpbmVkKVxuICAgID8gKGRvbW9Gb3JtYXRUb1JlcXVlc3RGb3JtYXQob3B0aW9ucy5mb3JtYXQpKVxuICAgIDogKERhdGFGb3JtYXRzLkRFRkFVTFQpO1xuXG4gIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCByZXF1ZXN0Rm9ybWF0KTtcbn1cblxuZnVuY3Rpb24gc2V0Q29udGVudEhlYWRlcnMocmVxOiBYTUxIdHRwUmVxdWVzdCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlKSB7XG4gICAgLy8gc2V0IGNvbnRlbnQgdHlwZSBpZiB1c2VyIHBhc3NlZCBvcHRpb25cbiAgICBpZiAob3B0aW9ucy5jb250ZW50VHlwZSAhPT0gJ211bHRpcGFydCcpIHtcbiAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBvcHRpb25zLmNvbnRlbnRUeXBlKTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIERhdGFGb3JtYXRzLkpTT04pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc3BvbnNlVHlwZShyZXE6IFhNTEh0dHBSZXF1ZXN0LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpIHtcbiAgLy9zZXQgcmVzcG9uc2UgdHlwZSBpZiB1c2VyIHBhc3NlZCBvcHRpb25cbiAgaWYgKG9wdGlvbnMucmVzcG9uc2VUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXEucmVzcG9uc2VUeXBlID0gb3B0aW9ucy5yZXNwb25zZVR5cGU7XG4gIH1cbn0iLCJleHBvcnQgZW51bSBSZXF1ZXN0TWV0aG9kcyB7XG4gIGdldCA9ICdHRVQnLFxuICBHRVQgPSAnR0VUJyxcbiAgcG9zdCA9ICdQT1NUJyxcbiAgUE9TVCA9ICdQT1NUJyxcbiAgcHV0ID0gJ1BVVCcsXG4gIFBVVCA9ICdQVVQnLFxuICBkZWxldGUgPSAnREVMRVRFJyxcbiAgREVMRVRFID0gJ0RFTEVURScsXG59XG4iLCIvKipcbiAqIFN1cHBvcnRlZCBgYWNjZXB0YCBoZWFkZXJzIGZvciBjb250cm9sbGluZyB0aGUgZm9ybWF0XG4gKiBvZiB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIERvbW8uXG4gKlxuICogU2VlIFtkZXZlbG9wZXIuZG9tby5jb21dKGh0dHBzOi8vZGV2ZWxvcGVyLmRvbW8uY29tL2RvY3MvZGV2LXN0dWRpby1yZWZlcmVuY2VzL2RhdGEtYXBpI0RhdGElMjBGb3JtYXRzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGVudW0gRGF0YUZvcm1hdHMge1xuICBERUZBVUxUID0gJ2FwcGxpY2F0aW9uL2FycmF5LW9mLW9iamVjdHMnLFxuICBBUlJBWV9PRl9PQkpFQ1RTID0gJ2FwcGxpY2F0aW9uL2FycmF5LW9mLW9iamVjdHMnLFxuICBKU09OID0gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICBDU1YgPSAndGV4dC9jc3YnLFxuICBFWENFTCA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsXG4gIFBMQUlOID0gJ3RleHQvcGxhaW4nXG59IiwiaW1wb3J0IHsgRG9tb0RhdGFGb3JtYXRzLCBEYXRhRm9ybWF0cyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0KGZvcm1hdDogRG9tb0RhdGFGb3JtYXRzKTogRGF0YUZvcm1hdHMge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ2FycmF5LW9mLW9iamVjdHMnOiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuQVJSQVlfT0ZfT0JKRUNUUztcbiAgICB9XG4gICAgY2FzZSAnYXJyYXktb2YtYXJyYXlzJzoge1xuICAgICAgcmV0dXJuIERhdGFGb3JtYXRzLkpTT047XG4gICAgfVxuICAgIGNhc2UgJ2V4Y2VsJzoge1xuICAgICAgcmV0dXJuIERhdGFGb3JtYXRzLkVYQ0VMO1xuICAgIH1cbiAgICBjYXNlICdjc3YnOiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuQ1NWO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuREVGQVVMVDtcbiAgICB9XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= |
{ | ||
"name": "ryuu.js", | ||
"version": "3.0.6", | ||
"version": "4.0.0", | ||
"description": "Ryuu JavaScript Utility Library", | ||
@@ -5,0 +5,0 @@ "main": "dist/domo.js", |
148
src/domo.ts
@@ -26,3 +26,3 @@ import { | ||
} | ||
static put(url: string, body?: RequestBody, options?: RequestOptions): Promise<ResponseBody>; | ||
@@ -33,3 +33,3 @@ static put<T>(url: string, body?: RequestBody, options?: RequestOptions): Promise<T>; | ||
} | ||
static get(url: string, options: ObjectRequestOptions): Promise<ObjectResponseBody[]>; | ||
@@ -42,3 +42,3 @@ static get(url: string, options: ArrayRequestOptions): Promise<ArrayResponseBody>; | ||
} | ||
static delete(url: string, options?: RequestOptions): Promise<ResponseBody>; | ||
@@ -55,7 +55,7 @@ static delete<T>(url: string, options?: RequestOptions): Promise<T>; | ||
static getAll<T>(urls: string[], options?: RequestOptions): Promise<T[]> { | ||
return Promise.all(urls.map(function(url){ | ||
return Promise.all(urls.map(function (url) { | ||
return domo.get<T>(url, options); | ||
})); | ||
}; | ||
/** | ||
@@ -65,6 +65,6 @@ * Let the domoapp optionally handle its own data updates. | ||
static onDataUpdate(cb: (alias: string) => void) { | ||
window.addEventListener('message', function(event: MessageEvent) { | ||
window.addEventListener('message', function (event: MessageEvent) { | ||
if (!isVerifiedOrigin(event.origin)) | ||
return; | ||
if (typeof event.data === 'string' && event.data.length > 0) { | ||
@@ -76,5 +76,5 @@ try { | ||
} | ||
const alias = message.alias; | ||
// send acknowledgement to prevent autorefresh | ||
@@ -85,12 +85,12 @@ const ack = JSON.stringify({ | ||
}); | ||
if(event.source instanceof Window) { | ||
if (event.source instanceof Window) { | ||
event.source.postMessage(ack, event.origin); | ||
} | ||
// inform domo app which alias has been updated | ||
cb(alias); | ||
} catch(err) { | ||
} catch (err) { | ||
const info = 'There was an error in onDataUpdate! It may be that our event listener caught ' + | ||
'a message from another source and tried to parse it, so your update still may have worked. ' + | ||
'If you would like more info, here is the error: \n' | ||
'a message from another source and tried to parse it, so your update still may have worked. ' + | ||
'If you would like more info, here is the error: \n' | ||
console.warn(info, err); | ||
@@ -101,4 +101,45 @@ } | ||
}; | ||
/** | ||
* Let the domoapp optionally handle other events | ||
*/ | ||
static channel?: MessageChannel; | ||
static connected = false; | ||
static listeners: { [index: string]: Function[] } = { | ||
onFiltersUpdate: [], | ||
}; | ||
static connect = () => { | ||
if (domo.connected) return; | ||
domo.connected = true; | ||
domo.channel = new MessageChannel(); | ||
window.parent.postMessage(JSON.stringify({ event: 'subscribe' }), '*', [ | ||
domo.channel.port2, | ||
]); | ||
}; | ||
/** | ||
* Let the domoapp handle its own filter updates | ||
*/ | ||
static onFiltersUpdate = (callback: Function) => { | ||
domo.connect(); | ||
const index = domo.listeners.onFiltersUpdate.push(callback) - 1; | ||
domo.channel.port1.onmessage = (e: MessageEvent) => { | ||
const [responsePort] = e.ports; | ||
if (responsePort === undefined) return; | ||
if (e.data.event === 'filtersUpdated' && domo.listeners.onFiltersUpdate.length > 0) { | ||
responsePort.postMessage({}); // Prevents the app from reloading. Says we've handled it | ||
domo.listeners.onFiltersUpdate.forEach((cb) => cb(e.data.filters)); // <- split out onFiltersUpdate so that you can handle each message differently here | ||
} | ||
}; | ||
// unregister | ||
return () => { | ||
domo.listeners.onFiltersUpdate.splice(index, 1); | ||
}; | ||
}; | ||
/** | ||
* Request a navigation change | ||
@@ -114,23 +155,28 @@ */ | ||
} | ||
static filterContainer(column: string, operator: FilterOperators, values: string[], dataType: 'STRING'): void; | ||
static filterContainer(column: string, operator: FilterOperators, values: number[], dataType: 'NUMERIC'): void; | ||
static filterContainer(column: string, operator: FilterOperators, values: Date[], dataType: 'DATE' | 'DATETIME'): void; | ||
static filterContainer(column: string, operator: FilterOperators, values: (string | number | Date)[], dataType: FilterDataTypes): void { | ||
static filterContainer(filters: | ||
({ column: string, operator: FilterOperators, values: (string | number | Date)[], dataType: FilterDataTypes } | ||
| { column: string, operator: FilterOperators, values: Date[], dataType: 'DATE' | 'DATETIME' } | ||
| { column: string, operator: FilterOperators, values: number[], dataType: 'NUMERIC' } | ||
| { column: string, operator: FilterOperators, values: string[], dataType: 'STRING' })[] | ||
): void { | ||
const userAgent = window.navigator.userAgent.toLowerCase(), | ||
safari = /safari/.test( userAgent ), | ||
ios = /iphone|ipod|ipad/.test( userAgent ); | ||
safari = /safari/.test(userAgent), | ||
ios = /iphone|ipod|ipad/.test(userAgent); | ||
const message = JSON.stringify({ | ||
event: 'filter', | ||
filter: { | ||
columnName: column, | ||
operator: operator, | ||
values: values, | ||
dataType: dataType | ||
} | ||
filter: filters.map(filter => ({ | ||
columnName: filter.column, | ||
operator: filter.operator, | ||
values: filter.values, | ||
dataType: filter.dataType | ||
})) | ||
}); | ||
if(ios && !safari) { | ||
(window as any).webkit.messageHandlers.domofilter.postMessage({ column: column, operand: operator, values: values, dataType: dataType }); | ||
if (ios && !safari) { | ||
(window as any).webkit.messageHandlers.domofilter.postMessage( | ||
filters.map(filter => | ||
({ column: filter.column, operand: filter.operator, values: filter.values, dataType: filter.dataType })) | ||
); | ||
} | ||
@@ -141,9 +187,9 @@ else { | ||
} | ||
static env = getQueryParams(); | ||
static __util = { | ||
isVerifiedOrigin, | ||
getQueryParams, | ||
setFormatHeaders, | ||
setFormatHeaders, | ||
isSuccess | ||
@@ -160,6 +206,6 @@ } | ||
options = options || {}; | ||
return new Promise(function(resolve: (value?: ResponseBody) => void, reject: (reason?: Error) => void) { | ||
return new Promise(function (resolve: (value?: ResponseBody) => void, reject: (reason?: Error) => void) { | ||
// Do the usual XHR stuff | ||
let req: XMLHttpRequest = new XMLHttpRequest(); | ||
if(async) { | ||
if (async) { | ||
req.open(method, url, async); | ||
@@ -174,12 +220,12 @@ } | ||
req.onload = function() { | ||
req.onload = function () { | ||
let data; | ||
// This is called even on 404 etc so check the status | ||
if (isSuccess(req.status)) { | ||
if (['csv', 'excel'].includes(options.format) || !req.response){ | ||
if (['csv', 'excel'].includes(options.format) || !req.response) { | ||
resolve(req.response); | ||
} | ||
if(options.responseType === 'blob') { | ||
resolve(new Blob([req.response], {type: req.getResponseHeader('content-type')})); | ||
if (options.responseType === 'blob') { | ||
resolve(new Blob([req.response], { type: req.getResponseHeader('content-type') })); | ||
} | ||
@@ -194,3 +240,3 @@ | ||
} | ||
catch (ex){ | ||
catch (ex) { | ||
reject(Error('Invalid JSON response')); | ||
@@ -210,3 +256,3 @@ return; | ||
// Handle network errors | ||
req.onerror = function() { | ||
req.onerror = function () { | ||
reject(Error("Network Error")); | ||
@@ -216,3 +262,3 @@ }; | ||
// Make the request | ||
if(body) { | ||
if (body) { | ||
if (!options.contentType || options.contentType === DataFormats.JSON) { | ||
@@ -245,4 +291,4 @@ const json = JSON.stringify(body); | ||
const query = location.search.substr(1); | ||
let result : { [index : string] : string} = {}; | ||
query.split("&").forEach(function(part) { | ||
let result: { [index: string]: string } = {}; | ||
query.split("&").forEach(function (part) { | ||
const item = part.split("="); | ||
@@ -254,7 +300,7 @@ result[item[0]] = decodeURIComponent(item[1]); | ||
function setFormatHeaders(req: XMLHttpRequest, url: string, options?: RequestOptions){ | ||
if (url.indexOf('data/v1') === -1 ) { return; } | ||
function setFormatHeaders(req: XMLHttpRequest, url: string, options?: RequestOptions) { | ||
if (url.indexOf('data/v1') === -1) { return; } | ||
// set format | ||
const requestFormat: DataFormats = (options.format !== undefined) | ||
? (domoFormatToRequestFormat(options.format)) | ||
? (domoFormatToRequestFormat(options.format)) | ||
: (DataFormats.DEFAULT); | ||
@@ -268,3 +314,3 @@ | ||
// set content type if user passed option | ||
if(options.contentType !== 'multipart'){ | ||
if (options.contentType !== 'multipart') { | ||
req.setRequestHeader('Content-Type', options.contentType); | ||
@@ -271,0 +317,0 @@ } |
122769
877