Socket
Socket
Sign inDemoInstall

react-google-oauth2

Package Overview
Dependencies
8
Maintainers
1
Versions
33
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.0.27 to 0.0.28-rc.0

lib/_apiUtils.d.ts

4

CHANGELOG.md

@@ -19,3 +19,7 @@ # Changelog

## Pre Release
**Releases 0.0.28-rc.0**
- Disconnect auto login #27. [Issue #27](https://github.com/joegasewicz/react-google-oauth2.0/issues/27)
## Unreleased

5

lib/apiUtils.d.ts

@@ -23,2 +23,3 @@ /** @internal */

readonly apiUrl: string;
responseState: IServerResponseState;
setResponseState: Dispatch<SetStateAction<IServerResponseState>>;

@@ -84,4 +85,6 @@ }

*/
export declare function createOAuthHeaders(resource?: string): Object;
export declare function createOAuthHeaders(resource?: string): {
[k: string]: string;
};
/** @internal */
export declare function removeOAuthQueryParams(): void;

@@ -6,2 +6,4 @@ /** @internal */

/** @public */
export declare type TypePrompt = "consent" | "select_account";
/** @public */
interface IAuthorizationBase {

@@ -31,3 +33,3 @@ /** This is your client ID */

includeGrantedScopes?: boolean;
/** Not required, optional. For prefilling email fields etc. */
/** Not required, optional. For prefilling email fields */
loginHint?: string;

@@ -37,5 +39,7 @@ /**

* present the user. If you don't specify this parameter, the user will be prompted
* only the first time your project requests access.
* only the first time your project requests access. Valid values:
* consent - Prompt the user for consent.
* select_account - Prompt the user to select an account.
* */
prompt?: string;
prompt?: TypePrompt;
}

@@ -42,0 +46,0 @@ /** @public */

import { default as React, Dispatch, SetStateAction } from "react";
import { IAuthorizationOptions } from "./authorization";
import { IAuthorizationOptions, TypePrompt } from "./authorization";
import { IServerResponseState } from "./apiUtils";

@@ -49,4 +49,7 @@ /** @public */

isAuthenticated?: boolean;
setOAuthState?: Function;
setOAuthState: Function;
responseState?: IServerResponseState;
options?: IAuthorizationOptions;
setOptions: Function;
setPrompt: Function;
/**

@@ -66,3 +69,3 @@ * ```

*/
setResponseState?: Dispatch<SetStateAction<IServerResponseState>>;
setResponseState: Dispatch<SetStateAction<IServerResponseState>>;
}

@@ -124,4 +127,16 @@ /** @internal */

*/
export declare function GoogleButton(props: TypeGoogleButton): JSX.Element | null;
export declare function GoogleButton(props: TypeGoogleButton): JSX.Element;
/**
*
* @param setOptions
* @param options
* @internal TODO make public when bugs are fixed
*/
export declare function setPrompt(setOptions: Function, options?: IAuthorizationOptions): (promptType: TypePrompt) => void;
/**
*
* @param props
* @constructor
*/
export declare const GoogleAuth: (props: any) => JSX.Element;
export {};

@@ -1,4 +0,4 @@

import { IAuthorizationOptions } from "./authorization";
import { IAuthorizationOptions, TypePrompt } from "./authorization";
import { isLoggedIn, logOutOAuthUser, createOAuthHeaders, getAccessToken } from "./apiUtils";
import { GoogleButton, IGoogleButton, GoogleAuth, GoogleAuthConsumer, IOAuthState } from "./components";
export { GoogleButton, IGoogleButton, IAuthorizationOptions, isLoggedIn, logOutOAuthUser, createOAuthHeaders, GoogleAuth, GoogleAuthConsumer, getAccessToken, IOAuthState, };
import { GoogleButton, IGoogleButton, GoogleAuth, GoogleAuthConsumer, IOAuthState, setPrompt } from "./components";
export { GoogleButton, IGoogleButton, IAuthorizationOptions, isLoggedIn, logOutOAuthUser, createOAuthHeaders, GoogleAuth, GoogleAuthConsumer, getAccessToken, IOAuthState, TypePrompt, setPrompt, };

@@ -1,2 +0,2 @@

module.exports=function(e){var t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(r.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(o,n,function(t){return e[t]}.bind(null,n));return o},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(e,t){e.exports=require("react")},function(e,t,r){"use strict";r.r(t),r.d(t,"GoogleButton",(function(){return R})),r.d(t,"isLoggedIn",(function(){return i})),r.d(t,"logOutOAuthUser",(function(){return s})),r.d(t,"createOAuthHeaders",(function(){return l})),r.d(t,"GoogleAuth",(function(){return x})),r.d(t,"GoogleAuthConsumer",(function(){return O})),r.d(t,"getAccessToken",(function(){return u}));var o=function(){return(o=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},n=function(e,t,r,o){return new(r||(r=Promise))((function(n,c){function a(e){try{s(o.next(e))}catch(e){c(e)}}function i(e){try{s(o.throw(e))}catch(e){c(e)}}function s(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,i)}s((o=o.apply(e,t||[])).next())}))},c=function(e,t){var r,o,n,c,a={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]};return c={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function i(c){return function(i){return function(c){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,o&&(n=2&c[0]?o.return:c[0]?o.throw||((n=o.return)&&n.call(o),0):o.next)&&!(n=n.call(o,c[1])).done)return n;switch(o=0,n&&(c=[2&c[0],n.value]),c[0]){case 0:case 1:n=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,o=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(n=a.trys,(n=n.length>0&&n[n.length-1])||6!==c[0]&&2!==c[0])){a=0;continue}if(3===c[0]&&(!n||c[1]>n[0]&&c[1]<n[3])){a.label=c[1];break}if(6===c[0]&&a.label<n[1]){a.label=n[1],n=c;break}if(n&&a.label<n[2]){a.label=n[2],a.ops.push(c);break}n[2]&&a.ops.pop(),a.trys.pop();continue}c=t.call(e,a)}catch(e){c=[6,e],o=0}finally{r=n=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,i])}}};function a(e){var t=e.code;(function(e,t){return n(this,void 0,void 0,(function(){return c(this,(function(r){switch(r.label){case 0:return[4,fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})];case 1:return[2,r.sent().json()]}}))}))})(e.apiUrl,{code:t,scope:e.scope}).then((function(t){"access_token"in t?e.setResponseState({accessToken:t.access_token}):e.setResponseState({error:"so access_token in response data!"})})).catch((function(t){e.setResponseState({error:t.message})}))}function i(){return!!window.localStorage.getItem("accessToken")}function s(){window.localStorage.removeItem("accessToken")}function u(){return window.localStorage.getItem("accessToken")}function l(e){var t={};return e&&(t={"X-Auth-Resource":e}),o(o({},t),{"X-Auth-Token":"Bearer "+u()})}function p(){var e=document.location.href;if(document.location.search){var t=e.substring(0,e.indexOf("?"));window.history.replaceState({},document.title,t)}}var d,f=r(0),g=r.n(f);!function(e){e.GOOGLE_OAUTH_ENDPOINT="https://accounts.google.com/o/oauth2/v2/auth"}(d||(d={}));var h=function(){function e(e,t){var r=this;this.redirect=function(e){if(!r.googleRedirectURL)throw new ReferenceError("Error creating redirect url to Google's authorization server");window.location.replace(r.googleRedirectURL)},this.params=e,this.scopesStr=t}return Object.defineProperty(e.prototype,"googleRedirectURL",{get:function(){return this._googleRedirectURL},set:function(e){this._googleRedirectURL=e},enumerable:!1,configurable:!0}),e.prototype.createAuthorizationRequestURL=function(){var e,t=this.params,r=t.accessType,o=void 0===r?"offline":r,n=t.includeGrantedScopes,c=void 0===n||n,a=t.responseType,i=void 0===a?"code":a,s=t.state,u=void 0===s?null:s,l=t.redirectUri,p=t.clientId;e=d.GOOGLE_OAUTH_ENDPOINT+"?scope="+this.scopesStr+"&",e=(e=(e=o?e+"access_type="+o+"&":e)+"include_granted_scopes="+c+"&")+"response_type="+i+"&",e=(e=(e=u?e+"state="+u+"&":e)+"redirect_uri="+l+"&")+"client_id="+p,this.googleRedirectURL=e},e.createScopes=function(e){var t="";return e.map((function(r,o){e.length-1===o?t+=""+r:t+=r+"%20"})),t},e}(),v=function(){return(v=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},b={},y={backgroundSize:"20px 20px",backgroundRepeat:"no-repeat",backgroundPosition:"12px 10px",textIndent:"19px",border:"1px solid #bdc3c7",padding:"9px 23px",borderRadius:"9px",backgroundColor:"#bdc3c7",fontSize:"18px"},m=g.a.createContext({}),S=m.Provider,O=m.Consumer,w=function(e){var t=e.placeholder,r=void 0===t?"":t,o=e.defaultStyle,n=void 0===o||o,c=e.options,a=e.displayErrors,i=void 0!==a&&a,s=h.createScopes(c.scopes),u=new h(c,s);u.createAuthorizationRequestURL();var l=n?function(e,t){return e?v(v({},t),{backgroundImage:"url("+e+")"}):t}(r,y):void 0;return e.error&&console.error("[React-Google-OAuth2] Error: "+e.error+"\n - To display the error to the user, set IGoogleProps displayErrors to true.\n See https://joegasewicz.github.io/react-google-oauth2.0/"),p(),g.a.createElement(g.a.Fragment,null,g.a.createElement("button",{style:l,onClick:u.redirect,className:e.className+" google-oauth-btn"},e.children),i&&e.error&&g.a.createElement("div",null,e.error))};function R(e){var t,r,o,n,c,s=e.callback,u=Object(f.useContext)(m),l=new URLSearchParams(window.location.search),d=l.get("code"),h=l.get("error"),b=g.a.createElement(w,v({},e,{placeholder:e.placeholder,error:null===(t=u.responseState)||void 0===t?void 0:t.error,options:e.options}));if((null===(r=u.responseState)||void 0===r?void 0:r.accessToken)&&!i())return c=u.responseState.accessToken,window.localStorage.setItem("accessToken",c),console.debug("`accessToken` set in local storage."),"function"==typeof u.setOAuthState&&Object(f.useEffect)((function(){u.setOAuthState(!0)})),null;if(null===(o=u.responseState)||void 0===o?void 0:o.error)return console.error("[React-Google-OAuth2] Error: Api call failed with "+(null===(n=u.responseState)||void 0===n?void 0:n.error)+" error."),b;if(d&&!i()){var y={email:l.get("email")||"",scope:l.get("scope")||"",code:d,client_id:e.options.clientId,apiUrl:e.apiUrl,responseState:u.responseState,setResponseState:u.setResponseState};return p(),Object(f.useEffect)((function(){a(y)}),[]),console.debug("Waiting for remote api response"),s?s():g.a.createElement(g.a.Fragment,null,"Loading...")}return h?(console.error("Error: Google login attempt failed with "+h+" error."),b):b}var x=function(e){var t=Object(f.useState)(b),r=t[0],o=t[1],n=Object(f.useState)(i()),c={isAuthenticated:n[0],setOAuthState:n[1],responseState:r,setResponseState:o};return g.a.createElement(S,{value:c},e.children)}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9yZWFjdC1nb29nbGUtb2F1dGgvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcmVhY3QtZ29vZ2xlLW9hdXRoL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly9yZWFjdC1nb29nbGUtb2F1dGgvLi9zcmMvYXBpVXRpbHMudHMiLCJ3ZWJwYWNrOi8vcmVhY3QtZ29vZ2xlLW9hdXRoLy4vc3JjL2F1dGhvcml6YXRpb24udHMiLCJ3ZWJwYWNrOi8vcmVhY3QtZ29vZ2xlLW9hdXRoLy4vc3JjL2NvbXBvbmVudHMudHN4Il0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsInNlcnZlclJlc3BvbnNlIiwicHJvcHMiLCJjb2RlIiwiYXBpVXJsIiwicGF5bG9hZCIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwianNvbiIsInBvc3RUb0V4Y2hhbmdlQXBpVXJsIiwic2NvcGUiLCJ0aGVuIiwiZGF0YSIsInNldFJlc3BvbnNlU3RhdGUiLCJhY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsImVycm9yIiwiY2F0Y2giLCJlcnIiLCJtZXNzYWdlIiwiaXNMb2dnZWRJbiIsIndpbmRvdyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJsb2dPdXRPQXV0aFVzZXIiLCJyZW1vdmVJdGVtIiwiZ2V0QWNjZXNzVG9rZW4iLCJjcmVhdGVPQXV0aEhlYWRlcnMiLCJyZXNvdXJjZSIsInJlc291cmNlSGVhZGVycyIsInJlbW92ZU9BdXRoUXVlcnlQYXJhbXMiLCJjdXJyZW50TG9jYXRpb24iLCJkb2N1bWVudCIsImxvY2F0aW9uIiwiaHJlZiIsInNlYXJjaCIsImNsZWFuX3VyaSIsInN1YnN0cmluZyIsImluZGV4T2YiLCJoaXN0b3J5IiwicmVwbGFjZVN0YXRlIiwidGl0bGUiLCJHb29nbGVBUElDb25uZWN0aW9uU3RyaW5ncyIsInBhcmFtcyIsInNjb3Blc1N0ciIsInJlZGlyZWN0IiwiZSIsImdvb2dsZVJlZGlyZWN0VVJMIiwiUmVmZXJlbmNlRXJyb3IiLCJyZXBsYWNlIiwidGhpcyIsIl9nb29nbGVSZWRpcmVjdFVSTCIsImNyZWF0ZUF1dGhvcml6YXRpb25SZXF1ZXN0VVJMIiwidXJsIiwiYWNjZXNzVHlwZSIsImluY2x1ZGVHcmFudGVkU2NvcGVzIiwicmVzcG9uc2VUeXBlIiwic3RhdGUiLCJyZWRpcmVjdFVyaSIsImNsaWVudElkIiwiR09PR0xFX09BVVRIX0VORFBPSU5UIiwiY3JlYXRlU2NvcGVzIiwic2NvcGVzIiwic3RyIiwibWFwIiwibGVuZ3RoIiwiU0VSVkVSX1JFU1BPTlNFX1NUQVRFIiwiYnV0dG9uU3R5bGluZyIsImJhY2tncm91bmRTaXplIiwiYmFja2dyb3VuZFJlcGVhdCIsImJhY2tncm91bmRQb3NpdGlvbiIsInRleHRJbmRlbnQiLCJib3JkZXIiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwiYmFja2dyb3VuZENvbG9yIiwiZm9udFNpemUiLCJHb29nbGVBdXRoQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJHb29nbGVBdXRoUHJvdmlkZXIiLCJQcm92aWRlciIsIkdvb2dsZUF1dGhDb25zdW1lciIsIkNvbnN1bWVyIiwiSW5uZXJCdXR0b24iLCJwbGFjZWhvbGRlciIsImRlZmF1bHRTdHlsZSIsIm9wdGlvbnMiLCJkaXNwbGF5RXJyb3JzIiwiQXV0aG9yaXphdGlvbiIsImF1dGgiLCJzdHlsZXMiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJfZ2V0QmFja2dyb3VuZEltZyIsInVuZGVmaW5lZCIsImNvbnNvbGUiLCJzdHlsZSIsIm9uQ2xpY2siLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsIkdvb2dsZUJ1dHRvbiIsInRva2VuIiwiY2FsbGJhY2siLCJvYXV0aENvbnRleHQiLCJjdXJyZW50VXJsIiwiVVJMU2VhcmNoUGFyYW1zIiwicXVlcnlQYXJhbXNDb2RlIiwicXVlcnlQYXJhbXNFcnJvciIsIl9pbm5lciIsInJlc3BvbnNlU3RhdGUiLCJzZXRJdGVtIiwiZGVidWciLCJzZXRPQXV0aFN0YXRlIiwiZW1haWwiLCJjbGllbnRfaWQiLCJHb29nbGVBdXRoIiwiX3Byb3ZpZGVyUHJvcHMiLCJpc0F1dGhlbnRpY2F0ZWQiXSwibWFwcGluZ3MiOiIyQkFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUEwRGYsT0FyREFGLEVBQW9CUSxFQUFJRixFQUd4Qk4sRUFBb0JTLEVBQUlWLEVBR3hCQyxFQUFvQlUsRUFBSSxTQUFTUixFQUFTUyxFQUFNQyxHQUMzQ1osRUFBb0JhLEVBQUVYLEVBQVNTLElBQ2xDRyxPQUFPQyxlQUFlYixFQUFTUyxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVaLEVBQW9Ca0IsRUFBSSxTQUFTaEIsR0FDWCxvQkFBWGlCLFFBQTBCQSxPQUFPQyxhQUMxQ04sT0FBT0MsZUFBZWIsRUFBU2lCLE9BQU9DLFlBQWEsQ0FB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QWVULEdFd0p4Q04sUUFBUWdCLE1BQU0sdUNBQ29DLG1CQUF2Q1IsRUFBcUJTLGVBQzVCLHFCQUFVLFdBQ0xULEVBQXFCUyxlQUFjLE1BR3JDLEtBQ0osR0FBdUMsUUFBbEMsRUFBQVQsRUFBcUJNLHFCQUFhLGVBQUU1RixNQUU1QyxPQURBOEUsUUFBUTlFLE1BQU0sc0RBQXdGLFFBQXhGLEVBQXNEc0YsRUFBcUJNLHFCQUFhLGVBQUU1RixPQUFLLFdBQ3RHMkYsRUFDSixHQUFJRixJQUFvQnJGLElBQWMsQ0FFekMsSUFFTSxFQUF1QyxDQUN6QzRGLE1BSHFCVCxFQUFXOUgsSUFBSSxVQUFZLEdBSWhEaUMsTUFIcUI2RixFQUFXOUgsSUFBSSxVQUFZLEdBSWhEc0IsS0FBTTBHLEVBQ05RLFVBQVduSCxFQUFNd0YsUUFBUTNCLFNBQ3pCM0QsT0FBUUYsRUFBTUUsT0FDZDRHLGNBQWdCTixFQUFxQk0sY0FDckMvRixpQkFBbUJ5RixFQUFxQnpGLGtCQU81QyxPQUxBaUIsSUFDQSxxQkFBVSxXQUNOakMsRUFBZSxLQUNoQixJQUNIaUcsUUFBUWdCLE1BQU0sbUNBQ1BULEVBQVdBLElBQWEsa0RBQzVCLE9BQUlLLEdBQ1BaLFFBQVE5RSxNQUFNLDJDQUEyQzBGLEVBQWdCLFdBQ2xFQyxHQUdKQSxFQUdKLElBQU1PLEVBQWEsU0FBQ3BILEdBQ2pCLE1BQW9DLG1CQUErQm9FLEdBQWxFMEMsRUFBYSxLQUFFL0YsRUFBZ0IsS0FDaEMsRUFBbUMsbUJBQWtCTyxLQUNyRCtGLEVBQThCLENBQ2hDQyxnQkFGa0IsS0FHbEJMLGNBSGlDLEtBSWpDSCxjQUFhLEVBQ2IvRixpQkFBZ0IsR0FFcEIsT0FDSSxrQkFBQ2tFLEVBQWtCLENBQUNsRyxNQUFPc0ksR0FDdEJySCxFQUFNb0ciLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTsiLCIvKiogQGludGVybmFsICovXG5pbXBvcnQge0Rpc3BhdGNoLCBTZXRTdGF0ZUFjdGlvbn0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBheWxvYWQge1xuICAgIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgICByZWFkb25seSBzY29wZTogc3RyaW5nO1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXBpUmVzcG9uc2VEYXRhIHsgcmVhZG9ubHkgYWNjZXNzX3Rva2VuOiBzdHJpbmc7IH1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3N0VG9FeGNoYW5nZUFwaVVybChhcGlVcmw6IHN0cmluZywgcGF5bG9hZDogSVBheWxvYWQpOiBQcm9taXNlPElBcGlSZXNwb25zZURhdGE+IHtcbiAgICBjb25zdCByZXM6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYXBpVXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzLmpzb24oKTtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZlclJlc3BvbnNlU3RhdGUgeyByZWFkb25seSBhY2Nlc3NUb2tlbj86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmd9XG4vKiogQGludGVybmFsICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2ZXJSZXNwb25zZVByb3BzIHtcbiAgICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbiAgICByZWFkb25seSBhcGlVcmw6IHN0cmluZztcbiAgICBzZXRSZXNwb25zZVN0YXRlOiBEaXNwYXRjaDxTZXRTdGF0ZUFjdGlvbjxJU2VydmVyUmVzcG9uc2VTdGF0ZT4+O1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlclJlc3BvbnNlKHByb3BzOiBJU2VydmVyUmVzcG9uc2VQcm9wcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29kZSwgYXBpVXJsLCBzY29wZSB9ID0gcHJvcHM7XG4gICAgY29uc3QgcGF5bG9hZDogSVBheWxvYWQgPSB7IGNvZGUsIHNjb3BlIH07XG4gICAgcG9zdFRvRXhjaGFuZ2VBcGlVcmwoYXBpVXJsLCBwYXlsb2FkKVxuICAgICAgICAudGhlbigoZGF0YTogSUFwaVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgLy8gdXBkYXRlIHJlc3BvbnNlU3RhdGUgYWNjZXNzVG9rZW5cbiAgICAgICAgICAgIGlmKCEoXCJhY2Nlc3NfdG9rZW5cIiBpbiBkYXRhKSkge1xuICAgICAgICAgICAgICAgIHByb3BzLnNldFJlc3BvbnNlU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogXCJzbyBhY2Nlc3NfdG9rZW4gaW4gcmVzcG9uc2UgZGF0YSFcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuc2V0UmVzcG9uc2VTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHByb3BzLnNldFJlc3BvbnNlU3RhdGUoe1xuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlQWNjZXNzVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2Nlc3NUb2tlblwiLCB0b2tlbik7XG59XG5cbi8qKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogIGlmKGlzTG9nZ2VkSW4oKSkgeyAvLyByZXR1cm5zIHRydWUgaXMgYWNjZXNzVG9rZW4gZXhpc3RzIGluIExvY2FsU3RvcmFnZVxuICogICAgICAvLyB1c2VyIGxvZ2dlZCBjb2RlLi4uXG4gKiAgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvZ2dlZEluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc1Rva2VuXCIpO1xufVxuXG4vKipcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqICBsb2dPdXRPQXV0aFVzZXIoKSAvLyByZW1vdmVzIHRoZSBhY2Nlc3NUb2tlbiBmcm9tIExvY2FsU3RvcmFnZVxuICogYGBgXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ091dE9BdXRoVXNlcigpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2Nlc3NUb2tlblwiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBzdG9yZWQgYWNjZXNzVG9rZW5cbiAqIEByZXR1cm4gVGhlIEFjY2VzcyBUb2tlbiBvciBub25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzVG9rZW5cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdhcm5pbmc6IFBsZWFzZSBtYWtlIHN1cmUgdGhhdCBhcyBvZiB2ZXJzaW9uIGAwLjAuMjNgIHdlIGhhdmUgcmVtb3ZlZFxuICogdGhlIGBhcHBsaWNhdGlvbi9qc29uYCBjb250ZW50IHR5cGUgaGVhZGVycyBmcm9tIHRoaXMgZnVuY3Rpb24uIFRoaXMgbWF5IGNhdXNlIGFuIGlzc3VlXG4gKiBpZiB5b3Ugb3JpZ2luYWxseSBkaWRuJ3QgY29uc3RydWN0IHlvdXIgcmVxdWVzdCBjb250ZW50IHR5cGUgaGVhZGVycyB3aXRoIGBhcHBsaWNhdGlvbi9qc29uYC5cbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqICBmZXRjaCh1cmwsIHtcbiAqICAgICAgaGVhZGVyczogY3JlYXRlT0F1dGhIZWFkZXJzKCksXG4gKiAgfSlcbiAqIGBgYFxuICpcbiAqIElmIHlvdSByZXF1aXJlIHlvdXIgc2VydmVyIHRvIGhhbmRsZSBhdXRoZW50aWNhdGluZyBtdWx0aXBsZSB1c2VycyBhY3Jvc3MgbWFueSByZXNvdXJjZXNcbiAqIChvciB0YWJsZXMpIHRoZW4gcGFzcyBpbiB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UsIGZvciBFeGFtcGxlOlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogIGZldGNoKHVybCwge1xuICogICAgICBoZWFkZXJzOiBjcmVhdGVPQXV0aEhlYWRlcnMoXCJ1c2Vyc1wiKSxcbiAqICB9KVxuICogYGBgXG4gKlxuICogIFdpdGggdGhlIHJlc291cmNlIHZhbHVlLCB0aGUgZm9sbG93aW5nIGhlYWRlcnMgYXJlIGNvbnN0cnVjdGVkOlxuICpcbiAqICBAZXhhbXBsZVxuICogIGBgYFxuICogIHtcbiAqICAgIFwiWC1BdXRoLVRva2VuXCIgOiBcIjxUT0tFTj5cIixcbiAqICAgIFwiWC1BdXRoLVJlc291cmNlXCI6IFwidXNlcnNcIixcbiAqICB9XG4gKiAgYGBgXG4gKiBAcGFyYW0gcmVzb3VyY2UgT3B0aW9uYWwgcmVzb3VyY2UgbmFtZSB0byBsb29rIHVwIG9uIHRoZSBzZXJ2ZXJcbiAqIEByZXR1cm4gT2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT0F1dGhIZWFkZXJzKHJlc291cmNlPzogc3RyaW5nKTogT2JqZWN0IHtcbiAgICBsZXQgcmVzb3VyY2VIZWFkZXJzID0ge307XG4gICAgaWYocmVzb3VyY2UpIHtcbiAgICAgICAgcmVzb3VyY2VIZWFkZXJzID0ge1xuICAgICAgICAgICAgXCJYLUF1dGgtUmVzb3VyY2VcIjogcmVzb3VyY2UsXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucmVzb3VyY2VIZWFkZXJzLFxuICAgICAgICBcIlgtQXV0aC1Ub2tlblwiOiBgQmVhcmVyICR7Z2V0QWNjZXNzVG9rZW4oKX1gLFxuICAgIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9BdXRoUXVlcnlQYXJhbXMoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjtcbiAgICBpZihkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgY29uc3QgY2xlYW5fdXJpID0gY3VycmVudExvY2F0aW9uLnN1YnN0cmluZygwLCBjdXJyZW50TG9jYXRpb24uaW5kZXhPZihcIj9cIikpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCBjbGVhbl91cmkpO1xuICAgIH1cbn1cbiIsIi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIEdvb2dsZUFQSUNvbm5lY3Rpb25TdHJpbmdzIHtcbiAgICBHT09HTEVfT0FVVEhfRU5EUE9JTlQgPSBcImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi92Mi9hdXRoXCIsXG59XG4vKiogQHB1YmxpYyAqL1xuaW50ZXJmYWNlIElBdXRob3JpemF0aW9uQmFzZSB7XG4gICAgLyoqIFRoaXMgaXMgeW91ciBjbGllbnQgSUQgKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuICAgIC8qKiBXaGVyZSB5b3UgUmVhY3QgYXBwIHNob3VsZCByZWRpcmVjdCB0byBpZiB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbG9nZ2VkIGluICoqL1xuICAgIHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gICAgLyoqIEJ5IGRlZmF1bHQgdGhpcyBpcyBzZXQgdG8gKmNvZGUqICovXG4gICAgcmVzcG9uc2VUeXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgYXBpICoqYXBpVXJsKioge0BsaW5rIElHb29nbGVCdXR0b259IGNhbiByZWZyZXNoIHRva2VucyBvbiB0aGUgdXNlcidzXG4gICAgICogYmVoYWxmLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAqb25saW5lKiBidXQgaWYgeW91ciBiYWNrZW5kIGFwaSB3aWxsIHJlZnJlc2ggdGhlIHRva2VuIHRoZW5cbiAgICAgKiB5b3UgbXVzdCBwYXNzIGluIGEgc3RyaW5nIHZhbHVlIG9mICpvZmZsaW5lKiAoVGhpcyBpcyByZWNvbW1lbmRlZCBmb3IgcmVhY3QgYXBwcyBjb25uZWN0ZWRcbiAgICAgKiB0byBhIFJFU1QgYXBpIGJhY2tlbmQpLlxuICAgICAqL1xuICAgIGFjY2Vzc1R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBvcHRpb24gaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIGJ1dCB3aWxsIGJlIGluIGEgYWRkZWQgaW4gYSBmdXR1cmUgdmVyc2lvbixcbiAgICAgKiBUT0RPIC0gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb2VnYXNld2ljei9yZWFjdC1nb29nbGUtb2F1dGgyLjAvaXNzdWVzLzNcbiAgICAgKiAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlZmF1bHRlZCB0byB0cnVlLiBBbnkgZXh0cmEgc2NvcGVzIHRoZSBsb2dnZWQgaW4gdXNlciBwcmV2aW91c2x5IGdyYW50ZWRcbiAgICAgKiB3aWxsIGJlIGF2YWlsYWJsZSB3aXRoaW4gdGhlIG5ldyBhY2Nlc3MgdG9rZW4uXG4gICAgICogKi9cbiAgICBpbmNsdWRlR3JhbnRlZFNjb3Blcz86IGJvb2xlYW47XG4gICAgLyoqIE5vdCByZXF1aXJlZCwgb3B0aW9uYWwuIEZvciBwcmVmaWxsaW5nIGVtYWlsIGZpZWxkcyBldGMuICovXG4gICAgbG9naW5IaW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE5vdCByZXF1aXJlZCwgb3B0aW9uYWwuIEEgc3BhY2UtZGVsaW1pdGVkLCBjYXNlLXNlbnNpdGl2ZSBsaXN0IG9mIHByb21wdHMgdG9cbiAgICAgKiBwcmVzZW50IHRoZSB1c2VyLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZFxuICAgICAqIG9ubHkgdGhlIGZpcnN0IHRpbWUgeW91ciBwcm9qZWN0IHJlcXVlc3RzIGFjY2Vzcy5cbiAgICAgKiAqL1xuICAgIHByb21wdD86IHN0cmluZztcbn1cbi8qKiBAcHVibGljICovXG5leHBvcnQgaW50ZXJmYWNlIElBdXRob3JpemF0aW9uT3B0aW9ucyBleHRlbmRzIElBdXRob3JpemF0aW9uQmFzZSB7XG4gICAgc2NvcGVzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXV0aG9yaXphdGlvbiB7XG4gICAgcGFyYW1zOiBJQXV0aG9yaXphdGlvbk9wdGlvbnM7XG4gICAgLyoqIFNldCB0byAgYFtcIm9wZW5pZFwiLCBcInByb2ZpbGVcIl1gIGJ5IGRlZmF1bHQgKiovXG4gICAgc2NvcGVzU3RyOiBzdHJpbmc7XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbiBpbXBsZW1lbnRzIElBdXRob3JpemF0aW9uIHtcblxuICAgIHByaXZhdGUgX2dvb2dsZVJlZGlyZWN0VVJMPzogc3RyaW5nO1xuXG4gICAgcHVibGljIHBhcmFtczogSUF1dGhvcml6YXRpb25PcHRpb25zO1xuXG4gICAgcHVibGljIHNjb3Blc1N0cjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocGFyYW1zOiBJQXV0aG9yaXphdGlvbk9wdGlvbnMsIHNjb3Blc1N0cjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgICAgICB0aGlzLnNjb3Blc1N0ciA9IHNjb3Blc1N0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBAcHJvcGVydHkgZ29vZ2xlUmVkaXJlY3RVUkwgQWNjZXNzIHRoZSB1cmwgZm9yIHRoZSBpbml0aWFsXG4gICAgICogYnJvd3NlciBjYWxsIHRvIEdvb2dsZSdzIE9BdXRoIDIuMCBzZXJ2ZXIuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ29vZ2xlUmVkaXJlY3RVUkwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nb29nbGVSZWRpcmVjdFVSTDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGdvb2dsZVJlZGlyZWN0VVJMKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fZ29vZ2xlUmVkaXJlY3RVUkwgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIGNyZWF0ZUF1dGhvcml6YXRpb25SZXF1ZXN0VVJMKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBhY2Nlc3NUeXBlID0gXCJvZmZsaW5lXCIsXG4gICAgICAgICAgICBpbmNsdWRlR3JhbnRlZFNjb3BlcyA9IHRydWUsXG4gICAgICAgICAgICByZXNwb25zZVR5cGUgPSBcImNvZGVcIixcbiAgICAgICAgICAgIHN0YXRlID0gbnVsbCxcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpLFxuICAgICAgICAgICAgY2xpZW50SWQsXG4gICAgICAgIH0gPSB0aGlzLnBhcmFtcztcbiAgICAgICAgY29uc3QgZG9tYWluID0gR29vZ2xlQVBJQ29ubmVjdGlvblN0cmluZ3MuR09PR0xFX09BVVRIX0VORFBPSU5UO1xuICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICAgIHVybCA9IGAke2RvbWFpbn0/c2NvcGU9JHt0aGlzLnNjb3Blc1N0cn0mYDtcbiAgICAgICAgdXJsID0gYWNjZXNzVHlwZSA/IGAke3VybH1hY2Nlc3NfdHlwZT0ke2FjY2Vzc1R5cGV9JmAgOiB1cmw7XG4gICAgICAgIHVybCA9IGAke3VybH1pbmNsdWRlX2dyYW50ZWRfc2NvcGVzPSR7aW5jbHVkZUdyYW50ZWRTY29wZXN9JmA7XG4gICAgICAgIHVybCA9IGAke3VybH1yZXNwb25zZV90eXBlPSR7cmVzcG9uc2VUeXBlfSZgO1xuICAgICAgICB1cmwgPSBzdGF0ZSA/IGAke3VybH1zdGF0ZT0ke3N0YXRlfSZgIDogdXJsO1xuICAgICAgICB1cmwgPSBgJHt1cmx9cmVkaXJlY3RfdXJpPSR7cmVkaXJlY3RVcml9JmA7XG4gICAgICAgIHVybCA9IGAke3VybH1jbGllbnRfaWQ9JHtjbGllbnRJZH1gO1xuICAgICAgICB0aGlzLmdvb2dsZVJlZGlyZWN0VVJMID0gdXJsO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVNjb3BlcyhzY29wZXM6IEFycmF5PHN0cmluZz4pOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3RyID0gXCJcIjtcbiAgICAgICAgc2NvcGVzLm1hcCgoc2NvcGUsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChzY29wZXMubGVuZ3RoIC0gMSA9PT0gaSkge1xuICAgICAgICAgICAgICAgIHN0ciArPSBgJHtzY29wZX1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gYCR7c2NvcGV9JTIwYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWRpcmVjdCA9IChlOiBhbnkpOiB2b2lkID0+IHtcbiAgICAgICAgaWYodGhpcy5nb29nbGVSZWRpcmVjdFVSTCkge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodGhpcy5nb29nbGVSZWRpcmVjdFVSTClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcIkVycm9yIGNyZWF0aW5nIHJlZGlyZWN0IHVybCB0byBHb29nbGUncyBhdXRob3JpemF0aW9uIHNlcnZlclwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQge2RlZmF1bHQgYXMgUmVhY3QsIERpc3BhdGNoLCBTZXRTdGF0ZUFjdGlvbiwgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICAgIEF1dGhvcml6YXRpb24sXG4gICAgSUF1dGhvcml6YXRpb25PcHRpb25zLFxufSBmcm9tIFwiLi9hdXRob3JpemF0aW9uXCI7XG5pbXBvcnQge1xuICAgIHNlcnZlclJlc3BvbnNlLFxuICAgIHN0b3JlQWNjZXNzVG9rZW4sXG4gICAgaXNMb2dnZWRJbixcbiAgICByZW1vdmVPQXV0aFF1ZXJ5UGFyYW1zLCBJU2VydmVyUmVzcG9uc2VTdGF0ZSwgSVNlcnZlclJlc3BvbnNlUHJvcHMsXG59IGZyb20gXCIuL2FwaVV0aWxzXCI7XG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgaW50ZXJmYWNlIElHb29nbGVCdXR0b24ge1xuICAgIC8qKiBQbGFjZWhvbGRlciBpbWFnZSBkaXNwbGF5ZWQgbmV4dCB0byBidXR0b24gdGV4dC4gVGhlIHBsYWNlaG9sZGVyIHByb3AgaGFzIG5vIGVmZmVjdCBpZiBwbGFjZWhvbGRlciBpcyBzZXQgdG8gZmFsc2UgKi9cbiAgICByZWFkb25seSBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICAvKiogUmVtb3ZlIGRlZmF1bHQgc3R5bGVzLlxuICAgICAqICBUbyBTdHlsZSB0aGUgPGJ1dHRvbj4gZWxlbWVudCB3aXRoIENTUywgdXNlIGBnb29nbGUtb2F1dGgtYnRuYC4gRm9yIGV4YW1wbGU6XG4gICAgICogIGBgYFxuICAgICAqICAuZ29vZ2xlLW9hdXRoLWJ0biB7XG4gICAgICogICAgICBjb2xvcjogcmVkO1xuICAgICAqICAgICAgYmFja2dyb3VuZC1jb2xvcjogbGltZTtcbiAgICAgKiAgfVxuICAgICAqICBgYGBcbiAgICAgKiAoeW91IGNhbiBhbHNvIHBhc3MgeW91ciBjc3Mgc2VsZWN0b3JzIGRpcmVjdGx5IHdpdGggUmVhY3RzJyBgY2xhc3NOYW1lYCBwcm9wKVxuICAgICAqICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdFN0eWxlPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIElBdXRob3JpemF0aW9uUmVxdWVzdFBhcmFtcyAqL1xuICAgIHJlYWRvbmx5IG9wdGlvbnM6IElBdXRob3JpemF0aW9uT3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHlcbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKiBBIFJlYWN0IGNvbXBvbmVudCBvciBhbnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgUmVhY3QgY29tcG9uZW50LlxuICAgICAqIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgdXNlZCB0byBkaXNwbGF5IGEgcHJlbG9hZGVyIHRvIHRoZSB1c2VyIHdoaWxzdFxuICAgICAqIHRoZSBPQXV0aDIuMCBsb2dpbiBzdHJhdGVneSBpcyBpbiBmbGlnaHQuIEJ5IGRlZmF1bHQgYSBgTG9hZGluZy4uLmBcbiAgICAgKiBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogPEdvb2dsZUJ1dHRvblxuICAgICAqICAgIGNhbGxiYWNrPXsoKSA9PiA8PlwiTG9hZGluZy4uLlwiPC8+fVxuICAgICAqICAgIC8vIG90aGVyIHByb3BzLi4uXG4gICAgICogLz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWFkb25seSBjYWxsYmFjaz86ICgpID0+IFJlYWN0LlJlYWN0SFRNTEVsZW1lbnQ8YW55PjtcbiAgICAvKiogVGhlIHVybCBvZiB0aGUgYXBpIHRvIHBlcmZvcm0gdGhlIGV4Y2hhbmdlICovXG4gICAgcmVhZG9ubHkgYXBpVXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwuIERlZmF1bHQgc2V0IHRvIGZhbHNlLlxuICAgICAqIERpc3BsYXkgYW4gZXJyb3IgdG8gdGhlIHVzZXIgKHdpbGwgYmUgZGlzcGxheWVkIGluIGEgY2hpbGQgYGRpdmAgZWxlbWVudCkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGlzcGxheUVycm9ycz86IGJvb2xlYW47XG59XG4vKiogQGludGVybmFsICovXG50eXBlIFR5cGVCdXR0b25TdHlsZXMgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuLyoqIEBpbnRlcm5hbCAqL1xudHlwZSBUeXBlR29vZ2xlQnV0dG9uID0gSUdvb2dsZUJ1dHRvbiAmIFJlYWN0LkJ1dHRvbkhUTUxBdHRyaWJ1dGVzPEhUTUxCdXR0b25FbGVtZW50Pjtcbi8qKiBAaW50ZXJuYWwgKi9cbmludGVyZmFjZSBJU2VydmVyUmVzcG9uc2Uge1xuICAgIHJlYWRvbmx5IGVtYWlsPzogc3RyaW5nO1xuICAgIGVycm9yPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgICByZWFkb25seSBzY29wZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNsaWVudF9pZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGFwaVVybDogc3RyaW5nO1xuICAgIHJlc3BvbnNlU3RhdGU6IElTZXJ2ZXJSZXNwb25zZVN0YXRlO1xuICAgIHNldFJlc3BvbnNlU3RhdGU6IERpc3BhdGNoPFNldFN0YXRlQWN0aW9uPElTZXJ2ZXJSZXNwb25zZVN0YXRlPj47XG59XG4vKiogQGludGVybmFsICovXG5jb25zdCBTRVJWRVJfUkVTUE9OU0VfU1RBVEUgPSB7IH07XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IGJ1dHRvblN0eWxpbmc6IFR5cGVCdXR0b25TdHlsZXMgPSB7XG4gICAgYmFja2dyb3VuZFNpemU6IFwiMjBweCAyMHB4XCIsXG4gICAgYmFja2dyb3VuZFJlcGVhdDogXCJuby1yZXBlYXRcIixcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFwiMTJweCAxMHB4XCIsXG4gICAgdGV4dEluZGVudDogXCIxOXB4XCIsXG4gICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjYmRjM2M3XCIsXG4gICAgcGFkZGluZzogXCI5cHggMjNweFwiLFxuICAgIGJvcmRlclJhZGl1czogXCI5cHhcIixcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2JkYzNjN1wiLFxuICAgIGZvbnRTaXplOiBcIjE4cHhcIixcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9BdXRoU3RhdGUge1xuICAgIGlzQXV0aGVudGljYXRlZD86IGJvb2xlYW47XG4gICAgc2V0T0F1dGhTdGF0ZT86IEZ1bmN0aW9uO1xuICAgIHJlc3BvbnNlU3RhdGU/OiBJU2VydmVyUmVzcG9uc2VTdGF0ZTtcbiAgICAvKipcbiAgICAgKiBgYGBcbiAgICAgKiAgICBpbXBvcnQge1xuICAgICAqICAgICAgIHJlc3BvbnNlU3RhdGVcbiAgICAgKiAgIH0gZnJvbSBcInJlYWN0LWdvb2dsZS1vYXV0aDJcIjtcbiAgICAgKlxuICAgICAqICAgPEdvb2dsZUF1dGg+XG4gICAgICogICB7KHtyZXNwb25zZVN0YXRlfSkgPT4ge1xuICAgICAqICAgICAgIC8vIGFjY2VzcyB0aGUgdG9rZW4gZnJvbSB0aGUgc3RhdGVcbiAgICAgKiAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZVN0YXRlLmFjY2Vzc1Rva2VuKSAvLyA8QUNDRVNTX1RPS0VOPlxuICAgICAqICAgfX1cbiAgICAgKiAgIDwvR29vZ2xlQXV0aD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZXRSZXNwb25zZVN0YXRlPzogRGlzcGF0Y2g8U2V0U3RhdGVBY3Rpb248SVNlcnZlclJlc3BvbnNlU3RhdGU+Pjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IEdvb2dsZUF1dGhDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dDxJT0F1dGhTdGF0ZT4oe30pO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IEdvb2dsZUF1dGhQcm92aWRlciA9IEdvb2dsZUF1dGhDb250ZXh0LlByb3ZpZGVyO1xuLyoqXG4gKiBAZXhhbXBsZVxuICogR2V0IG5vdGlmaWVkIHdoZW4gYSB1c2VyIGhhcyBsb2dnZWQgaW4gc3VjY2Vzc2Z1bGx5IGJ5IHdyYXBwaW5nIHRoZSBHb29nbGVCdXR0b25cbiAqIGNvbXBvbmVudCB3aXRoaW4gdGhlIEdvb2dsZUF1dGggcHJvdmlkZXIuIEZvciBleGFtcGxlOlxuICogYGBgXG4gKiAgICBpbXBvcnQge1xuICogICAgICAgR29vZ2xlQXV0aFxuICogICB9IGZyb20gXCJyZWFjdC1nb29nbGUtb2F1dGgyXCI7XG4gKlxuICogICA8R29vZ2xlQXV0aD5cbiAqICAgeyh7aXNBdXRoZW50aWNhdGVkfSkgPT4ge1xuICogICAgICAgLy8gaXNBdXRoZW50aWNhdGVkIHdpbGwgZ2V0IHNldCB0byB0cnVlIHdoZW4gYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbG9nZ2VkIGluLlxuICogICAgICAgY29uc29sZS5sb2coXCJ2YWx1ZTogXCIsIGlzQXV0aGVudGljYXRlZCk7IC8vIHZhbHVlOiB0cnVlIG9yIGZhbHNlXG4gKiAgICAgICByZXR1cm4gPEdvb2dsZUJ1dHRvblxuICogICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMuLi5cbiAqICAgICAgICAgICAgICAgLz5cbiAqICAgfX1cbiAqICAgPC9Hb29nbGVBdXRoPlxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBHb29nbGVBdXRoQ29uc3VtZXIgPSBHb29nbGVBdXRoQ29udGV4dC5Db25zdW1lcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IF9nZXRCYWNrZ3JvdW5kSW1nID0gKHBsYWNlaG9sZGVyOiBzdHJpbmcsIHN0eWxlczogVHlwZUJ1dHRvblN0eWxlcyk6IFR5cGVCdXR0b25TdHlsZXMgPT4ge1xuICAgIGlmKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnN0eWxlcywgYmFja2dyb3VuZEltYWdlOiBgdXJsKCR7cGxhY2Vob2xkZXJ9KWAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlcztcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuaW50ZXJmYWNlIElJbm5lckJ1dHRvblByb3BzIGV4dGVuZHMgSUdvb2dsZUJ1dHRvbiB7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgSW5uZXJCdXR0b24gPSAocHJvcHM6IElJbm5lckJ1dHRvblByb3BzICYgUmVhY3QuQnV0dG9uSFRNTEF0dHJpYnV0ZXM8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICBwbGFjZWhvbGRlciA9IFwiXCIsXG4gICAgICAgIGRlZmF1bHRTdHlsZSA9IHRydWUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGRpc3BsYXlFcnJvcnMgPSBmYWxzZSxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBzY29wZXMgPSBBdXRob3JpemF0aW9uLmNyZWF0ZVNjb3BlcyhvcHRpb25zLnNjb3Blcyk7XG4gICAgY29uc3QgYXV0aCA9IG5ldyBBdXRob3JpemF0aW9uKG9wdGlvbnMsIHNjb3Blcyk7XG4gICAgYXV0aC5jcmVhdGVBdXRob3JpemF0aW9uUmVxdWVzdFVSTCgpO1xuXG4gICAgY29uc3Qgc3R5bGVzID0gZGVmYXVsdFN0eWxlID8gX2dldEJhY2tncm91bmRJbWcocGxhY2Vob2xkZXIsIGJ1dHRvblN0eWxpbmcpIDogdW5kZWZpbmVkO1xuICAgIGlmKHByb3BzLmVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtSZWFjdC1Hb29nbGUtT0F1dGgyXSBFcnJvcjogJHtwcm9wcy5lcnJvcn1cbiAgICAgICAgIC0gVG8gZGlzcGxheSB0aGUgZXJyb3IgdG8gdGhlIHVzZXIsIHNldCBJR29vZ2xlUHJvcHMgZGlzcGxheUVycm9ycyB0byB0cnVlLlxuICAgICAgICAgU2VlIGh0dHBzOi8vam9lZ2FzZXdpY3ouZ2l0aHViLmlvL3JlYWN0LWdvb2dsZS1vYXV0aDIuMC9gKTtcbiAgICB9XG4gICAgcmVtb3ZlT0F1dGhRdWVyeVBhcmFtcygpO1xuICAgIHJldHVybiA8PlxuICAgICAgICA8YnV0dG9uIHN0eWxlPXtzdHlsZXN9IG9uQ2xpY2s9e2F1dGgucmVkaXJlY3R9IGNsYXNzTmFtZT17YCR7cHJvcHMuY2xhc3NOYW1lfSBnb29nbGUtb2F1dGgtYnRuYH0+e3Byb3BzLmNoaWxkcmVufTwvYnV0dG9uPlxuICAgICAgICB7KGRpc3BsYXlFcnJvcnMgJiYgcHJvcHMuZXJyb3IpICYmIDxkaXY+e3Byb3BzLmVycm9yfTwvZGl2Pn1cbiAgICA8Lz5cbn1cbi8qKlxuICogQGV4YW1wbGVcbiAqICoqUXVpY2sgU3RhcnQ6KipcbiAqXG4gKiBGaXJzdCBjcmVhdGUgYW4gb3B0aW9ucyBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGFuIHtAbGluayAgSUF1dGhvcml6YXRpb25PcHRpb25zfSB0eXBlLlxuICogQ2hlY2sgdGhlIHtAbGluayAgSUF1dGhvcml6YXRpb25PcHRpb25zfSBhbmQge0BsaW5rICBJQXV0aG9yaXphdGlvbkJhc2V9IHR5cGVzIGZvclxuICogYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMuIFRoZW4sIHBhc3MgdGhlIG9wdGlvbnMgdG8gdGhlIHtAbGluayBHb29nbGVCdXR0b259IGNvbXBvbmVudC5cbiAqXG4gKiBgYGBJQXV0aG9yaXphdGlvbk9wdGlvbnNcbiAqICBjb25zdCBvcHRpb25zOiAgPSB7XG4gKiAgICAgIGNsaWVudElkOiAocHJvY2Vzcy5lbnYuQ0xJRU5UX0lEIGFzIHN0cmluZyksXG4gKiAgICAgICByZWRpcmVjdFVyaTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIixcbiAqICAgICAgIHNjb3BlczogW1wib3BlbmlkXCIsIFwicHJvZmlsZVwiLCBcImVtYWlsXCJdLFxuICogICAgICAgaW5jbHVkZUdyYW50ZWRTY29wZXM6IHRydWUsXG4gKiAgICAgICBhY2Nlc3NUeXBlOiBcIm9mZmxpbmVcIixcbiAqICAgfTtcbiAqXG4gKiAgIDxHb29nbGVCdXR0b25cbiAqICAgICAgICAgcGxhY2Vob2xkZXI9XCJkZW1vL3NlYXJjaC5wbmdcIlxuICogICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICogICAgICAgICBhcGlVcmw9XCJodHRwOi8vbG9jYWxob3N0OjUwMDAvZ29vZ2xlX2xvZ2luXCJcbiAqICAgLz5cbiAqIGBgYFxuICogQHBhcmFtIHByb3BzIHNlZSBJR29vZ2xlQnV0dG9uXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdvb2dsZUJ1dHRvbihwcm9wczogVHlwZUdvb2dsZUJ1dHRvbikge1xuICAgIGNvbnN0IHtjYWxsYmFja30gPSBwcm9wcztcbiAgICBjb25zdCBvYXV0aENvbnRleHQgPSB1c2VDb250ZXh0PElPQXV0aFN0YXRlPihHb29nbGVBdXRoQ29udGV4dCk7XG4gICAgY29uc3QgY3VycmVudFVybCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgY29uc3QgcXVlcnlQYXJhbXNDb2RlID0gY3VycmVudFVybC5nZXQoXCJjb2RlXCIpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zRXJyb3IgPSBjdXJyZW50VXJsLmdldChcImVycm9yXCIpO1xuICAgIGxldCBfaW5uZXIgPVxuICAgICAgICA8SW5uZXJCdXR0b25cbiAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtwcm9wcy5wbGFjZWhvbGRlcn1cbiAgICAgICAgICAgIGVycm9yPXsob2F1dGhDb250ZXh0IGFzIGFueSkucmVzcG9uc2VTdGF0ZT8uZXJyb3J9XG4gICAgICAgICAgICBvcHRpb25zPXtwcm9wcy5vcHRpb25zfVxuICAgICAgICAvPjtcbiAgICBpZiAoKG9hdXRoQ29udGV4dCBhcyBhbnkpLnJlc3BvbnNlU3RhdGU/LmFjY2Vzc1Rva2VuICYmICFpc0xvZ2dlZEluKCkpIHtcbiAgICAgICAgc3RvcmVBY2Nlc3NUb2tlbigob2F1dGhDb250ZXh0IGFzIGFueSkucmVzcG9uc2VTdGF0ZS5hY2Nlc3NUb2tlbik7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJgYWNjZXNzVG9rZW5gIHNldCBpbiBsb2NhbCBzdG9yYWdlLlwiKTtcbiAgICAgICAgaWYodHlwZW9mIChvYXV0aENvbnRleHQgYXMgYW55KS5zZXRPQXV0aFN0YXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgKG9hdXRoQ29udGV4dCBhcyBhbnkpLnNldE9BdXRoU3RhdGUodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKChvYXV0aENvbnRleHQgYXMgYW55KS5yZXNwb25zZVN0YXRlPy5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbUmVhY3QtR29vZ2xlLU9BdXRoMl0gRXJyb3I6IEFwaSBjYWxsIGZhaWxlZCB3aXRoICR7KG9hdXRoQ29udGV4dCBhcyBhbnkpLnJlc3BvbnNlU3RhdGU/LmVycm9yfSBlcnJvci5gKTtcbiAgICAgICAgcmV0dXJuIF9pbm5lcjtcbiAgICB9IGVsc2UgaWYgKHF1ZXJ5UGFyYW1zQ29kZSAmJiAhaXNMb2dnZWRJbigpKSB7XG4gICAgICAgIC8vIEdldCByZXN0IG9mIHBhcmFtc1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtc0VtYWlsID0gY3VycmVudFVybC5nZXQoXCJlbWFpbFwiKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtc1Njb3BlID0gY3VycmVudFVybC5nZXQoXCJzY29wZVwiKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZVByb3BzOiBJU2VydmVyUmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBlbWFpbDogcXVlcnlQYXJhbXNFbWFpbCxcbiAgICAgICAgICAgIHNjb3BlOiBxdWVyeVBhcmFtc1Njb3BlLFxuICAgICAgICAgICAgY29kZTogcXVlcnlQYXJhbXNDb2RlLFxuICAgICAgICAgICAgY2xpZW50X2lkOiBwcm9wcy5vcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgICAgYXBpVXJsOiBwcm9wcy5hcGlVcmwsXG4gICAgICAgICAgICByZXNwb25zZVN0YXRlOiAob2F1dGhDb250ZXh0IGFzIGFueSkucmVzcG9uc2VTdGF0ZSxcbiAgICAgICAgICAgIHNldFJlc3BvbnNlU3RhdGU6IChvYXV0aENvbnRleHQgYXMgYW55KS5zZXRSZXNwb25zZVN0YXRlLFxuICAgICAgICB9O1xuICAgICAgICByZW1vdmVPQXV0aFF1ZXJ5UGFyYW1zKCk7XG4gICAgICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBzZXJ2ZXJSZXNwb25zZShzZXJ2ZXJSZXNwb25zZVByb3BzKTtcbiAgICAgICAgfSwgW10pO1xuICAgICAgICBjb25zb2xlLmRlYnVnKFwiV2FpdGluZyBmb3IgcmVtb3RlIGFwaSByZXNwb25zZVwiKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soKSA6IDw+TG9hZGluZy4uLjwvPjtcbiAgICB9IGVsc2UgaWYgKHF1ZXJ5UGFyYW1zRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEdvb2dsZSBsb2dpbiBhdHRlbXB0IGZhaWxlZCB3aXRoICR7cXVlcnlQYXJhbXNFcnJvcn0gZXJyb3IuYClcbiAgICAgICAgcmV0dXJuIF9pbm5lcjtcbiAgICB9XG4gICAgLy8gRGlzcGxheSBidXR0b24gd2l0aCBubyBlcnJvcnNcbiAgICByZXR1cm4gX2lubmVyO1xufVxuXG5leHBvcnQgY29uc3QgR29vZ2xlQXV0aCA9IChwcm9wczogYW55KSA9PiB7XG4gICAgY29uc3QgW3Jlc3BvbnNlU3RhdGUsIHNldFJlc3BvbnNlU3RhdGVdID0gdXNlU3RhdGU8SVNlcnZlclJlc3BvbnNlU3RhdGU+KFNFUlZFUl9SRVNQT05TRV9TVEFURSk7XG4gICAgY29uc3QgW2lzQXV0aGVudGljYXRlZCwgc2V0T0F1dGhTdGF0ZV0gPSB1c2VTdGF0ZTxib29sZWFuPihpc0xvZ2dlZEluKCkpO1xuICAgIGNvbnN0IF9wcm92aWRlclByb3BzOiBJT0F1dGhTdGF0ZSA9IHtcbiAgICAgICAgaXNBdXRoZW50aWNhdGVkLFxuICAgICAgICBzZXRPQXV0aFN0YXRlLFxuICAgICAgICByZXNwb25zZVN0YXRlLFxuICAgICAgICBzZXRSZXNwb25zZVN0YXRlLFxuICAgIH07XG4gICAgcmV0dXJuICAoXG4gICAgICAgIDxHb29nbGVBdXRoUHJvdmlkZXIgdmFsdWU9e19wcm92aWRlclByb3BzfT5cbiAgICAgICAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICAgICAgPC9Hb29nbGVBdXRoUHJvdmlkZXI+XG4gICAgKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9
module.exports=function(e){var t={};function o(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,o),r.l=!0,r.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},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 n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)o.d(n,r,function(t){return e[t]}.bind(null,r));return n},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){e.exports=require("react")},function(e,t,o){"use strict";o.r(t),o.d(t,"GoogleButton",(function(){return R})),o.d(t,"isLoggedIn",(function(){return a})),o.d(t,"logOutOAuthUser",(function(){return s})),o.d(t,"createOAuthHeaders",(function(){return l})),o.d(t,"GoogleAuth",(function(){return x})),o.d(t,"GoogleAuthConsumer",(function(){return S})),o.d(t,"getAccessToken",(function(){return u})),o.d(t,"setPrompt",(function(){return k}));var n=function(){return(n=Object.assign||function(e){for(var t,o=1,n=arguments.length;o<n;o++)for(var r in t=arguments[o])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}).apply(this,arguments)},r=function(e,t,o,n){return new(o||(o=Promise))((function(r,c){function i(e){try{s(n.next(e))}catch(e){c(e)}}function a(e){try{s(n.throw(e))}catch(e){c(e)}}function s(e){var t;e.done?r(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(i,a)}s((n=n.apply(e,t||[])).next())}))},c=function(e,t){var o,n,r,c,i={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return c={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function a(c){return function(a){return function(c){if(o)throw new TypeError("Generator is already executing.");for(;i;)try{if(o=1,n&&(r=2&c[0]?n.return:c[0]?n.throw||((r=n.return)&&r.call(n),0):n.next)&&!(r=r.call(n,c[1])).done)return r;switch(n=0,r&&(c=[2&c[0],r.value]),c[0]){case 0:case 1:r=c;break;case 4:return i.label++,{value:c[1],done:!1};case 5:i.label++,n=c[1],c=[0];continue;case 7:c=i.ops.pop(),i.trys.pop();continue;default:if(!(r=i.trys,(r=r.length>0&&r[r.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!r||c[1]>r[0]&&c[1]<r[3])){i.label=c[1];break}if(6===c[0]&&i.label<r[1]){i.label=r[1],r=c;break}if(r&&i.label<r[2]){i.label=r[2],i.ops.push(c);break}r[2]&&i.ops.pop(),i.trys.pop();continue}c=t.call(e,i)}catch(e){c=[6,e],n=0}finally{o=r=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,a])}}};function i(e){var t=e.code;(function(e,t){return r(this,void 0,void 0,(function(){return c(this,(function(o){switch(o.label){case 0:return[4,fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})];case 1:return[2,o.sent().json()]}}))}))})(e.apiUrl,{code:t,scope:e.scope}).then((function(t){"access_token"in t?e.setResponseState({accessToken:t.access_token}):e.setResponseState({error:"so access_token in response data!"})})).catch((function(t){e.setResponseState({error:t.message})}))}function a(){return!!window.localStorage.getItem("accessToken")}function s(){window.localStorage.removeItem("accessToken")}function u(){return window.localStorage.getItem("accessToken")}function l(e){var t={};return e&&(t={"X-Auth-Resource":e}),n(n({},t),{"X-Auth-Token":"Bearer "+u()})}function p(){var e=document.location.href;if(document.location.search){var t=e.substring(0,e.indexOf("?"));window.history.replaceState({},document.title,t)}}var f,d=o(0),g=o.n(d);!function(e){e.GOOGLE_OAUTH_ENDPOINT="https://accounts.google.com/o/oauth2/v2/auth"}(f||(f={}));var h=function(){function e(e,t){var o=this;this.redirect=function(e){if(!o.googleRedirectURL)throw new ReferenceError("Error creating redirect url to Google's authorization server");window.location.replace(o.googleRedirectURL)},this.params=e,this.scopesStr=t}return Object.defineProperty(e.prototype,"googleRedirectURL",{get:function(){return this._googleRedirectURL},set:function(e){this._googleRedirectURL=e},enumerable:!1,configurable:!0}),e.prototype.createAuthorizationRequestURL=function(){var e,t=this.params,o=t.accessType,n=void 0===o?"offline":o,r=t.includeGrantedScopes,c=void 0===r||r,i=t.responseType,a=void 0===i?"code":i,s=t.state,u=void 0===s?null:s,l=t.redirectUri,p=t.clientId,d=t.loginHint,g=t.prompt;e=f.GOOGLE_OAUTH_ENDPOINT+"?scope="+this.scopesStr+"&",e=(e=(e=n?e+"access_type="+n+"&":e)+"include_granted_scopes="+c+"&")+"response_type="+a+"&",e=u?e+"state="+u+"&":e,e=d?e+"login_hint="+d+"&":e,e=(e=(e=g?e+"prompt="+g+"&":e)+"redirect_uri="+l+"&")+"client_id="+p,this.googleRedirectURL=e},e.createScopes=function(e){var t="";return e.map((function(o,n){e.length-1===n?t+=""+o:t+=o+"%20"})),t},e}(),b=function(){return(b=Object.assign||function(e){for(var t,o=1,n=arguments.length;o<n;o++)for(var r in t=arguments[o])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}).apply(this,arguments)},v={},y={backgroundSize:"20px 20px",backgroundRepeat:"no-repeat",backgroundPosition:"12px 10px",textIndent:"19px",border:"1px solid #bdc3c7",padding:"9px 23px",borderRadius:"9px",backgroundColor:"#bdc3c7",fontSize:"18px"},m=g.a.createContext({setOAuthState:function(){},setOptions:function(){},setPrompt:function(){},setResponseState:function(){}}),O=m.Provider,S=m.Consumer,w=function(e){var t=e.placeholder,o=void 0===t?"":t,n=e.defaultStyle,r=void 0===n||n,c=e.options,i=e.displayErrors,a=void 0!==i&&i,s=h.createScopes(c.scopes),u=new h(c,s);u.createAuthorizationRequestURL();var l=r?function(e,t){return e?b(b({},t),{backgroundImage:"url("+e+")"}):t}(o,y):void 0;return e.error&&console.error("[React-Google-OAuth2] Error: "+e.error+"\n - To display the error to the user, set IGoogleProps displayErrors to true.\n See https://joegasewicz.github.io/react-google-oauth2.0/"),p(),g.a.createElement(g.a.Fragment,null,g.a.createElement("button",{style:l,onClick:u.redirect,className:e.className+" google-oauth-btn"},e.children),a&&e.error&&g.a.createElement("div",null,e.error))};function R(e){var t=e.callback,o=Object(d.useContext)(m),n=o.options,r=o.setOptions,c=o.responseState,s=o.setOAuthState,u=o.setResponseState,l=o.isAuthenticated,f=Object(d.useState)(),h=f[0],v=f[1],y=new URLSearchParams(window.location.search),O=y.get("code"),S=y.get("error");Object(d.useEffect)((function(){!n&&r&&r(e.options)}),[e.options]),Object(d.useEffect)((function(){c&&!Object.keys(c).length&&h&&i(h)}),[h,c]),Object(d.useEffect)((function(){var e;(null==c?void 0:c.accessToken)&&!a()&&(e=c.accessToken,window.localStorage.setItem("accessToken",e),console.debug("`accessToken` set in local storage."),"function"!=typeof s||l||s(!0))}),[null==c?void 0:c.accessToken]);var R=b(b({},e.options),n),k=g.a.createElement(w,b({},e,{placeholder:e.placeholder,error:null==c?void 0:c.error,options:R}));if(null==c?void 0:c.error)return console.error("[React-Google-OAuth2] Error: Api call failed with "+(null==c?void 0:c.error)+" error."),k;if(O&&!a()){var x={email:y.get("email")||"",scope:y.get("scope")||"",code:O,client_id:e.options.clientId,apiUrl:e.apiUrl,responseState:c,setResponseState:u};return p(),c&&!Object.keys(c).length&&v(x),console.debug("Waiting for remote api response"),t?t():g.a.createElement(g.a.Fragment,null,"Loading...")}return S?(console.error("Error: Google login attempt failed with "+S+" error."),k):k}function k(e,t){return function(o){t&&!t.prompt&&e(b(b({},t),{prompt:o}))}}var x=function(e){var t=Object(d.useState)(v),o=t[0],n=t[1],r=Object(d.useState)(a()),c=r[0],i=r[1],s=Object(d.useState)(),u=s[0],l=s[1],p={isAuthenticated:c,setOAuthState:i,responseState:o,setResponseState:n,options:u,setOptions:l,setPrompt:k(l,u)};return g.a.createElement(O,{value:p},e.children)}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9yZWFjdC1nb29nbGUtb2F1dGgvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcmVhY3QtZ29vZ2xlLW9hdXRoL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly9yZWFjdC1nb29nbGUtb2F1dGgvLi9zcmMvYXBpVXRpbHMudHMiLCJ3ZWJwYWNrOi8vcmVhY3QtZ29vZ2xlLW9hdXRoLy4vc3JjL2F1dGhvcml6YXRpb24udHMiLCJ3ZWJwYWNrOi8vcmVhY3QtZ29vZ2xlLW9hdXRoLy4vc3JjL2NvbXBvbmVudHMudHN4Il0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsInNlcnZlclJlc3BvbnNlIiwicHJvcHMiLCJjb2RlIiwiYXBpVXJsIiwicGF5bG9hZCIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwianNvbiIsInBvc3RUb0V4Y2hhbmdlQXBpVXJsIiwic2NvcGUiLCJ0aGVuIiwiZGF0YSIsInNldFJlc3BvbnNlU3RhdGUiLCJhY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsImVycm9yIiwiY2F0Y2giLCJlcnIiLCJtZXNzYWdlIiwiaXNMb2dnZWRJbiIsIndpbmRvdyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJsb2dPdXRPQXV0aFVzZXIiLCJyZW1vdmVJdGVtIiwiZ2V0QWNjZXNzVG9rZW4iLCJjcmVhdGVPQXV0aEhlYWRlcnMiLCJyZXNvdXJjZSIsInJlc291cmNlSGVhZGVycyIsInJlbW92ZU9BdXRoUXVlcnlQYXJhbXMiLCJjdXJyZW50TG9jYXRpb24iLCJkb2N1bWVudCIsImxvY2F0aW9uIiwiaHJlZiIsInNlYXJjaCIsImNsZWFuX3VyaSIsInN1YnN0cmluZyIsImluZGV4T2YiLCJoaXN0b3J5IiwicmVwbGFjZVN0YXRlIiwidGl0bGUiLCJHb29nbGVBUElDb25uZWN0aW9uU3RyaW5ncyIsInBhcmFtcyIsInNjb3Blc1N0ciIsInJlZGlyZWN0IiwiZSIsImdvb2dsZVJlZGlyZWN0VVJMIiwiUmVmZXJlbmNlRXJyb3IiLCJyZXBsYWNlIiwidGhpcyIsIl9nb29nbGVSZWRpcmVjdFVSTCIsImNyZWF0ZUF1dGhvcml6YXRpb25SZXF1ZXN0VVJMIiwidXJsIiwiYWNjZXNzVHlwZSIsImluY2x1ZGVHcmFudGVkU2NvcGVzIiwicmVzcG9uc2VUeXBlIiwic3RhdGUiLCJyZWRpcmVjdFVyaSIsImNsaWVudElkIiwibG9naW5IaW50IiwicHJvbXB0IiwiR09PR0xFX09BVVRIX0VORFBPSU5UIiwiY3JlYXRlU2NvcGVzIiwic2NvcGVzIiwic3RyIiwibWFwIiwibGVuZ3RoIiwiU0VSVkVSX1JFU1BPTlNFX1NUQVRFIiwiYnV0dG9uU3R5bGluZyIsImJhY2tncm91bmRTaXplIiwiYmFja2dyb3VuZFJlcGVhdCIsImJhY2tncm91bmRQb3NpdGlvbiIsInRleHRJbmRlbnQiLCJib3JkZXIiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwiYmFja2dyb3VuZENvbG9yIiwiZm9udFNpemUiLCJHb29nbGVBdXRoQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJzZXRPQXV0aFN0YXRlIiwic2V0T3B0aW9ucyIsInNldFByb21wdCIsIkdvb2dsZUF1dGhQcm92aWRlciIsIlByb3ZpZGVyIiwiR29vZ2xlQXV0aENvbnN1bWVyIiwiQ29uc3VtZXIiLCJJbm5lckJ1dHRvbiIsInBsYWNlaG9sZGVyIiwiZGVmYXVsdFN0eWxlIiwib3B0aW9ucyIsImRpc3BsYXlFcnJvcnMiLCJBdXRob3JpemF0aW9uIiwiYXV0aCIsInN0eWxlcyIsImJhY2tncm91bmRJbWFnZSIsIl9nZXRCYWNrZ3JvdW5kSW1nIiwidW5kZWZpbmVkIiwiY29uc29sZSIsInN0eWxlIiwib25DbGljayIsImNsYXNzTmFtZSIsImNoaWxkcmVuIiwiR29vZ2xlQnV0dG9uIiwiY2FsbGJhY2siLCJyZXNwb25zZVN0YXRlIiwiaXNBdXRoZW50aWNhdGVkIiwic2VydmVyUmVzcG9uc2VTdGF0ZSIsInNldFNlcnZlclJlc3BvbnNlU3RhdGUiLCJjdXJyZW50VXJsIiwiVVJMU2VhcmNoUGFyYW1zIiwicXVlcnlQYXJhbXNDb2RlIiwicXVlcnlQYXJhbXNFcnJvciIsImtleXMiLCJ0b2tlbiIsInNldEl0ZW0iLCJkZWJ1ZyIsIm1lcmdlZFByb3BzQW5kU3RhdGVPcHRpb25zIiwiX2lubmVyIiwic2VydmVyUmVzcG9uc2VQcm9wcyIsImVtYWlsIiwiY2xpZW50X2lkIiwicHJvbXB0VHlwZSIsIkdvb2dsZUF1dGgiLCJfcHJvdmlkZXJQcm9wcyJdLCJtYXBwaW5ncyI6IjJCQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQTBEZixPQXJEQUYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFB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UWhDLFNBQ3pCM0QsT0FBUUYsRUFBTUUsT0FDZDBHLGNBQWVBLEVBQ2Y3RixpQkFBa0JBLEdBT3RCLE9BTEFpQixJQUNJNEUsSUFBa0JwSSxPQUFPNEksS0FBS1IsR0FBZXZDLFFBQzdDMEMsRUFBdUJXLEdBRTNCckIsUUFBUWtCLE1BQU0sbUNBQ1BaLEVBQVdBLElBQWEsa0RBQzVCLE9BQUlRLEdBQ1BkLFFBQVFuRixNQUFNLDJDQUEyQ2lHLEVBQWdCLFdBQ2xFTSxHQUdKQSxFQVNKLFNBQVNwQyxFQUFVRCxFQUFzQlMsR0FDNUMsT0FBTyxTQUFDZ0MsR0FDQWhDLElBQVlBLEVBQVE5QixRQUNwQnFCLEVBQVcsT0FDSlMsR0FBTyxDQUNWOUIsT0FBUThELE1BV2pCLElBQU1DLEVBQWEsU0FBQzlILEdBQ2pCLE1BQW9DLG1CQUErQnNFLEdBQWxFc0MsRUFBYSxLQUFFN0YsRUFBZ0IsS0FDaEMsRUFBbUMsbUJBQWtCTyxLQUFwRHVGLEVBQWUsS0FBRTFCLEVBQWEsS0FDL0IsRUFBd0IscUJBQXZCVSxFQUFPLEtBQUVULEVBQVUsS0FFcEIyQyxFQUE4QixDQUNoQ2xCLGdCQUFlLEVBQ2YxQixjQUFhLEVBQ2J5QixjQUFhLEVBQ2I3RixpQkFBZ0IsRUFDaEI4RSxRQUFPLEVBQ1BULFdBQVUsRUFDVkMsVUFBV0EsRUFBVUQsRUFBWVMsSUFFckMsT0FDSSxrQkFBQ1AsRUFBa0IsQ0FBQ3ZHLE1BQU9nSixHQUN0Qi9ILEVBQU15RyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpOyIsIi8qKiBAaW50ZXJuYWwgKi9cbmltcG9ydCB7RGlzcGF0Y2gsIFNldFN0YXRlQWN0aW9uLCB1c2VFZmZlY3R9IGZyb20gXCJyZWFjdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQYXlsb2FkIHtcbiAgICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFwaVJlc3BvbnNlRGF0YSB7IHJlYWRvbmx5IGFjY2Vzc190b2tlbjogc3RyaW5nOyB9XG4vKiogQGludGVybmFsICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9zdFRvRXhjaGFuZ2VBcGlVcmwoYXBpVXJsOiBzdHJpbmcsIHBheWxvYWQ6IElQYXlsb2FkKTogUHJvbWlzZTxJQXBpUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgcmVzOiBSZXNwb25zZSA9IGF3YWl0IGZldGNoKGFwaVVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5qc29uKCk7XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2ZXJSZXNwb25zZVN0YXRlIHsgcmVhZG9ubHkgYWNjZXNzVG9rZW4/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nfVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2VydmVyUmVzcG9uc2VQcm9wcyB7XG4gICAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHNjb3BlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYXBpVXJsOiBzdHJpbmc7XG4gICAgcmVzcG9uc2VTdGF0ZTogSVNlcnZlclJlc3BvbnNlU3RhdGU7XG4gICAgc2V0UmVzcG9uc2VTdGF0ZTogRGlzcGF0Y2g8U2V0U3RhdGVBY3Rpb248SVNlcnZlclJlc3BvbnNlU3RhdGU+Pjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZXJSZXNwb25zZShwcm9wczogSVNlcnZlclJlc3BvbnNlUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvZGUsIGFwaVVybCwgc2NvcGUgfSA9IHByb3BzO1xuICAgIGNvbnN0IHBheWxvYWQ6IElQYXlsb2FkID0geyBjb2RlLCBzY29wZSB9O1xuICAgIHBvc3RUb0V4Y2hhbmdlQXBpVXJsKGFwaVVybCwgcGF5bG9hZClcbiAgICAgICAgLnRoZW4oKGRhdGE6IElBcGlSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSByZXNwb25zZVN0YXRlIGFjY2Vzc1Rva2VuXG4gICAgICAgICAgICBpZighKFwiYWNjZXNzX3Rva2VuXCIgaW4gZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wcy5zZXRSZXNwb25zZVN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IFwic28gYWNjZXNzX3Rva2VuIGluIHJlc3BvbnNlIGRhdGEhXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb3BzLnNldFJlc3BvbnNlU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBwcm9wcy5zZXRSZXNwb25zZVN0YXRlKHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZUFjY2Vzc1Rva2VuKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYWNjZXNzVG9rZW5cIiwgdG9rZW4pO1xufVxuXG4vKipcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqICBpZihpc0xvZ2dlZEluKCkpIHsgLy8gcmV0dXJucyB0cnVlIGlzIGFjY2Vzc1Rva2VuIGV4aXN0cyBpbiBMb2NhbFN0b3JhZ2VcbiAqICAgICAgLy8gdXNlciBsb2dnZWQgY29kZS4uLlxuICogIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3NUb2tlblwiKTtcbn1cblxuLyoqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiAgbG9nT3V0T0F1dGhVc2VyKCkgLy8gcmVtb3ZlcyB0aGUgYWNjZXNzVG9rZW4gZnJvbSBMb2NhbFN0b3JhZ2VcbiAqIGBgYFxuICogQHJldHVybiB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dPdXRPQXV0aFVzZXIoKTogdm9pZCB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiYWNjZXNzVG9rZW5cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldCB0aGUgc3RvcmVkIGFjY2Vzc1Rva2VuXG4gKiBAcmV0dXJuIFRoZSBBY2Nlc3MgVG9rZW4gb3Igbm9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc1Rva2VuXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBXYXJuaW5nOiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgYXMgb2YgdmVyc2lvbiBgMC4wLjIzYCB3ZSBoYXZlIHJlbW92ZWRcbiAqIHRoZSBgYXBwbGljYXRpb24vanNvbmAgY29udGVudCB0eXBlIGhlYWRlcnMgZnJvbSB0aGlzIGZ1bmN0aW9uLiBUaGlzIG1heSBjYXVzZSBhbiBpc3N1ZVxuICogaWYgeW91IG9yaWdpbmFsbHkgZGlkbid0IGNvbnN0cnVjdCB5b3VyIHJlcXVlc3QgY29udGVudCB0eXBlIGhlYWRlcnMgd2l0aCBgYXBwbGljYXRpb24vanNvbmAuXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiAgZmV0Y2godXJsLCB7XG4gKiAgICAgIGhlYWRlcnM6IGNyZWF0ZU9BdXRoSGVhZGVycygpLFxuICogIH0pXG4gKiBgYGBcbiAqXG4gKiBJZiB5b3UgcmVxdWlyZSB5b3VyIHNlcnZlciB0byBoYW5kbGUgYXV0aGVudGljYXRpbmcgbXVsdGlwbGUgdXNlcnMgYWNyb3NzIG1hbnkgcmVzb3VyY2VzXG4gKiAob3IgdGFibGVzKSB0aGVuIHBhc3MgaW4gdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLCBmb3IgRXhhbXBsZTpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqICBmZXRjaCh1cmwsIHtcbiAqICAgICAgaGVhZGVyczogY3JlYXRlT0F1dGhIZWFkZXJzKFwidXNlcnNcIiksXG4gKiAgfSlcbiAqIGBgYFxuICpcbiAqICBXaXRoIHRoZSByZXNvdXJjZSB2YWx1ZSwgdGhlIGZvbGxvd2luZyBoZWFkZXJzIGFyZSBjb25zdHJ1Y3RlZDpcbiAqXG4gKiAgQGV4YW1wbGVcbiAqICBgYGBcbiAqICB7XG4gKiAgICBcIlgtQXV0aC1Ub2tlblwiIDogXCI8VE9LRU4+XCIsXG4gKiAgICBcIlgtQXV0aC1SZXNvdXJjZVwiOiBcInVzZXJzXCIsXG4gKiAgfVxuICogIGBgYFxuICogQHBhcmFtIHJlc291cmNlIE9wdGlvbmFsIHJlc291cmNlIG5hbWUgdG8gbG9vayB1cCBvbiB0aGUgc2VydmVyXG4gKiBAcmV0dXJuIE9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9BdXRoSGVhZGVycyhyZXNvdXJjZT86IHN0cmluZyk6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBsZXQgcmVzb3VyY2VIZWFkZXJzID0ge307XG4gICAgaWYocmVzb3VyY2UpIHtcbiAgICAgICAgcmVzb3VyY2VIZWFkZXJzID0ge1xuICAgICAgICAgICAgXCJYLUF1dGgtUmVzb3VyY2VcIjogcmVzb3VyY2UsXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucmVzb3VyY2VIZWFkZXJzLFxuICAgICAgICBcIlgtQXV0aC1Ub2tlblwiOiBgQmVhcmVyICR7Z2V0QWNjZXNzVG9rZW4oKX1gLFxuICAgIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9BdXRoUXVlcnlQYXJhbXMoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudExvY2F0aW9uID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjtcbiAgICBpZihkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgY29uc3QgY2xlYW5fdXJpID0gY3VycmVudExvY2F0aW9uLnN1YnN0cmluZygwLCBjdXJyZW50TG9jYXRpb24uaW5kZXhPZihcIj9cIikpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCBjbGVhbl91cmkpO1xuICAgIH1cbn1cbiIsIi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIEdvb2dsZUFQSUNvbm5lY3Rpb25TdHJpbmdzIHtcbiAgICBHT09HTEVfT0FVVEhfRU5EUE9JTlQgPSBcImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi92Mi9hdXRoXCIsXG59XG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IHR5cGUgVHlwZVByb21wdCA9IFwiY29uc2VudFwiIHwgXCJzZWxlY3RfYWNjb3VudFwiO1xuLyoqIEBwdWJsaWMgKi9cbmludGVyZmFjZSBJQXV0aG9yaXphdGlvbkJhc2Uge1xuICAgIC8qKiBUaGlzIGlzIHlvdXIgY2xpZW50IElEICovXG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICAvKiogV2hlcmUgeW91IFJlYWN0IGFwcCBzaG91bGQgcmVkaXJlY3QgdG8gaWYgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxvZ2dlZCBpbiAqKi9cbiAgICByZWRpcmVjdFVyaTogc3RyaW5nO1xuICAgIC8qKiBCeSBkZWZhdWx0IHRoaXMgaXMgc2V0IHRvICpjb2RlKiAqL1xuICAgIHJlc3BvbnNlVHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGFwaSAqKmFwaVVybCoqIHtAbGluayBJR29vZ2xlQnV0dG9ufSBjYW4gcmVmcmVzaCB0b2tlbnMgb24gdGhlIHVzZXInc1xuICAgICAqIGJlaGFsZi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgKm9ubGluZSogYnV0IGlmIHlvdXIgYmFja2VuZCBhcGkgd2lsbCByZWZyZXNoIHRoZSB0b2tlbiB0aGVuXG4gICAgICogeW91IG11c3QgcGFzcyBpbiBhIHN0cmluZyB2YWx1ZSBvZiAqb2ZmbGluZSogKFRoaXMgaXMgcmVjb21tZW5kZWQgZm9yIHJlYWN0IGFwcHMgY29ubmVjdGVkXG4gICAgICogdG8gYSBSRVNUIGFwaSBiYWNrZW5kKS5cbiAgICAgKi9cbiAgICBhY2Nlc3NUeXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgb3B0aW9uIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBidXQgd2lsbCBiZSBpbiBhIGFkZGVkIGluIGEgZnV0dXJlIHZlcnNpb24sXG4gICAgICogVE9ETyAtIFNlZSBodHRwczovL2dpdGh1Yi5jb20vam9lZ2FzZXdpY3ovcmVhY3QtZ29vZ2xlLW9hdXRoMi4wL2lzc3Vlcy8zXG4gICAgICogKi9cbiAgICBzdGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZWZhdWx0ZWQgdG8gdHJ1ZS4gQW55IGV4dHJhIHNjb3BlcyB0aGUgbG9nZ2VkIGluIHVzZXIgcHJldmlvdXNseSBncmFudGVkXG4gICAgICogd2lsbCBiZSBhdmFpbGFibGUgd2l0aGluIHRoZSBuZXcgYWNjZXNzIHRva2VuLlxuICAgICAqICovXG4gICAgaW5jbHVkZUdyYW50ZWRTY29wZXM/OiBib29sZWFuO1xuICAgIC8qKiBOb3QgcmVxdWlyZWQsIG9wdGlvbmFsLiBGb3IgcHJlZmlsbGluZyBlbWFpbCBmaWVsZHMgKi9cbiAgICBsb2dpbkhpbnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTm90IHJlcXVpcmVkLCBvcHRpb25hbC4gQSBzcGFjZS1kZWxpbWl0ZWQsIGNhc2Utc2Vuc2l0aXZlIGxpc3Qgb2YgcHJvbXB0cyB0b1xuICAgICAqIHByZXNlbnQgdGhlIHVzZXIuIElmIHlvdSBkb24ndCBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkXG4gICAgICogb25seSB0aGUgZmlyc3QgdGltZSB5b3VyIHByb2plY3QgcmVxdWVzdHMgYWNjZXNzLiBWYWxpZCB2YWx1ZXM6XG4gICAgICogIGNvbnNlbnQgLSBQcm9tcHQgdGhlIHVzZXIgZm9yIGNvbnNlbnQuXG4gICAgICogIHNlbGVjdF9hY2NvdW50IC0gUHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhbiBhY2NvdW50LlxuICAgICAqICovXG4gICAgcHJvbXB0PzogVHlwZVByb21wdDtcbn1cbi8qKiBAcHVibGljICovXG5leHBvcnQgaW50ZXJmYWNlIElBdXRob3JpemF0aW9uT3B0aW9ucyBleHRlbmRzIElBdXRob3JpemF0aW9uQmFzZSB7XG4gICAgc2NvcGVzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXV0aG9yaXphdGlvbiB7XG4gICAgcGFyYW1zOiBJQXV0aG9yaXphdGlvbk9wdGlvbnM7XG4gICAgLyoqIFNldCB0byAgYFtcIm9wZW5pZFwiLCBcInByb2ZpbGVcIl1gIGJ5IGRlZmF1bHQgKiovXG4gICAgc2NvcGVzU3RyOiBzdHJpbmc7XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbiBpbXBsZW1lbnRzIElBdXRob3JpemF0aW9uIHtcblxuICAgIHByaXZhdGUgX2dvb2dsZVJlZGlyZWN0VVJMPzogc3RyaW5nO1xuXG4gICAgcHVibGljIHBhcmFtczogSUF1dGhvcml6YXRpb25PcHRpb25zO1xuXG4gICAgcHVibGljIHNjb3Blc1N0cjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocGFyYW1zOiBJQXV0aG9yaXphdGlvbk9wdGlvbnMsIHNjb3Blc1N0cjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgICAgICB0aGlzLnNjb3Blc1N0ciA9IHNjb3Blc1N0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBAcHJvcGVydHkgZ29vZ2xlUmVkaXJlY3RVUkwgQWNjZXNzIHRoZSB1cmwgZm9yIHRoZSBpbml0aWFsXG4gICAgICogYnJvd3NlciBjYWxsIHRvIEdvb2dsZSdzIE9BdXRoIDIuMCBzZXJ2ZXIuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ29vZ2xlUmVkaXJlY3RVUkwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nb29nbGVSZWRpcmVjdFVSTDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGdvb2dsZVJlZGlyZWN0VVJMKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fZ29vZ2xlUmVkaXJlY3RVUkwgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIGNyZWF0ZUF1dGhvcml6YXRpb25SZXF1ZXN0VVJMKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBhY2Nlc3NUeXBlID0gXCJvZmZsaW5lXCIsXG4gICAgICAgICAgICBpbmNsdWRlR3JhbnRlZFNjb3BlcyA9IHRydWUsXG4gICAgICAgICAgICByZXNwb25zZVR5cGUgPSBcImNvZGVcIixcbiAgICAgICAgICAgIHN0YXRlID0gbnVsbCxcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpLFxuICAgICAgICAgICAgY2xpZW50SWQsXG4gICAgICAgICAgICBsb2dpbkhpbnQsXG4gICAgICAgICAgICBwcm9tcHQsXG4gICAgICAgIH0gPSB0aGlzLnBhcmFtcztcbiAgICAgICAgY29uc3QgZG9tYWluID0gR29vZ2xlQVBJQ29ubmVjdGlvblN0cmluZ3MuR09PR0xFX09BVVRIX0VORFBPSU5UO1xuICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICAgIHVybCA9IGAke2RvbWFpbn0/c2NvcGU9JHt0aGlzLnNjb3Blc1N0cn0mYDtcbiAgICAgICAgdXJsID0gYWNjZXNzVHlwZSA/IGAke3VybH1hY2Nlc3NfdHlwZT0ke2FjY2Vzc1R5cGV9JmAgOiB1cmw7XG4gICAgICAgIHVybCA9IGAke3VybH1pbmNsdWRlX2dyYW50ZWRfc2NvcGVzPSR7aW5jbHVkZUdyYW50ZWRTY29wZXN9JmA7XG4gICAgICAgIHVybCA9IGAke3VybH1yZXNwb25zZV90eXBlPSR7cmVzcG9uc2VUeXBlfSZgO1xuICAgICAgICB1cmwgPSBzdGF0ZSA/IGAke3VybH1zdGF0ZT0ke3N0YXRlfSZgIDogdXJsO1xuICAgICAgICB1cmwgPSBsb2dpbkhpbnQgPyBgJHt1cmx9bG9naW5faGludD0ke2xvZ2luSGludH0mYCA6IHVybDtcbiAgICAgICAgdXJsID0gcHJvbXB0ID8gYCR7dXJsfXByb21wdD0ke3Byb21wdH0mYCA6IHVybDtcbiAgICAgICAgdXJsID0gYCR7dXJsfXJlZGlyZWN0X3VyaT0ke3JlZGlyZWN0VXJpfSZgO1xuICAgICAgICB1cmwgPSBgJHt1cmx9Y2xpZW50X2lkPSR7Y2xpZW50SWR9YDtcbiAgICAgICAgdGhpcy5nb29nbGVSZWRpcmVjdFVSTCA9IHVybDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTY29wZXMoc2NvcGVzOiBBcnJheTxzdHJpbmc+KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgICAgIHNjb3Blcy5tYXAoKHNjb3BlLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NvcGVzLmxlbmd0aCAtIDEgPT09IGkpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gYCR7c2NvcGV9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RyICs9IGAke3Njb3BlfSUyMGA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVkaXJlY3QgPSAoZTogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmKHRoaXMuZ29vZ2xlUmVkaXJlY3RVUkwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHRoaXMuZ29vZ2xlUmVkaXJlY3RVUkwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJFcnJvciBjcmVhdGluZyByZWRpcmVjdCB1cmwgdG8gR29vZ2xlJ3MgYXV0aG9yaXphdGlvbiBzZXJ2ZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHtkZWZhdWx0IGFzIFJlYWN0LCBEaXNwYXRjaCwgU2V0U3RhdGVBY3Rpb24sIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgICBBdXRob3JpemF0aW9uLFxuICAgIElBdXRob3JpemF0aW9uT3B0aW9ucywgVHlwZVByb21wdCxcbn0gZnJvbSBcIi4vYXV0aG9yaXphdGlvblwiO1xuaW1wb3J0IHtcbiAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICBzdG9yZUFjY2Vzc1Rva2VuLFxuICAgIGlzTG9nZ2VkSW4sXG4gICAgcmVtb3ZlT0F1dGhRdWVyeVBhcmFtcywgSVNlcnZlclJlc3BvbnNlU3RhdGUsIElTZXJ2ZXJSZXNwb25zZVByb3BzLFxufSBmcm9tIFwiLi9hcGlVdGlsc1wiO1xuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IGludGVyZmFjZSBJR29vZ2xlQnV0dG9uIHtcbiAgICAvKiogUGxhY2Vob2xkZXIgaW1hZ2UgZGlzcGxheWVkIG5leHQgdG8gYnV0dG9uIHRleHQuIFRoZSBwbGFjZWhvbGRlciBwcm9wIGhhcyBubyBlZmZlY3QgaWYgcGxhY2Vob2xkZXIgaXMgc2V0IHRvIGZhbHNlICovXG4gICAgcmVhZG9ubHkgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgLyoqIFJlbW92ZSBkZWZhdWx0IHN0eWxlcy5cbiAgICAgKiAgVG8gU3R5bGUgdGhlIDxidXR0b24+IGVsZW1lbnQgd2l0aCBDU1MsIHVzZSBgZ29vZ2xlLW9hdXRoLWJ0bmAuIEZvciBleGFtcGxlOlxuICAgICAqICBgYGBcbiAgICAgKiAgLmdvb2dsZS1vYXV0aC1idG4ge1xuICAgICAqICAgICAgY29sb3I6IHJlZDtcbiAgICAgKiAgICAgIGJhY2tncm91bmQtY29sb3I6IGxpbWU7XG4gICAgICogIH1cbiAgICAgKiAgYGBgXG4gICAgICogKHlvdSBjYW4gYWxzbyBwYXNzIHlvdXIgY3NzIHNlbGVjdG9ycyBkaXJlY3RseSB3aXRoIFJlYWN0cycgYGNsYXNzTmFtZWAgcHJvcClcbiAgICAgKiAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHRTdHlsZT86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBJQXV0aG9yaXphdGlvblJlcXVlc3RQYXJhbXMgKi9cbiAgICByZWFkb25seSBvcHRpb25zOiBJQXV0aG9yaXphdGlvbk9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5XG4gICAgICogQG9wdGlvbmFsXG4gICAgICogQSBSZWFjdCBjb21wb25lbnQgb3IgYW55IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFJlYWN0IGNvbXBvbmVudC5cbiAgICAgKiBUaGlzIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQgdG8gZGlzcGxheSBhIHByZWxvYWRlciB0byB0aGUgdXNlciB3aGlsc3RcbiAgICAgKiB0aGUgT0F1dGgyLjAgbG9naW4gc3RyYXRlZ3kgaXMgaW4gZmxpZ2h0LiBCeSBkZWZhdWx0IGEgYExvYWRpbmcuLi5gXG4gICAgICogbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIDxHb29nbGVCdXR0b25cbiAgICAgKiAgICBjYWxsYmFjaz17KCkgPT4gPD5cIkxvYWRpbmcuLi5cIjwvPn1cbiAgICAgKiAgICAvLyBvdGhlciBwcm9wcy4uLlxuICAgICAqIC8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FsbGJhY2s/OiAoKSA9PiBSZWFjdC5SZWFjdEhUTUxFbGVtZW50PGFueT47XG4gICAgLyoqIFRoZSB1cmwgb2YgdGhlIGFwaSB0byBwZXJmb3JtIHRoZSBleGNoYW5nZSAqL1xuICAgIHJlYWRvbmx5IGFwaVVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsLiBEZWZhdWx0IHNldCB0byBmYWxzZS5cbiAgICAgKiBEaXNwbGF5IGFuIGVycm9yIHRvIHRoZSB1c2VyICh3aWxsIGJlIGRpc3BsYXllZCBpbiBhIGNoaWxkIGBkaXZgIGVsZW1lbnQpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRpc3BsYXlFcnJvcnM/OiBib29sZWFuO1xufVxuLyoqIEBpbnRlcm5hbCAqL1xudHlwZSBUeXBlQnV0dG9uU3R5bGVzID0geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbi8qKiBAaW50ZXJuYWwgKi9cbnR5cGUgVHlwZUdvb2dsZUJ1dHRvbiA9IElHb29nbGVCdXR0b24gJiBSZWFjdC5CdXR0b25IVE1MQXR0cmlidXRlczxIVE1MQnV0dG9uRWxlbWVudD47XG4vKiogQGludGVybmFsICovXG5pbnRlcmZhY2UgSVNlcnZlclJlc3BvbnNlIHtcbiAgICByZWFkb25seSBlbWFpbD86IHN0cmluZztcbiAgICBlcnJvcj86IHN0cmluZztcbiAgICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbiAgICByZWFkb25seSBjbGllbnRfaWQ6IHN0cmluZztcbiAgICByZWFkb25seSBhcGlVcmw6IHN0cmluZztcbiAgICByZXNwb25zZVN0YXRlOiBJU2VydmVyUmVzcG9uc2VTdGF0ZTtcbiAgICBzZXRSZXNwb25zZVN0YXRlOiBEaXNwYXRjaDxTZXRTdGF0ZUFjdGlvbjxJU2VydmVyUmVzcG9uc2VTdGF0ZT4+O1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuY29uc3QgU0VSVkVSX1JFU1BPTlNFX1NUQVRFID0geyB9O1xuXG4vKiogQGludGVybmFsICovXG5jb25zdCBidXR0b25TdHlsaW5nOiBUeXBlQnV0dG9uU3R5bGVzID0ge1xuICAgIGJhY2tncm91bmRTaXplOiBcIjIwcHggMjBweFwiLFxuICAgIGJhY2tncm91bmRSZXBlYXQ6IFwibm8tcmVwZWF0XCIsXG4gICAgYmFja2dyb3VuZFBvc2l0aW9uOiBcIjEycHggMTBweFwiLFxuICAgIHRleHRJbmRlbnQ6IFwiMTlweFwiLFxuICAgIGJvcmRlcjogXCIxcHggc29saWQgI2JkYzNjN1wiLFxuICAgIHBhZGRpbmc6IFwiOXB4IDIzcHhcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiOXB4XCIsXG4gICAgYmFja2dyb3VuZENvbG9yOiBcIiNiZGMzYzdcIixcbiAgICBmb250U2l6ZTogXCIxOHB4XCIsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElPQXV0aFN0YXRlIHtcbiAgICBpc0F1dGhlbnRpY2F0ZWQ/OiBib29sZWFuO1xuICAgIHNldE9BdXRoU3RhdGU6IEZ1bmN0aW9uO1xuICAgIHJlc3BvbnNlU3RhdGU/OiBJU2VydmVyUmVzcG9uc2VTdGF0ZTtcbiAgICBvcHRpb25zPzogSUF1dGhvcml6YXRpb25PcHRpb25zO1xuICAgIHNldE9wdGlvbnM6IEZ1bmN0aW9uO1xuICAgIHNldFByb21wdDogRnVuY3Rpb247XG4gICAgLyoqXG4gICAgICogYGBgXG4gICAgICogICAgaW1wb3J0IHtcbiAgICAgKiAgICAgICByZXNwb25zZVN0YXRlXG4gICAgICogICB9IGZyb20gXCJyZWFjdC1nb29nbGUtb2F1dGgyXCI7XG4gICAgICpcbiAgICAgKiAgIDxHb29nbGVBdXRoPlxuICAgICAqICAgeyh7cmVzcG9uc2VTdGF0ZX0pID0+IHtcbiAgICAgKiAgICAgICAvLyBhY2Nlc3MgdGhlIHRva2VuIGZyb20gdGhlIHN0YXRlXG4gICAgICogICAgICAgY29uc29sZS5sb2cocmVzcG9uc2VTdGF0ZS5hY2Nlc3NUb2tlbikgLy8gPEFDQ0VTU19UT0tFTj5cbiAgICAgKiAgIH19XG4gICAgICogICA8L0dvb2dsZUF1dGg+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0UmVzcG9uc2VTdGF0ZTogRGlzcGF0Y2g8U2V0U3RhdGVBY3Rpb248SVNlcnZlclJlc3BvbnNlU3RhdGU+Pjtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IERFRkFVTFRfR09PR0xFX0FVVEhfQ09OVEVYVCA9IHtcbiAgICBzZXRPQXV0aFN0YXRlOiAoKSA9PiB7fSxcbiAgICBzZXRPcHRpb25zOiAoKSA9PiB7fSxcbiAgICBzZXRQcm9tcHQ6ICgpID0+IHt9LFxuICAgIHNldFJlc3BvbnNlU3RhdGU6ICgpID0+IHt9LFxufTtcbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IEdvb2dsZUF1dGhDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dDxJT0F1dGhTdGF0ZT4oREVGQVVMVF9HT09HTEVfQVVUSF9DT05URVhUKTtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBHb29nbGVBdXRoUHJvdmlkZXIgPSBHb29nbGVBdXRoQ29udGV4dC5Qcm92aWRlcjtcbi8qKlxuICogQGV4YW1wbGVcbiAqIEdldCBub3RpZmllZCB3aGVuIGEgdXNlciBoYXMgbG9nZ2VkIGluIHN1Y2Nlc3NmdWxseSBieSB3cmFwcGluZyB0aGUgR29vZ2xlQnV0dG9uXG4gKiBjb21wb25lbnQgd2l0aGluIHRoZSBHb29nbGVBdXRoIHByb3ZpZGVyLiBGb3IgZXhhbXBsZTpcbiAqIGBgYFxuICogICAgaW1wb3J0IHtcbiAqICAgICAgIEdvb2dsZUF1dGhcbiAqICAgfSBmcm9tIFwicmVhY3QtZ29vZ2xlLW9hdXRoMlwiO1xuICpcbiAqICAgPEdvb2dsZUF1dGg+XG4gKiAgIHsoe2lzQXV0aGVudGljYXRlZH0pID0+IHtcbiAqICAgICAgIC8vIGlzQXV0aGVudGljYXRlZCB3aWxsIGdldCBzZXQgdG8gdHJ1ZSB3aGVuIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxvZ2dlZCBpbi5cbiAqICAgICAgIGNvbnNvbGUubG9nKFwidmFsdWU6IFwiLCBpc0F1dGhlbnRpY2F0ZWQpOyAvLyB2YWx1ZTogdHJ1ZSBvciBmYWxzZVxuICogICAgICAgcmV0dXJuIDxHb29nbGVCdXR0b25cbiAqICAgICAgICAgICAgICAgICAvLyBvcHRpb25zLi4uXG4gKiAgICAgICAgICAgICAgIC8+XG4gKiAgIH19XG4gKiAgIDwvR29vZ2xlQXV0aD5cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgR29vZ2xlQXV0aENvbnN1bWVyID0gR29vZ2xlQXV0aENvbnRleHQuQ29uc3VtZXI7XG4vKiogQGludGVybmFsICovXG5jb25zdCBfZ2V0QmFja2dyb3VuZEltZyA9IChwbGFjZWhvbGRlcjogc3RyaW5nLCBzdHlsZXM6IFR5cGVCdXR0b25TdHlsZXMpOiBUeXBlQnV0dG9uU3R5bGVzID0+IHtcbiAgICBpZihwbGFjZWhvbGRlcikge1xuICAgICAgICByZXR1cm4geyAuLi5zdHlsZXMsIGJhY2tncm91bmRJbWFnZTogYHVybCgke3BsYWNlaG9sZGVyfSlgIH07XG4gICAgfVxuICAgIHJldHVybiBzdHlsZXM7XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmludGVyZmFjZSBJSW5uZXJCdXR0b25Qcm9wcyBleHRlbmRzIElHb29nbGVCdXR0b24ge1xuICAgIGVycm9yPzogc3RyaW5nO1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IElubmVyQnV0dG9uID0gKHByb3BzOiBJSW5uZXJCdXR0b25Qcm9wcyAmIFJlYWN0LkJ1dHRvbkhUTUxBdHRyaWJ1dGVzPEhUTUxCdXR0b25FbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgcGxhY2Vob2xkZXIgPSBcIlwiLFxuICAgICAgICBkZWZhdWx0U3R5bGUgPSB0cnVlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBkaXNwbGF5RXJyb3JzID0gZmFsc2UsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3Qgc2NvcGVzID0gQXV0aG9yaXphdGlvbi5jcmVhdGVTY29wZXMob3B0aW9ucy5zY29wZXMpO1xuICAgIGNvbnN0IGF1dGggPSBuZXcgQXV0aG9yaXphdGlvbihvcHRpb25zLCBzY29wZXMpO1xuICAgIGF1dGguY3JlYXRlQXV0aG9yaXphdGlvblJlcXVlc3RVUkwoKTtcblxuXG4gICAgY29uc3Qgc3R5bGVzID0gZGVmYXVsdFN0eWxlID8gX2dldEJhY2tncm91bmRJbWcocGxhY2Vob2xkZXIsIGJ1dHRvblN0eWxpbmcpIDogdW5kZWZpbmVkO1xuICAgIGlmKHByb3BzLmVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtSZWFjdC1Hb29nbGUtT0F1dGgyXSBFcnJvcjogJHtwcm9wcy5lcnJvcn1cbiAgICAgICAgIC0gVG8gZGlzcGxheSB0aGUgZXJyb3IgdG8gdGhlIHVzZXIsIHNldCBJR29vZ2xlUHJvcHMgZGlzcGxheUVycm9ycyB0byB0cnVlLlxuICAgICAgICAgU2VlIGh0dHBzOi8vam9lZ2FzZXdpY3ouZ2l0aHViLmlvL3JlYWN0LWdvb2dsZS1vYXV0aDIuMC9gKTtcbiAgICB9XG4gICAgcmVtb3ZlT0F1dGhRdWVyeVBhcmFtcygpO1xuICAgIHJldHVybiA8PlxuICAgICAgICA8YnV0dG9uIHN0eWxlPXtzdHlsZXN9IG9uQ2xpY2s9e2F1dGgucmVkaXJlY3R9IGNsYXNzTmFtZT17YCR7cHJvcHMuY2xhc3NOYW1lfSBnb29nbGUtb2F1dGgtYnRuYH0+e3Byb3BzLmNoaWxkcmVufTwvYnV0dG9uPlxuICAgICAgICB7KGRpc3BsYXlFcnJvcnMgJiYgcHJvcHMuZXJyb3IpICYmIDxkaXY+e3Byb3BzLmVycm9yfTwvZGl2Pn1cbiAgICA8Lz5cbn1cbi8qKlxuICogQGV4YW1wbGVcbiAqICoqUXVpY2sgU3RhcnQ6KipcbiAqXG4gKiBGaXJzdCBjcmVhdGUgYW4gb3B0aW9ucyBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGFuIHtAbGluayAgSUF1dGhvcml6YXRpb25PcHRpb25zfSB0eXBlLlxuICogQ2hlY2sgdGhlIHtAbGluayAgSUF1dGhvcml6YXRpb25PcHRpb25zfSBhbmQge0BsaW5rICBJQXV0aG9yaXphdGlvbkJhc2V9IHR5cGVzIGZvclxuICogYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMuIFRoZW4sIHBhc3MgdGhlIG9wdGlvbnMgdG8gdGhlIHtAbGluayBHb29nbGVCdXR0b259IGNvbXBvbmVudC5cbiAqXG4gKiBgYGBJQXV0aG9yaXphdGlvbk9wdGlvbnNcbiAqICBjb25zdCBvcHRpb25zOiAgPSB7XG4gKiAgICAgIGNsaWVudElkOiAocHJvY2Vzcy5lbnYuQ0xJRU5UX0lEIGFzIHN0cmluZyksXG4gKiAgICAgICByZWRpcmVjdFVyaTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIixcbiAqICAgICAgIHNjb3BlczogW1wib3BlbmlkXCIsIFwicHJvZmlsZVwiLCBcImVtYWlsXCJdLFxuICogICAgICAgaW5jbHVkZUdyYW50ZWRTY29wZXM6IHRydWUsXG4gKiAgICAgICBhY2Nlc3NUeXBlOiBcIm9mZmxpbmVcIixcbiAqICAgfTtcbiAqXG4gKiAgIDxHb29nbGVCdXR0b25cbiAqICAgICAgICAgcGxhY2Vob2xkZXI9XCJkZW1vL3NlYXJjaC5wbmdcIlxuICogICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICogICAgICAgICBhcGlVcmw9XCJodHRwOi8vbG9jYWxob3N0OjUwMDAvZ29vZ2xlX2xvZ2luXCJcbiAqICAgLz5cbiAqIGBgYFxuICogQHBhcmFtIHByb3BzIHNlZSBJR29vZ2xlQnV0dG9uXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdvb2dsZUJ1dHRvbihwcm9wczogVHlwZUdvb2dsZUJ1dHRvbikge1xuICAgIGNvbnN0IHtjYWxsYmFja30gPSBwcm9wcztcbiAgICBjb25zdCB7IG9wdGlvbnMsIHNldE9wdGlvbnMsIHJlc3BvbnNlU3RhdGUsIHNldE9BdXRoU3RhdGUsIHNldFJlc3BvbnNlU3RhdGUsIGlzQXV0aGVudGljYXRlZCB9ID0gdXNlQ29udGV4dDxJT0F1dGhTdGF0ZT4oR29vZ2xlQXV0aENvbnRleHQpO1xuICAgIGNvbnN0IFtzZXJ2ZXJSZXNwb25zZVN0YXRlLCBzZXRTZXJ2ZXJSZXNwb25zZVN0YXRlXSA9IHVzZVN0YXRlPElTZXJ2ZXJSZXNwb25zZT4oKTtcbiAgICBjb25zdCBjdXJyZW50VXJsID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtc0NvZGUgPSBjdXJyZW50VXJsLmdldChcImNvZGVcIik7XG4gICAgY29uc3QgcXVlcnlQYXJhbXNFcnJvciA9IGN1cnJlbnRVcmwuZ2V0KFwiZXJyb3JcIik7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFvcHRpb25zICYmIHNldE9wdGlvbnMpIHtcbiAgICAgICAgICAgIHNldE9wdGlvbnMocHJvcHMub3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9LCBbcHJvcHMub3B0aW9uc10pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmKHJlc3BvbnNlU3RhdGUgJiYgIU9iamVjdC5rZXlzKHJlc3BvbnNlU3RhdGUpLmxlbmd0aCAmJiBzZXJ2ZXJSZXNwb25zZVN0YXRlKSB7XG4gICAgICAgICAgICBzZXJ2ZXJSZXNwb25zZShzZXJ2ZXJSZXNwb25zZVN0YXRlKTtcbiAgICAgICAgfVxuICAgIH0sIFtzZXJ2ZXJSZXNwb25zZVN0YXRlLCByZXNwb25zZVN0YXRlXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYocmVzcG9uc2VTdGF0ZT8uYWNjZXNzVG9rZW4gJiYgIWlzTG9nZ2VkSW4oKSkge1xuICAgICAgICAgICAgc3RvcmVBY2Nlc3NUb2tlbihyZXNwb25zZVN0YXRlLmFjY2Vzc1Rva2VuIGFzIHN0cmluZyk7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiYGFjY2Vzc1Rva2VuYCBzZXQgaW4gbG9jYWwgc3RvcmFnZS5cIik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNldE9BdXRoU3RhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICAgICAgc2V0T0F1dGhTdGF0ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtyZXNwb25zZVN0YXRlPy5hY2Nlc3NUb2tlbl0pO1xuICAgIC8vIEFkZCBhbnkgdXBkYXRlcyB0byB0aGUgb3B0aW9ucyBzdGF0ZVxuICAgIGxldCBtZXJnZWRQcm9wc0FuZFN0YXRlT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucHJvcHMub3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICB9XG4gICAgbGV0IF9pbm5lciA9XG4gICAgICAgIDxJbm5lckJ1dHRvblxuICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3Byb3BzLnBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgZXJyb3I9e3Jlc3BvbnNlU3RhdGU/LmVycm9yfVxuICAgICAgICAgICAgb3B0aW9ucz17bWVyZ2VkUHJvcHNBbmRTdGF0ZU9wdGlvbnN9XG4gICAgICAgIC8+O1xuICAgIGlmIChyZXNwb25zZVN0YXRlPy5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbUmVhY3QtR29vZ2xlLU9BdXRoMl0gRXJyb3I6IEFwaSBjYWxsIGZhaWxlZCB3aXRoICR7cmVzcG9uc2VTdGF0ZT8uZXJyb3J9IGVycm9yLmApO1xuICAgICAgICByZXR1cm4gX2lubmVyO1xuICAgIH0gZWxzZSBpZiAocXVlcnlQYXJhbXNDb2RlICYmICFpc0xvZ2dlZEluKCkpIHtcbiAgICAgICAgLy8gR2V0IHJlc3Qgb2YgcGFyYW1zXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zRW1haWwgPSBjdXJyZW50VXJsLmdldChcImVtYWlsXCIpIHx8IFwiXCI7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zU2NvcGUgPSBjdXJyZW50VXJsLmdldChcInNjb3BlXCIpIHx8IFwiXCI7XG4gICAgICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlUHJvcHM6IElTZXJ2ZXJSZXNwb25zZSA9IHtcbiAgICAgICAgICAgIGVtYWlsOiBxdWVyeVBhcmFtc0VtYWlsLFxuICAgICAgICAgICAgc2NvcGU6IHF1ZXJ5UGFyYW1zU2NvcGUsXG4gICAgICAgICAgICBjb2RlOiBxdWVyeVBhcmFtc0NvZGUsXG4gICAgICAgICAgICBjbGllbnRfaWQ6IHByb3BzLm9wdGlvbnMuY2xpZW50SWQsXG4gICAgICAgICAgICBhcGlVcmw6IHByb3BzLmFwaVVybCxcbiAgICAgICAgICAgIHJlc3BvbnNlU3RhdGU6IHJlc3BvbnNlU3RhdGUgYXMgSVNlcnZlclJlc3BvbnNlU3RhdGUsXG4gICAgICAgICAgICBzZXRSZXNwb25zZVN0YXRlOiBzZXRSZXNwb25zZVN0YXRlIGFzIERpc3BhdGNoPFNldFN0YXRlQWN0aW9uPElTZXJ2ZXJSZXNwb25zZVN0YXRlPj4sXG4gICAgICAgIH07XG4gICAgICAgIHJlbW92ZU9BdXRoUXVlcnlQYXJhbXMoKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlU3RhdGUgJiYgIU9iamVjdC5rZXlzKHJlc3BvbnNlU3RhdGUpLmxlbmd0aCkge1xuICAgICAgICAgICAgc2V0U2VydmVyUmVzcG9uc2VTdGF0ZShzZXJ2ZXJSZXNwb25zZVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiV2FpdGluZyBmb3IgcmVtb3RlIGFwaSByZXNwb25zZVwiKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soKSA6IDw+TG9hZGluZy4uLjwvPjtcbiAgICB9IGVsc2UgaWYgKHF1ZXJ5UGFyYW1zRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEdvb2dsZSBsb2dpbiBhdHRlbXB0IGZhaWxlZCB3aXRoICR7cXVlcnlQYXJhbXNFcnJvcn0gZXJyb3IuYClcbiAgICAgICAgcmV0dXJuIF9pbm5lcjtcbiAgICB9XG4gICAgLy8gRGlzcGxheSBidXR0b24gd2l0aCBubyBlcnJvcnNcbiAgICByZXR1cm4gX2lubmVyO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gc2V0T3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBpbnRlcm5hbCBUT0RPIG1ha2UgcHVibGljIHdoZW4gYnVncyBhcmUgZml4ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFByb21wdChzZXRPcHRpb25zOiBGdW5jdGlvbiwgb3B0aW9ucz86IElBdXRob3JpemF0aW9uT3B0aW9ucykge1xuICAgIHJldHVybiAocHJvbXB0VHlwZTogVHlwZVByb21wdCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiAhb3B0aW9ucy5wcm9tcHQpIHtcbiAgICAgICAgICAgIHNldE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgcHJvbXB0OiBwcm9tcHRUeXBlLFxuICAgICAgICAgICAgfSBhcyBJQXV0aG9yaXphdGlvbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHByb3BzXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZXhwb3J0IGNvbnN0IEdvb2dsZUF1dGggPSAocHJvcHM6IGFueSkgPT4ge1xuICAgIGNvbnN0IFtyZXNwb25zZVN0YXRlLCBzZXRSZXNwb25zZVN0YXRlXSA9IHVzZVN0YXRlPElTZXJ2ZXJSZXNwb25zZVN0YXRlPihTRVJWRVJfUkVTUE9OU0VfU1RBVEUpO1xuICAgIGNvbnN0IFtpc0F1dGhlbnRpY2F0ZWQsIHNldE9BdXRoU3RhdGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oaXNMb2dnZWRJbigpKTtcbiAgICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxJQXV0aG9yaXphdGlvbk9wdGlvbnM+KCk7XG5cbiAgICBjb25zdCBfcHJvdmlkZXJQcm9wczogSU9BdXRoU3RhdGUgPSB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZCxcbiAgICAgICAgc2V0T0F1dGhTdGF0ZSxcbiAgICAgICAgcmVzcG9uc2VTdGF0ZSxcbiAgICAgICAgc2V0UmVzcG9uc2VTdGF0ZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgc2V0T3B0aW9ucyxcbiAgICAgICAgc2V0UHJvbXB0OiBzZXRQcm9tcHQoc2V0T3B0aW9ucywgb3B0aW9ucyksXG4gICAgfTtcbiAgICByZXR1cm4gIChcbiAgICAgICAgPEdvb2dsZUF1dGhQcm92aWRlciB2YWx1ZT17X3Byb3ZpZGVyUHJvcHN9PlxuICAgICAgICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgICAgICA8L0dvb2dsZUF1dGhQcm92aWRlcj5cbiAgICApO1xufSJdLCJzb3VyY2VSb290IjoiIn0=
{
"name": "react-google-oauth2",
"version": "0.0.27",
"version": "0.0.28-rc.0",
"main": "lib/index.js",

@@ -13,2 +13,3 @@ "types": "lib/index.d.ts",

"start": "webpack-dev-server --open \"Brave Browser\" --watch --config webpack.config.dev.js --output-path=dist --output-filename=bundle.js",
"start:google": "webpack-dev-server --watch --config webpack.config.dev.js --output-path=dist --output-filename=bundle.js",
"test": "jest",

@@ -15,0 +16,0 @@ "test:update": "jest --updateSnapshot",

@@ -123,2 +123,11 @@ [![GitHub license](https://img.shields.io/github/license/joegasewicz/react-google-oauth2.0)](https://github.com/joegasewicz/react-google-oauth2.0/blob/main/LICENSE)

### Update prompts
If for example your user updates their email in your app & you redirect them
to the login again, Google will by default skip the Google email select screen
& log you in with your existing credentials. To stop this happening you can use the following function:
```typescript
```
### Flask-JWT-Router

@@ -125,0 +134,0 @@ If you are using Flask as your REST api framework then this library is designed to work

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc