spyne 0.19.1 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.js +4 -3
  3. package/.travis.yml +24 -11
  4. package/karma.conf.js +77 -87
  5. package/lib/spyne.esm.js +15 -0
  6. package/lib/spyne.esm.js.map +1 -0
  7. package/lib/spyne.js +248 -248
  8. package/lib/spyne.umd.js +3 -0
  9. package/lib/spyne.umd.js.LICENSE.txt +16 -0
  10. package/package.json +48 -27
  11. package/rollup.config.js +26 -0
  12. package/src/spyne/channels/channel-fetch-class.js +39 -43
  13. package/src/spyne/channels/channel-payload-class.js +61 -74
  14. package/src/spyne/channels/channel-proxy.js +25 -26
  15. package/src/spyne/channels/channel.js +141 -149
  16. package/src/spyne/channels/channels-config.js +46 -47
  17. package/src/spyne/channels/channels-map.js +61 -65
  18. package/src/spyne/channels/spyne-channel-lifecycle.js +12 -12
  19. package/src/spyne/channels/spyne-channel-route.js +241 -250
  20. package/src/spyne/channels/spyne-channel-ui.js +213 -75
  21. package/src/spyne/channels/spyne-channel-window.js +157 -157
  22. package/src/spyne/spyne-app.js +32 -19
  23. package/src/spyne/spyne-plugins.js +55 -70
  24. package/src/spyne/spyne.js +23 -23
  25. package/src/spyne/utils/channel-config-validator.js +10 -10
  26. package/src/spyne/utils/channel-fetch-util.js +72 -55
  27. package/src/spyne/utils/channel-payload-filter.js +89 -100
  28. package/src/spyne/utils/deep-merge.js +31 -29
  29. package/src/spyne/utils/frp-tools.js +108 -92
  30. package/src/spyne/utils/gc.js +6 -6
  31. package/src/spyne/utils/mixins/base-core-mixins.js +17 -15
  32. package/src/spyne/utils/mixins/base-streams-mixins.js +9 -9
  33. package/src/spyne/utils/route-channel-updater.js +23 -29
  34. package/src/spyne/utils/safe-clone.js +40 -58
  35. package/src/spyne/utils/sanitize-html.js +35 -0
  36. package/src/spyne/utils/security-policy.js +11 -0
  37. package/src/spyne/utils/spyne-app-properties.js +110 -114
  38. package/src/spyne/utils/spyne-logger.js +4 -11
  39. package/src/spyne/utils/spyne-plugins-methods.js +38 -63
  40. package/src/spyne/utils/spyne-trait.js +33 -33
  41. package/src/spyne/utils/spyne-utils-channel-route-url.js +229 -153
  42. package/src/spyne/utils/spyne-utils-channel-route.js +128 -138
  43. package/src/spyne/utils/spyne-utils-channel-window.js +39 -39
  44. package/src/spyne/utils/viewstream-animations.js +12 -12
  45. package/src/spyne/utils/viewstream-observables.js +45 -45
  46. package/src/spyne/views/dom-element-template.js +111 -114
  47. package/src/spyne/views/dom-element.js +82 -84
  48. package/src/spyne/views/view-stream-broadcaster.js +66 -62
  49. package/src/spyne/views/view-stream-element.js +105 -106
  50. package/src/spyne/views/view-stream-payload.js +25 -27
  51. package/src/spyne/views/view-stream-selector.js +157 -163
  52. package/src/spyne/views/view-stream.js +416 -640
  53. package/src/tests/channels/channel-dom.test.js +15 -15
  54. package/src/tests/channels/channel-fetch.test.js +51 -62
  55. package/src/tests/channels/channel-payload-class.test.js +50 -63
  56. package/src/tests/channels/channel-payload-filter.test.js +133 -193
  57. package/src/tests/channels/channel-route.test.js +102 -112
  58. package/src/tests/channels/channel-stream-item.test.js +19 -19
  59. package/src/tests/channels/channel-ui.test.js +15 -27
  60. package/src/tests/channels/channel-util-dom.test.js +31 -31
  61. package/src/tests/channels/channel.test.js +20 -25
  62. package/src/tests/channels/route-utils.test.js +61 -66
  63. package/src/tests/channels/url-utils.test.js +151 -151
  64. package/src/tests/channels/view-stream-broadcaster.test.js +7 -7
  65. package/src/tests/import.test.js +5 -5
  66. package/src/tests/index.js +6 -7
  67. package/src/tests/index.test.js +6 -8
  68. package/src/tests/mocks/channel-payload-data.js +218 -220
  69. package/src/tests/mocks/enhancer.test.js +5 -5
  70. package/src/tests/mocks/payload-ui.js +87 -90
  71. package/src/tests/mocks/routes-data.js +264 -266
  72. package/src/tests/mocks/spyne-docs.mocks.js +3 -3
  73. package/src/tests/mocks/template-renderer.mocks.js +47 -47
  74. package/src/tests/mocks/utils-data.js +78 -79
  75. package/src/tests/mocks/viewstream-internal-payload.mocks.js +50 -50
  76. package/src/tests/mocks/window-events-arr.js +1 -1
  77. package/src/tests/package-json.spec.test.js +9 -0
  78. package/src/tests/spyne-app.test.js +15 -18
  79. package/src/tests/spyne-plugin.test.js +16 -20
  80. package/src/tests/utils/channel-action-filter.test.js +84 -86
  81. package/src/tests/utils/channel-data-packet-generator.unused.js +62 -86
  82. package/src/tests/utils/channel-fetch-util.test.js +64 -66
  83. package/src/tests/utils/frp-tools.test.js +19 -19
  84. package/src/tests/utils/plugins-methods.test.js +31 -55
  85. package/src/tests/utils/security.test.js +10 -0
  86. package/src/tests/utils/spyne-app-properties.test.js +4 -8
  87. package/src/tests/views/dom-el-selectors.test.js +112 -119
  88. package/src/tests/views/dom-el-template-proxy.test.js +7 -0
  89. package/src/tests/views/dom-el-template.test.js +186 -156
  90. package/src/tests/views/dom-el.test.js +58 -56
  91. package/src/tests/views/view-stream-enhancer-loader.test.js +2 -2
  92. package/src/tests/views/view-stream-enhancer.test.js +11 -11
  93. package/src/tests/views/view-stream.test.js +22 -33
  94. package/webpack.config.js +76 -67
  95. package/docs/-_%20Solves%20equations%20of%20the%20form%20a%20_%20x%20=%20b.html +0 -487
  96. package/docs/DomItem.html +0 -298
  97. package/docs/DomItem_DomItem.html +0 -314
  98. package/docs/ViewStream.html +0 -2249
  99. package/docs/ViewStream_ViewStream.html +0 -503
  100. package/docs/custom/css/jsdoc-viewstream.css +0 -377
  101. package/docs/custom/layout.tmpl +0 -47
  102. package/docs/dom-item.js.html +0 -213
  103. package/docs/fonts/OpenSans-Bold-webfont.eot +0 -0
  104. package/docs/fonts/OpenSans-Bold-webfont.svg +0 -1830
  105. package/docs/fonts/OpenSans-Bold-webfont.woff +0 -0
  106. package/docs/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  107. package/docs/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  108. package/docs/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  109. package/docs/fonts/OpenSans-Italic-webfont.eot +0 -0
  110. package/docs/fonts/OpenSans-Italic-webfont.svg +0 -1830
  111. package/docs/fonts/OpenSans-Italic-webfont.woff +0 -0
  112. package/docs/fonts/OpenSans-Light-webfont.eot +0 -0
  113. package/docs/fonts/OpenSans-Light-webfont.svg +0 -1831
  114. package/docs/fonts/OpenSans-Light-webfont.woff +0 -0
  115. package/docs/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  116. package/docs/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  117. package/docs/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  118. package/docs/fonts/OpenSans-Regular-webfont.eot +0 -0
  119. package/docs/fonts/OpenSans-Regular-webfont.svg +0 -1831
  120. package/docs/fonts/OpenSans-Regular-webfont.woff +0 -0
  121. package/docs/global.html +0 -548
  122. package/docs/index-custom.html +0 -79
  123. package/docs/index.html +0 -82
  124. package/docs/jsdoc.config.json +0 -22
  125. package/docs/scripts/linenumber.js +0 -25
  126. package/docs/scripts/prettify/Apache-License-2.0.txt +0 -202
  127. package/docs/scripts/prettify/lang-css.js +0 -2
  128. package/docs/scripts/prettify/prettify.js +0 -28
  129. package/docs/styles/jsdoc-default.css +0 -358
  130. package/docs/styles/prettify-jsdoc.css +0 -111
  131. package/docs/styles/prettify-tomorrow.css +0 -132
  132. package/docs/view-stream.js.html +0 -767
@@ -0,0 +1,3 @@
1
+ /*! For license information please see spyne.umd.js.LICENSE.txt */
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("ramda"),require("rxjs"),require("rxjs/operators")):"function"==typeof define&&define.amd?define("spyne",["ramda","rxjs","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("ramda"),require("rxjs"),require("rxjs/operators")):e.spyne=t(e.R,e.rxjs,e.rxjs.operators)}(self,((e,t,r)=>(()=>{"use strict";var n={131:t=>{t.exports=e},725:e=>{e.exports=r},50:e=>{e.exports=t}},o={};function s(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,s),r.exports}s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};s.r(i),s.d(i,{Channel:()=>mt,ChannelFetch:()=>Dt,ChannelFetchUtil:()=>Ot,ChannelPayload:()=>k,ChannelPayloadFilter:()=>at,ChannelsMap:()=>Lt,DomElement:()=>Be,DomElementTemplate:()=>ze,SpyneApp:()=>Pt,SpyneAppProperties:()=>I,SpynePlugin:()=>vt,SpyneTrait:()=>bt,ViewStream:()=>ut,ViewStreamBroadcaster:()=>et,ViewStreamElement:()=>Xe,ViewStreamPayload:()=>Je,ViewStreamSelector:()=>ht,deepMerge:()=>u,safeClone:()=>F});var a=s(131);const c=Object.create({}),l=(0,a.compose)(a.not,(0,a.is)(Array)),d=(0,a.compose)((0,a.allPass)([l,(0,a.is)(Object)]));function E(e){return e&&"object"==typeof e&&"[object RegExp]"!==Object.prototype.toString.call(e)&&"[object Date]"!==Object.prototype.toString.call(e)}function p(e,t){return t&&!0===t.clone&&E(e)?u((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function h(e,t,r){const n=e.slice();return t.forEach((function(t,o){void 0===n[o]?n[o]=p(t,r):E(t)?n[o]=u(e[o],t,r):-1===e.indexOf(t)&&n.push(p(t,r))})),n}function u(e,t,r){const n=Array.isArray(t),o=(r||{arrayMerge:h}).arrayMerge||h;return n?Array.isArray(e)?o(e,t,r):p(t,r):function(e,t,r){const n={};return E(e)&&Object.keys(e).forEach((function(t){n[t]=p(e[t],r)})),Object.keys(t).forEach((function(o){E(t[o])&&e[o]?n[o]=u(e[o],t[o],r):n[o]=p(t[o],r)})),n}(e,t,r)}let N,m,_,T;u.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce((function(e,r){return u(e,r,t)}))};let A,C=!0;const f=[],g=new Map,S=new class{constructor(){c.foo=()=>console.log("used for testing purposes.")}addMethod(e,t,r=!1){if(!0===Object.prototype.hasOwnProperty.call(c,e)){const t=`Spyne Warning: the method name, ${e}, already exists.`;if(r)return t;console.warn(t)}else c[e]=t}addMethods(e={},t=!1){let r;return!1===d(e)?(r=`Spyne Warning: the pluginMethods property, ${JSON.stringify(e)} needs to be an object.`,t?r:void console.warn(r)):(0,a.keys)(e).map((n=>{const o=(0,a.prop)(n,e);if("function"==typeof o)this.addMethod(n,o,t);else{if(r=`the value for ${n} is not a valid function.`,t)return r;console.warn(r)}})).join(",")}checkIfMethodExists(e){}get pluginMethodsObj(){return c}},I=new class{constructor(){T=!1}get channelsMap(){return _}get initialized(){return T}get config(){return N}get debug(){return C}static listChannels(){return Array.from(m.map.keys())}initialize(e={},t={},r,n){return m=r,N=u(e,t),N.channels&&N.channels.ROUTE&&(N=n.conformRouteObject(N)),A=N?.IMG_PATH,C=void 0!==N.debug?N.debug:C,this.getChannelActions=m.getChannelActions.bind(m),this.listRegisteredChannels=m.listRegisteredChannels.bind(m),T=!0,this.setChannelsMap(),t?.baseHref&&this.setHeadBaseHref(t.baseHref),N}setHeadBaseHref(e){const t=document.createElement("base");t.href=e,document.head.appendChild(t)}conformRouteConfig(e=!1){N=SpyneUtilsChannelRoute.conformRouteObject(N,e)}setChannelsMap(){const e=m.getStream.bind(m),t=m.testStream.bind(m),r=m.getProxySubject.bind(m);_={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t){N.tmp[e]=t}getProp(e){return(0,a.path)(["tmp",e],N)}setChannelConfig(e,t){return N.channels[e]=t,N.channels[e]}getChannelConfig(e,t=N){if("CHANNEL_ROUTE"===e?e="ROUTE":"CHANNEL_WINDOW"===e&&(e="WINDOW"),void 0===t||void 0===N.channels)return void console.warn("Spyne warning: Spyne config object is empty!");const r=N.channels[e];if(void 0!==r)return r;console.warn(`Spyne warning: Spyne configuration for channel, ${e} is empty!`)}registerChannel(){}addPluginConfig(e,t={}){void 0===N.plugins&&(N.plugins={}),this.addPluginMethods(t.pluginMethods),N.plugins[e]=t}getPluginsMethodObj(e){return e&&this.addPluginMethods(e),S.pluginMethodsObj}addPluginMethods(e){e&&S.addMethods(e)}doNotTrackChannel(e){f.push(e)}getUntrackedChannelsList(){return f}registerProxyReviver(e,t){g.set(e,t)}getProxyReviver(e){return g.get(e)}getPluginConfigByPluginName(e){return N.plugins[e]}get IMG_PATH(){return A}tempGetChannelsInstance(){}tempGetConfig(){}};var y=s(50);const L=()=>({includes:()=>!0===I.initialized?I.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),b=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],O=["parent","self","child","children","view"],D=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],v=["subscribe","combineLatest"];let R=[],H=[],P=null,V=null,U=null,w=null,M=null,W=null,x=null;if(void 0!==a.compose&&void 0!==y.Observable){R=[{error:`need to match a valid name within ${D}`,predicate:e=>L().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>void 0!==e.observable.subscribe},{error:"param action must be a registered action",predicate:e=>v.includes(e.action)}],H=[{error:"needs vsid number in srcElement",predicate:(0,a.compose)((0,a.is)(String),(0,a.path)(["data","srcElement","vsid"]))},{error:"needs a id in srcElement",predicate:(0,a.compose)((0,a.is)(String),(0,a.path)(["data","srcElement","id"]))}],P=function(){return[].concat(R).concat(H)};const e=[{error:`need to match a valid name within ${D}`,predicate:e=>L().includes(e.name)},{error:`needs one of the following step strings: ${b}`,predicate:e=>b.includes(e.STEP)},{error:`type needs to one of the following: ${O}`,predicate:e=>O.includes(e.type)},{error:"viewId needs to be added ",predicate:e=>void 0!==e.viewId}];U=function(){return[].concat(e)},w=function(){return[{error:"DISPOSE STEP requires a disposeItem param in the data object",predicate:e=>"DISPOSE"===e.STEP&&void 0!==e.data.disposeItems}].concat(e)},M=function(){return[{error:"UPDATE STEP requires a data object ",predicate:e=>"UPDATE"===e.STEP&&void 0!==e.data}].concat(e)},V=function(){return e.concat(R).concat(H)},W=function(){return[].concat(R).concat(H)},x=function(){const e=[{error:"param 'name' must be of a registered type",predicate:e=>L().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>D.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>v.includes(e.action)}];return{streams:[{init:{name:"DISPATCHER",observable:()=>new y.Subject,action:"subscribe"},structure:{type:String,observable:y.Observable||y.Subject,action:String},validations:e},{init:{name:"UBU",observable:()=>new y.Subject,action:"subscribe"},structure:{type:String,observable:y.Observable||y.Subject,action:String},validations:e}]}}}const F=function(e){const{__proxy__proxyName:t}=e;if(void 0!==t){const r=I.getProxyReviver(t);if("function"==typeof r)return((e,t)=>{const{__proxy__proxyName:r}=e;void 0===r&&console.error("object is not proxy object ",e);const n=(r,n)=>{const o=(0,a.path)(n,e),{__proxy__isProxy:s,__proxy__props:i}=o;return s?t(r,i):r},o=n((0,a.clone)(e),[]),s=(e,t)=>{const r=t||[];Object.entries(e).forEach((([t,o])=>{const i=(e=>{let t=typeof e;return["number","boolean","string"].includes(t)?t="primitive":"object"===t&&(Array.isArray(e)?t="array":null===e&&(t="undefined")),t})(o),a=[...r];a.push(t),"object"!==i&&"array"!==i||(e[t]=n(o,a),s(o,a))}))};return s(o),o})(e,r)}const r=(0,a.is)(Array),n=(0,a.is)(Object);var o;return!1===r(o=e)&&!0===n(o)?(0,a.compose)(a.fromPairs,a.toPairs,a.clone)(e):(0,a.clone)(e)};class k{constructor(e,t,r,n,o,s){const i=e;s&&console.time(s);const c={channelName:e,action:t,srcElement:n,event:o},l=k.deepFreeze(r);if(c.payload=l,!0===I.debug){if(Object.prototype.hasOwnProperty.call(r,"payload")){const e=JSON.stringify(r);console.warn(`Spyne Warning: the following payload contains a nested payload property which may create conflicts: Action: ${t}, ${e}`)}const e=I.getChannelActions(i);k.validateAction(t,i,e)}c.clone=()=>(0,a.mergeAll)([{payload:F(c.payload)},c.payload,{channel:(0,a.clone)(i)},{event:(0,a.clone)(o)},{srcElement:n},(0,a.clone)(c.srcElement),{action:(0,a.clone)(c.action)}]);const d={$dir:{get:()=>c._dir,set:e=>(c._dir=e,e)}};return"CHANNEL_ROUTE"===i&&(d.location={get:()=>k.getLocationData()}),c._dir=void 0,Object.defineProperties(c,d),s&&console.timeEnd(s),c}static validateAction(e,t,r){const n=(0,a.includes)(e,r);return!1===n&&!0===I.initialized&&console.warn(`warning: Action: '${e}' is not registered within the ${t} channel!`),n}static getLocationData(){return(0,a.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getStreamItem(){}static deepClone(e){const t=(0,a.is)(Array),r=(0,a.is)(Object);var n;return!1===t(n=e)&&!0===r(n)?(0,a.compose)(a.fromPairs,a.toPairs,a.clone)(e):(0,a.clone)(e)}static deepFreeze(e){const t=(0,a.compose)((0,a.lte)(0),(0,a.defaultTo)(-1),(0,a.prop)("nodeType"));try{Object.freeze(e),Object.getOwnPropertyNames(e).forEach((function(r){!Object.prototype.hasOwnProperty.call(e,r)||!1!==t(e[r])||null===e[r]||"object"!=typeof e[r]&&"function"!=typeof e[r]||Object.isFrozen(e[r])||k.deepFreeze(e[r])}))}catch(t){return e}return e}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}}function $(){return{createpropsMap:function(){const e=new WeakMap,t={vsid:this.props.vsid};return e.set(t,this.props),{key:t,weakMap:e}},gc:function(){for(const e in this)delete this[e]},createId:function(){return Math.random().toString(36).replace(/\d/gm,"").substring(1,8)},setTraceFunc:function(e){return!0===e?console.log:()=>{}}}}const j=e=>{if(void 0!==e.constructor.name)return e.constructor.name;const t=e.toString();return(0,a.defaultTo)(String(t).substr(0,12),(0,a.match)(/^(function\s)(\w+)(\(.*)$/,t)[2])},G=e=>{const t=(0,a.compose)((0,a.complement)(a.isEmpty),a.head,a.values),r=(0,a.compose)((0,a.complement)(a.isNil),a.head,a.values);return(0,a.allPass)([t,r])(e)},{entries:z,setPrototypeOf:B,isFrozen:Y,getPrototypeOf:q,getOwnPropertyDescriptor:K}=Object;let{freeze:X,seal:Q,create:J}=Object,{apply:Z,construct:ee}="undefined"!=typeof Reflect&&Reflect;X||(X=function(e){return e}),Q||(Q=function(e){return e}),Z||(Z=function(e,t,r){return e.apply(t,r)}),ee||(ee=function(e,t){return new e(...t)});const te=ue(Array.prototype.forEach),re=ue(Array.prototype.pop),ne=ue(Array.prototype.push),oe=ue(String.prototype.toLowerCase),se=ue(String.prototype.toString),ie=ue(String.prototype.match),ae=ue(String.prototype.replace),ce=ue(String.prototype.indexOf),le=ue(String.prototype.trim),de=ue(Object.prototype.hasOwnProperty),Ee=ue(RegExp.prototype.test),pe=(he=TypeError,function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return ee(he,t)});var he;function ue(e){return function(t){for(var r=arguments.length,n=new Array(r>1?r-1:0),o=1;o<r;o++)n[o-1]=arguments[o];return Z(e,t,n)}}function Ne(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:oe;B&&B(e,null);let n=t.length;for(;n--;){let o=t[n];if("string"==typeof o){const e=r(o);e!==o&&(Y(t)||(t[n]=e),o=e)}e[o]=!0}return e}function me(e){for(let t=0;t<e.length;t++)de(e,t)||(e[t]=null);return e}function _e(e){const t=J(null);for(const[r,n]of z(e))de(e,r)&&(Array.isArray(n)?t[r]=me(n):n&&"object"==typeof n&&n.constructor===Object?t[r]=_e(n):t[r]=n);return t}function Te(e,t){for(;null!==e;){const r=K(e,t);if(r){if(r.get)return ue(r.get);if("function"==typeof r.value)return ue(r.value)}e=q(e)}return function(){return null}}const Ae=X(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),Ce=X(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),fe=X(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),ge=X(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),Se=X(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),Ie=X(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),ye=X(["#text"]),Le=X(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),be=X(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),Oe=X(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),De=X(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),ve=Q(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Re=Q(/<%[\w\W]*|[\w\W]*%>/gm),He=Q(/\$\{[\w\W]*}/gm),Pe=Q(/^data-[\-\w.\u00B7-\uFFFF]+$/),Ve=Q(/^aria-[\-\w]+$/),Ue=Q(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),we=Q(/^(?:\w+script|data):/i),Me=Q(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),We=Q(/^html$/i),xe=Q(/^[a-z][.\w]*(-[.\w]+)+$/i);var Fe=Object.freeze({__proto__:null,ARIA_ATTR:Ve,ATTR_WHITESPACE:Me,CUSTOM_ELEMENT:xe,DATA_ATTR:Pe,DOCTYPE_NAME:We,ERB_EXPR:Re,IS_ALLOWED_URI:Ue,IS_SCRIPT_OR_DATA:we,MUSTACHE_EXPR:ve,TMPLIT_EXPR:He});const ke=function(){return"undefined"==typeof window?null:window};var $e=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ke();const r=t=>e(t);if(r.version="3.2.3",r.removed=[],!t||!t.document||9!==t.document.nodeType)return r.isSupported=!1,r;let{document:n}=t;const o=n,s=o.currentScript,{DocumentFragment:i,HTMLTemplateElement:a,Node:c,Element:l,NodeFilter:d,NamedNodeMap:E=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:p,DOMParser:h,trustedTypes:u}=t,N=l.prototype,m=Te(N,"cloneNode"),_=Te(N,"remove"),T=Te(N,"nextSibling"),A=Te(N,"childNodes"),C=Te(N,"parentNode");if("function"==typeof a){const e=n.createElement("template");e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let f,g="";const{implementation:S,createNodeIterator:I,createDocumentFragment:y,getElementsByTagName:L}=n,{importNode:b}=o;let O={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};r.isSupported="function"==typeof z&&"function"==typeof C&&S&&void 0!==S.createHTMLDocument;const{MUSTACHE_EXPR:D,ERB_EXPR:v,TMPLIT_EXPR:R,DATA_ATTR:H,ARIA_ATTR:P,IS_SCRIPT_OR_DATA:V,ATTR_WHITESPACE:U,CUSTOM_ELEMENT:w}=Fe;let{IS_ALLOWED_URI:M}=Fe,W=null;const x=Ne({},[...Ae,...Ce,...fe,...Se,...ye]);let F=null;const k=Ne({},[...Le,...be,...Oe,...De]);let $=Object.seal(J(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),j=null,G=null,B=!0,Y=!0,q=!1,K=!0,Q=!1,Z=!0,ee=!1,he=!1,ue=!1,me=!1,ve=!1,Re=!1,He=!0,Pe=!1,Ve=!0,we=!1,Me={},xe=null;const $e=Ne({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let je=null;const Ge=Ne({},["audio","video","img","source","image","track"]);let ze=null;const Be=Ne({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ye="http://www.w3.org/1998/Math/MathML",qe="http://www.w3.org/2000/svg",Ke="http://www.w3.org/1999/xhtml";let Xe=Ke,Qe=!1,Je=null;const Ze=Ne({},[Ye,qe,Ke],se);let et=Ne({},["mi","mo","mn","ms","mtext"]),tt=Ne({},["annotation-xml"]);const rt=Ne({},["title","style","font","a","script"]);let nt=null;const ot=["application/xhtml+xml","text/html"];let st=null,it=null;const at=n.createElement("form"),ct=function(e){return e instanceof RegExp||e instanceof Function},lt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!it||it!==e){if(e&&"object"==typeof e||(e={}),e=_e(e),nt=-1===ot.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,st="application/xhtml+xml"===nt?se:oe,W=de(e,"ALLOWED_TAGS")?Ne({},e.ALLOWED_TAGS,st):x,F=de(e,"ALLOWED_ATTR")?Ne({},e.ALLOWED_ATTR,st):k,Je=de(e,"ALLOWED_NAMESPACES")?Ne({},e.ALLOWED_NAMESPACES,se):Ze,ze=de(e,"ADD_URI_SAFE_ATTR")?Ne(_e(Be),e.ADD_URI_SAFE_ATTR,st):Be,je=de(e,"ADD_DATA_URI_TAGS")?Ne(_e(Ge),e.ADD_DATA_URI_TAGS,st):Ge,xe=de(e,"FORBID_CONTENTS")?Ne({},e.FORBID_CONTENTS,st):$e,j=de(e,"FORBID_TAGS")?Ne({},e.FORBID_TAGS,st):{},G=de(e,"FORBID_ATTR")?Ne({},e.FORBID_ATTR,st):{},Me=!!de(e,"USE_PROFILES")&&e.USE_PROFILES,B=!1!==e.ALLOW_ARIA_ATTR,Y=!1!==e.ALLOW_DATA_ATTR,q=e.ALLOW_UNKNOWN_PROTOCOLS||!1,K=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Q=e.SAFE_FOR_TEMPLATES||!1,Z=!1!==e.SAFE_FOR_XML,ee=e.WHOLE_DOCUMENT||!1,me=e.RETURN_DOM||!1,ve=e.RETURN_DOM_FRAGMENT||!1,Re=e.RETURN_TRUSTED_TYPE||!1,ue=e.FORCE_BODY||!1,He=!1!==e.SANITIZE_DOM,Pe=e.SANITIZE_NAMED_PROPS||!1,Ve=!1!==e.KEEP_CONTENT,we=e.IN_PLACE||!1,M=e.ALLOWED_URI_REGEXP||Ue,Xe=e.NAMESPACE||Ke,et=e.MATHML_TEXT_INTEGRATION_POINTS||et,tt=e.HTML_INTEGRATION_POINTS||tt,$=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ct(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&($.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ct(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&($.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&($.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Q&&(Y=!1),ve&&(me=!0),Me&&(W=Ne({},ye),F=[],!0===Me.html&&(Ne(W,Ae),Ne(F,Le)),!0===Me.svg&&(Ne(W,Ce),Ne(F,be),Ne(F,De)),!0===Me.svgFilters&&(Ne(W,fe),Ne(F,be),Ne(F,De)),!0===Me.mathMl&&(Ne(W,Se),Ne(F,Oe),Ne(F,De))),e.ADD_TAGS&&(W===x&&(W=_e(W)),Ne(W,e.ADD_TAGS,st)),e.ADD_ATTR&&(F===k&&(F=_e(F)),Ne(F,e.ADD_ATTR,st)),e.ADD_URI_SAFE_ATTR&&Ne(ze,e.ADD_URI_SAFE_ATTR,st),e.FORBID_CONTENTS&&(xe===$e&&(xe=_e(xe)),Ne(xe,e.FORBID_CONTENTS,st)),Ve&&(W["#text"]=!0),ee&&Ne(W,["html","head","body"]),W.table&&(Ne(W,["tbody"]),delete j.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw pe('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw pe('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');f=e.TRUSTED_TYPES_POLICY,g=f.createHTML("")}else void 0===f&&(f=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let r=null;const n="data-tt-policy-suffix";t&&t.hasAttribute(n)&&(r=t.getAttribute(n));const o="dompurify"+(r?"#"+r:"");try{return e.createPolicy(o,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+o+" could not be created."),null}}(u,s)),null!==f&&"string"==typeof g&&(g=f.createHTML(""));X&&X(e),it=e}},dt=Ne({},[...Ce,...fe,...ge]),Et=Ne({},[...Se,...Ie]),pt=function(e){ne(r.removed,{element:e});try{C(e).removeChild(e)}catch(t){_(e)}},ht=function(e,t){try{ne(r.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){ne(r.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(me||ve)try{pt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},ut=function(e){let t=null,r=null;if(ue)e="<remove></remove>"+e;else{const t=ie(e,/^[\r\n\t ]+/);r=t&&t[0]}"application/xhtml+xml"===nt&&Xe===Ke&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const o=f?f.createHTML(e):e;if(Xe===Ke)try{t=(new h).parseFromString(o,nt)}catch(e){}if(!t||!t.documentElement){t=S.createDocument(Xe,"template",null);try{t.documentElement.innerHTML=Qe?g:o}catch(e){}}const s=t.body||t.documentElement;return e&&r&&s.insertBefore(n.createTextNode(r),s.childNodes[0]||null),Xe===Ke?L.call(t,ee?"html":"body")[0]:ee?t.documentElement:s},Nt=function(e){return I.call(e.ownerDocument||e,e,d.SHOW_ELEMENT|d.SHOW_COMMENT|d.SHOW_TEXT|d.SHOW_PROCESSING_INSTRUCTION|d.SHOW_CDATA_SECTION,null)},mt=function(e){return e instanceof p&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof E)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},_t=function(e){return"function"==typeof c&&e instanceof c};function Tt(e,t,n){te(e,(e=>{e.call(r,t,n,it)}))}const At=function(e){let t=null;if(Tt(O.beforeSanitizeElements,e,null),mt(e))return pt(e),!0;const n=st(e.nodeName);if(Tt(O.uponSanitizeElement,e,{tagName:n,allowedTags:W}),e.hasChildNodes()&&!_t(e.firstElementChild)&&Ee(/<[/\w]/g,e.innerHTML)&&Ee(/<[/\w]/g,e.textContent))return pt(e),!0;if(7===e.nodeType)return pt(e),!0;if(Z&&8===e.nodeType&&Ee(/<[/\w]/g,e.data))return pt(e),!0;if(!W[n]||j[n]){if(!j[n]&&ft(n)){if($.tagNameCheck instanceof RegExp&&Ee($.tagNameCheck,n))return!1;if($.tagNameCheck instanceof Function&&$.tagNameCheck(n))return!1}if(Ve&&!xe[n]){const t=C(e)||e.parentNode,r=A(e)||e.childNodes;if(r&&t)for(let n=r.length-1;n>=0;--n){const o=m(r[n],!0);o.__removalCount=(e.__removalCount||0)+1,t.insertBefore(o,T(e))}}return pt(e),!0}return e instanceof l&&!function(e){let t=C(e);t&&t.tagName||(t={namespaceURI:Xe,tagName:"template"});const r=oe(e.tagName),n=oe(t.tagName);return!!Je[e.namespaceURI]&&(e.namespaceURI===qe?t.namespaceURI===Ke?"svg"===r:t.namespaceURI===Ye?"svg"===r&&("annotation-xml"===n||et[n]):Boolean(dt[r]):e.namespaceURI===Ye?t.namespaceURI===Ke?"math"===r:t.namespaceURI===qe?"math"===r&&tt[n]:Boolean(Et[r]):e.namespaceURI===Ke?!(t.namespaceURI===qe&&!tt[n])&&!(t.namespaceURI===Ye&&!et[n])&&!Et[r]&&(rt[r]||!dt[r]):!("application/xhtml+xml"!==nt||!Je[e.namespaceURI]))}(e)?(pt(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!Ee(/<\/no(script|embed|frames)/i,e.innerHTML)?(Q&&3===e.nodeType&&(t=e.textContent,te([D,v,R],(e=>{t=ae(t,e," ")})),e.textContent!==t&&(ne(r.removed,{element:e.cloneNode()}),e.textContent=t)),Tt(O.afterSanitizeElements,e,null),!1):(pt(e),!0)},Ct=function(e,t,r){if(He&&("id"===t||"name"===t)&&(r in n||r in at))return!1;if(Y&&!G[t]&&Ee(H,t));else if(B&&Ee(P,t));else if(!F[t]||G[t]){if(!(ft(e)&&($.tagNameCheck instanceof RegExp&&Ee($.tagNameCheck,e)||$.tagNameCheck instanceof Function&&$.tagNameCheck(e))&&($.attributeNameCheck instanceof RegExp&&Ee($.attributeNameCheck,t)||$.attributeNameCheck instanceof Function&&$.attributeNameCheck(t))||"is"===t&&$.allowCustomizedBuiltInElements&&($.tagNameCheck instanceof RegExp&&Ee($.tagNameCheck,r)||$.tagNameCheck instanceof Function&&$.tagNameCheck(r))))return!1}else if(ze[t]);else if(Ee(M,ae(r,U,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==ce(r,"data:")||!je[e])if(q&&!Ee(V,ae(r,U,"")));else if(r)return!1;return!0},ft=function(e){return"annotation-xml"!==e&&ie(e,w)},gt=function(e){Tt(O.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||mt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:F,forceKeepAttr:void 0};let o=t.length;for(;o--;){const s=t[o],{name:i,namespaceURI:a,value:c}=s,l=st(i);let d="value"===i?c:le(c);if(n.attrName=l,n.attrValue=d,n.keepAttr=!0,n.forceKeepAttr=void 0,Tt(O.uponSanitizeAttribute,e,n),d=n.attrValue,!Pe||"id"!==l&&"name"!==l||(ht(i,e),d="user-content-"+d),Z&&Ee(/((--!?|])>)|<\/(style|title)/i,d)){ht(i,e);continue}if(n.forceKeepAttr)continue;if(ht(i,e),!n.keepAttr)continue;if(!K&&Ee(/\/>/i,d)){ht(i,e);continue}Q&&te([D,v,R],(e=>{d=ae(d,e," ")}));const E=st(e.nodeName);if(Ct(E,l,d)){if(f&&"object"==typeof u&&"function"==typeof u.getAttributeType)if(a);else switch(u.getAttributeType(E,l)){case"TrustedHTML":d=f.createHTML(d);break;case"TrustedScriptURL":d=f.createScriptURL(d)}try{a?e.setAttributeNS(a,i,d):e.setAttribute(i,d),mt(e)?pt(e):re(r.removed)}catch(e){}}}Tt(O.afterSanitizeAttributes,e,null)},St=function e(t){let r=null;const n=Nt(t);for(Tt(O.beforeSanitizeShadowDOM,t,null);r=n.nextNode();)Tt(O.uponSanitizeShadowNode,r,null),At(r),gt(r),r.content instanceof i&&e(r.content);Tt(O.afterSanitizeShadowDOM,t,null)};return r.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,s=null,a=null,l=null;if(Qe=!e,Qe&&(e="\x3c!--\x3e"),"string"!=typeof e&&!_t(e)){if("function"!=typeof e.toString)throw pe("toString is not a function");if("string"!=typeof(e=e.toString()))throw pe("dirty is not a string, aborting")}if(!r.isSupported)return e;if(he||lt(t),r.removed=[],"string"==typeof e&&(we=!1),we){if(e.nodeName){const t=st(e.nodeName);if(!W[t]||j[t])throw pe("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof c)n=ut("\x3c!----\x3e"),s=n.ownerDocument.importNode(e,!0),1===s.nodeType&&"BODY"===s.nodeName||"HTML"===s.nodeName?n=s:n.appendChild(s);else{if(!me&&!Q&&!ee&&-1===e.indexOf("<"))return f&&Re?f.createHTML(e):e;if(n=ut(e),!n)return me?null:Re?g:""}n&&ue&&pt(n.firstChild);const d=Nt(we?e:n);for(;a=d.nextNode();)At(a),gt(a),a.content instanceof i&&St(a.content);if(we)return e;if(me){if(ve)for(l=y.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(F.shadowroot||F.shadowrootmode)&&(l=b.call(o,l,!0)),l}let E=ee?n.outerHTML:n.innerHTML;return ee&&W["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&Ee(We,n.ownerDocument.doctype.name)&&(E="<!DOCTYPE "+n.ownerDocument.doctype.name+">\n"+E),Q&&te([D,v,R],(e=>{E=ae(E,e," ")})),f&&Re?f.createHTML(E):E},r.setConfig=function(){lt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),he=!0},r.clearConfig=function(){it=null,he=!1},r.isValidAttribute=function(e,t,r){it||lt({});const n=st(e),o=st(t);return Ct(n,o,r)},r.addHook=function(e,t){"function"==typeof t&&ne(O[e],t)},r.removeHook=function(e){return re(O[e])},r.removeHooks=function(e){O[e]=[]},r.removeAllHooks=function(){O={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},r}();let je,Ge=!1;class ze{constructor(e,t={}){this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,(()=>{!0===(0,a.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t;const r=ze.getStringArray(this.template);let n=this.template.match(ze.findTmplLoopsRE());n=null===n?[]:n;const o=ze.parseTmplLoopsRE(),s=this.parseTheTmplLoop.bind(this),i=(0,a.includes)(a.__,n),c=(0,a.ifElse)(i,((e,t)=>e.replace(o,s)),this.addParams.bind(this));this.finalArr=r.map(c)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static getNestedDataReducer(e={},t=""){return/(\.)/gm.test(String(t))?String(t).split(".").reduce(((e,t)=>e[t]?e[t]:"string"==typeof e?e:""),e):e[t]??""}static getStringArray(e){const t=e.split(ze.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/;return(0,a.reject)((e=>e.match(r)),t)}static findTmplLoopsRE(){return/({{#[\w.]+}}[\w\n\s\W]+?{{\/[\w.]+}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}renderDocFrag(){let e=ze.replaceImgPath(this.finalArr.join(""));e=(e=>{if(!Ge)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return je(e)})(e);const t=/^([^>]*?)(<){1}(\b)(thead|col|colgroup|tbody|td|tfoot|tr|th)(\b)([^\0]*)$/.test(e)?e:document.createRange().createContextualFragment(e);return window.setTimeout(this.removeThis,2),t}renderToString(){let e=this.finalArr.join("");return e=ze.replaceImgPath(e),window.setTimeout(this.removeThis,2),e}getTemplateString(){return this.finalArr.join("")}formatTemplate(e){return!0===["SCRIPT","TEMPLATE"].includes((0,a.prop)("nodeName",e))?e.innerHTML:e}getDataValFromPathStr(e,t){const r=String(e).split(".");return(0,a.path)(r,t)||""}addParams(e){return e.replace(ze.swapParamsForTagsRE(),((e,t,r,n)=>ze.getNestedDataReducer(this.templateData,r)))}static replaceImgPath(e){const{IMG_PATH:t}=I;return void 0!==t?(e=e.replaceAll(/src\s*=\s*(['"])imgs\//g,`src=$1${t}`)).replaceAll(/url\(\s*(['"]?)imgs\//g,`url($1${t}`):e}parseTheTmplLoop(e,t,r,n){const o=/(\.)/gm,s=n;let i=ze.getNestedDataReducer(this.templateData,r);const c=(e,t,r)=>ze.isPrimitiveTag(t)?l(e,t,r):d((()=>{const t=e,n=r,o=r+1;return this.isProxyData?{spyneLoopKey:t,__cms__dataId:i.__cms__dataId,origKey:i[`__cms__keyFor_${e}`],loopIndex:n,loopNum:o,d:e}:{spyneLoopKey:t,loopIndex:n,loopNum:o}})(),t,r),l=(e,t,r,n)=>t.replace(ze.swapParamsForTagsRE(),e),d=(e,t,r)=>t.replace(ze.swapParamsForTagsRE(),((t,n,s)=>{const i={loopIndex:r,loopNum:r+1};if(!1===o.test(s)&&void 0!==e[s])return void 0!==i[s]?i[s]:e[s];const a=this.getDataValFromPathStr(s,e);return void 0!==i[s]?i[s]:a}));return!0===(0,a.isNil)(i)||(0,a.isEmpty)(i)?"":(void 0===i.length&&(i=[i]),i.map(((e,t)=>"string"==typeof e?c(e,s,t):d(e,s,t))).join(""))}}class Be{constructor(e={}){var t;e.tagName=(t=e.tagName,(0,a.defaultTo)("div")(t)),e.attributes=void 0!==e.attributes?e.attributes:this.getDomAttributes(e),e.attrs=this.updateAttrs(e.attributes),e.fragment=document.createDocumentFragment(),this.props=e,this.addMixins()}setProp(e,t){this.props[e]=t}getProp(e){return this.props[e]}get el(){return this.props.el}setElAttrs(e,t){return this.getProp("attrs").forEach(((t,r)=>{"dataset"===r?(0,a.forEachObjIndexed)(((t,r)=>{e.dataset[r]=t}),t):e.setAttribute(r,t)})),e}updateAttrs(e,t){const r=void 0!==t?t:new Map;return(0,a.mapObjIndexed)(((e,t)=>r.set(t,e)),e),r}addTemplate(e){const t=this.getProp("template");return void 0!==t?(t=>{let r=this.getProp("data");r=(0,a.is)(Object,r)?r:{};const n=new ze(t,r).renderDocFrag();return(0,a.is)(String,n)?e.innerHTML=n:e.appendChild(n),e})(t):e}createElement(e="div"){return document.createElement(e)}addContent(e){const t=this.getProp("data");if(!0===(0,a.is)(String,t)){const r=document.createTextNode(t);e.appendChild(r)}return e}execute(){const e=(0,a.pipe)(this.createElement.bind(this),this.setElAttrs.bind(this),this.addTemplate.bind(this),this.addContent.bind(this))(this.getProp("tagName"));this.props.el=e}render(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el")}renderToHTMLString(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el").outerHTML}returnIfDefined(e,t){if(void 0!==t){const r=void 0===t;e[t]=!1===r?t:u(e[t],t)}}updateprops(e){return this.returnIfDefined(this.props,e),this}updatepropsAndRun(e){return this.updateprops(e),this.execute(),this.getProp("fragment")}unmount(){void 0!==this.props&&(this.getProp("el").remove(),this.props=void 0,this.gc())}updateTag(e="div"){this.updateprops(e)}updateAttributes(e={}){this.updateprops(e)}updateTemplate(e){this.updateprops(e)}updateData(e={}){this.updateprops(e)}addTagAndRender(e="div"){this.updatepropsAndRun(e)}addAttrsibutesAndRender(e={}){this.updatepropsAndRun(e)}addTemplateAndRender(e){this.updatepropsAndRun(e)}addDataAndRender(e={}){this.updatepropsAndRun(e)}addMixins(){const e=$();this.gc=e.gc.bind(this)}getDomAttributes(e){return(0,a.pick)(this.attributesArray,e)}get attributesArray(){return["accept","accept-charset","accesskey","action","align","allow","alt","async","autocapitalize","autocomplete","autofocus","autoplay","bgcolor","border","buffered","challenge","charset","checked","cite","class","code","codebase","color","cols","colspan","content","contenteditable","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","defer","dir","dirname","disabled","download","draggable","dropzone","enctype","for","form","formaction","headers","height","hidden","high","href","hreflang","http-equiv","icon","id","importance","integrity","ismap","itemprop","keytype","kind","label","lang","language","lazyload","list","loop","low","manifest","max","maxlength","minlength","media","method","min","multiple","muted","name","novalidate","open","optimum","pattern","ping","placeholder","poster","preload","radiogroup","readonly","referrerpolicy","rel","required","reversed","rows","rowspan","sandbox","scope","scoped","selected","shape","size","sizes","slot","span","spellcheck","src","srcdoc","srclang","srcset","start","step","style","summary","tabindex","target","title","translate","type","usemap","value","width","wrap"]}}const Ye=(e=!1,t=1,r="ease",n=!1)=>`${!0===n?"opacity:0;":""}transition: opacity ${t}s ${r}; opacity: ${!0===e?1:0};`;var qe=s(725);class Ke{constructor(e){this.props.observableStreams=Ke.createDirectionalObservables()}static createDirectionalFiltersObject(){const e="internal",t="parent",r="child";return{P:[t],C:[r],PCI:[t,e,r],CI:[r,e],PI:[t,e],PC:[t,r]}}static addDefaultDir(e){return(0,a.flip)(a.mergeRight)({$dir:["internal"]},(0,a.clone)(e))}static addDownInternalDir(e,t=["internal","down"]){return(0,a.flip)(a.mergeRight)((0,a.clone)(e),{$dir:t})}static addChildAndInternalDir(e,t=["child","down"]){return(0,a.flip)(a.mergeRight)((0,a.clone)(e),{$dir:t})}static mapToDefaultDir(e){return this.addDefaultDir(e)}static createDirectionalObservables(e=new y.Subject,t,r){void 0!==t&&void 0!==r&&(e.viewName=t,e.vsid=r);const n=e=>(0,a.propSatisfies)((t=>t.includes(e)),"$dir"),o=n("parent"),s=n("child"),i=n("internal"),c=e=>(0,a.mergeRight)({from$:e}),l=c("child"),d=c("internal"),E=c("parent"),p=e.pipe((0,qe.filter)((e=>void 0!==e&&void 0!==e.action))),h=e.pipe((0,qe.filter)(i),(0,qe.map)(d)),u=e.pipe((0,qe.filter)(o),(0,qe.map)(l)),N=e.pipe((0,qe.filter)(s),(0,qe.map)(E)),m={parent:u,internal:h,child:N};return{raw$:p,toInternal$:h,toParent$:u,toChild$:N,completeAll:()=>{(0,a.forEach)((e=>{e.complete(),e.isStopped=!0}),[p,h,u,N])},completeStream:(e=[])=>{void 0!==e&&e.length>=1&&e.forEach((e=>{var t;void 0!==m[e]&&((t=m[e]).complete(),t.isStopped=!0)}))}}}}class Xe{constructor(e,t={},r="",n="theName"){this.addMixins(),this._state="INIT",this.vsid=r,this.vsName=n,this.defaults={debug:!1,extendedHashMethods:{}},this.options=u(this.defaults,t),this.addActionListeners().forEach((e=>{const[t,r]=e;this.options.extendedHashMethods[t]=e=>this[r](e)})),this.options.hashMethods=this.setHashMethods(this.options.extendedHashMethods),this.sink$=e,this.sink$.subscribe(this.onObsSinkSubscribe.bind(this)),this.$dirs=Ke.createDirectionalFiltersObject(),this.addDefaultDir=Ke.addDefaultDir,this.sourceStreams=Ke.createDirectionalObservables(new y.Subject,this.vsName,this.vsid),this._source$=this.sourceStreams.toInternal$}addActionListeners(){return[]}setHashMethods(e={}){return u({VS_DETRITUS_COLLECT:e=>this.onGarbageCollect(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyForGC(e),EXTIRPATE:e=>this.onDispose(e),VS_SPAWN:e=>this.onRender(e),VS_SPAWN_AND_ATTACH_TO_PARENT:e=>this.onRenderAndAttachToParent(e),VS_SPAWN_AND_ATTACH_TO_DOM:e=>this.onRenderAndAttachToDom(e),ATTACH_CHILD_TO_SELF:e=>this.onAttachChildToSelf(e)},e)}createDomItem(){this.props=void 0!==this.props?this.props:{};const e=(0,a.filter)((e=>void 0!==e),(0,a.pick)(["id","className"],this.props)),{tagName:t,data:r,template:n}=this.props;return new Be(t,e,r,n)}onDisposeCompleted(e){}animateInTween(e,t){!function(e,t){const r=1*window.getComputedStyle(e).opacity,n=Ye(!0,t,"ease",1===r);e.style.cssText+=n}(e,t)}animateOutTween(e,t,r){!function(e,t,r){const n=Ye(!1,t,"ease");e.style.cssText+=n,e.addEventListener("transitionend",r,!1)}(e,t,r)}setAnimateIn(e){if(!0===e.animateIn){const t=void 0!==e.el?e.el:this.domItem.el;this.animateInTween(t,e.animateInTime)}}disposeMethod(e){const t=void 0!==e.el.el?e.el.el:e.el,r={action:"READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.PI,el:t},n=(0,y.bindCallback)(((e,r)=>{this.animateOutTween(t,e.animateOutTime,r)})),o=e=>{this._source$.next(r)},s=!0===e.animateOut?e=>(n(e).subscribe(o),{action:"EXTIRPATING",$dir:this.$dirs.CI}):()=>({action:"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.CI});return s(e)}onDispose(e){return this.disposeMethod(e)}removeStream(){void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["internal","child"])}onReadyForGC(e){this.removeStream()}onGarbageCollect(e){void 0!==this.domItem&&this.domItem.unmount(),void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["parent"])}getSourceStream(){return this._source$}combineDomItems(e){const t=(0,a.isNil)(e.query)?e.node:e.query;({appendChild:(e,t)=>e.appendChild(t),after:(e,t)=>e.after(t)}[e.attachType]||((e,t)=>e.insertBefore(t,e.firstChild)))(t,this.domItem.render()),this.setAnimateIn(e)}onAttachChildToSelf(e){const t=e.childRenderData;return this.combineDomItems(t),{action:"CHILD_ATTACHED",$dir:this.$dirs.PI}}onRenderAndAttachToParent(e){return this.onRender(e),this.combineDomItems(e),{action:"VS_SPAWNED_AND_ATTACHED_TO_PARENT",el:this.domItem.el,$dir:this.$dirs.PI}}renderDomItem(e){const[t,r,n,o]=e;return this.domItem=new Be({tagName:t,attributes:r,data:n,template:o}),this.domItem}onRender(e){return{action:"VS_SPAWNED",el:(e=>this.renderDomItem(e))((0,a.props)(["tagName","domAttributes","data","template"],e)),$dir:this.$dirs.I}}extendedMethods(e){}onRenderAndAttachToDom(e){return e.attachData.el=(e=>this.renderDomItem(e))((0,a.props)(["tagName","domAttributes","data","template"],e)),this.combineDomItems(e.attachData),{action:"VS_SPAWNED_AND_ATTACHED_TO_DOM",el:e.attachData.el.el,$dir:this.$dirs.CI}}onObsSinkSubscribe(e){const t=e.action,r=(0,a.defaultTo)((e=>this.extendedMethods(e))),n=r(this.options.hashMethods[t])(e);void 0!==n&&(e=>{this._source$.next(e)})(Object.freeze(n))}addMixins(){}}function Qe(){setTimeout((()=>{(0,a.forEach)((e=>{}),this)}),1)}class Je{constructor(e,t,r,n="subscribe",o=!1){const s={name:e,observable:t,data:r,action:n};this.sendToDirectorStream(s)}sendToDirectorStream(e){const t=I.channelsMap.getStream("DISPATCHER"),r=F(e);t.next(r),e=void 0}static deepClone(e){const t=(0,a.is)(Array),r=(0,a.is)(Object);var n;return!1===t(n=e)&&!0===r(n)?(0,a.compose)(a.fromPairs,a.toPairs,a.clone)(e):(0,a.clone)(e)}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}addMixins(){this.gc=Qe}}const Ze=!0===I.debug;class et{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,y.fromEvent)(e,"dblclick").pipe((0,qe.map)((e=>{const t=(0,a.clone)(e);return t.typeOverRide="dblclick",t})))}broadcast(e){if(e.length<=0&&!0===Ze)return void console.warn(`Spyne Warning: The nested array in ${this.props.name}.broadcastEvents appears to be empty --\x3e vsid:${this.props.vsid}!`);const t={UI:this.sendUIPayload,ROUTE:this.sendRoutePayload},[r,n,o]=e;let s,i=this.props.el.querySelectorAll(r);if(i.length<=0){const e=this.props.el,t=t=>{t===e&&(i=[t])};(()=>{const n=(null!==e.parentElement?e.parentElement:document).querySelectorAll(r);n.forEach=Array.prototype.forEach,n.forEach(t)})()}const c=void 0!==o;!0==(void 0===i||i.length<=0)&&!0===Ze?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(i.forEach=Array.prototype.forEach,i.forEach((e=>{const r="dblClick"!==n?(0,y.fromEvent)(e,n,{preventDefault:()=>!0}):this.addDblClickEvt(e);s=e.dataset.channel;const o={};o.payload=(e=>{const t={};for(const r in e)t[r]=e[r];return t})(e.dataset),o.payload=(0,a.omit)(["channel"],o.payload),o.channel=s,o.srcElement={},o.srcElement.id=this.props.id,o.srcElement.vsid=this.props.vsid,o.srcElement.isLocalEvent=c,o.srcElement.srcEvent=n,o.srcElement.el=e,(void 0!==s?t[s]:t.UI)(r,o)})))}broadcaster(e){e().forEach((e=>this.broadcast(e)))}addMixins(){const e=function(e,t){return new Je("CHANNEL_ROUTE",e,t,"subscribe")},t=function(e,t){return new Je("CHANNEL_UI",e,t,"subscribe")};this.sendUIPayload=t,this.sendRoutePayload=e}}const tt=(0,a.compose)(a.not,(0,a.is)(Array)),rt=(0,a.compose)(a.not,a.isEmpty),nt=(0,a.allPass)([(0,a.is)(String),rt]),ot=(0,a.allPass)([(0,a.is)(Array),rt]),st=(0,a.compose)((0,a.allPass)([tt,(0,a.is)(Object)])),it=(0,a.compose)((0,a.allPass)([rt,tt,(0,a.is)(Object)]));class at{constructor(e,t={},r,n){st(e)&&(t=e,e=(0,a.prop)("selector",t),n=n||(0,a.prop)("testMode",t));const o=[r,(0,a.prop)("debugLabel",t)];r=(0,a.compose)((0,a.find)((0,a.is)(String)))(o);let s=(0,a.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?s=(0,a.mergeAll)([t.props,s]):void 0!==t.propFilters&&(s=(0,a.mergeAll)([t.propFilters,s])),t.propFilters=s;const{propFilters:i}=t,c=nt(e)?at.filterSelector([e],r):void 0,l=ot(e)?at.filterSelector(e,r):void 0,d=it(i)?at.filterData(i,r):void 0;let E=(0,a.reject)(a.isNil,[c,l,d]);const p=(0,a.isEmpty)(E);return p&&(E=[(0,a.always)(!1)],!0===I.debug&&!0!==n&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${i} appears to be empty!`)),!0===n?{selector:e,propFilters:i,debugLabel:r,filters:t,testMode:n,filtersAreEmpty:p}:(0,a.allPass)(E)}static filterData(e,t){const r=t;return(()=>{if((0,a.isEmpty)(e))return(0,a.always)(!1);e=(0,a.map)(((e,t,r)=>{var n;return!0===(0,a.is)(String,e)?(n=e,e=>e===n):e}),e);const t=(0,a.where)(e);return(0,a.compose)(t,(t=>{if(void 0===r)return t;const n={};return(0,a.forEachObjIndexed)(((e,r)=>{n[r]=e((0,a.prop)(r,t))}),e),console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${r}"] - values: `,"color:orange;",{propsBooleans:n,comparedObj:t}),t}),(0,a.defaultTo)({}),(e=>{const{payload:t,srcElement:r,event:n}=e||{};return Object.assign({},e,r,n,t)}))})()}static checkPayloadSelector(e,t,r){const{payload:n,srcElement:o,event:s}=r||{},i=[o,n,(0,a.prop)("srcElement",s),r].reduce(((e,t)=>{const r=(0,a.prop)("el",t);return at.elIsDomElement(r)&&void 0===e&&(e=r),e}),void 0),c=e=>e.isEqualNode(i),l=e=>{const t=(0,a.flatten)(document.querySelectorAll(e));return(0,a.map)(c,t)};if(void 0!==t){const r=(0,a.compose)(a.flatten,(0,a.map)(l))(e),n=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:i,selectorsArr:n,nodeArrResultsDebugger:r})}if("object"!=typeof i)return!1;const d=(0,a.compose)(a.flatten,(0,a.map)(l))(e);return!0!==(0,a.isEmpty)(d)&&(0,a.any)((0,a.equals)(!0),d)}static elIsDomElement(e){return(0,a.is)(String,e)&&(e=document.querySelector(e)),(0,a.compose)((0,a.lte)(0),(0,a.defaultTo)(-1),(0,a.prop)("nodeType"))(e)}static filterSelector(e,t){const r=(0,a.reject)(a.isEmpty,e);return(0,a.curry)(at.checkPayloadSelector)(r,t)}}function ct(){return!0===I.debug}function lt(e,t,r=!1){const n=Et(e,t,r);return 1===n.length?(0,a.head)(n):n}function dt(e,t,r){const n=document.querySelector(e),o=(0,a.compose)((0,a.lte)(0),(0,a.defaultTo)(-1),(0,a.prop)("nodeType"));if(null===n||!1!==o(n)){if(void 0!==t&&String(t).trim().length>0){function s(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const i=s(t);!0===r&&!0===ct()&&!1===i&&console.warn(`Spyne Warning: the selector, ${t} does not exist in this el, ${e}`)}}else console.warn(`Spyne Warning: the el object is not a valid single element, ${n}`)}function Et(e,t,r=!1){let n=!1;const o=(r=>{let o=[];try{o=document.querySelectorAll(r)}catch(e){o=[]}try{n=document.querySelector(t)===document.querySelector(e),!0===n&&(o=[document.querySelector(t)])}catch(e){}return o})(void 0!==t?`${e} ${t}`:e);return!0===r&&dt(!0===n?"body":e,t,r),o}function pt(e,t,r){return Et(t,r).forEach((t=>{t.style.cssText=e})),this}function ht(e,t){function r(t){return ht(e,t)}return dt(e="string"==typeof e?e:function(e){let t=`${Math.random().toString(36).replace(/\d/gm,"").substring(1,8)}`;return void 0===e.dataset.vsid?e.dataset.vsid=t:t=e.dataset.vsid,`[data-vsid='${t}']`}(e),t,!1),r.map=r=>Array.from(Et(e,t)).map(r),r.forEach=r=>Array.from(Et(e,t)).map(r),r.getNodeListArray=()=>Et(e,t),r.addClass=r=>(Et(e,t).forEach((e=>e.classList.add(r))),this),r.removeClass=r=>(Et(e,t).forEach((e=>{e.classList.remove(r)})),this),r.setClass=r=>(Et(e,t).forEach((e=>{const t=(0,a.compose)((0,a.reject)(a.isEmpty),(0,a.split)(" "))(e.className),n=r.split(" ");t.forEach((t=>e.classList.remove(t))),n.forEach((t=>e.classList.add(t)))})),this),r.unmount=()=>{},r.toggleClass=(r,n)=>(Et(e,t).forEach((e=>{(n=void 0!==n?n:!e.classList.contains(r))?e.classList.add(r):e.classList.remove(r)})),this),r.toggle=(e,t)=>(r.toggleClass(e,t),this),r.appendChild=e=>(0!==r.el.length?r.el.appendChild(e):console.warn(`Spyne Warning: The selector, ${t} does not appear to be valid!`),r.el),r.addAnimClass=r=>{requestAnimationFrame((()=>{Et(e,t).forEach((e=>{try{e.classList.add(r)}catch(e){}}))}))},r.setActiveItem=(r,n)=>{const o=Et(e,t),s="string"==typeof n?lt(e,n):n;var i;return!0===(i=s,(0,a.compose)((0,a.lte)(0),(0,a.defaultTo)(-1),(0,a.prop)("nodeType"))(i))?o.forEach((e=>e.isEqualNode(s)?e.classList.add(r):e.classList.remove(r))):!0===ct()&&console.warn(`Spyne Warning: The selector, ${n}, does not appear to be a valid item in setActiveItem: ${r}`),this},Object.defineProperty(r,"el",{get:()=>lt(e,t,!0)}),Object.defineProperty(r,"els",{get:()=>Et(e,t)}),Object.defineProperty(r,"len",{get:()=>Et(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>Et(e,t,!1).length>=1}),Object.defineProperty(r,"exist",{get:()=>Et(e,t,!1).length>=1}),Object.defineProperty(r,"nodeList",{get:()=>Et(e,t)}),Object.defineProperty(r,"arr",{get:()=>{const r=lt(e,t,!0);return void 0===r?[]:void 0===r.length?[r]:Array.from(r)}}),Object.defineProperty(r,"inline",{set:r=>pt(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>pt(r,e,t),get:()=>r}),r}class ut{constructor(e={}){this.vsnum=Math.random(),this.addMixins(),this._postRenderCalled=!1,this.defaults=()=>{const t=this.createId(),r=e.id?e.id:t;return{vsid:t,id:r,tagName:"div",el:void 0,data:void 0,animateIn:!1,animateInTime:.5,animateOut:!1,animateOutTime:.5,sendLifecyleEvents:!1,hashId:`#${r}`,id$:`#${r}`,viewClass:Xe,extendedSourcesHashMethods:{},debug:!1,template:void 0,node:document.createDocumentFragment(),name:j(this)}},this._state={},this.$dirs=Ke.createDirectionalFiltersObject(),this.addDefaultDirection=Ke.addDefaultDir,this.addDownInternalDir=Ke.addDownInternalDir,this.props=u(this.defaults(),e),this.sendLifecycleMethod=!0===this.props.sendLifecyleEvents?this.sendLifecycleMethodActive.bind(this):this.sendLifecycleMethodInactive.bind(this);const t=this.attributesArray;this.props.domAttributes=(0,a.pick)(t,this.props),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.loadAllMethods(),this.props.action="LOADED",this.sink$=new y.Subject;const r=this.props.viewClass;this.view=new r(this.sink$,{},this.props.vsid,this.props.id),this.sourceStreams=this.view.sourceStreams,this._rawSource$=this.view.getSourceStream(),this._rawSource$.viewName=this.props.name,this.sendEventsDownStream=this.sendEventsDownStreamFn,this.initViewStream(),this.isDevMode=ut.isDevMode(),this.props.addedChannels=[],this.checkIfElementAlreadyExists()}get source$(){return this._source$}get attributesArray(){return["accesskey","class","contenteditable","dir","draggable","hidden","id","lang","spellcheck","style","tabindex","title","translate","aria-autocomplete","aria-checked","aria-disabled","aria-expanded","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-level","aria-multiline","aria-multiselectable","aria-orientation","aria-pressed","aria-readonly","aria-required","aria-selected","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","aria-atomic","aria-busy","aria-live","aria-relevant","aria-dropeffect","aria-grabbed","aria-activedescendant","aria-controls","aria-describedby","aria-flowto","aria-labelledby","aria-owns","aria-posinset","aria-setsize","accept","autocomplete","autofocus","checked","dirname","disabled","form","formaction","formenctype","formmethod","formnovalidate","formtarget","list","max","maxlength","min","minlength","multiple","name","pattern","placeholder","readonly","required","size","step","value","alt","srcset","sizes","usemap","ismap","href","target","download","ping","rel","hreflang","as","media","accept-charset","action","enctype","novalidate","content","charset","http-equiv","async","defer","integrity","nomodule","nonce","referrerpolicy","autocapitalize","autoplay","buffered","challenge","cite","code","codebase","color","cols","colspan","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","for","headers","high","icon","importance","itemprop","keytype","kind","label","language","lazyload","loop","low","manifest","method","muted","open","optimum","poster","preload","radiogroup","reversed","role","rows","rowspan","sandbox","scope","scoped","selected","shape","slot","span","srcdoc","src","type","srclang","start","summary","wrap","width","height"]}static isDevMode(){return I.debug}static checkIfActionsAreRegistered(e=[],t){if(t.length>0){const r=t=>{const r=new RegExp(t);if((0,a.findIndex)((0,a.test)(r),n)<0){const r=1===e.length?"from added channel":"from added channels";console.warn(`Spyne Warning: The action, ${t}, in ${this.props.name}, does not match any of the registered actions ${r}, ${e.join(", ")}`)}},n=(e=>{const t=e.map((e=>I.getChannelActions(e)));return(0,a.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,a.equals)(!0),r=(0,a.all)(t),n=(0,a.is)(String),o=(0,a.compose)(r,(0,a.map)(n),(0,a.slice)(0,2),(0,a.defaultTo)([]));return(0,a.compose)(r,(0,a.map)(o),(0,a.defaultTo)([]))(e)}static elIsDomElement(e){return(0,a.is)(String,e)&&(e=document.querySelector(e)),(0,a.compose)((0,a.lte)(0),(0,a.defaultTo)(-1),(0,a.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,a.compose)(a.toLower,(0,a.either)((0,a.prop)("tagName"),(0,a.always)("")));this.props.tagName=e(this.props.el)}checkIfElementAlreadyExists(){const e=(0,a.compose)((0,a.lte)(0),(0,a.defaultTo)(-1),(0,a.prop)("nodeType"));(0,a.propSatisfies)((0,a.allPass)([e=>document.body.contains(e),e]),"el")(this.props)?(this.updatePropsToMatchEl(),this.postRender()):null===this.props.el&&console.error(`Spyne Error: The defined element for this ViewStream instance, ${this.constructor.name}, appears to not exist.`)}loadAllMethods(){const e=(0,a.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach((t=>{let[r,n,o]=t;(0,a.is)(String,o)&&(o=new at({selector:o})),this.props.extendedSourcesHashMethods[r]=e(n,o)})),this.props.hashSourceMethods=this.setSourceHashMethods(this.props.extendedSourcesHashMethods)}addActionListeners(){return[]}onChannelMethodCall(e,t,r){if(void 0!==r.$dir&&r.$dir.includes("child")&&!0!==this.deleted){const e=u({},r);e.$dir=this.$dirs.C,this.sourceStreams.raw$.next(e)}!0===(0,a.defaultTo)((0,a.always)(!0),t)(r)&&(t=>{void 0===this[e]?console.warn(`Spyne Warning: The method, ${e} does not appear to exist in ${this.constructor.name}!`):this[e](t)})(r=(0,a.omit)(["$dir"],r))}setSourceHashMethods(e={}){const t={EXTIRPATING:e=>this.checkParentDispose(e),EXTIRPATE:e=>this.disposeViewStream(e),VS_SPAWNED:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_DOM:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_PARENT:e=>this.onVSRendered(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyToGC(e),VS_NULLITY:()=>({})};return u.all([{},t,e])}initViewStream(){this._source$=this._rawSource$.pipe((0,qe.map)((e=>this.onMapViewSource(e))),(0,qe.takeWhile)(this.notGCSTATE)),this.initAutoMergeSourceStreams(),this.updateSourceSubscription(this._source$,!0)}notGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}eqGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}notCOMPLETED(e){return!e.action.includes("COMPLETED")}notGCCOMPLETE(e){return!e.action.includes("GC_COMPLETE")}testVal(e){console.log("TESTING VALL IS ",e)}addParentStream(e,t){this.parent$=e.pipe((0,qe.filter)((e=>void 0!==e&&void 0!==e.action)),(0,qe.map)((e=>{const t=u({},e);return"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT"===t.action&&(this.disposeViewStream(t),t.action="READY_FOR_VS_DETRITUS_COLLECT"),t}))),this.updateSourceSubscription(this.parent$,!1,"PARENT"),this.renderAndAttachToParent(t)}addChildStream(e){const t=e.pipe((0,qe.filter)((e=>void 0!==e&&void 0!==e.action)),(0,qe.tap)((e=>this.tracer("addChildStraem do ",e))),(0,qe.map)((e=>e)),(0,qe.finalize)((e=>this.onChildCompleted(t.source))));this.updateSourceSubscription(t,!0,"CHILD")}onChildDisposed(e){}onChildCompleted(e){const t=(e=>{const t=e=>{for(;void 0!==e.destination;)e=t(e.destination);return e};return(0,a.pick)(["id","vsid"],t(e))})(e);return this.tracer("onChildCompleted ",this.vsnum,e),this.onChildDisposed(t,e),t}initAutoMergeSourceStreams(){const e={next:this.onSubscribeToSourcesNext.bind(this),error:this.onSubscribeToSourcesError.bind(this),complete:this.onSubscribeToSourcesComplete.bind(this)},t=()=>{this.props.el$=void 0,this.uberSource$.complete(),this.autoSubscriber$.complete(),this.sink$.complete(),this.props=void 0,this.deleted=!0,this.tracer("completeAll",this.deleted,this.props)},r=()=>{n-=1,0===n&&t()};let n=0;this.uberSource$=new y.Subject,this.autoMergeSubject$=this.uberSource$.pipe((0,qe.mergeMap)((e=>{const t=e.observable.pipe((0,qe.filter)((e=>void 0!==e&&void 0!==e.action)),(0,qe.map)((e=>{const t=u({},e);return t.action=e.action,this.tracer("autoMergeSubject$",t),t})));return!1===e.autoClosesBool?t:(n+=1,t.pipe((0,qe.finalize)(r)))}))),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,qe.filter)((e=>void 0!==e&&void 0!==e.action))).subscribe(e)}updateSourceSubscription(e,t=!1,r){const n={observable:e,autoClosesBool:t,rel:r};this.tracer("updateSourceSubscription ",this.vsnum,n),this.uberSource$.next(n)}onSubscribeToSourcesNext(e={}){const t=(0,a.defaultTo)((e=>this.sendExtendedStreams(e))),r=void 0!==(n=this.props.hashSourceMethods)[o=e.action]?o:(0,a.compose)(a.head,(0,a.filter)((0,a.compose)((0,a.test)(a.__,o),(e=>new RegExp(e)))))((0,a.keys)(n));var n,o;t(this.props.hashSourceMethods[r])(e),this.tracer("onSubscribeToSourcesNext",{payload:e})}onSubscribeToSourcesError(e=""){console.log("ALL ERROR ",this.constructor.name,e)}onSubscribeToSourcesComplete(){this.tracer("onSubscribeToSourcesComplete","VS_DETRITUS_COLLECT"),this.openSpigot("VS_DETRITUS_COLLECT")}sendExtendedStreams(e){this.tracer("sendExtendedStreams",e),this.openSpigot(e.action,e)}renderAndAttachToParent(e){this.openSpigot("VS_SPAWN_AND_ATTACH_TO_PARENT",e)}renderView(){this.openSpigot("VS_SPAWN")}renderViewAndAttachToDom(e,t,r){const n={node:e,type:t,attachType:r};this.openSpigot("VS_SPAWN_AND_ATTACH_TO_DOM",{attachData:n})}checkParentDispose(e){"parent"===e.from$&&this.disposeViewStream(e)}onBeforeDispose(){}setTimeout(e,t=0,r=!1){window.setTimeout(((...t)=>{if(void 0!==this&&void 0!==this.props){const n=!0===r?e.bind(this):e;(0,a.apply)(n,t)}}),t)}disposeViewStream(e){this.onBeforeDispose(),this.openSpigot("EXTIRPATE")}onChildDispose(e){}onParentDisposing(e){this.openSpigot("EXTIRPATE")}onReadyToGC(e){const t=void 0!==e.from$&&"internal"===e.from$;this.tracer("onReadyToGC",t,e)}openSpigot(e,t={}){if(void 0!==this.props){this.props.action=e;const r=(0,a.mergeRight)(this.props,t);this.sink$.next(Object.freeze(r))}}setAttachData(e,t){return{node:this.props.el,type:"ViewStreamObservable",attachType:e,query:(()=>{const e=this.props.el.querySelector(t);return!0===ut.isDevMode()&&(0,a.is)(String,t)&&(0,a.isNil)(e)&&console.warn(`Spyne Warning: The appendView query in ${this.props.name}, '${t}', appears to not exist!`),e})()}}getParentEls(e,t){const r=e=>e.parentElement;let n=0,o=e;for(;n<t;)o=r(o),n++;return o}setAttachParentData(e,t,r){t=""!==t?t:void 0;const n=this.getParentEls(this.props.el,r);return{node:n,type:"ViewStreamObservable",attachType:e,query:n.querySelector(t)}}onMapViewSource(e={}){return this.props=(0,a.mergeRight)(this.props,e),e}exchangeViewsWithChild(e,t){this.addChildStream(e.sourceStreams.toParent$),e.addParentStream(this.sourceStreams.toChild$,t)}appendToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","appendChild")}appendToDomAfter(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDomAfter. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","after")}prependToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be prependedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","prependChild")}appendView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("appendChild",t))}appendViewAfter(e,t){this.exchangeViewsWithChild(e,this.setAttachData("after",t))}appendViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("appendChild",t,r))}prependViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("prependChild",t,r))}prependView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("prependChild",t))}appendToNull(){const e=document.getElementById("spyne-null-views");this.renderViewAndAttachToDom(e,"dom","appendChild")}onVSRendered(e){"internal"===e.from$&&this.postRender()}postRender(){if(!0!==this._postRenderedCalled){if(this.beforeAfterRender(),this.afterRender(),this.onRendered(),requestAnimationFrame((()=>this.onAnimFrameAfterRendered())),!0===this.isDevMode){const e=this.broadcastEvents();!1===ut.isValidNestedArr(e)&&console.warn(`Spyne Warning: The array returned from broadcastEvents in ${this.props.name}, '${JSON.stringify(e)}', does not appear to be properly formatted!`)}this.initializeChannels(),this.viewsStreamBroadcaster=new et(this.props,this.broadcastEvents.bind(this)),this.afterBroadcastEvents(),this._postRenderedCalled=!0}}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>{new e(this)}))}afterBroadcastEvents(){if(!0===this.isDevMode){const e=e=>e[0],t=this.addActionListeners(),r=t.map(e);if(!1===ut.isValidNestedArr(t))console.warn(`Spyne Warning: The array returned from addActionsListeners in ${this.props.name}, '${JSON.stringify(t)}', does not appear to be properly formatted!`);else{const e=e=>{const t=(0,a.defaultTo)("",e[1]);!1===(0,a.is)(Function,this[t])&&console.warn(`Spyne Warning: The method in addActionListeners nested Array, '${JSON.stringify(e)}', in ${this.props.name}, does not appear to exist!`)};(0,a.compose)((0,a.forEach)(e),(0,a.defaultTo)([]))(t)}const n=()=>{void 0!==(0,a.path)(["props","addedChannels"],this)&&ut.checkIfActionsAreRegistered.bind(this)(this.props.addedChannels,r)};this.setTimeout(n,500)}}setDataVSID(){this.props.el.dataset.vsid=this.props.vsid}beforeAfterRender(){this.setDataVSID(),this.props.el$=ht(this.props.el)}downStream(){}onRendered(){}onAnimFrameAfterRendered(){}afterRender(){}broadcastEvents(){return[]}getChannel(e){return(0,a.ifElse)((e=>L().includes(e)),(e=>I.channelsMap.getStream(e).observer.pipe((0,qe.takeWhile)((e=>!0!==this.deleted)))),(e=>console.warn(`channel name ${e} is not within ${L}`)))(e)}initializeChannels(){Array.isArray(this?.props?.channels)&&this?.props?.channels?.forEach((e=>{const[t,r=!1]=Array.isArray(e)?e:[e];this?.addChannel(t,r)}))}addChannel(e,t=!1,r=!1,n=!1){const o=!0===r?this.$dirs.CI:this.$dirs.I;if(!0===this?.props?.addedChannels?.includes(e))return;const s=(0,a.path)(["srcElement","isLocalEvent"]),i=(0,a.path)(["srcElement","vsid"]),c=[(0,qe.map)((e=>{const t=e;return t.$dir=o,t})),(0,qe.filter)((e=>{const t=i(e);return!0!==s(e)||t===this.props.vsid}))];!0===t&&c.unshift((0,qe.skip)(1));const l=this.getChannel(e).pipe(...c);this.updateSourceSubscription(l,!1),this.props.addedChannels.push(e)}checkIfChannelExists(e){const t=I.channelsMap.testStream(e);return!0!==t&&console.warn(`SPYNE WARNING: The ChannelPayload from ${this.props.name}, has been sent to a channel, ${e}, that has not been registered!`),t}sendInfoToChannel(e,t={},r){const n=t,o=(0,a.defaultTo)("VIEWSTREAM_EVENT"),s=(0,a.compose)(o,(0,a.prop)(e)),i={payload:n,action:r=r||s({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(i.srcElement=(0,a.compose)((0,a.pick)(["id","vsid","class","tagName"]),(0,a.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(i,{payload:{get:()=>F(t)}});const n=(0,y.of)(i);return new Je(e,n,i)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,a.where)({from$:(0,a.equals)("internal"),action:(0,a.equals)("VS_SPAWNED_AND_ATTACHED_TO_PARENT")},t)?this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_RENDERED_EVENT"},"CHANNEL_LIFECYCLE_RENDERED_EVENT"):!0===r&&this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_DISPOSED_EVENT"},"CHANNEL_LIFECYCLE_DISPOSED_EVENT")}createActionFilter(e,t){return new at(e,t)}isLocalEvent(e){const t=(0,a.path)(["srcElement","el"],e),r=(0,a.path)(["props","el"],this);return ut.elIsDomElement(r)&&ut.elIsDomElement(t)&&r.contains(t)}addMixins(){const e=$();this.createId=e.createId}}class Nt{constructor(e){const t=String(e.props.name),r=`${t}_ROUTE_UPDATER`;return(0,a.curry)(Nt.createTemporaryViewStreamObj)({id:r,name:t})}static createTemporaryViewStreamObj(e,t){const{name:r,id:n}=e,o=t,s=new ut({id:n,name:r,data:t});s.onRendered=()=>{s.sendInfoToChannel("CHANNEL_ROUTE",o)},s.afterBroadcastEvents=()=>{s.disposeViewStream()},s.appendToNull()}}class mt{constructor(e,t={}){this.addRegisteredActions.bind(this),this.createChannelActionsObj(e,t.extendedActionsArr),t.name=e,t.defaultActions=void 0!==t.data?[`${t.name}_EVENT`]:[],this.props=t,this.props.isRegistered=!1,this.props.isProxy=void 0!==this.props.isProxy&&this.props.isProxy;const r=void 0!==this.props.data;this.props.sendCachedPayload=void 0===this.props.sendCachedPayload?r:this.props.sendCachedPayload,this.sendPayloadToRouteChannel=new Nt(this),this.createChannelActionMethods(),this.streamsController=I.channelsMap;const n=this.getMainObserver();this.checkForPersistentDataMode=mt.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=n;const o=this.streamsController.getStream("DISPATCHER"),s=(0,a.propEq)(t.name,"name");o.pipe((0,qe.filter)(s)).subscribe((e=>this.onReceivedObservable(e)))}getMainObserver(){return void 0===this.streamsController&&console.warn(`Spyne Warning: The following channel, ${this.props.name}, appears to be registered before Spyne has been initialized.`),!0===this.streamsController.testStream(this.props.name)?this.streamsController.getProxySubject(this.props.name,this.props.sendCachedPayload):!0===this.props.sendCachedPayload?new y.ReplaySubject(1):new y.Subject}onChannelInitialized(){}onRegistered(e=this.props){if(void 0!==e.data){const t=Object.keys(this.channelActions)[0];this.sendChannelPayload(t,e.data)}}get isProxy(){return this.props.isProxy}get channelName(){return this.props.name}get observer(){return this.observer$}checkForTraits(){void 0!==this.props.traits&&(e=>{"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))})(this.props.traits)}initializeStream(){this.checkForTraits(),this.onChannelInitialized(),this.checkForPersistentDataMode(),this.onRegistered(),this.props.isRegistered=!0}static checkForPersistentDataMode(e=this.props,t=this.channelActions){const r=(0,a.isEmpty)(t),n=void 0!==(0,a.prop)("data",e);return!0===r&&!0===n&&(e.sendCachedPayload=!0,t=(()=>{const{name:t}=e,r=`${t}_EVENT`;return{[r]:r}})(),void 0!==this.channelActions&&(this.channelActions=t)),{props:e,actionsObj:t}}setTrace(e){}createChannelActionsObj(e,t=[]){const r=(0,a.ifElse)((0,a.is)(String),a.identity,a.head),n=t.concat(this.addRegisteredActions(e)),o=(0,a.map)(r,n),s=(0,a.mergeAll)((0,a.chain)((e=>(0,a.objOf)(e,e)),o));this.channelActions=s}createChannelActionMethods(){const e=(0,a.ifElse)((0,a.is)(String),a.identity,a.head),t=(e,t)=>{window.setTimeout((()=>{"function"!=typeof this[e]&&console.warn(`"${this.props.name}", REQUIRES THE FOLLOWING METHOD ${e} FOR ACTION, ${t[0]}`)}),100)},r=(0,a.ifElse)((0,a.is)(String),(0,a.always)("onViewStreamInfo"),(e=>{const r=(0,a.view)((0,a.lensIndex)(1),e);return t(r,e),r}));this.channelActionMethods=(0,a.fromPairs)((0,a.map)((t=>[e(t),r(t)]),this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,a.path)(["props","data"],this)&&(e=[`${this.props.name}_EVENT`]),e}onReceivedObservable(e){this.onIncomingObservable(e)}getActionMethodForObservable(e){e.unpacked=!0;const t=this.onViewStreamInfo.bind(this),r=(0,a.path)(["data","action"],e),n=(0,a.prop)(r,this.channelActionMethods);let o=t;return void 0!==n&&"onViewStreamInfo"!==n&&!0==("function"==typeof this[n])&&(o=this[n].bind(this)),o}onIncomingObservable(e){const t=(0,a.equals)(e.name,this.props.name),{action:r,payload:n,srcElement:o}=e.data,s=t=>({clone:()=>{return t=e.data,(0,a.mergeAll)([t,{action:(0,a.prop)("action",t)},(0,a.prop)("payload",t),(0,a.prop)("srcElement",t)]);var t},action:r,payload:n,srcElement:o,event:t});return!0===t?(e=>e.observable.pipe((0,qe.map)(s)).subscribe(this.getActionMethodForObservable(e)))(e):void 0}onViewStreamInfo(e){}sendChannelPayload(e,t,r={},n={},o=this.observer$){const s=new k(this.props.name,e,t,r,n);o.next(s)}getChannel(e,t){return(0,a.ifElse)((e=>L().includes(e)),(e=>{const r=this.streamsController.getStream(e).observer;return void 0!==t?r.pipe((0,qe.filter)(t)):r}),(e=>console.warn(`channel name ${e} is not within ${L}`)))(e)}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&I.doNotTrackChannel(e.channelName)}}class _t{constructor(){this.checkIfObjIsNotEmptyOrNil=_t.checkIfObjIsNotEmptyOrNil.bind(this)}static checkIfObjIsNotEmptyOrNil(e){const t=(0,a.compose)((0,a.complement)(a.isEmpty),a.head,a.values),r=(0,a.compose)((0,a.complement)(a.isNil),a.head,a.values);return(0,a.allPass)([t,r])(e)}static checkIfParamValueMatchesRegex(e,t){const r=(0,a.reject)((0,a.equals)("routeName")),n=(0,a.compose)(r,a.keys),o=(0,a.compose)((0,a.find)((t=>(0,a.test)(new RegExp(t),e))),n)(t);return(0,a.is)(String,o)&&(t=(0,a.assoc)(e,(0,a.prop)(o,t),t)),t}static formatStrAsWindowLocation(e){return{hash:e,search:e,pathname:e}}static getLocationStrByType(e,t=!1,r=window.location){const n={slash:"pathname",query:"search",hash:"hash"}[!0===t?"hash":e];return(0,a.prop)(n,r).replace(/^(\/)?(#)?(\/)?(.*)$/,"$4")}static createRouteArrayFromParams(e,t,r="slash",n){const o=[],s=t=>{const r={},i=t.routeName;let c=void 0!==e[i]?e[i]:(0,a.prop)(i,n);const l=typeof t[c];"string"===l?c=t[c]:"undefined"===l&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[i]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,a.is)(Object,t),E=(0,a.has)(c,t),p=(0,a.has)("routePath",t);if(!0===(E&&d)){const e=t[c];(0,a.has)("routePath",e)&&s(e.routePath)}else!0===p&&void 0!==c&&s(t.routePath)};return s(t),o}static createSlashString(e){const t=(0,a.reject)(a.isNil),r=(0,a.when)((0,a.complement)(a.isNil,a.__),(0,a.join)("/")),n=(0,a.replace)(/^(\^*)(.*|^\$)(\$)$/,"$2");return(0,a.compose)(n,r,t,a.flatten,(0,a.map)(a.values))(e)}static createQueryString(e){const t=(0,a.reject)(a.isNil),r=this.checkIfObjIsNotEmptyOrNil,n=(0,a.compose)((0,a.join)("="),a.flatten,a.toPairs),o=(0,a.ifElse)(r,n,(0,a.always)(void 0)),s=(0,a.map)(o),i=(0,a.when)((0,a.complement)(a.isEmpty),(0,a.concat)("?"));return(0,a.compose)(i,(0,a.join)("&"),t,s)(e)}static checkPayloadForRegexOverrides(e,t,r="Value"){const n=(0,a.compose)((e=>(0,a.prop)(`${e}${r}`,t)),a.head,a.keys);return(0,a.map)((e=>{const t=n(e);return void 0!==t?(0,a.assoc)((0,a.compose)(a.head,a.keys)(e),t,e):e}),e)}static checkForRouteValWithMultipleVals(e){return!0===Array.isArray(e)?e.map((e=>("object"==typeof e&&(e=Object.keys(e).reduce(((t,r)=>(t[r]=(e=>{const t=e.match(/^[^|]*/);return t?"^$"===t[0]?"":t[0]:e})(e[r]),t)),{})),e))):e}static checkForRouteValsPartMatch(e,t={}){return e.map((e=>{const r={...e};return Object.keys(r).forEach((e=>{var n,o;Object.prototype.hasOwnProperty.call(r,e)&&t[e]&&(r[e]=(n=t[e],(o=r[e]).split("|").some((e=>((e,t)=>{const r=e.replace(/[-/\\^$+?.()|[\]{}]/g,"\\$&").replace(/\*/g,"[\\w\\d_-]*");return new RegExp(`^${r}$`).test(t)})(e,n)))?n:o))})),r}))}static convertParamsToRoute(e,t=I.config.channels.ROUTE,r,n){const o=void 0!==r?r:t.type,s=t.isHash,i=t.routes.routePath,a=void 0!==n?n:this.getLocationStrByType(o,s),c=this.convertRouteToParams(a,t,o).routeData;let l=this.createRouteArrayFromParams(e,i,o,c);return l=_t.checkPayloadForRegexOverrides(l,e),l=_t.checkForRouteValWithMultipleVals(l),"query"===o?this.createQueryString(l):this.createSlashString(l)}static findIndexOfMatchedStringOrRegex(e,t){const r=(0,a.replace)(/^$/,"^$"),n=(0,a.either)((0,a.propEq)(e,"str"),(0,a.compose)((0,a.test)(a.__,e),(0,a.prop)("re")));return(0,a.compose)((0,a.findLastIndex)((0,a.equals)(!0)),(0,a.map)(n),(0,a.map)((e=>{return{str:e,re:(t=e,new RegExp(t))};var t})),(0,a.map)(r))(t)}static checkIfValueShouldMapToParam(e,t,r){const n=(0,a.compose)((0,a.map)(a.last),(0,a.map)((0,a.filter)((0,a.is)(String))),a.toPairs)(e),o=_t.findIndexOfMatchedStringOrRegex(t,n);let s=t;if(o>=0){const t=n[o],r=(0,a.invert)(e),i=(0,a.compose)(a.head,(0,a.defaultTo)([]),(0,a.prop)(t))(r);!0===/^([-$\w]*)$/.test(i)&&!0===(0,a.is)(String,i)&&(s=i)}return s}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),s=[],i=[];let c=e;(0,a.reduce)(((e,t)=>{const n=this.checkIfValueShouldMapToParam(c,t,r);c=this.checkIfParamValueMatchesRegex(t,c);const o=(0,a.either)(a.isEmpty,a.isNil);void 0!==c&&(e=>e!==(0,a.last)(s))(c.routeName)&&!1===o(n)&&(s.push(c.routeName),i.push(n));const l=[t,"routePath"],d=(0,a.path)(l,c),E=(0,a.path)(["routePath"],c);void 0!==d?c=d:void 0!==E&&(c=E)}),0,o);const l=(0,a.zipObj)(s,i),d=this.getLastArrVal(s);return{paths:s,pathInnermost:d,routeData:l,routeValue:n}}static getLastArrVal(e){return t=e,void 0!==(0,a.last)(t)?(0,a.last)(t):"";var t}static createDefaultParamFromEmptyStr(e,t){const r={};return r[e.routeName]=this.checkIfValueShouldMapToParam(e,t),r}static convertQueryStrToParams(e,t,r){const n=t,o=t.replace(/^([?])?(.*)$/,"$2"),s=(0,a.compose)((0,a.map)((0,a.split)("=")),(0,a.split)("&"))(o);let i=(0,a.fromPairs)(s),c=(0,a.map)(a.head,s);return!0===(0,a.isEmpty)(t)&&(i=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,a.keys)(i)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:i,routeValue:n}}static convertRouteToParams(e,t,r){if(void 0===t)return{};const n=void 0!==r?r:t.type,o=(0,a.defaultTo)({},(0,a.prop)("regexTokens",t)),s=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(s,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(s,e,o))}}class Tt{constructor(){this.createPopStateStream=Tt.createPopStateStream.bind(this)}static createPopStateStream(e){(0,y.fromEventPattern)((function(e){window.onpopstate=e}),(function(){window.onpopstate=function(){}})).subscribe(e)}static getLastArrVal(e){return t=e,void 0!==(0,a.last)(t)?(0,a.last)(t):"";var t}static compareRouteKeywords(e={},t){const r=(e,t)=>void 0!==t?(0,a.pick)(t,e):e;let n=r(e,t);return{pickValues:r,compare:(e={},t)=>{const o=r(e,t),s=e=>(0,a.compose)(a.keys,(0,a.filter)((0,a.propEq)(!0,e))),i=(0,a.compose)((0,a.map)((e=>{const t=(0,a.prop)(e,n),r=(0,a.prop)(e,o),s=(0,a.equals)(t,r),i=void 0!==t,c=void 0!==r,l=!s,d=!1===i&&!0===c,E=!0===i&&!1===c,p={};return p[e]={same:s,changed:l,added:d,removed:E,previousExists:i,nextExists:c},p})),a.uniq,(0,a.chain)(a.keys))([n,o]),c=(0,a.chain)(s("changed"),i),l=(0,a.chain)(s("added"),i),d=(0,a.chain)(s("removed"),i);return n=o,{pathsAdded:l,pathsRemoved:d,pathsChanged:c}},getComparer:()=>n}}static getRouteArrData(e,t){const r=(0,a.filter)((0,a.includes)(a.__,e),t);return{paths:r,pathInnermost:Tt.getLastArrVal(r)}}static flattenConfigObject(e){const t=e=>(0,a.chain)((([e,r])=>"[object Object]"===Object.prototype.toString.call(r)?(0,a.map)((([t,r])=>[`${e}.${t}`,r]),t(r)):[[e,r]]),(0,a.toPairs)(e));return(0,a.values)((0,a.fromPairs)(t(e)))}static addRouteDatasets(e){const{type:t,isHash:r}=e,n=n=>("query"===t?"":!0===r?"#":"/")+_t.convertParamsToRoute(n,e).replace(/^(.*\/)([\w-]*\/?)(.*)$/gm,"$1$2"),o=/^([A-Za-z0-9_-])+$/m,s=(e=[],t,r={})=>{let{routeName:i}=t;return(0,a.toPairs)(t).reduce(((t,c)=>{const[l,d]=c,E=(0,a.is)(Object,d),p=e=>(0,a.test)(o,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):l;if("routeName"===l||"404"===l)return t;i=i||(0,a.prop)("routeName",d);let h=(0,a.clone)(r);if(h[i]=String(l).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,a.keys)(h).length){const e=(0,a.path)(["routePath","routeName"],d);if(e){const o=(0,a.clone)(h);o[e]="",o.navLevel=(0,a.keys)(r).length,o.title=p(l),o.href=n(o),t.push(o)}}h=s(e,d,h)}else h.title=p(l),h.href=n(h);return h.navLevel=(0,a.keys)(r).length,t.push(h),t}),[])},i=s([],e.routes),c=(0,a.flatten)(i);return{routeDatasetsArr:c,routeNamesArr:(e=>{const t=(0,a.reject)((0,a.includes)(a.__,["title","href","navLevel"]));return(0,a.compose)(a.uniq,t,a.flatten,(0,a.map)(a.keys))(e)})(c)}}static conformRouteObject(e={},t=!1){const r=(0,a.path)(["channels","ROUTE"],e);let{add404s:n}=void 0!==r?r:e;n=n||t;const o=e=>{const t=e[1],r=(0,a.is)(Array,t);return""===t?e[1]="^$":r&&(e[1]=t.join("|")),e},s=(0,a.compose)(a.fromPairs,(0,a.map)((e=>{const[t,r]=e,i=n?{404:".+"}:{},c=(0,a.is)(Object,r),l=(0,a.is)(Array,r),d="routePath"===t;return!0===c&&!1===l&&(e[1]=s(e[1]),d&&(e[1]=(0,a.compose)((0,a.mergeDeepRight)(i),a.fromPairs,(0,a.map)(o),a.toPairs)(e[1]))),e})),a.toPairs);if(void 0!==r){e.channels.ROUTE=s(e.channels.ROUTE);const t=Tt.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,a.mergeRight)(e.channels.ROUTE,t),e}return s(e)}static getLocationData(){return(0,a.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}}class At extends mt{constructor(e="CHANNEL_ROUTE",t={}){t.sendCachedPayload=!0,super("CHANNEL_ROUTE",t),this.createChannelActionsObj(),this.routeConfigJson=this.getRouteConfig(),this.bindStaticMethods(),this.navToStream$=new y.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,qe.map)((e=>this.onMapNext(e)))),this.compareRouteKeywords=Tt.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===I.config.channels.ROUTE.type)&&(I.config.channels.ROUTE.type="slash",I.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,a.mergeAll)((0,a.chain)((e=>(0,a.objOf)(e,e)),e));this.channelActions=t}addRegisteredActions(){return["CHANNEL_ROUTE_DEEPLINK_EVENT","CHANNEL_ROUTE_CHANGE_EVENT","CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",["CHANNEL_ROUTE_UPDATE_CONFIG_EVENT","updateRouteConfig"]]}updateRouteConfig(e){const t=(0,a.pick)(["isHash","isHidden","routes","type"],e.payload);I.config.channels.ROUTE=(0,a.mergeRight)(I.config.channels.ROUTE,t),I.conformRouteConfig();const r=this.getRouteConfig();this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=I.config,t=(0,a.path)(["channels","ROUTE"],e);"query"===t.type&&(t.isHash=!1);const r=Tt.flattenConfigObject(t.routes);return t.paramsArr=r,t}initStream(){this.firstLoadStream$=new y.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),Tt.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,y.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,a.lensProp)(["routeData"]);return(0,a.over)(t,(0,a.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const n=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,o=(0,a.path)(["state","routeCount"],e),s=!0===(0,a.is)(Number,o);let i=this.getDataFromString(t,s);!0===s&&(i.routeCount=o),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.linksData=(0,a.prop)("routeDatasetsArr",t));const c=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,a.mergeRight)(i,c),this.sendChannelPayload(n,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,a.compose)((0,a.filter)((0,a.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),a.keys,(0,a.prop)("payload"))(e);if(t.length>=1){const r=(0,a.prop)("event",e);if(void 0!==r){const e=(e,t,r,n,o)=>String(r).toLowerCase()+n+o,n=(0,a.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),o=e=>{const t=n(e);void 0!==r[t]&&r[t]()};t.forEach(o)}}return e}static checkForEndRoute(e,t=this.routeConfigJson,r){if(!0!==(0,a.compose)((0,a.equals)("true"),(0,a.path)(["payload","endRoute"]))(e))return e;const n=void 0!==r?r:!0===I.debug,{payload:o}=e;let s=0;const i=(e=[],t)=>{const r=t[1],{routePath:c}=r,l=(0,a.prop)("routeName",c),d=(e=>{const t=(0,a.prop)("routeName",e);if(t){const r=(0,a.compose)(a.keys,(0,a.omit)(["routeName"]))(e),n=o[t],s=e=>new RegExp(`^${e}$`).test(n);return(0,a.find)(s,r)}})(c),E=(0,a.is)(Object,r),p=(0,a.is)(Array,r);if(s+=1,!0===E&&!1===p){const t=c[d];t?(0,a.compose)(a.reverse,(0,a.reduce)(i,e),a.toPairs)({nextRoutePath:t}):1===s?n&&console.warn(`Spyne Warning: use of end route method should add start route value of "${l}".`):e.push(l)}return e},{routes:c}=t,l=(0,a.compose)(a.reverse,(0,a.reduce)(i,[]),a.toPairs)({routes:c});if(1===l.length){const t=l[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;At.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const n=(0,a.prop)("srcElement",e),o=(0,a.prop)("event",e),s=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,a.mergeRight)(r,i),this.sendRouteStream(r,s),r=At.removeSSID(r),this.sendChannelPayload(t,r,n,o,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,a.keys)(t)}sendRouteStream(e,t=!0){!0===t&&this.setWindowLocation(e)}static getRouteState(){return"CHANNEL_ROUTE_CHANGE_EVENT"}static getIsDeepLinkBool(e){return!1===e&&0===this._routeCount}static getRouteCount(e=!1){return void 0===this._routeCount?(this._routeCount=0,this._routeCount):(!1===e&&(this._routeCount+=1),this._routeCount)}static getExtraPayloadParams(e=this.routeConfigJson,t=!1){return{routeCount:this.getRouteCount(t),isDeepLink:this.getIsDeepLinkBool(t),isHash:e.isHash,isHistory:t,isHidden:e.isHidden,routeType:e.type}}static getDataFromParams(e,t=this.routeConfigJson){let r=(0,a.prop)("payload",e);const n=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,a.defaultTo)(r,(0,a.prop)(e,t)),s=o("type","slash"),i=o("isHash",!1),c=_t.formatStrAsWindowLocation(n),l=this.getDataFromLocationStr(s,i,c),{pathInnermost:d,paths:E}=l;r=(0,a.mergeRight)(l.routeData,r);const{routeCount:p,isDeepLink:h,isHash:u,isHistory:N,isHidden:m,routeType:_}=this.getExtraPayloadParams(t);return{isDeepLink:h,routeCount:p,pathInnermost:d,paths:E,routeData:r,routeValue:n,isHash:u,isHidden:m,isHistory:N,routeType:_}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,n=!0===e.isHash,o=_t.getLocationStrByType(r,n),{paths:s,pathInnermost:i,routeData:a,routeValue:c}=At.getParamsFromRouteStr(o,e,r),{routeCount:l,isDeepLink:d,isHash:E,routeType:p,isHidden:h}=this.getExtraPayloadParams(e,t);return{isDeepLink:d,routeCount:l,pathInnermost:i,paths:s,routeData:a,routeValue:c,isHash:E,isHidden:h,isHistory:t,routeType:p}}static getDataFromLocationStr(e="slash",t=this.routeConfigJson.isHash,r=window.location){const n=void 0!==this.routeConfigJson?this.routeConfigJson.type:e,o=_t.getLocationStrByType(n,t,r),{paths:s,pathInnermost:i,routeData:a,routeValue:c}=this.getParamsFromRouteStr(o,this.routeConfigJson,n);return{paths:s,pathInnermost:i,routeData:a,routeValue:c,action:this.getRouteState()}}static getLocationData(){return(0,a.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getRouteStrFromParams(e,t,r){const n=void 0!==r?r:t.type;return _t.convertParamsToRoute(e,t,n)}static getParamsFromRouteStr(e,t,r){const n=void 0!==r?r:t.type;return _t.convertRouteToParams(e,t,n)}checkEmptyRouteStr(e,t=!1){const r=(0,a.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,a.concat)("#",e):e}static removeLastSlash(e){return e.replace(/^(.*)(\/)$/,"$1")}setWindowLocation(e){let{isHash:t,routeValue:r,routeType:n}=e;r=this.checkEmptyRouteStr(r,t);const{routeCount:o}=e;if(!0===t||"query"===n)r=At.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:o},"",r);else{const e=(0,a.when)((0,a.compose)((0,a.complement)((0,a.equals)("/")),a.head),(0,a.concat)("/",a.__));window.history.pushState({routeCount:o},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=At.checkForEndRoute.bind(this),this.getIsDeepLinkBool=At.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=At.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=At.onIncomingDomEvent.bind(this),this.getDataFromString=At.getDataFromString.bind(this),this.getParamsFromRouteStr=At.getParamsFromRouteStr.bind(this),this.getLocationData=At.getLocationData.bind(this),this.getRouteState=At.getRouteState.bind(this),this.getDataFromParams=At.getDataFromParams.bind(this),this.getRouteCount=At.getRouteCount.bind(this),this.getExtraPayloadParams=At.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,a.curryN)(3,At.getRouteStrFromParams);this.getRouteStrFromParams=e(a.__,this.routeConfigJson,this.routeConfigJson.type)}}class Ct extends mt{constructor(e="CHANNEL_UI",t={}){t.sendCachedPayload=!1,super(e,t),this.keyEventsLoaded=!1,this.keyCodeArr=[]}addRegisteredActions(){return["CHANNEL_UI_DOMCONTENTLOADED_EVENT","CHANNEL_UI_ABORT_EVENT","CHANNEL_UI_ACTIVATE_EVENT","CHANNEL_UI_ADDTRACK_EVENT","CHANNEL_UI_AFTERPRINT_EVENT","CHANNEL_UI_AFTERSCRIPTEXECUTE_EVENT","CHANNEL_UI_ANIMATIONCANCEL_EVENT","CHANNEL_UI_ANIMATIONEND_EVENT","CHANNEL_UI_ANIMATIONITERATION_EVENT","CHANNEL_UI_ANIMATIONSTART_EVENT","CHANNEL_UI_APPINSTALLED_EVENT","CHANNEL_UI_AUDIOEND_EVENT","CHANNEL_UI_AUDIOSTART_EVENT","CHANNEL_UI_AUXCLICK_EVENT","CHANNEL_UI_BEFOREINPUT_EVENT","CHANNEL_UI_BEFOREPRINT_EVENT","CHANNEL_UI_BEFOREUNLOAD_EVENT","CHANNEL_UI_BEGINEVENT_EVENT","CHANNEL_UI_BLOCKED_EVENT","CHANNEL_UI_BLUR_EVENT","CHANNEL_UI_BOUNDARY_EVENT","CHANNEL_UI_BUFFEREDAMOUNTLOW_EVENT","CHANNEL_UI_CANCEL_EVENT","CHANNEL_UI_CANPLAY_EVENT","CHANNEL_UI_CANPLAYTHROUGH_EVENT","CHANNEL_UI_CHANGE_EVENT","CHANNEL_UI_CLICK_EVENT","CHANNEL_UI_CLOSE_EVENT","CHANNEL_UI_CLOSING_EVENT","CHANNEL_UI_COMPLETE_EVENT","CHANNEL_UI_COMPOSITIONEND_EVENT","CHANNEL_UI_COMPOSITIONSTART_EVENT","CHANNEL_UI_COMPOSITIONUPDATE_EVENT","CHANNEL_UI_CONNECT_EVENT","CHANNEL_UI_CONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_CONTENTDELETE_EVENT","CHANNEL_UI_CONTEXTMENU_EVENT","CHANNEL_UI_COPY_EVENT","CHANNEL_UI_CUECHANGE_EVENT","CHANNEL_UI_CUT_EVENT","CHANNEL_UI_DATACHANNEL_EVENT","CHANNEL_UI_DBLCLICK_EVENT","CHANNEL_UI_DEVICECHANGE_EVENT","CHANNEL_UI_DEVICEMOTION_EVENT","CHANNEL_UI_DEVICEORIENTATION_EVENT","CHANNEL_UI_DRAG_EVENT","CHANNEL_UI_DRAGEND_EVENT","CHANNEL_UI_DRAGENTER_EVENT","CHANNEL_UI_DRAGLEAVE_EVENT","CHANNEL_UI_DRAGOVER_EVENT","CHANNEL_UI_DRAGSTART_EVENT","CHANNEL_UI_DROP_EVENT","CHANNEL_UI_DURATIONCHANGE_EVENT","CHANNEL_UI_EMPTIED_EVENT","CHANNEL_UI_END_EVENT","CHANNEL_UI_ENDEVENT_EVENT","CHANNEL_UI_ENDED_EVENT","CHANNEL_UI_ENTERPICTUREINPICTURE_EVENT","CHANNEL_UI_ERROR_EVENT","CHANNEL_UI_FOCUS_EVENT","CHANNEL_UI_FOCUSIN_EVENT","CHANNEL_UI_FOCUSOUT_EVENT","CHANNEL_UI_FORMDATA_EVENT","CHANNEL_UI_FULLSCREENCHANGE_EVENT","CHANNEL_UI_FULLSCREENERROR_EVENT","CHANNEL_UI_GAMEPADCONNECTED_EVENT","CHANNEL_UI_GAMEPADDISCONNECTED_EVENT","CHANNEL_UI_GATHERINGSTATECHANGE_EVENT","CHANNEL_UI_GESTURECHANGE_EVENT","CHANNEL_UI_GESTUREEND_EVENT","CHANNEL_UI_GESTURESTART_EVENT","CHANNEL_UI_GOTPOINTERCAPTURE_EVENT","CHANNEL_UI_HASHCHANGE_EVENT","CHANNEL_UI_ICECANDIDATE_EVENT","CHANNEL_UI_ICECANDIDATEERROR_EVENT","CHANNEL_UI_ICECONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_ICEGATHERINGSTATECHANGE_EVENT","CHANNEL_UI_INPUT_EVENT","CHANNEL_UI_INPUTSOURCESCHANGE_EVENT","CHANNEL_UI_INSTALL_EVENT","CHANNEL_UI_INVALID_EVENT","CHANNEL_UI_KEYDOWN_EVENT","CHANNEL_UI_KEYUP_EVENT","CHANNEL_UI_LANGUAGECHANGE_EVENT","CHANNEL_UI_LEAVEPICTUREINPICTURE_EVENT","CHANNEL_UI_LOAD_EVENT","CHANNEL_UI_LOADEDDATA_EVENT","CHANNEL_UI_LOADEDMETADATA_EVENT","CHANNEL_UI_LOADEND_EVENT","CHANNEL_UI_LOADSTART_EVENT","CHANNEL_UI_LOSTPOINTERCAPTURE_EVENT","CHANNEL_UI_MARK_EVENT","CHANNEL_UI_MERCHANTVALIDATION_EVENT","CHANNEL_UI_MESSAGE_EVENT","CHANNEL_UI_MESSAGEERROR_EVENT","CHANNEL_UI_MOUSEDOWN_EVENT","CHANNEL_UI_MOUSEENTER_EVENT","CHANNEL_UI_MOUSELEAVE_EVENT","CHANNEL_UI_MOUSEMOVE_EVENT","CHANNEL_UI_MOUSEOUT_EVENT","CHANNEL_UI_MOUSEOVER_EVENT","CHANNEL_UI_MOUSEUP_EVENT","CHANNEL_UI_MUTE_EVENT","CHANNEL_UI_NEGOTIATIONNEEDED_EVENT","CHANNEL_UI_NOMATCH_EVENT","CHANNEL_UI_NOTIFICATIONCLICK_EVENT","CHANNEL_UI_OFFLINE_EVENT","CHANNEL_UI_ONLINE_EVENT","CHANNEL_UI_OPEN_EVENT","CHANNEL_UI_ORIENTATIONCHANGE_EVENT","CHANNEL_UI_PAGEHIDE_EVENT","CHANNEL_UI_PAGESHOW_EVENT","CHANNEL_UI_PASTE_EVENT","CHANNEL_UI_PAUSE_EVENT","CHANNEL_UI_PAYERDETAILCHANGE_EVENT","CHANNEL_UI_PAYMENTMETHODCHANGE_EVENT","CHANNEL_UI_PLAY_EVENT","CHANNEL_UI_PLAYING_EVENT","CHANNEL_UI_POINTERCANCEL_EVENT","CHANNEL_UI_POINTERDOWN_EVENT","CHANNEL_UI_POINTERENTER_EVENT","CHANNEL_UI_POINTERLEAVE_EVENT","CHANNEL_UI_POINTERLOCKCHANGE_EVENT","CHANNEL_UI_POINTERLOCKERROR_EVENT","CHANNEL_UI_POINTERMOVE_EVENT","CHANNEL_UI_POINTEROUT_EVENT","CHANNEL_UI_POINTEROVER_EVENT","CHANNEL_UI_POINTERUP_EVENT","CHANNEL_UI_POPSTATE_EVENT","CHANNEL_UI_PROGRESS_EVENT","CHANNEL_UI_PUSH_EVENT","CHANNEL_UI_PUSHSUBSCRIPTIONCHANGE_EVENT","CHANNEL_UI_RATECHANGE_EVENT","CHANNEL_UI_READYSTATECHANGE_EVENT","CHANNEL_UI_REJECTIONHANDLED_EVENT","CHANNEL_UI_REMOVETRACK_EVENT","CHANNEL_UI_REMOVESTREAM_EVENT","CHANNEL_UI_REPEATEVENT_EVENT","CHANNEL_UI_RESET_EVENT","CHANNEL_UI_RESIZE_EVENT","CHANNEL_UI_RESOURCETIMINGBUFFERFULL_EVENT","CHANNEL_UI_RESULT_EVENT","CHANNEL_UI_RESUME_EVENT","CHANNEL_UI_SCROLL_EVENT","CHANNEL_UI_SEARCH_EVENT","CHANNEL_UI_SEEKED_EVENT","CHANNEL_UI_SEEKING_EVENT","CHANNEL_UI_SELECT_EVENT","CHANNEL_UI_SELECTEDCANDIDATEPAIRCHANGE_EVENT","CHANNEL_UI_SELECTEND_EVENT","CHANNEL_UI_SELECTIONCHANGE_EVENT","CHANNEL_UI_SELECTSTART_EVENT","CHANNEL_UI_SHIPPINGADDRESSCHANGE_EVENT","CHANNEL_UI_SHIPPINGOPTIONCHANGE_EVENT","CHANNEL_UI_SIGNALINGSTATECHANGE_EVENT","CHANNEL_UI_SLOTCHANGE_EVENT","CHANNEL_UI_SOUNDEND_EVENT","CHANNEL_UI_SOUNDSTART_EVENT","CHANNEL_UI_SPEECHEND_EVENT","CHANNEL_UI_SPEECHSTART_EVENT","CHANNEL_UI_SQUEEZE_EVENT","CHANNEL_UI_SQUEEZEEND_EVENT","CHANNEL_UI_SQUEEZESTART_EVENT","CHANNEL_UI_STALLED_EVENT","CHANNEL_UI_START_EVENT","CHANNEL_UI_STATECHANGE_EVENT","CHANNEL_UI_STORAGE_EVENT","CHANNEL_UI_SUBMIT_EVENT","CHANNEL_UI_SUCCESS_EVENT","CHANNEL_UI_SUSPEND_EVENT","CHANNEL_UI_TIMEOUT_EVENT","CHANNEL_UI_TIMEUPDATE_EVENT","CHANNEL_UI_TOGGLE_EVENT","CHANNEL_UI_TONECHANGE_EVENT","CHANNEL_UI_TOUCHCANCEL_EVENT","CHANNEL_UI_TOUCHEND_EVENT","CHANNEL_UI_TOUCHMOVE_EVENT","CHANNEL_UI_TOUCHSTART_EVENT","CHANNEL_UI_TRACK_EVENT","CHANNEL_UI_TRANSITIONCANCEL_EVENT","CHANNEL_UI_TRANSITIONEND_EVENT","CHANNEL_UI_TRANSITIONRUN_EVENT","CHANNEL_UI_TRANSITIONSTART_EVENT","CHANNEL_UI_UNHANDLEDREJECTION_EVENT","CHANNEL_UI_UNLOAD_EVENT","CHANNEL_UI_UNMUTE_EVENT","CHANNEL_UI_UPGRADENEEDED_EVENT","CHANNEL_UI_VERSIONCHANGE_EVENT","CHANNEL_UI_VISIBILITYCHANGE_EVENT","CHANNEL_UI_VOICESCHANGED_EVENT","CHANNEL_UI_VOLUMECHANGE_EVENT","CHANNEL_UI_VRDISPLAYACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYBLUR_EVENT","CHANNEL_UI_VRDISPLAYCONNECT_EVENT","CHANNEL_UI_VRDISPLAYDEACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYDISCONNECT_EVENT","CHANNEL_UI_VRDISPLAYFOCUS_EVENT","CHANNEL_UI_VRDISPLAYPOINTERRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPOINTERUNRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPRESENTCHANGE_EVENT","CHANNEL_UI_WAITING_EVENT","CHANNEL_UI_WEBGLCONTEXTCREATIONERROR_EVENT","CHANNEL_UI_WEBGLCONTEXTLOST_EVENT","CHANNEL_UI_WEBGLCONTEXTRESTORED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCECHANGED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEDOWN_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEUP_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEWILLBEGIN_EVENT","CHANNEL_UI_WHEEL_EVENT"]}loadKeyStream(){const e=y.Observable.fromEvent(document,"keyup");this.keyPresses$=e.groupBy((e=>e.keyCode)).mergeAll().filter((e=>this.keyCodeArr.indexOf(e.keyCode)>=0)).repeat().subscribe(this.onKeyPressed.bind(this))}addKeyEvent(e){!1===this.keyEventsLoaded&&this.loadKeyStream(),this.keyEventsLoaded=!0,this.registerKey(e)}registerKey(e){this.keyCodeArr.push(e)}onKeyPressed(e){}static removeSSID(e){const t=(0,a.lensProp)(["payload"]);return(0,a.over)(t,(0,a.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,a.equals)(e.name,this.props.name);e.data=Ct.removeSSID(e.data);const{payload:r,srcElement:n}=e.data,o=e=>({payload:r,srcElement:n,event:e});return!0===t?(e=>e.observable.pipe((0,qe.map)(o)).subscribe(this.onUIEvent.bind(this)))(e):void 0}getActionState(e){const t=(0,a.path)(["event","type"]),r=(0,a.path)(["event","typeOverRide"]),n=(0,a.compose)(a.toUpper,(0,a.either)(r,t))(e),o="CHANNEL_UI";return void 0!==n?`${o}_${n}_EVENT`:o}static checkForEventMethods(e){const t=(0,a.compose)((0,a.filter)((0,a.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),a.keys,(0,a.prop)("payload"))(e);if(t.length>=1){const r=(0,a.prop)("event",e);if(void 0!==r){const e=(e,t,r,n,o)=>String(r).toLowerCase()+n+o,n=(0,a.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),o=e=>{const t=n(e);void 0!==r[t]&&"function"==typeof r[t]&&r[t]()};t.forEach(o)}}return e}onUIEvent(e){Ct.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:n}=e,o=e.event;this.sendChannelPayload(t,r,n,o)}}class ft{constructor(){this.createDomObservableFromEvent=ft.createDomObservableFromEvent.bind(this)}static createDomObservableFromEvent(e,t,r=!0,n=window){return t=void 0===t?e=>e:t,(0,y.fromEventPattern)((t=>n.addEventListener(e,t,{passive:r})),(()=>{n[e]=e=>e})).pipe((0,qe.map)(t))}static createMediaQuery(e){const t=window.matchMedia(e);return this.checkIfValidMediaQuery(t,e),!1!==t&&t}static checkIfValidMediaQuery(e,t){const r=e=>e.replace(/\s+/gm,""),n=void 0!==e.matches&&r(e.media).indexOf(r(t))>=0;return!1===n&&(t=>{console.warn(`Spyne Info: the following query string, "${t}", has been optimized to "${e.media}" by the browser and may not be a valid Media Query item!`)})(t),n}static createMediaQueryHandler(e,t){const r=(e=>t=>(t.mediaQueryName=e,t))(t),n=(o=e,{addHandler:e=>{o.addListener(e)},removeHandler:e=>{o.onchange=()=>{}}});var o;return new y.fromEventPattern(n.addHandler,n.removeHandler).pipe((0,qe.map)(r))}static createMergedObsFromObj(e){const t=e.mediaQueries||e.mediaQueries,r=[];return(0,a.mapObjIndexed)(((e,t,n)=>{const o=ft.createMediaQuery(e);return!1!==o&&r.push(ft.createMediaQueryHandler(o,t)),r}),t),r}}class gt extends mt{constructor(e="CHANNEL_WINDOW"){super(e),this.bindStaticMethods(),this.currentScrollY=0}initializeStream(){this.domChannelConfig=I.config.channels.WINDOW;const e=this.getActiveObservables(),t=(0,y.merge)(...e);this.dom$=t,t.subscribe((e=>{const{action:t,payload:r,srcElement:n,event:o}=e;this.sendChannelPayload(t,r,n,o)}))}static getMouseWheelMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_WHEEL_EVENT,r=e.deltaY<=0?"up":"down",{deltaX:n,deltaY:o,deltaZ:s}=e;return{action:t,payload:{scrollDir:r,deltaX:n,deltaY:o,deltaZ:s},srcElement:e.srcElement,event:e}}static createCurriedGenericEvent(e){const t=`CHANNEL_WINDOW_${e.toUpperCase()}_EVENT`;return(0,a.curry)(gt.mapGenericEvent)(t)}static mapGenericEvent(e,t){return{action:e,payload:t,srcElement:t.srcElement,event:t}}static getResizeMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_RESIZE_EVENT,payload:(0,a.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window),srcElement:e.srcElement,event:e}}static getOrientationMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_ORIENTATION_EVENT,r=window.matchMedia("(orientation: portrait)").matches,n=(0,a.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window);return n.orientation=!0===r?"portrait":"landscape",{action:t,payload:n,srcElement:e.srcElement,event:e}}getMediaQueryMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_MEDIA_QUERY_EVENT,payload:(0,a.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return ft.createDomObservableFromEvent("wheel",gt.getMouseWheelMapFn.bind(this)).pipe((0,qe.debounceTime)(t))}static getScrollData(){let e=0;return t=>{const r=e-t;return e=t,{scrollY:t,scrollDistance:r,scrollDir:r>=0?"up":"down"}}}static getScrollY(e){return void 0!==e.pageYOffset?e.pageYOffset:e.scrollTop}static getScrollMapFn(e,t,r,n,o){const s=n(gt.getScrollY(o)),{scrollDistance:i}=s;return{action:r,payload:s,srcElement:e.srcElement,scrollDistance:i,event:e}}createScrollObservable(e,t=window,r=!0){const n=e.debounceMSTimeForScroll,o=t,s=t===window,i=void 0!==e.scrollElForVals?e.scrollElForVals:t,c=s?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",l=gt.getScrollData(),d=(0,a.partialRight)(gt.getScrollMapFn,[c,l,i,r,o]).bind(this);return ft.createDomObservableFromEvent("scroll",d,r,o).pipe((0,qe.debounceTime)(n),(0,qe.skipWhile)((e=>0===e.scrollDistance)),(0,qe.map)((e=>{const t=gt.getScrollY(o);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e})))}createOrientationObservable(e){return ft.createDomObservableFromEvent("orientationchange",gt.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return ft.createDomObservableFromEvent("resize",gt.getResizeMapFn.bind(this)).pipe((0,qe.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,a.map)((e=>{const t=gt.createCurriedGenericEvent(e);return ft.createDomObservableFromEvent(e,t)}),t)}getActiveObservables(e=this.domChannelConfig){let t=[];e.listenForMediaQueries=G(e.mediaQueries)||G(e.mediaQueries);const r={listenForResize:this.createResizeObservable.bind(this),listenForOrientation:this.createOrientationObservable.bind(this),listenForScroll:this.createScrollObservable.bind(this),listenForWheel:this.createMouseWheelObservable.bind(this)};(0,a.mapObjIndexed)(((r,n,o)=>{e[n]&&t.push(r(e))}),r),this.checkForMediaQueries(e.listenForMediaQueries);const n=this.getEventsFromConfig(e);return t=t.concat(n),t}checkForMediaQueries(e){!0===e&&this.getMediaQueryObservable(this.domChannelConfig).subscribe((e=>{const{action:t,payload:r,srcElement:n,event:o}=e;this.sendChannelPayload(t,r,n,o,this.observer$)}))}getMediaQueryObservable(e){const t=this.createMergedObsFromObj(e);return(0,a.apply)(y.merge,t).pipe((0,qe.map)(this.getMediaQueryMapFn.bind(this)))}addRegisteredActions(){return["CHANNEL_WINDOW_ABORT_EVENT","CHANNEL_WINDOW_AFTERPRINT_EVENT","CHANNEL_WINDOW_ANIMATIONEND_EVENT","CHANNEL_WINDOW_ANIMATIONITERATION_EVENT","CHANNEL_WINDOW_ANIMATIONSTART_EVENT","CHANNEL_WINDOW_APPINSTALLED_EVENT","CHANNEL_WINDOW_BEFOREPRINT_EVENT","CHANNEL_WINDOW_BEFOREUNLOAD_EVENT","CHANNEL_WINDOW_BEGINEVENT_EVENT","CHANNEL_WINDOW_BLUR_EVENT","CHANNEL_WINDOW_CACHED_EVENT","CHANNEL_WINDOW_CHANGE_EVENT","CHANNEL_WINDOW_CLICK_EVENT","CHANNEL_WINDOW_CLOSE_EVENT","CHANNEL_WINDOW_COMPOSITIONEND_EVENT","CHANNEL_WINDOW_COMPOSITIONSTART_EVENT","CHANNEL_WINDOW_COMPOSITIONUPDATE_EVENT","CHANNEL_WINDOW_COPY_EVENT","CHANNEL_WINDOW_CUT_EVENT","CHANNEL_WINDOW_DBLCLICK_EVENT","CHANNEL_WINDOW_DEVICECHANGE_EVENT","CHANNEL_WINDOW_DEVICELIGHT_EVENT","CHANNEL_WINDOW_DEVICEMOTION_EVENT","CHANNEL_WINDOW_DEVICEORIENTATION_EVENT","CHANNEL_WINDOW_DEVICEPROXIMITY_EVENT","CHANNEL_WINDOW_DOMATTRIBUTENAMECHANGED_EVENT","CHANNEL_WINDOW_DOMATTRMODIFIED_EVENT","CHANNEL_WINDOW_DOMCHARACTERDATAMODIFIED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMELEMENTNAMECHANGED_EVENT","CHANNEL_WINDOW_DRAGEND_EVENT","CHANNEL_WINDOW_DRAGENTER_EVENT","CHANNEL_WINDOW_DRAGLEAVE_EVENT","CHANNEL_WINDOW_DRAGOVER_EVENT","CHANNEL_WINDOW_DRAGSTART_EVENT","CHANNEL_WINDOW_DRAG_EVENT","CHANNEL_WINDOW_DROP_EVENT","CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT","CHANNEL_WINDOW_ERROR_EVENT","CHANNEL_WINDOW_FOCUSIN_EVENT","CHANNEL_WINDOW_FOCUS_EVENT","CHANNEL_WINDOW_FULLSCREENCHANGE_EVENT","CHANNEL_WINDOW_FULLSCREENERROR_EVENT","CHANNEL_WINDOW_HASHCHANGE_EVENT","CHANNEL_WINDOW_INPUT_EVENT","CHANNEL_WINDOW_INVALID_EVENT","CHANNEL_WINDOW_KEYDOWN_EVENT","CHANNEL_WINDOW_KEYPRESS_EVENT","CHANNEL_WINDOW_KEYUP_EVENT","CHANNEL_WINDOW_LOAD_EVENT","CHANNEL_WINDOW_MEDIA_QUERY_EVENT","CHANNEL_WINDOW_MESSAGE_EVENT","CHANNEL_WINDOW_MOUSEDOWN_EVENT","CHANNEL_WINDOW_MOUSEENTER_EVENT","CHANNEL_WINDOW_MOUSELEAVE_EVENT","CHANNEL_WINDOW_MOUSEMOVE_EVENT","CHANNEL_WINDOW_MOUSEOUT_EVENT","CHANNEL_WINDOW_MOUSEOVER_EVENT","CHANNEL_WINDOW_MOUSEUP_EVENT","CHANNEL_WINDOW_MOUSEWHEEL_EVENT","CHANNEL_WINDOW_OFFLINE_EVENT","CHANNEL_WINDOW_ONLINE_EVENT","CHANNEL_WINDOW_OPEN_EVENT","CHANNEL_WINDOW_ORIENTATION_EVENT","CHANNEL_WINDOW_PAGEHIDE_EVENT","CHANNEL_WINDOW_PAGESHOW_EVENT","CHANNEL_WINDOW_PASTE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_PROGRESSEVENTS_EVENT","CHANNEL_WINDOW_RESET_EVENT","CHANNEL_WINDOW_RESIZE_EVENT","CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT","CHANNEL_WINDOW_SCROLL_EVENT","CHANNEL_WINDOW_SCROLL_LOCK_EVENT",["CHANNEL_WINDOW_SCROLL_LOCK_EVENT","onScrollLockEvent"],["CHANNEL_WINDOW_SET_ELEMENT_TO_SCROLL_EVENT","onSetElementToScroll"],"CHANNEL_WINDOW_STORAGE_EVENT","CHANNEL_WINDOW_SUBMIT_EVENT","CHANNEL_WINDOW_TRANSITIONCANCEL_EVENT","CHANNEL_WINDOW_TRANSITIONEND_EVENT","CHANNEL_WINDOW_TRANSITIONRUN_EVENT","CHANNEL_WINDOW_TRANSITIONSTART_EVENT","CHANNEL_WINDOW_UNLOAD_EVENT","CHANNEL_WINDOW_WHEEL_EVENT"]}onScrollLockEvent(e){}onSetElementToScroll(e){let{config:t,el:r,scrollElement:n}=e.payload;t=t||{},t=u(this.domChannelConfig,t),n=n||r,this.sendChannelPayload("CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT",{el:r},r),this.createScrollObservable(t,n).subscribe((e=>{const{action:t,payload:r,srcElement:n,event:o}=e;this.sendChannelPayload(t,r,n,o)}))}bindStaticMethods(){this.createMediaQueryHandler=ft.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=ft.createMergedObsFromObj.bind(this)}}class St extends mt{constructor(e={}){super("CHANNEL_LIFECYCLE",e)}addRegisteredActions(){return["CHANNEL_LIFECYCLE_RENDERED_EVENT","CHANNEL_LIFECYCLE_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,n=r;n.action=t,this.onSendEvent(t,n)}onSendEvent(e,t={}){const r=this.channelActions[e],n={};window.setTimeout((()=>this.sendChannelPayload(r,t,n,void 0)),0)}}class It extends mt{constructor(e,t={}){t.isProxy=!0,super(e,t),this.props=t,this.subject$=new y.Subject,this.replaySub$=new y.ReplaySubject(1),this.observer$=(0,y.merge)(this.subject$,this.replaySub$),!0===I.debug&&this.checkIfChannelIsStillProxy(e)}getMergedSubject(e=!1){return!0===e?this.replaySub$:this.subject$}checkIfChannelIsStillProxy(e){const t=e;(async(e,t)=>{window.setTimeout((async()=>{await new Promise((e=>setTimeout(e,1))),window.requestAnimationFrame(e)}),t)})((()=>{!0!==(0,a.includes)(t,I.listRegisteredChannels())&&console.warn(`Spyne Warning: The channel, ${t} does not appear to be registered!`)}),1e3)}get replaySubject(){return this.replaySub$}get subject(){return this.subject$}}const yt=new Map;class Lt{constructor(){this.addMixins(),yt.set("DISPATCHER",new y.Subject),this.listRegisteredChannels=Lt.listRegisteredChannels.bind(this),this.getChannelsList=Lt.getChannelsList.bind(this)}get map(){return yt}static getChannelsList(){return Array.from(yt,((e,t)=>({key:e[0],val:e[1].constructor.name})))}static listRegisteredChannels(e=!1){const t=this.getChannelsList(),r=(0,a.reject)((0,a.propEq)("ChannelProxy","val")),n=(0,a.filter)((0,a.propEq)("ChannelProxy","val")),o=(!0===e?n:r)(t);return(0,a.pluck)(["key"],o)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,a.filter)((0,a.propEq)("ChannelProxy","val"))(e);if(t.length>=1){const e=`Spyne Warning: The following ${1===t.length?"Channel has":"Channels have"} not been initialized: ${(0,a.compose)((0,a.join)(", "),(0,a.map)((0,a.prop)("key")))(t)}`;console.warn(e)}}init(){this.createMainStreams()}createMainStreams(){this.routeStream=new At,yt.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new Ct,yt.set("CHANNEL_UI",this.uiStream),this.domStream=new gt,yt.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new St,yt.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){yt.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;yt.has(t)&&(0,a.compose)((0,a.pathEq)(["props","isRegistered"],!0))(yt.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(yt.set(t,e),e.initializeStream())}getChannelActions(e){return yt.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return yt.get(e)[r]}testStream(e){return void 0!==yt.get(e)}getStream(e){return!1===this.testStream(e)&&yt.set(e,new It(e)),yt.get(e)}addMixins(){}}class bt{constructor(e,t="",r=!0){return this.parentContext=e,this.omittedMethods=["autoBinder","initAutoBinder","getEnhancerMethods","checkForMalformedMethods","caller","arguments","bindParentViewStream"],this.prefix=t,!0===r&&this.autoBinder(),this.allMethodsList}initAutoBinder(){this.autoBinder()}getEnhancerMethods(){return function(e,t=[]){const r=(0,a.concat)(["length","name","prototype","constructor"],t),n=(0,a.compose)((0,a.without)(r),a.uniq),o=n(Object.getOwnPropertyNames(e.constructor.prototype)),s=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:s,allMethods:(0,a.concat)(o,s)}}(this,this.omittedMethods)}checkForMalformedMethods(e){if(""===this.prefix)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const t=(0,a.reject)((e=>0===e.indexOf(this.prefix)),e);if(t.length>=1){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${t.join(", ")}];`;console.warn(e)}}bindParentViewStream(e,t){this.checkForMalformedMethods(e.allMethods);const r={},n=(e,n=!1)=>{const o=!0===n?this.constructor:this;"function"==typeof o[e]&&(r[e]=t[e]=o[e].bind(t))},o=(0,a.curryN)(2,n)(a.__,!0);return(0,a.map)(o,e.staticMethods),(0,a.map)(n,e.methods),r}autoBinder(){const e=this.getEnhancerMethods();return this.allMethodsList=this.bindParentViewStream(e,this.parentContext),this.allMethodsList}}class Ot{constructor(e,t,r,n){this._mapFn=Ot.setMapFn(e),this._url=Ot.setUrl(e),this._responseType=Ot.setResponseType(e),this._serverOptions=Ot.setServerOptions(e),this._subscriber=void 0!==t?t:e=>console.log("FETCH RETURNED ",e),this.debug=void 0!==e.debug&&e.debug,this.channelName=n;const o={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,debug:this.debug};!0!==r&&Ot.startWindowFetch(o,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:n,url:o,serverOptions:s,responseType:i,debug:a}=e,c=!0===a?e=>console.log("DEBUG FETCH :",e,{url:o,serverOptions:s,responseType:i,channelName:r}):()=>{},l=(0,y.from)(window.fetch(o,s)).pipe((0,qe.tap)(c),(0,qe.flatMap)((e=>(0,y.from)(e[i]()))),(0,qe.map)((e=>{const t={channelName:r,url:o,responseType:i,serverOptions:s};return r=>e(r,t)})(n)),(0,qe.publish)());l.connect(),l.subscribe(t)}static setMapFn(e){return(0,a.compose)((0,a.defaultTo)((e=>e)),(0,a.prop)("mapFn"))(e)}static setUrl(e){const t=(0,a.prop)("url",e);return void 0===t&&console.warn("SPYNE WARNING: URL is undefined for data channel"),t}static setResponseType(e){return(0,a.defaultTo)("json",(0,a.prop)("responseType",e))}get mapFn(){return this._mapFn}get url(){return this._url}get serverOptions(){return this._serverOptions}get responseType(){return this._responseType}static stringifyBodyIfItExists(e){return(0,a.when)((0,a.propIs)(Object,"body"),(0,a.compose)((0,a.over)((0,a.lensProp)("body"),JSON.stringify)))(e)}static updateMethodWhenBodyExists(e){const t=(0,a.has)("body"),r=(0,a.propEq)("GET","method"),n=(0,a.allPass)([t,r]);return(0,a.when)(n,(0,a.assoc)("method","POST"))(e)}static setServerOptions(e){const t=(0,a.pick)(["method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"],e);let r=(0,a.mergeDeepRight)(Ot.baseOptions(),t);return r=Ot.updateMethodWhenBodyExists(r),r=Ot.stringifyBodyIfItExists(r),r}static baseOptions(){return{method:"GET",headers:new Headers({Accept:"application/json, text/plain, */*"}),mode:"cors",credentials:"same-origin",cache:"default",redirect:"follow",referrer:"client",referrerPolicy:"no-referrer-when-downgrade",integrity:"",keepalive:!1}}}class Dt extends mt{constructor(e,t={}){Dt.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_DATA_EVENT`,[`${e}_UPDATE_DATA_EVENT`,"onFetchUpdate"]],t.sendCachedPayload=!0,super(e,t)}static validateMapMethod(e,t,r=!1){const n=(0,a.either)(a.isNil,(e=>"function"!=typeof e)),o=(0,a.all)(n),s=(0,a.allPass)([o,e=>e.length>=1]);return!(0,a.compose)(s,a.values,(0,a.pick)(["map","mapFn"]))(e)||(!1===r&&console.warn(`Spyne Warning: The map method for ChannelFetch, ${t}, appears to be invalid`),!1)}onRegistered(){this.startFetch()}addRegisteredActions(e){const t=(0,a.compose)((0,a.defaultTo)([]),(0,a.path)(["props","extendedActionsArr"]));return["CHANNEL_DATA_EVENT",["CHANNEL_UPDATE_DATA_EVENT","onFetchUpdate"]].concat(t(this))}startFetch(e={},t=this.onFetchReturned.bind(this)){const r=this.consolidateAllFetchProps(e);return new Ot(r,t,!1,this.props.name)}onFetchUpdate(e){const t=this.getPropsForFetch(e);this.startFetch(t)}onFetchReturned(e){return this.createChannelPayloadItem(e)}createChannelPayloadItem(e,t=`${this.props.name}_DATA_EVENT`){const{name:r,sendCachedPayload:n,url:o}=this.props,s={name:r,sendCachedPayload:n,url:o};this.sendChannelPayload(t,e,s)}getPropsForFetch(e){const t=(0,a.path)(["viewStreamInfo","payload"],e);return(0,a.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t)}consolidateAllFetchProps(e,t=this.props){const r=(0,a.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t),n=(0,a.reject)(a.isNil);return(0,a.compose)(n,((e,t)=>(0,a.mergeDeepRight)(e,t)))(r,e)}get observer(){return this.observer$}}class vt{constructor(e={}){let{name:t,config:r,parentEl:n}=e;this.props=e,void 0===r&&(r=(0,a.clone)(e)),this.name=t||"empty",this.props.name=t,r=vt.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=n||vt.createParentEl(),vt.getSpyneApp(t,r),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.onBeforeRegistered(),this.onRegistered(),this.onRender()}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===I.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):I.addPluginConfig(e,t)}static updateSpyneConfig(e,t,r){return!0===(0,a.pathSatisfies)((0,a.is)(Object),["config","plugins",t])(e)?(!0===e.config.debug&&console.warn(`Spyne Warning: The plugin, ${t}, already exists`),!1):(e.config.plugins[t]=r,e.config.plugins[t])}static createParentEl(e){return e||document.getElementById("spyne-plugins")||(()=>{const e=new Be({id:"spyne-plugins"});document.body.appendChild(e.render());const t=document.getElementById("spyne-plugins");return t.style.cssText="position:absolute; top:0;left:0;width:100%;height:100%;min-height:100vh;z-index:1000000; pointer-events:none",t})()}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))}onBeforeRegistered(){this.props.pluginName=this.props.name,this.props.config=I.getPluginConfigByPluginName(this.props.pluginName)}defaultConfig(){return{}}onRegistered(){}onRender(){}}const Rt=new Lt,Ht="0.20.1";let Pt=new class{constructor(){this.version=Ht}get channels(){return Rt}init(e={},t=!1){if(!0===I.initialized)return t?"The Spyne Application has already been initialized!":void console.warn("The Spyne Application has already been initialized!");let r={scrollLock:!1,scrollLockX:31,scrollLockY:0,debug:!1,strict:!1,baseHref:void 0,IMG_PATH:"undefined"!=typeof IMG_PATH?IMG_PATH:void 0,pluginMethods:{},plugins:{},tmp:{},channels:{WINDOW:{mediaQueries:{},events:[],listenForResize:!0,listenForOrientation:!0,listenForScroll:!1,listenForMouseWheel:!1,listenForWheel:!1,debounceMSTimeForResize:200,debounceMSTimeForScroll:150},ROUTE:{type:"slash",isHash:!1,isHidden:!1,add404s:!1,routes:{routePath:{routeName:"change"}}}}};if(void 0!==e){const t=Tt;e=I.initialize(r,e,Rt,t)}this.pluginsFn=I.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>Rt.getChannelActions(e),this.registerChannel=e=>Rt.registerStream(e),this.registerDataChannel=e=>Rt.registerStream(e),this.listChannels=()=>Array.from(Rt.map.keys());let n=new ut({id:"spyne-null-views"});n.appendToDom(document.body),n.props.el.style.cssText="display:none; opacity:0; pointer-events:none;",Rt.init(),!0===I.config.debug&&(window.Spyne={version:Ht}),(e=>{if(Ge)console.warn("sanitizeHTML is already configured. Reconfiguration is not allowed.");else{if(e.strict)if(window.trustedTypes){const e=window.trustedTypes.createPolicy("default",{createHTML:e=>$e.sanitize(e,{RETURN_TRUSTED_TYPE:!1})});je=t=>e.createHTML(t)}else je=e=>$e.sanitize(e);else je=e=>e;Ge=!0}})(I.config)}static listChannels(){return Array.from(Rt.map.keys())}static getChannelActions(e){return Rt.getChannelActions(e)}static registerChannel(e){if(!1!==I.initialized)return Rt.registerStream(e);console.warn("Spyne has not been initialized")}};return i})()));
3
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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NkJBQ0EsNkJBQ0EsNEJBQ0EsNkJBQ0Esd0JBQ0Esa0NBQ0EsMkJBQ0EsdUJBQ0EsNEJBQ0EseUJBQ0EseUNBQ0EseUJBQ0EseUJBQ0EsMkJBQ0EsNEJBQ0EsNEJBQ0Esb0NBQ0EsbUNBQ0Esb0NBQ0EsdUNBQ0Esd0NBQ0EsaUNBQ0EsOEJBQ0EsZ0NBQ0EscUNBQ0EsOEJBQ0EsZ0NBQ0EscUNBQ0EsNENBQ0EsMkNBQ0EseUJBQ0Esc0NBQ0EsMkJBQ0EsMkJBQ0EsMkJBQ0EseUJBQ0Esa0NBQ0EseUNBQ0Esd0JBQ0EsOEJBQ0Esa0NBQ0EsMkJBQ0EsNkJBQ0Esc0NBQ0Esd0JBQ0Esc0NBQ0EsMkJBQ0EsZ0NBQ0EsNkJBQ0EsOEJBQ0EsOEJBQ0EsNkJBQ0EsNEJBQ0EsNkJBQ0EsMkJBQ0Esd0JBQ0EscUNBQ0EsMkJBQ0EscUNBQ0EsMkJBQ0EsMEJBQ0Esd0JBQ0EscUNBQ0EsNEJBQ0EsNEJBQ0EseUJBQ0EseUJBQ0EscUNBQ0EsdUNBQ0Esd0JBQ0EsMkJBQ0EsaUNBQ0EsK0JBQ0EsZ0NBQ0EsZ0NBQ0EscUNBQ0Esb0NBQ0EsK0JBQ0EsOEJBQ0EsK0JBQ0EsNkJBQ0EsNEJBQ0EsNEJBQ0Esd0JBQ0EsMENBQ0EsOEJBQ0Esb0NBQ0Esb0NBQ0EsK0JBQ0EsZ0NBQ0EsK0JBQ0EseUJBQ0EsMEJBQ0EsNENBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMkJBQ0EsMEJBQ0EsK0NBQ0EsNkJBQ0EsbUNBQ0EsK0JBQ0EseUNBQ0Esd0NBQ0Esd0NBQ0EsOEJBQ0EsNEJBQ0EsOEJBQ0EsNkJBQ0EsK0JBQ0EsMkJBQ0EsOEJBQ0EsZ0NBQ0EsMkJBQ0EseUJBQ0EsK0JBQ0EsMkJBQ0EsMEJBQ0EsMkJBQ0EsMkJBQ0EsMkJBQ0EsOEJBQ0EsMEJBQ0EsOEJBQ0EsK0JBQ0EsNEJBQ0EsNkJBQ0EsOEJBQ0EseUJBQ0Esb0NBQ0EsaUNBQ0EsaUNBQ0EsbUNBQ0Esc0NBQ0EsMEJBQ0EsMEJBQ0EsaUNBQ0EsaUNBQ0Esb0NBQ0EsaUNBQ0EsZ0NBQ0EscUNBQ0EsaUNBQ0Esb0NBQ0EsdUNBQ0EsdUNBQ0Esa0NBQ0Es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RUFBbUJHLE9BRTNDLENBV0EsbUJBQU9FLEdBQ0wsT0FBT2xFLE1BQU1tRSxLQUFLLEdBQVViLElBQUkvQixPQUNsQyxDQU9BLHdCQUFPb0QsQ0FBa0JNLEdBQ3ZCLE9BQU8sR0FBVU4sa0JBQWtCTSxFQUNyQyxDQVNBLHNCQUFPcUIsQ0FBZ0JzdUIsR0FDckIsSUFBdUMsSUFBbkMvd0IsRUFBbUJFLFlBR3JCLE9BQU8sR0FBVWc2QyxlQUFlbnBCLEdBRmhDanlCLFFBQVFNLEtBQUssaUNBSWpCLGE3Q25LRiIsInNvdXJjZXMiOlsid2VicGFjazovL3NweW5lL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJhbWRhXCIsXCJjb21tb25qczJcIjpcInJhbWRhXCIsXCJhbWRcIjpcInJhbWRhXCIsXCJyb290XCI6XCJSXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJyb290XCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiY29tbW9uanNcIjpcInJ4anMvb3BlcmF0b3JzXCIsXCJjb21tb25qczJcIjpcInJ4anMvb3BlcmF0b3JzXCIsXCJhbWRcIjpcInJ4anMvb3BlcmF0b3JzXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJyb290XCI6W1wicnhqc1wiXSxcImNvbW1vbmpzXCI6XCJyeGpzXCIsXCJjb21tb25qczJcIjpcInJ4anNcIixcImFtZFwiOlwicnhqc1wifSIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9kZWVwLW1lcmdlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYWZlLWNsb25lLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtcGF5bG9hZC1jbGFzcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9mcnAtdG9vbHMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9ub2RlX21vZHVsZXMvZG9tcHVyaWZ5L2Rpc3QvcHVyaWZ5LmVzLm1qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYW5pdGl6ZS1odG1sLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LXRlbXBsYXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tYW5pbWF0aW9ucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvZ2MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1icm9hZGNhc3Rlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1zdHJlYW1zLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLXBheWxvYWQtZmlsdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLXNlbGVjdG9yLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3JvdXRlLWNoYW5uZWwtdXBkYXRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1yb3V0ZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXVpLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtcHJveHkuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbHMtbWFwLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXRyYWl0LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2NoYW5uZWwtZmV0Y2gtdXRpbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLWZldGNoLWNsYXNzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3NweW5lLXBsdWdpbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvc3B5bmUtYXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInJhbWRhXCIpLCByZXF1aXJlKFwicnhqc1wiKSwgcmVxdWlyZShcInJ4anMvb3BlcmF0b3JzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwic3B5bmVcIiwgW1wicmFtZGFcIiwgXCJyeGpzXCIsIFwicnhqcy9vcGVyYXRvcnNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic3B5bmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJyYW1kYVwiKSwgcmVxdWlyZShcInJ4anNcIiksIHJlcXVpcmUoXCJyeGpzL29wZXJhdG9yc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wic3B5bmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJSXCJdLCByb290W1wicnhqc1wiXSwgcm9vdFtcInJ4anNcIl1bXCJvcGVyYXRvcnNcIl0pO1xufSkoc2VsZiwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MF9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX183MjVfXykgPT4ge1xucmV0dXJuICIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX183MjVfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUwX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgeyBhbGxQYXNzLCBjb21wb3NlLCBpcywga2V5cywgbm90LCBwcm9wIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9wbHVnaW5NZXRob2RzT2JqID0gT2JqZWN0LmNyZWF0ZSh7fSlcblxuY29uc3QgaXNOb3RBcnIgPSBjb21wb3NlKG5vdCwgaXMoQXJyYXkpKVxuLy8gY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2Uobm90LCBpc0VtcHR5KVxuLy8gY29uc3QgaXNOb25FbXB0eVN0ciA9IGFsbFBhc3MoW2lzKFN0cmluZyksIGlzTm90RW1wdHldKVxuLy8gY29uc3QgaXNOb25FbXB0eUFyciA9IGFsbFBhc3MoW2lzKEFycmF5KSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc09iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuLy8gY29uc3QgaXNOb25FbXB0eU9iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuXG5leHBvcnQgY2xhc3MgU3B5bmVQbHVnaW5zTWV0aG9kcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIF9wbHVnaW5NZXRob2RzT2JqLmZvbyA9ICgpID0+IGNvbnNvbGUubG9nKCd1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLicpXG4gIH1cblxuICBhZGRNZXRob2Qoa2V5LCBmbiwgdGVzdCA9IGZhbHNlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfcGx1Z2luTWV0aG9kc09iaiwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgbWV0aG9kIG5hbWUsICR7a2V5fSwgYWxyZWFkeSBleGlzdHMuYFxuICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgIH0gZWxzZSB7XG4gICAgICBfcGx1Z2luTWV0aG9kc09ialtrZXldID0gZm5cbiAgICB9XG4gIH1cblxuICBhZGRNZXRob2RzKG1ldGhvZHNPYmogPSB7fSwgdGVzdCA9IGZhbHNlKSB7XG4gICAgbGV0IHdhcm5TdHJcblxuICAgIGNvbnN0IGlzT2JqID0gaXNPYmplY3RGbihtZXRob2RzT2JqKVxuXG4gICAgaWYgKGlzT2JqID09PSBmYWxzZSkge1xuICAgICAgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgcGx1Z2luTWV0aG9kcyBwcm9wZXJ0eSwgJHtKU09OLnN0cmluZ2lmeShtZXRob2RzT2JqKX0gbmVlZHMgdG8gYmUgYW4gb2JqZWN0LmBcbiAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRWFjaEtleUZvclZhbGlkTWV0aG9kID0gKGtleVN0cikgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChrZXlTdHIsIG1ldGhvZHNPYmopXG5cbiAgICAgIGNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlb2YgKG1ldGhvZFZhbCkgPT09ICdmdW5jdGlvbidcblxuICAgICAgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hZGRNZXRob2Qoa2V5U3RyLCBtZXRob2RWYWwsIHRlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuU3RyID0gYHRoZSB2YWx1ZSBmb3IgJHtrZXlTdHJ9IGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uLmBcbiAgICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kS2V5cyA9IGtleXMobWV0aG9kc09iailcblxuICAgIHJldHVybiBtZXRob2RLZXlzLm1hcChjaGVja0VhY2hLZXlGb3JWYWxpZE1ldGhvZCkuam9pbignLCcpXG4gIH1cblxuICBjaGVja0lmTWV0aG9kRXhpc3RzKGtleSkge1xuXG4gIH1cblxuICBnZXQgcGx1Z2luTWV0aG9kc09iaigpIHtcbiAgICByZXR1cm4gX3BsdWdpbk1ldGhvZHNPYmpcbiAgfVxufVxuIiwiZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsKSB7XG4gIGNvbnN0IG5vbk51bGxPYmplY3QgPSB2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCdcbiAgcmV0dXJuIG5vbk51bGxPYmplY3QgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgIT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBEYXRlXSdcbn1cblxuZnVuY3Rpb24gZW1wdHlUYXJnZXQodmFsKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyBbXSA6IHt9XG59XG5cbmZ1bmN0aW9uIGNsb25lSWZOZWNlc3NhcnkodmFsdWUsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBjbG9uZSA9IG9wdGlvbnNBcmd1bWVudCAmJiBvcHRpb25zQXJndW1lbnQuY2xvbmUgPT09IHRydWVcbiAgcmV0dXJuIChjbG9uZSAmJiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSkpXG4gICAgPyBkZWVwTWVyZ2UoZW1wdHlUYXJnZXQodmFsdWUpLFxuICAgICAgdmFsdWUsIG9wdGlvbnNBcmd1bWVudClcbiAgICA6IHZhbHVlXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSB0YXJnZXQuc2xpY2UoKVxuICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbihlLCBpKSB7XG4gICAgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbltpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gY2xvbmVJZk5lY2Vzc2FyeShlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdChlKSkge1xuICAgICAgZGVzdGluYXRpb25baV0gPSBkZWVwTWVyZ2UodGFyZ2V0W2ldLCBlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSBlbHNlIGlmICh0YXJnZXQuaW5kZXhPZihlKSA9PT0gLTEpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goY2xvbmVJZk5lY2Vzc2FyeShlLCBvcHRpb25zQXJndW1lbnQpKVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSB7fVxuICBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0KSkge1xuICAgIE9iamVjdC5rZXlzKHRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZUlmTmVjZXNzYXJ5KHRhcmdldFtrZXldLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSlcbiAgfVxuICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFpc01lcmdlYWJsZU9iamVjdChzb3VyY2Vba2V5XSkgfHwgIXRhcmdldFtrZXldKSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeShzb3VyY2Vba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIGRlZXBNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGFycmF5ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpXG4gIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zQXJndW1lbnQgfHwgeyBhcnJheU1lcmdlOiBkZWZhdWx0QXJyYXlNZXJnZSB9XG4gIGNvbnN0IGFycmF5TWVyZ2UgPSBvcHRpb25zLmFycmF5TWVyZ2UgfHwgZGVmYXVsdEFycmF5TWVyZ2VcblxuICBpZiAoYXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpXG4gICAgICA/IGFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgICAgIDogY2xvbmVJZk5lY2Vzc2FyeShzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgfVxufVxuXG5kZWVwTWVyZ2UuYWxsID0gZnVuY3Rpb24gZGVlcG1lcmdlQWxsKGFycmF5LCBvcHRpb25zQXJndW1lbnQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2ZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IHR3byBlbGVtZW50cycpXG4gIH1cblxuICAvLyB3ZSBhcmUgc3VyZSB0aGVyZSBhcmUgYXQgbGVhc3QgMiB2YWx1ZXMsIHNvIGl0IGlzIHNhZmUgdG8gaGF2ZSBubyBpbml0aWFsIHZhbHVlXG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCkge1xuICAgIHJldHVybiBkZWVwTWVyZ2UocHJldiwgbmV4dCwgb3B0aW9uc0FyZ3VtZW50KVxuICB9KVxufVxuXG5leHBvcnQgeyBkZWVwTWVyZ2UgfVxuIiwiLy8gaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZSdcbmltcG9ydCB7IFNweW5lUGx1Z2luc01ldGhvZHMgfSBmcm9tICcuL3NweW5lLXBsdWdpbnMtbWV0aG9kcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4vZGVlcC1tZXJnZSdcbmltcG9ydCB7IHBhdGggfSBmcm9tICdyYW1kYSdcblxubGV0IF9jb25maWdcbmxldCBfY2hhbm5lbHNcbmxldCBfY2hhbm5lbHNNYXBcbmxldCBfaW5pdGlhbGl6ZWRcbmxldCBfZGVidWcgPSB0cnVlXG5sZXQgX0lNR19QQVRIXG5jb25zdCBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyID0gW11cbmNvbnN0IF9wcm94aWVzTWFwID0gbmV3IE1hcCgpXG5cbmNvbnN0IF9zcHluZVBsdWdpbk1ldGhvZHMgPSBuZXcgU3B5bmVQbHVnaW5zTWV0aG9kcygpXG5cbmNsYXNzIFNweW5lQXBwUHJvcGVydGllc0NsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX2luaXRpYWxpemVkID0gZmFsc2VcbiAgfVxuXG4gIGdldCBjaGFubmVsc01hcCgpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzTWFwXG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIF9pbml0aWFsaXplZFxuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgZ2V0IGRlYnVnKCkge1xuICAgIHJldHVybiBfZGVidWdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5MaXN0aW5nIHRoZSByZWdpc3RlcmVlZCBDaGFubmVscyBpbiB0aGUgYnJvd3NlciBjb25zb2xlPC9oND4nXVxuICAgKiBTcHluZUFwcC5saXN0Q2hhbm5lbHMoKTtcbiAgICpcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGNoYW5uZWxzXG4gICAqL1xuICBzdGF0aWMgbGlzdENoYW5uZWxzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKVxuICB9XG5cbiAgaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnID0ge30sIGNvbmZpZyA9IHt9LCBjaGFubmVsc01hcCwgcm91dGVVdGlscykge1xuICAgIF9jaGFubmVscyA9IGNoYW5uZWxzTWFwXG4gICAgX2NvbmZpZyA9IGRlZXBNZXJnZShkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJjb25maWcgaXMgXCIsIHsgZGVmYXVsdENvbmZpZyxjb25maWcgfSk7XG4gICAgaWYgKF9jb25maWcuY2hhbm5lbHMgJiYgX2NvbmZpZy5jaGFubmVscy5ST1VURSkge1xuICAgICAgLy8gX2NvbmZpZyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcpXG4gICAgICBfY29uZmlnID0gcm91dGVVdGlscy5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZylcbiAgICB9XG4gICAgX0lNR19QQVRIID0gX2NvbmZpZz8uSU1HX1BBVEhcbiAgICBfZGVidWcgPSBfY29uZmlnLmRlYnVnICE9PSB1bmRlZmluZWQgPyBfY29uZmlnLmRlYnVnIDogX2RlYnVnXG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucy5iaW5kKF9jaGFubmVscylcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBfY2hhbm5lbHMubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKF9jaGFubmVscylcbiAgICBfaW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgdGhpcy5zZXRDaGFubmVsc01hcCgpXG4gICAgaWYgKGNvbmZpZz8uYmFzZUhyZWYpIHtcbiAgICAgIHRoaXMuc2V0SGVhZEJhc2VIcmVmKGNvbmZpZy5iYXNlSHJlZilcbiAgICB9XG4gICAgcmV0dXJuIF9jb25maWdcbiAgfVxuXG4gIHNldEhlYWRCYXNlSHJlZihzdHIpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgYmFzZSBlbGVtZW50XG4gICAgY29uc3QgYmFzZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKVxuICAgIC8vIFNldCB0aGUgaHJlZiBhdHRyaWJ1dGUgdG8gdGhlIGRlc2lyZWQgYmFzZSBVUkxcbiAgICBiYXNlVGFnLmhyZWYgPSBzdHIgLy8gWW91IGNhbiBzZXQgdGhpcyB0byBhbnkgYmFzZSBVUkxcbiAgICAvLyBBcHBlbmQgdGhlIGJhc2UgZWxlbWVudCB0byB0aGUgaGVhZCBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYmFzZVRhZylcbiAgfVxuXG4gIGNvbmZvcm1Sb3V0ZUNvbmZpZyhhZGQ0MDRQcm9wcyA9IGZhbHNlKSB7XG4gICAgLyoqXG4gICAgICogVEhJUyBNRVRIT0QgSVMgUFJJTUFSSUxZIFVTRUQgRk9SIFNQQSBHRU4gU0lURSBHRU5FUkFUSU9OXG4gICAgICovXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBfY29uZmlnID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZywgYWRkNDA0UHJvcHMpXG4gIH1cblxuICBzZXRDaGFubmVsc01hcCgpIHtcbiAgICBjb25zdCBnZXRTdHJlYW0gPSBfY2hhbm5lbHMuZ2V0U3RyZWFtLmJpbmQoX2NoYW5uZWxzKVxuICAgIGNvbnN0IHRlc3RTdHJlYW0gPSAgX2NoYW5uZWxzLnRlc3RTdHJlYW0uYmluZChfY2hhbm5lbHMpXG4gICAgY29uc3QgZ2V0UHJveHlTdWJqZWN0ID0gX2NoYW5uZWxzLmdldFByb3h5U3ViamVjdC5iaW5kKF9jaGFubmVscylcblxuICAgIF9jaGFubmVsc01hcCA9IHsgZ2V0U3RyZWFtLCB0ZXN0U3RyZWFtLCBnZXRQcm94eVN1YmplY3QgfVxuICB9XG5cbiAgc2V0UHJvcChrZXksIHZhbCkge1xuICAgIF9jb25maWcudG1wW2tleV0gPSB2YWxcbiAgfVxuXG4gIGdldFByb3Aoa2V5KSB7XG4gICAgcmV0dXJuIHBhdGgoWyd0bXAnLCBrZXldLCBfY29uZmlnKVxuICB9XG5cbiAgc2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTmFtZSwgY29uZmlnKSB7XG4gICAgX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV0gPSBjb25maWdcbiAgICByZXR1cm4gX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gY2hlY2sgaW4gdGhlIGNvbnNvbGUgb3IgaW4gdGhlIGNvZGUgd2hhdCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gYmUgbGlzdGVuZWQgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IG9mIEFjdGlvbnMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICovXG4gIC8qICBnZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsTmFtZSkge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbE5hbWUpO1xuICB9ICovXG5cbiAgZ2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTmFtZSwgY29uZmlnID0gX2NvbmZpZykge1xuICAgIGlmIChjaGFubmVsTmFtZSA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICBjaGFubmVsTmFtZSA9ICdST1VURSdcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxOYW1lID09PSAnQ0hBTk5FTF9XSU5ET1cnKSB7XG4gICAgICBjaGFubmVsTmFtZSA9ICdXSU5ET1cnXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkIHx8IF9jb25maWcuY2hhbm5lbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZSB3YXJuaW5nOiBTcHluZSBjb25maWcgb2JqZWN0IGlzIGVtcHR5IScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV1cblxuICAgIGlmIChjaGFubmVsQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgd2FybmluZzogU3B5bmUgY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCwgJHtjaGFubmVsTmFtZX0gaXMgZW1wdHkhYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBjaGFubmVsQ29uZmlnXG4gIH1cblxuICByZWdpc3RlckNoYW5uZWwoKSB7XG5cbiAgfVxuXG4gIGFkZFBsdWdpbkNvbmZpZyhwbHVnaW5OYW1lLCBwbHVnaW5Db25maWcgPSB7fSkge1xuICAgIGlmIChfY29uZmlnLnBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX2NvbmZpZy5wbHVnaW5zID0ge31cbiAgICB9XG4gICAgdGhpcy5hZGRQbHVnaW5NZXRob2RzKHBsdWdpbkNvbmZpZy5wbHVnaW5NZXRob2RzKVxuXG4gICAgX2NvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luQ29uZmlnXG4gIH1cblxuICBnZXRQbHVnaW5zTWV0aG9kT2JqKHBsdWdpbk1ldGhvZHNPYmopIHtcbiAgICBpZiAocGx1Z2luTWV0aG9kc09iaikge1xuICAgICAgdGhpcy5hZGRQbHVnaW5NZXRob2RzKHBsdWdpbk1ldGhvZHNPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIF9zcHluZVBsdWdpbk1ldGhvZHMucGx1Z2luTWV0aG9kc09ialxuICB9XG5cbiAgYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5NZXRob2RzKSB7XG4gICAgaWYgKHBsdWdpbk1ldGhvZHMpIHtcbiAgICAgIF9zcHluZVBsdWdpbk1ldGhvZHMuYWRkTWV0aG9kcyhwbHVnaW5NZXRob2RzKVxuICAgIH1cbiAgfVxuXG4gIGRvTm90VHJhY2tDaGFubmVsKGNoYW5uZWxOYW1lKSB7XG4gICAgX2RvTm90VHJhY2tDaGFubmVsc0Fyci5wdXNoKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgZ2V0VW50cmFja2VkQ2hhbm5lbHNMaXN0KCkge1xuICAgIHJldHVybiBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyXG4gIH1cblxuICByZWdpc3RlclByb3h5UmV2aXZlcihuYW1lLCBtZXRob2QpIHtcbiAgICBfcHJveGllc01hcC5zZXQobmFtZSwgbWV0aG9kKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiUkVHSVNURVJEIFBST1hZIFJFVklWRVJcIixfcHJveGllc01hcCwgX3Byb3hpZXNNYXAuZ2V0KG5hbWUpKTtcbiAgfVxuXG4gIGdldFByb3h5UmV2aXZlcihwcm94eU5hbWUpIHtcbiAgICByZXR1cm4gX3Byb3hpZXNNYXAuZ2V0KHByb3h5TmFtZSlcbiAgfVxuXG4gIGdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZShwbHVnaW5OYW1lKSB7XG4gICAgcmV0dXJuIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXVxuICB9XG5cbiAgZ2V0IElNR19QQVRIKCkge1xuICAgIHJldHVybiBfSU1HX1BBVEhcbiAgfVxuXG4gIHRlbXBHZXRDaGFubmVsc0luc3RhbmNlKCkge1xuXG4gIH1cblxuICB0ZW1wR2V0Q29uZmlnKCkge1xuXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNweW5lQXBwUHJvcGVydGllcyA9IG5ldyBTcHluZUFwcFByb3BlcnRpZXNDbGFzcygpXG4iLCJpbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IGNvbXBvc2UsIHBhdGgsIGlzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcblxuLy8gY29uc29sZS5sb2coJ2NoYW5uZWxzIGNvbmZpZyBsb2FkZWQgJyxSLFJ4KTtcbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyA9ICgpID0+ICh7XG4gIGluY2x1ZGVzOiAgKCkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlID8gU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSA6IFsnQ0hBTk5FTF9ST1VURScsICdDSEFOTkVMX1VJJywgJ0NIQU5ORUxfV0lORE9XJywgJ0RJU1BBVENIRVInXVxuXG59KVxuXG4vLyBnZXRHbG9iYWxPYmooKS5jaGFubmVsc0xpc3RBcnI7XG5jb25zdCByZWdpc3RlcmVkU3RlcHMgPSBbJ0xPQUQnLCAnUkVOREVSJywgJ01PVU5UJywgJ1VOTU9VTlQnLCAnRElTUE9TRScsICdHQVJCQUdFX0NPTExFQ1QnLCAnVVBEQVRFJ11cbmNvbnN0IHJlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXMgPSBbJ3BhcmVudCcsICdzZWxmJywgJ2NoaWxkJywgJ2NoaWxkcmVuJywgJ3ZpZXcnXVxuY29uc3QgcmVnaXN0ZXJlZFN0cmVhbVR5cGVzID0gWydPYnNlcnZhYmxlJywgJ0JlaGF2aW9yU3ViamVjdCcsICdTdWJqZWN0JywgJ09ic2VydmVyJywgJ1N1YnNjcmliZXInLCAnRnJvbUV2ZW50T2JzZXJ2YWJsZSddXG5jb25zdCByZWdpc3RlcmVkQWN0aW9ucyA9IFsnc3Vic2NyaWJlJywgJ2NvbWJpbmVMYXRlc3QnXVxuY29uc3QgZ2V0UnhUeXBlID0gKG9icykgPT4gb2JzKCkuY29uc3RydWN0b3IubmFtZVxuLy8gbGV0IGdldE9ic2VydmFibGVUeXBlID0gKG9icykgPT4gb2JzLmNvbnN0cnVjdG9yLm5hbWU7XG5jb25zdCBjb25maXJtT2JzZXJ2YWJsZSA9IChvYnMpID0+IG9icy5zdWJzY3JpYmUgIT09IHVuZGVmaW5lZFxuLy8gbGV0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXihcXC8/KSguKikoXFwvKSguKikvZywgJyQyJyk7XG5sZXQgYmFzZVZhbGlkYXRpb25zID0gW107IGxldCB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW107IGxldCB1aVZhbGlkYXRpb25zID0gW11cbmxldCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW11cbmxldCByb3V0ZVZhbGlkYXRpb25zID0gW107IGxldCBTdHJlYW1zQ29uZmlnID0gW11cblxuaWYgKGNvbXBvc2UgIT09IHVuZGVmaW5lZCAmJiBPYnNlcnZhYmxlICE9PSB1bmRlZmluZWQpIHtcbi8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQUxMIFZBTElEQVRJT05TIEFERCBUSEUgQkFTRSBWQUxJREFUSU9OUyBUSFJPVUdIIENPTkNBVEVOQVRJT05cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBiYXNlVmFsaWRhdGlvbnMgPSBbXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkIHRvIG1hdGNoIGEgdmFsaWQgbmFtZSB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAncGFyYW0gXFwnb2JzZXJ2YWJsZVxcJyBtdXN0IGNvbnRhaW4gYSB2YWxpZCBPYnNlcnZhYmxlJyxcbiAgICAgIC8vIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoZ2V0T2JzZXJ2YWJsZVR5cGUocGF5bG9hZC5vYnNlcnZhYmxlKSlcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBjb25maXJtT2JzZXJ2YWJsZShwYXlsb2FkLm9ic2VydmFibGUpXG4gICAgfSxcbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgIH1cblxuICBdXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVEhFU0UgVkFMSURBVElPTlMgQVJFIENPTkNBVEVOQVRFRCBXSEVOIFRIRSBPQlNFUlZBQkxFIFJFRkVSUyBUTyBBIFZJRVdcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgdnNpZCBudW1iZXIgaW4gc3JjRWxlbWVudCcsXG4gICAgICBwcmVkaWNhdGU6IGNvbXBvc2UoaXMoU3RyaW5nKSwgcGF0aChbJ2RhdGEnLCAnc3JjRWxlbWVudCcsICd2c2lkJ10pKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICduZWVkcyBhIGlkIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksXG4gICAgICAgIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAnaWQnXSkpXG4gICAgfVxuICBdXG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOTyBTUEVDSUZJQyBVSSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdWlWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHVpVmFsaWRhdGlvbnMgPSBbXVxuICAgIHJldHVybiB1aVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgTElGRVNUUkVBTSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIGNvbnN0IGxpZmVTdHJlYW1WYWxpZGF0aW9ucyA9IFtcblxuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0ZXAgc3RyaW5nczogJHtyZWdpc3RlcmVkU3RlcHN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RlcHMuaW5jbHVkZXMocGF5bG9hZC5TVEVQKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6IGB0eXBlIG5lZWRzIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAke3JlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzLmluY2x1ZGVzKHBheWxvYWQudHlwZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6ICd2aWV3SWQgbmVlZHMgdG8gYmUgYWRkZWQgJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLnZpZXdJZCAhPT0gdW5kZWZpbmVkXG4gICAgfVxuICBdXG5cbiAgc3RlcFZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gc3RlcFZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ0RJU1BPU0UgU1RFUCByZXF1aXJlcyBhIGRpc3Bvc2VJdGVtIHBhcmFtIGluIHRoZSBkYXRhIG9iamVjdCcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdESVNQT1NFJyAmJlxuICAgICAgICAgICAgcGF5bG9hZC5kYXRhLmRpc3Bvc2VJdGVtcyAhPT0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiBzdGVwVXBkYXRlVmFsaWRhdGlvbnMuY29uY2F0KGxpZmVTdHJlYW1WYWxpZGF0aW9ucylcbiAgfVxuXG4gIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdVUERBVEUgU1RFUCByZXF1aXJlcyBhIGRhdGEgb2JqZWN0ICcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdVUERBVEUnICYmIHBheWxvYWQuZGF0YSAhPT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBsaWZlc3RyZWFtVmFsaWRhdGlvbnNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbGlmZVN0cmVhbVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpXG4gICAgICAuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIRVJFIElTIFRIRSBST1VURSBWQUxJREFUSU9OU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJvdXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCByb3V0ZVZhbGlkYXRpb25zID0gW1xuICAgICAgLypcbiAgICAgICpcbiAgICAgIHtcbiAgICAgICAgICBlcnJvcjogYG5lZWRzIGEgdmFsaWQgcm91dGUgc3RyaW5nIHdpdGhpbiBbJHtyZWdpc3RlcmVkUm91dGVzfV1gLFxuICAgICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkUm91dGVzLmluY2x1ZGVzKHB1bGxNYWluUm91dGUocGF5bG9hZC5kYXRhLm5hdmlnYXRlVG8pKVxuICAgICAgfVxuICAgICAgKlxuICAgICAgKi9cblxuICAgIF1cbiAgICByZXR1cm4gcm91dGVWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qXG4gICogVEhFIElERUEgT0YgU3RyZWFtc0NvbmZpZyBJUyBUTyBDT01QTEVURUxZIEdFTkVSQVRFIEFMTCBBUFAgU1RSRUFNUyBVU0lORyBUSElTIE9CSkVDVFxuICAqIFRISVMgSEFTIE5PVCBCRUVOIElNUExFTUVOVEVEIC0tIE1BWSBCRSBBRERFRCBJTiBBIEZVVFVSRSBWRVJTSU9OXG4gICovXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgU3RyZWFtc0NvbmZpZyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0cmVhbVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ25hbWVcXCcgbXVzdCBiZSBvZiBhIHJlZ2lzdGVyZWQgdHlwZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoXG4gICAgICAgICAgZ2V0UnhUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZEFjdGlvbnMuaW5jbHVkZXMocGF5bG9hZC5hY3Rpb24pXG4gICAgICB9XG5cbiAgICBdXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWFtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ0RJU1BBVENIRVInLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ1VCVScsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiAoKSA9PiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgICAgYWN0aW9uOiAnc3Vic2NyaWJlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RydWN0dXJlOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlIHx8IFN1YmplY3QsXG4gICAgICAgICAgICBhY3Rpb246IFN0cmluZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdGlvbnM6IHN0cmVhbVZhbGlkYXRpb25zXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMsIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucywgc3RlcFZhbGlkYXRpb25zLCB1aVZhbGlkYXRpb25zLCByb3V0ZVZhbGlkYXRpb25zLCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMsIHJlZ2lzdGVyZWRTdHJlYW1OYW1lcywgU3RyZWFtc0NvbmZpZ1xufVxuIiwiaW1wb3J0IHsgY2xvbmUsIGNvbXBvc2UsIGZyb21QYWlycywgaXMsIHBhdGgsIHRvUGFpcnMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5cbmNvbnN0IGdldFByb3BUeXBlID0gKHBycCkgPT4ge1xuICBsZXQgdHlwZSA9IHR5cGVvZiBwcnBcbiAgaWYgKFsnbnVtYmVyJywgJ2Jvb2xlYW4nLCAnc3RyaW5nJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICB0eXBlID0gJ3ByaW1pdGl2ZSdcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBycCkpIHtcbiAgICAgIHR5cGUgPSAnYXJyYXknXG4gICAgfSBlbHNlIGlmIChwcnAgPT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSAndW5kZWZpbmVkJ1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHlwZVxufVxuXG5jb25zdCBjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmogPSAocHJveHlPYmosIHByb3h5UmV2aXZlck1ldGhvZCkgPT4ge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gcHJveHlPYmpcblxuICBpZiAoX19wcm94eV9fcHJveHlOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdvYmplY3QgaXMgbm90IHByb3h5IG9iamVjdCAnLCBwcm94eU9iailcbiAgfVxuXG4gIGNvbnN0IGNsb25lTmVzdGVkUHJveHlPYmogPSAodGFyZ2V0LCBwYXRoQXJyKSA9PiB7XG4gICAgY29uc3QgbmVzdGVkUHJveHlPYmogPSBwYXRoKHBhdGhBcnIsIHByb3h5T2JqKVxuICAgIGNvbnN0IHsgX19wcm94eV9faXNQcm94eSwgX19wcm94eV9fcHJvcHMgfSA9IG5lc3RlZFByb3h5T2JqXG4gICAgcmV0dXJuIF9fcHJveHlfX2lzUHJveHkgPyBwcm94eVJldml2ZXJNZXRob2QodGFyZ2V0LCBfX3Byb3h5X19wcm9wcykgOiB0YXJnZXRcbiAgfVxuXG4gIGNvbnN0IHJvb3RPYmogPSBjbG9uZU5lc3RlZFByb3h5T2JqKGNsb25lKHByb3h5T2JqKSwgW10pXG5cbiAgY29uc3QgcHJveHlJdGVyYWJsZSA9IChpdGVyT2JqLCBpdGVyUGF0aCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gaXRlclBhdGggfHwgW11cbiAgICBjb25zdCBsb29wT2JqID0gKFtrZXksIHByb3BdKSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gZ2V0UHJvcFR5cGUocHJvcClcbiAgICAgIGNvbnN0IGNsb25lZFBhdGggPSBbLi4uZGF0YVBhdGhdXG4gICAgICBjbG9uZWRQYXRoLnB1c2goa2V5KVxuICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgaXRlck9ialtrZXldID0gY2xvbmVOZXN0ZWRQcm94eU9iaihwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgICBwcm94eUl0ZXJhYmxlKHByb3AsIGNsb25lZFBhdGgpXG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGl0ZXJPYmopLmZvckVhY2gobG9vcE9iailcbiAgfVxuXG4gIHByb3h5SXRlcmFibGUocm9vdE9iailcbiAgLy8gY29uc29sZS50aW1lRW5kKCdwcm94aWZ5MicpO1xuXG4gIHJldHVybiByb290T2JqXG59XG5cbmV4cG9ydCBjb25zdCBzYWZlQ2xvbmUgPSBmdW5jdGlvbihvKSB7XG4gIGNvbnN0IHsgX19wcm94eV9fcHJveHlOYW1lIH0gPSBvXG4gIGlmIChfX3Byb3h5X19wcm94eU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHByb3h5UmV2aXZlck1ldGhvZCA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRQcm94eVJldml2ZXIoX19wcm94eV9fcHJveHlOYW1lKVxuICAgIGlmICh0eXBlb2YgcHJveHlSZXZpdmVyTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqKG8sIHByb3h5UmV2aXZlck1ldGhvZClcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxufVxuIiwiaW1wb3J0IHtcbiAgbWVyZ2VBbGwsXG4gIGNsb25lLFxuICBmcm9tUGFpcnMsXG4gIHRvUGFpcnMsXG4gIGNvbXBvc2UsXG4gIGluY2x1ZGVzLFxuICBwaWNrQWxsLFxuICBsdGUsXG4gIGRlZmF1bHRUbyxcbiAgcHJvcCxcbiAgaXNcbn0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUGF5bG9hZCB7XG4gIC8qKlxuICAgKlxuICAgKiBBbGwgQ2hhbm5lbCBkYXRhIGlzIHB1Ymxpc2hlZCB1c2luZyB0aGlzIGludGVyZmFjZS5cbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBzcmNFbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjaGFubmVsTmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgbmFtZSBvZiB0aGUgQ2hhbm5lbCB0aGF0IGlzIHNlbmRpbmcgdGhlIHBheWxvYWQuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhY3Rpb24gLSA9IHVuZGVmaW5lZDsgQW4gYWN0aW9uIHN0cmluZyB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aGluIHRoZSBDaGFubmVsJ3MgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcGF5bG9hZCAtID0gdW5kZWZpbmVkOyBUaGUgZGF0YSBvYmplY3QuXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnQgLSA9IHt9OyBUaGlzIGlzIHBvcHVsYXRlZCB3aGVuIHRyaWdnZXJlZCBmcm9tIGEgVmlld1N0cmVhbSBpbnN0YW5jZS5cbiAgICogQHByb3BlcnR5IHtVSUV2ZW50fSBldmVudCAtID0gdW5kZWZpbmVkOyBUaGUgVUlFdmVudCwgaWYgYW55LlxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgQ2hhbm5lbFBheWxvYWQganNvbiBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWxOYW1lLCBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LCB0aW1lTGFiZWwpIHtcbiAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWVcbiAgICAvLyBwYXlsb2FkID0gQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShwYXlsb2FkKTtcblxuICAgIGlmICh0aW1lTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUudGltZSh0aW1lTGFiZWwpXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtT2JqID0geyBjaGFubmVsTmFtZSwgYWN0aW9uLCBzcmNFbGVtZW50LCBldmVudCB9XG4gICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoYW5uZWxQYXlsb2FkSXRlbU9iaiwgJ3BheWxvYWQnLCB7Z2V0OiAoKSA9PiBjbG9uZShwYXlsb2FkKX0pO1xuICAgIGNvbnN0IGZyb3plblBheWxvYWQgPSBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKHBheWxvYWQpXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQgPSBmcm96ZW5QYXlsb2FkXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhlbHBzIHdpdGggZGVzdHJ1Y3R1cmluZyBieSBtZXJnaW5nIGFsbCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnNcbiAgICAgKiBKU09OIE9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVsnPGg0PkRlc3RydWN0dXJpbmcgUHJvcGVydGllcyB1c2luZyB0aGUgQ2hhbm5lbFBheWxvYWQgcHJvcHMgTWV0aG9kPC9oND4nXVxuICAgICAqIGxldCB7ZWwsIGFjdGlvbiwgbXlWYWx9ID0gcGF5bG9hZC5wcm9wcygpO1xuICAgICAqXG4gICAgICpcbiAgICAgKi9cblxuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGF5bG9hZCwgJ3BheWxvYWQnKSkge1xuICAgICAgICBjb25zdCBwYXlsb2FkU3RyID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZm9sbG93aW5nIHBheWxvYWQgY29udGFpbnMgYSBuZXN0ZWQgcGF5bG9hZCBwcm9wZXJ0eSB3aGljaCBtYXkgY3JlYXRlIGNvbmZsaWN0czogQWN0aW9uOiAke2FjdGlvbn0sICR7cGF5bG9hZFN0cn1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsQWN0aW9uc0FyciA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsKVxuXG4gICAgICBDaGFubmVsUGF5bG9hZC52YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGNoYW5uZWwsIGNoYW5uZWxBY3Rpb25zQXJyKVxuICAgIH1cblxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5jbG9uZSA9ICgpID0+IG1lcmdlQWxsKFtcbiAgICAgIHsgcGF5bG9hZDpzYWZlQ2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQpIH0sXG4gICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCxcbiAgICAgIHsgY2hhbm5lbDogY2xvbmUoY2hhbm5lbCkgfSxcbiAgICAgIHsgZXZlbnQ6IGNsb25lKGV2ZW50KSB9LFxuICAgICAgeyBzcmNFbGVtZW50IH0sXG4gICAgICBjbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmouc3JjRWxlbWVudCksIHsgYWN0aW9uOiBjbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmouYWN0aW9uKSB9XG4gICAgXSlcblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzID0ge1xuICAgICAgJGRpcjoge1xuICAgICAgICBnZXQ6ICgpID0+IGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyLFxuICAgICAgICBzZXQ6ICh2YWwpID0+IHtcbiAgICAgICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpciA9IHZhbFxuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFubmVsID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgIC8vIGNoYW5uZWxQYXlsb2FkSXRlbU9ialsnbG9jYXRpb24nXSA9IENoYW5uZWxQYXlsb2FkLmdldExvY2F0aW9uRGF0YSgpO1xuICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMubG9jYXRpb24gPSB7XG4gICAgICAgIGdldDogKCkgPT4gQ2hhbm5lbFBheWxvYWQuZ2V0TG9jYXRpb25EYXRhKClcbiAgICAgIH1cbiAgICAgIC8qIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzWydyb3V0ZURhdGEnXSA9IHtcbiAgICAgICAgZ2V0OiAoKT0+cHJvcCgncm91dGVEYXRhJywgZnJvemVuUGF5bG9hZClcbiAgICAgIH1cbiovXG4gICAgfVxuXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIgPSB1bmRlZmluZWRcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNoYW5uZWxQYXlsb2FkSXRlbU9iaiwgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMpXG5cbiAgICBpZiAodGltZUxhYmVsKSB7XG4gICAgICBjb25zb2xlLnRpbWVFbmQodGltZUxhYmVsKVxuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbFBheWxvYWRJdGVtT2JqXG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVBY3Rpb24oYWN0aW9uLCBjaGFubmVsLCBhcnIpIHtcbiAgICBjb25zdCBpc0luQXJyID0gaW5jbHVkZXMoYWN0aW9uLCBhcnIpXG4gICAgaWYgKGlzSW5BcnIgPT09IGZhbHNlICYmIFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGB3YXJuaW5nOiBBY3Rpb246ICcke2FjdGlvbn0nIGlzIG5vdCByZWdpc3RlcmVkIHdpdGhpbiB0aGUgJHtjaGFubmVsfSBjaGFubmVsIWApXG4gICAgfVxuICAgIHJldHVybiBpc0luQXJyXG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG5cbiAgc3RhdGljIGdldFN0cmVhbUl0ZW0oKSB7XG5cbiAgfVxuXG4gIHN0YXRpYyBkZWVwQ2xvbmUobykge1xuICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXkpXG4gICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gICAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgICBjb25zdCBpc0l0ZXJhYmxlID0gaXNJdGVyKG8pXG4gICAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbiAgfVxuXG4gIHN0YXRpYyBkZWVwRnJlZXplKG8pIHtcbiAgICAvLyByZXR1cm4gbztcbiAgICAvLyByZXR1cm4gT2JqZWN0LmZyZWV6ZShvKTtcbiAgICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuXG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5mcmVlemUobylcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHByb3ApICYmXG4gICAgICAgICAgICBlbElzRG9tRWxlbWVudChvW3Byb3BdKSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgIG9bcHJvcF0gIT09IG51bGwgJiZcbiAgICAgICAgICAgICh0eXBlb2Ygb1twcm9wXSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9bcHJvcF0gPT09ICdmdW5jdGlvbicpICYmXG4gICAgICAgICAgICAhT2JqZWN0LmlzRnJvemVuKG9bcHJvcF0pKSB7XG4gICAgICAgICAgQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShvW3Byb3BdKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiRlJFRVpFIEVSUiBcIix7byxlfSk7XG4gICAgICByZXR1cm4gb1xuICAgIH1cblxuICAgIHJldHVybiBvXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VFdmVudEtleXMoKSB7XG4gICAgcmV0dXJuIFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsQnViYmxlJywgJ2NhbmNlbGFibGUnLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ2NvbXBvc2VkJywgJ2N0cmxLZXknLCAnY3VycmVudFRhcmdldCcsICdkZWZhdWx0UHJldmVudGVkJywgJ2RldGFpbCcsICdldmVudFBoYXNlJywgJ2Zyb21FbGVtZW50JywgJ2lzVHJ1c3RlZCcsICdsYXllclgnLCAnbGF5ZXJZJywgJ21ldGFLZXknLCAnbW92ZW1lbnRYJywgJ21vdmVtZW50WScsICdvZmZzZXRYJywgJ29mZnNldFknLCAncGFnZVgnLCAncGFnZVknLCAncGF0aCcsICdyZWxhdGVkVGFyZ2V0JywgJ3JldHVyblZhbHVlJywgJ3NjcmVlblgnLCAnc2NyZWVuWScsICdzaGlmdEtleScsICdzb3VyY2VDYXBhYmlsaXRpZXMnLCAnc3JjRWxlbWVudCcsICd0YXJnZXQnLCAndGltZVN0YW1wJywgJ3RvRWxlbWVudCcsICd0eXBlJywgJ3ZpZXcnLCAnd2hpY2gnLCAneCcsICd5J11cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2VDb3JlTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZXByb3BzTWFwOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKVxuICAgICAgY29uc3Qgb2JqS2V5ID0geyB2c2lkOiB0aGlzLnByb3BzLnZzaWQgfVxuICAgICAgd20uc2V0KG9iaktleSwgdGhpcy5wcm9wcylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogb2JqS2V5LFxuICAgICAgICB3ZWFrTWFwOiB3bVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2M6IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbV1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzXG4gICAgfSxcbiAgICBjcmVhdGVJZDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBsZXQgbnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgxMDAwMDAwMCkgKiAxMDAwMDAwMCk7XG4gICAgICAvLyBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCk7O1xuICAgICAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gICAgICByZXR1cm4gbnVtKClcbiAgICAgIC8vIHJldHVybiBgdnNpZC0ke251bSgpfWA7XG4gICAgfSxcbiAgICBzZXRUcmFjZUZ1bmM6IGZ1bmN0aW9uKGRlYnVnKSB7XG4gICAgICByZXR1cm4gZGVidWcgPT09IHRydWVcbiAgICAgICAgPyBjb25zb2xlLmxvZ1xuICAgICAgICA6ICgpID0+IHtcbiAgICAgICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBkZWZhdWx0VG8sIG1hdGNoLCBmb3JFYWNoLCB0ZXN0LCBpbmNsdWRlcywgd2l0aG91dCwgY29tcGxlbWVudCwgaXNFbXB0eSwgdmFsdWVzLCBpc05pbCwgZmlsdGVyLCBfXywga2V5cywgY29tcG9zZSwgaGVhZCwgbWFwLCBjb25kLCBULCBhbGxQYXNzLCBjb25jYXQsIHVuaXEgfSBmcm9tICdyYW1kYSdcbmNvbnN0IGlzSU9TID0gKCkgPT4ge1xuICBjb25zdCB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpXG4gIC8vIGxldCBzYWZhcmkgPSAvc2FmYXJpLy50ZXN0KHVzZXJBZ2VudCk7XG4gIGNvbnN0IGlvcyA9IC9pcGhvbmV8aXBvZHxpcGFkLy50ZXN0KHVzZXJBZ2VudClcbiAgcmV0dXJuIGlvcyA9PT0gdHJ1ZVxufVxuXG5jb25zdCBkZWxheUNhbGwgPSBhc3luYyhmbiwgdGltZSkgPT4ge1xuICBmdW5jdGlvbiBzbGVlcChtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuICB9XG5cbiAgY29uc3QgdGltZW91dEhhbmRsZXIgPSBhc3luYygpID0+IHtcbiAgICBhd2FpdCBzbGVlcCgxKVxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pXG4gIH1cblxuICB3aW5kb3cuc2V0VGltZW91dCh0aW1lb3V0SGFuZGxlciwgdGltZSlcbn1cblxuY29uc3QgZ2V0Q29uc3RydWN0b3JOYW1lID0gKG9iaikgPT4ge1xuICBpZiAob2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvYmouY29uc3RydWN0b3IubmFtZVxuICB9XG4gIGNvbnN0IHJlID0gL14oZnVuY3Rpb25cXHMpKFxcdyspKFxcKC4qKSQvXG4gIGNvbnN0IHN0ciA9IG9iai50b1N0cmluZygpXG4gIHJldHVybiBkZWZhdWx0VG8oU3RyaW5nKHN0cikuc3Vic3RyKDAsIDEyKSwgbWF0Y2gocmUsIHN0cilbMl0pXG59XG5cbmNvbnN0IGFyckZyb21NYXBLZXlzID0gKG1hcCkgPT4ge1xuICBjb25zdCBhcnIgPSBbXVxuICBjb25zdCBhZGRLZXlzVG9BcnIgPSAodiwgaywgaSkgPT4gYXJyLnB1c2goaylcbiAgZm9yRWFjaChhZGRLZXlzVG9BcnIsIG1hcClcbiAgcmV0dXJuIGFyclxufVxuXG5jb25zdCBmaW5kU3RyRnJvbVJlZ2V4QXJyID0gKG9iaiwgc3RyKSA9PiB7XG4gIGlmIChvYmpbc3RyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG4gIGNvbnN0IGNoZWNrSWZNYXRjaCA9IHMgPT4gdGVzdChuZXcgUmVnRXhwKHMpLCBzdHIpXG4gIGNvbnN0IGNoZWNrU3RyTWF0Y2ggPSBpbmNsdWRlcyhzdHIpXG4gIGNvbnN0IGNoZWNrSWZSZWdFeE1hdGNoID0gY29tcG9zZShpbmNsdWRlcyh0cnVlKSwgbWFwKGNoZWNrSWZNYXRjaCkpXG4gIGNvbnN0IHJ1bk1hdGNoQ2hlY2tzID0gY29uZChbXG4gICAgW2NoZWNrU3RyTWF0Y2gsICgpID0+IHN0cl0sXG4gICAgW2NoZWNrSWZSZWdFeE1hdGNoLCAoKSA9PiBzdHJdLFxuICAgIFtULCAoKSA9PiB1bmRlZmluZWRdXG4gIF0pXG4gIHJldHVybiBydW5NYXRjaENoZWNrcyhvYmopXG59XG5cbmNvbnN0IGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIgPSAob2JqLCBzdHIpID0+IHtcbiAgaWYgKG9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgY29uc3QgY3JlYXRlUmUgPSBzID0+IG5ldyBSZWdFeHAocylcbiAgY29uc3QgY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyA9IGNvbXBvc2UoaGVhZCwgZmlsdGVyKGNvbXBvc2UodGVzdChfXywgc3RyKSwgY3JlYXRlUmUpKSlcbiAgcmV0dXJuIGNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMoa2V5cyhvYmopKVxufVxuXG5jb25zdCBjbG9zZXN0ID0gKGFycmF5LCBudW0pID0+IHtcbiAgbGV0IGkgPSAwXG4gIGxldCBtaW5EaWZmID0gMTAwMFxuICBsZXQgYW5zXG4gIGZvciAoaSBpbiBhcnJheSkge1xuICAgIGNvbnN0IG0gPSBNYXRoLmFicyhudW0gLSBhcnJheVtpXSlcbiAgICBpZiAobSA8IG1pbkRpZmYpIHtcbiAgICAgIG1pbkRpZmYgPSBtXG4gICAgICBhbnMgPSBhcnJheVtpXVxuICAgIH1cbiAgfVxuICByZXR1cm4gYW5zXG59XG5cbmNvbnN0IGNvbnZlcnREb21TdHJpbmdNYXBUb09iaiA9IChkb21NYXApID0+IHtcbiAgY29uc3Qgb2JqID0ge31cbiAgZm9yIChjb25zdCBkIGluIGRvbU1hcCkge1xuICAgIG9ialtkXSA9IGRvbU1hcFtkXVxuICB9XG4gIHJldHVybiBvYmpcbn1cblxuLy8gY29uc3QgcGFzc1BhZ2VEYXRhID0gcGljayhbJ3BhcmFtcycsICdyb3V0ZUlkJywgJ2RhdGEnXSwgX18pO1xuXG5jb25zdCBzdWJzY3JpYmVGbiA9IHtcbiAgbmV4dDogICAgIHggPT4gY29uc29sZS5sb2coYG5leHQgICAgICAke3h9YCksXG4gIGVycm9yOiAgICB4ID0+IGNvbnNvbGUubG9nKGBlcnJvciAgICAgJHt4fWApLFxuICBjb21wbGV0ZTogeCA9PiBjb25zb2xlLmxvZyhgY29tcGxldGUgICR7eH1gKVxufVxuXG5jb25zdCByaWdodCA9IHggPT4gKHtcbiAgbWFwOiBmID0+IHJpZ2h0KGYoeCkpLFxuICBmb2xkOiAoZiwgZykgPT4gZyh4KSxcbiAgaW5zcGVjdDogKCkgPT4gYHJpZ2h0KCR7eH0pYFxuXG59KVxuXG5jb25zdCBpZk5pbFRoZW5VcGRhdGUgPSAodmFsLCBuZXdWYWwpID0+IHtcbiAgY29uc3QgaXNOaWxCb29sID0gaXNOaWwodmFsKVxuICByZXR1cm4gaXNOaWxCb29sID8gbmV3VmFsIDogdmFsXG59XG5cbmNvbnN0IGxlZnQgPSB4ID0+ICh7XG4gIG1hcDogZiA9PiBsZWZ0KHgpLFxuICBmb2xkOiAoZiwgZykgPT4gZih4KSxcbiAgaW5zcGVjdDogKCkgPT4gYGxlZnQoJHt4fSlgXG59KVxuXG5jb25zdCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsID0gKG9iaikgPT4ge1xuICBjb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShjb21wbGVtZW50KGlzRW1wdHkpLCBoZWFkLCB2YWx1ZXMpXG4gIGNvbnN0IGlzTm90TmlsID0gY29tcG9zZShjb21wbGVtZW50KGlzTmlsKSwgaGVhZCwgdmFsdWVzKVxuICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdE5pbF0pXG4gIHJldHVybiBpc05vdE5pbEFuZElzTm90RW1wdHkob2JqKVxufVxuXG5jb25zdCBmcm9tTnVsbGFibGUgPSB4ID0+IHggIT09IG51bGwgPyByaWdodCh4KSA6IGxlZnQobnVsbClcblxuY29uc3QgZmluZEluT2JqID0gKG9iaiwgdmFsLCBlcnJvciA9IG51bGwpID0+IHtcbiAgY29uc3QgZm91bmQgPSBvYmpbdmFsXVxuICByZXR1cm4gZm91bmQgPyByaWdodChmb3VuZCkgOiBsZWZ0KGVycm9yKVxufVxuY29uc3QgcHVsbFJvdXRlSW5mbyA9ICgpID0+IHtcbiAgY29uc3Qgc3RyID0gcHVsbEhhc2hBbmRTbGFzaEZyb21QYXRoKHdpbmRvdy5sb2NhdGlvbi5oYXNoKVxuICBjb25zdCByb3V0ZUlkID0gcHVsbE1haW5Sb3V0ZShzdHIpXG4gIGNvbnN0IHBhcmFtcyA9IHB1bGxQYXJhbXMoc3RyKVxuICByZXR1cm4geyByb3V0ZUlkLCBwYXJhbXMgfVxufVxuXG5mdW5jdGlvbiBnZXRBbGxNZXRob2ROYW1lcyhpbnN0YW5jZSwgb21pdHRlZE1ldGhvZHMgPSBbXSkge1xuICAvLyBPcHRpb25hbGx5IHJlbmFtZSBgaW5zdGFuY2VgIHRvIHNvbWV0aGluZyBtb3JlIGRlc2NyaXB0aXZlOlxuICBjb25zdCBiYXNlQ2xhc3NNZXRob2RzQXJyID0gWydsZW5ndGgnLCAnbmFtZScsICdwcm90b3R5cGUnLCAnY29uc3RydWN0b3InXVxuICBjb25zdCBjb21iaW5lZE9taXR0ZWRNZXRob2RzID0gY29uY2F0KGJhc2VDbGFzc01ldGhvZHNBcnIsIG9taXR0ZWRNZXRob2RzKVxuXG4gIC8vIEZpbHRlciBvdXQgb21pdHRlZFxuICBjb25zdCBvbWl0UHJvcHNGcm9tQXJyID0gY29tcG9zZSh3aXRob3V0KGNvbWJpbmVkT21pdHRlZE1ldGhvZHMpLCB1bmlxKVxuXG4gIC8vIFB1bGwgb3V0IGluc3RhbmNlIG1ldGhvZHNcbiAgY29uc3QgbWV0aG9kcyA9IG9taXRQcm9wc0Zyb21BcnIoXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5zdGFuY2UuY29uc3RydWN0b3IucHJvdG90eXBlKVxuICApXG5cbiAgLy8gUHVsbCBvdXQgc3RhdGljIG1ldGhvZHNcbiAgY29uc3Qgc3RhdGljTWV0aG9kcyA9IG9taXRQcm9wc0Zyb21BcnIoXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5zdGFuY2UuY29uc3RydWN0b3IpXG4gIClcblxuICBjb25zdCBhbGxNZXRob2RzID0gY29uY2F0KG1ldGhvZHMsIHN0YXRpY01ldGhvZHMpXG5cbiAgcmV0dXJuIHsgbWV0aG9kcywgc3RhdGljTWV0aG9kcywgYWxsTWV0aG9kcyB9XG59XG5cbi8qIGNvbnN0IGdldEFsbE1ldGhvZE5hbWVzMyA9IChfdGhpcyA9IHRoaXMsIG9taXR0ZWRNZXRob2RzID0gW10pID0+IHtcbiAgY29uc3QgZ2V0UHJvcE5hbWVzQXJyID0gKG9iaiA9IHRoaXMsIG9taXR0ZWRNZXRob2RzID0gW10pID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKVxuICB9XG4gIC8vIEZpbHRlciBNZXRob2RzXG4gIGNvbnN0IGJhc2VDbGFzc01ldGhvZHNBcnIgPSBbJ2xlbmd0aCcsICduYW1lJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG4gIG9taXR0ZWRNZXRob2RzID0gY29uY2F0KGJhc2VDbGFzc01ldGhvZHNBcnIsIG9taXR0ZWRNZXRob2RzKVxuICBjb25zdCBvbWl0UHJvcHNGcm9tQXJyID0gY29tcG9zZSh3aXRob3V0KG9taXR0ZWRNZXRob2RzKSwgdW5pcSlcblxuICAvLyBQVUxMIE9VVCBNRVRIT0QgTkFNRVNcbiAgY29uc3QgbWV0aG9kcyA9IG9taXRQcm9wc0Zyb21BcnIoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoX3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlKSlcbiAgY29uc3Qgc3RhdGljTWV0aG9kcyA9IG9taXRQcm9wc0Zyb21BcnIoZ2V0UHJvcE5hbWVzQXJyKF90aGlzLmNvbnN0cnVjdG9yKSlcbiAgY29uc3QgYWxsTWV0aG9kcyA9IGNvbmNhdChtZXRob2RzLCBzdGF0aWNNZXRob2RzKVxuXG4gIHJldHVybiB7IG1ldGhvZHMsIHN0YXRpY01ldGhvZHMsIGFsbE1ldGhvZHMgfVxuICAvLyByZXR1cm4gJ2ZuJztcbn0gKi9cblxuLy8gUk9VVEUgUkVHRVggRVhQUkVTU0lPTlNcbmNvbnN0IHJlbW92ZVNsYXNoZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL14oXFwvKSguKikvZywgJyQyJylcbmNvbnN0IHJvdXRlUkUgPSAvXihcXC8/KShcXHcqKShcXC8/KSguKikvZ1xuY29uc3QgcHVsbEhhc2hBbmRTbGFzaEZyb21QYXRoID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oI1xcLz8pKC4qKS8sICckMicpXG5jb25zdCBwdWxsU2xhc2hGcm9tUGF0aCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKC9eKFxcLz8pKC4qKS8sICckMicpXG5jb25zdCBwdWxsTWFpblJvdXRlID0gKHN0cikgPT4gc3RyLnJlcGxhY2Uocm91dGVSRSwgJyQyJylcbmNvbnN0IHB1bGxQYXJhbXMgPSAgICAoc3RyKSA9PiBzdHIucmVwbGFjZShyb3V0ZVJFLCAnJDQnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVggPSBzdHIgPT4gc3RyLnJlcGxhY2UoL14obWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCopKCwuKikvLCAnJDYnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVkgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL14obWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCkoLiopLywgJyQ3JylcbmNvbnN0IHB1bGxUcmFuc2xhdGVZRnJvbUhlYWRlciA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXih0cmFuc2Zvcm06IG1hdHJpeCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqKShcXCkuKjspLywgJyQ2JylcbmV4cG9ydCB7IGdldENvbnN0cnVjdG9yTmFtZSwgYXJyRnJvbU1hcEtleXMsIGdldEFsbE1ldGhvZE5hbWVzLCBmaW5kU3RyT3JSZWdleE1hdGNoU3RyLCBmaW5kU3RyRnJvbVJlZ2V4QXJyLCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsLCBpc0lPUywgcHVsbFJvdXRlSW5mbywgcHVsbFRyYW5zbGF0ZVlGcm9tSGVhZGVyLCBwdWxsU2xhc2hGcm9tUGF0aCwgcHVsbEhhc2hBbmRTbGFzaEZyb21QYXRoLCBjbG9zZXN0LCBwdWxsVHJhbnNsYXRlWSwgcHVsbFRyYW5zbGF0ZVgsIHB1bGxNYWluUm91dGUsIHB1bGxQYXJhbXMsIHJpZ2h0LCBsZWZ0LCBmcm9tTnVsbGFibGUsIGZpbmRJbk9iaiwgaWZOaWxUaGVuVXBkYXRlLCByZW1vdmVTbGFzaGVzLCBzdWJzY3JpYmVGbiwgY29udmVydERvbVN0cmluZ01hcFRvT2JqLCBkZWxheUNhbGwgfVxuIiwiLyohIEBsaWNlbnNlIERPTVB1cmlmeSAzLjIuMyB8IChjKSBDdXJlNTMgYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IFJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgbGljZW5zZSAyLjAgYW5kIE1vemlsbGEgUHVibGljIExpY2Vuc2UgMi4wIHwgZ2l0aHViLmNvbS9jdXJlNTMvRE9NUHVyaWZ5L2Jsb2IvMy4yLjMvTElDRU5TRSAqL1xuXG5jb25zdCB7XG4gIGVudHJpZXMsXG4gIHNldFByb3RvdHlwZU9mLFxuICBpc0Zyb3plbixcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvclxufSA9IE9iamVjdDtcbmxldCB7XG4gIGZyZWV6ZSxcbiAgc2VhbCxcbiAgY3JlYXRlXG59ID0gT2JqZWN0OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby1tdXRhYmxlLWV4cG9ydHNcbmxldCB7XG4gIGFwcGx5LFxuICBjb25zdHJ1Y3Rcbn0gPSB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgUmVmbGVjdDtcbmlmICghZnJlZXplKSB7XG4gIGZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZSh4KSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG5pZiAoIXNlYWwpIHtcbiAgc2VhbCA9IGZ1bmN0aW9uIHNlYWwoeCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuaWYgKCFhcHBseSkge1xuICBhcHBseSA9IGZ1bmN0aW9uIGFwcGx5KGZ1biwgdGhpc1ZhbHVlLCBhcmdzKSB7XG4gICAgcmV0dXJuIGZ1bi5hcHBseSh0aGlzVmFsdWUsIGFyZ3MpO1xuICB9O1xufVxuaWYgKCFjb25zdHJ1Y3QpIHtcbiAgY29uc3RydWN0ID0gZnVuY3Rpb24gY29uc3RydWN0KEZ1bmMsIGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmMoLi4uYXJncyk7XG4gIH07XG59XG5jb25zdCBhcnJheUZvckVhY2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKTtcbmNvbnN0IGFycmF5UG9wID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUucG9wKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3Qgc3RyaW5nVG9Mb3dlckNhc2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UpO1xuY29uc3Qgc3RyaW5nVG9TdHJpbmcgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcpO1xuY29uc3Qgc3RyaW5nTWF0Y2ggPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpO1xuY29uc3Qgc3RyaW5nUmVwbGFjZSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbmNvbnN0IHN0cmluZ0luZGV4T2YgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZik7XG5jb25zdCBzdHJpbmdUcmltID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRyaW0pO1xuY29uc3Qgb2JqZWN0SGFzT3duUHJvcGVydHkgPSB1bmFwcGx5KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuY29uc3QgcmVnRXhwVGVzdCA9IHVuYXBwbHkoUmVnRXhwLnByb3RvdHlwZS50ZXN0KTtcbmNvbnN0IHR5cGVFcnJvckNyZWF0ZSA9IHVuY29uc3RydWN0KFR5cGVFcnJvcik7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBhIHNwZWNpZmllZCB0aGlzQXJnIGFuZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGZ1bmMgLSBUaGUgZnVuY3Rpb24gdG8gYmUgd3JhcHBlZCBhbmQgY2FsbGVkLlxuICogQHJldHVybnMgQSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBhIHNwZWNpZmllZCB0aGlzQXJnIGFuZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHVuYXBwbHkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZ1bmN0aW9uIHRoYXQgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBmdW5jIC0gVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGJlIHdyYXBwZWQgYW5kIGNhbGxlZC5cbiAqIEByZXR1cm5zIEEgbmV3IGZ1bmN0aW9uIHRoYXQgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICovXG5mdW5jdGlvbiB1bmNvbnN0cnVjdChmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIHJldHVybiBjb25zdHJ1Y3QoZnVuYywgYXJncyk7XG4gIH07XG59XG4vKipcbiAqIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbG9va3VwIHRhYmxlXG4gKlxuICogQHBhcmFtIHNldCAtIFRoZSBzZXQgdG8gd2hpY2ggZWxlbWVudHMgd2lsbCBiZSBhZGRlZC5cbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZSBzZXQuXG4gKiBAcGFyYW0gdHJhbnNmb3JtQ2FzZUZ1bmMgLSBBbiBvcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGNhc2Ugb2YgZWFjaCBlbGVtZW50IGJlZm9yZSBhZGRpbmcgdG8gdGhlIHNldC5cbiAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCBzZXQgd2l0aCBhZGRlZCBlbGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gYWRkVG9TZXQoc2V0LCBhcnJheSkge1xuICBsZXQgdHJhbnNmb3JtQ2FzZUZ1bmMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHN0cmluZ1RvTG93ZXJDYXNlO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAvLyBNYWtlICdpbicgYW5kIHRydXRoeSBjaGVja3MgbGlrZSBCb29sZWFuKHNldC5jb25zdHJ1Y3RvcilcbiAgICAvLyBpbmRlcGVuZGVudCBvZiBhbnkgcHJvcGVydGllcyBkZWZpbmVkIG9uIE9iamVjdC5wcm90b3R5cGUuXG4gICAgLy8gUHJldmVudCBwcm90b3R5cGUgc2V0dGVycyBmcm9tIGludGVyY2VwdGluZyBzZXQgYXMgYSB0aGlzIHZhbHVlLlxuICAgIHNldFByb3RvdHlwZU9mKHNldCwgbnVsbCk7XG4gIH1cbiAgbGV0IGwgPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsLS0pIHtcbiAgICBsZXQgZWxlbWVudCA9IGFycmF5W2xdO1xuICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGxjRWxlbWVudCA9IHRyYW5zZm9ybUNhc2VGdW5jKGVsZW1lbnQpO1xuICAgICAgaWYgKGxjRWxlbWVudCAhPT0gZWxlbWVudCkge1xuICAgICAgICAvLyBDb25maWcgcHJlc2V0cyAoZS5nLiB0YWdzLmpzLCBhdHRycy5qcykgYXJlIGltbXV0YWJsZS5cbiAgICAgICAgaWYgKCFpc0Zyb3plbihhcnJheSkpIHtcbiAgICAgICAgICBhcnJheVtsXSA9IGxjRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gbGNFbGVtZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRbZWxlbWVudF0gPSB0cnVlO1xuICB9XG4gIHJldHVybiBzZXQ7XG59XG4vKipcbiAqIENsZWFuIHVwIGFuIGFycmF5IHRvIGhhcmRlbiBhZ2FpbnN0IENTUFBcbiAqXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gYmUgY2xlYW5lZC5cbiAqIEByZXR1cm5zIFRoZSBjbGVhbmVkIHZlcnNpb24gb2YgdGhlIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGNsZWFuQXJyYXkoYXJyYXkpIHtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGlzUHJvcGVydHlFeGlzdCA9IG9iamVjdEhhc093blByb3BlcnR5KGFycmF5LCBpbmRleCk7XG4gICAgaWYgKCFpc1Byb3BlcnR5RXhpc3QpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcnJheTtcbn1cbi8qKlxuICogU2hhbGxvdyBjbG9uZSBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBiZSBjbG9uZWQuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3QgdGhhdCBjb3BpZXMgdGhlIG9yaWdpbmFsLlxuICovXG5mdW5jdGlvbiBjbG9uZShvYmplY3QpIHtcbiAgY29uc3QgbmV3T2JqZWN0ID0gY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgdmFsdWVdIG9mIGVudHJpZXMob2JqZWN0KSkge1xuICAgIGNvbnN0IGlzUHJvcGVydHlFeGlzdCA9IG9iamVjdEhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpO1xuICAgIGlmIChpc1Byb3BlcnR5RXhpc3QpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gY2xlYW5BcnJheSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gY2xvbmUodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T2JqZWN0W3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3T2JqZWN0O1xufVxuLyoqXG4gKiBUaGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5IGNoZWNrcyBpZiB0aGUgcHJvcCBpcyBmdW5jdGlvbiBvciBnZXR0ZXIgYW5kIGJlaGF2ZXMgYWNjb3JkaW5nbHkuXG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gbG9vayB1cCB0aGUgZ2V0dGVyIGZ1bmN0aW9uIGluIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gKiBAcGFyYW0gcHJvcCAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB0byBmaW5kIHRoZSBnZXR0ZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgZ2V0dGVyIGZ1bmN0aW9uIGZvdW5kIGluIHRoZSBwcm90b3R5cGUgY2hhaW4gb3IgYSBmYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbG9va3VwR2V0dGVyKG9iamVjdCwgcHJvcCkge1xuICB3aGlsZSAob2JqZWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3ApO1xuICAgIGlmIChkZXNjKSB7XG4gICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy5nZXQpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkZXNjLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB1bmFwcGx5KGRlc2MudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICB9XG4gIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrVmFsdWU7XG59XG5cbmNvbnN0IGh0bWwkMSA9IGZyZWV6ZShbJ2EnLCAnYWJicicsICdhY3JvbnltJywgJ2FkZHJlc3MnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2F1ZGlvJywgJ2InLCAnYmRpJywgJ2JkbycsICdiaWcnLCAnYmxpbmsnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYW52YXMnLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY2l0ZScsICdjb2RlJywgJ2NvbCcsICdjb2xncm91cCcsICdjb250ZW50JywgJ2RhdGEnLCAnZGF0YWxpc3QnLCAnZGQnLCAnZGVjb3JhdG9yJywgJ2RlbCcsICdkZXRhaWxzJywgJ2RmbicsICdkaWFsb2cnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbGVtZW50JywgJ2VtJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2ZvbnQnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaScsICdpbWcnLCAnaW5wdXQnLCAnaW5zJywgJ2tiZCcsICdsYWJlbCcsICdsZWdlbmQnLCAnbGknLCAnbWFpbicsICdtYXAnLCAnbWFyaycsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0ZXInLCAnbmF2JywgJ25vYnInLCAnb2wnLCAnb3B0Z3JvdXAnLCAnb3B0aW9uJywgJ291dHB1dCcsICdwJywgJ3BpY3R1cmUnLCAncHJlJywgJ3Byb2dyZXNzJywgJ3EnLCAncnAnLCAncnQnLCAncnVieScsICdzJywgJ3NhbXAnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc2hhZG93JywgJ3NtYWxsJywgJ3NvdXJjZScsICdzcGFjZXInLCAnc3BhbicsICdzdHJpa2UnLCAnc3Ryb25nJywgJ3N0eWxlJywgJ3N1YicsICdzdW1tYXJ5JywgJ3N1cCcsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aW1lJywgJ3RyJywgJ3RyYWNrJywgJ3R0JywgJ3UnLCAndWwnLCAndmFyJywgJ3ZpZGVvJywgJ3diciddKTtcbmNvbnN0IHN2ZyQxID0gZnJlZXplKFsnc3ZnJywgJ2EnLCAnYWx0Z2x5cGgnLCAnYWx0Z2x5cGhkZWYnLCAnYWx0Z2x5cGhpdGVtJywgJ2FuaW1hdGVjb2xvcicsICdhbmltYXRlbW90aW9uJywgJ2FuaW1hdGV0cmFuc2Zvcm0nLCAnY2lyY2xlJywgJ2NsaXBwYXRoJywgJ2RlZnMnLCAnZGVzYycsICdlbGxpcHNlJywgJ2ZpbHRlcicsICdmb250JywgJ2cnLCAnZ2x5cGgnLCAnZ2x5cGhyZWYnLCAnaGtlcm4nLCAnaW1hZ2UnLCAnbGluZScsICdsaW5lYXJncmFkaWVudCcsICdtYXJrZXInLCAnbWFzaycsICdtZXRhZGF0YScsICdtcGF0aCcsICdwYXRoJywgJ3BhdHRlcm4nLCAncG9seWdvbicsICdwb2x5bGluZScsICdyYWRpYWxncmFkaWVudCcsICdyZWN0JywgJ3N0b3AnLCAnc3R5bGUnLCAnc3dpdGNoJywgJ3N5bWJvbCcsICd0ZXh0JywgJ3RleHRwYXRoJywgJ3RpdGxlJywgJ3RyZWYnLCAndHNwYW4nLCAndmlldycsICd2a2VybiddKTtcbmNvbnN0IHN2Z0ZpbHRlcnMgPSBmcmVlemUoWydmZUJsZW5kJywgJ2ZlQ29sb3JNYXRyaXgnLCAnZmVDb21wb25lbnRUcmFuc2ZlcicsICdmZUNvbXBvc2l0ZScsICdmZUNvbnZvbHZlTWF0cml4JywgJ2ZlRGlmZnVzZUxpZ2h0aW5nJywgJ2ZlRGlzcGxhY2VtZW50TWFwJywgJ2ZlRGlzdGFudExpZ2h0JywgJ2ZlRHJvcFNoYWRvdycsICdmZUZsb29kJywgJ2ZlRnVuY0EnLCAnZmVGdW5jQicsICdmZUZ1bmNHJywgJ2ZlRnVuY1InLCAnZmVHYXVzc2lhbkJsdXInLCAnZmVJbWFnZScsICdmZU1lcmdlJywgJ2ZlTWVyZ2VOb2RlJywgJ2ZlTW9ycGhvbG9neScsICdmZU9mZnNldCcsICdmZVBvaW50TGlnaHQnLCAnZmVTcGVjdWxhckxpZ2h0aW5nJywgJ2ZlU3BvdExpZ2h0JywgJ2ZlVGlsZScsICdmZVR1cmJ1bGVuY2UnXSk7XG4vLyBMaXN0IG9mIFNWRyBlbGVtZW50cyB0aGF0IGFyZSBkaXNhbGxvd2VkIGJ5IGRlZmF1bHQuXG4vLyBXZSBzdGlsbCBuZWVkIHRvIGtub3cgdGhlbSBzbyB0aGF0IHdlIGNhbiBkbyBuYW1lc3BhY2Vcbi8vIGNoZWNrcyBwcm9wZXJseSBpbiBjYXNlIG9uZSB3YW50cyB0byBhZGQgdGhlbSB0b1xuLy8gYWxsb3ctbGlzdC5cbmNvbnN0IHN2Z0Rpc2FsbG93ZWQgPSBmcmVlemUoWydhbmltYXRlJywgJ2NvbG9yLXByb2ZpbGUnLCAnY3Vyc29yJywgJ2Rpc2NhcmQnLCAnZm9udC1mYWNlJywgJ2ZvbnQtZmFjZS1mb3JtYXQnLCAnZm9udC1mYWNlLW5hbWUnLCAnZm9udC1mYWNlLXNyYycsICdmb250LWZhY2UtdXJpJywgJ2ZvcmVpZ25vYmplY3QnLCAnaGF0Y2gnLCAnaGF0Y2hwYXRoJywgJ21lc2gnLCAnbWVzaGdyYWRpZW50JywgJ21lc2hwYXRjaCcsICdtZXNocm93JywgJ21pc3NpbmctZ2x5cGgnLCAnc2NyaXB0JywgJ3NldCcsICdzb2xpZGNvbG9yJywgJ3Vua25vd24nLCAndXNlJ10pO1xuY29uc3QgbWF0aE1sJDEgPSBmcmVlemUoWydtYXRoJywgJ21lbmNsb3NlJywgJ21lcnJvcicsICdtZmVuY2VkJywgJ21mcmFjJywgJ21nbHlwaCcsICdtaScsICdtbGFiZWxlZHRyJywgJ21tdWx0aXNjcmlwdHMnLCAnbW4nLCAnbW8nLCAnbW92ZXInLCAnbXBhZGRlZCcsICdtcGhhbnRvbScsICdtcm9vdCcsICdtcm93JywgJ21zJywgJ21zcGFjZScsICdtc3FydCcsICdtc3R5bGUnLCAnbXN1YicsICdtc3VwJywgJ21zdWJzdXAnLCAnbXRhYmxlJywgJ210ZCcsICdtdGV4dCcsICdtdHInLCAnbXVuZGVyJywgJ211bmRlcm92ZXInLCAnbXByZXNjcmlwdHMnXSk7XG4vLyBTaW1pbGFybHkgdG8gU1ZHLCB3ZSB3YW50IHRvIGtub3cgYWxsIE1hdGhNTCBlbGVtZW50cyxcbi8vIGV2ZW4gdGhvc2UgdGhhdCB3ZSBkaXNhbGxvdyBieSBkZWZhdWx0LlxuY29uc3QgbWF0aE1sRGlzYWxsb3dlZCA9IGZyZWV6ZShbJ21hY3Rpb24nLCAnbWFsaWduZ3JvdXAnLCAnbWFsaWdubWFyaycsICdtbG9uZ2RpdicsICdtc2NhcnJpZXMnLCAnbXNjYXJyeScsICdtc2dyb3VwJywgJ21zdGFjaycsICdtc2xpbmUnLCAnbXNyb3cnLCAnc2VtYW50aWNzJywgJ2Fubm90YXRpb24nLCAnYW5ub3RhdGlvbi14bWwnLCAnbXByZXNjcmlwdHMnLCAnbm9uZSddKTtcbmNvbnN0IHRleHQgPSBmcmVlemUoWycjdGV4dCddKTtcblxuY29uc3QgaHRtbCA9IGZyZWV6ZShbJ2FjY2VwdCcsICdhY3Rpb24nLCAnYWxpZ24nLCAnYWx0JywgJ2F1dG9jYXBpdGFsaXplJywgJ2F1dG9jb21wbGV0ZScsICdhdXRvcGljdHVyZWlucGljdHVyZScsICdhdXRvcGxheScsICdiYWNrZ3JvdW5kJywgJ2JnY29sb3InLCAnYm9yZGVyJywgJ2NhcHR1cmUnLCAnY2VsbHBhZGRpbmcnLCAnY2VsbHNwYWNpbmcnLCAnY2hlY2tlZCcsICdjaXRlJywgJ2NsYXNzJywgJ2NsZWFyJywgJ2NvbG9yJywgJ2NvbHMnLCAnY29sc3BhbicsICdjb250cm9scycsICdjb250cm9sc2xpc3QnLCAnY29vcmRzJywgJ2Nyb3Nzb3JpZ2luJywgJ2RhdGV0aW1lJywgJ2RlY29kaW5nJywgJ2RlZmF1bHQnLCAnZGlyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJywgJ2Rpc2FibGVyZW1vdGVwbGF5YmFjaycsICdkb3dubG9hZCcsICdkcmFnZ2FibGUnLCAnZW5jdHlwZScsICdlbnRlcmtleWhpbnQnLCAnZmFjZScsICdmb3InLCAnaGVhZGVycycsICdoZWlnaHQnLCAnaGlkZGVuJywgJ2hpZ2gnLCAnaHJlZicsICdocmVmbGFuZycsICdpZCcsICdpbnB1dG1vZGUnLCAnaW50ZWdyaXR5JywgJ2lzbWFwJywgJ2tpbmQnLCAnbGFiZWwnLCAnbGFuZycsICdsaXN0JywgJ2xvYWRpbmcnLCAnbG9vcCcsICdsb3cnLCAnbWF4JywgJ21heGxlbmd0aCcsICdtZWRpYScsICdtZXRob2QnLCAnbWluJywgJ21pbmxlbmd0aCcsICdtdWx0aXBsZScsICdtdXRlZCcsICduYW1lJywgJ25vbmNlJywgJ25vc2hhZGUnLCAnbm92YWxpZGF0ZScsICdub3dyYXAnLCAnb3BlbicsICdvcHRpbXVtJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAncGxheXNpbmxpbmUnLCAncG9wb3ZlcicsICdwb3BvdmVydGFyZ2V0JywgJ3BvcG92ZXJ0YXJnZXRhY3Rpb24nLCAncG9zdGVyJywgJ3ByZWxvYWQnLCAncHViZGF0ZScsICdyYWRpb2dyb3VwJywgJ3JlYWRvbmx5JywgJ3JlbCcsICdyZXF1aXJlZCcsICdyZXYnLCAncmV2ZXJzZWQnLCAncm9sZScsICdyb3dzJywgJ3Jvd3NwYW4nLCAnc3BlbGxjaGVjaycsICdzY29wZScsICdzZWxlY3RlZCcsICdzaGFwZScsICdzaXplJywgJ3NpemVzJywgJ3NwYW4nLCAnc3JjbGFuZycsICdzdGFydCcsICdzcmMnLCAnc3Jjc2V0JywgJ3N0ZXAnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJpbmRleCcsICd0aXRsZScsICd0cmFuc2xhdGUnLCAndHlwZScsICd1c2VtYXAnLCAndmFsaWduJywgJ3ZhbHVlJywgJ3dpZHRoJywgJ3dyYXAnLCAneG1sbnMnLCAnc2xvdCddKTtcbmNvbnN0IHN2ZyA9IGZyZWV6ZShbJ2FjY2VudC1oZWlnaHQnLCAnYWNjdW11bGF0ZScsICdhZGRpdGl2ZScsICdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnYW1wbGl0dWRlJywgJ2FzY2VudCcsICdhdHRyaWJ1dGVuYW1lJywgJ2F0dHJpYnV0ZXR5cGUnLCAnYXppbXV0aCcsICdiYXNlZnJlcXVlbmN5JywgJ2Jhc2VsaW5lLXNoaWZ0JywgJ2JlZ2luJywgJ2JpYXMnLCAnYnknLCAnY2xhc3MnLCAnY2xpcCcsICdjbGlwcGF0aHVuaXRzJywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3InLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnY3gnLCAnY3knLCAnZCcsICdkeCcsICdkeScsICdkaWZmdXNlY29uc3RhbnQnLCAnZGlyZWN0aW9uJywgJ2Rpc3BsYXknLCAnZGl2aXNvcicsICdkdXInLCAnZWRnZW1vZGUnLCAnZWxldmF0aW9uJywgJ2VuZCcsICdleHBvbmVudCcsICdmaWxsJywgJ2ZpbGwtb3BhY2l0eScsICdmaWxsLXJ1bGUnLCAnZmlsdGVyJywgJ2ZpbHRlcnVuaXRzJywgJ2Zsb29kLWNvbG9yJywgJ2Zsb29kLW9wYWNpdHknLCAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ2ZvbnQtc2l6ZS1hZGp1c3QnLCAnZm9udC1zdHJldGNoJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2Z4JywgJ2Z5JywgJ2cxJywgJ2cyJywgJ2dseXBoLW5hbWUnLCAnZ2x5cGhyZWYnLCAnZ3JhZGllbnR1bml0cycsICdncmFkaWVudHRyYW5zZm9ybScsICdoZWlnaHQnLCAnaHJlZicsICdpZCcsICdpbWFnZS1yZW5kZXJpbmcnLCAnaW4nLCAnaW4yJywgJ2ludGVyY2VwdCcsICdrJywgJ2sxJywgJ2syJywgJ2szJywgJ2s0JywgJ2tlcm5pbmcnLCAna2V5cG9pbnRzJywgJ2tleXNwbGluZXMnLCAna2V5dGltZXMnLCAnbGFuZycsICdsZW5ndGhhZGp1c3QnLCAnbGV0dGVyLXNwYWNpbmcnLCAna2VybmVsbWF0cml4JywgJ2tlcm5lbHVuaXRsZW5ndGgnLCAnbGlnaHRpbmctY29sb3InLCAnbG9jYWwnLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdtYXJrZXJoZWlnaHQnLCAnbWFya2VydW5pdHMnLCAnbWFya2Vyd2lkdGgnLCAnbWFza2NvbnRlbnR1bml0cycsICdtYXNrdW5pdHMnLCAnbWF4JywgJ21hc2snLCAnbWVkaWEnLCAnbWV0aG9kJywgJ21vZGUnLCAnbWluJywgJ25hbWUnLCAnbnVtb2N0YXZlcycsICdvZmZzZXQnLCAnb3BlcmF0b3InLCAnb3BhY2l0eScsICdvcmRlcicsICdvcmllbnQnLCAnb3JpZW50YXRpb24nLCAnb3JpZ2luJywgJ292ZXJmbG93JywgJ3BhaW50LW9yZGVyJywgJ3BhdGgnLCAncGF0aGxlbmd0aCcsICdwYXR0ZXJuY29udGVudHVuaXRzJywgJ3BhdHRlcm50cmFuc2Zvcm0nLCAncGF0dGVybnVuaXRzJywgJ3BvaW50cycsICdwcmVzZXJ2ZWFscGhhJywgJ3ByZXNlcnZlYXNwZWN0cmF0aW8nLCAncHJpbWl0aXZldW5pdHMnLCAncicsICdyeCcsICdyeScsICdyYWRpdXMnLCAncmVmeCcsICdyZWZ5JywgJ3JlcGVhdGNvdW50JywgJ3JlcGVhdGR1cicsICdyZXN0YXJ0JywgJ3Jlc3VsdCcsICdyb3RhdGUnLCAnc2NhbGUnLCAnc2VlZCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc2xvcGUnLCAnc3BlY3VsYXJjb25zdGFudCcsICdzcGVjdWxhcmV4cG9uZW50JywgJ3NwcmVhZG1ldGhvZCcsICdzdGFydG9mZnNldCcsICdzdGRkZXZpYXRpb24nLCAnc3RpdGNodGlsZXMnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlJywgJ3N0cm9rZS13aWR0aCcsICdzdHlsZScsICdzdXJmYWNlc2NhbGUnLCAnc3lzdGVtbGFuZ3VhZ2UnLCAndGFiaW5kZXgnLCAndGFibGV2YWx1ZXMnLCAndGFyZ2V0eCcsICd0YXJnZXR5JywgJ3RyYW5zZm9ybScsICd0cmFuc2Zvcm0tb3JpZ2luJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd0ZXh0bGVuZ3RoJywgJ3R5cGUnLCAndTEnLCAndTInLCAndW5pY29kZScsICd2YWx1ZXMnLCAndmlld2JveCcsICd2aXNpYmlsaXR5JywgJ3ZlcnNpb24nLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd2lkdGgnLCAnd29yZC1zcGFjaW5nJywgJ3dyYXAnLCAnd3JpdGluZy1tb2RlJywgJ3hjaGFubmVsc2VsZWN0b3InLCAneWNoYW5uZWxzZWxlY3RvcicsICd4JywgJ3gxJywgJ3gyJywgJ3htbG5zJywgJ3knLCAneTEnLCAneTInLCAneicsICd6b29tYW5kcGFuJ10pO1xuY29uc3QgbWF0aE1sID0gZnJlZXplKFsnYWNjZW50JywgJ2FjY2VudHVuZGVyJywgJ2FsaWduJywgJ2JldmVsbGVkJywgJ2Nsb3NlJywgJ2NvbHVtbnNhbGlnbicsICdjb2x1bW5saW5lcycsICdjb2x1bW5zcGFuJywgJ2Rlbm9tYWxpZ24nLCAnZGVwdGgnLCAnZGlyJywgJ2Rpc3BsYXknLCAnZGlzcGxheXN0eWxlJywgJ2VuY29kaW5nJywgJ2ZlbmNlJywgJ2ZyYW1lJywgJ2hlaWdodCcsICdocmVmJywgJ2lkJywgJ2xhcmdlb3AnLCAnbGVuZ3RoJywgJ2xpbmV0aGlja25lc3MnLCAnbHNwYWNlJywgJ2xxdW90ZScsICdtYXRoYmFja2dyb3VuZCcsICdtYXRoY29sb3InLCAnbWF0aHNpemUnLCAnbWF0aHZhcmlhbnQnLCAnbWF4c2l6ZScsICdtaW5zaXplJywgJ21vdmFibGVsaW1pdHMnLCAnbm90YXRpb24nLCAnbnVtYWxpZ24nLCAnb3BlbicsICdyb3dhbGlnbicsICdyb3dsaW5lcycsICdyb3dzcGFjaW5nJywgJ3Jvd3NwYW4nLCAncnNwYWNlJywgJ3JxdW90ZScsICdzY3JpcHRsZXZlbCcsICdzY3JpcHRtaW5zaXplJywgJ3NjcmlwdHNpemVtdWx0aXBsaWVyJywgJ3NlbGVjdGlvbicsICdzZXBhcmF0b3InLCAnc2VwYXJhdG9ycycsICdzdHJldGNoeScsICdzdWJzY3JpcHRzaGlmdCcsICdzdXBzY3JpcHRzaGlmdCcsICdzeW1tZXRyaWMnLCAndm9mZnNldCcsICd3aWR0aCcsICd4bWxucyddKTtcbmNvbnN0IHhtbCA9IGZyZWV6ZShbJ3hsaW5rOmhyZWYnLCAneG1sOmlkJywgJ3hsaW5rOnRpdGxlJywgJ3htbDpzcGFjZScsICd4bWxuczp4bGluayddKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG5jb25zdCBNVVNUQUNIRV9FWFBSID0gc2VhbCgvXFx7XFx7W1xcd1xcV10qfFtcXHdcXFddKlxcfVxcfS9nbSk7IC8vIFNwZWNpZnkgdGVtcGxhdGUgZGV0ZWN0aW9uIHJlZ2V4IGZvciBTQUZFX0ZPUl9URU1QTEFURVMgbW9kZVxuY29uc3QgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHdcXFddKnxbXFx3XFxXXSolPi9nbSk7XG5jb25zdCBUTVBMSVRfRVhQUiA9IHNlYWwoL1xcJFxce1tcXHdcXFddKn0vZ20pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG5jb25zdCBEQVRBX0FUVFIgPSBzZWFsKC9eZGF0YS1bXFwtXFx3LlxcdTAwQjctXFx1RkZGRl0rJC8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG5jb25zdCBBUklBX0FUVFIgPSBzZWFsKC9eYXJpYS1bXFwtXFx3XSskLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbmNvbnN0IElTX0FMTE9XRURfVVJJID0gc2VhbCgvXig/Oig/Oig/OmZ8aHQpdHBzP3xtYWlsdG98dGVsfGNhbGx0b3xzbXN8Y2lkfHhtcHApOnxbXmEtel18W2EteisuXFwtXSsoPzpbXmEteisuXFwtOl18JCkpL2kgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuKTtcbmNvbnN0IElTX1NDUklQVF9PUl9EQVRBID0gc2VhbCgvXig/OlxcdytzY3JpcHR8ZGF0YSk6L2kpO1xuY29uc3QgQVRUUl9XSElURVNQQUNFID0gc2VhbCgvW1xcdTAwMDAtXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MTgwRVxcdTIwMDAtXFx1MjAyOVxcdTIwNUZcXHUzMDAwXS9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuKTtcbmNvbnN0IERPQ1RZUEVfTkFNRSA9IHNlYWwoL15odG1sJC9pKTtcbmNvbnN0IENVU1RPTV9FTEVNRU5UID0gc2VhbCgvXlthLXpdWy5cXHddKigtWy5cXHddKykrJC9pKTtcblxudmFyIEVYUFJFU1NJT05TID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIEFSSUFfQVRUUjogQVJJQV9BVFRSLFxuICBBVFRSX1dISVRFU1BBQ0U6IEFUVFJfV0hJVEVTUEFDRSxcbiAgQ1VTVE9NX0VMRU1FTlQ6IENVU1RPTV9FTEVNRU5ULFxuICBEQVRBX0FUVFI6IERBVEFfQVRUUixcbiAgRE9DVFlQRV9OQU1FOiBET0NUWVBFX05BTUUsXG4gIEVSQl9FWFBSOiBFUkJfRVhQUixcbiAgSVNfQUxMT1dFRF9VUkk6IElTX0FMTE9XRURfVVJJLFxuICBJU19TQ1JJUFRfT1JfREFUQTogSVNfU0NSSVBUX09SX0RBVEEsXG4gIE1VU1RBQ0hFX0VYUFI6IE1VU1RBQ0hFX0VYUFIsXG4gIFRNUExJVF9FWFBSOiBUTVBMSVRfRVhQUlxufSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL25vZGVUeXBlXG5jb25zdCBOT0RFX1RZUEUgPSB7XG4gIGVsZW1lbnQ6IDEsXG4gIGF0dHJpYnV0ZTogMixcbiAgdGV4dDogMyxcbiAgY2RhdGFTZWN0aW9uOiA0LFxuICBlbnRpdHlSZWZlcmVuY2U6IDUsXG4gIC8vIERlcHJlY2F0ZWRcbiAgZW50aXR5Tm9kZTogNixcbiAgLy8gRGVwcmVjYXRlZFxuICBwcm9ncmVzc2luZ0luc3RydWN0aW9uOiA3LFxuICBjb21tZW50OiA4LFxuICBkb2N1bWVudDogOSxcbiAgZG9jdW1lbnRUeXBlOiAxMCxcbiAgZG9jdW1lbnRGcmFnbWVudDogMTEsXG4gIG5vdGF0aW9uOiAxMiAvLyBEZXByZWNhdGVkXG59O1xuY29uc3QgZ2V0R2xvYmFsID0gZnVuY3Rpb24gZ2V0R2xvYmFsKCkge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogd2luZG93O1xufTtcbi8qKlxuICogQ3JlYXRlcyBhIG5vLW9wIHBvbGljeSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gKiBEb24ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIVxuICogQHBhcmFtIHRydXN0ZWRUeXBlcyBUaGUgcG9saWN5IGZhY3RvcnkuXG4gKiBAcGFyYW0gcHVyaWZ5SG9zdEVsZW1lbnQgVGhlIFNjcmlwdCBlbGVtZW50IHVzZWQgdG8gbG9hZCBET01QdXJpZnkgKHRvIGRldGVybWluZSBwb2xpY3kgbmFtZSBzdWZmaXgpLlxuICogQHJldHVybiBUaGUgcG9saWN5IGNyZWF0ZWQgKG9yIG51bGwsIGlmIFRydXN0ZWQgVHlwZXNcbiAqIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGNyZWF0aW5nIHRoZSBwb2xpY3kgZmFpbGVkKS5cbiAqL1xuY29uc3QgX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSA9IGZ1bmN0aW9uIF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kodHJ1c3RlZFR5cGVzLCBwdXJpZnlIb3N0RWxlbWVudCkge1xuICBpZiAodHlwZW9mIHRydXN0ZWRUeXBlcyAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBBbGxvdyB0aGUgY2FsbGVycyB0byBjb250cm9sIHRoZSB1bmlxdWUgcG9saWN5IG5hbWVcbiAgLy8gYnkgYWRkaW5nIGEgZGF0YS10dC1wb2xpY3ktc3VmZml4IHRvIHRoZSBzY3JpcHQgZWxlbWVudCB3aXRoIHRoZSBET01QdXJpZnkuXG4gIC8vIFBvbGljeSBjcmVhdGlvbiB3aXRoIGR1cGxpY2F0ZSBuYW1lcyB0aHJvd3MgaW4gVHJ1c3RlZCBUeXBlcy5cbiAgbGV0IHN1ZmZpeCA9IG51bGw7XG4gIGNvbnN0IEFUVFJfTkFNRSA9ICdkYXRhLXR0LXBvbGljeS1zdWZmaXgnO1xuICBpZiAocHVyaWZ5SG9zdEVsZW1lbnQgJiYgcHVyaWZ5SG9zdEVsZW1lbnQuaGFzQXR0cmlidXRlKEFUVFJfTkFNRSkpIHtcbiAgICBzdWZmaXggPSBwdXJpZnlIb3N0RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTtcbiAgfVxuICBjb25zdCBwb2xpY3lOYW1lID0gJ2RvbXB1cmlmeScgKyAoc3VmZml4ID8gJyMnICsgc3VmZml4IDogJycpO1xuICB0cnkge1xuICAgIHJldHVybiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KHBvbGljeU5hbWUsIHtcbiAgICAgIGNyZWF0ZUhUTUwoaHRtbCkge1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgIH0sXG4gICAgICBjcmVhdGVTY3JpcHRVUkwoc2NyaXB0VXJsKSB7XG4gICAgICAgIHJldHVybiBzY3JpcHRVcmw7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvLyBQb2xpY3kgY3JlYXRpb24gZmFpbGVkIChtb3N0IGxpa2VseSBhbm90aGVyIERPTVB1cmlmeSBzY3JpcHQgaGFzXG4gICAgLy8gYWxyZWFkeSBydW4pLiBTa2lwIGNyZWF0aW5nIHRoZSBwb2xpY3ksIGFzIHRoaXMgd2lsbCBvbmx5IGNhdXNlIGVycm9yc1xuICAgIC8vIGlmIFRUIGFyZSBlbmZvcmNlZC5cbiAgICBjb25zb2xlLndhcm4oJ1RydXN0ZWRUeXBlcyBwb2xpY3kgJyArIHBvbGljeU5hbWUgKyAnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLicpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuY29uc3QgX2NyZWF0ZUhvb2tzTWFwID0gZnVuY3Rpb24gX2NyZWF0ZUhvb2tzTWFwKCkge1xuICByZXR1cm4ge1xuICAgIGFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzOiBbXSxcbiAgICBhZnRlclNhbml0aXplRWxlbWVudHM6IFtdLFxuICAgIGFmdGVyU2FuaXRpemVTaGFkb3dET006IFtdLFxuICAgIGJlZm9yZVNhbml0aXplQXR0cmlidXRlczogW10sXG4gICAgYmVmb3JlU2FuaXRpemVFbGVtZW50czogW10sXG4gICAgYmVmb3JlU2FuaXRpemVTaGFkb3dET006IFtdLFxuICAgIHVwb25TYW5pdGl6ZUF0dHJpYnV0ZTogW10sXG4gICAgdXBvblNhbml0aXplRWxlbWVudDogW10sXG4gICAgdXBvblNhbml0aXplU2hhZG93Tm9kZTogW11cbiAgfTtcbn07XG5mdW5jdGlvbiBjcmVhdGVET01QdXJpZnkoKSB7XG4gIGxldCB3aW5kb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGdldEdsb2JhbCgpO1xuICBjb25zdCBET01QdXJpZnkgPSByb290ID0+IGNyZWF0ZURPTVB1cmlmeShyb290KTtcbiAgRE9NUHVyaWZ5LnZlcnNpb24gPSAnMy4yLjMnO1xuICBET01QdXJpZnkucmVtb3ZlZCA9IFtdO1xuICBpZiAoIXdpbmRvdyB8fCAhd2luZG93LmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudC5ub2RlVHlwZSAhPT0gTk9ERV9UWVBFLmRvY3VtZW50KSB7XG4gICAgLy8gTm90IHJ1bm5pbmcgaW4gYSBicm93c2VyLCBwcm92aWRlIGEgZmFjdG9yeSBmdW5jdGlvblxuICAgIC8vIHNvIHRoYXQgeW91IGNhbiBwYXNzIHlvdXIgb3duIFdpbmRvd1xuICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiBET01QdXJpZnk7XG4gIH1cbiAgbGV0IHtcbiAgICBkb2N1bWVudFxuICB9ID0gd2luZG93O1xuICBjb25zdCBvcmlnaW5hbERvY3VtZW50ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IGN1cnJlbnRTY3JpcHQgPSBvcmlnaW5hbERvY3VtZW50LmN1cnJlbnRTY3JpcHQ7XG4gIGNvbnN0IHtcbiAgICBEb2N1bWVudEZyYWdtZW50LFxuICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQsXG4gICAgTm9kZSxcbiAgICBFbGVtZW50LFxuICAgIE5vZGVGaWx0ZXIsXG4gICAgTmFtZWROb2RlTWFwID0gd2luZG93Lk5hbWVkTm9kZU1hcCB8fCB3aW5kb3cuTW96TmFtZWRBdHRyTWFwLFxuICAgIEhUTUxGb3JtRWxlbWVudCxcbiAgICBET01QYXJzZXIsXG4gICAgdHJ1c3RlZFR5cGVzXG4gIH0gPSB3aW5kb3c7XG4gIGNvbnN0IEVsZW1lbnRQcm90b3R5cGUgPSBFbGVtZW50LnByb3RvdHlwZTtcbiAgY29uc3QgY2xvbmVOb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjbG9uZU5vZGUnKTtcbiAgY29uc3QgcmVtb3ZlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdyZW1vdmUnKTtcbiAgY29uc3QgZ2V0TmV4dFNpYmxpbmcgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ25leHRTaWJsaW5nJyk7XG4gIGNvbnN0IGdldENoaWxkTm9kZXMgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2NoaWxkTm9kZXMnKTtcbiAgY29uc3QgZ2V0UGFyZW50Tm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAncGFyZW50Tm9kZScpO1xuICAvLyBBcyBwZXIgaXNzdWUgIzQ3LCB0aGUgd2ViLWNvbXBvbmVudHMgcmVnaXN0cnkgaXMgaW5oZXJpdGVkIGJ5IGFcbiAgLy8gbmV3IGRvY3VtZW50IGNyZWF0ZWQgdmlhIGNyZWF0ZUhUTUxEb2N1bWVudC4gQXMgcGVyIHRoZSBzcGVjXG4gIC8vIChodHRwOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjcmVhdGluZy1hbmQtcGFzc2luZy1yZWdpc3RyaWVzKVxuICAvLyBhIG5ldyBlbXB0eSByZWdpc3RyeSBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0ZW1wbGF0ZSBjb250ZW50cyBvd25lclxuICAvLyBkb2N1bWVudCwgc28gd2UgdXNlIHRoYXQgYXMgb3VyIHBhcmVudCBkb2N1bWVudCB0byBlbnN1cmUgbm90aGluZ1xuICAvLyBpcyBpbmhlcml0ZWQuXG4gIGlmICh0eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICBpZiAodGVtcGxhdGUuY29udGVudCAmJiB0ZW1wbGF0ZS5jb250ZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIGRvY3VtZW50ID0gdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50O1xuICAgIH1cbiAgfVxuICBsZXQgdHJ1c3RlZFR5cGVzUG9saWN5O1xuICBsZXQgZW1wdHlIVE1MID0gJyc7XG4gIGNvbnN0IHtcbiAgICBpbXBsZW1lbnRhdGlvbixcbiAgICBjcmVhdGVOb2RlSXRlcmF0b3IsXG4gICAgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxcbiAgICBnZXRFbGVtZW50c0J5VGFnTmFtZVxuICB9ID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBpbXBvcnROb2RlXG4gIH0gPSBvcmlnaW5hbERvY3VtZW50O1xuICBsZXQgaG9va3MgPSBfY3JlYXRlSG9va3NNYXAoKTtcbiAgLyoqXG4gICAqIEV4cG9zZSB3aGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyBydW5uaW5nIHRoZSBmdWxsIERPTVB1cmlmeS5cbiAgICovXG4gIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IHR5cGVvZiBlbnRyaWVzID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBnZXRQYXJlbnROb2RlID09PSAnZnVuY3Rpb24nICYmIGltcGxlbWVudGF0aW9uICYmIGltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCB7XG4gICAgTVVTVEFDSEVfRVhQUixcbiAgICBFUkJfRVhQUixcbiAgICBUTVBMSVRfRVhQUixcbiAgICBEQVRBX0FUVFIsXG4gICAgQVJJQV9BVFRSLFxuICAgIElTX1NDUklQVF9PUl9EQVRBLFxuICAgIEFUVFJfV0hJVEVTUEFDRSxcbiAgICBDVVNUT01fRUxFTUVOVFxuICB9ID0gRVhQUkVTU0lPTlM7XG4gIGxldCB7XG4gICAgSVNfQUxMT1dFRF9VUkk6IElTX0FMTE9XRURfVVJJJDFcbiAgfSA9IEVYUFJFU1NJT05TO1xuICAvKipcbiAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICogZG9uJ3QgYWRkIGFueSBuZXcgb25lcyBidXQgZmVlbCBmcmVlIHRvIHJlbW92ZSB1bndhbnRlZCBvbmVzLlxuICAgKi9cbiAgLyogYWxsb3dlZCBlbGVtZW50IG5hbWVzICovXG4gIGxldCBBTExPV0VEX1RBR1MgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0FMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbLi4uaHRtbCQxLCAuLi5zdmckMSwgLi4uc3ZnRmlsdGVycywgLi4ubWF0aE1sJDEsIC4uLnRleHRdKTtcbiAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cbiAgbGV0IEFMTE9XRURfQVRUUiA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfQUxMT1dFRF9BVFRSID0gYWRkVG9TZXQoe30sIFsuLi5odG1sLCAuLi5zdmcsIC4uLm1hdGhNbCwgLi4ueG1sXSk7XG4gIC8qXG4gICAqIENvbmZpZ3VyZSBob3cgRE9NUHVyaWZ5IHNob3VsZCBoYW5kbGUgY3VzdG9tIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgY3VzdG9taXplZCBidWlsdC1pbiBlbGVtZW50cy5cbiAgICogQHByb3BlcnR5IHtSZWdFeHB8RnVuY3Rpb258bnVsbH0gdGFnTmFtZUNoZWNrIG9uZSBvZiBbbnVsbCwgcmVnZXhQYXR0ZXJuLCBwcmVkaWNhdGVdLiBEZWZhdWx0OiBgbnVsbGAgKGRpc2FsbG93IGFueSBjdXN0b20gZWxlbWVudHMpXG4gICAqIEBwcm9wZXJ0eSB7UmVnRXhwfEZ1bmN0aW9ufG51bGx9IGF0dHJpYnV0ZU5hbWVDaGVjayBvbmUgb2YgW251bGwsIHJlZ2V4UGF0dGVybiwgcHJlZGljYXRlXS4gRGVmYXVsdDogYG51bGxgIChkaXNhbGxvdyBhbnkgYXR0cmlidXRlcyBub3Qgb24gdGhlIGFsbG93IGxpc3QpXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzIGFsbG93IGN1c3RvbSBlbGVtZW50cyBkZXJpdmVkIGZyb20gYnVpbHQtaW5zIGlmIHRoZXkgcGFzcyBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2suIERlZmF1bHQ6IGBmYWxzZWAuXG4gICAqL1xuICBsZXQgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgPSBPYmplY3Quc2VhbChjcmVhdGUobnVsbCwge1xuICAgIHRhZ05hbWVDaGVjazoge1xuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfSxcbiAgICBhdHRyaWJ1dGVOYW1lQ2hlY2s6IHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogbnVsbFxuICAgIH0sXG4gICAgYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzOiB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfVxuICB9KSk7XG4gIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIHRhZ3MgKG92ZXJyaWRlcyBBTExPV0VEX1RBR1MvQUREX1RBR1MpICovXG4gIGxldCBGT1JCSURfVEFHUyA9IG51bGw7XG4gIC8qIEV4cGxpY2l0bHkgZm9yYmlkZGVuIGF0dHJpYnV0ZXMgKG92ZXJyaWRlcyBBTExPV0VEX0FUVFIvQUREX0FUVFIpICovXG4gIGxldCBGT1JCSURfQVRUUiA9IG51bGw7XG4gIC8qIERlY2lkZSBpZiBBUklBIGF0dHJpYnV0ZXMgYXJlIG9rYXkgKi9cbiAgbGV0IEFMTE9XX0FSSUFfQVRUUiA9IHRydWU7XG4gIC8qIERlY2lkZSBpZiBjdXN0b20gZGF0YSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gIGxldCBBTExPV19EQVRBX0FUVFIgPSB0cnVlO1xuICAvKiBEZWNpZGUgaWYgdW5rbm93biBwcm90b2NvbHMgYXJlIG9rYXkgKi9cbiAgbGV0IEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gZmFsc2U7XG4gIC8qIERlY2lkZSBpZiBzZWxmLWNsb3NpbmcgdGFncyBpbiBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkLlxuICAgKiBVc3VhbGx5IHJlbW92ZWQgZHVlIHRvIGEgbVhTUyBpc3N1ZSBpbiBqUXVlcnkgMy4wICovXG4gIGxldCBBTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgPSB0cnVlO1xuICAvKiBPdXRwdXQgc2hvdWxkIGJlIHNhZmUgZm9yIGNvbW1vbiB0ZW1wbGF0ZSBlbmdpbmVzLlxuICAgKiBUaGlzIG1lYW5zLCBET01QdXJpZnkgcmVtb3ZlcyBkYXRhIGF0dHJpYnV0ZXMsIG11c3RhY2hlcyBhbmQgRVJCXG4gICAqL1xuICBsZXQgU0FGRV9GT1JfVEVNUExBVEVTID0gZmFsc2U7XG4gIC8qIE91dHB1dCBzaG91bGQgYmUgc2FmZSBldmVuIGZvciBYTUwgdXNlZCB3aXRoaW4gSFRNTCBhbmQgYWxpa2UuXG4gICAqIFRoaXMgbWVhbnMsIERPTVB1cmlmeSByZW1vdmVzIGNvbW1lbnRzIHdoZW4gY29udGFpbmluZyByaXNreSBjb250ZW50LlxuICAgKi9cbiAgbGV0IFNBRkVfRk9SX1hNTCA9IHRydWU7XG4gIC8qIERlY2lkZSBpZiBkb2N1bWVudCB3aXRoIDxodG1sPi4uLiBzaG91bGQgYmUgcmV0dXJuZWQgKi9cbiAgbGV0IFdIT0xFX0RPQ1VNRU5UID0gZmFsc2U7XG4gIC8qIFRyYWNrIHdoZXRoZXIgY29uZmlnIGlzIGFscmVhZHkgc2V0IG9uIHRoaXMgaW5zdGFuY2Ugb2YgRE9NUHVyaWZ5LiAqL1xuICBsZXQgU0VUX0NPTkZJRyA9IGZhbHNlO1xuICAvKiBEZWNpZGUgaWYgYWxsIGVsZW1lbnRzIChlLmcuIHN0eWxlLCBzY3JpcHQpIG11c3QgYmUgY2hpbGRyZW4gb2ZcbiAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cbiAgbGV0IEZPUkNFX0JPRFkgPSBmYWxzZTtcbiAgLyogRGVjaWRlIGlmIGEgRE9NIGBIVE1MQm9keUVsZW1lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICogc3RyaW5nIChvciBhIFRydXN0ZWRIVE1MIG9iamVjdCBpZiBUcnVzdGVkIFR5cGVzIGFyZSBzdXBwb3J0ZWQpLlxuICAgKiBJZiBgV0hPTEVfRE9DVU1FTlRgIGlzIGVuYWJsZWQgYSBgSFRNTEh0bWxFbGVtZW50YCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWRcbiAgICovXG4gIGxldCBSRVRVUk5fRE9NID0gZmFsc2U7XG4gIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgKiBzdHJpbmcgIChvciBhIFRydXN0ZWRIVE1MIG9iamVjdCBpZiBUcnVzdGVkIFR5cGVzIGFyZSBzdXBwb3J0ZWQpICovXG4gIGxldCBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gZmFsc2U7XG4gIC8qIFRyeSB0byByZXR1cm4gYSBUcnVzdGVkIFR5cGUgb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmcsIHJldHVybiBhIHN0cmluZyBpblxuICAgKiBjYXNlIFRydXN0ZWQgVHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgICovXG4gIGxldCBSRVRVUk5fVFJVU1RFRF9UWVBFID0gZmFsc2U7XG4gIC8qIE91dHB1dCBzaG91bGQgYmUgZnJlZSBmcm9tIERPTSBjbG9iYmVyaW5nIGF0dGFja3M/XG4gICAqIFRoaXMgc2FuaXRpemVzIG1hcmt1cHMgbmFtZWQgd2l0aCBjb2xsaWRpbmcsIGNsb2JiZXJhYmxlIGJ1aWx0LWluIERPTSBBUElzLlxuICAgKi9cbiAgbGV0IFNBTklUSVpFX0RPTSA9IHRydWU7XG4gIC8qIEFjaGlldmUgZnVsbCBET00gQ2xvYmJlcmluZyBwcm90ZWN0aW9uIGJ5IGlzb2xhdGluZyB0aGUgbmFtZXNwYWNlIG9mIG5hbWVkXG4gICAqIHByb3BlcnRpZXMgYW5kIEpTIHZhcmlhYmxlcywgbWl0aWdhdGluZyBhdHRhY2tzIHRoYXQgYWJ1c2UgdGhlIEhUTUwvRE9NIHNwZWMgcnVsZXMuXG4gICAqXG4gICAqIEhUTUwvRE9NIHNwZWMgcnVsZXMgdGhhdCBlbmFibGUgRE9NIENsb2JiZXJpbmc6XG4gICAqICAgLSBOYW1lZCBBY2Nlc3Mgb24gV2luZG93ICjCpzcuMy4zKVxuICAgKiAgIC0gRE9NIFRyZWUgQWNjZXNzb3JzICjCpzMuMS41KVxuICAgKiAgIC0gRm9ybSBFbGVtZW50IFBhcmVudC1DaGlsZCBSZWxhdGlvbnMgKMKnNC4xMC4zKVxuICAgKiAgIC0gSWZyYW1lIHNyY2RvYyAvIE5lc3RlZCBXaW5kb3dQcm94aWVzICjCpzQuOC41KVxuICAgKiAgIC0gSFRNTENvbGxlY3Rpb24gKMKnNC4yLjEwLjIpXG4gICAqXG4gICAqIE5hbWVzcGFjZSBpc29sYXRpb24gaXMgaW1wbGVtZW50ZWQgYnkgcHJlZml4aW5nIGBpZGAgYW5kIGBuYW1lYCBhdHRyaWJ1dGVzXG4gICAqIHdpdGggYSBjb25zdGFudCBzdHJpbmcsIGkuZS4sIGB1c2VyLWNvbnRlbnQtYFxuICAgKi9cbiAgbGV0IFNBTklUSVpFX05BTUVEX1BST1BTID0gZmFsc2U7XG4gIGNvbnN0IFNBTklUSVpFX05BTUVEX1BST1BTX1BSRUZJWCA9ICd1c2VyLWNvbnRlbnQtJztcbiAgLyogS2VlcCBlbGVtZW50IGNvbnRlbnQgd2hlbiByZW1vdmluZyBlbGVtZW50PyAqL1xuICBsZXQgS0VFUF9DT05URU5UID0gdHJ1ZTtcbiAgLyogSWYgYSBgTm9kZWAgaXMgcGFzc2VkIHRvIHNhbml0aXplKCksIHRoZW4gcGVyZm9ybXMgc2FuaXRpemF0aW9uIGluLXBsYWNlIGluc3RlYWRcbiAgICogb2YgaW1wb3J0aW5nIGl0IGludG8gYSBuZXcgRG9jdW1lbnQgYW5kIHJldHVybmluZyBhIHNhbml0aXplZCBjb3B5ICovXG4gIGxldCBJTl9QTEFDRSA9IGZhbHNlO1xuICAvKiBBbGxvdyB1c2FnZSBvZiBwcm9maWxlcyBsaWtlIGh0bWwsIHN2ZyBhbmQgbWF0aE1sICovXG4gIGxldCBVU0VfUFJPRklMRVMgPSB7fTtcbiAgLyogVGFncyB0byBpZ25vcmUgY29udGVudCBvZiB3aGVuIEtFRVBfQ09OVEVOVCBpcyB0cnVlICovXG4gIGxldCBGT1JCSURfQ09OVEVOVFMgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0ZPUkJJRF9DT05URU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2Fubm90YXRpb24teG1sJywgJ2F1ZGlvJywgJ2NvbGdyb3VwJywgJ2Rlc2MnLCAnZm9yZWlnbm9iamVjdCcsICdoZWFkJywgJ2lmcmFtZScsICdtYXRoJywgJ21pJywgJ21uJywgJ21vJywgJ21zJywgJ210ZXh0JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAncGxhaW50ZXh0JywgJ3NjcmlwdCcsICdzdHlsZScsICdzdmcnLCAndGVtcGxhdGUnLCAndGhlYWQnLCAndGl0bGUnLCAndmlkZW8nLCAneG1wJ10pO1xuICAvKiBUYWdzIHRoYXQgYXJlIHNhZmUgZm9yIGRhdGE6IFVSSXMgKi9cbiAgbGV0IERBVEFfVVJJX1RBR1MgPSBudWxsO1xuICBjb25zdCBERUZBVUxUX0RBVEFfVVJJX1RBR1MgPSBhZGRUb1NldCh7fSwgWydhdWRpbycsICd2aWRlbycsICdpbWcnLCAnc291cmNlJywgJ2ltYWdlJywgJ3RyYWNrJ10pO1xuICAvKiBBdHRyaWJ1dGVzIHNhZmUgZm9yIHZhbHVlcyBsaWtlIFwiamF2YXNjcmlwdDpcIiAqL1xuICBsZXQgVVJJX1NBRkVfQVRUUklCVVRFUyA9IG51bGw7XG4gIGNvbnN0IERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyA9IGFkZFRvU2V0KHt9LCBbJ2FsdCcsICdjbGFzcycsICdmb3InLCAnaWQnLCAnbGFiZWwnLCAnbmFtZScsICdwYXR0ZXJuJywgJ3BsYWNlaG9sZGVyJywgJ3JvbGUnLCAnc3VtbWFyeScsICd0aXRsZScsICd2YWx1ZScsICdzdHlsZScsICd4bWxucyddKTtcbiAgY29uc3QgTUFUSE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbiAgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gIGNvbnN0IEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAvKiBEb2N1bWVudCBuYW1lc3BhY2UgKi9cbiAgbGV0IE5BTUVTUEFDRSA9IEhUTUxfTkFNRVNQQUNFO1xuICBsZXQgSVNfRU1QVFlfSU5QVVQgPSBmYWxzZTtcbiAgLyogQWxsb3dlZCBYSFRNTCtYTUwgbmFtZXNwYWNlcyAqL1xuICBsZXQgQUxMT1dFRF9OQU1FU1BBQ0VTID0gbnVsbDtcbiAgY29uc3QgREVGQVVMVF9BTExPV0VEX05BTUVTUEFDRVMgPSBhZGRUb1NldCh7fSwgW01BVEhNTF9OQU1FU1BBQ0UsIFNWR19OQU1FU1BBQ0UsIEhUTUxfTkFNRVNQQUNFXSwgc3RyaW5nVG9TdHJpbmcpO1xuICBsZXQgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnbWknLCAnbW8nLCAnbW4nLCAnbXMnLCAnbXRleHQnXSk7XG4gIGxldCBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2Fubm90YXRpb24teG1sJ10pO1xuICAvLyBDZXJ0YWluIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGJvdGggU1ZHIGFuZCBIVE1MXG4gIC8vIG5hbWVzcGFjZS4gV2UgbmVlZCB0byBzcGVjaWZ5IHRoZW0gZXhwbGljaXRseVxuICAvLyBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGVycm9uZW91c2x5IGRlbGV0ZWQgZnJvbVxuICAvLyBIVE1MIG5hbWVzcGFjZS5cbiAgY29uc3QgQ09NTU9OX1NWR19BTkRfSFRNTF9FTEVNRU5UUyA9IGFkZFRvU2V0KHt9LCBbJ3RpdGxlJywgJ3N0eWxlJywgJ2ZvbnQnLCAnYScsICdzY3JpcHQnXSk7XG4gIC8qIFBhcnNpbmcgb2Ygc3RyaWN0IFhIVE1MIGRvY3VtZW50cyAqL1xuICBsZXQgUEFSU0VSX01FRElBX1RZUEUgPSBudWxsO1xuICBjb25zdCBTVVBQT1JURURfUEFSU0VSX01FRElBX1RZUEVTID0gWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnLCAndGV4dC9odG1sJ107XG4gIGNvbnN0IERFRkFVTFRfUEFSU0VSX01FRElBX1RZUEUgPSAndGV4dC9odG1sJztcbiAgbGV0IHRyYW5zZm9ybUNhc2VGdW5jID0gbnVsbDtcbiAgLyogS2VlcCBhIHJlZmVyZW5jZSB0byBjb25maWcgdG8gcGFzcyB0byBob29rcyAqL1xuICBsZXQgQ09ORklHID0gbnVsbDtcbiAgLyogSWRlYWxseSwgZG8gbm90IHRvdWNoIGFueXRoaW5nIGJlbG93IHRoaXMgbGluZSAqL1xuICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovXG4gIGNvbnN0IGZvcm1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuICBjb25zdCBpc1JlZ2V4T3JGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzUmVnZXhPckZ1bmN0aW9uKHRlc3RWYWx1ZSkge1xuICAgIHJldHVybiB0ZXN0VmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgdGVzdFZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIH07XG4gIC8qKlxuICAgKiBfcGFyc2VDb25maWdcbiAgICpcbiAgICogQHBhcmFtIGNmZyBvcHRpb25hbCBjb25maWcgbGl0ZXJhbFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgY29uc3QgX3BhcnNlQ29uZmlnID0gZnVuY3Rpb24gX3BhcnNlQ29uZmlnKCkge1xuICAgIGxldCBjZmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGlmIChDT05GSUcgJiYgQ09ORklHID09PSBjZmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyogU2hpZWxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gdGFtcGVyaW5nICovXG4gICAgaWYgKCFjZmcgfHwgdHlwZW9mIGNmZyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGNmZyA9IHt9O1xuICAgIH1cbiAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSBwcm90b3R5cGUgcG9sbHV0aW9uICovXG4gICAgY2ZnID0gY2xvbmUoY2ZnKTtcbiAgICBQQVJTRVJfTUVESUFfVFlQRSA9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWluY2x1ZGVzXG4gICAgU1VQUE9SVEVEX1BBUlNFUl9NRURJQV9UWVBFUy5pbmRleE9mKGNmZy5QQVJTRVJfTUVESUFfVFlQRSkgPT09IC0xID8gREVGQVVMVF9QQVJTRVJfTUVESUFfVFlQRSA6IGNmZy5QQVJTRVJfTUVESUFfVFlQRTtcbiAgICAvLyBIVE1MIHRhZ3MgYW5kIGF0dHJpYnV0ZXMgYXJlIG5vdCBjYXNlLXNlbnNpdGl2ZSwgY29udmVydGluZyB0byBsb3dlcmNhc2UuIEtlZXBpbmcgWEhUTUwgYXMgaXMuXG4gICAgdHJhbnNmb3JtQ2FzZUZ1bmMgPSBQQVJTRVJfTUVESUFfVFlQRSA9PT0gJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcgPyBzdHJpbmdUb1N0cmluZyA6IHN0cmluZ1RvTG93ZXJDYXNlO1xuICAgIC8qIFNldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICBBTExPV0VEX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX1RBR1MnKSA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0FMTE9XRURfVEFHUztcbiAgICBBTExPV0VEX0FUVFIgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX0FUVFInKSA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9BVFRSLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICBBTExPV0VEX05BTUVTUEFDRVMgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBTExPV0VEX05BTUVTUEFDRVMnKSA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9OQU1FU1BBQ0VTLCBzdHJpbmdUb1N0cmluZykgOiBERUZBVUxUX0FMTE9XRURfTkFNRVNQQUNFUztcbiAgICBVUklfU0FGRV9BVFRSSUJVVEVTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnQUREX1VSSV9TQUZFX0FUVFInKSA/IGFkZFRvU2V0KGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksIGNmZy5BRERfVVJJX1NBRkVfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpIDogREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTO1xuICAgIERBVEFfVVJJX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdBRERfREFUQV9VUklfVEFHUycpID8gYWRkVG9TZXQoY2xvbmUoREVGQVVMVF9EQVRBX1VSSV9UQUdTKSwgY2ZnLkFERF9EQVRBX1VSSV9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYykgOiBERUZBVUxUX0RBVEFfVVJJX1RBR1M7XG4gICAgRk9SQklEX0NPTlRFTlRTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnRk9SQklEX0NPTlRFTlRTJykgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9DT05URU5UUywgdHJhbnNmb3JtQ2FzZUZ1bmMpIDogREVGQVVMVF9GT1JCSURfQ09OVEVOVFM7XG4gICAgRk9SQklEX1RBR1MgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfVEFHUycpID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfVEFHUywgdHJhbnNmb3JtQ2FzZUZ1bmMpIDoge307XG4gICAgRk9SQklEX0FUVFIgPSBvYmplY3RIYXNPd25Qcm9wZXJ0eShjZmcsICdGT1JCSURfQVRUUicpID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpIDoge307XG4gICAgVVNFX1BST0ZJTEVTID0gb2JqZWN0SGFzT3duUHJvcGVydHkoY2ZnLCAnVVNFX1BST0ZJTEVTJykgPyBjZmcuVVNFX1BST0ZJTEVTIDogZmFsc2U7XG4gICAgQUxMT1dfQVJJQV9BVFRSID0gY2ZnLkFMTE9XX0FSSUFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIEFMTE9XX0RBVEFfQVRUUiA9IGNmZy5BTExPV19EQVRBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUyA9IGNmZy5BTExPV19VTktOT1dOX1BST1RPQ09MUyB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgIEFMTE9XX1NFTEZfQ0xPU0VfSU5fQVRUUiA9IGNmZy5BTExPV19TRUxGX0NMT1NFX0lOX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICBTQUZFX0ZPUl9URU1QTEFURVMgPSBjZmcuU0FGRV9GT1JfVEVNUExBVEVTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgU0FGRV9GT1JfWE1MID0gY2ZnLlNBRkVfRk9SX1hNTCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFdIT0xFX0RPQ1VNRU5UID0gY2ZnLldIT0xFX0RPQ1VNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX0RPTSA9IGNmZy5SRVRVUk5fRE9NIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGNmZy5SRVRVUk5fRE9NX0ZSQUdNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgUkVUVVJOX1RSVVNURURfVFlQRSA9IGNmZy5SRVRVUk5fVFJVU1RFRF9UWVBFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgRk9SQ0VfQk9EWSA9IGNmZy5GT1JDRV9CT0RZIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgU0FOSVRJWkVfRE9NID0gY2ZnLlNBTklUSVpFX0RPTSAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIFNBTklUSVpFX05BTUVEX1BST1BTID0gY2ZnLlNBTklUSVpFX05BTUVEX1BST1BTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgS0VFUF9DT05URU5UID0gY2ZnLktFRVBfQ09OVEVOVCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgIElOX1BMQUNFID0gY2ZnLklOX1BMQUNFIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgSVNfQUxMT1dFRF9VUkkkMSA9IGNmZy5BTExPV0VEX1VSSV9SRUdFWFAgfHwgSVNfQUxMT1dFRF9VUkk7XG4gICAgTkFNRVNQQUNFID0gY2ZnLk5BTUVTUEFDRSB8fCBIVE1MX05BTUVTUEFDRTtcbiAgICBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPSBjZmcuTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTIHx8IE1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UUztcbiAgICBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGNmZy5IVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyB8fCBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUztcbiAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORyA9IGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyB8fCB7fTtcbiAgICBpZiAoY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmIGlzUmVnZXhPckZ1bmN0aW9uKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2spKSB7XG4gICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2sgPSBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrO1xuICAgIH1cbiAgICBpZiAoY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmIGlzUmVnZXhPckZ1bmN0aW9uKGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2spKSB7XG4gICAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgPSBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrO1xuICAgIH1cbiAgICBpZiAoY2ZnLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HICYmIHR5cGVvZiBjZmcuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyA9IGNmZy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM7XG4gICAgfVxuICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgIEFMTE9XX0RBVEFfQVRUUiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgUkVUVVJOX0RPTSA9IHRydWU7XG4gICAgfVxuICAgIC8qIFBhcnNlIHByb2ZpbGUgaW5mbyAqL1xuICAgIGlmIChVU0VfUFJPRklMRVMpIHtcbiAgICAgIEFMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCB0ZXh0KTtcbiAgICAgIEFMTE9XRURfQVRUUiA9IFtdO1xuICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgaHRtbCQxKTtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBodG1sKTtcbiAgICAgIH1cbiAgICAgIGlmIChVU0VfUFJPRklMRVMuc3ZnID09PSB0cnVlKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgc3ZnJDEpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHN2Zyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgIH1cbiAgICAgIGlmIChVU0VfUFJPRklMRVMuc3ZnRmlsdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHN2Zyk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgIH1cbiAgICAgIGlmIChVU0VfUFJPRklMRVMubWF0aE1sID09PSB0cnVlKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgbWF0aE1sJDEpO1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIG1hdGhNbCk7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogTWVyZ2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovXG4gICAgaWYgKGNmZy5BRERfVEFHUykge1xuICAgICAgaWYgKEFMTE9XRURfVEFHUyA9PT0gREVGQVVMVF9BTExPV0VEX1RBR1MpIHtcbiAgICAgICAgQUxMT1dFRF9UQUdTID0gY2xvbmUoQUxMT1dFRF9UQUdTKTtcbiAgICAgIH1cbiAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgY2ZnLkFERF9UQUdTLCB0cmFuc2Zvcm1DYXNlRnVuYyk7XG4gICAgfVxuICAgIGlmIChjZmcuQUREX0FUVFIpIHtcbiAgICAgIGlmIChBTExPV0VEX0FUVFIgPT09IERFRkFVTFRfQUxMT1dFRF9BVFRSKSB7XG4gICAgICAgIEFMTE9XRURfQVRUUiA9IGNsb25lKEFMTE9XRURfQVRUUik7XG4gICAgICB9XG4gICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGNmZy5BRERfQVRUUiwgdHJhbnNmb3JtQ2FzZUZ1bmMpO1xuICAgIH1cbiAgICBpZiAoY2ZnLkFERF9VUklfU0FGRV9BVFRSKSB7XG4gICAgICBhZGRUb1NldChVUklfU0FGRV9BVFRSSUJVVEVTLCBjZmcuQUREX1VSSV9TQUZFX0FUVFIsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICB9XG4gICAgaWYgKGNmZy5GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgIGlmIChGT1JCSURfQ09OVEVOVFMgPT09IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTKSB7XG4gICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICB9XG4gICAgICBhZGRUb1NldChGT1JCSURfQ09OVEVOVFMsIGNmZy5GT1JCSURfQ09OVEVOVFMsIHRyYW5zZm9ybUNhc2VGdW5jKTtcbiAgICB9XG4gICAgLyogQWRkICN0ZXh0IGluIGNhc2UgS0VFUF9DT05URU5UIGlzIHNldCB0byB0cnVlICovXG4gICAgaWYgKEtFRVBfQ09OVEVOVCkge1xuICAgICAgQUxMT1dFRF9UQUdTWycjdGV4dCddID0gdHJ1ZTtcbiAgICB9XG4gICAgLyogQWRkIGh0bWwsIGhlYWQgYW5kIGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgV0hPTEVfRE9DVU1FTlQgaXMgdHJ1ZSAqL1xuICAgIGlmIChXSE9MRV9ET0NVTUVOVCkge1xuICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ2h0bWwnLCAnaGVhZCcsICdib2R5J10pO1xuICAgIH1cbiAgICAvKiBBZGQgdGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgdGFibGVzIGFyZSBwZXJtaXR0ZWQsIHNlZSAjMjg2LCAjMzY1ICovXG4gICAgaWYgKEFMTE9XRURfVEFHUy50YWJsZSkge1xuICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ3Rib2R5J10pO1xuICAgICAgZGVsZXRlIEZPUkJJRF9UQUdTLnRib2R5O1xuICAgIH1cbiAgICBpZiAoY2ZnLlRSVVNURURfVFlQRVNfUE9MSUNZKSB7XG4gICAgICBpZiAodHlwZW9mIGNmZy5UUlVTVEVEX1RZUEVTX1BPTElDWS5jcmVhdGVIVE1MICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgnVFJVU1RFRF9UWVBFU19QT0xJQ1kgY29uZmlndXJhdGlvbiBvcHRpb24gbXVzdCBwcm92aWRlIGEgXCJjcmVhdGVIVE1MXCIgaG9vay4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY2ZnLlRSVVNURURfVFlQRVNfUE9MSUNZLmNyZWF0ZVNjcmlwdFVSTCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ1RSVVNURURfVFlQRVNfUE9MSUNZIGNvbmZpZ3VyYXRpb24gb3B0aW9uIG11c3QgcHJvdmlkZSBhIFwiY3JlYXRlU2NyaXB0VVJMXCIgaG9vay4nKTtcbiAgICAgIH1cbiAgICAgIC8vIE92ZXJ3cml0ZSBleGlzdGluZyBUcnVzdGVkVHlwZXMgcG9saWN5LlxuICAgICAgdHJ1c3RlZFR5cGVzUG9saWN5ID0gY2ZnLlRSVVNURURfVFlQRVNfUE9MSUNZO1xuICAgICAgLy8gU2lnbiBsb2NhbCB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgYHNhbml0aXplYC5cbiAgICAgIGVtcHR5SFRNTCA9IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5pbml0aWFsaXplZCBwb2xpY3ksIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZG9tcHVyaWZ5IHBvbGljeS5cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVzdGVkVHlwZXNQb2xpY3kgPSBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KHRydXN0ZWRUeXBlcywgY3VycmVudFNjcmlwdCk7XG4gICAgICB9XG4gICAgICAvLyBJZiBjcmVhdGluZyB0aGUgaW50ZXJuYWwgcG9saWN5IHN1Y2NlZWRlZCBzaWduIGludGVybmFsIHZhcmlhYmxlcy5cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgIT09IG51bGwgJiYgdHlwZW9mIGVtcHR5SFRNTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZW1wdHlIVE1MID0gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoJycpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBQcmV2ZW50IGZ1cnRoZXIgbWFuaXB1bGF0aW9uIG9mIGNvbmZpZ3VyYXRpb24uXG4gICAgLy8gTm90IGF2YWlsYWJsZSBpbiBJRTgsIFNhZmFyaSA1LCBldGMuXG4gICAgaWYgKGZyZWV6ZSkge1xuICAgICAgZnJlZXplKGNmZyk7XG4gICAgfVxuICAgIENPTkZJRyA9IGNmZztcbiAgfTtcbiAgLyogS2VlcCB0cmFjayBvZiBhbGwgcG9zc2libGUgU1ZHIGFuZCBNYXRoTUwgdGFnc1xuICAgKiBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIHRoZSBuYW1lc3BhY2UgY2hlY2tzXG4gICAqIGNvcnJlY3RseS4gKi9cbiAgY29uc3QgQUxMX1NWR19UQUdTID0gYWRkVG9TZXQoe30sIFsuLi5zdmckMSwgLi4uc3ZnRmlsdGVycywgLi4uc3ZnRGlzYWxsb3dlZF0pO1xuICBjb25zdCBBTExfTUFUSE1MX1RBR1MgPSBhZGRUb1NldCh7fSwgWy4uLm1hdGhNbCQxLCAuLi5tYXRoTWxEaXNhbGxvd2VkXSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gZWxlbWVudCBhIERPTSBlbGVtZW50IHdob3NlIG5hbWVzcGFjZSBpcyBiZWluZyBjaGVja2VkXG4gICAqIEByZXR1cm5zIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBoYXMgYVxuICAgKiAgbmFtZXNwYWNlIHRoYXQgYSBzcGVjLWNvbXBsaWFudCBwYXJzZXIgd291bGQgbmV2ZXJcbiAgICogIHJldHVybi4gUmV0dXJuIHRydWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgY29uc3QgX2NoZWNrVmFsaWROYW1lc3BhY2UgPSBmdW5jdGlvbiBfY2hlY2tWYWxpZE5hbWVzcGFjZShlbGVtZW50KSB7XG4gICAgbGV0IHBhcmVudCA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgLy8gSW4gSlNET00sIGlmIHdlJ3JlIGluc2lkZSBzaGFkb3cgRE9NLCB0aGVuIHBhcmVudE5vZGVcbiAgICAvLyBjYW4gYmUgbnVsbC4gV2UganVzdCBzaW11bGF0ZSBwYXJlbnQgaW4gdGhpcyBjYXNlLlxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQudGFnTmFtZSkge1xuICAgICAgcGFyZW50ID0ge1xuICAgICAgICBuYW1lc3BhY2VVUkk6IE5BTUVTUEFDRSxcbiAgICAgICAgdGFnTmFtZTogJ3RlbXBsYXRlJ1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKGVsZW1lbnQudGFnTmFtZSk7XG4gICAgY29uc3QgcGFyZW50VGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKHBhcmVudC50YWdOYW1lKTtcbiAgICBpZiAoIUFMTE9XRURfTkFNRVNQQUNFU1tlbGVtZW50Lm5hbWVzcGFjZVVSSV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gU1ZHXG4gICAgICAvLyBpcyB2aWEgPHN2Zz4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnO1xuICAgICAgfVxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIE1hdGhNTCB0byBTVkcgaXMgdmlhYFxuICAgICAgLy8gc3ZnIGlmIHBhcmVudCBpcyBlaXRoZXIgPGFubm90YXRpb24teG1sPiBvciBNYXRoTUxcbiAgICAgIC8vIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzLlxuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnICYmIChwYXJlbnRUYWdOYW1lID09PSAnYW5ub3RhdGlvbi14bWwnIHx8IE1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBvbmx5IGFsbG93IGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gU1ZHXG4gICAgICAvLyBzcGVjLiBBbGwgb3RoZXJzIGFyZSBkaXNhbGxvd2VkIGluIFNWRyBuYW1lc3BhY2UuXG4gICAgICByZXR1cm4gQm9vbGVhbihBTExfU1ZHX1RBR1NbdGFnTmFtZV0pO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBIVE1MIG5hbWVzcGFjZSB0byBNYXRoTUxcbiAgICAgIC8vIGlzIHZpYSA8bWF0aD4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJztcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gTWF0aE1MIGlzIHZpYVxuICAgICAgLy8gPG1hdGg+IGFuZCBIVE1MIGludGVncmF0aW9uIHBvaW50c1xuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJyAmJiBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBNYXRoTUxcbiAgICAgIC8vIHNwZWMuIEFsbCBvdGhlcnMgYXJlIGRpc2FsbG93ZWQgaW4gTWF0aE1MIG5hbWVzcGFjZS5cbiAgICAgIHJldHVybiBCb29sZWFuKEFMTF9NQVRITUxfVEFHU1t0YWdOYW1lXSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gSFRNTCBpcyB2aWFcbiAgICAgIC8vIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzLCBhbmQgZnJvbSBNYXRoTUwgdG8gSFRNTFxuICAgICAgLy8gaXMgdmlhIE1hdGhNTCB0ZXh0IGludGVncmF0aW9uIHBvaW50c1xuICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UgJiYgIUhUTUxfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFICYmICFNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gV2UgZGlzYWxsb3cgdGFncyB0aGF0IGFyZSBzcGVjaWZpYyBmb3IgTWF0aE1MXG4gICAgICAvLyBvciBTVkcgYW5kIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gSFRNTCBuYW1lc3BhY2VcbiAgICAgIHJldHVybiAhQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdICYmIChDT01NT05fU1ZHX0FORF9IVE1MX0VMRU1FTlRTW3RhZ05hbWVdIHx8ICFBTExfU1ZHX1RBR1NbdGFnTmFtZV0pO1xuICAgIH1cbiAgICAvLyBGb3IgWEhUTUwgYW5kIFhNTCBkb2N1bWVudHMgdGhhdCBzdXBwb3J0IGN1c3RvbSBuYW1lc3BhY2VzXG4gICAgaWYgKFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyAmJiBBTExPV0VEX05BTUVTUEFDRVNbZWxlbWVudC5uYW1lc3BhY2VVUkldKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gVGhlIGNvZGUgc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcGxhY2UgKHRoaXMgbWVhbnNcbiAgICAvLyB0aGF0IHRoZSBlbGVtZW50IHNvbWVob3cgZ290IG5hbWVzcGFjZSB0aGF0IGlzIG5vdFxuICAgIC8vIEhUTUwsIFNWRywgTWF0aE1MIG9yIGFsbG93ZWQgdmlhIEFMTE9XRURfTkFNRVNQQUNFUykuXG4gICAgLy8gUmV0dXJuIGZhbHNlIGp1c3QgaW4gY2FzZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIC8qKlxuICAgKiBfZm9yY2VSZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIG5vZGUgYSBET00gbm9kZVxuICAgKi9cbiAgY29uc3QgX2ZvcmNlUmVtb3ZlID0gZnVuY3Rpb24gX2ZvcmNlUmVtb3ZlKG5vZGUpIHtcbiAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgIGVsZW1lbnQ6IG5vZGVcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLXJlbW92ZVxuICAgICAgZ2V0UGFyZW50Tm9kZShub2RlKS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZW1vdmUobm9kZSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogX3JlbW92ZUF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBhbiBBdHRyaWJ1dGUgbmFtZVxuICAgKiBAcGFyYW0gZWxlbWVudCBhIERPTSBub2RlXG4gICAqL1xuICBjb25zdCBfcmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24gX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBlbGVtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICBhdHRyaWJ1dGU6IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lKSxcbiAgICAgICAgZnJvbTogZWxlbWVudFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgIGF0dHJpYnV0ZTogbnVsbCxcbiAgICAgICAgZnJvbTogZWxlbWVudFxuICAgICAgfSk7XG4gICAgfVxuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIC8vIFdlIHZvaWQgYXR0cmlidXRlIHZhbHVlcyBmb3IgdW5yZW1vdmFibGUgXCJpc1wiIGF0dHJpYnV0ZXNcbiAgICBpZiAobmFtZSA9PT0gJ2lzJykge1xuICAgICAgaWYgKFJFVFVSTl9ET00gfHwgUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9mb3JjZVJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIF9pbml0RG9jdW1lbnRcbiAgICpcbiAgICogQHBhcmFtIGRpcnR5IC0gYSBzdHJpbmcgb2YgZGlydHkgbWFya3VwXG4gICAqIEByZXR1cm4gYSBET00sIGZpbGxlZCB3aXRoIHRoZSBkaXJ0eSBtYXJrdXBcbiAgICovXG4gIGNvbnN0IF9pbml0RG9jdW1lbnQgPSBmdW5jdGlvbiBfaW5pdERvY3VtZW50KGRpcnR5KSB7XG4gICAgLyogQ3JlYXRlIGEgSFRNTCBkb2N1bWVudCAqL1xuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGxldCBsZWFkaW5nV2hpdGVzcGFjZSA9IG51bGw7XG4gICAgaWYgKEZPUkNFX0JPRFkpIHtcbiAgICAgIGRpcnR5ID0gJzxyZW1vdmU+PC9yZW1vdmU+JyArIGRpcnR5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBJZiBGT1JDRV9CT0RZIGlzbid0IHVzZWQsIGxlYWRpbmcgd2hpdGVzcGFjZSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgbWFudWFsbHkgKi9cbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBzdHJpbmdNYXRjaChkaXJ0eSwgL15bXFxyXFxuXFx0IF0rLyk7XG4gICAgICBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoZXMgJiYgbWF0Y2hlc1swXTtcbiAgICB9XG4gICAgaWYgKFBBUlNFUl9NRURJQV9UWVBFID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJyAmJiBOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAvLyBSb290IG9mIFhIVE1MIGRvYyBtdXN0IGNvbnRhaW4geG1sbnMgZGVjbGFyYXRpb24gKHNlZSBodHRwczovL3d3dy53My5vcmcvVFIveGh0bWwxL25vcm1hdGl2ZS5odG1sI3N0cmljdClcbiAgICAgIGRpcnR5ID0gJzxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPjxoZWFkPjwvaGVhZD48Ym9keT4nICsgZGlydHkgKyAnPC9ib2R5PjwvaHRtbD4nO1xuICAgIH1cbiAgICBjb25zdCBkaXJ0eVBheWxvYWQgPSB0cnVzdGVkVHlwZXNQb2xpY3kgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSkgOiBkaXJ0eTtcbiAgICAvKlxuICAgICAqIFVzZSB0aGUgRE9NUGFyc2VyIEFQSSBieSBkZWZhdWx0LCBmYWxsYmFjayBsYXRlciBpZiBuZWVkcyBiZVxuICAgICAqIERPTVBhcnNlciBub3Qgd29yayBmb3Igc3ZnIHdoZW4gaGFzIG11bHRpcGxlIHJvb3QgZWxlbWVudC5cbiAgICAgKi9cbiAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhkaXJ0eVBheWxvYWQsIFBBUlNFUl9NRURJQV9UWVBFKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuICAgIC8qIFVzZSBjcmVhdGVIVE1MRG9jdW1lbnQgaW4gY2FzZSBET01QYXJzZXIgaXMgbm90IGF2YWlsYWJsZSAqL1xuICAgIGlmICghZG9jIHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBkb2MgPSBpbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudChOQU1FU1BBQ0UsICd0ZW1wbGF0ZScsIG51bGwpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgPSBJU19FTVBUWV9JTlBVVCA/IGVtcHR5SFRNTCA6IGRpcnR5UGF5bG9hZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gU3ludGF4IGVycm9yIGlmIGRpcnR5UGF5bG9hZCBpcyBpbnZhbGlkIHhtbFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBib2R5ID0gZG9jLmJvZHkgfHwgZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICBpZiAoZGlydHkgJiYgbGVhZGluZ1doaXRlc3BhY2UpIHtcbiAgICAgIGJvZHkuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxlYWRpbmdXaGl0ZXNwYWNlKSwgYm9keS5jaGlsZE5vZGVzWzBdIHx8IG51bGwpO1xuICAgIH1cbiAgICAvKiBXb3JrIG9uIHdob2xlIGRvY3VtZW50IG9yIGp1c3QgaXRzIGJvZHkgKi9cbiAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lLmNhbGwoZG9jLCBXSE9MRV9ET0NVTUVOVCA/ICdodG1sJyA6ICdib2R5JylbMF07XG4gICAgfVxuICAgIHJldHVybiBXSE9MRV9ET0NVTUVOVCA/IGRvYy5kb2N1bWVudEVsZW1lbnQgOiBib2R5O1xuICB9O1xuICAvKipcbiAgICogQ3JlYXRlcyBhIE5vZGVJdGVyYXRvciBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byB0cmF2ZXJzZSBmaWx0ZXJlZCBsaXN0cyBvZiBub2RlcyBvciBlbGVtZW50cyBpbiBhIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCBlbGVtZW50IG9yIG5vZGUgdG8gc3RhcnQgdHJhdmVyc2luZyBvbi5cbiAgICogQHJldHVybiBUaGUgY3JlYXRlZCBOb2RlSXRlcmF0b3JcbiAgICovXG4gIGNvbnN0IF9jcmVhdGVOb2RlSXRlcmF0b3IgPSBmdW5jdGlvbiBfY3JlYXRlTm9kZUl0ZXJhdG9yKHJvb3QpIHtcbiAgICByZXR1cm4gY3JlYXRlTm9kZUl0ZXJhdG9yLmNhbGwocm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3QsIHJvb3QsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQgfCBOb2RlRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiB8IE5vZGVGaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OLCBudWxsKTtcbiAgfTtcbiAgLyoqXG4gICAqIF9pc0Nsb2JiZXJlZFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCBlbGVtZW50IHRvIGNoZWNrIGZvciBjbG9iYmVyaW5nIGF0dGFja3NcbiAgICogQHJldHVybiB0cnVlIGlmIGNsb2JiZXJlZCwgZmFsc2UgaWYgc2FmZVxuICAgKi9cbiAgY29uc3QgX2lzQ2xvYmJlcmVkID0gZnVuY3Rpb24gX2lzQ2xvYmJlcmVkKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiAodHlwZW9mIGVsZW1lbnQubm9kZU5hbWUgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbGVtZW50LnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxlbWVudC5yZW1vdmVDaGlsZCAhPT0gJ2Z1bmN0aW9uJyB8fCAhKGVsZW1lbnQuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkgfHwgdHlwZW9mIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbGVtZW50LnNldEF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZWxlbWVudC5uYW1lc3BhY2VVUkkgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbGVtZW50Lmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZWxlbWVudC5oYXNDaGlsZE5vZGVzICE9PSAnZnVuY3Rpb24nKTtcbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBET00gbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIGl0J3MgYSBET00gbm9kZVxuICAgKiBAcmV0dXJuIHRydWUgaXMgb2JqZWN0IGlzIGEgRE9NIG5vZGVcbiAgICovXG4gIGNvbnN0IF9pc05vZGUgPSBmdW5jdGlvbiBfaXNOb2RlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBOb2RlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgTm9kZTtcbiAgfTtcbiAgZnVuY3Rpb24gX2V4ZWN1dGVIb29rcyhob29rcywgY3VycmVudE5vZGUsIGRhdGEpIHtcbiAgICBhcnJheUZvckVhY2goaG9va3MsIGhvb2sgPT4ge1xuICAgICAgaG9vay5jYWxsKERPTVB1cmlmeSwgY3VycmVudE5vZGUsIGRhdGEsIENPTkZJRyk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIF9zYW5pdGl6ZUVsZW1lbnRzXG4gICAqXG4gICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAqIEBwcm90ZWN0IHRleHRDb250ZW50XG4gICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0byBjaGVjayBmb3IgcGVybWlzc2lvbiB0byBleGlzdFxuICAgKiBAcmV0dXJuIHRydWUgaWYgbm9kZSB3YXMga2lsbGVkLCBmYWxzZSBpZiBsZWZ0IGFsaXZlXG4gICAqL1xuICBjb25zdCBfc2FuaXRpemVFbGVtZW50cyA9IGZ1bmN0aW9uIF9zYW5pdGl6ZUVsZW1lbnRzKGN1cnJlbnROb2RlKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBudWxsO1xuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmJlZm9yZVNhbml0aXplRWxlbWVudHMsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgICAvKiBDaGVjayBpZiBlbGVtZW50IGlzIGNsb2JiZXJlZCBvciBjYW4gY2xvYmJlciAqL1xuICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qIE5vdyBsZXQncyBjaGVjayB0aGUgZWxlbWVudCdzIHR5cGUgYW5kIG5hbWUgKi9cbiAgICBjb25zdCB0YWdOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLnVwb25TYW5pdGl6ZUVsZW1lbnQsIGN1cnJlbnROb2RlLCB7XG4gICAgICB0YWdOYW1lLFxuICAgICAgYWxsb3dlZFRhZ3M6IEFMTE9XRURfVEFHU1xuICAgIH0pO1xuICAgIC8qIERldGVjdCBtWFNTIGF0dGVtcHRzIGFidXNpbmcgbmFtZXNwYWNlIGNvbmZ1c2lvbiAqL1xuICAgIGlmIChjdXJyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgIV9pc05vZGUoY3VycmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpICYmIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUuaW5uZXJIVE1MKSAmJiByZWdFeHBUZXN0KC88Wy9cXHddL2csIGN1cnJlbnROb2RlLnRleHRDb250ZW50KSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiBSZW1vdmUgYW55IG9jY3VycmVuY2Ugb2YgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgKi9cbiAgICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS5wcm9ncmVzc2luZ0luc3RydWN0aW9uKSB7XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qIFJlbW92ZSBhbnkga2luZCBvZiBwb3NzaWJseSBoYXJtZnVsIGNvbW1lbnRzICovXG4gICAgaWYgKFNBRkVfRk9SX1hNTCAmJiBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFLmNvbW1lbnQgJiYgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS5kYXRhKSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuICAgIGlmICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKSB7XG4gICAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGEgY3VzdG9tIGVsZW1lbnQgdG8gaGFuZGxlICovXG4gICAgICBpZiAoIUZPUkJJRF9UQUdTW3RhZ05hbWVdICYmIF9pc0Jhc2ljQ3VzdG9tRWxlbWVudCh0YWdOYW1lKSkge1xuICAgICAgICBpZiAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgUmVnRXhwICYmIHJlZ0V4cFRlc3QoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrLCB0YWdOYW1lKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKHRhZ05hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBLZWVwIGNvbnRlbnQgZXhjZXB0IGZvciBiYWQtbGlzdGVkIGVsZW1lbnRzICovXG4gICAgICBpZiAoS0VFUF9DT05URU5UICYmICFGT1JCSURfQ09OVEVOVFNbdGFnTmFtZV0pIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRDaGlsZE5vZGVzKGN1cnJlbnROb2RlKSB8fCBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICBpZiAoY2hpbGROb2RlcyAmJiBwYXJlbnROb2RlKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRDb3VudCA9IGNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgIGZvciAobGV0IGkgPSBjaGlsZENvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQ2xvbmUgPSBjbG9uZU5vZGUoY2hpbGROb2Rlc1tpXSwgdHJ1ZSk7XG4gICAgICAgICAgICBjaGlsZENsb25lLl9fcmVtb3ZhbENvdW50ID0gKGN1cnJlbnROb2RlLl9fcmVtb3ZhbENvdW50IHx8IDApICsgMTtcbiAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkQ2xvbmUsIGdldE5leHRTaWJsaW5nKGN1cnJlbnROb2RlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qIENoZWNrIHdoZXRoZXIgZWxlbWVudCBoYXMgYSB2YWxpZCBuYW1lc3BhY2UgKi9cbiAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmICFfY2hlY2tWYWxpZE5hbWVzcGFjZShjdXJyZW50Tm9kZSkpIHtcbiAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgb2xkZXIgYnJvd3NlcnMgZG9uJ3QgZ2V0IGZhbGxiYWNrLXRhZyBtWFNTICovXG4gICAgaWYgKCh0YWdOYW1lID09PSAnbm9zY3JpcHQnIHx8IHRhZ05hbWUgPT09ICdub2VtYmVkJyB8fCB0YWdOYW1lID09PSAnbm9mcmFtZXMnKSAmJiByZWdFeHBUZXN0KC88XFwvbm8oc2NyaXB0fGVtYmVkfGZyYW1lcykvaSwgY3VycmVudE5vZGUuaW5uZXJIVE1MKSkge1xuICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiBTYW5pdGl6ZSBlbGVtZW50IGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMgJiYgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS50ZXh0KSB7XG4gICAgICAvKiBHZXQgdGhlIGVsZW1lbnQncyB0ZXh0IGNvbnRlbnQgKi9cbiAgICAgIGNvbnRlbnQgPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudDtcbiAgICAgIGFycmF5Rm9yRWFjaChbTVVTVEFDSEVfRVhQUiwgRVJCX0VYUFIsIFRNUExJVF9FWFBSXSwgZXhwciA9PiB7XG4gICAgICAgIGNvbnRlbnQgPSBzdHJpbmdSZXBsYWNlKGNvbnRlbnQsIGV4cHIsICcgJyk7XG4gICAgICB9KTtcbiAgICAgIGlmIChjdXJyZW50Tm9kZS50ZXh0Q29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgICAgICBlbGVtZW50OiBjdXJyZW50Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudE5vZGUudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5hZnRlclNhbml0aXplRWxlbWVudHMsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIC8qKlxuICAgKiBfaXNWYWxpZEF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0gbGNUYWcgTG93ZXJjYXNlIHRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICogQHBhcmFtIGxjTmFtZSBMb3dlcmNhc2UgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IF9pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpIHtcbiAgICAvKiBNYWtlIHN1cmUgYXR0cmlidXRlIGNhbm5vdCBjbG9iYmVyICovXG4gICAgaWYgKFNBTklUSVpFX0RPTSAmJiAobGNOYW1lID09PSAnaWQnIHx8IGxjTmFtZSA9PT0gJ25hbWUnKSAmJiAodmFsdWUgaW4gZG9jdW1lbnQgfHwgdmFsdWUgaW4gZm9ybUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qIEFsbG93IHZhbGlkIGRhdGEtKiBhdHRyaWJ1dGVzOiBBdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFmdGVyIFwiLVwiXG4gICAgICAgIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNlbWJlZGRpbmctY3VzdG9tLW5vbi12aXNpYmxlLWRhdGEtd2l0aC10aGUtZGF0YS0qLWF0dHJpYnV0ZXMpXG4gICAgICAgIFhNTC1jb21wYXRpYmxlIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbmZyYXN0cnVjdHVyZS5odG1sI3htbC1jb21wYXRpYmxlIGFuZCBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI2QwZTgwNClcbiAgICAgICAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWU7IGl0J3MgYWx3YXlzIFVSSSBzYWZlLiAqL1xuICAgIGlmIChBTExPV19EQVRBX0FUVFIgJiYgIUZPUkJJRF9BVFRSW2xjTmFtZV0gJiYgcmVnRXhwVGVzdChEQVRBX0FUVFIsIGxjTmFtZSkpIDsgZWxzZSBpZiAoQUxMT1dfQVJJQV9BVFRSICYmIHJlZ0V4cFRlc3QoQVJJQV9BVFRSLCBsY05hbWUpKSA7IGVsc2UgaWYgKCFBTExPV0VEX0FUVFJbbGNOYW1lXSB8fCBGT1JCSURfQVRUUltsY05hbWVdKSB7XG4gICAgICBpZiAoXG4gICAgICAvLyBGaXJzdCBjb25kaXRpb24gZG9lcyBhIHZlcnkgYmFzaWMgY2hlY2sgaWYgYSkgaXQncyBiYXNpY2FsbHkgYSB2YWxpZCBjdXN0b20gZWxlbWVudCB0YWduYW1lIEFORFxuICAgICAgLy8gYikgaWYgdGhlIHRhZ05hbWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2tcbiAgICAgIC8vIGFuZCBjKSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2tcbiAgICAgIF9pc0Jhc2ljQ3VzdG9tRWxlbWVudChsY1RhZykgJiYgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJiByZWdFeHBUZXN0KENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgbGNUYWcpIHx8IENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayhsY1RhZykpICYmIChDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAgJiYgcmVnRXhwVGVzdChDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2ssIGxjTmFtZSkgfHwgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYXR0cmlidXRlTmFtZUNoZWNrKGxjTmFtZSkpIHx8XG4gICAgICAvLyBBbHRlcm5hdGl2ZSwgc2Vjb25kIGNvbmRpdGlvbiBjaGVja3MgaWYgaXQncyBhbiBgaXNgLWF0dHJpYnV0ZSwgQU5EXG4gICAgICAvLyB0aGUgdmFsdWUgcGFzc2VzIHdoYXRldmVyIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIGZvciBDVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2tcbiAgICAgIGxjTmFtZSA9PT0gJ2lzJyAmJiBDVVNUT01fRUxFTUVOVF9IQU5ETElORy5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMgJiYgKENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCAmJiByZWdFeHBUZXN0KENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjaywgdmFsdWUpIHx8IENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLnRhZ05hbWVDaGVjayh2YWx1ZSkpKSA7IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBDaGVjayB2YWx1ZSBpcyBzYWZlLiBGaXJzdCwgaXMgYXR0ciBpbmVydD8gSWYgc28sIGlzIHNhZmUgKi9cbiAgICB9IGVsc2UgaWYgKFVSSV9TQUZFX0FUVFJJQlVURVNbbGNOYW1lXSkgOyBlbHNlIGlmIChyZWdFeHBUZXN0KElTX0FMTE9XRURfVVJJJDEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSwgJycpKSkgOyBlbHNlIGlmICgobGNOYW1lID09PSAnc3JjJyB8fCBsY05hbWUgPT09ICd4bGluazpocmVmJyB8fCBsY05hbWUgPT09ICdocmVmJykgJiYgbGNUYWcgIT09ICdzY3JpcHQnICYmIHN0cmluZ0luZGV4T2YodmFsdWUsICdkYXRhOicpID09PSAwICYmIERBVEFfVVJJX1RBR1NbbGNUYWddKSA7IGVsc2UgaWYgKEFMTE9XX1VOS05PV05fUFJPVE9DT0xTICYmICFyZWdFeHBUZXN0KElTX1NDUklQVF9PUl9EQVRBLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UsICcnKSkpIDsgZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICogX2lzQmFzaWNDdXN0b21FbGVtZW50XG4gICAqIGNoZWNrcyBpZiBhdCBsZWFzdCBvbmUgZGFzaCBpcyBpbmNsdWRlZCBpbiB0YWdOYW1lLCBhbmQgaXQncyBub3QgdGhlIGZpcnN0IGNoYXJcbiAgICogZm9yIG1vcmUgc29waGlzdGljYXRlZCBjaGVja2luZyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy92YWxpZGF0ZS1lbGVtZW50LW5hbWVcbiAgICpcbiAgICogQHBhcmFtIHRhZ05hbWUgbmFtZSBvZiB0aGUgdGFnIG9mIHRoZSBub2RlIHRvIHNhbml0aXplXG4gICAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFnIG5hbWUgbWVldHMgdGhlIGJhc2ljIGNyaXRlcmlhIGZvciBhIGN1c3RvbSBlbGVtZW50LCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBjb25zdCBfaXNCYXNpY0N1c3RvbUVsZW1lbnQgPSBmdW5jdGlvbiBfaXNCYXNpY0N1c3RvbUVsZW1lbnQodGFnTmFtZSkge1xuICAgIHJldHVybiB0YWdOYW1lICE9PSAnYW5ub3RhdGlvbi14bWwnICYmIHN0cmluZ01hdGNoKHRhZ05hbWUsIENVU1RPTV9FTEVNRU5UKTtcbiAgfTtcbiAgLyoqXG4gICAqIF9zYW5pdGl6ZUF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHByb3RlY3QgYXR0cmlidXRlc1xuICAgKiBAcHJvdGVjdCBub2RlTmFtZVxuICAgKiBAcHJvdGVjdCByZW1vdmVBdHRyaWJ1dGVcbiAgICogQHByb3RlY3Qgc2V0QXR0cmlidXRlXG4gICAqXG4gICAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0byBzYW5pdGl6ZVxuICAgKi9cbiAgY29uc3QgX3Nhbml0aXplQXR0cmlidXRlcyA9IGZ1bmN0aW9uIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpIHtcbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5iZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgICBjb25zdCB7XG4gICAgICBhdHRyaWJ1dGVzXG4gICAgfSA9IGN1cnJlbnROb2RlO1xuICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYXR0cmlidXRlczsgaWYgbm90IHdlIG1pZ2h0IGhhdmUgYSB0ZXh0IG5vZGUgKi9cbiAgICBpZiAoIWF0dHJpYnV0ZXMgfHwgX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBob29rRXZlbnQgPSB7XG4gICAgICBhdHRyTmFtZTogJycsXG4gICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAga2VlcEF0dHI6IHRydWUsXG4gICAgICBhbGxvd2VkQXR0cmlidXRlczogQUxMT1dFRF9BVFRSLFxuICAgICAgZm9yY2VLZWVwQXR0cjogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBsZXQgbCA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuICAgIC8qIEdvIGJhY2t3YXJkcyBvdmVyIGFsbCBhdHRyaWJ1dGVzOyBzYWZlbHkgcmVtb3ZlIGJhZCBvbmVzICovXG4gICAgd2hpbGUgKGwtLSkge1xuICAgICAgY29uc3QgYXR0ciA9IGF0dHJpYnV0ZXNbbF07XG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5hbWVzcGFjZVVSSSxcbiAgICAgICAgdmFsdWU6IGF0dHJWYWx1ZVxuICAgICAgfSA9IGF0dHI7XG4gICAgICBjb25zdCBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhuYW1lKTtcbiAgICAgIGxldCB2YWx1ZSA9IG5hbWUgPT09ICd2YWx1ZScgPyBhdHRyVmFsdWUgOiBzdHJpbmdUcmltKGF0dHJWYWx1ZSk7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBob29rRXZlbnQuYXR0ck5hbWUgPSBsY05hbWU7XG4gICAgICBob29rRXZlbnQuYXR0clZhbHVlID0gdmFsdWU7XG4gICAgICBob29rRXZlbnQua2VlcEF0dHIgPSB0cnVlO1xuICAgICAgaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIgPSB1bmRlZmluZWQ7IC8vIEFsbG93cyBkZXZlbG9wZXJzIHRvIHNlZSB0aGlzIGlzIGEgcHJvcGVydHkgdGhleSBjYW4gc2V0XG4gICAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLnVwb25TYW5pdGl6ZUF0dHJpYnV0ZSwgY3VycmVudE5vZGUsIGhvb2tFdmVudCk7XG4gICAgICB2YWx1ZSA9IGhvb2tFdmVudC5hdHRyVmFsdWU7XG4gICAgICAvKiBGdWxsIERPTSBDbG9iYmVyaW5nIHByb3RlY3Rpb24gdmlhIG5hbWVzcGFjZSBpc29sYXRpb24sXG4gICAgICAgKiBQcmVmaXggaWQgYW5kIG5hbWUgYXR0cmlidXRlcyB3aXRoIGB1c2VyLWNvbnRlbnQtYFxuICAgICAgICovXG4gICAgICBpZiAoU0FOSVRJWkVfTkFNRURfUFJPUFMgJiYgKGxjTmFtZSA9PT0gJ2lkJyB8fCBsY05hbWUgPT09ICduYW1lJykpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGlzIHZhbHVlXG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICAvLyBQcmVmaXggdGhlIHZhbHVlIGFuZCBsYXRlciByZS1jcmVhdGUgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW5pdGl6ZWQgdmFsdWVcbiAgICAgICAgdmFsdWUgPSBTQU5JVElaRV9OQU1FRF9QUk9QU19QUkVGSVggKyB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8qIFdvcmsgYXJvdW5kIGEgc2VjdXJpdHkgaXNzdWUgd2l0aCBjb21tZW50cyBpbnNpZGUgYXR0cmlidXRlcyAqL1xuICAgICAgaWYgKFNBRkVfRk9SX1hNTCAmJiByZWdFeHBUZXN0KC8oKC0tIT98XSk+KXw8XFwvKHN0eWxlfHRpdGxlKS9pLCB2YWx1ZSkpIHtcbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG4gICAgICBpZiAoaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvKiBSZW1vdmUgYXR0cmlidXRlICovXG4gICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgaWYgKCFob29rRXZlbnQua2VlcEF0dHIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgICAgIGlmICghQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSICYmIHJlZ0V4cFRlc3QoL1xcLz4vaSwgdmFsdWUpKSB7XG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8qIFNhbml0aXplIGF0dHJpYnV0ZSBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCBleHByID0+IHtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIGV4cHIsICcgJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLyogSXMgYHZhbHVlYCB2YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGU/ICovXG4gICAgICBjb25zdCBsY1RhZyA9IHRyYW5zZm9ybUNhc2VGdW5jKGN1cnJlbnROb2RlLm5vZGVOYW1lKTtcbiAgICAgIGlmICghX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLyogSGFuZGxlIGF0dHJpYnV0ZXMgdGhhdCByZXF1aXJlIFRydXN0ZWQgVHlwZXMgKi9cbiAgICAgIGlmICh0cnVzdGVkVHlwZXNQb2xpY3kgJiYgdHlwZW9mIHRydXN0ZWRUeXBlcyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRydXN0ZWRUeXBlcy5nZXRBdHRyaWJ1dGVUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIDsgZWxzZSB7XG4gICAgICAgICAgc3dpdGNoICh0cnVzdGVkVHlwZXMuZ2V0QXR0cmlidXRlVHlwZShsY1RhZywgbGNOYW1lKSkge1xuICAgICAgICAgICAgY2FzZSAnVHJ1c3RlZEhUTUwnOlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1RydXN0ZWRTY3JpcHRVUkwnOlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlU2NyaXB0VVJMKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogSGFuZGxlIGludmFsaWQgZGF0YS0qIGF0dHJpYnV0ZSBzZXQgYnkgdHJ5LWNhdGNoaW5nIGl0ICovXG4gICAgICB0cnkge1xuICAgICAgICBpZiAobmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogRmFsbGJhY2sgdG8gc2V0QXR0cmlidXRlKCkgZm9yIGJyb3dzZXItdW5yZWNvZ25pemVkIG5hbWVzcGFjZXMgZS5nLiBcIngtc2NoZW1hXCIuICovXG4gICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXJyYXlQb3AoRE9NUHVyaWZ5LnJlbW92ZWQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH1cbiAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgX2V4ZWN1dGVIb29rcyhob29rcy5hZnRlclNhbml0aXplQXR0cmlidXRlcywgY3VycmVudE5vZGUsIG51bGwpO1xuICB9O1xuICAvKipcbiAgICogX3Nhbml0aXplU2hhZG93RE9NXG4gICAqXG4gICAqIEBwYXJhbSBmcmFnbWVudCB0byBpdGVyYXRlIG92ZXIgcmVjdXJzaXZlbHlcbiAgICovXG4gIGNvbnN0IF9zYW5pdGl6ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uIF9zYW5pdGl6ZVNoYWRvd0RPTShmcmFnbWVudCkge1xuICAgIGxldCBzaGFkb3dOb2RlID0gbnVsbDtcbiAgICBjb25zdCBzaGFkb3dJdGVyYXRvciA9IF9jcmVhdGVOb2RlSXRlcmF0b3IoZnJhZ21lbnQpO1xuICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLmJlZm9yZVNhbml0aXplU2hhZG93RE9NLCBmcmFnbWVudCwgbnVsbCk7XG4gICAgd2hpbGUgKHNoYWRvd05vZGUgPSBzaGFkb3dJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2tzKGhvb2tzLnVwb25TYW5pdGl6ZVNoYWRvd05vZGUsIHNoYWRvd05vZGUsIG51bGwpO1xuICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgIF9zYW5pdGl6ZUVsZW1lbnRzKHNoYWRvd05vZGUpO1xuICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcyBuZXh0ICovXG4gICAgICBfc2FuaXRpemVBdHRyaWJ1dGVzKHNoYWRvd05vZGUpO1xuICAgICAgLyogRGVlcCBzaGFkb3cgRE9NIGRldGVjdGVkICovXG4gICAgICBpZiAoc2hhZG93Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICBfc2FuaXRpemVTaGFkb3dET00oc2hhZG93Tm9kZS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgIF9leGVjdXRlSG9va3MoaG9va3MuYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSwgZnJhZ21lbnQsIG51bGwpO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBET01QdXJpZnkuc2FuaXRpemUgPSBmdW5jdGlvbiAoZGlydHkpIHtcbiAgICBsZXQgY2ZnID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgbGV0IGltcG9ydGVkTm9kZSA9IG51bGw7XG4gICAgbGV0IGN1cnJlbnROb2RlID0gbnVsbDtcbiAgICBsZXQgcmV0dXJuTm9kZSA9IG51bGw7XG4gICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzdHJpbmcgdG8gc2FuaXRpemUuXG4gICAgICBETyBOT1QgcmV0dXJuIGVhcmx5LCBhcyB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGlmXG4gICAgICB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgRE9NIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZyAqL1xuICAgIElTX0VNUFRZX0lOUFVUID0gIWRpcnR5O1xuICAgIGlmIChJU19FTVBUWV9JTlBVVCkge1xuICAgICAgZGlydHkgPSAnPCEtLT4nO1xuICAgIH1cbiAgICAvKiBTdHJpbmdpZnksIGluIGNhc2UgZGlydHkgaXMgYW4gb2JqZWN0ICovXG4gICAgaWYgKHR5cGVvZiBkaXJ0eSAhPT0gJ3N0cmluZycgJiYgIV9pc05vZGUoZGlydHkpKSB7XG4gICAgICBpZiAodHlwZW9mIGRpcnR5LnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRpcnR5ID0gZGlydHkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ2RpcnR5IGlzIG5vdCBhIHN0cmluZywgYWJvcnRpbmcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdHlwZUVycm9yQ3JlYXRlKCd0b1N0cmluZyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBSZXR1cm4gZGlydHkgSFRNTCBpZiBET01QdXJpZnkgY2Fubm90IHJ1biAqL1xuICAgIGlmICghRE9NUHVyaWZ5LmlzU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuICAgIC8qIEFzc2lnbiBjb25maWcgdmFycyAqL1xuICAgIGlmICghU0VUX0NPTkZJRykge1xuICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgfVxuICAgIC8qIENsZWFuIHVwIHJlbW92ZWQgZWxlbWVudHMgKi9cbiAgICBET01QdXJpZnkucmVtb3ZlZCA9IFtdO1xuICAgIC8qIENoZWNrIGlmIGRpcnR5IGlzIGNvcnJlY3RseSB0eXBlZCBmb3IgSU5fUExBQ0UgKi9cbiAgICBpZiAodHlwZW9mIGRpcnR5ID09PSAnc3RyaW5nJykge1xuICAgICAgSU5fUExBQ0UgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICAvKiBEbyBzb21lIGVhcmx5IHByZS1zYW5pdGl6YXRpb24gdG8gYXZvaWQgdW5zYWZlIHJvb3Qgbm9kZXMgKi9cbiAgICAgIGlmIChkaXJ0eS5ub2RlTmFtZSkge1xuICAgICAgICBjb25zdCB0YWdOYW1lID0gdHJhbnNmb3JtQ2FzZUZ1bmMoZGlydHkubm9kZU5hbWUpO1xuICAgICAgICBpZiAoIUFMTE9XRURfVEFHU1t0YWdOYW1lXSB8fCBGT1JCSURfVEFHU1t0YWdOYW1lXSkge1xuICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgncm9vdCBub2RlIGlzIGZvcmJpZGRlbiBhbmQgY2Fubm90IGJlIHNhbml0aXplZCBpbi1wbGFjZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaXJ0eSBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgIC8qIElmIGRpcnR5IGlzIGEgRE9NIGVsZW1lbnQsIGFwcGVuZCB0byBhbiBlbXB0eSBkb2N1bWVudCB0byBhdm9pZFxuICAgICAgICAgZWxlbWVudHMgYmVpbmcgc3RyaXBwZWQgYnkgdGhlIHBhcnNlciAqL1xuICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoJzwhLS0tLT4nKTtcbiAgICAgIGltcG9ydGVkTm9kZSA9IGJvZHkub3duZXJEb2N1bWVudC5pbXBvcnROb2RlKGRpcnR5LCB0cnVlKTtcbiAgICAgIGlmIChpbXBvcnRlZE5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRS5lbGVtZW50ICYmIGltcG9ydGVkTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgIC8qIE5vZGUgaXMgYWxyZWFkeSBhIGJvZHksIHVzZSBhcyBpcyAqL1xuICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICBib2R5LmFwcGVuZENoaWxkKGltcG9ydGVkTm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEV4aXQgZGlyZWN0bHkgaWYgd2UgaGF2ZSBub3RoaW5nIHRvIGRvICovXG4gICAgICBpZiAoIVJFVFVSTl9ET00gJiYgIVNBRkVfRk9SX1RFTVBMQVRFUyAmJiAhV0hPTEVfRE9DVU1FTlQgJiZcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgZGlydHkuaW5kZXhPZignPCcpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzUG9saWN5ICYmIFJFVFVSTl9UUlVTVEVEX1RZUEUgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSkgOiBkaXJ0eTtcbiAgICAgIH1cbiAgICAgIC8qIEluaXRpYWxpemUgdGhlIGRvY3VtZW50IHRvIHdvcmsgb24gKi9cbiAgICAgIGJvZHkgPSBfaW5pdERvY3VtZW50KGRpcnR5KTtcbiAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBET00gbm9kZSBmcm9tIHRoZSBkYXRhICovXG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgcmV0dXJuIFJFVFVSTl9ET00gPyBudWxsIDogUkVUVVJOX1RSVVNURURfVFlQRSA/IGVtcHR5SFRNTCA6ICcnO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBub2RlIChvdXJzKSBpZiBGT1JDRV9CT0RZIGlzIHNldCAqL1xuICAgIGlmIChib2R5ICYmIEZPUkNFX0JPRFkpIHtcbiAgICAgIF9mb3JjZVJlbW92ZShib2R5LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICAvKiBHZXQgbm9kZSBpdGVyYXRvciAqL1xuICAgIGNvbnN0IG5vZGVJdGVyYXRvciA9IF9jcmVhdGVOb2RlSXRlcmF0b3IoSU5fUExBQ0UgPyBkaXJ0eSA6IGJvZHkpO1xuICAgIC8qIE5vdyBzdGFydCBpdGVyYXRpbmcgb3ZlciB0aGUgY3JlYXRlZCBkb2N1bWVudCAqL1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgX3Nhbml0aXplRWxlbWVudHMoY3VycmVudE5vZGUpO1xuICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcyBuZXh0ICovXG4gICAgICBfc2FuaXRpemVBdHRyaWJ1dGVzKGN1cnJlbnROb2RlKTtcbiAgICAgIC8qIFNoYWRvdyBET00gZGV0ZWN0ZWQsIHNhbml0aXplIGl0ICovXG4gICAgICBpZiAoY3VycmVudE5vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKGN1cnJlbnROb2RlLmNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB3ZSBzYW5pdGl6ZWQgYGRpcnR5YCBpbi1wbGFjZSwgcmV0dXJuIGl0LiAqL1xuICAgIGlmIChJTl9QTEFDRSkge1xuICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cbiAgICAvKiBSZXR1cm4gc2FuaXRpemVkIHN0cmluZyBvciBET00gKi9cbiAgICBpZiAoUkVUVVJOX0RPTSkge1xuICAgICAgaWYgKFJFVFVSTl9ET01fRlJBR01FTlQpIHtcbiAgICAgICAgcmV0dXJuTm9kZSA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQuY2FsbChib2R5Lm93bmVyRG9jdW1lbnQpO1xuICAgICAgICB3aGlsZSAoYm9keS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgIHJldHVybk5vZGUuYXBwZW5kQ2hpbGQoYm9keS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuTm9kZSA9IGJvZHk7XG4gICAgICB9XG4gICAgICBpZiAoQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3QgfHwgQUxMT1dFRF9BVFRSLnNoYWRvd3Jvb3Rtb2RlKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgQWRvcHROb2RlKCkgaXMgbm90IHVzZWQgYmVjYXVzZSBpbnRlcm5hbCBzdGF0ZSBpcyBub3QgcmVzZXRcbiAgICAgICAgICAoZS5nLiB0aGUgcGFzdCBuYW1lcyBtYXAgb2YgYSBIVE1MRm9ybUVsZW1lbnQpLCB0aGlzIGlzIHNhZmVcbiAgICAgICAgICBpbiB0aGVvcnkgYnV0IHdlIHdvdWxkIHJhdGhlciBub3QgcmlzayBhbm90aGVyIGF0dGFjayB2ZWN0b3IuXG4gICAgICAgICAgVGhlIHN0YXRlIHRoYXQgaXMgY2xvbmVkIGJ5IGltcG9ydE5vZGUoKSBpcyBleHBsaWNpdGx5IGRlZmluZWRcbiAgICAgICAgICBieSB0aGUgc3BlY3MuXG4gICAgICAgICovXG4gICAgICAgIHJldHVybk5vZGUgPSBpbXBvcnROb2RlLmNhbGwob3JpZ2luYWxEb2N1bWVudCwgcmV0dXJuTm9kZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0dXJuTm9kZTtcbiAgICB9XG4gICAgbGV0IHNlcmlhbGl6ZWRIVE1MID0gV0hPTEVfRE9DVU1FTlQgPyBib2R5Lm91dGVySFRNTCA6IGJvZHkuaW5uZXJIVE1MO1xuICAgIC8qIFNlcmlhbGl6ZSBkb2N0eXBlIGlmIGFsbG93ZWQgKi9cbiAgICBpZiAoV0hPTEVfRE9DVU1FTlQgJiYgQUxMT1dFRF9UQUdTWychZG9jdHlwZSddICYmIGJvZHkub3duZXJEb2N1bWVudCAmJiBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZSAmJiBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICYmIHJlZ0V4cFRlc3QoRE9DVFlQRV9OQU1FLCBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lKSkge1xuICAgICAgc2VyaWFsaXplZEhUTUwgPSAnPCFET0NUWVBFICcgKyBib2R5Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lICsgJz5cXG4nICsgc2VyaWFsaXplZEhUTUw7XG4gICAgfVxuICAgIC8qIFNhbml0aXplIGZpbmFsIHN0cmluZyB0ZW1wbGF0ZS1zYWZlICovXG4gICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgYXJyYXlGb3JFYWNoKFtNVVNUQUNIRV9FWFBSLCBFUkJfRVhQUiwgVE1QTElUX0VYUFJdLCBleHByID0+IHtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBleHByLCAnICcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRSA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHNlcmlhbGl6ZWRIVE1MKSA6IHNlcmlhbGl6ZWRIVE1MO1xuICB9O1xuICBET01QdXJpZnkuc2V0Q29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBjZmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIF9wYXJzZUNvbmZpZyhjZmcpO1xuICAgIFNFVF9DT05GSUcgPSB0cnVlO1xuICB9O1xuICBET01QdXJpZnkuY2xlYXJDb25maWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgQ09ORklHID0gbnVsbDtcbiAgICBTRVRfQ09ORklHID0gZmFsc2U7XG4gIH07XG4gIERPTVB1cmlmeS5pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKHRhZywgYXR0ciwgdmFsdWUpIHtcbiAgICAvKiBJbml0aWFsaXplIHNoYXJlZCBjb25maWcgdmFycyBpZiBuZWNlc3NhcnkuICovXG4gICAgaWYgKCFDT05GSUcpIHtcbiAgICAgIF9wYXJzZUNvbmZpZyh7fSk7XG4gICAgfVxuICAgIGNvbnN0IGxjVGFnID0gdHJhbnNmb3JtQ2FzZUZ1bmModGFnKTtcbiAgICBjb25zdCBsY05hbWUgPSB0cmFuc2Zvcm1DYXNlRnVuYyhhdHRyKTtcbiAgICByZXR1cm4gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpO1xuICB9O1xuICBET01QdXJpZnkuYWRkSG9vayA9IGZ1bmN0aW9uIChlbnRyeVBvaW50LCBob29rRnVuY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIGhvb2tGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhcnJheVB1c2goaG9va3NbZW50cnlQb2ludF0sIGhvb2tGdW5jdGlvbik7XG4gIH07XG4gIERPTVB1cmlmeS5yZW1vdmVIb29rID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQpIHtcbiAgICByZXR1cm4gYXJyYXlQb3AoaG9va3NbZW50cnlQb2ludF0pO1xuICB9O1xuICBET01QdXJpZnkucmVtb3ZlSG9va3MgPSBmdW5jdGlvbiAoZW50cnlQb2ludCkge1xuICAgIGhvb2tzW2VudHJ5UG9pbnRdID0gW107XG4gIH07XG4gIERPTVB1cmlmeS5yZW1vdmVBbGxIb29rcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBob29rcyA9IF9jcmVhdGVIb29rc01hcCgpO1xuICB9O1xuICByZXR1cm4gRE9NUHVyaWZ5O1xufVxudmFyIHB1cmlmeSA9IGNyZWF0ZURPTVB1cmlmeSgpO1xuXG5leHBvcnQgeyBwdXJpZnkgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVyaWZ5LmVzLm1qcy5tYXBcbiIsImltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5J1xuXG5sZXQgX3Nhbml0aXplSFRNTFxubGV0IGlzQ29uZmlndXJlZCA9IGZhbHNlXG5cbmNvbnN0IHNhbml0aXplSFRNTENvbmZpZ3VyZSA9IChjb25maWcpID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICBpZiAoY29uZmlnLnN0cmljdCkge1xuICAgICAgaWYgKHdpbmRvdy50cnVzdGVkVHlwZXMpIHtcbiAgICAgICAgY29uc3QgcG9saWN5ID0gd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koJ2RlZmF1bHQnLCB7XG4gICAgICAgICAgY3JlYXRlSFRNTDogKHRvX2VzY2FwZSkgPT4gRE9NUHVyaWZ5LnNhbml0aXplKHRvX2VzY2FwZSwgeyBSRVRVUk5fVFJVU1RFRF9UWVBFOiBmYWxzZSB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gcG9saWN5LmNyZWF0ZUhUTUwoaHRtbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gRE9NUHVyaWZ5LnNhbml0aXplKGh0bWwpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gaHRtbCAvLyBObyBzYW5pdGl6YXRpb24gaWYgbm90IHJlcXVpcmVkXG4gICAgfVxuICAgIGlzQ29uZmlndXJlZCA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLndhcm4oJ3Nhbml0aXplSFRNTCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQuIFJlY29uZmlndXJhdGlvbiBpcyBub3QgYWxsb3dlZC4nKVxuICB9XG59XG5cbmNvbnN0IHNhbml0aXplSFRNTCA9IChodG1sKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzYW5pdGl6ZUhUTUwgaXMgbm90IGNvbmZpZ3VyZWQuIENhbGwgc2FuaXRpemVIVE1MQ29uZmlndXJlKCkgd2l0aCBhcHByb3ByaWF0ZSBjb25maWcuJylcbiAgfVxuICByZXR1cm4gX3Nhbml0aXplSFRNTChodG1sKVxufVxuXG5leHBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfVxuZXhwb3J0IGRlZmF1bHQgc2FuaXRpemVIVE1MXG4iLCJpbXBvcnQgeyBpbmNsdWRlcywgX18sIGlmRWxzZSwgcGF0aCwgcHJvcCwgcmVqZWN0LCBpcywgaXNOaWwsIGlzRW1wdHkgfSBmcm9tICdyYW1kYSdcbmltcG9ydCBzYW5pdGl6ZUhUTUwgZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUtaHRtbCdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuXG4vKipcbiAqIEBtb2R1bGUgRG9tRWxUZW1wbGF0ZVxuICogQHR5cGUgdXRpbFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICpcbiAqIEBkZXNjIERvbUVsZW1lbnQgdXNlcyB0aGlzIGNsYXNzIHdoZW4gcmVuZGVyaW5nIHRlbXBsYXRlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+QWNjZXNzaW5nIHByb3BlcnRpZXMgdXNpbmcgYSBkb3VibGUgYnJhY2tldCB7eyZuYnNwOyZuYnNwOyZuYnNwO319IGV4cHJlc3Npb248L2g0PlwiXVxuICogY29uc3QgZGF0YSA9IHt7bmFtZTpcIldvcmxkfX07XG4gKiBjb25zdCB0ZW1wbGF0ZSA9IGA8cD5IZWxsbyB7e25hbWV9fSE8L3A+YDtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDxwPkhlbGxvIFdvcmxkITwvcD5cbiAqXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiBUSVRMRVtcIjxoND5Mb29waW5nIHRocm91Z2ggYW4gYW4gYXJyYXkgb2Ygb2JqZWN0cyB1c2luZyBsb29wIHt7I2xvb3BQcm9wZXJ0eX19IHt7cHJvcGVydHl9fSB7ey9sb29wUHJvcGVydHl9fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSB7YW5pbWFsczogW1xuICogICB7YW5pbWFsOiAnY2F0Jywgc291bmQ6ICdtZW93J30sXG4gKiAgIHthbmltYWw6ICdkb2cnLCBzb3VuZDogJ3dvb2YnfSxcbiAqICAge2FuaW1hbDogJ2JpcmQnLCBzb3VuZDogdHdlZXQnfVxuICogXX07XG4gKlxuICogY29uc3QgdGVtcGxhdGUgPSBgXG4gKiA8dWw+XG4gKiB7eyNhbmltYWxzfX1cbiAqICAgPGxpPlRoZSB7e2FuaW1hbH19IHNheXMgJ3t7c291bmR9fScuPC9saT5cbiAqIHt7L2FuaW1hbHN9fVxuICogPC91bD5gO1xuICpcbiAqIHRoaXMucHJvcHMuZWwuYXBwZW5kQ2hpbGQobmV3XG4gKiBEb2NFbFRlbXBsYXRlKHRlbXBsYXRlLGRhdGEpLnJlbmRlckRvY0ZyYWcoKSk7XG4gKlxuICogLy8gT3V0cHV0c1xuICogPHVsPlxuICogICAgPGxpPlRoZSBjYXQgc2F5cyAnbWVvdycuPC9saT5cbiAqICAgIDxsaT5UaGUgZG9nIHNheXMgJ3dvb2YnLjwvbGk+XG4gKiAgICA8bGk+VGhlIGJpcmQgc2F5cyAndHdlZXQnLjwvbGk+XG4gKiA8L3VsPlxuICpcbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBsaXN0IGl0ZW1zIGluIGFuIGFycmF5IG9mIHVzaW5nIHt7I2Fyck5hbWV9fSAmbmJzcDsmbmJzcDt7ey59fSZuYnNwOyZuYnNwOyB7ey9hcnJOYW1lfX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0gIHtuYW1lOiAnSmFuZScsIHBldHM6IFsnTWlsbycsJ0x1bmEnLCdLaWtpJ119O1xuICogY29uc3QgdGVtcGxhdGUgPSBcIjxhcnRpY2xlPlxuICogICAgICAgICAgICAgICAgICA8aDM+V2VsY29tZSwge3tuYW1lfX0sIHlvdXIgcGV0cyBhcmU6PC9oMz5cbiAqICAgICAgICAgICAgICAgICAgPHVsPnt7I3BldHN9fVxuICogICAgICAgICAgICAgICAgICAgIDxsaT57ey59fSwgPC9saT5cbiAqICAgICAgICAgICAgICAgICAgICB7ey9wZXRzfX1cbiAqICAgICAgICAgICAgICAgICA8L3VsPjwvYXJ0aWNsZT5cIjtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDxhcnRpY2xlPlxuICogICA8aDM+V2VsY29tZSBKYW5lLCB5b3VyIHBldHMgYXJlOjwvaDM+XG4gKiAgICA8dWw+XG4gKiAgICAgICA8bGk+TWlsbzwvbGk+XG4gKiAgICAgICA8bGk+THVuYTwvbGk+XG4gKiAgICAgICA8bGk+S2lraTwvbGk+XG4gKiAgICA8L3VsPlxuICogPC9hcnRpY2xlPlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+TG9vcGluZyB0aHJvdWdoIGFuIGFycmF5IHdpdGggbm8gcHJvcGVydHkgbmFtZSB1c2luZyB7eyN9fSAmbmJzcDsmbmJzcDt7eyB9fSZuYnNwOyZuYnNwOyB7ey99fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSBbXG4gKiAgICAgIHtpdGVtOiAnQ29va2llJywgY2Fsb3JpZXM6IDE0Mn0sXG4gKiAgICAgIHtpdGVtOiAnQXBwbGUnLCAgY2Fsb3JpZXM6IDk1fSxcbiAqICAgICAge2l0ZW06ICdDaGVlc2UnLCBjYWxvcmllczogMTEzfV07XG4gKlxuICogY29uc3QgdGVtcGxhdGUgPSBgXG4gKiA8YXJ0aWNsZT5cbiAqIDxoMz5TbmFja3M6PC9oMz5cbiAqICAgPHVsPlxuICogICAgICB7eyN9fVxuICogICAgICA8bGk+e3tpdGVtfX0sIGNhbG9yaWVzOiB7e2NhbG9yaWVzfX08L2xpPlxuICogICAgICB7ey99fVxuICogICA8L3VsPlxuICogPC9hcnRpY2xlPlxuICogYDtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDxhcnRpY2xlPlxuICogICA8aDM+U25hY2tzPC9oMz5cbiAqICAgIDx1bD5cbiAqICAgICAgIDxsaT5Db29raWUsIGNhbG9yaWVzOiAxNDI8L2xpPlxuICogICAgICAgPGxpPkFwcGxlLCBjYWxvcmllczogOTU8L2xpPlxuICogICAgICAgPGxpPkNoZWVzZSwgY2Fsb3JpZXM6IDExMzwvbGk+XG4gKiAgICA8L3VsPlxuICogPC9hcnRpY2xlPlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+TG9vcGluZyB0aHJvdWdoIGFuIGFycmF5IHdpdGggbm8gcHJvcGVydHkgbmFtZSB1c2luZyB7eyN9fSAmbmJzcDsmbmJzcDt7eyAuIH19Jm5ic3A7Jm5ic3A7IHt7L319IGV4cHJlc3Npb248L2g0PlwiXVxuICogY29uc3QgZGF0YSA9IFsnVHlyaW9uJywgJ0FyeWEnLCAnSm9uIFNub3cnLCAnU2Fuc2EnXTtcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPGgzPk1haW4gR29UIENoYXJhY3RlcnM8L2gzPlxuICogPHVsPlxuICogIHt7I319XG4gKiAgIDxsaT57ey59fTwvbGk+XG4gKiAge3svfX1cbiAqICA8L3VsPic7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvL091dHB1dHNcbiAqIDxoMz5NYWluIEdvVCBDaGFyYWN0ZXJzPC9oMz5cbiAqIDx1bD5cbiAqICAgPGxpPlR5cmlvbjwvbGk+XG4gKiAgIDxsaT5BcnlhPC9saT5cbiAqICAgPGxpPkpvbiBTbm93PC9saT5cbiAqICAgPGxpPlNhbnNhPC9saT5cbiAqIDwvdWw+XG4gKlxuICpcbiAqL1xuXG5leHBvcnQgY2xhc3MgRG9tRWxlbWVudFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IodGVtcGxhdGUsIGRhdGEgPSB7fSkge1xuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLmZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKVxuICAgIHRoaXMuaXNQcm94eURhdGEgPSBkYXRhLl9fY21zX19pc1Byb3h5ID09PSB0cnVlXG5cbiAgICBjb25zdCBjaGVja0ZvckFycmF5RGF0YSA9ICgpID0+IHtcbiAgICAgIGlmIChpcyhBcnJheSwgZGF0YSkgPT09IHRydWUpIHtcbiAgICAgICAgZGF0YSA9IHsgc3B5bmVEYXRhOmRhdGEgfVxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5yZXBsYWNlKCd7ey99fScsICd7ey9zcHluZURhdGF9fScpXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7I319JywgJ3t7I3NweW5lRGF0YX19JylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0ZvckFycmF5RGF0YSgpXG5cbiAgICB0aGlzLnRlbXBsYXRlRGF0YSA9IGRhdGFcblxuICAgIGNvbnN0IHN0ckFyciA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXRTdHJpbmdBcnJheSh0aGlzLnRlbXBsYXRlKVxuXG4gICAgbGV0IHN0ck1hdGNoZXMgPSB0aGlzLnRlbXBsYXRlLm1hdGNoKERvbUVsZW1lbnRUZW1wbGF0ZS5maW5kVG1wbExvb3BzUkUoKSlcbiAgICBzdHJNYXRjaGVzID0gc3RyTWF0Y2hlcyA9PT0gbnVsbCA/IFtdIDogc3RyTWF0Y2hlc1xuXG4gICAgY29uc3QgcGFyc2VUbXBsTG9vcHNSRSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5wYXJzZVRtcGxMb29wc1JFKClcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BGbiA9ICB0aGlzLnBhcnNlVGhlVG1wbExvb3AuYmluZCh0aGlzKVxuXG4gICAgY29uc3QgbWFwVG1wbExvb3AgPSAoc3RyLCBkYXRhKSA9PiB7XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UocGFyc2VUbXBsTG9vcHNSRSwgcGFyc2VUbXBsTG9vcEZuKVxuICAgIH1cblxuICAgIGNvbnN0IGZpbmRUbXBsTG9vcHNQcmVkID0gaW5jbHVkZXMoX18sIHN0ck1hdGNoZXMpXG4gICAgY29uc3QgY2hlY2tGb3JNYXRjaGVzID0gaWZFbHNlKFxuICAgICAgZmluZFRtcGxMb29wc1ByZWQsXG4gICAgICBtYXBUbXBsTG9vcCxcbiAgICAgIHRoaXMuYWRkUGFyYW1zLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLmZpbmFsQXJyID0gc3RyQXJyLm1hcChjaGVja0Zvck1hdGNoZXMpXG4gIH1cblxuICBzdGF0aWMgaXNQcmltaXRpdmVUYWcoc3RyKSB7XG4gICAgcmV0dXJuIC8oe3tcXC5cXCo/fX0pLy50ZXN0KHN0cilcbiAgfVxuXG4gIC8vIEZJTkQgQ09SUkVDVCBORVNURUQgREFUQVxuICBzdGF0aWMgZ2V0TmVzdGVkRGF0YVJlZHVjZXIoZGF0YSA9IHt9LCBwYXJhbSA9ICcnKSB7XG4gICAgY29uc3QgZGF0YVJlZHVjZXIgPSAobmVzdGVkRGF0YSwgc3RyKSA9PiB7XG4gICAgICBpZiAobmVzdGVkRGF0YVtzdHJdKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWREYXRhW3N0cl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgbmVzdGVkRGF0YSA9PT0gJ3N0cmluZycgPyBuZXN0ZWREYXRhIDogJydcbiAgICB9XG5cbiAgICByZXR1cm4gLyhcXC4pL2dtLnRlc3QoU3RyaW5nKHBhcmFtKSkgPyBTdHJpbmcocGFyYW0pLnNwbGl0KCcuJykucmVkdWNlKGRhdGFSZWR1Y2VyLCBkYXRhKSA6IGRhdGFbcGFyYW1dID8/ICcnXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyaW5nQXJyYXkodGVtcGxhdGUpIHtcbiAgICBjb25zdCBzdHJBcnIgPSB0ZW1wbGF0ZS5zcGxpdChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgY29uc3QgZW1wdHlSRSA9IC9eKFtcXFxcblxcc1xcV10rKSQvXG4gICAgY29uc3QgZmlsdGVyT3V0RW1wdHlTdHJpbmdzID0gcyA9PiBzLm1hdGNoKGVtcHR5UkUpXG4gICAgY29uc3QgZmluYWxTdHIgPSAgcmVqZWN0KGZpbHRlck91dEVtcHR5U3RyaW5ncywgc3RyQXJyKVxuXG4gICAgcmV0dXJuIGZpbmFsU3RyXG4gIH1cblxuICBzdGF0aWMgZmluZFRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7I1tcXHcuXSt9fVtcXHdcXG5cXHNcXFddKz97e1xcL1tcXHcuXSt9fSkvZ21cbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7IyhbXFx3Ll0rKX19KShbXFx3XFxuXFxzXFxXXSs/KSh7e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgc3RhdGljIHN3YXBQYXJhbXNGb3JUYWdzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3spKC4qPykofX0pL2dtXG4gIH1cblxuICByZW1vdmVUaGlzKCkge1xuICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmluYWxBcnIgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGVtcGxhdGVEYXRhID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjIFJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIGFueSBhZGRlZCBkYXRhLlxuICAgKi9cblxuICByZW5kZXJEb2NGcmFnKCkge1xuICAgIGxldCBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnJlcGxhY2VJbWdQYXRoKHRoaXMuZmluYWxBcnIuam9pbignJykpXG4gICAgLy8gaHRtbCA9IHNhbml0aXplSFRNTCh0aGlzLmZpbmFsQXJyLmpvaW4oJycpKVxuICAgIGh0bWwgPSBzYW5pdGl6ZUhUTUwoaHRtbClcbiAgICBjb25zdCBpc1RhYmxlU3ViVGFnID0gICAvXihbXj5dKj8pKDwpezF9KFxcYikodGhlYWR8Y29sfGNvbGdyb3VwfHRib2R5fHRkfHRmb290fHRyfHRoKShcXGIpKFteXFwwXSopJC8udGVzdChodG1sKVxuICAgIGNvbnN0IGVsID0gaXNUYWJsZVN1YlRhZyA/IGh0bWwgOiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKVxuXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgcmVuZGVyVG9TdHJpbmcoKSB7XG4gICAgbGV0IGh0bWwgPSB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gICAgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aChodG1sKVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmVtb3ZlVGhpcywgMilcbiAgICByZXR1cm4gaHRtbFxuICB9XG5cbiAgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxBcnIuam9pbignJylcbiAgfVxuXG4gIGZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIFsnU0NSSVBUJywgJ1RFTVBMQVRFJ10uaW5jbHVkZXMocHJvcCgnbm9kZU5hbWUnLCB0ZW1wbGF0ZSkpID09PSB0cnVlID8gdGVtcGxhdGUuaW5uZXJIVE1MIDogdGVtcGxhdGVcbiAgfVxuXG4gIGdldERhdGFWYWxGcm9tUGF0aFN0cihwYXRoU3RyLCBkYXRhRmlsZSkge1xuICAgIGNvbnN0IHBhdGhBcnIgPSBTdHJpbmcocGF0aFN0cikuc3BsaXQoJy4nKVxuICAgIGNvbnN0IHBhdGhEYXRhID0gcGF0aChwYXRoQXJyLCBkYXRhRmlsZSlcbiAgICByZXR1cm4gcGF0aERhdGEgfHwgJydcbiAgfVxuXG4gIGFkZFBhcmFtcyhzdHIpIHtcbiAgICBjb25zdCByZXBsYWNlVGFncyA9IChzdHIsIHAxLCBwMiwgcDMpID0+IHtcbiAgICAgIHJldHVybiBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIodGhpcy50ZW1wbGF0ZURhdGEsIHAyKVxuICAgIH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgcmVwbGFjZVRhZ3MpXG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZUltZ1BhdGgodGVtcGxhdGVTdHIpIHtcbiAgICBjb25zdCB7IElNR19QQVRIIH0gPSBTcHluZUFwcFByb3BlcnRpZXNcbiAgICBpZiAoSU1HX1BBVEggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGVtcGxhdGVTdHIgPSB0ZW1wbGF0ZVN0ci5yZXBsYWNlQWxsKC9zcmNcXHMqPVxccyooWydcIl0paW1nc1xcLy9nLCBgc3JjPSQxJHtJTUdfUEFUSH1gKVxuICAgICAgcmV0dXJuIHRlbXBsYXRlU3RyLnJlcGxhY2VBbGwoL3VybFxcKFxccyooWydcIl0/KWltZ3NcXC8vZywgYHVybCgkMSR7SU1HX1BBVEh9YClcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlU3RyXG4gIH1cblxuICBwYXJzZVRoZVRtcGxMb29wKHN0ciwgcDEsIHAyLCBwMykge1xuICAgIC8vIGNvbnN0IGRvdENvbnZlcnRlciA9IHN0ciA9PiBgJHtzdHIucmVwbGFjZSgvKFxcLikvZywgJ11bJyl9YFxuICAgIGNvbnN0IHJlRG90ID0gLyhcXC4pL2dtXG4gICAgY29uc3Qgc3ViU3RyID0gcDNcblxuICAgIC8qICAgICBjb25zdCBkYXRhUmVkdWNlciA9IChhY2MsIHN0cikgPT4ge1xuICAgICAgYWNjID0gYWNjW3N0cl1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9ICovXG5cbiAgICBsZXQgZWxEYXRhID0gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHRoaXMudGVtcGxhdGVEYXRhLCBwMilcblxuICAgIGNvbnN0IGFycmF5U3RyaW5nVG9PYmpBZGFwdGVyID0gKGQsIHN0ciwgaSkgPT4ge1xuICAgICAgLy8gSUYge3sufX0gUlVOIHBhcnNlU3RyaW5nXG4gICAgICBpZiAoRG9tRWxlbWVudFRlbXBsYXRlLmlzUHJpbWl0aXZlVGFnKHN0cikpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nKGQsIHN0ciwgaSlcbiAgICAgIH1cblxuICAgICAgLy8gQ1JFQVRFIERBVEEgT0JKIC0tIENIRUNLIFRPIEFERCBQUk9YWSBWQUxVRVNcbiAgICAgIGNvbnN0IGNyZWF0ZURhdGFPYmogPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNweW5lTG9vcEtleSA9IGRcbiAgICAgICAgY29uc3QgbG9vcEluZGV4ID0gaVxuICAgICAgICBjb25zdCBsb29wTnVtID0gaSArIDFcblxuICAgICAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSkge1xuICAgICAgICAgIGNvbnN0IF9fY21zX19kYXRhSWQgPSBlbERhdGEuX19jbXNfX2RhdGFJZFxuICAgICAgICAgIGNvbnN0IGtleUlkU3RyID0gYF9fY21zX19rZXlGb3JfJHtkfWBcbiAgICAgICAgICBjb25zdCBvcmlnS2V5ID0gZWxEYXRhW2tleUlkU3RyXVxuICAgICAgICAgIHJldHVybiB7IHNweW5lTG9vcEtleSwgX19jbXNfX2RhdGFJZCwgb3JpZ0tleSwgbG9vcEluZGV4LCBsb29wTnVtLCBkIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcHluZUxvb3BLZXksIGxvb3BJbmRleCwgbG9vcE51bSB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZU9iamVjdChjcmVhdGVEYXRhT2JqKCksIHN0ciwgaSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVN0cmluZyA9IChpdGVtLCBzdHIsIGluZGV4LCBvcmlnSW5kZXgpID0+IHtcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShEb21FbGVtZW50VGVtcGxhdGUuc3dhcFBhcmFtc0ZvclRhZ3NSRSgpLCBpdGVtKVxuICAgIH1cblxuICAgIC8vIFBBUlNJTkcgQVJSQVlTIEFORCBPQkpFQ1RTXG4gICAgY29uc3QgcGFyc2VPYmplY3QgPSAob2JqLCBzdHIsIGkpID0+IHtcbiAgICAgIC8vLyBMT09QIE5VTUJFUiBWQUxVRVMgQVVUTyBBRERFRFxuXG4gICAgICAvLyBjb25zdCBsb29wSW5kZXggPSBpO1xuICAgICAgLy8gY29uc3QgbG9vcE51bSA9IGkrMTtcblxuICAgICAgY29uc3QgbG9vcE9iaiA9IChzdHIsIHAxLCBwMikgPT4ge1xuICAgICAgICAvLyBET1QgU1lOVEFYIENIRUNLXG4gICAgICAgIGNvbnN0IGhhc2ggPSB7XG4gICAgICAgICAgbG9vcEluZGV4OiBpLFxuICAgICAgICAgIGxvb3BOdW06IGkgKyAxXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJRiB7ey59fVxuICAgICAgICBpZiAocmVEb3QudGVzdChwMikgPT09IGZhbHNlICYmIG9ialtwMl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBoYXNoW3AyXSAhPT0gdW5kZWZpbmVkID8gaGFzaFtwMl0gOiBvYmpbcDJdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhUmVkdWNlZFZhbCAgPSB0aGlzLmdldERhdGFWYWxGcm9tUGF0aFN0cihwMiwgb2JqKVxuICAgICAgICByZXR1cm4gaGFzaFtwMl0gIT09IHVuZGVmaW5lZCA/IGhhc2hbcDJdIDogZGF0YVJlZHVjZWRWYWxcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShEb21FbGVtZW50VGVtcGxhdGUuc3dhcFBhcmFtc0ZvclRhZ3NSRSgpLCBsb29wT2JqKVxuICAgIH1cblxuICAgIGNvbnN0IG1hcFN0cmluZ0RhdGEgPSAoZCwgaSkgPT4gdHlwZW9mIChkKSA9PT0gJ3N0cmluZycgPyBhcnJheVN0cmluZ1RvT2JqQWRhcHRlcihkLCBzdWJTdHIsIGkpIDogcGFyc2VPYmplY3QoZCwgc3ViU3RyLCBpKVxuXG4gICAgaWYgKGlzTmlsKGVsRGF0YSkgPT09IHRydWUgfHwgaXNFbXB0eShlbERhdGEpKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICBpZiAoZWxEYXRhLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbERhdGEgPSBbZWxEYXRhXVxuICAgIH1cblxuICAgIHJldHVybiBlbERhdGEubWFwKG1hcFN0cmluZ0RhdGEpLmpvaW4oJycpXG4gIH1cbn1cbiIsImltcG9ydCB7IGJhc2VDb3JlTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2UtY29yZS1taXhpbnMnXG5pbXBvcnQgeyBEb21FbGVtZW50VGVtcGxhdGUgfSBmcm9tICcuL2RvbS1lbGVtZW50LXRlbXBsYXRlJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZSdcbmltcG9ydCB7IGlzLCBkZWZhdWx0VG8sIHBpY2ssIG1hcE9iakluZGV4ZWQsIGZvckVhY2hPYmpJbmRleGVkLCBwaXBlIH0gZnJvbSAncmFtZGEnXG5cbmNsYXNzIERvbUVsZW1lbnQge1xuICAvKipcbiAgICogQG1vZHVsZSBEb21FbGVtZW50XG4gICAqIEB0eXBlIHV0aWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhpcyBpcyB0aGUgVmlld1N0cmVhbSByZW5kZXJpbmcgZW5naW5lLjwvcD5cbiAgICogPHA+VGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgcHJvY2VzcyBmb3IgY3JlYXRpbmcgSFRNTEVsZW1lbnRzIHRoYXQgZG8gbm90IHJlcXVpcmUgdGhlIGxvZ2ljIGFuZCBvdmVyaGVhZCBvZiBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuPC9wPlxuICAgKiA8YnV0dG9uIGNsYXNzPSdtb2RhbC1idG4gYnRuIGJ0bi1ibHVlLXJlZicgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtbnVtPTgwMCBkYXRhLXZhbHVlPSdhdHRyaWJ1dGVzJz5WaWV3IEF0dHJpYnV0ZXM8L2J1dHRvbj5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lIHRoZSB0YWduYW1lIGZvciB0aGlzIGRvbSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyBhbnkgZG9tRWxlbWVudCBhdHRyaWJ1dGUgKGV4Y2VwdCBmb3IgY2xhc3MgKVxuICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IGRhdGEgc3RyaW5nIGZvciB0ZXh0IHRhZ3MgYW5kIGpzb24gZm9yIHRlbXBsYXRlc1xuICAgKiBAcGFyYW0ge3RlbXBsYXRlfSB0ZW1wbGF0ZVxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJvcHMudGFnTmFtZSAtID0gJ2Rpdic7IERlZmF1bHQgZm9yIHRhZ05hbWUuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcy5hdHRyaWJ1dGVzIC0gPSB7fTsgVGhpcyBjYW4gYmUgYW55IHZhbGlkIEhUTUwgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gdGFnTmFtZS5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd8T2JqZWN0fSBwcm9wcy5kYXRhID0gdW5kZWZpbmVkOyBUaGlzIGlzIGVpdGhlciBhIFN0cmluZyBmb3IgYW4gZWxlbWVudCBvciBKU09OIGRhdGEgb2JqZWN0IGZvciBhIHRlbXBsYXRlLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xIVE1MfSBwcm9wcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZDsgSWYgYSB0ZW1wbGF0ZSBpcyBkZWZpbmVkLCB0aGUgRG9tRWxlbWVudCB3aWxsIHVzZSBpdC5cbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIGNvbnN0IGNoZWNrRGVmYXVsdCA9IChkZmx0LCB2YWwpID0+IGRlZmF1bHRUbyhkZmx0KSh2YWwpXG5cbiAgICBwcm9wcy50YWdOYW1lID0gY2hlY2tEZWZhdWx0KCdkaXYnLCBwcm9wcy50YWdOYW1lKVxuXG4gICAgcHJvcHMuYXR0cmlidXRlcyA9IHByb3BzLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCA/IHByb3BzLmF0dHJpYnV0ZXMgOiB0aGlzLmdldERvbUF0dHJpYnV0ZXMocHJvcHMpXG4gICAgcHJvcHMuYXR0cnMgPSB0aGlzLnVwZGF0ZUF0dHJzKHByb3BzLmF0dHJpYnV0ZXMpXG5cbiAgICBwcm9wcy5mcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICB9XG5cbiAgc2V0UHJvcChrZXksIHZhbCkge1xuICAgIHRoaXMucHJvcHNba2V5XSA9IHZhbFxuICB9XG5cbiAgZ2V0UHJvcCh2YWwpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1t2YWxdXG4gIH1cblxuICBnZXQgZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZWxcbiAgfVxuXG4gIHNldEVsQXR0cnMoZWwsIHBhcmFtcykge1xuICAgIGNvbnN0IGFkZEF0dHJpYnV0ZXMgPSAodmFsLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGFkZFRvRGF0YXNldCA9ICh2YWwsIGtleSkgPT4geyBlbC5kYXRhc2V0W2tleV0gPSB2YWwgfVxuICAgICAgaWYgKGtleSA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKGFkZFRvRGF0YXNldCwgdmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdldFByb3AoJ2F0dHJzJykuZm9yRWFjaChhZGRBdHRyaWJ1dGVzKVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgdXBkYXRlQXR0cnMocGFyYW1zLCBtKSB7XG4gICAgY29uc3QgdGhlTWFwID0gbSAhPT0gdW5kZWZpbmVkID8gbSA6IG5ldyBNYXAoKVxuICAgIGNvbnN0IGFkZEF0dHJpYnV0ZXMgPSAodmFsLCBrZXkpID0+IHRoZU1hcC5zZXQoa2V5LCB2YWwpXG4gICAgbWFwT2JqSW5kZXhlZChhZGRBdHRyaWJ1dGVzLCBwYXJhbXMpXG4gICAgcmV0dXJuIHRoZU1hcFxuICB9XG5cbiAgYWRkVGVtcGxhdGUoZWwpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZ2V0UHJvcCgndGVtcGxhdGUnKVxuXG4gICAgY29uc3QgYWRkVG1wbCA9ICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgbGV0IGRhdGEgPSB0aGlzLmdldFByb3AoJ2RhdGEnKVxuICAgICAgZGF0YSA9IGlzKE9iamVjdCwgZGF0YSkgPyBkYXRhIDoge31cbiAgICAgIGNvbnN0IGZyYWcgPSBuZXcgRG9tRWxlbWVudFRlbXBsYXRlKHRlbXBsYXRlLCBkYXRhKS5yZW5kZXJEb2NGcmFnKClcbiAgICAgIGNvbnN0IGZyYWdJc1N0cmluZyA9IGlzKFN0cmluZywgZnJhZylcbiAgICAgIGZyYWdJc1N0cmluZyA/IGVsLmlubmVySFRNTCA9IGZyYWcgOiBlbC5hcHBlbmRDaGlsZChmcmFnKVxuICAgICAgcmV0dXJuIGVsXG4gICAgfVxuICAgIGNvbnN0IGRvTm90aGluZyA9IChlbCkgPT4gZWxcbiAgICByZXR1cm4gdGVtcGxhdGUgIT09IHVuZGVmaW5lZCA/IGFkZFRtcGwodGVtcGxhdGUpIDogZG9Ob3RoaW5nKGVsKVxuICB9XG5cbiAgY3JlYXRlRWxlbWVudCh0YWdOYW1lID0gJ2RpdicpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVxuICB9XG5cbiAgYWRkQ29udGVudChlbCkge1xuICAgIGNvbnN0IHRleHQgPSAodGhpcy5nZXRQcm9wKCdkYXRhJykpXG4gICAgY29uc3QgaXNUZXh0ID0gaXMoU3RyaW5nLCB0ZXh0KVxuICAgIGlmIChpc1RleHQgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHR4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpXG4gICAgICBlbC5hcHBlbmRDaGlsZCh0eHQpXG4gICAgfVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgZXhlY3V0ZSgpIHtcbiAgICBjb25zdCBlbCA9IHBpcGUoXG4gICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuc2V0RWxBdHRycy5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5hZGRUZW1wbGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5hZGRDb250ZW50LmJpbmQodGhpcylcbiAgICApKHRoaXMuZ2V0UHJvcCgndGFnTmFtZScpKVxuICAgIC8vIHRoaXMuZ2V0UHJvcCgnZnJhZ21lbnQnKS5hcHBlbmRDaGlsZChlbCk7XG4gICAgdGhpcy5wcm9wcy5lbCA9IGVsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCByZW5kZXIgdGhlIEhUTUwgRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IEhUTUxFbGVtZW50XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5leGVjdXRlKClcbiAgICB0aGlzLnByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5kYXRhID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5hdHRyaWJ1dGVzID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZWwnKVxuICB9XG5cbiAgcmVuZGVyVG9IVE1MU3RyaW5nKCkge1xuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgdGhpcy5wcm9wcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuZGF0YSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuYXR0cmlidXRlcyA9IHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2VsJykub3V0ZXJIVE1MXG4gIH1cblxuICByZXR1cm5JZkRlZmluZWQob2JqLCB2YWwpIHtcbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzT2JqID0gdHlwZW9mICh2YWwpID09PSAndW5kZWZpbmVkJ1xuICAgICAgaXNPYmogPT09IGZhbHNlID8gb2JqW3ZhbF0gPSB2YWwgOiBvYmpbdmFsXSA9IGRlZXBNZXJnZShvYmpbdmFsXSwgdmFsKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZXByb3BzKHZhbCkge1xuICAgIHRoaXMucmV0dXJuSWZEZWZpbmVkKHRoaXMucHJvcHMsIHZhbClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdXBkYXRlcHJvcHNBbmRSdW4odmFsKSB7XG4gICAgdGhpcy51cGRhdGVwcm9wcyh2YWwpXG4gICAgdGhpcy5leGVjdXRlKClcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdmcmFnbWVudCcpXG4gIH1cblxuICB1bm1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZ2V0UHJvcCgnZWwnKS5yZW1vdmUoKVxuICAgICAgdGhpcy5wcm9wcyA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5nYygpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVGFnKHRhZ05hbWUgPSAnZGl2JykgeyB0aGlzLnVwZGF0ZXByb3BzKHRhZ05hbWUpIH1cbiAgdXBkYXRlQXR0cmlidXRlcyhhdHRycyA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHMoYXR0cnMpIH1cbiAgdXBkYXRlVGVtcGxhdGUodGVtcGxhdGUpIHsgdGhpcy51cGRhdGVwcm9wcyh0ZW1wbGF0ZSkgfVxuICB1cGRhdGVEYXRhKGRhdGEgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzKGRhdGEpIH1cbiAgYWRkVGFnQW5kUmVuZGVyKHRhZ05hbWUgPSAnZGl2JykgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKHRhZ05hbWUpIH1cbiAgYWRkQXR0cnNpYnV0ZXNBbmRSZW5kZXIoYXR0cnMgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKGF0dHJzKSB9XG4gIGFkZFRlbXBsYXRlQW5kUmVuZGVyKHRlbXBsYXRlKSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4odGVtcGxhdGUpIH1cbiAgYWRkRGF0YUFuZFJlbmRlcihkYXRhID0ge30pIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bihkYXRhKSB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJBU0UgQ09SRSBNSVhJTlNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYWRkTWl4aW5zKCkge1xuICAgIGNvbnN0IGNvcmVNaXhpbnMgPSBiYXNlQ29yZU1peGlucygpXG4gICAgdGhpcy5nYyA9IGNvcmVNaXhpbnMuZ2MuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0RG9tQXR0cmlidXRlcyhwcm9wcykge1xuICAgIHJldHVybiBwaWNrKHRoaXMuYXR0cmlidXRlc0FycmF5LCBwcm9wcylcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdhY2NlcHQnLFxuICAgICAgJ2FjY2VwdC1jaGFyc2V0JyxcbiAgICAgICdhY2Nlc3NrZXknLFxuICAgICAgJ2FjdGlvbicsXG4gICAgICAnYWxpZ24nLFxuICAgICAgJ2FsbG93JyxcbiAgICAgICdhbHQnLFxuICAgICAgJ2FzeW5jJyxcbiAgICAgICdhdXRvY2FwaXRhbGl6ZScsXG4gICAgICAnYXV0b2NvbXBsZXRlJyxcbiAgICAgICdhdXRvZm9jdXMnLFxuICAgICAgJ2F1dG9wbGF5JyxcbiAgICAgICdiZ2NvbG9yJyxcbiAgICAgICdib3JkZXInLFxuICAgICAgJ2J1ZmZlcmVkJyxcbiAgICAgICdjaGFsbGVuZ2UnLFxuICAgICAgJ2NoYXJzZXQnLFxuICAgICAgJ2NoZWNrZWQnLFxuICAgICAgJ2NpdGUnLFxuICAgICAgJ2NsYXNzJyxcbiAgICAgICdjb2RlJyxcbiAgICAgICdjb2RlYmFzZScsXG4gICAgICAnY29sb3InLFxuICAgICAgJ2NvbHMnLFxuICAgICAgJ2NvbHNwYW4nLFxuICAgICAgJ2NvbnRlbnQnLFxuICAgICAgJ2NvbnRlbnRlZGl0YWJsZScsXG4gICAgICAnY29udGV4dG1lbnUnLFxuICAgICAgJ2NvbnRyb2xzJyxcbiAgICAgICdjb29yZHMnLFxuICAgICAgJ2Nyb3Nzb3JpZ2luJyxcbiAgICAgICdjc3AnLFxuICAgICAgJ2RhdGFzZXQnLFxuICAgICAgJ2RhdGV0aW1lJyxcbiAgICAgICdkZWNvZGluZycsXG4gICAgICAnZGVmYXVsdCcsXG4gICAgICAnZGVmZXInLFxuICAgICAgJ2RpcicsXG4gICAgICAnZGlybmFtZScsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgJ2Rvd25sb2FkJyxcbiAgICAgICdkcmFnZ2FibGUnLFxuICAgICAgJ2Ryb3B6b25lJyxcbiAgICAgICdlbmN0eXBlJyxcbiAgICAgICdmb3InLFxuICAgICAgJ2Zvcm0nLFxuICAgICAgJ2Zvcm1hY3Rpb24nLFxuICAgICAgJ2hlYWRlcnMnLFxuICAgICAgJ2hlaWdodCcsXG4gICAgICAnaGlkZGVuJyxcbiAgICAgICdoaWdoJyxcbiAgICAgICdocmVmJyxcbiAgICAgICdocmVmbGFuZycsXG4gICAgICAnaHR0cC1lcXVpdicsXG4gICAgICAnaWNvbicsXG4gICAgICAnaWQnLFxuICAgICAgJ2ltcG9ydGFuY2UnLFxuICAgICAgJ2ludGVncml0eScsXG4gICAgICAnaXNtYXAnLFxuICAgICAgJ2l0ZW1wcm9wJyxcbiAgICAgICdrZXl0eXBlJyxcbiAgICAgICdraW5kJyxcbiAgICAgICdsYWJlbCcsXG4gICAgICAnbGFuZycsXG4gICAgICAnbGFuZ3VhZ2UnLFxuICAgICAgJ2xhenlsb2FkJyxcbiAgICAgICdsaXN0JyxcbiAgICAgICdsb29wJyxcbiAgICAgICdsb3cnLFxuICAgICAgJ21hbmlmZXN0JyxcbiAgICAgICdtYXgnLFxuICAgICAgJ21heGxlbmd0aCcsXG4gICAgICAnbWlubGVuZ3RoJyxcbiAgICAgICdtZWRpYScsXG4gICAgICAnbWV0aG9kJyxcbiAgICAgICdtaW4nLFxuICAgICAgJ211bHRpcGxlJyxcbiAgICAgICdtdXRlZCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnbm92YWxpZGF0ZScsXG4gICAgICAnb3BlbicsXG4gICAgICAnb3B0aW11bScsXG4gICAgICAncGF0dGVybicsXG4gICAgICAncGluZycsXG4gICAgICAncGxhY2Vob2xkZXInLFxuICAgICAgJ3Bvc3RlcicsXG4gICAgICAncHJlbG9hZCcsXG4gICAgICAncmFkaW9ncm91cCcsXG4gICAgICAncmVhZG9ubHknLFxuICAgICAgJ3JlZmVycmVycG9saWN5JyxcbiAgICAgICdyZWwnLFxuICAgICAgJ3JlcXVpcmVkJyxcbiAgICAgICdyZXZlcnNlZCcsXG4gICAgICAncm93cycsXG4gICAgICAncm93c3BhbicsXG4gICAgICAnc2FuZGJveCcsXG4gICAgICAnc2NvcGUnLFxuICAgICAgJ3Njb3BlZCcsXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgJ3NoYXBlJyxcbiAgICAgICdzaXplJyxcbiAgICAgICdzaXplcycsXG4gICAgICAnc2xvdCcsXG4gICAgICAnc3BhbicsXG4gICAgICAnc3BlbGxjaGVjaycsXG4gICAgICAnc3JjJyxcbiAgICAgICdzcmNkb2MnLFxuICAgICAgJ3NyY2xhbmcnLFxuICAgICAgJ3NyY3NldCcsXG4gICAgICAnc3RhcnQnLFxuICAgICAgJ3N0ZXAnLFxuICAgICAgJ3N0eWxlJyxcbiAgICAgICdzdW1tYXJ5JyxcbiAgICAgICd0YWJpbmRleCcsXG4gICAgICAndGFyZ2V0JyxcbiAgICAgICd0aXRsZScsXG4gICAgICAndHJhbnNsYXRlJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICd1c2VtYXAnLFxuICAgICAgJ3ZhbHVlJyxcbiAgICAgICd3aWR0aCcsXG4gICAgICAnd3JhcCdcbiAgICBdXG4gIH1cbn1cbmNvbnN0IERvbUVsID0gRG9tRWxlbWVudFxuZXhwb3J0IHsgRG9tRWxlbWVudCwgRG9tRWwgfVxuIiwiY29uc3QgY3JlYXRlRmFkZXJJbmxpbmVUZXh0ID0gKGlzSW5Cb29sID0gZmFsc2UsIHQgPSAxLCBlID0gJ2Vhc2UnLCBzdGFydFplcm9Cb29sID0gZmFsc2UpID0+IHtcbiAgY29uc3QgaW5pdE9wYWNpdHlaZXJvID0gc3RhcnRaZXJvQm9vbCA9PT0gdHJ1ZSA/ICdvcGFjaXR5OjA7JyA6ICcnXG4gIGNvbnN0IG9wYWNpdHkgPSBpc0luQm9vbCA9PT0gdHJ1ZSA/IDEgOiAwXG4gIHJldHVybiBgJHtpbml0T3BhY2l0eVplcm99dHJhbnNpdGlvbjogb3BhY2l0eSAke3R9cyAke2V9OyBvcGFjaXR5OiAke29wYWNpdHl9O2Bcbn1cbmV4cG9ydCBmdW5jdGlvbiBmYWRlaW4oZWwsIHQpIHtcbiAgY29uc3QgY3VycmVudE9wYWNpdHkgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkub3BhY2l0eSAqIDFcbiAgY29uc3Qgc3RhcnRBdFplcm8gPSBjdXJyZW50T3BhY2l0eSA9PT0gMVxuICBjb25zdCBpbmxpbmVDc3MgPSBjcmVhdGVGYWRlcklubGluZVRleHQodHJ1ZSwgdCwgJ2Vhc2UnLCBzdGFydEF0WmVybylcbiAgZWwuc3R5bGUuY3NzVGV4dCArPSBpbmxpbmVDc3Ncbn1cbmV4cG9ydCBmdW5jdGlvbiBmYWRlb3V0KGVsLCB0LCBjYWxsYmFjaykge1xuICBjb25zdCBpbmxpbmVDc3MgPSBjcmVhdGVGYWRlcklubGluZVRleHQoZmFsc2UsIHQsICdlYXNlJylcbiAgZWwuc3R5bGUuY3NzVGV4dCArPSBpbmxpbmVDc3NcblxuICAvLyB3aW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgdCAqIDEwMDApO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgY2FsbGJhY2ssIGZhbHNlKVxufVxuIiwiaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgZmxpcCwgbWVyZ2VSaWdodCwgY2xvbmUsIGZvckVhY2gsIHByb3BTYXRpc2ZpZXMgfSBmcm9tICdyYW1kYSdcbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBWaWV3U3RyZWFtT2JzZXJ2YWJsZVxuICAgICAqIEB0eXBlIGludGVybmFsXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAZGVzY1xuICAgICAqIEludGVybmFsIG9ic2VydmFibGUgdGhhdCBjcmVhdGVzIHRoZSBWaWV3U3RyZWFtIE9ic2VydmFibGUgdGhhdCBicmFuY2hlcyBvdXQgdG8gcGFyZW50LCBpbnRlcm5hbCBhbmQgY2hpbGQgZGlyZWN0aW9uc1xuICAgICAqL1xuICAgIHRoaXMucHJvcHMub2JzZXJ2YWJsZVN0cmVhbXMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzKClcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEaXJlY3Rpb25hbEZpbHRlcnNPYmplY3QoKSB7XG4gICAgY29uc3QgZGlySW50ZXJuYWwgPSAnaW50ZXJuYWwnXG4gICAgY29uc3QgZGlyUGFyZW50ID0gJ3BhcmVudCdcbiAgICBjb25zdCBkaXJDaGlsZCA9ICdjaGlsZCdcbiAgICByZXR1cm4ge1xuICAgICAgUDogW2RpclBhcmVudF0sXG4gICAgICBDOiBbZGlyQ2hpbGRdLFxuICAgICAgUENJOiBbZGlyUGFyZW50LCBkaXJJbnRlcm5hbCwgZGlyQ2hpbGRdLFxuICAgICAgQ0k6IFtkaXJDaGlsZCwgZGlySW50ZXJuYWxdLFxuICAgICAgUEk6IFtkaXJQYXJlbnQsIGRpckludGVybmFsXSxcbiAgICAgIFBDOiBbZGlyUGFyZW50LCBkaXJDaGlsZF1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWRkRGVmYXVsdERpcihvYmopIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoeyAkZGlyOlsnaW50ZXJuYWwnXSB9LCBjbG9uZShvYmopKVxuICB9XG5cbiAgc3RhdGljIGFkZERvd25JbnRlcm5hbERpcihvYmosIGFyciA9IFsnaW50ZXJuYWwnLCAnZG93biddKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBmbGlwKG1lcmdlUmlnaHQpXG4gICAgcmV0dXJuIGRlZmF1bHRzKGNsb25lKG9iaiksIHsgJGRpcjphcnIgfSlcbiAgfVxuXG4gIHN0YXRpYyBhZGRDaGlsZEFuZEludGVybmFsRGlyKG9iaiwgYXJyID0gWydjaGlsZCcsICdkb3duJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoY2xvbmUob2JqKSwgeyAkZGlyOmFyciB9KVxuICB9XG5cbiAgc3RhdGljIG1hcFRvRGVmYXVsdERpcihwKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRGVmYXVsdERpcihwKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMob2JzJCA9IG5ldyBTdWJqZWN0KCksIHZpZXdOYW1lLCB2c2lkKSB7XG4gICAgaWYgKHZpZXdOYW1lICE9PSB1bmRlZmluZWQgJiYgdnNpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYnMkLnZpZXdOYW1lID0gdmlld05hbWVcbiAgICAgIG9icyQudnNpZCA9IHZzaWRcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJTdHJlYW1zID0gdmFsID0+IHByb3BTYXRpc2ZpZXMoYXJyVHlwZSA9PiBhcnJUeXBlLmluY2x1ZGVzKHZhbCksICckZGlyJylcbiAgICBjb25zdCBmaWx0ZXJQYXJlbnQgPSBmaWx0ZXJTdHJlYW1zKCdwYXJlbnQnKVxuICAgIGNvbnN0IGZpbHRlckNoaWxkID0gZmlsdGVyU3RyZWFtcygnY2hpbGQnKVxuICAgIGNvbnN0IGZpbHRlckludGVybmFsID0gZmlsdGVyU3RyZWFtcygnaW50ZXJuYWwnKVxuXG4gICAgY29uc3QgYWRkZnJvbSQgPSByZWxTdHIgPT4gbWVyZ2VSaWdodCh7IGZyb20kOnJlbFN0ciB9KVxuICAgIGNvbnN0IGFkZFBhcmVudGZyb20kID0gYWRkZnJvbSQoJ2NoaWxkJylcbiAgICBjb25zdCBhZGRJbnRlcm5hbGZyb20kID0gYWRkZnJvbSQoJ2ludGVybmFsJylcbiAgICBjb25zdCBhZGRDaGlsZGZyb20kID0gYWRkZnJvbSQoJ3BhcmVudCcpXG5cbiAgICBjb25zdCByYXckID0gIG9icyRcbiAgICAgIC5waXBlKGZpbHRlcigocGF5bG9hZCkgPT4gcGF5bG9hZCAhPT0gdW5kZWZpbmVkICYmIHBheWxvYWQuYWN0aW9uICE9PSB1bmRlZmluZWQpKVxuXG4gICAgY29uc3QgdG9JbnRlcm5hbCQgPSBvYnMkLnBpcGUoZmlsdGVyKGZpbHRlckludGVybmFsKSwgbWFwKGFkZEludGVybmFsZnJvbSQpKVxuICAgIGNvbnN0IHRvUGFyZW50JCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVyUGFyZW50KSwgbWFwKGFkZFBhcmVudGZyb20kKSlcbiAgICBjb25zdCB0b0NoaWxkJCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVyQ2hpbGQpLCBtYXAoYWRkQ2hpbGRmcm9tJCkpXG5cbiAgICBjb25zdCBzdHJlYW1PYmogPSB7XG4gICAgICBwYXJlbnQ6IHRvUGFyZW50JCxcbiAgICAgIGludGVybmFsOiB0b0ludGVybmFsJCxcbiAgICAgIGNoaWxkOiB0b0NoaWxkJFxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlU3RyZWFtID0gKGFyciA9IFtdKSA9PiB7XG4gICAgICBjb25zdCBlbmRTdHJlYW0gPSBvID0+IHtcbiAgICAgICAgby5jb21wbGV0ZSgpXG4gICAgICAgIG8uaXNTdG9wcGVkID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXRDb21wbGV0ZVN0cmVhbSA9IChzdHIpID0+IHtcbiAgICAgICAgaWYgKHN0cmVhbU9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBvYnMkID0gc3RyZWFtT2JqW3N0cl1cbiAgICAgICAgICBlbmRTdHJlYW0ob2JzJClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJyICE9PSB1bmRlZmluZWQgJiYgYXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIGFyci5mb3JFYWNoKHNldENvbXBsZXRlU3RyZWFtKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZUFsbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlU3RyZWFtID0gbyA9PiB7XG4gICAgICAgIG8uY29tcGxldGUoKVxuICAgICAgICBvLmlzU3RvcHBlZCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGZvckVhY2goY29tcGxldGVTdHJlYW0sIFtyYXckLCB0b0ludGVybmFsJCwgdG9QYXJlbnQkLCB0b0NoaWxkJF0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJhdyQsIHRvSW50ZXJuYWwkLCB0b1BhcmVudCQsIHRvQ2hpbGQkLCBjb21wbGV0ZUFsbCwgY29tcGxldGVTdHJlYW1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IERvbUVsZW1lbnQgfSBmcm9tICcuL2RvbS1lbGVtZW50J1xuaW1wb3J0IHsgZmFkZWluLCBmYWRlb3V0IH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1hbmltYXRpb25zJ1xuaW1wb3J0IHsgVmlld1N0cmVhbU9ic2VydmFibGUgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZSdcbmltcG9ydCB7IFN1YmplY3QsIGJpbmRDYWxsYmFjayB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmaWx0ZXIsIGlzTmlsLCBwaWNrLCBwcm9wcywgZGVmYXVsdFRvIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1FbGVtZW50XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgY2xhc3MgdGhhdCBpcyBwYXJ0IG9mIHRoZSBWaWV3U3RyZWFtIG9ic2VydmFibGUgc3lzdGVtLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBzaW5rJFxuICAgKiBAcGFyYW0ge09iamVjdH0gdmlld1Byb3BzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2c2lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2c05hbWVcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpbmskLCB2aWV3UHJvcHMgPSB7fSwgdnNpZCA9ICcnLCB2c05hbWUgPSAndGhlTmFtZScpIHtcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgdGhpcy5fc3RhdGUgPSAnSU5JVCdcbiAgICB0aGlzLnZzaWQgPSB2c2lkXG4gICAgdGhpcy52c05hbWUgPSB2c05hbWVcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgZGVidWc6ZmFsc2UsXG4gICAgICBleHRlbmRlZEhhc2hNZXRob2RzOiB7fVxuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMgPSBkZWVwTWVyZ2UodGhpcy5kZWZhdWx0cywgdmlld1Byb3BzKVxuICAgIGNvbnN0IGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kID0gKGFycikgPT4ge1xuICAgICAgY29uc3QgW2FjdGlvbiwgZnVuY1N0cl0gPSBhcnJcbiAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRlZEhhc2hNZXRob2RzW2FjdGlvbl0gPSAocCkgPT4gdGhpc1tmdW5jU3RyXShwKVxuICAgIH1cbiAgICB0aGlzLmFkZEFjdGlvbkxpc3RlbmVycygpLmZvckVhY2goY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QpXG4gICAgdGhpcy5vcHRpb25zLmhhc2hNZXRob2RzID0gdGhpcy5zZXRIYXNoTWV0aG9kcyh0aGlzLm9wdGlvbnMuZXh0ZW5kZWRIYXNoTWV0aG9kcylcbiAgICB0aGlzLnNpbmskID0gc2luayRcbiAgICB0aGlzLnNpbmskXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25PYnNTaW5rU3Vic2NyaWJlLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLiRkaXJzID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KClcbiAgICB0aGlzLmFkZERlZmF1bHREaXIgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREZWZhdWx0RGlyXG4gICAgdGhpcy5zb3VyY2VTdHJlYW1zID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhuZXcgU3ViamVjdCgpLCB0aGlzLnZzTmFtZSwgdGhpcy52c2lkKVxuICAgIHRoaXMuX3NvdXJjZSQgPSB0aGlzLnNvdXJjZVN0cmVhbXMudG9JbnRlcm5hbCQgLy8gIG5ldyBTdWJqZWN0KCk7XG4gIH1cblxuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBzZXRIYXNoTWV0aG9kcyhleHRlbmRlZEhhc2hNZXRob2RzT2JqID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0SGFzaE1ldGhvZHMgPSB7XG4gICAgICBWU19ERVRSSVRVU19DT0xMRUNUICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25HYXJiYWdlQ29sbGVjdChwKSxcbiAgICAgIFJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25SZWFkeUZvckdDKHApLFxuICAgICAgRVhUSVJQQVRFICAgICAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkRpc3Bvc2UocCksXG4gICAgICBWU19TUEFXTiAgICAgICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyKHApLFxuICAgICAgVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlckFuZEF0dGFjaFRvUGFyZW50KHApLFxuICAgICAgVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00gICAgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlckFuZEF0dGFjaFRvRG9tKHApLFxuICAgICAgQVRUQUNIX0NISUxEX1RPX1NFTEYgICAgICAgICAgIDogKHApID0+IHRoaXMub25BdHRhY2hDaGlsZFRvU2VsZihwKVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlKGRlZmF1bHRIYXNoTWV0aG9kcywgZXh0ZW5kZWRIYXNoTWV0aG9kc09iailcbiAgfVxuXG4gIGNyZWF0ZURvbUl0ZW0oKSB7XG4gICAgdGhpcy5wcm9wcyA9IHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCA/IHRoaXMucHJvcHMgOiB7fVxuICAgIGNvbnN0IHJlbW92ZUlzTmlsID0gKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdHRycyA9IGZpbHRlcihyZW1vdmVJc05pbCwgcGljayhbJ2lkJywgJ2NsYXNzTmFtZSddLCB0aGlzLnByb3BzKSlcbiAgICBjb25zdCB7IHRhZ05hbWUsIGRhdGEsIHRlbXBsYXRlIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIG5ldyBEb21FbGVtZW50KHRhZ05hbWUsIGF0dHJzLCBkYXRhLCB0ZW1wbGF0ZSlcbiAgfVxuXG4gIG9uRGlzcG9zZUNvbXBsZXRlZChkKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2J2IHNlbGYgZGlzcG9zZWQgYWZ0ZXIgYW5pbWF0ZU91dCAnLCBkLCB0aGlzKTtcbiAgfVxuXG4gIGFuaW1hdGVJblR3ZWVuKGVsLCB0aW1lKSB7XG4gICAgZmFkZWluKGVsLCB0aW1lKVxuICB9XG5cbiAgYW5pbWF0ZU91dFR3ZWVuKGVsLCB0aW1lLCBjYWxsYmFjaykge1xuICAgIC8vIGNvbnNvbGUubG9nKCdhbmltIG91dCAnLCB7ZWwsIHRpbWUsIGNhbGxiYWNrfSk7XG4gICAgZmFkZW91dChlbCwgdGltZSwgY2FsbGJhY2spXG4gIH1cblxuICBzZXRBbmltYXRlSW4oZCkge1xuICAgIGlmIChkLmFuaW1hdGVJbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgZWwgPSBkLmVsICE9PSB1bmRlZmluZWQgPyBkLmVsIDogdGhpcy5kb21JdGVtLmVsXG4gICAgICB0aGlzLmFuaW1hdGVJblR3ZWVuKGVsLCBkLmFuaW1hdGVJblRpbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdGhhdCBjb25maXJtcyBkaXNwb3NlXG4gICAqL1xuXG4gIGRpc3Bvc2VNZXRob2QoZCkge1xuICAgIGNvbnN0IGVsID0gZC5lbC5lbCAhPT0gdW5kZWZpbmVkID8gZC5lbC5lbCA6IGQuZWwgLy8gRE9NIElURU1TIEhBVkUgVEhFSVIgRUwgSVRFTVMgTkVTVEVEXG5cbiAgICBjb25zdCBnY0RhdGEgPSB7IGFjdGlvbjonUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnLCAkZGlyOnRoaXMuJGRpcnMuUEksIGVsIH1cblxuICAgIGNvbnN0IGFuaW1hdGVPdXQgPSAoZCwgY2FsbGJhY2spID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0ZU91dFR3ZWVuKGVsLCBkLmFuaW1hdGVPdXRUaW1lLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICBjb25zdCBmYWRlT3V0T2JzID0gYmluZENhbGxiYWNrKGFuaW1hdGVPdXQpXG4gICAgY29uc3Qgb25GYWRlb3V0Q29tcGxldGVkID0gKGUpID0+IHtcbiAgICAgIHRoaXMuX3NvdXJjZSQubmV4dChnY0RhdGEpXG4gICAgfVxuXG4gICAgY29uc3Qgb25GYWRlb3V0T2JzID0gKGQpID0+IHtcbiAgICAgIGZhZGVPdXRPYnMoZClcbiAgICAgICAgLnN1YnNjcmliZShvbkZhZGVvdXRDb21wbGV0ZWQpXG4gICAgICByZXR1cm4geyBhY3Rpb246J0VYVElSUEFUSU5HJywgJGRpcjp0aGlzLiRkaXJzLkNJIH1cbiAgICB9XG4gICAgY29uc3Qgb25FbXB0eU9icyA9ICgpID0+ICh7IGFjdGlvbjonRVhUSVJQQVRFX0FORF9SRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcsICRkaXI6dGhpcy4kZGlycy5DSSB9KVxuICAgIGNvbnN0IGZuID0gZC5hbmltYXRlT3V0ID09PSB0cnVlID8gb25GYWRlb3V0T2JzIDogb25FbXB0eU9ic1xuICAgIHJldHVybiBmbihkKVxuICB9XG5cbiAgb25EaXNwb3NlKGQpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwb3NlTWV0aG9kKGQpXG4gIH1cblxuICByZW1vdmVTdHJlYW0oKSB7XG4gICAgLy8gdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlQWxsKCk7XG4gICAgaWYgKHRoaXMuc291cmNlU3RyZWFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVTdHJlYW0oWydpbnRlcm5hbCcsICdjaGlsZCddKVxuICAgIH1cbiAgfVxuXG4gIG9uUmVhZHlGb3JHQyhwKSB7XG4gICAgdGhpcy5yZW1vdmVTdHJlYW0oKVxuICB9XG5cbiAgb25HYXJiYWdlQ29sbGVjdChwKSB7XG4gICAgaWYgKHRoaXMuZG9tSXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRvbUl0ZW0udW5tb3VudCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc291cmNlU3RyZWFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVTdHJlYW0oWydwYXJlbnQnXSlcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpc1xuICB9XG5cbiAgZ2V0U291cmNlU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2UkXG4gIH1cblxuICBjb21iaW5lRG9tSXRlbXMoZCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9ICBpc05pbChkLnF1ZXJ5KSA/IGQubm9kZSA6IGQucXVlcnlcbiAgICBjb25zdCBwcmVwZW5kID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuaW5zZXJ0QmVmb3JlKGl0ZW0sIG5vZGUuZmlyc3RDaGlsZClcbiAgICBjb25zdCBhcHBlbmQgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5hcHBlbmRDaGlsZChpdGVtKVxuICAgIGNvbnN0IGFmdGVyID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuYWZ0ZXIoaXRlbSlcblxuICAgIGNvbnN0IGRlZmF1bHRGbiA9IHByZXBlbmRcbiAgICBjb25zdCBhdHRhY2hUeXBlSGFzaCA9IHtcbiAgICAgIGFwcGVuZENoaWxkIDogYXBwZW5kLFxuICAgICAgYWZ0ZXJcbiAgICB9XG4gICAgLy8gREVURVJNSU5FIFdIRVRIRVIgVE8gVVNFIEFQUEVORCBPUiBQUkVQRU5EXG4gICAgLy8gT04gQ09OTkVDVElORyBET00gSVRFTVMgVE8gRUFDSCBPVEhFUlxuICAgIC8vIGxldCBhdHRhY2hGdW5jID0gZC5hdHRhY2hUeXBlID09PSAnYXBwZW5kQ2hpbGQnID8gYXBwZW5kIDogcHJlcGVuZDtcbiAgICBjb25zdCBhdHRhY2hGdW5jID0gYXR0YWNoVHlwZUhhc2hbZC5hdHRhY2hUeXBlXSB8fCBkZWZhdWx0Rm5cbiAgICBhdHRhY2hGdW5jKGNvbnRhaW5lciwgdGhpcy5kb21JdGVtLnJlbmRlcigpKVxuICAgIHRoaXMuc2V0QW5pbWF0ZUluKGQpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHBcbiAgICogQHJldHVybnMgcGF5bG9hZCB0byBhcHBlbmQgY2hpbGQgZWxlbWVudCB0byBjdXJyZW50IGVsZW1lbnRcbiAgICovXG5cbiAgb25BdHRhY2hDaGlsZFRvU2VsZihwKSB7XG4gICAgY29uc3QgZGF0YSA9IHAuY2hpbGRSZW5kZXJEYXRhXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZGF0YSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnQ0hJTERfQVRUQUNIRUQnLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5QSVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRoYXQgYXR0YWNoZXMgY3VycmVudCBjaGlsZCBlbGVtZW50IHRvIHBhcmVudFxuICAgKi9cbiAgb25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudChkKSB7XG4gICAgdGhpcy5vblJlbmRlcihkKVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGQpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVCcsXG4gICAgICBlbDogdGhpcy5kb21JdGVtLmVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5QSVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlckRvbUl0ZW0oZCkge1xuICAgIGNvbnN0IFt0YWdOYW1lLCBhdHRyaWJ1dGVzLCBkYXRhLCB0ZW1wbGF0ZV0gPSBkXG4gICAgdGhpcy5kb21JdGVtID0gbmV3IERvbUVsZW1lbnQoeyB0YWdOYW1lLCBhdHRyaWJ1dGVzLCBkYXRhLCB0ZW1wbGF0ZSB9KVxuICAgIHJldHVybiB0aGlzLmRvbUl0ZW1cbiAgfVxuXG4gIG9uUmVuZGVyKGQpIHtcbiAgICBjb25zdCBnZXRFbCA9IChkYXRhKSA9PiB0aGlzLnJlbmRlckRvbUl0ZW0oZGF0YSlcbiAgICBjb25zdCBlbCA9ICBnZXRFbChwcm9wcyhbJ3RhZ05hbWUnLCAnZG9tQXR0cmlidXRlcycsICdkYXRhJywgJ3RlbXBsYXRlJ10sIGQpKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEJyxcbiAgICAgIGVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5JXG4gICAgfVxuICB9XG5cbiAgZXh0ZW5kZWRNZXRob2RzKGRhdGEpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZFxuICAgKiBAcmV0dXJuc1xuICAgKiBQYXlsb2FkIGNvbnRhaW5pbmcgdGhlIGFjdGlvbiwgaW50ZXJuYWwgb2JzZXJ2YWJsZSBhbmQgZWxlbWVudC5cbiAgICovXG4gIG9uUmVuZGVyQW5kQXR0YWNoVG9Eb20oZCkge1xuICAgIGNvbnN0IGdldEVsID0gKGRhdGEpID0+IHRoaXMucmVuZGVyRG9tSXRlbShkYXRhKVxuICAgIGQuYXR0YWNoRGF0YS5lbCA9IGdldEVsKHByb3BzKFsndGFnTmFtZScsICdkb21BdHRyaWJ1dGVzJywgJ2RhdGEnLCAndGVtcGxhdGUnXSwgZCkpXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZC5hdHRhY2hEYXRhKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19ET00nLFxuICAgICAgZWw6ICAgICBkLmF0dGFjaERhdGEuZWwuZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLkNJXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoZSBWaWV3U3RyZWFtIGRpcmVjdHMgYWxsIHJlbGV2YW50IGFjdGlvbnMgdG8gdGhlIERvbUVsZW1lbnQgdG8gcmVuZGVyIGFuZCBkaXNwb3NlIG9mIGl0c2VsZlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKi9cbiAgb25PYnNTaW5rU3Vic2NyaWJlKHBheWxvYWQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBwYXlsb2FkLmFjdGlvblxuICAgIGNvbnN0IGRlZmF1bHRUb0ZuID0gZGVmYXVsdFRvKChkYXRhKSA9PiB0aGlzLmV4dGVuZGVkTWV0aG9kcyhkYXRhKSlcbiAgICBjb25zdCBmbiA9IGRlZmF1bHRUb0ZuKHRoaXMub3B0aW9ucy5oYXNoTWV0aG9kc1thY3Rpb25dKVxuICAgIGNvbnN0IGRhdGEgPSBmbihwYXlsb2FkKVxuICAgIGNvbnN0IHNlbmREYXRhID0gKGQpID0+IHRoaXMuX3NvdXJjZSQubmV4dChkKVxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbmREYXRhKE9iamVjdC5mcmVlemUoZGF0YSkpXG4gICAgfVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSBiYXNlQ29yZU1peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgZnVuY3Rpb24gZ2MoKSB7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc3QgbG9vcE0gPSBtID0+IHVuZGVmaW5lZFxuICAgIGZvckVhY2gobG9vcE0sIHRoaXMpXG4gIH1cbiAgc2V0VGltZW91dChjbGVhbnVwLCAxKVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lJ1xuaW1wb3J0IHsgZ2MgfSBmcm9tICcuLi91dGlscy9nYydcbmltcG9ydCB7XG4gIGNvbXBvc2UsXG4gIGNsb25lLFxuICBmcm9tUGFpcnMsXG4gIHRvUGFpcnMsXG4gIGlzXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbVBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogT2JzZXJ2YWJsZXMgc2VudCBmcm9tIFZpZXdTdHJlYW1zIHRvIENoYW5uZWxzIGFyZSB2YWxpZGF0ZWQgYnkgdGhpcyBjbGFzc1xuICAgKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1QYXlsb2FkXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9ic2VydmFibGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRlYnVnXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBvYnNlcnZhYmxlLCBkYXRhLCBhY3Rpb24gPSAnc3Vic2NyaWJlJywgZGVidWcgPSBmYWxzZSkge1xuICAgIC8vIHRoaXMuYWRkTWl4aW5zKCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBvYnNlcnZhYmxlLFxuICAgICAgZGF0YSxcbiAgICAgIGFjdGlvblxuICAgIH1cbiAgICB0aGlzLnNlbmRUb0RpcmVjdG9yU3RyZWFtKG9wdGlvbnMpXG4gIH1cblxuICBzZW5kVG9EaXJlY3RvclN0cmVhbShwYXlsb2FkKSB7XG4gICAgY29uc3QgZGlyZWN0b3JTdHJlYW0kID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwLmdldFN0cmVhbSgnRElTUEFUQ0hFUicpXG4gICAgY29uc3QgZnJvemVuUGF5bG9hZCA9IHNhZmVDbG9uZShwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiVlMgUEFZTE9BRCBcIixmcm96ZW5QYXlsb2FkKTtcbiAgICBkaXJlY3RvclN0cmVhbSQubmV4dChmcm96ZW5QYXlsb2FkKVxuICAgIHBheWxvYWQgPSB1bmRlZmluZWRcblxuICAgIGRlbGV0ZSB0aGlzXG4gIH1cblxuICBzdGF0aWMgZGVlcENsb25lKG8pIHtcbiAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICAgIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gICAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICAgIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VFdmVudEtleXMoKSB7XG4gICAgcmV0dXJuIFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsQnViYmxlJywgJ2NhbmNlbGFibGUnLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ2NvbXBvc2VkJywgJ2N0cmxLZXknLCAnY3VycmVudFRhcmdldCcsICdkZWZhdWx0UHJldmVudGVkJywgJ2RldGFpbCcsICdldmVudFBoYXNlJywgJ2Zyb21FbGVtZW50JywgJ2lzVHJ1c3RlZCcsICdsYXllclgnLCAnbGF5ZXJZJywgJ21ldGFLZXknLCAnbW92ZW1lbnRYJywgJ21vdmVtZW50WScsICdvZmZzZXRYJywgJ29mZnNldFknLCAncGFnZVgnLCAncGFnZVknLCAncGF0aCcsICdyZWxhdGVkVGFyZ2V0JywgJ3JldHVyblZhbHVlJywgJ3NjcmVlblgnLCAnc2NyZWVuWScsICdzaGlmdEtleScsICdzb3VyY2VDYXBhYmlsaXRpZXMnLCAnc3JjRWxlbWVudCcsICd0YXJnZXQnLCAndGltZVN0YW1wJywgJ3RvRWxlbWVudCcsICd0eXBlJywgJ3ZpZXcnLCAnd2hpY2gnLCAneCcsICd5J11cbiAgfVxuXG4gIGFkZE1peGlucygpIHtcbiAgICB0aGlzLmdjID0gZ2NcbiAgfVxufVxuIiwiaW1wb3J0IHsgYmFzZVN0cmVhbXNNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1zdHJlYW1zLW1peGlucydcbmltcG9ydCB7IGNvbnZlcnREb21TdHJpbmdNYXBUb09iaiB9IGZyb20gJy4uL3V0aWxzL2ZycC10b29scydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgY2xvbmUsIG9taXQgfSBmcm9tICdyYW1kYSdcbmNvbnN0IGlzRGV2TW9kZSA9IFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbUJyb2FkY2FzdGVyIHtcbiAgLyoqXG4gICAqIFRoZSBjbGFzcyB0YWtlcyBpbiBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhlICdicm9hZGNhc3RFdmVudHMnIG1ldGhvZCBhbmQgZGlyZWN0cyB0aGUgZXZlbnRzIHRvIGVpdGhlciB0aGUgVUkgb3IgUk9VVEUgY2hhbm5lbHNcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtQnJvYWRjYXN0ZXJcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBicm9hZGNhc3RGblxuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcywgYnJvYWRjYXN0Rm4pIHtcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gICAgdGhpcy5icm9hZGNhc3RGbiA9IGJyb2FkY2FzdEZuXG4gICAgdGhpcy5icm9hZGNhc3Rlcih0aGlzLmJyb2FkY2FzdEZuKVxuICB9XG5cbiAgYWRkRGJsQ2xpY2tFdnQocSkge1xuICAgIGNvbnN0IGRibGNsaWNrJCA9IGZyb21FdmVudChxLCAnZGJsY2xpY2snKVxuICAgIC8vIGNvbnNvbGUubG9nKCdBRERJTkcgREJMIENMSUNLICcsIHEpO1xuICAgIGNvbnN0IHN0cmVhbSQgPSBkYmxjbGljayQucGlwZShcbiAgICAgIG1hcChwID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNsb25lKHApXG4gICAgICAgIC8vIEFERCBET1VCTEVDTElDSyBUTyBVSSBFVkVOVFNcbiAgICAgICAgZGF0YS50eXBlT3ZlclJpZGUgPSAnZGJsY2xpY2snXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9KSlcbiAgICByZXR1cm4gc3RyZWFtJFxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCUk9BRENBU1QgQlVUVE9OIEVWRU5UU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGJyb2FkY2FzdChhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDAgJiYgaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBuZXN0ZWQgYXJyYXkgaW4gJHt0aGlzLnByb3BzLm5hbWV9LmJyb2FkY2FzdEV2ZW50cyBhcHBlYXJzIHRvIGJlIGVtcHR5IC0tPiB2c2lkOiR7dGhpcy5wcm9wcy52c2lkfSFgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIHBheWxvYWRzIHRvIHNlbmQsIGJhc2VkIG9uIGVpdGhlciB0aGUgYXJyYXkgb3IgdGhlIGVsZW1lbnRzIGRhdGFNYXBcbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZHMgPSB7XG4gICAgICBVSTogdGhpcy5zZW5kVUlQYXlsb2FkLFxuICAgICAgUk9VVEU6IHRoaXMuc2VuZFJvdXRlUGF5bG9hZFxuICAgIH1cbiAgICAvLyBzcHJlYWQgb3BlcmF0b3IgdG8gc2VsZWN0IHZhcmlhYmxlcyBmcm9tIGFycmF5c1xuICAgIGNvbnN0IFtzZWxlY3RvciwgZXZlbnQsIGxvY2FsXSA9IGFyZ3NcbiAgICAvLyBidG4gcXVlcnlcbiAgICBsZXQgY2hhbm5lbCAvLyBob2lzdCBjaGFubmVsIGFuZCBsYXRlciBjaGVjayBpZiBjaG5sIGV4aXN0c1xuICAgIGxldCBxdWVyeSA9IHRoaXMucHJvcHMuZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcblxuICAgIGlmIChxdWVyeS5sZW5ndGggPD0gMCkge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLnByb3BzLmVsXG4gICAgICBjb25zdCBjaGVja1BhcmVudEVscyA9IChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSBlbCkge1xuICAgICAgICAgIHF1ZXJ5ID0gW2VsZW1lbnRdXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGx1Y2tFbEZyb21QYXJlbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsUGFyZW50ID0gZWwucGFyZW50RWxlbWVudCAhPT0gbnVsbCA/IGVsLnBhcmVudEVsZW1lbnQgOiBkb2N1bWVudFxuICAgICAgICBjb25zdCBlbFNlbGVjdGVkID0gZWxQYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICAgICAgZWxTZWxlY3RlZC5mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2hcbiAgICAgICAgZWxTZWxlY3RlZC5mb3JFYWNoKGNoZWNrUGFyZW50RWxzKVxuICAgICAgfVxuXG4gICAgICBwbHVja0VsRnJvbVBhcmVudCgpXG4gICAgfVxuXG4gICAgY29uc3QgaXNMb2NhbEV2ZW50ID0gbG9jYWwgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZE9ic2VydmFibGUgPSAocSkgPT4ge1xuICAgICAgLy8gdGhlICBidG4gb2JzZXJ2YWJsZVxuICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IGV2ZW50ICE9PSAnZGJsQ2xpY2snXG4gICAgICAgID8gZnJvbUV2ZW50KHEsIGV2ZW50LCB7IHByZXZlbnREZWZhdWx0OiAoKSA9PiB0cnVlIH0pXG4gICAgICAgIDogdGhpcy5hZGREYmxDbGlja0V2dChxKVxuICAgICAgLy8gc2VsZWN0IGNoYW5uZWwgYW5kIGRhdGEgdmFsdWVzIGZyb20gZWl0aGVyIHRoZSBhcnJheSBvciB0aGUgZWxlbWVudCdzIGRvbSBNYXBcbiAgICAgIGNoYW5uZWwgPSBxLmRhdGFzZXQuY2hhbm5lbC8vIGlmTmlsVGhlblVwZGF0ZShjaG5sLCBxLmRhdGFzZXQuY2hhbm5lbCk7XG4gICAgICBjb25zdCBkYXRhID0ge30vLyBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoocS5kYXRhc2V0KTtcbiAgICAgIGRhdGEucGF5bG9hZCA9IGNvbnZlcnREb21TdHJpbmdNYXBUb09iaihxLmRhdGFzZXQpXG4gICAgICBkYXRhLnBheWxvYWQgPSBvbWl0KFsnY2hhbm5lbCddLCBkYXRhLnBheWxvYWQpXG4gICAgICBkYXRhLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgICAvLyBwYXlsb2FkIG5lZWRzIHZzaWQjIHRvIHBhc3MgdmVyaWZpY2F0aW9uXG5cbiAgICAgIGRhdGEuc3JjRWxlbWVudCA9IHt9Ly8gcGljayhbJ3ZzaWQnLCd2aWV3TmFtZSddLCBkYXRhKTtcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC52c2lkID0gdGhpcy5wcm9wcy52c2lkXG4gICAgICBkYXRhLnNyY0VsZW1lbnQuaXNMb2NhbEV2ZW50ID0gaXNMb2NhbEV2ZW50XG4gICAgICAvLyBkYXRhLnNyY0VsZW1lbnRbJ3ZpZXdOYW1lJ10gPSB0aGlzLnByb3BzLm5hbWU7XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuc3JjRXZlbnQgPSBldmVudFxuICAgICAgZGF0YS5zcmNFbGVtZW50LmVsID0gcVxuICAgICAgLy8gc2VsZWN0IHRoZSBjb3JyZWN0IHBheWxvYWRcbiAgICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkID0gY2hhbm5lbCAhPT0gdW5kZWZpbmVkID8gY2hhbm5lbFBheWxvYWRzW2NoYW5uZWxdIDogY2hhbm5lbFBheWxvYWRzLlVJXG4gICAgICAvLyBydW4gcGF5bG9hZFxuICAgICAgY2hhbm5lbFBheWxvYWQob2JzZXJ2YWJsZSwgZGF0YSlcbiAgICB9XG4gICAgY29uc3QgcXVlcnlJc05pbCA9IHF1ZXJ5ID09PSB1bmRlZmluZWQgfHwgcXVlcnkubGVuZ3RoIDw9IDBcbiAgICBpZiAocXVlcnlJc05pbCA9PT0gdHJ1ZSAmJiBpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGl0ZW0gJHtzZWxlY3Rvcn0sIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCBpbiAke3RoaXMucHJvcHMubmFtZX0gLS0+IHZzaWQ6JHt0aGlzLnByb3BzLnZzaWR9IWApXG5cbiAgICAgIC8vIGFkZE9ic2VydmFibGUocXVlcnksIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gICAgICBxdWVyeS5mb3JFYWNoKGFkZE9ic2VydmFibGUpXG4gICAgfVxuICB9XG5cbiAgYnJvYWRjYXN0ZXIoYXJyRm4pIHtcbiAgICBjb25zdCBicm9hZGNhc3RBcnIgPSBhcnJGbigpXG4gICAgYnJvYWRjYXN0QXJyLmZvckVhY2goYXJncyA9PiB0aGlzLmJyb2FkY2FzdChhcmdzKSlcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIFNUUkVBTSBNSVhJTlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHN0cmVhbU1peGlucyA9IGJhc2VTdHJlYW1zTWl4aW5zKClcbiAgICB0aGlzLnNlbmRVSVBheWxvYWQgPSBzdHJlYW1NaXhpbnMuc2VuZFVJUGF5bG9hZFxuICAgIHRoaXMuc2VuZFJvdXRlUGF5bG9hZCA9IHN0cmVhbU1peGlucy5zZW5kUm91dGVQYXlsb2FkXG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW1QYXlsb2FkIH0gZnJvbSAnLi4vLi4vdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VTdHJlYW1zTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIHRlc3RGdW5jOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdzdHJlYW0gbWl4aW4gaXMgJywgc3RyKVxuICAgIH0sXG4gICAgc2VuZFJvdXRlUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICAvKiogVE9ETzogQUREIEEgQ0hFQ0sgRk9SIEVORCBST1VURSBBTkQgVFJBTlNGT1JNIFRPIEVNUFRZICovXG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdDSEFOTkVMX1JPVVRFJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJylcbiAgICB9LFxuICAgIHNlbmRVSVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9VSScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfVxuICAgIC8qXG4gICAgc2VuZEluZm9Ub0NoYW5uZWw6IGZ1bmN0aW9uKGNoYW5uZWxOYW1lLCBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBnZXRQcm9wID0gc3RyID0+IHByb3Aoc3RyLCB0aGlzLnByb3BzKTtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsTmFtZTtcbiAgICAgIGxldCBzcmNFbGVtZW50ID0ge1xuICAgICAgICB2c2lkOiBnZXRQcm9wKCd2c2lkJyksXG4gICAgICAgIGVsOiBnZXRQcm9wKCdlbCcpLFxuICAgICAgICB2aWV3TmFtZTogZ2V0UHJvcCgnbmFtZScpXG4gICAgICB9O1xuICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIHBheWxvYWQsIGNoYW5uZWwsIHNyY0VsZW1lbnRcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKGNoYW5uZWxOYW1lLCBuZXcgb2YoJycpLCBkYXRhLFxuICAgICAgICAnc3Vic2NyaWJlJyk7XG4gICAgfSxcbiAgICAqL1xuICAgIC8qICAgIHNlbmRMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdMSUZFU1RSRUFNJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJyk7XG4gICAgfSxcblxuICAgIGNyZWF0ZUxpZmVTdHJlYW1QYXlsb2FkOiBmdW5jdGlvbihTVEVQLCBkYXRhID0ge30sIHR5cGUgPSAncGFyZW50Jykge1xuICAgICAgbGV0IHZpZXdJZCA9IGAke3RoaXMucHJvcHMubmFtZX06ICR7dGhpcy5wcm9wcy52c2lkfWA7XG4gICAgICByZXR1cm4gbmV3IExpZmVzdHJlYW1QYXlsb2FkKCdMSUZFU1RSRUFNJywgU1RFUCwgdHlwZSwgdmlld0lkLCBkYXRhKS5kYXRhO1xuICAgIH0gKi9cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXMsXG4gIHJlamVjdCxcbiAgaXNOaWwsXG4gIGZpbmQsXG4gIGFsbFBhc3MsXG4gIGZvckVhY2hPYmpJbmRleGVkLFxuICBub3QsXG4gIGlzRW1wdHksXG4gIGFsd2F5cyxcbiAgY29tcG9zZSxcbiAgZXF1YWxzLFxuICBwcm9wLFxuICB3aGVyZSxcbiAgZGVmYXVsdFRvLFxuICBtZXJnZUFsbCxcbiAgb21pdCxcbiAgZmxhdHRlbixcbiAgYW55LFxuICBjdXJyeSxcbiAgbHRlXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5cbmNvbnN0IGlzTm90QXJyID0gY29tcG9zZShub3QsIGlzKEFycmF5KSlcbmNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKG5vdCwgaXNFbXB0eSlcbmNvbnN0IGlzTm9uRW1wdHlTdHIgPSBhbGxQYXNzKFtpcyhTdHJpbmcpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzTm9uRW1wdHlBcnIgPSBhbGxQYXNzKFtpcyhBcnJheSksIGlzTm90RW1wdHldKVxuY29uc3QgaXNPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxQYXlsb2FkRmlsdGVyIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFBheWxvYWRGaWx0ZXJcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIHV0aWxpdHkgZmlsdGVycyBDaGFubmVsUGF5bG9hZCBvYmplY3RzIGJ5IHVzaW5nIHF1ZXJ5IHNlbGVjdG9ycyBhbmQvb3IgYnkgY29tcGFyaW5nIGRhdGEgcHJvcGVydGllczwvcD5cbiAgICogPGgzPlRoZSBDaGFubmVsUGF5bG9hZEZpbHRlciBmZWF0dXJlczwvaDM+XG4gICAqIDx1bD5cbiAgICogICA8bGk+Q2FuIGJlIHVzZWQgYnkgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zPC9saT5cbiAgICogICA8bGk+Q2hhbm5lbFBheWxvYWRGaWx0ZXIgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzIHRoZSB0aGlyZCBwYXJhbWV0ZXIgd2hlbiBiaW5kaW5nIGFjdGlvbnMgdG8gVmlld1N0cmVhbSBtZXRob2RzLjwvbGk+XG4gICAqICAgPGxpPlNlbGVjdG9ycyBjYW4gYmUgYSBxdWVyeSBzdHJpbmcsIGFuIGFycmF5IG9mIHNlbGVjdG9yIHN0cmluZ3MsIG9yIHRoZSBzZWxlY3RvciBjYW4gYmUgYW4gYWN0dWFsIGRvbSBlbGVtZW50LjwvbGk+XG4gICAqICAgPGxpPlNlbGVjdG9ycyBhcmUgbm90IHJlcXVpcmVkIGFuZCBjYW4gYmUgZGlzcmVnYXJkZWQgYnkgYWRkaW5nIFwiXCIgb3IgdW5kZWZpbmVkIGFzIHRoZSBzZWxlY3RvciBwcm9wZXJ0eS48L2xpPlxuICAgKiAgIDxsaT5UaGUgZGF0YSBvYmplY3QgY29tcGFyZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBwcm9wcygpIG1ldGhvZCBvZiBhIENoYW5uZWxQYXlsb2FkIG9iamVjdDwvbGk+XG4gICAqICAgPGxpPkludGVybmFsbHksIFRoZSBkYXRhIG9iamVjdCBpcyBjb25mb3JtZWQgdG8gYSBzcGVjIG9iamVjdCBmb3IgcmFtZGEmcnNxdW87cyBFWFRbJ3doZXJlJywgJy8vcmFtZGFqcy5jb20vZG9jcy8jd2hlcmUnXSBtZXRob2Q8L2xpPlxuICAgKiAgIDwvdWw+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xBcnJheXxIVE1MRWxlbWVudH0gc2VsZWN0b3IgVGhlIG1hdGNoaW5nIGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGZpbHRlcnMgT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdG9yLCBwcm9wcywgYW5kIGRlYnVnTGFiZWwgcGFyYW1zLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcEZpbHRlcnMgQSBqc29uIG9iamVjdCBjb250YWluaW5nIGZpbHRlcmluZyBtZXRob2RzIGZvciBjaGFubmVsIHByb3BzIHZhcmlhYmxlcy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd8QXJyYXl8SFRNTEVsZW1lbnR9IHNlbGVjdG9yIC0gPSAnJzsgVGhlIG1hdGNoaW5nIGVsZW1lbnQuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wRmlsdGVycyAtID0ge307IEEganNvbiBvYmplY3QgY29udGFpbmluZyBjb21wcmF0b3JzIGZvciBhbnkgZXhwZWN0ZWQgcHJvcGVydHkgdmFsdWVzLlxuICAgKiBAcmV0dXJucyBCb29sZWFuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+RmlsdGVyaW5nIHVzaW5nIFNlbGVjdG9ycyBhbmQgYSBQcm9wZXJ0eSBDb21wYXJhdG9yIFdpdGhpbiBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PiddXG4gICAqICAgIGNvbnN0IG15U2VsZWN0b3JzID0gWyd1bCcsICdsaTpmaXJzdC1jaGlsZCddO1xuICAgKiAgICBjb25zdCBwcm9wRmlsdGVycyA9IHtcbiAgICogICAgICBsaW5rVHlwZTogXCJleHRlcm5hbFwiXG4gICAqICAgIH07XG4gICAqICAgIGNvbnN0IG15RmlsdGVyID0gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKG15U2VsZWN0b3JzLCBwcm9wRmlsdGVycyk7XG4gICAqXG4gICAqICAgIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICogICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgICAgICAgICBbJ0NIQU5ORUxfVUlfQ0xJQ0tfRVZFTlQnLCAnb25DbGlja0V2ZW50JywgbXlGaWx0ZXJdXG4gICAqICAgICAgICAgICAgIF1cbiAgICogICAgICAgICAgfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PkZpbHRlcmluZyBVc2luZyBNZXRob2QgYW5kIFN0cmluZyBDb21wYXJhdG9ycyBXaXRoaW4gYSBWaWV3U3RyZWFtIEluc3RhbmNlPC9oND4nXVxuICAgKiAgICBjb25zdCBwcm9wRmlsdGVycyA9IHtcbiAgICogICAgICB0eXBlOiBcInNjcm9sbGluZy1lbGVtZW50XCIsXG4gICAqICAgICAgc2Nyb2xsTnVtOiAgKG4pPT5uPj0xMjAwICYmIG48PTUwMDA7XG4gICAqICAgIH07XG4gICAqICAgIGNvbnN0IG15RmlsdGVyID0gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKCcnLCBwcm9wRmlsdGVycyk7XG4gICAqXG4gICAqICAgIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICogICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgICAgICAgICBbJ0NIQU5ORUxfVUlfQ0xJQ0tfRVZFTlQnLCAnb25DbGlja0V2ZW50JywgbXlGaWx0ZXJdXG4gICAqICAgICAgICAgICAgIF1cbiAgICogICAgICAgICAgfVxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PkEgU2ltcGxlIFByb3BlcnR5IEZpbHRlcmluZyBFeGFtcGxlIFdpdGhpbiBhIENoYW5uZWwgSW5zdGFuY2U8L2g0PiddXG4gICAqIC8vIEZpbHRlciBmb3IgYSBidXR0b24gd2l0aCBhIGRhdGEgdHlwZSBvZiAnbGluaydcbiAgICogY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoJycge3R5cGU6IFwibGlua1wifSk7XG4gICAqXG4gICAqIHRoaXMuZ2V0Q2hhbm5lbChcIkNIQU5ORUxfVUlcIilcbiAgICogLnBpcGUoZmlsdGVyKG15RmlsdGVyKSlcbiAgICogLnN1YnNjcmliZShteUNoYW5uZWxNZXRob2QpO1xuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2VsZWN0b3IsIGZpbHRlcnMgPSB7fSwgZGVidWdMYWJlbCwgdGVzdE1vZGUpIHtcbiAgICBjb25zdCBzZWxlY3RvcklzT2JqID0gaXNPYmplY3RGbihzZWxlY3RvcilcblxuICAgIGlmIChzZWxlY3RvcklzT2JqKSB7XG4gICAgICBmaWx0ZXJzID0gc2VsZWN0b3JcbiAgICAgIHNlbGVjdG9yID0gcHJvcCgnc2VsZWN0b3InLCBmaWx0ZXJzKVxuICAgICAgdGVzdE1vZGUgPSB0ZXN0TW9kZSB8fCBwcm9wKCd0ZXN0TW9kZScsIGZpbHRlcnMpXG4gICAgfVxuXG4gICAgY29uc3QgZGVidWdMYWJlbEFyciA9IFtkZWJ1Z0xhYmVsLCBwcm9wKCdkZWJ1Z0xhYmVsJywgZmlsdGVycyldXG5cbiAgICBkZWJ1Z0xhYmVsID0gY29tcG9zZShmaW5kKGlzKFN0cmluZykpKShkZWJ1Z0xhYmVsQXJyKVxuXG4gICAgbGV0IHByb3BzID0gb21pdChbJ2RlYnVnTGFiZWwnLCAnbGFiZWwnLCAnc2VsZWN0b3InLCAncHJvcHMnLCAndGVzdE1vZGUnLCAncHJvcEZpbHRlcnMnXSwgZmlsdGVycylcbiAgICBpZiAoZmlsdGVycy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcyA9IG1lcmdlQWxsKFtmaWx0ZXJzLnByb3BzLCBwcm9wc10pXG4gICAgfSBlbHNlIGlmIChmaWx0ZXJzLnByb3BGaWx0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzID0gbWVyZ2VBbGwoW2ZpbHRlcnMucHJvcEZpbHRlcnMsIHByb3BzXSlcbiAgICB9XG5cbiAgICBmaWx0ZXJzLnByb3BGaWx0ZXJzID0gcHJvcHNcblxuICAgIGNvbnN0IHsgcHJvcEZpbHRlcnMgfSA9IGZpbHRlcnNcblxuICAgIGNvbnN0IGFkZFN0cmluZ1NlbGVjdG9yRmlsdGVyID0gIGlzTm9uRW1wdHlTdHIoc2VsZWN0b3IpID8gQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZmlsdGVyU2VsZWN0b3IoW3NlbGVjdG9yXSwgZGVidWdMYWJlbCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhZGRBcnJheVNlbGVjdG9yRmlsdGVyID0gICBpc05vbkVtcHR5QXJyKHNlbGVjdG9yKSA/IENoYW5uZWxQYXlsb2FkRmlsdGVyLmZpbHRlclNlbGVjdG9yKHNlbGVjdG9yLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZERhdGFGaWx0ZXIgPSBpc05vbkVtcHR5T2JqZWN0Rm4ocHJvcEZpbHRlcnMpID8gQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZmlsdGVyRGF0YShwcm9wRmlsdGVycywgZGVidWdMYWJlbCkgOiB1bmRlZmluZWRcblxuICAgIGxldCBmaWx0ZXJzQXJyID0gcmVqZWN0KGlzTmlsLCBbYWRkU3RyaW5nU2VsZWN0b3JGaWx0ZXIsIGFkZEFycmF5U2VsZWN0b3JGaWx0ZXIsIGFkZERhdGFGaWx0ZXJdKVxuXG4gICAgLy8gSUYgQVJSQVkgSVMgRU1QVFkgQUxXQVlTIFJFVFVSTiBGQUxTRTtcblxuICAgIGNvbnN0IGZpbHRlcnNBcmVFbXB0eSA9IGlzRW1wdHkoZmlsdGVyc0FycilcblxuICAgIGlmIChmaWx0ZXJzQXJlRW1wdHkpIHtcbiAgICAgIGZpbHRlcnNBcnIgPSBbYWx3YXlzKGZhbHNlKV1cbiAgICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUgJiYgdGVzdE1vZGUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgQ2hhbm5lbCBGaWx0ZXIsIHdpdGggc2VsZWN0b3I6ICR7c2VsZWN0b3J9LCBhbmQgcHJvcEZpbHRlcnM6JHtwcm9wRmlsdGVyc30gYXBwZWFycyB0byBiZSBlbXB0eSFgKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGVzdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yLCBwcm9wRmlsdGVycywgZGVidWdMYWJlbCwgZmlsdGVycywgdGVzdE1vZGUsIGZpbHRlcnNBcmVFbXB0eSB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFBhc3MoZmlsdGVyc0FycilcbiAgfVxuXG4gIHN0YXRpYyBmaWx0ZXJEYXRhKGZpbHRlckpzb24sIGZpbHRlcmRlYnVnTGFiZWwpIHtcbiAgICBjb25zdCBkZWJ1Z0xhYmVsID0gZmlsdGVyZGVidWdMYWJlbFxuXG4gICAgY29uc3QgY29tcGFyZURhdGEgPSAoKSA9PiB7XG4gICAgICAvLyBETyBOT1QgQUxMT1cgQU4gRU1QVFkgT0JKRUNUIFRPIFJFVFVSTiBUUlVFc1xuICAgICAgaWYgKGlzRW1wdHkoZmlsdGVySnNvbikpIHtcbiAgICAgICAgcmV0dXJuIGFsd2F5cyhmYWxzZSlcbiAgICAgIH1cblxuICAgICAgLy8gIENIRUNLUyBBTEwgVkFMVUVTIElOIEpTT04gVE8gREVURVJNSU5FIElGIFRIRVJFIEFSRSBGSUxURVJJTkcgTUVUSE9EU1xuXG4gICAgICBjb25zdCBjcmVhdGVDdXJyeUNvbXBhcmF0b3IgPSBjb21wYXJlU3RyID0+IChzdHIpID0+IHtcbiAgICAgICAgcmV0dXJuIHN0ciA9PT0gY29tcGFyZVN0clxuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tUb0NvbnZlcnRUb0ZuID0gKHZhbCwga2V5LCBvYmopID0+IHtcbiAgICAgICAgY29uc3QgZm5WYWwgPSBpcyhTdHJpbmcsIHZhbCkgPT09IHRydWUgPyBjcmVhdGVDdXJyeUNvbXBhcmF0b3IodmFsKSA6IHZhbFxuICAgICAgICByZXR1cm4gZm5WYWxcbiAgICAgIH1cbiAgICAgIGZpbHRlckpzb24gPSByTWFwKGNoZWNrVG9Db252ZXJ0VG9GbiwgZmlsdGVySnNvbilcblxuICAgICAgLy8gVEFQIExPR0dFUlxuICAgICAgY29uc3QgdGFwTG9nZ2VyID0gKGNvbXBhcmVkT2JqKSA9PiB7XG4gICAgICAgIGlmIChkZWJ1Z0xhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wc0Jvb2xlYW5zID0ge31cbiAgICAgICAgY29uc3QgbWFwQm9vbHMgPSAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIHByb3BzQm9vbGVhbnNba2V5XSA9IHZhbHVlKHByb3Aoa2V5LCBjb21wYXJlZE9iaikpXG4gICAgICAgIH1cbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQobWFwQm9vbHMsIGZpbHRlckpzb24pXG4gICAgICAgIGNvbnNvbGUubG9nKGAlYyBDSEFOTkVMIFBBWUxPQUQgRklMVEVSIERFQlVHR0VSIFtcIiR7ZGVidWdMYWJlbH1cIl0gLSB2YWx1ZXM6ICAgIGAsICdjb2xvcjpvcmFuZ2U7JywgeyBwcm9wc0Jvb2xlYW5zLCBjb21wYXJlZE9iaiB9KVxuXG4gICAgICAgIHJldHVybiBjb21wYXJlZE9ialxuICAgICAgfVxuXG4gICAgICAvLyBFTkQgVEFQIExPR0dFUlxuICAgICAgY29uc3QgZk1ldGhvZCA9IHdoZXJlKGZpbHRlckpzb24pXG5cbiAgICAgIGNvbnN0IGdldEZpbHRlcmluZ09iaiA9ICAodikgPT4ge1xuICAgICAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSB2IHx8IHt9XG4gICAgICAgIGNvbnN0IG8gPSBPYmplY3QuYXNzaWduKHt9LCB2LCBzcmNFbGVtZW50LCBldmVudCwgcGF5bG9hZClcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ28gaXMgJyxvKTtcbiAgICAgICAgcmV0dXJuIG9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBvc2UoZk1ldGhvZCwgdGFwTG9nZ2VyLCBkZWZhdWx0VG8oe30pLCBnZXRGaWx0ZXJpbmdPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVEYXRhKClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BheWxvYWRTZWxlY3RvcihhcnIsIGRlYnVnTGFiZWwsIHNyY1BheWxvYWQpIHtcbiAgICAvLyBFTEVNRU5UIEZST00gUEFZTE9BRHNcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBzcmNQYXlsb2FkIHx8IHt9XG5cbiAgICBjb25zdCByZWR1Y2VGaW5kRWwgPSAoYWNjLCBzcmMpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcHJvcCgnZWwnLCBzcmMpXG4gICAgICBpZiAoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZWxJc0RvbUVsZW1lbnQoZWwpICYmIGFjYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjYyA9IGVsXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgY29uc3QgZWwgPSBbc3JjRWxlbWVudCwgcGF5bG9hZCwgcHJvcCgnc3JjRWxlbWVudCcsIGV2ZW50KSwgc3JjUGF5bG9hZF0ucmVkdWNlKHJlZHVjZUZpbmRFbCwgdW5kZWZpbmVkKVxuXG4gICAgLy8gUkVUVVJOIEJPT0xFQU4gTUFUQ0ggV0lUSCBQQVlMT0FEIEVMXG4gICAgY29uc3QgY29tcGFyZUVscyA9IChlbENvbXBhcmUpID0+IGVsQ29tcGFyZS5pc0VxdWFsTm9kZSgoZWwpKVxuXG4gICAgLy8gTE9PUCBUSFJPVUdIIE5PREVTIElOIHF1ZXJ5U2VsZWN0b3JBbGwoKVxuICAgIGNvbnN0IG1hcE5vZGVBcnJXaXRoRWwgPSAoc2VsKSA9PiB7XG4gICAgICAvLyBjb252ZXJ0IG5vZGVsaXN0IHRvIGFycmF5IG9mIGVsc1xuICAgICAgY29uc3Qgbm9kZUFyciA9IGZsYXR0ZW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWwpKVxuICAgICAgLy8gZWxzIGFycmF5IHRvIGJvb2xlYW4gYXJyYXlcbiAgICAgIHJldHVybiByTWFwKGNvbXBhcmVFbHMsIG5vZGVBcnIpXG4gICAgfVxuXG4gICAgaWYgKGRlYnVnTGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgbm9kZUFyclJlc3VsdHNEZWJ1Z2dlciA9IGNvbXBvc2UoZmxhdHRlbiwgck1hcChtYXBOb2RlQXJyV2l0aEVsKSkoYXJyKVxuICAgICAgY29uc3Qgc2VsZWN0b3JzQXJyID0gYXJyXG4gICAgICBjb25zb2xlLmxvZyhgJWMgQ0hBTk5FTCBQQVlMT0FEIEZJTFRFUiBERUJVR0dFUiBbXCIke2RlYnVnTGFiZWx9XCJdIC0gc2VsZWN0b3JzOiBgLCAnY29sb3I6b3JhbmdlOycsIHsgZWwsIHNlbGVjdG9yc0Fyciwgbm9kZUFyclJlc3VsdHNEZWJ1Z2dlciB9KVxuICAgIH1cblxuICAgIC8vIENIRUNLIElGIFBBWUxPQUQgRUwgRVhJU1RTXG4gICAgaWYgKHR5cGVvZiAoZWwpICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gTE9PUCBUSFJPVUdIIEFMTCBTRUxFQ1RPUlMgSU4gTUFJTiBBUlJBWVxuICAgIGNvbnN0IG5vZGVBcnJSZXN1bHQgPSBjb21wb3NlKGZsYXR0ZW4sIHJNYXAobWFwTm9kZUFycldpdGhFbCkpKGFycilcbiAgICBpZiAoaXNFbXB0eShub2RlQXJyUmVzdWx0KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGFueShlcXVhbHModHJ1ZSksIG5vZGVBcnJSZXN1bHQpXG4gIH1cblxuICBzdGF0aWMgZWxJc0RvbUVsZW1lbnQobykge1xuICAgIGlmIChpcyhTdHJpbmcsIG8pKSB7XG4gICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSkobylcbiAgfVxuXG4gIHN0YXRpYyBmaWx0ZXJTZWxlY3RvcihzZWxlY3RvckFyciwgZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGFyciA9IHJlamVjdChpc0VtcHR5LCBzZWxlY3RvckFycilcbiAgICBjb25zdCBwYXlsb2FkQ2hlY2sgPSBjdXJyeShDaGFubmVsUGF5bG9hZEZpbHRlci5jaGVja1BheWxvYWRTZWxlY3RvcilcbiAgICByZXR1cm4gcGF5bG9hZENoZWNrKGFyciwgZGVidWdMYWJlbClcbiAgfVxufVxuIiwiaW1wb3J0IHsgaGVhZCwgY29tcG9zZSwgcmVqZWN0LCBzcGxpdCwgaXNFbXB0eSwgbHRlLCBkZWZhdWx0VG8sIHByb3AgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZChlbCkge1xuICBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9cXGQvZ20sICcnKS5zdWJzdHJpbmcoMSwgOClcbiAgbGV0IHZzaWQgPSBgJHtudW0oKX1gXG4gIGlmIChlbC5kYXRhc2V0LnZzaWQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsLmRhdGFzZXQudnNpZCA9IHZzaWRcbiAgfSBlbHNlIHtcbiAgICB2c2lkID0gZWwuZGF0YXNldC52c2lkXG4gIH1cbiAgcmV0dXJuIGBbZGF0YS12c2lkPScke3ZzaWR9J11gXG59XG5cbmZ1bmN0aW9uIGlzRGV2TW9kZSgpIHtcbiAgcmV0dXJuIFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpc05vZGVFbGVtZW50KGVsKSB7XG4gIGNvbnN0IG5vZGVDaGVjayA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuICByZXR1cm4gbm9kZUNoZWNrKGVsKVxufVxuXG5mdW5jdGlvbiBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdmVyYm9zZUJvb2wgPSBmYWxzZSkge1xuICBjb25zdCBsaXN0ID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgdmVyYm9zZUJvb2wpXG4gIHJldHVybiBsaXN0Lmxlbmd0aCA9PT0gMSA/IGhlYWQobGlzdCkgOiBsaXN0XG59XG5cbmZ1bmN0aW9uIHRlc3RTZWxlY3RvcnMoY3h0LCBzZWwsIHZlcmJvc2VCb29sKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjeHQpXG5cbiAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcblxuICBpZiAoZWwgIT09IG51bGwgJiYgZWxJc0RvbUVsZW1lbnQoZWwpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGVsIG9iamVjdCBpcyBub3QgYSB2YWxpZCBzaW5nbGUgZWxlbWVudCwgJHtlbH1gKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHNlbCAhPT0gdW5kZWZpbmVkICYmIFN0cmluZyhzZWwpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgZnVuY3Rpb24gaXNWYWxpZFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgaXMgdmFsaWQgYW5kIHNlbGVjdHMgYXQgbGVhc3Qgb25lIGVsZW1lbnRcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlIC8vIENhdGNoaW5nIGFuIGV4Y2VwdGlvbiBtZWFucyB0aGUgc2VsZWN0b3IgaXMgaW52YWxpZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzVmFsaWRTZWxlY3RvckJvb2wgPSBpc1ZhbGlkU2VsZWN0b3Ioc2VsKVxuICAgIGlmICh2ZXJib3NlQm9vbCA9PT0gdHJ1ZSAmJiBpc0Rldk1vZGUoKSA9PT0gdHJ1ZSAmJiBpc1ZhbGlkU2VsZWN0b3JCb29sID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgc2VsZWN0b3IsICR7c2VsfSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGVsLCAke2N4dH1gKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCB2ZXJib3NlQm9vbCA9IGZhbHNlKSB7XG4gIGNvbnN0IHNlbGVjdG9yID0gc2VsICE9PSB1bmRlZmluZWQgPyBgJHtjeHR9ICR7c2VsfWAgOiBjeHRcbiAgbGV0IGlzUGFyZW50ID0gZmFsc2VcblxuICBjb25zdCByZXR1cm5TZWxlY3RvcklmVmFsaWQgPSAoc2VsZWN0b3IpID0+IHtcbiAgICBsZXQgYXJyID0gW11cbiAgICB0cnkge1xuICAgICAgYXJyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGNhdGNoIChlKSB7IGFyciA9IFtdIH1cbiAgICB0cnkge1xuICAgICAgaXNQYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbCkgPT09IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3h0KVxuICAgICAgaWYgKGlzUGFyZW50ID09PSB0cnVlKSB7XG4gICAgICAgIGFyciA9IFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbCldXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYXJyLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH1cblxuICBjb25zdCBlbEFyciA9ICByZXR1cm5TZWxlY3RvcklmVmFsaWQoc2VsZWN0b3IpXG5cbiAgaWYgKHZlcmJvc2VCb29sID09PSB0cnVlKSB7XG4gICAgY29uc3QgbWFpblNlbCA9IGlzUGFyZW50ID09PSB0cnVlID8gJ2JvZHknIDogY3h0XG4gICAgdGVzdFNlbGVjdG9ycyhtYWluU2VsLCBzZWwsIHZlcmJvc2VCb29sKVxuICB9XG5cbiAgcmV0dXJuIGVsQXJyXG59XG5cbmZ1bmN0aW9uIHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSB7XG4gIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gIGNvbnN0IGFkZElubGluZUNzcyA9IGl0ZW0gPT4ge1xuICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9IHZhbFxuICB9XG4gIGFyci5mb3JFYWNoKGFkZElubGluZUNzcylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKlxuICogQG1vZHVsZSBWaWV3U3RyZWFtU2VsZWN0b3JcbiAqIEB0eXBlIHV0aWxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xFbH0gY3h0IFRoZSBtYWluIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfEVsfSBUaGUgc2VsZWN0b3IgYXMgYSBTdHJpbmdcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqPSl9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiBWaWV3U3RyZWFtU2VsZWN0b3IoY3h0LCBzZWwpIHtcbiAgY3h0ID0gdHlwZW9mIChjeHQpID09PSAnc3RyaW5nJyA/IGN4dCA6IGdlbmVyYXRlU3B5bmVTZWxlY3RvcklkKGN4dClcbiAgdGVzdFNlbGVjdG9ycyhjeHQsIHNlbCwgZmFsc2UpXG5cbiAgZnVuY3Rpb24gc2VsZWN0b3Ioc2VsKSB7XG4gICAgcmV0dXJuIFZpZXdTdHJlYW1TZWxlY3RvcihjeHQsIHNlbClcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gbWFwIHRocm91Z2ggYSBOb2RlTGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZWxlbWVudHNcbiAgICovXG4gIHNlbGVjdG9yLm1hcCA9IChmbikgPT4gQXJyYXkuZnJvbShnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSkubWFwKGZuKVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gaXRlcmF0ZSB0aHJvdWdoIGEgTm9kZUxpc3RcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZWxlbWVudHNcbiAgICovXG4gIHNlbGVjdG9yLmZvckVhY2ggPSAoZm4pID0+IEFycmF5LmZyb20oZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkpLm1hcChmbilcblxuICBzZWxlY3Rvci5nZXROb2RlTGlzdEFycmF5ID0gKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcblxuICAvKipcbiAgICpcbiAgICogQWRkcyB0aGUgY2xhc3MgdG8gdGhlIEVsZW1lbnQgb3IgdG8gdGhlIE5vZGVMaXN0LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYyAtID0gdW5kZWZpbmVkOyBUaGUgY2xhc3MgdG8gYmUgYWRkZWQuXG4gICAqXG4gICAqKi9cbiAgc2VsZWN0b3IuYWRkQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgYWRkQ2xhc3MgPSBpdGVtID0+IGl0ZW0uY2xhc3NMaXN0LmFkZChjKVxuICAgIGFyci5mb3JFYWNoKGFkZENsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQGRlc2MgUmVtb3ZlcyB0aGUgY2xhc3MgdG8gdGhlIEVsZW1lbnQgb3IgdG8gdGhlIE5vZGVMaXN0LlxuICAgKi9cbiAgc2VsZWN0b3IucmVtb3ZlQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgcmVtb3ZlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaChyZW1vdmVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIHRvIGVxdWFsIGV4YWN0bHkgdGhlIGNsYXNzIHN0cmluZy5cbiAgICovXG4gIHNlbGVjdG9yLnNldENsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIC8qKlxuICAgICogTk9OIElFIENMRUFORVIgU09MVVRJT05cbiAgICAqIGNvbnN0IHJlbW92ZUNsYXNzID0gaXRlbSA9PiBpdGVtLmNsYXNzTGlzdCA9IGM7XG4gICAgKiAgYXJyLmZvckVhY2gocmVtb3ZlQ2xhc3MpO1xuICAgICovXG5cbiAgICBjb25zdCBzZXRUaGVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlQ2xhc3NTdHJBcnIgPSBjb21wb3NlKHJlamVjdChpc0VtcHR5KSwgc3BsaXQoJyAnKSkoaXRlbS5jbGFzc05hbWUpXG4gICAgICBjb25zdCBjbGFzc1N0ckFyciA9IGMuc3BsaXQoJyAnKVxuICAgICAgY29uc3QgcmVtb3ZlciA9IHMgPT4gaXRlbS5jbGFzc0xpc3QucmVtb3ZlKHMpXG4gICAgICBjb25zdCBhZGRlciA9IHNlbCA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoc2VsKVxuICAgICAgcmVtb3ZlQ2xhc3NTdHJBcnIuZm9yRWFjaChyZW1vdmVyKVxuICAgICAgY2xhc3NTdHJBcnIuZm9yRWFjaChhZGRlcilcbiAgICB9XG4gICAgYXJyLmZvckVhY2goc2V0VGhlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNlbGVjdG9yLnVubW91bnQgPSAoKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coJ3VubW91bnRpbmcgc2VsZWN0b3IgJywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQHBhcmFtIHtCb29sZWFufSBib29sIERlZmF1bHQgaXMgdW5kZWZpbmVkLlxuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYm9vbGVhbiBvciB0aGUgdG9nZ2xlcyB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMucHJvcHMuZWwkLnRvZ2dsZUNsYXNzKCdteWNsYXNzJywgdHJ1ZSk7XG4gICAqXG4gICAqL1xuICBzZWxlY3Rvci50b2dnbGVDbGFzcyA9IChjLCBib29sKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCB0b2dnbGVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgYm9vbCA9IGJvb2wgIT09IHVuZGVmaW5lZCA/IGJvb2wgOiAhaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoYylcbiAgICAgIGJvb2wgPyBpdGVtLmNsYXNzTGlzdC5hZGQoYykgOiBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoYylcbiAgICB9XG4gICAgYXJyLmZvckVhY2godG9nZ2xlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNlbGVjdG9yLnRvZ2dsZSA9IChjLCBib29sKSA9PiB7XG4gICAgc2VsZWN0b3IudG9nZ2xlQ2xhc3MoYywgYm9vbClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGh0bWwgdG8gdGhlIFNlbGVjdG9yJ3MgZWxlbWVudFxuICAgKiBAcGFyYW0gaHRtbEVsZW1lbnRcbiAgICovXG4gIHNlbGVjdG9yLmFwcGVuZENoaWxkID0gKGh0bWxFbGVtZW50KSA9PiB7XG4gICAgaWYgKHNlbGVjdG9yLmVsLmxlbmd0aCAhPT0gMCkge1xuICAgICAgc2VsZWN0b3IuZWwuYXBwZW5kQ2hpbGQoaHRtbEVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke3NlbH0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHZhbGlkIWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yLmVsXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQWRkcyBjbGFzcyB3aXRoIGEgZGVsYXkgb2YgMW1zIHRvIGFsbG93IGNzcyB0byByZWdpc3RlciBhIHRyYW5zaXRpb24uXG4gICAqIEBwYXJhbSBjXG4gICAqL1xuICBzZWxlY3Rvci5hZGRBbmltQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGRlbGF5QWRkQ2xhc3MgPSAoKSA9PiB7XG4gICAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgICAgY29uc3QgYWRkQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcnIuZm9yRWFjaChhZGRDbGFzcylcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRlbGF5QWRkQ2xhc3MpXG4gICAgLy8gd2luZG93LnNldFRpbWVvdXQoZGVsYXlBZGRDbGFzcywgMSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGVsU2VsIFRoZSBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnQuXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIGFjdGl2ZSBIVE1MRWxlbWVudCBmcm9tIGEgTm9kZUxpc3QuXG4gICAqL1xuICBzZWxlY3Rvci5zZXRBY3RpdmVJdGVtID0gKGMsIGVsU2VsKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBjdXJyZW50RWwgPSB0eXBlb2YgKGVsU2VsKSA9PT0gJ3N0cmluZycgPyBnZXRFbE9yTGlzdChjeHQsIGVsU2VsKSA6IGVsU2VsXG4gICAgY29uc3QgdG9nZ2xlQm9vbCA9IGl0ZW0gPT4gaXRlbS5pc0VxdWFsTm9kZShjdXJyZW50RWwpID8gaXRlbS5jbGFzc0xpc3QuYWRkKGMpIDogaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgaWYgKGlzTm9kZUVsZW1lbnQoY3VycmVudEVsKSA9PT0gdHJ1ZSkge1xuICAgICAgYXJyLmZvckVhY2godG9nZ2xlQm9vbClcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlNFTCBJUyBcIixlbFNlbCxjKTtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke2VsU2VsfSwgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgaXRlbSBpbiBzZXRBY3RpdmVJdGVtOiAke2N9YClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogZ2V0dGVyIGZvciB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIGEgc2luZ2xlIGVsZW1lbnQgb3IgYSBOb2RlTGlzdCBmcm9tIHRoZSBzZWxlY3RvclxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGxlbmd0aFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBEZXRlcm1pbmVzIHRoZSBsZW5ndGggb2YgdGhlIE5vZGVMaXN0XG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdG9yIGFzIGEgTm9kZUxpc3RcbiAgICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBleGlzdHNcbiAgICpcbiAgICogQGRlc2NcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIHRoZSBzZWxlY3RlZCBlbGVtZW50IGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBCb29sZWFuXG4gICAqL1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2VsJywgeyBnZXQ6ICgpID0+IGdldEVsT3JMaXN0KGN4dCwgc2VsLCB0cnVlKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdlbHMnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnbGVuJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZXhpc3RzJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggPj0gMSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdleGlzdCcsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoID49IDEgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnbm9kZUxpc3QnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnYXJyJywge1xuICAgIGdldDogKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdHJ1ZSlcbiAgICAgIGlmIChlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfSBlbHNlIGlmIChlbC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW2VsXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWwpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2lubGluZScsIHsgc2V0OiAodmFsKSA9PiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCksIGdldDogKCkgPT4gc2VsZWN0b3IgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnaW5saW5lQ3NzJywgeyBzZXQ6ICh2YWwpID0+IHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSwgZ2V0OiAoKSA9PiBzZWxlY3RvciB9KVxuXG4gIHJldHVybiBzZWxlY3RvclxufVxuXG5leHBvcnQgeyBWaWV3U3RyZWFtU2VsZWN0b3IgfVxuIiwiaW1wb3J0IHsgYmFzZUNvcmVNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZSdcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUnXG5pbXBvcnQge1xuICBmaW5kU3RyT3JSZWdleE1hdGNoU3RyLFxuICBnZXRDb25zdHJ1Y3Rvck5hbWVcbn0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbUVsZW1lbnQgfSBmcm9tICcuL3ZpZXctc3RyZWFtLWVsZW1lbnQnXG5pbXBvcnQgeyByZWdpc3RlcmVkU3RyZWFtTmFtZXMgfSBmcm9tICcuLi9jaGFubmVscy9jaGFubmVscy1jb25maWcnXG5pbXBvcnQgeyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIgfSBmcm9tICcuL3ZpZXctc3RyZWFtLWJyb2FkY2FzdGVyJ1xuaW1wb3J0IHsgVmlld1N0cmVhbVBheWxvYWQgfSBmcm9tICcuL3ZpZXctc3RyZWFtLXBheWxvYWQnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZEZpbHRlciB9IGZyb20gJy4uL3V0aWxzL2NoYW5uZWwtcGF5bG9hZC1maWx0ZXInXG5pbXBvcnQgeyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtU2VsZWN0b3IgfSBmcm9tICcuL3ZpZXctc3RyZWFtLXNlbGVjdG9yJ1xuaW1wb3J0IHsgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWVyZ2VNYXAsIG1hcCwgdGFrZVdoaWxlLCBmaWx0ZXIsIHRhcCwgc2tpcCwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIHBpY2ssXG4gIGNvbXBvc2UsXG4gIGlzTmlsLFxuICBhbGwsXG4gIGZvckVhY2gsXG4gIHRvTG93ZXIsXG4gIGVpdGhlcixcbiAgZmluZEluZGV4LFxuICBhcHBseSxcbiAgdGVzdCxcbiAgZmxhdHRlbixcbiAgcHJvcCxcbiAgYWx3YXlzLFxuICBsdGUsXG4gIGRlZmF1bHRUbyxcbiAgcHJvcFNhdGlzZmllcyxcbiAgYWxsUGFzcyxcbiAgY3VycnksXG4gIGlzLFxuICBzbGljZSxcbiAgcGF0aCxcbiAgb21pdCxcbiAgaWZFbHNlLFxuICBtZXJnZVJpZ2h0LFxuICB3aGVyZSxcbiAgZXF1YWxzXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbVxuICAgKlxuICAgKiBAZGVzY1xuICAgKlxuICAgKiA8cD5WaWV3U3RyZWFtIGlzIHRoZSBpbnRlcmFjdGl2ZS12aWV3IGNvbXBvbmVudCwgYW5kIGl0cyBjb3JlIGZ1bmN0aW9uYWxpdHkgaXMgY29tcHJpc2VkIG9mIHR3byBpbnRlcm5hbCBjb21wb25lbnRzOiA8L3A+XG4gICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICB0aGlzLnZzbnVtID0gTWF0aC5yYW5kb20oKVxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLl9wb3N0UmVuZGVyQ2FsbGVkID0gZmFsc2VcbiAgICB0aGlzLmRlZmF1bHRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IHRoaXMuY3JlYXRlSWQoKVxuICAgICAgY29uc3QgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogdnNpZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdnNpZCxcbiAgICAgICAgaWQsXG4gICAgICAgIHRhZ05hbWU6ICdkaXYnLFxuICAgICAgICBlbDogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGFuaW1hdGVJbjogZmFsc2UsXG4gICAgICAgIGFuaW1hdGVJblRpbWU6IDAuNSxcbiAgICAgICAgYW5pbWF0ZU91dDogZmFsc2UsXG4gICAgICAgIGFuaW1hdGVPdXRUaW1lOiAwLjUsXG4gICAgICAgIHNlbmRMaWZlY3lsZUV2ZW50czogZmFsc2UsXG4gICAgICAgIGhhc2hJZDogYCMke2lkfWAsXG4gICAgICAgIGlkJDogYCMke2lkfWAsXG4gICAgICAgIHZpZXdDbGFzczogVmlld1N0cmVhbUVsZW1lbnQsXG4gICAgICAgIGV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzOiB7fSxcbiAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICB0ZW1wbGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBub2RlOiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgIG5hbWU6IGdldENvbnN0cnVjdG9yTmFtZSh0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdGF0ZSA9IHt9XG4gICAgdGhpcy4kZGlycyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpXG4gICAgdGhpcy5hZGREZWZhdWx0RGlyZWN0aW9uID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRGVmYXVsdERpclxuICAgIHRoaXMuYWRkRG93bkludGVybmFsRGlyID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRG93bkludGVybmFsRGlyXG4gICAgLy8gdGhpcy5wcm9wcyA9IE9iamVjdC5hc3NpZ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUbih7fSwgdGhpcy5kZWZhdWx0cygpLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IGRlZXBNZXJnZSh0aGlzLmRlZmF1bHRzKCksIHByb3BzKVxuICAgIHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZCA9IHRoaXMucHJvcHMuc2VuZExpZmVjeWxlRXZlbnRzID09PSB0cnVlID8gdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlLmJpbmQodGhpcykgOiB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZS5iaW5kKHRoaXMpXG4gICAgY29uc3QgYXR0cmlidXRlc0FyciA9IHRoaXMuYXR0cmlidXRlc0FycmF5XG4gICAgLy8gbGV0IGF0dHJpYnV0ZXNBcnIgPSBbJ2lkJywgJ2NsYXNzJywgJ2RhdGFzZXQnXTtcbiAgICB0aGlzLnByb3BzLmRvbUF0dHJpYnV0ZXMgPSBwaWNrKGF0dHJpYnV0ZXNBcnIsIHRoaXMucHJvcHMpXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgICB0aGlzLmxvYWRBbGxNZXRob2RzKClcbiAgICB0aGlzLnByb3BzLmFjdGlvbiA9ICdMT0FERUQnXG4gICAgdGhpcy5zaW5rJCA9IG5ldyBTdWJqZWN0KClcbiAgICBjb25zdCBWaWV3Q2xhc3MgPSB0aGlzLnByb3BzLnZpZXdDbGFzc1xuICAgIHRoaXMudmlldyA9IG5ldyBWaWV3Q2xhc3ModGhpcy5zaW5rJCwge30sIHRoaXMucHJvcHMudnNpZCxcbiAgICAgIHRoaXMucHJvcHMuaWQpLy8gbmV3IHRoaXMucHJvcHMudmlld0NsYXNzKHRoaXMuc2luayQpO1xuICAgIHRoaXMuc291cmNlU3RyZWFtcyA9IHRoaXMudmlldy5zb3VyY2VTdHJlYW1zXG4gICAgdGhpcy5fcmF3U291cmNlJCA9IHRoaXMudmlldy5nZXRTb3VyY2VTdHJlYW0oKVxuICAgIHRoaXMuX3Jhd1NvdXJjZSQudmlld05hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICB0aGlzLnNlbmRFdmVudHNEb3duU3RyZWFtID0gdGhpcy5zZW5kRXZlbnRzRG93blN0cmVhbUZuXG4gICAgdGhpcy5pbml0Vmlld1N0cmVhbSgpXG4gICAgdGhpcy5pc0Rldk1vZGUgPSBWaWV3U3RyZWFtLmlzRGV2TW9kZSgpXG4gICAgdGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzID0gW11cbiAgICB0aGlzLmNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQVNIIEtFWSBBTkQgU1BJR09UIE1FVEhPRFM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZ2V0IHNvdXJjZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSRcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIEdsb2JhbCBBdHRyaWJ1dGVzXG4gICAgICAnYWNjZXNza2V5JywgJ2NsYXNzJywgJ2NvbnRlbnRlZGl0YWJsZScsICdkaXInLCAnZHJhZ2dhYmxlJywgJ2hpZGRlbicsICdpZCcsICdsYW5nJywgJ3NwZWxsY2hlY2snLCAnc3R5bGUnLCAndGFiaW5kZXgnLCAndGl0bGUnLCAndHJhbnNsYXRlJyxcblxuICAgICAgLy8gQWNjZXNzaWJsaXR5IEF0dHJpYnV0ZXNcbiAgICAgICdhcmlhLWF1dG9jb21wbGV0ZScsICdhcmlhLWNoZWNrZWQnLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWV4cGFuZGVkJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1oaWRkZW4nLCAnYXJpYS1pbnZhbGlkJywgJ2FyaWEtbGFiZWwnLCAnYXJpYS1sZXZlbCcsICdhcmlhLW11bHRpbGluZScsICdhcmlhLW11bHRpc2VsZWN0YWJsZScsICdhcmlhLW9yaWVudGF0aW9uJywgJ2FyaWEtcHJlc3NlZCcsICdhcmlhLXJlYWRvbmx5JywgJ2FyaWEtcmVxdWlyZWQnLCAnYXJpYS1zZWxlY3RlZCcsICdhcmlhLXNvcnQnLCAnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJywgJ2FyaWEtdmFsdWVub3cnLCAnYXJpYS12YWx1ZXRleHQnLCAnYXJpYS1hdG9taWMnLCAnYXJpYS1idXN5JywgJ2FyaWEtbGl2ZScsICdhcmlhLXJlbGV2YW50JywgJ2FyaWEtZHJvcGVmZmVjdCcsICdhcmlhLWdyYWJiZWQnLCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgJ2FyaWEtY29udHJvbHMnLCAnYXJpYS1kZXNjcmliZWRieScsICdhcmlhLWZsb3d0bycsICdhcmlhLWxhYmVsbGVkYnknLCAnYXJpYS1vd25zJywgJ2FyaWEtcG9zaW5zZXQnLCAnYXJpYS1zZXRzaXplJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgaW5wdXRcbiAgICAgICdhY2NlcHQnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9mb2N1cycsICdjaGVja2VkJywgJ2Rpcm5hbWUnLCAnZGlzYWJsZWQnLCAnZm9ybScsICdmb3JtYWN0aW9uJyxcbiAgICAgICdmb3JtZW5jdHlwZScsICdmb3JtbWV0aG9kJywgJ2Zvcm1ub3ZhbGlkYXRlJywgJ2Zvcm10YXJnZXQnLCAnbGlzdCcsICdtYXgnLCAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW4nLCAnbWlubGVuZ3RoJywgJ211bHRpcGxlJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyZWFkb25seScsICdyZXF1aXJlZCcsICdzaXplJywgJ3N0ZXAnLCAndmFsdWUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBpbWdcbiAgICAgICdhbHQnLCAnc3Jjc2V0JywgJ3NpemVzJywgJ3VzZW1hcCcsICdpc21hcCcsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGEgYW5kIGxpbmtcbiAgICAgICdocmVmJywgJ3RhcmdldCcsICdkb3dubG9hZCcsICdwaW5nJywgJ3JlbCcsICdocmVmbGFuZycsICdhcycsICdtZWRpYScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGZvcm1cbiAgICAgICdhY2NlcHQtY2hhcnNldCcsICdhY3Rpb24nLCAnZW5jdHlwZScsICdub3ZhbGlkYXRlJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgbWV0YVxuICAgICAgJ2NvbnRlbnQnLCAnY2hhcnNldCcsICdodHRwLWVxdWl2JyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3Igc2NyaXB0XG4gICAgICAnYXN5bmMnLCAnZGVmZXInLCAnaW50ZWdyaXR5JywgJ25vbW9kdWxlJywgJ25vbmNlJywgJ3JlZmVycmVycG9saWN5JyxcblxuICAgICAgLy8gT3RoZXIgRWxlbWVudC1zcGVjaWZpYyBBdHRyaWJ1dGVzXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLCAnYXV0b3BsYXknLCAnYnVmZmVyZWQnLCAnY2hhbGxlbmdlJywgJ2NpdGUnLCAnY29kZScsICdjb2RlYmFzZScsICdjb2xvcicsICdjb2xzJywgJ2NvbHNwYW4nLCAnY29udGV4dG1lbnUnLCAnY29udHJvbHMnLCAnY29vcmRzJywgJ2Nyb3Nzb3JpZ2luJywgJ2NzcCcsICdkYXRhc2V0JywgJ2RhdGV0aW1lJywgJ2RlY29kaW5nJywgJ2RlZmF1bHQnLCAnZm9yJywgJ2hlYWRlcnMnLCAnaGlnaCcsICdpY29uJywgJ2ltcG9ydGFuY2UnLCAnaXRlbXByb3AnLCAna2V5dHlwZScsICdraW5kJywgJ2xhYmVsJywgJ2xhbmd1YWdlJywgJ2xhenlsb2FkJywgJ2xvb3AnLCAnbG93JywgJ21hbmlmZXN0JywgJ21ldGhvZCcsICdtdXRlZCcsICdvcGVuJywgJ29wdGltdW0nLCAncG9zdGVyJywgJ3ByZWxvYWQnLCAncmFkaW9ncm91cCcsICdyZXZlcnNlZCcsICdyb2xlJywgJ3Jvd3MnLCAncm93c3BhbicsICdzYW5kYm94JywgJ3Njb3BlJywgJ3Njb3BlZCcsICdzZWxlY3RlZCcsICdzaGFwZScsICdzbG90JywgJ3NwYW4nLCAnc3JjZG9jJywgJ3NyYycsICd0eXBlJywgJ3NyY2xhbmcnLCAnc3RhcnQnLCAnc3VtbWFyeScsICd3cmFwJywgJ3dpZHRoJywgJ2hlaWdodCdcbiAgICBdXG4gIH1cblxuICBzdGF0aWMgaXNEZXZNb2RlKCkge1xuICAgIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQoY2hhbm5lbHNBcnIgPSBbXSwgYWN0aW9uc0Fycikge1xuICAgIGlmIChhY3Rpb25zQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdldEFsbEFjdGlvbnMgPSAoYSkgPT4ge1xuICAgICAgICBjb25zdCBnZXRSZWdpc3RlcmVkQWN0aW9uc0FyciA9IChzdHIpID0+IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpXG4gICAgICAgIGNvbnN0IGFyciA9ICBhLm1hcChnZXRSZWdpc3RlcmVkQWN0aW9uc0FycilcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyKVxuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tGb3JNYXRjaCA9IChzdHJNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoc3RyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGFjdGlvbkluZGV4ID0gZmluZEluZGV4KHRlc3QocmUpLCBnZXRBbGxBY3Rpb25zQXJyKVxuICAgICAgICBpZiAoYWN0aW9uSW5kZXggPCAwKSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbFN5bnRheCA9IGNoYW5uZWxzQXJyLmxlbmd0aCA9PT0gMSA/ICdmcm9tIGFkZGVkIGNoYW5uZWwnIDogJ2Zyb20gYWRkZWQgY2hhbm5lbHMnXG4gICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYWN0aW9uLCAke3N0ck1hdGNofSwgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgYWN0aW9ucyAke2NoYW5uZWxTeW50YXh9LCAke2NoYW5uZWxzQXJyLmpvaW4oJywgJyl9YClcbiAgICAgICAgfVxuICAgICAgICAvLyAgY29uc3QgdnNudW0gPSAoKT0+IFIudGVzdChuZXcgUmVnRXhwKHN0ciksIFwiQ0hBTk5FTF9ST1VURV9URVNUX0VWRU5UXCIpXG4gICAgICB9XG4gICAgICBjb25zdCBnZXRBbGxBY3Rpb25zQXJyID0gZ2V0QWxsQWN0aW9ucyhjaGFubmVsc0FycilcbiAgICAgIGFjdGlvbnNBcnIuZm9yRWFjaChjaGVja0Zvck1hdGNoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGQgYW55IHF1ZXJ5IHdpdGhpbiB0aGUgVmlld1N0cmVhbSdzIGRvbSBhbmQgYW55IGRvbSBldmVudHMgdG8gYXV0b21hdGljYWxseSBiZSBvYnNlcnZlZCBieSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogPGJyPlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgKiAgLy8gQUREIEJVVFRPTiBFVkVOVFMgQVMgTkVTVEVEIEFSUkFZU1xuICAgKiAgcmV0dXJuIFtcbiAgICogICAgICAgWycjbXktYnV0dG9uJywgJ21vdXNlb3ZlciddLFxuICAgKiAgICAgICBbJyNteS1pbnB1dCcsICdjaGFuZ2UnXVxuICAgKiAgICAgXVxuICAgKiAgIH1cbiAgICpcbiAgICpcbiAgICogKi9cblxuICBzdGF0aWMgaXNWYWxpZE5lc3RlZEFycihldmVudHNBcnIpIHtcbiAgICBjb25zdCBpc1RydWUgPSBlcXVhbHModHJ1ZSlcbiAgICBjb25zdCBhbGxJc1RydWUgPSBhbGwoaXNUcnVlKVxuICAgIGNvbnN0IGlzU3RyaW5nID0gaXMoU3RyaW5nKVxuICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBjb21wb3NlKGFsbElzVHJ1ZSwgck1hcChpc1N0cmluZyksIHNsaWNlKDAsIDIpLCBkZWZhdWx0VG8oW10pKVxuICAgIGNvbnN0IG1hcEV2ZW50c0FyckZuID0gY29tcG9zZShhbGxJc1RydWUsIHJNYXAoaXNWYWxpZEFyciksIGRlZmF1bHRUbyhbXSkpXG4gICAgcmV0dXJuIG1hcEV2ZW50c0FyckZuKGV2ZW50c0FycilcbiAgfVxuXG4gIHN0YXRpYyBlbElzRG9tRWxlbWVudChvKSB7XG4gICAgaWYgKGlzKFN0cmluZywgbykpIHtcbiAgICAgIG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG8pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKShvKVxuICB9XG5cbiAgdXBkYXRlUHJvcHNUb01hdGNoRWwoKSB7XG4gICAgY29uc3QgZ2V0VGFnTmFtZSA9IGNvbXBvc2UodG9Mb3dlciwgZWl0aGVyKHByb3AoJ3RhZ05hbWUnKSwgYWx3YXlzKCcnKSkpXG4gICAgdGhpcy5wcm9wcy50YWdOYW1lID0gZ2V0VGFnTmFtZSh0aGlzLnByb3BzLmVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpIHtcbiAgICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuICAgIGNvbnN0IGVsSXNSZW5kZXJlZCA9IGVsID0+IGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpXG4gICAgY29uc3QgZWxJc1JlYWR5Qm9vbCA9IHByb3BTYXRpc2ZpZXMoXG4gICAgICBhbGxQYXNzKFtlbElzUmVuZGVyZWQsIGVsSXNEb21FbGVtZW50XSksICdlbCcpXG4gICAgaWYgKGVsSXNSZWFkeUJvb2wodGhpcy5wcm9wcykpIHtcbiAgICAgIHRoaXMudXBkYXRlUHJvcHNUb01hdGNoRWwoKVxuICAgICAgdGhpcy5wb3N0UmVuZGVyKClcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZWwgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNweW5lIEVycm9yOiBUaGUgZGVmaW5lZCBlbGVtZW50IGZvciB0aGlzIFZpZXdTdHJlYW0gaW5zdGFuY2UsICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSwgYXBwZWFycyB0byBub3QgZXhpc3QuYClcbiAgICB9XG4gIH1cblxuICBsb2FkQWxsTWV0aG9kcygpIHtcbiAgICBjb25zdCBjaGFubmVsRm4gPSBjdXJyeSh0aGlzLm9uQ2hhbm5lbE1ldGhvZENhbGwuYmluZCh0aGlzKSlcbiAgICBjb25zdCBjcmVhdGVFeHRyYVN0YXRlc01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgIGxldCBbYWN0aW9uLCBmdW5jU3RyLCBhY3Rpb25GaWx0ZXJdID0gYXJyXG4gICAgICBpZiAoaXMoU3RyaW5nLCBhY3Rpb25GaWx0ZXIpKSB7XG4gICAgICAgIGFjdGlvbkZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcih7IHNlbGVjdG9yOmFjdGlvbkZpbHRlciB9KVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc1thY3Rpb25dID0gY2hhbm5lbEZuKGZ1bmNTdHIsXG4gICAgICAgIGFjdGlvbkZpbHRlcilcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKS5mb3JFYWNoKGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kKVxuICAgIHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMgPSB0aGlzLnNldFNvdXJjZUhhc2hNZXRob2RzKFxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcylcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBjaGFubmVsIGFjdGlvbnMgdG8gbG9jYWwgbWV0aG9kcywgZm9ybWF0dGVkIGFzIGFycmF5IHZhbHVlcy5cbiAgICogPHVsPlxuICAgKiA8bGk+PGI+Rmlyc3QgdmFsdWU6PC9iPiBBY3Rpb24gbmFtZSwgYXMgYSBzdHJpbmcgb3IgYXMgYSBiYXNpYyBSZWd1bGFyIEV4cHJlc3Npb24uXG4gICAqIDxsaT48Yj5TZWNvbmQgdmFsdWU6PC9iPiBUaGUgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3Rpb24gaXMgcHVibGlzaGVkLlxuICAgKiA8bGk+PGI+VGhpcmQgb3B0aW9uYWwgdmFsdWU6PC9iPiBUaGlzIGlzIGEgZmlsdGVyIG9wdGlvbiB0aGF0IGNhbiBiZSBhIHNlbGVjdG9yIHN0cmluZy4gb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIExJTktbJ2NoYW5uZWxQYXlsb2FkRmlsdGVyJywgJ2NoYW5uZWwtcGF5bG9hZC1maWx0ZXInXS5cbiAgICogPC91bD5cbiAgICogQGV4YW1wbGVcbiAgICogICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICByZXR1cm4gW1xuICAgKiAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsICdsaS5teWNsYXNzJ10sXG4gICAqICAgICBbJ0NIQU5ORUxfTVlfQ1VTVE9NX0VWRU5UJywgJ29uQWN0aW9uUmV0dXJuZWQnXVxuICAgKiAgICAgICAgICAgIF1cbiAgICogICAgICAgICAgIH1cbiAgICpcbiAgICogQHJldHVybnMgTmVzdGVkIEFycmF5XG4gICAqL1xuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBvbkNoYW5uZWxNZXRob2RDYWxsKHN0ciwgYWN0aW9uRmlsdGVyLCBwKSB7XG4gICAgY29uc3QgcnVuRnVuYyA9IChwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAodGhpc1tzdHJdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kLCAke3N0cn0gZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tzdHJdKHBheWxvYWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHAuJGRpciAhPT0gdW5kZWZpbmVkICYmIHAuJGRpci5pbmNsdWRlcygnY2hpbGQnKSAmJlxuICAgICAgICB0aGlzLmRlbGV0ZWQgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IG9iaiA9IGRlZXBNZXJnZSh7fSwgcCkvLyBPYmplY3QuYXNzaWduKHt9LCBwKTtcbiAgICAgIG9iai4kZGlyID0gdGhpcy4kZGlycy5DXG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMucmF3JC5uZXh0KG9iailcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyUGF5bG9hZCA9IGRlZmF1bHRUbyhhbHdheXModHJ1ZSksIGFjdGlvbkZpbHRlcilcblxuICAgIGlmIChmaWx0ZXJQYXlsb2FkKHApID09PSB0cnVlKSB7XG4gICAgICBwID0gb21pdChbJyRkaXInXSwgcClcbiAgICAgIHJ1bkZ1bmMocClcbiAgICB9XG4gIH1cblxuICBzZXRTb3VyY2VIYXNoTWV0aG9kcyhleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyA9IHt9KSB7XG4gICAgY29uc3QgaGFzaFNvdXJjZUtleXMgPSB7XG4gICAgICBFWFRJUlBBVElORzogKHApID0+IHRoaXMuY2hlY2tQYXJlbnREaXNwb3NlKHApLFxuICAgICAgRVhUSVJQQVRFOiAocCkgPT4gdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKSxcbiAgICAgIC8vICdDSElMRF9FWFRJUlBBVEUnICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApLFxuICAgICAgVlNfU1BBV05FRDogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICBWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQ6IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIC8vICdDSElMRF9WU19TUEFXTkVEJyAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmF0dGFjaENoaWxkVG9WaWV3KHApLFxuICAgICAgUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1Q6IChwKSA9PiB0aGlzLm9uUmVhZHlUb0dDKHApLFxuICAgICAgVlNfTlVMTElUWTogKCkgPT4gKHt9KVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlLmFsbChbe30sIGhhc2hTb3VyY2VLZXlzLCBleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc10pXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IE1BSU4gU1RSRUFNIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaW5pdFZpZXdTdHJlYW0oKSB7XG4gICAgdGhpcy5fc291cmNlJCA9IHRoaXMuX3Jhd1NvdXJjZSQucGlwZShtYXAoXG4gICAgICAocGF5bG9hZCkgPT4gdGhpcy5vbk1hcFZpZXdTb3VyY2UocGF5bG9hZCkpLCB0YWtlV2hpbGUodGhpcy5ub3RHQ1NUQVRFKSlcblxuICAgIHRoaXMuaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMoKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMuX3NvdXJjZSQsIHRydWUpXG4gIH1cblxuICBub3RHQ1NUQVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBlcUdDU1RBVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIG5vdENPTVBMRVRFRChwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnQ09NUExFVEVEJylcbiAgfVxuXG4gIG5vdEdDQ09NUExFVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ0dDX0NPTVBMRVRFJylcbiAgfVxuXG4gIHRlc3RWYWwocCkge1xuICAgIGNvbnNvbGUubG9nKCdURVNUSU5HIFZBTEwgSVMgJywgcClcbiAgfVxuXG4gIGFkZFBhcmVudFN0cmVhbShvYnMsIGF0dGFjaERhdGEpIHtcbiAgICBjb25zdCBmaWx0ZXJPdXROdWxsRGF0YSA9IChkYXRhKSA9PiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YS5hY3Rpb24gIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgIGNvbnN0IGNoZWNrSWZEaXNwb3NlT3JGYWRlb3V0ID0gKGQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBkZWVwTWVyZ2Uoe30sIGQpXG5cbiAgICAgIGlmIChkYXRhLmFjdGlvbiA9PT0gJ0VYVElSUEFURV9BTkRfUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0oZGF0YSlcbiAgICAgICAgZGF0YS5hY3Rpb24gPSAnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHRoaXMucGFyZW50JCA9IG9icy5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIG1hcChjaGVja0lmRGlzcG9zZU9yRmFkZW91dCkpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5wYXJlbnQkLCBmYWxzZSwgJ1BBUkVOVCcpXG4gICAgdGhpcy5yZW5kZXJBbmRBdHRhY2hUb1BhcmVudChhdHRhY2hEYXRhKVxuICB9XG5cbiAgYWRkQ2hpbGRTdHJlYW0ob2JzJCkge1xuICAgIGNvbnN0IGZpbHRlck91dE51bGxEYXRhID0gKGRhdGEpID0+IGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmFjdGlvbiAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hpbGQkID0gb2JzJC5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIHRhcChwID0+IHRoaXMudHJhY2VyKCdhZGRDaGlsZFN0cmFlbSBkbyAnLCBwKSksXG4gICAgICBtYXAoKHApID0+IHtcbiAgICAgICAgcmV0dXJuIHBcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUocCA9PiB0aGlzLm9uQ2hpbGRDb21wbGV0ZWQoY2hpbGQkLnNvdXJjZSkpKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoaWxkJCwgdHJ1ZSwgJ0NISUxEJylcbiAgfVxuXG4gIG9uQ2hpbGREaXNwb3NlZChwKSB7XG5cbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvbkNoaWxkQ29tcGxldGVkKHApIHtcbiAgICBjb25zdCBmaW5kTmFtZSA9ICh4KSA9PiB7XG4gICAgICBjb25zdCBmaW5hbERlc3QgPSAoeSkgPT4ge1xuICAgICAgICB3aGlsZSAoeS5kZXN0aW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgeSA9IGZpbmFsRGVzdCh5LmRlc3RpbmF0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5XG4gICAgICB9XG4gICAgICByZXR1cm4gcGljayhbJ2lkJywgJ3ZzaWQnXSwgZmluYWxEZXN0KHgpKVxuICAgIH1cbiAgICBjb25zdCBjaGlsZENvbXBsZXRlZERhdGEgPSBmaW5kTmFtZShwKVxuICAgIHRoaXMudHJhY2VyKCdvbkNoaWxkQ29tcGxldGVkICcsIHRoaXMudnNudW0sIHApXG4gICAgLy8gY29uc29sZS5sb2coJ29iaiBpcyAnLGNoaWxkQ29tcGxldGVkTmFtZSxvYmosdGhpcy5wcm9wcyk7XG4gICAgdGhpcy5vbkNoaWxkRGlzcG9zZWQoY2hpbGRDb21wbGV0ZWREYXRhLCBwKVxuICAgIHJldHVybiBjaGlsZENvbXBsZXRlZERhdGFcbiAgfVxuXG4gIGluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zKCkge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSVBUSU9OIFNPVVJDRSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3Vic2NyaWJlciA9IHtcbiAgICAgIG5leHQ6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0LmJpbmQodGhpcyksXG4gICAgICBlcnJvcjogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0Vycm9yLmJpbmQodGhpcyksXG4gICAgICBjb21wbGV0ZTogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlLmJpbmQodGhpcylcbiAgICB9XG4gICAgLy8gbGV0IHRha2VCZWZvcmVHQ09sZCA9ICh2YWwpID0+IHZhbC5hY3Rpb24gIT09ICdWU19ERVRSSVRVU19DT0xMRUNURUQnO1xuICAgIC8vIGxldCB0YWtlQmVmb3JlR0MgPSAocCkgPT4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpO1xuICAgIC8vIGxldCBtYXBUb1N0YXRlID0gKHZhbCkgPT4gKHthY3Rpb246dmFsfSk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vID09PT09PT09PT0gTUVUSE9EUyBUTyBDSEVDSyBGT1IgV0hFTiBUTyBDT01QTEVURSBUSEUgU1RSRUFNID09PT09PT09PVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5lbCQgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudWJlclNvdXJjZSQuY29tcGxldGUoKVxuICAgICAgdGhpcy5hdXRvU3Vic2NyaWJlciQuY29tcGxldGUoKVxuICAgICAgdGhpcy5zaW5rJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlXG4gICAgICB0aGlzLnRyYWNlcignY29tcGxldGVBbGwnLCB0aGlzLmRlbGV0ZWQsIHRoaXMucHJvcHMpXG4gICAgfVxuICAgIGNvbnN0IGRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCA9ICgpID0+IHtcbiAgICAgIG9ic0NvdW50IC09IDFcbiAgICAgIGlmIChvYnNDb3VudCA9PT0gMCkge1xuICAgICAgICBjb21wbGV0ZUFsbCgpXG4gICAgICB9XG4gICAgfVxuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSU5JVCBTVFJFQU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgb2JzQ291bnQgPSAwXG4gICAgdGhpcy51YmVyU291cmNlJCA9IG5ldyBTdWJqZWN0KClcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDT01QT1NFRCBSWEpTIE9CU0VSVkFCTEUgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IGluY3JlbWVudE9ic2VydmFibGVzVGhhdENsb3NlcyA9ICgpID0+IHsgb2JzQ291bnQgKz0gMSB9XG4gICAgdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JCA9IHRoaXMudWJlclNvdXJjZSQucGlwZShtZXJnZU1hcCgob2JzRGF0YSkgPT4ge1xuICAgICAgY29uc3QgYnJhbmNoT2JzZXJ2YWJsZSQgPSBvYnNEYXRhLm9ic2VydmFibGUucGlwZShmaWx0ZXIoXG4gICAgICAgIChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCksIG1hcChwID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1BBWUxPQUQgSVMgJywgcCwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVlcE1lcmdlKHt9LCBwKVxuICAgICAgICBwYXlsb2FkLmFjdGlvbiA9IHAuYWN0aW9uLy8gYWRkUmVsYXRpb25Ub1N0YXRlKG9ic0RhdGEucmVsLCBwLmFjdGlvbik7XG4gICAgICAgIHRoaXMudHJhY2VyKCdhdXRvTWVyZ2VTdWJqZWN0JCcsIHBheWxvYWQpXG4gICAgICAgIHJldHVybiBwYXlsb2FkXG4gICAgICB9KSlcblxuICAgICAgaWYgKG9ic0RhdGEuYXV0b0Nsb3Nlc0Jvb2wgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hPYnNlcnZhYmxlJFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jcmVtZW50T2JzZXJ2YWJsZXNUaGF0Q2xvc2VzKClcbiAgICAgICAgcmV0dXJuIGJyYW5jaE9ic2VydmFibGUkLnBpcGUoZmluYWxpemUoZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkKSlcbiAgICAgIH1cbiAgICB9KSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHRoaXMuYXV0b1N1YnNjcmliZXIkID0gdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JFxuICAgIC8vIC5kbygocCkgPT4gY29uc29sZS5sb2coJ1NJTksgREFUQSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHApKVxuICAgICAgLnBpcGUoZmlsdGVyKChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG4gICAgICAuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE1FUkdFIFNUUkVBTVMgVE8gTUFJTiBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09XG4gIHVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihvYnMkLCBhdXRvQ2xvc2VzQm9vbCA9IGZhbHNlLCByZWwpIHtcbiAgICAvLyBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuREkgOiB0aGlzLiRkaXJzLkk7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgb2JzZXJ2YWJsZTogb2JzJCxcbiAgICAgIGF1dG9DbG9zZXNCb29sLFxuICAgICAgcmVsXG4gICAgfVxuICAgIHRoaXMudHJhY2VyKCd1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24gJywgdGhpcy52c251bSwgb2JqKVxuICAgIHRoaXMudWJlclNvdXJjZSQubmV4dChvYmopXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dChwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0VG9GbiA9IGRlZmF1bHRUbygocCkgPT4gdGhpcy5zZW5kRXh0ZW5kZWRTdHJlYW1zKHApKVxuXG4gICAgLy8gKioqKlVTRSBSRUdFWCBBUyBQUkVESUNBVEUgQ0hFQ0sgRk9SIFBBWUxPQUQuQUNUSU9OIElOIEhBU0ggTUVUSE9EUyBPQkpcbiAgICAvLyBjb25zdCBoYXNoQWN0aW9uID0gdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kc1twYXlsb2FkLmFjdGlvbl07XG4gICAgY29uc3QgaGFzaEFjdGlvblN0ciA9IGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIodGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyxcbiAgICAgIHBheWxvYWQuYWN0aW9uKVxuICAgIGNvbnN0IGhhc2hBY3Rpb24gPSB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzW2hhc2hBY3Rpb25TdHJdXG4gICAgLy8gY29uc29sZS5sb2coJ1MgUEFZTE9BRCAnLCB0aGlzLnByb3BzLm5hbWUsIHR5cGVvZiAoaGFzaEFjdGlvbiksIHBheWxvYWQpO1xuXG4gICAgY29uc3QgZm4gPSBkZWZhdWx0VG9GbihoYXNoQWN0aW9uKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ2hhc2ggbWV0aG9kcyAnLCBmbiwgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkLmFjdGlvbiwgaGFzaEFjdGlvblN0ciwgdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyk7XG5cbiAgICBmbihwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKGZuLCBwYXlsb2FkLCAnIFRIRSBQQVlMT0FEIEZST00gU1VCU0NSSUJFIElTICcsICcgLS0tLSAnLCAnIC0tLT4gJywgdGhpcy5wcm9wcyk7XG4gICAgLy8gY29uc29sZS5sb2coJ0VYVElSUEFURVIgVlMgTkVYVCcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZCk7XG5cbiAgICB0aGlzLnRyYWNlcignb25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0JywgeyBwYXlsb2FkIH0pXG4gIH1cblxuICBvblN1YnNjcmliZVRvU291cmNlc0Vycm9yKHBheWxvYWQgPSAnJykge1xuICAgIGNvbnNvbGUubG9nKCdBTEwgRVJST1IgICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZClcbiAgfVxuXG4gIC8qXG4gICAgYXR0YWNoQ2hpbGRUb1ZpZXcoZGF0YSkge1xuICAgICAgLy8gbGV0IGNoaWxkUmVuZGVyRGF0YSA9IGRhdGEuYXR0YWNoRGF0YTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdDSElMRCBEQVRBICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgY2hpbGRSZW5kZXJEYXRhKTtcbiAgICAgIC8vIHRoaXMub3BlblNwaWdvdCgnQVRUQUNIX0NISUxEX1RPX1NFTEYnLCB7Y2hpbGRSZW5kZXJEYXRhfSk7XG4gICAgfVxuICAqL1xuXG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJz09PT0gRVhUSVJQQVRFUiBBTEwgQ09NUExFVEVEID09PT0nLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMudHJhY2VyKCdvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlJywgJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuXG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIHNlbmRFeHRlbmRlZFN0cmVhbXMocGF5bG9hZCkge1xuICAgIHRoaXMudHJhY2VyKCdzZW5kRXh0ZW5kZWRTdHJlYW1zJywgcGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZygnZXh0ZW5kZWQgbWV0aG9kcyAnLCBwYXlsb2FkLmFjdGlvbiwgcGF5bG9hZCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KHBheWxvYWQuYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWU19TUEFXTiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoYXR0YWNoRGF0YSkge1xuICAgIC8vIGxldCBjaGlsZFJlbmRlckRhdGEgPSBhdHRhY2hEYXRhO1xuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQnLCBhdHRhY2hEYXRhKVxuICB9XG5cbiAgcmVuZGVyVmlldygpIHtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOJylcbiAgfVxuXG4gIHJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCB0eXBlLCBhdHRhY2hUeXBlKSB7XG4gICAgY29uc3QgYXR0YWNoRGF0YSA9IHsgbm9kZSwgdHlwZSwgYXR0YWNoVHlwZSB9XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTScsIHsgYXR0YWNoRGF0YSB9KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFWFRJUlBBVEUgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY2hlY2tQYXJlbnREaXNwb3NlKHApIHtcbiAgICBpZiAocC5mcm9tJCA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocClcbiAgICB9XG4gIH1cblxuICBvbkJlZm9yZURpc3Bvc2UoKSB7XG5cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU0lOSyQgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICpcbiAgICogV3JhcHMgd2luZG93LnNldFRpbWVvdXQgd2l0aCBhIGNoZWNrIHRvIHNlZSBpZiBcInRoaXNcIiBWaWV3U3RyZWFtIGVsZW1lbnQgYW5kIGl0cyBwcm9wcyBwcm9wZXJ0eSBzdGlsbCBleGlzdHNcbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZm4gLSA9ICdmdW5jdGlvbic7IFRoZSBsb2NhbCBtZXRob2QgdGhhdCBpcyB0byBiZSBjYWxsZWQuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtcyAtID0gMDsgIFRoZSB0aW1lLCBpbiBtaWxsZXNlY29uZHMsIGZvciB0aGUgdGltZW91dC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBiaW5kIC0gPSBmYWxzZTsgIFdoZW4gdHJ1ZSwgd2lsbCBiaW5kIHRoZSBtZXRob2QgdG8gJ3RoaXMnLlxuICAgKlxuICAgKi9cblxuICBzZXRUaW1lb3V0KGZuLCBtcyA9IDAsIGJpbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRpbWVvdXRNZXRob2QgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kRm4gPSBiaW5kID09PSB0cnVlID8gZm4uYmluZCh0aGlzKSA6IGZuXG4gICAgICAgIGFwcGx5KG1ldGhvZEZuLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aW1lb3V0TWV0aG9kLCBtcylcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBCZWdpbnMgdGhlIHJlbW92YWwgcHJvY2VzcyBvZiB0aGUgVmlld1N0cmVhbSBpbnN0YW5jZSBhbG9uZyB3aXRoIGFsbCBvZiBpdHMgY2hhaW5lZCBWaWV3U3RyZWFtIGNoaWxkcmVuLlxuICAgKi9cbiAgZGlzcG9zZVZpZXdTdHJlYW0ocCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdFWFRJUlBBVEVSIFZTIG9uRGlzcG9zZSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub25CZWZvcmVEaXNwb3NlKClcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ0VYVElSUEFURScpXG4gIH1cblxuICBvbkNoaWxkRGlzcG9zZShwKSB7XG4gIH1cblxuICBvblBhcmVudERpc3Bvc2luZyhwKSB7XG4gICAgLy8gdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5fc291cmNlJCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdFWFRJUlBBVEUnKVxuICB9XG5cbiAgb25SZWFkeVRvR0MocCkge1xuICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBwLmZyb20kICE9PSB1bmRlZmluZWQgJiYgcC5mcm9tJCA9PT0gJ2ludGVybmFsJ1xuICAgIGlmIChpc0ludGVybmFsKSB7XG4gICAgICAvLyB0aGlzLm9wZW5TcGlnb3QoJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKTtcbiAgICB9XG4gICAgdGhpcy50cmFjZXIoJ29uUmVhZHlUb0dDJywgaXNJbnRlcm5hbCwgcClcbiAgfVxuXG4gIG9wZW5TcGlnb3QoYWN0aW9uLCBvYmogPSB7fSkge1xuICAgIGlmICh0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHJvcHMuYWN0aW9uID0gYWN0aW9uXG4gICAgICBjb25zdCBkYXRhID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBvYmopXG4gICAgICAvLyBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIG9iaik7XG5cbiAgICAgIHRoaXMuc2luayQubmV4dChPYmplY3QuZnJlZXplKGRhdGEpKVxuICAgIH1cbiAgfVxuXG4gIHNldEF0dGFjaERhdGEoYXR0YWNoVHlwZSwgcXVlcnkpIHtcbiAgICBjb25zdCBjaGVja1F1ZXJ5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgcSA9IHRoaXMucHJvcHMuZWwucXVlcnlTZWxlY3RvcihxdWVyeSlcbiAgICAgIGNvbnN0IGlzRGV2TW9kZSA9IFZpZXdTdHJlYW0uaXNEZXZNb2RlKClcbiAgICAgIGlmIChpc0Rldk1vZGUgPT09IHRydWUgJiYgaXMoU3RyaW5nLCBxdWVyeSkgJiYgaXNOaWwocSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXBwZW5kVmlldyBxdWVyeSBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke3F1ZXJ5fScsIGFwcGVhcnMgdG8gbm90IGV4aXN0IWApXG4gICAgICB9XG4gICAgICByZXR1cm4gcVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBub2RlOiB0aGlzLnByb3BzLmVsLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogY2hlY2tRdWVyeShxdWVyeSlcbiAgICB9XG4gIH1cblxuICBnZXRQYXJlbnRFbHMoZWwsIG51bSkge1xuICAgIGNvbnN0IGdldEVsZW0gPSBlbCA9PiBlbC5wYXJlbnRFbGVtZW50XG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgbGV0IHBhcmVudEVsID0gZWxcbiAgICB3aGlsZSAoaXRlciA8IG51bSkge1xuICAgICAgcGFyZW50RWwgPSBnZXRFbGVtKHBhcmVudEVsKVxuICAgICAgaXRlcisrXG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRFbFxuICB9XG5cbiAgc2V0QXR0YWNoUGFyZW50RGF0YShhdHRhY2hUeXBlLCBxdWVyeSwgbGV2ZWwpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5ICE9PSAnJyA/IHF1ZXJ5IDogdW5kZWZpbmVkXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0UGFyZW50RWxzKHRoaXMucHJvcHMuZWwsIGxldmVsKVxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogbm9kZS5xdWVyeVNlbGVjdG9yKHF1ZXJ5KVxuICAgIH1cbiAgfVxuXG4gIG9uTWFwVmlld1NvdXJjZShwYXlsb2FkID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBwYXlsb2FkKVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFUVEFDSCBTVFJFQU0gQU5EIERPTSBEQVRBIEFHR1JFR0FUT1JTPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZChjaGlsZFZpZXcsIGF0dGFjaERhdGEpIHtcbiAgICB0aGlzLmFkZENoaWxkU3RyZWFtKGNoaWxkVmlldy5zb3VyY2VTdHJlYW1zLnRvUGFyZW50JClcbiAgICBjaGlsZFZpZXcuYWRkUGFyZW50U3RyZWFtKHRoaXMuc291cmNlU3RyZWFtcy50b0NoaWxkJCwgYXR0YWNoRGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICogbGV0IHZpZXdTdHJlYW0gPSBuZXcgVmlld1N0cmVhbSgnaDInLCAnSGVsbG8gV29ybGQnKTtcbiAgICogdmlld1N0cmVhbS5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICovXG4gIGFwcGVuZFRvRG9tKG5vZGUpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImFwcGVuZCB0byBkb20gXCIsdGhpcy5wcm9wcy52c2lkLCB0aGlzLnByb3BzLmVsKTtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYXBwZW5kZWRUb0RvbS4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FwcGVuZENoaWxkJylcbiAgfVxuXG4gIGFwcGVuZFRvRG9tQWZ0ZXIobm9kZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBhcHBlbmRlZFRvRG9tQWZ0ZXIuIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhZnRlcicpXG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgdGhlIGN1cnJlbnQgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqL1xuXG4gIHByZXBlbmRUb0RvbShub2RlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZXBlbmRlZFRvRG9tLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAncHJlcGVuZENoaWxkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QuIDxicj5BZnRlciB0aGUgYXR0YWNobWVudCwgcnhqcyBvYnNlcnZhYmxlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgVmlld1N0cmVhbSBvYmplY3RzLjxicj48YnI+XG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFZpZXcoY2hpbGRWaWV3KVxuICAgKlxuICAgKiAqL1xuICBhcHBlbmRWaWV3KHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSkpXG4gIH1cblxuICBhcHBlbmRWaWV3QWZ0ZXIodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdhZnRlcicsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHBhcmFtIHtsZXZlbH0gdGhpcyBwYXJhbWV0ZXJzIGNhbiBhdHRhY2ggdGhlIHZpZXdTdHJlYW0ncyBkb20gZWxlbWVudCB1cCB0aGUgZG9tIHRyZWUgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgb2YgdGhlIFZpZXdTdHJlYW0gb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIGNoaWxkVmlldy5hcHBlbmRUb1BhcmVudChwYXJlbnRWaWV3KVxuICAgKlxuICAgKiAqL1xuXG4gIGFwcGVuZFZpZXdUb1BhcmVudEVsKHYsIHF1ZXJ5LCBsZXZlbCA9IDEpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodixcbiAgICAgIHRoaXMuc2V0QXR0YWNoUGFyZW50RGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSwgbGV2ZWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHByZXBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxldmVsXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7Vmlld1N0cmVhbX0gdiAtID0gdW5kZWZpbmVkOyB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeSAtID0gdW5kZWZpbmVkOyBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxldmVsIC0gPSAxOyB0aGlzIHBhcmFtZXRlciBjYW4gYXR0YWNoIHRoZSB2aWV3U3RyZWFtJ3MgZG9tIGVsZW1lbnQgdXAgdGhlIGRvbSB0cmVlIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHRoZSBWaWV3U3RyZWFtIG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBjaGlsZFZpZXcucHJlcGVuZFZpZXdUb1BhcmVudEVsKHBhcmVudFZpZXcpXG4gICAqXG4gICAqICovXG4gIHByZXBlbmRWaWV3VG9QYXJlbnRFbCh2LCBxdWVyeSwgbGV2ZWwgPSAxKSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsXG4gICAgICB0aGlzLnNldEF0dGFjaFBhcmVudERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5LCBsZXZlbCkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJlcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byB0aGUgY3VycmVudCBWaWV3U3RyZWFtIG9iamVjdC4gPGJyPkFmdGVyIHRoZSBhdHRhY2htZW50LCByeGpzIG9ic2VydmFibGVzIGFyZSBleGNoYW5nZWQgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdHMuPGJyPjxicj5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIHBhcmVudFZpZXcucHJlcGVuZFZpZXcoY2hpbGRWaWV3KTtcbiAgICpcbiAgICogKi9cblxuICBwcmVwZW5kVmlldyh2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiAgQXBwZW5kcyBhIFZpZXdTdHJlYW0gb2JqZWN0IHRoYXQgYXJlIG5vdCByZW5kZXJlZCB0byB0aGUgI3NweW5lLW51bGwtdmlld3MgZGl2LlxuICAgKi9cbiAgYXBwZW5kVG9OdWxsKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtbnVsbC12aWV3cycpXG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhcHBlbmRDaGlsZCcpXG4gIH1cblxuICBvblZTUmVuZGVyZWQocGF5bG9hZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdWU19TUEFXTjogJywgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZC5mcm9tJCA9PT0gJ2ludGVybmFsJykge1xuICAgICAgLy8gdGhpcy5wcm9wc1snZWwnXSA9IHBheWxvYWQuZWwuZWw7XG5cbiAgICAgIHRoaXMucG9zdFJlbmRlcigpXG4gICAgICAvLyB0aGlzLmJyb2FkY2FzdGVyID0gbmV3IFNweW5lLlZpZXdTdHJlYW1Ccm9hZGNhc3Rlcih0aGlzLnByb3BzLCB0aGlzLmJyb2FkY2FzdEV2ZW50cyk7XG4gICAgfVxuICB9XG5cbiAgcG9zdFJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5fcG9zdFJlbmRlcmVkQ2FsbGVkID09PSB0cnVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmJlZm9yZUFmdGVyUmVuZGVyKClcbiAgICB0aGlzLmFmdGVyUmVuZGVyKClcblxuICAgIHRoaXMub25SZW5kZXJlZCgpXG4gICAgY29uc3Qgc3RhcnRBbmltRnJhbWVBZnRlclJlbmRlcmVkID0gKCkgPT4gdGhpcy5vbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGFydEFuaW1GcmFtZUFmdGVyUmVuZGVyZWQpXG5cbiAgICBpZiAodGhpcy5pc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuYnJvYWRjYXN0RXZlbnRzKClcbiAgICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBWaWV3U3RyZWFtLmlzVmFsaWROZXN0ZWRBcnIoZXZlbnRzQXJyKVxuICAgICAgaWYgKGlzVmFsaWRBcnIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFycmF5IHJldHVybmVkIGZyb20gYnJvYWRjYXN0RXZlbnRzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkoZXZlbnRzQXJyKX0nLCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcHJvcGVybHkgZm9ybWF0dGVkIWApXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZUNoYW5uZWxzKClcbiAgICB0aGlzLnZpZXdzU3RyZWFtQnJvYWRjYXN0ZXIgPSBuZXcgVmlld1N0cmVhbUJyb2FkY2FzdGVyKHRoaXMucHJvcHMsIHRoaXMuYnJvYWRjYXN0RXZlbnRzLmJpbmQodGhpcykpXG4gICAgdGhpcy5hZnRlckJyb2FkY2FzdEV2ZW50cygpXG5cbiAgICB0aGlzLl9wb3N0UmVuZGVyZWRDYWxsZWQgPSB0cnVlXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgIH1cblxuICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FVEhPRFMgVE8gQkUgRVhURU5ERUQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgYWZ0ZXJCcm9hZGNhc3RFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBwdWxsQWN0aW9uc0Zyb21MaXN0ID0gKGFycikgPT4gYXJyWzBdXG4gICAgICBjb25zdCBuZXN0ZWRBY3Rpb25zQXJyID0gdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKVxuXG4gICAgICBjb25zdCBhY3Rpb25zQXJyID0gbmVzdGVkQWN0aW9uc0Fyci5tYXAocHVsbEFjdGlvbnNGcm9tTGlzdClcblxuICAgICAgY29uc3QgaXNWYWxpZEFyciA9IFZpZXdTdHJlYW0uaXNWYWxpZE5lc3RlZEFycihuZXN0ZWRBY3Rpb25zQXJyKVxuXG4gICAgICBpZiAoaXNWYWxpZEFyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXJyYXkgcmV0dXJuZWQgZnJvbSBhZGRBY3Rpb25zTGlzdGVuZXJzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkobmVzdGVkQWN0aW9uc0Fycil9JywgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hlY2tGb3JFeGlzdGluZ01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBkZWZhdWx0VG8oJycsIGFyclsxXSlcbiAgICAgICAgICBjb25zdCBpc01ldGhvZCA9IGlzKEZ1bmN0aW9uLCB0aGlzW21ldGhvZF0pXG4gICAgICAgICAgaWYgKGlzTWV0aG9kID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kIGluIGFkZEFjdGlvbkxpc3RlbmVycyBuZXN0ZWQgQXJyYXksICcke0pTT04uc3RyaW5naWZ5KGFycil9JywgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QhYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zZShmb3JFYWNoKGNoZWNrRm9yRXhpc3RpbmdNZXRob2QpLCBkZWZhdWx0VG8oW10pKShuZXN0ZWRBY3Rpb25zQXJyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBhdGgoWydwcm9wcycsICdhZGRlZENoYW5uZWxzJ10sIHRoaXMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBWaWV3U3RyZWFtLmNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZC5iaW5kKHRoaXMpKHRoaXMucHJvcHMuYWRkZWRDaGFubmVscywgYWN0aW9uc0FycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRUaW1lb3V0KGRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzLCA1MDApXG4gICAgfVxuICB9XG5cbiAgc2V0RGF0YVZTSUQoKSB7XG4gICAgdGhpcy5wcm9wcy5lbC5kYXRhc2V0LnZzaWQgPSB0aGlzLnByb3BzLnZzaWQvLyBTdHJpbmcodGhpcy5wcm9wcy52c2lkKS5yZXBsYWNlKC9eKHZzaWQtKSguKikkLywgJyQyJyk7XG4gIH1cblxuICBiZWZvcmVBZnRlclJlbmRlcigpIHtcbiAgICAvKiAgICBsZXQgZG0yID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyID0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG9tSXRlbVNlbGVjdG9ycyhlbCwgc3RyKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9OyAqL1xuXG4gICAgLy8gdGhpcy5wcm9wcy5lbCQgPSBkbTIodGhpcy5wcm9wcy5lbCk7XG4gICAgdGhpcy5zZXREYXRhVlNJRCgpXG4gICAgdGhpcy5wcm9wcy5lbCQgPSBWaWV3U3RyZWFtU2VsZWN0b3IodGhpcy5wcm9wcy5lbClcbiAgICAvLyBjb25zb2xlLmxvZygnRUwgSVMgJywgdGhpcy5wcm9wcy5lbCQuZWxBcnIpO1xuICAgIC8vIHdpbmRvdy50aGVFbCQgPSB0aGlzLnByb3BzLmVsJDtcbiAgfVxuXG4gIC8vIFRISVMgSVMgQU4gRVZFTlQgSE9MREVSIE1FVEhPRCBCRUNBVVNFIFNFTkRJTkcgRE9XTlNUUkVBTSBSRVFVSVJFIFRIRSBQQVJFTlQgVE8gSEFWRSBBIE1FVEhPRFxuICBkb3duU3RyZWFtKCkge1xuXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIG9uUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGFkZCBhbmltYXRpb24gY2xhc3NlcyB0byBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVuZGVyaW5nLlxuICAgKlxuICAgKi9cblxuICBvbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogKERlcHJlY2F0ZWQuIFVzZSBvblJlbmRlcmVkKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIGFmdGVyUmVuZGVyKCkge1xuICB9XG5cbiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgIC8vIEFERCBCVVRUT04gRVZFTlRTIEFTIE5FU1RFRCBBUlJBWVNcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3QgdG8gYW4gaW5zdGFuY2Ugb2YgcmVnaXN0ZXJlZCBjaGFubmVscywgc3VjaCBhcyAnRE9NJywgJ1VJJywgYW5kICdST1VURScgY2hhbm5lbHMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGxldCB1aUNoYW5uZWwgPSB0aGlzLmdldENoYW5uZWwoJ1VJJyk7XG4gICAqXG4gICAqIHVpQ2hhbm5lbFxuICAgKiAgICAuZmlsdGVyKChwKSA9PiBwLmRhdGEuaWQ9PT0nI215LWJ1dHRvbicpXG4gICAqICAgIC5zdWJzY3JpYmUoKHApID0+IGNvbnNvbGUubG9nKCdteSBidXR0b24gd2FzIGNsaWNrZWQgJywgcCkpO1xuICAgKlxuICAgKiAqL1xuXG4gIGdldENoYW5uZWwoY2hhbm5lbCkge1xuICAgIGNvbnN0IGlzVmFsaWRDaGFubmVsID0gYyA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhjKVxuICAgIGNvbnN0IGVycm9yID0gYyA9PiBjb25zb2xlLndhcm4oXG4gICAgICAgIGBjaGFubmVsIG5hbWUgJHtjfSBpcyBub3Qgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbU5hbWVzfWApXG4gICAgY29uc3Qgc3RhcnRTdWJzY3JpYmUgPSAoYykgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC5nZXRTdHJlYW0oYykub2JzZXJ2ZXJcblxuICAgICAgcmV0dXJuIG9icyQucGlwZSh0YWtlV2hpbGUocCA9PiB0aGlzLmRlbGV0ZWQgIT09IHRydWUpKVxuICAgIH0vLyBnZXRHbG9iYWxQYXJhbSgnc3RyZWFtc0NvbnRyb2xsZXInKS5nZXRTdHJlYW0oYykub2JzZXJ2ZXI7XG5cbiAgICBjb25zdCBmbiA9IGlmRWxzZShpc1ZhbGlkQ2hhbm5lbCwgc3RhcnRTdWJzY3JpYmUsIGVycm9yKVxuXG4gICAgcmV0dXJuIGZuKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogQ0hFQ0tTIFRPIFNFRSBJRiBDSEFOTkVMUyBIQVZFIEJFRU4gQURERUQgVE8gcHJvcHMuY2hhbm5lbHMgb2JqZWN0O1xuICAgKi9cbiAgaW5pdGlhbGl6ZUNoYW5uZWxzKCkge1xuICAgIGNvbnN0IGFkZENoYW5uZWwgPSAoY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgW2NoYW5uZWxOYW1lLCBza2lwRmlyc3QgPSBmYWxzZV0gPSBBcnJheS5pc0FycmF5KGNoYW5uZWwpID8gY2hhbm5lbCA6IFtjaGFubmVsXVxuICAgICAgdGhpcz8uYWRkQ2hhbm5lbChjaGFubmVsTmFtZSwgc2tpcEZpcnN0KVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzPy5wcm9wcz8uY2hhbm5lbHMpKSB7XG4gICAgICB0aGlzPy5wcm9wcz8uY2hhbm5lbHM/LmZvckVhY2goYWRkQ2hhbm5lbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogUHJlZmVycmVkIG1ldGhvZCB0byBjb25uZWN0IHRvIGluc3RhbmNlcyBvZiByZWdpc3RlcmVkIGNoYW5uZWxzLCBzdWNoIGFzICdET00nLCAnVUknLCBhbmQgJ1JPVVRFJyBjaGFubmVscy5cbiAgICpcbiAgICogQWRkIENoYW5uZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHVuc3Vic2NyaWJlIHRvIHRoZSBjaGFubmVsLCB3aGVyZWFzIHRoZSBnZXRDaGFubmVsIG1ldGhvZCByZXF1aXJlcyB0aGUgZGV2ZWxvcGVyIHRvIG1hbnVhbGx5IHVuc3Vic2NyaWJlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIENoYW5uZWxzIENvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbCBmYWxzZSwgYWRkIHRydWUgaWYgdGhlIFZpZXcgc2hvdWxkIHdhaXQgZm9yIHRoaXMgY2hhbm5lbCB0byB1bnN1YnNjcmliZSBiZWZvcmUgcmVtb3ZpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge3NlbmREb3duU3RyZWFtfSBib29sIFRoZSBkaXJlY3Rpb24gd2hlcmUgdGhlIHN0cmVhbSBpcyBhbGxvd2VkIHRvIHRyYXZlbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogbGV0IHJvdXRlQ2hhbm5lbCA9IHRoaXMuYWRkQ2hhbm5lbCgnUk9VVEUnKTtcbiAgICpcbiAgICogICAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgICAgICBbJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJywgJ29uTWFwUm91dGVFdmVudCddXG4gICAqICAgICAgICAgICBdXG4gICAqICAgICAgIH1cbiAgICpcbiAgICogICAgICAgb25NYXBSb3V0ZUV2ZW50KHApIHtcbiAgICogICAgICAgICAgY29uc29sZS5sb2coJ3RoZSByb3V0ZSB2YWx1ZSBpcyAnLCBwKTtcbiAgICogICAgICAgfVxuICAgKlxuICAgKlxuICAgKiAqL1xuXG4gIGFkZENoYW5uZWwoY2hhbm5lbE5hbWUsIHNraXBGaXJzdCA9IGZhbHNlLCBzZW5kRG93blN0cmVhbSA9IGZhbHNlLCBib29sID0gZmFsc2UpIHtcbiAgICBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuQ0kgOiB0aGlzLiRkaXJzLklcbiAgICBjb25zdCBtYXBEaXJlY3Rpb24gPSBwID0+IHtcbiAgICAgIC8vIGV0IHAyID0gZGVmYXVsdFRvKHt9LCBjbG9uZShwKSk7XG4gICAgICBjb25zdCBwbCA9IHAvLyB8fCB7fTtcbiAgICAgIHBsLiRkaXIgPSBkaXJlY3Rpb25BcnJcbiAgICAgIHJldHVybiBwbFxuICAgICAgLy8gcmV0dXJuIGRlZXBNZXJnZShkaXJPYmosIHAyKTtcbiAgICAgIC8vIE9iamVjdC5hc3NpZ24oeyRkaXI6IGRpcmVjdGlvbkFycn0sIGNsb25lKHApKVxuICAgIH1cbiAgICBpZiAodGhpcz8ucHJvcHM/LmFkZGVkQ2hhbm5lbHM/LmluY2x1ZGVzKGNoYW5uZWxOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gQ0hFQ0tTIElGIENIQU5ORUwgSEFTIEFMUkVBRFkgQkVFTiBBRERFRFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGlzTG9jYWxFdmVudENoZWNrID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAnaXNMb2NhbEV2ZW50J10pXG4gICAgY29uc3QgY2lkQ2hlY2sgPSBwYXRoKFsnc3JjRWxlbWVudCcsICd2c2lkJ10pXG4gICAgY29uc3QgY2lkTWF0Y2hlcyA9IHAgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IGNpZENoZWNrKHApXG4gICAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRDaGVjayhwKVxuICAgICAgY29uc3QgZmlsdGVyRXZlbnQgPSBpc0xvY2FsRXZlbnQgIT09IHRydWUgfHwgdnNpZCA9PT0gdGhpcy5wcm9wcy52c2lkXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrcyBcIix2c2lkLHRoaXMucHJvcHMudnNpZCwgaXNMb2NhbEV2ZW50LGZpbHRlckV2ZW50KTtcbiAgICAgIHJldHVybiBmaWx0ZXJFdmVudFxuICAgIH1cblxuICAgIGNvbnN0IHBpcGVBcnIgPSBbbWFwKG1hcERpcmVjdGlvbiksIGZpbHRlcihjaWRNYXRjaGVzKV1cbiAgICBpZiAoc2tpcEZpcnN0ID09PSB0cnVlKSB7XG4gICAgICBwaXBlQXJyLnVuc2hpZnQoc2tpcCgxKSlcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsJCA9IHRoaXMuZ2V0Q2hhbm5lbChjaGFubmVsTmFtZSkucGlwZSguLi5waXBlQXJyKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoYW5uZWwkLCBmYWxzZSlcbiAgICB0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsRXhpc3RzKGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgY2hhbm5lbEV4aXN0cyA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC50ZXN0U3RyZWFtKGNoYW5uZWxOYW1lKVxuICAgIGlmIChjaGFubmVsRXhpc3RzICE9PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IFRoZSBDaGFubmVsUGF5bG9hZCBmcm9tICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGJlZW4gc2VudCB0byBhIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9LCB0aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsRXhpc3RzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwYXlsb2FkIC0gPSB7fTsgVGhlIG1haW4gZGF0YSB0byBzZW5kIHRvIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gPSBcIlZJRVdTVFJFQU1fRVZFTlRcIjsgVGhlIGFjdGlvbiBzZW50IHRvIHRoZSBjaGFubmVsLlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgdmVyc2F0aWxlIGFuZCBjb25zaXN0ZW50IG1ldGhvZCB0byBjb21tdW5pY2F0ZSB3aXRoIGFsbCBjaGFubmVscy5cbiAgICpcbiAgICpcbiAgICovXG5cbiAgc2VuZEluZm9Ub0NoYW5uZWwoY2hhbm5lbE5hbWUsIHBsID0ge30sIGFjdGlvbikge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwbFxuXG4gICAgY29uc3QgZGVmYXVsdFRvQWN0aW9uID0gZGVmYXVsdFRvKCdWSUVXU1RSRUFNX0VWRU5UJylcbiAgICBjb25zdCBjaGFubmVsRGVmYXVsdEFjdGlvbkhhc2ggPSB7XG4gICAgICBDSEFOTkVMX1JPVVRFOiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gICAgfVxuICAgIGNvbnN0IGdldEFjdGlvbkZuID0gY29tcG9zZShkZWZhdWx0VG9BY3Rpb24sIHByb3AoY2hhbm5lbE5hbWUpKVxuXG4gICAgYWN0aW9uID0gYWN0aW9uIHx8IGdldEFjdGlvbkZuKGNoYW5uZWxEZWZhdWx0QWN0aW9uSGFzaClcblxuICAgIGNvbnN0IGRhdGEgPSB7IHBheWxvYWQsIGFjdGlvbiB9XG5cbiAgICB0cnkge1xuICAgICAgZGF0YS5zcmNFbGVtZW50ID0gY29tcG9zZShwaWNrKFsnaWQnLCAndnNpZCcsICdjbGFzcycsICd0YWdOYW1lJ10pLCBwcm9wKCdwcm9wcycpKSh0aGlzKVxuICAgICAgaWYgKHRoaXMuY2hlY2tJZkNoYW5uZWxFeGlzdHMoY2hhbm5lbE5hbWUpID09PSB0cnVlKSB7XG4gICAgICAgIGlmICgvQ0hBTk5FTF9MSUZFQ1lDTEUvLnRlc3QoYWN0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYXRhLCB7XG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGdldDogKCkgPT4gc2FmZUNsb25lKHBsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzJCA9IG9mKGRhdGEpXG4gICAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoY2hhbm5lbE5hbWUsIG9icyQsIGRhdGEpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdTUFlORSBXQVJOSU5HICcsIGUpXG4gICAgfVxuICB9XG5cbiAgdHJhY2VyKC4uLmFyZ3MpIHtcbiAgICB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2QoLi4uYXJncylcbiAgfVxuXG4gIHNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSgpIHtcblxuICB9XG5cbiAgc2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSh2YWwsIHApIHtcbiAgICBjb25zdCBpc1JlbmRlcmVkID0gd2hlcmUoe1xuICAgICAgZnJvbSQ6IGVxdWFscygnaW50ZXJuYWwnKSxcbiAgICAgIGFjdGlvbjogZXF1YWxzKCdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQnKVxuICAgIH0sIHApXG4gICAgY29uc3QgaXNEaXNwb3NlZCA9IHAgPT09ICdWU19ERVRSSVRVU19DT0xMRUNUJ1xuICAgIGlmIChpc1JlbmRlcmVkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX0xJRkVDWUNMRScsIHsgYWN0aW9uOidDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcgfSwgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJylcbiAgICB9IGVsc2UgaWYgKGlzRGlzcG9zZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfTElGRUNZQ0xFJywgeyBhY3Rpb246J0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJyB9LCAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnKVxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUFjdGlvbkZpbHRlcihzZWxlY3RvcnMsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKHNlbGVjdG9ycywgZGF0YSlcbiAgfVxuXG4gIGlzTG9jYWxFdmVudChjaGFubmVsUGF5bG9hZEl0ZW0pIHtcbiAgICBjb25zdCBpdGVtRWwgPSBwYXRoKFsnc3JjRWxlbWVudCcsICdlbCddLCBjaGFubmVsUGF5bG9hZEl0ZW0pXG4gICAgY29uc3QgdGhpc0VsID0gcGF0aChbJ3Byb3BzJywgJ2VsJ10sIHRoaXMpXG4gICAgLy8gY29uc29sZS5sb2coJ3RoaXMgZWwgaXMgJyx7dGhpc0VsLCBpdGVtRWx9KTtcbiAgICByZXR1cm4gVmlld1N0cmVhbS5lbElzRG9tRWxlbWVudCh0aGlzRWwpICYmIFZpZXdTdHJlYW0uZWxJc0RvbUVsZW1lbnQoaXRlbUVsKSAmJiB0aGlzRWwuY29udGFpbnMoaXRlbUVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuY3JlYXRlSWQgPSBjb3JlTWl4aW5zLmNyZWF0ZUlkXG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuLi92aWV3cy92aWV3LXN0cmVhbSdcbmltcG9ydCB7IGN1cnJ5IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgUm91dGVDaGFubmVsVXBkYXRlciB7XG4gIGNvbnN0cnVjdG9yKGN4dCkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoY3h0LnByb3BzLm5hbWUpXG4gICAgY29uc3QgaWQgPSBgJHtuYW1lfV9ST1VURV9VUERBVEVSYFxuXG4gICAgY29uc3Qgc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSA9IGN1cnJ5KFJvdXRlQ2hhbm5lbFVwZGF0ZXIuY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iailcbiAgICByZXR1cm4gc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSh7IGlkLCBuYW1lIH0pXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaihwcm9wcywgZGF0YSkge1xuICAgIGNvbnN0IHsgbmFtZSwgaWQgfSAgPSBwcm9wc1xuICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhXG4gICAgY29uc3QgdnMgPSBuZXcgVmlld1N0cmVhbSh7XG4gICAgICBpZCwgbmFtZSwgZGF0YVxuICAgIH0pXG5cbiAgICB2cy5vblJlbmRlcmVkID0gKCkgPT4ge1xuICAgICAgdnMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfUk9VVEUnLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIHZzLmFmdGVyQnJvYWRjYXN0RXZlbnRzID0gKCkgPT4ge1xuICAgICAgdnMuZGlzcG9zZVZpZXdTdHJlYW0oKVxuICAgIH1cblxuICAgIHZzLmFwcGVuZFRvTnVsbCgpXG4gIH1cbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyB9IGZyb20gJy4vY2hhbm5lbHMtY29uZmlnJ1xuaW1wb3J0IHsgQ2hhbm5lbFBheWxvYWQgfSBmcm9tICcuL2NoYW5uZWwtcGF5bG9hZC1jbGFzcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuaW1wb3J0IHsgUm91dGVDaGFubmVsVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzL3JvdXRlLWNoYW5uZWwtdXBkYXRlcidcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIGlmRWxzZSxcbiAgaWRlbnRpdHksXG4gIGhlYWQsXG4gIG1lcmdlQWxsLFxuICBvYmpPZixcbiAgdmlldyxcbiAgaXMsXG4gIGNoYWluLFxuICBsZW5zSW5kZXgsXG4gIGFsd2F5cyxcbiAgZnJvbVBhaXJzLFxuICBwYXRoLFxuICBpc0VtcHR5LFxuICBlcXVhbHMsXG4gIHByb3AsXG4gIHByb3BFcVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGUgQ2hhbm5lbCBjb21wb25lbnQgd3JhcHMgbWV0aG9kcyBhbmQgZnVuY3Rpb25hbGl0eSBhcm91bmQgYW4gUnhKcyBTdWJqZWN0LCB0byBjcmVhdGUgYSBvbmUtd2F5IGRhdGEgZmxvdyBiZXR3ZWVuIGl0c2VsZiBhbmQgb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zLjwvcD5cbiAgICogPHA+Q2hhbm5lbHMgZ2V0IGRhdGEgYnkgaW1wb3J0aW5nIGpzb24gb2JqZWN0cywgc3Vic2NyaWJpbmcgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIGJ5IHBhcnNpbmcgVmlld1N0cmVhbSBpbmZvLjwvcD5cbiAgICogPGgzPlRoZSBCYXNpYyBDaGFubmVsIFN0cnVjdHVyZTwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNoYW5uZWxzIHJlcXVpcmVzIGEgdW5pcXVlIG5hbWUsIGZvciBleGFtcGxlLCA8Yj5DSEFOTkVMX01ZQ0hBTk5FTDwvYj4sIHdoaWNoIGNvbXBvbmVudHMgdXNlIHRvIHNlbGVjdCBhbmQgc3Vic2NyaWJlIHRvIGFueSBjaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyBhcmUgaW5zdGFudGlhdGVkIGFuZCAncmVnaXN0ZXJlZCcgd2l0aCB0aGUgTElOS1snU3B5bmVBcHAnLCAnc3B5bmUtYXBwJ10uPC9saT5cbiAgICogPGxpPkNoYW5uZWxzIHJlbWFpbiBwZXJzaXN0ZW50IGFuZCBhcmUgbm90IGRlbGV0ZWQuPC9saT5cbiAgICogPC91bD5cbiAgICogPGgzPkNvbXBvbmVudHMgdGhhdCBleHRlbmQgQ2hhbm5lbDwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPlRoZSBmb3VyIFNweW5lIENoYW5uZWxzLCBMSU5LWydTcHluZUNoYW5uZWxVSScsICdzcHluZS1jaGFubmVsLXUtaSddLCBMSU5LWydTcHluZUNoYW5uZWxXaW5kb3cnLCAnc3B5bmUtY2hhbm5lbC13aW5kb3cnXSwgTElOS1snU3B5bmVDaGFubmVsUm91dGUnLCAnc3B5bmUtY2hhbm5lbC1yb3V0ZSddIGFuZCBMSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgYWxsIGV4dGVuZCBDaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsRmV0Y2ggYWxzbyBleHRlbmRzIENoYW5uZWwsIGFkZHMgYSBDaGFubmVsRmV0Y2hVdGlsIGNvbXBvbmVudCB0byBpbW1lZGlhdGVseSBwdWJsaXNoIGZldGNoZWQgcmVzcG9uc2VzLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5TZW5kaW5nIENoYW5uZWxQYXlsb2FkczwvaDM+XG4gICAqICAgPHA+Q2hhbm5lbHMgc2VuZCBkYXRhIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1zZW5kLWNoYW5uZWwtcGF5bG9hZFwiID5zZW5kQ2hhbm5lbFBheWxvYWQ8L2E+XG4gICBtZXRob2QuPC9wPlxuICAgKlxuICAgKlxuICAgKiA8aDM+UmVjZWl2aW5nIERhdGEgZnJvbSBWaWV3U3RyZWFtIEluc3RhbmNlczwvaDM+XG4gICAqIDxwPlZpZXdTdHJlYW1zIGNhbiBzZW5kIGRhdGEgdG8gYW55IGN1c3RvbSBjaGFubmVsIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cInZpZXctc3RyZWFtLXNlbmQtaW50by10by1jaGFubmVsXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsXCIgPnNlbmRJbmZvVG9DaGFubmVsPC9hPlxuICAgbWV0aG9kLiBDaGFubmVscyBjYW0gbGlzdGVuIHRvIGFueSBWaWV3U3RyZWFtIGRhdGEgZGlyZWN0ZWQgdG8gaXRzZWxmIHRocm91Z2ggdGhlIGRlZmF1bHQgbWV0aG9kLCA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtb24tdmlldy1zdHJlYW0taW5mb1wiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS9jaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiA+b25WaWV3U3RyZWFtSW5mbzwvYT4uIDwvcD5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgYSBOZXcgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIFNweW5lQXBwLnJlZ2lzdGVyKG5ldyBDaGFubmVsKFwiQ0hBTk5FTF9NWUNIQU5ORUxcIik7XG4gICAqXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGlzIGpzb24gb2JqZWN0IHRha2VzIGluIHBhcmFtZXRlcnMgdG8gaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCBiZSB0aGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcyAtID0ge307IFRoZSBwcm9wcyBvYmplY3RzIGFsbG93cyBmb3IgY3VzdG9tIHByb3BlcnRpZXMgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgLSA9IGZhbHNlOyBQdWJsaXNoZXMgaXRzIG1vc3QgY3VycmVudCBwYXlsb2FkIHRvIGxhdGUgc3Vic2NyaWJlcnMsIHdoZW4gc2V0IHRvIHRydWUuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihDSEFOTkVMX05BTUUsIHByb3BzID0ge30pIHtcbiAgICB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zLmJpbmQodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKENIQU5ORUxfTkFNRSwgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyKVxuICAgIHByb3BzLm5hbWUgPSBDSEFOTkVMX05BTUVcbiAgICBwcm9wcy5kZWZhdWx0QWN0aW9ucyA9IHByb3BzLmRhdGEgIT09IHVuZGVmaW5lZCA/IFtgJHtwcm9wcy5uYW1lfV9FVkVOVGBdIDogW11cbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlXG4gICAgdGhpcy5wcm9wcy5pc1Byb3h5ID0gdGhpcy5wcm9wcy5pc1Byb3h5ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMucHJvcHMuaXNQcm94eVxuICAgIGNvbnN0IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA9IHRoaXMucHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA6IHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWRcbiAgICB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwgPSBuZXcgUm91dGVDaGFubmVsVXBkYXRlcih0aGlzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMoKVxuICAgIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXBcbiAgICBjb25zdCBvYnNlcnZlciQgPSB0aGlzLmdldE1haW5PYnNlcnZlcigpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSA9IENoYW5uZWwuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUuYmluZCh0aGlzKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5wcm9wcy5vYnNlcnZlciA9IG9ic2VydmVyJFxuICAgIGNvbnN0IGRpc3BhdGNoZXJTdHJlYW0kID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IHBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSA9IHByb3BFcShwcm9wcy5uYW1lLCAnbmFtZScpXG4gICAgZGlzcGF0Y2hlclN0cmVhbSQucGlwZShmaWx0ZXIocGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lKSkuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMub25SZWNlaXZlZE9ic2VydmFibGUodmFsKSlcbiAgfVxuXG4gIGdldE1haW5PYnNlcnZlcigpIHtcbiAgICBpZiAodGhpcy5zdHJlYW1zQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgY2hhbm5lbCwgJHt0aGlzLnByb3BzLm5hbWV9LCBhcHBlYXJzIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIFNweW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLmApXG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlFeGlzdHMgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLnRlc3RTdHJlYW0odGhpcy5wcm9wcy5uYW1lKVxuXG4gICAgaWYgKHByb3h5RXhpc3RzID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRQcm94eVN1YmplY3QodGhpcy5wcm9wcy5uYW1lLCB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9PT0gdHJ1ZSA/IG5ldyBSZXBsYXlTdWJqZWN0KDEpIDogbmV3IFN1YmplY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8vICBPVkVSUklERSBJTklUSUFMSVpBVElPTiBNRVRIT0RcbiAgLyoqXG4gICAqIDxwPihEZXByZWNhdGVkLiBVc2Ugb25SZWdpc3RlcmVkKS4gVGhpcyBtZXRob2QgaXMgZW1wdHkgYW5kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBDaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuPC9wPlxuICAgKiA8cD5UYXNrcyBzdWNoIGFzIHN1YnNjcmliaW5nIHRvIG90aGVyIGNoYW5uZWxzLCBhbmQgc2VuZGluZyBpbml0aWFsIHBheWxvYWRzIGNhbiBiZSBhZGRlZCBoZXJlLjwvcD5cbiAgICovXG4gIG9uQ2hhbm5lbEluaXRpYWxpemVkKCkge1xuXG4gIH1cblxuICAvLyAgT1ZFUlJJREUgSU5JVElBTElaQVRJT04gTUVUSE9EXG4gIC8qKlxuICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBlbXB0eSBhbmQgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIENoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC48L3A+XG4gICAqIDxwPlRhc2tzIHN1Y2ggYXMgc3Vic2NyaWJpbmcgdG8gb3RoZXIgY2hhbm5lbHMsIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF5bG9hZHMgY2FuIGJlIGFkZGVkIGhlcmUuPC9wPlxuICAgKi9cbiAgb25SZWdpc3RlcmVkKHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGlmIChwcm9wcy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IE9iamVjdC5rZXlzKHRoaXMuY2hhbm5lbEFjdGlvbnMpWzBdXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUxTIEFDVElPTlMgSVMgXCIsdGhpcy5jaGFubmVsQWN0aW9ucyk7XG4gICAgICAvLyBPYmplY3QodGhpcy5jaGFubmVsQWN0aW9ucykua2V5c1swXTtcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcHJvcHMuZGF0YSlcbiAgICB9XG4gIH1cblxuICBnZXQgaXNQcm94eSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc1Byb3h5XG4gIH1cblxuICBnZXQgY2hhbm5lbE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMubmFtZVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIHJldHVybnMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG5cbiAgY2hlY2tGb3JUcmFpdHMoKSB7XG4gICAgY29uc3QgYWRkVHJhaXRzID0gKHRyYWl0cykgPT4ge1xuICAgICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgICB9XG4gICAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgICAgfVxuXG4gICAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgfVxuXG4gIC8vIERPIE5PVCBPVkVSUklERSBUSElTIE1FVEhPRFxuICBpbml0aWFsaXplU3RyZWFtKCkge1xuICAgIHRoaXMuY2hlY2tGb3JUcmFpdHMoKVxuICAgIHRoaXMub25DaGFubmVsSW5pdGlhbGl6ZWQoKVxuICAgIHRoaXMuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUoKVxuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IHRydWVcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZShwcm9wcyA9IHRoaXMucHJvcHMsIGFjdGlvbnNPYmogPSB0aGlzLmNoYW5uZWxBY3Rpb25zKSB7XG4gICAgY29uc3QgYWN0aW9uc09iaklzRW1wdHkgPSBpc0VtcHR5KGFjdGlvbnNPYmopXG4gICAgY29uc3QgZGF0YUlzQWRkZWQgPSBwcm9wKCdkYXRhJywgcHJvcHMpICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdXRvU2V0VG9DYWNoZWRQYXlsb2FkID0gYWN0aW9uc09iaklzRW1wdHkgPT09IHRydWUgJiYgZGF0YUlzQWRkZWQgPT09IHRydWVcbiAgICBjb25zdCBzZXREZWZhdWx0QWN0aW9uc09iaiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcHJvcHNcbiAgICAgIGNvbnN0IGFjdGlvblN0ciA9IGAke25hbWV9X0VWRU5UYFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2FjdGlvblN0cl0gOiBhY3Rpb25TdHJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXV0b1NldFRvQ2FjaGVkUGF5bG9hZCkge1xuICAgICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgICBhY3Rpb25zT2JqID0gc2V0RGVmYXVsdEFjdGlvbnNPYmooKVxuXG4gICAgICBpZiAodGhpcy5jaGFubmVsQWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBhY3Rpb25zT2JqXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJQUk9QUyBJUyBcIix7YWN0aW9uc09iaklzRW1wdHksIGRhdGFJc0FkZGVkLCBwcm9wcywgYWN0aW9uc09ian0sIHRoaXMuY2hhbm5lbEFjdGlvbnMpXG4gICAgcmV0dXJuIHsgcHJvcHMsIGFjdGlvbnNPYmogfVxuICB9XG5cbiAgc2V0VHJhY2UoYm9vbCkge1xuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoobmFtZSwgZXh0ZW5kZWRBY3Rpb25zQXJyID0gW10pIHtcbiAgICBjb25zdCBnZXRBY3Rpb25WYWwgPSBpZkVsc2UoaXMoU3RyaW5nKSwgaWRlbnRpdHksIGhlYWQpXG4gICAgY29uc3QgbWFpbkFyciA9IGV4dGVuZGVkQWN0aW9uc0Fyci5jb25jYXQodGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucyhuYW1lKSlcbiAgICBjb25zdCBhcnIgPSByTWFwKGdldEFjdGlvblZhbCwgbWFpbkFycilcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzKCkge1xuICAgIGNvbnN0IGRlZmF1bHRGbiA9ICdvblZpZXdTdHJlYW1JbmZvJ1xuICAgIGNvbnN0IGdldEFjdGlvblZhbCA9IGlmRWxzZShpcyhTdHJpbmcpLCBpZGVudGl0eSwgaGVhZClcbiAgICBjb25zdCBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCA9IChtZXRob2RTdHIsIHZhbCkgPT4ge1xuICAgICAgY29uc3QgZGVsYXllciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW21ldGhvZFN0cl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFwiJHt0aGlzLnByb3BzLm5hbWV9XCIsIFJFUVVJUkVTIFRIRSBGT0xMT1dJTkcgTUVUSE9EICR7bWV0aG9kU3RyfSBGT1IgQUNUSU9OLCAke3ZhbFswXX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheWVyLCAxMDApXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0Q3VzdG9tTWV0aG9kID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZFN0ciA9IHZpZXcobGVuc0luZGV4KDEpLCB2YWwpXG4gICAgICBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZChtZXRob2RTdHIsIHZhbClcbiAgICAgIHJldHVybiBtZXRob2RTdHJcbiAgICB9XG5cbiAgICBjb25zdCBnZXRBcnJNZXRob2QgPSAgaWZFbHNlKGlzKFN0cmluZyksIGFsd2F5cyhkZWZhdWx0Rm4pLCBnZXRDdXN0b21NZXRob2QpXG5cbiAgICBjb25zdCBjcmVhdGVPYmogPSB2YWwgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0QWN0aW9uVmFsKHZhbClcbiAgICAgIGNvbnN0IG1ldGhvZCA9ICBnZXRBcnJNZXRob2QodmFsKVxuICAgICAgcmV0dXJuIFtrZXksIG1ldGhvZF1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzID0gZnJvbVBhaXJzKHJNYXAoY3JlYXRlT2JqLCB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkpKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ3RoZSBjaGFubmVsIGFjdGlvbiBtZXRob2RzICcsdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbHMgc2VuZCBhbG9uZyBBY3Rpb24gbmFtZXMgYWxvbmcgd2l0aCBpdHMgcGF5bG9hZC48L3A+XG4gICAqIDxwPkJlZm9yZSBhbnkgYWN0aW9uIGNhbiBiZSB1c2VkLCB0aGF0IGFjdGlvbiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIHVzaW5nIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbSBpbnN0YW5jZXMgY2FuIGZpbHRlciBDaGFubmVsUGF5bG9hZHMgYnkgYmluZGluZyBzcGVjaWZpYyBMSU5LWydhY3Rpb25zIHRvIGxvY2FsIG1ldGhvZHMnLCAndmlldy1zdHJlYW0tYWRkLWFjdGlvbi1saXN0ZW5lcnMnXS48L3A+XG4gICAqIDxwPkZvcmNpbmcgcmVnaXN0cmF0aW9uIG9mIGFjdGlvbnMgYWxsb3dzIFNweW5lIHRvIHZhbGlkYXRlIEFjdGlvbnMsIGFuZCBpcyBhbHNvIGEgdXNlZnVsIHdheSB0byBrZWVwIHRyYWNrIG9mIGFsbCBBY3Rpb25zIHRoYXQgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQuPC9wPlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBcnJheSBvZiBTdHJpbmdzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlJlZ2lzdGVyaW5nIEFjdGlvbnMgaW4gdGhlIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZDwvaDQ+XCJdXG4gICAqICAgIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgKiAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICdDSEFOTkVMX01ZX0NIQU5ORUxfRVZFTlQnLFxuICAgKiAgICAgICAgJ0NIQU5ORUxfTVlfQ0hBTk5FTF9VUERBVEVfRVZFTlQnXG4gICAqICAgICAgIF07XG4gICAqICAgICAgfVxuICAgKlxuICAgKi9cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgaWYgKHBhdGgoWydwcm9wcycsICdkYXRhJ10sIHRoaXMpKSB7XG4gICAgICBhcnIgPSBbYCR7dGhpcy5wcm9wcy5uYW1lfV9FVkVOVGBdXG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIG9uUmVjZWl2ZWRPYnNlcnZhYmxlKG9iaikge1xuICAgIHRoaXMub25JbmNvbWluZ09ic2VydmFibGUob2JqKVxuICB9XG5cbiAgZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZShvYmopIHtcbiAgICBvYmoudW5wYWNrZWQgPSB0cnVlXG4gICAgY29uc3QgZGVmYXVsdEZuID0gdGhpcy5vblZpZXdTdHJlYW1JbmZvLmJpbmQodGhpcylcblxuICAgIGNvbnN0IG1ldGhvZFN0ciA9IHBhdGgoWydkYXRhJywgJ2FjdGlvbiddLCBvYmopXG4gICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChtZXRob2RTdHIsIHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMpXG5cbiAgICBsZXQgZm4gPSBkZWZhdWx0Rm5cblxuICAgIGlmIChtZXRob2RWYWwgIT09IHVuZGVmaW5lZCAmJiBtZXRob2RWYWwgIT09ICdvblZpZXdTdHJlYW1JbmZvJykge1xuICAgICAgY29uc3QgbWV0aG9kRXhpc3RzID0gdHlwZW9mICh0aGlzW21ldGhvZFZhbF0pID09PSAnZnVuY3Rpb24nXG4gICAgICBpZiAobWV0aG9kRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICAgIGZuID0gdGhpc1ttZXRob2RWYWxdLmJpbmQodGhpcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm5cbiAgfVxuXG4gIG9uSW5jb21pbmdPYnNlcnZhYmxlKG9iaikge1xuICAgIGNvbnN0IGVxc05hbWUgPSBlcXVhbHMob2JqLm5hbWUsIHRoaXMucHJvcHMubmFtZSlcbiAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICAvLyBjb25zb2xlLmxvZyhcIklOQ09NSU5HIFwiLHthY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnR9LCB7b2JqfSk7XG4gICAgY29uc3QgbWVyZ2VQcm9wcyA9IChkKSA9PiBtZXJnZUFsbChbZCwgeyBhY3Rpb246IHByb3AoJ2FjdGlvbicsIGQpIH0sIHByb3AoJ3BheWxvYWQnLCBkKSwgcHJvcCgnc3JjRWxlbWVudCcsIGQpXSlcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7XG4gICAgICBjbG9uZTogKCkgPT4gbWVyZ2VQcm9wcyhvYmouZGF0YSksXG4gICAgICBhY3Rpb24sXG4gICAgICBwYXlsb2FkLFxuICAgICAgc3JjRWxlbWVudCxcbiAgICAgIGV2ZW50OiBvYnNWYWxcbiAgICB9KVxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChvYmopID0+IG9iai5vYnNlcnZhYmxlLnBpcGUobWFwKGRhdGFPYmopKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLmdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUob2JqKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+Vmlld1N0ZWFtIGluc3RhbmNlcyBjYW4gc2VuZCBpbmZvIHRvIGNoYW5uZWxzIHRocm91Z2ggaXRzIExJTktbJ3NlbmRJbmZvVG9DaGFubmVsLCAndmlldy1zdHJlYW0tc2VuZC1pbmZvLXRvLWNoYW5uZWwnXSBtZXRob2QuPC9wPlxuICAgKiA8cD5EYXRhIHJlY2VpdmVkIGZyb20gVmlld1N0cmVhbXMgYXJlIGRpcmVjdGVkIHRvIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbXMgc2VuZCBkYXRhIHVzaW5nIHRoZSBMSU5LWydWaWV3U3RyZWFtUGF5bG9hZCcsICd2aWV3LXN0cmVhbS1wYXlsb2FkJ10gZm9ybWF0LjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtUGF5bG9hZH0gb2JqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlBhcnNpbmcgRGF0YSBSZXR1cm5lZCBmcm9tIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIG9uVmlld1N0cmVhbUluZm8ob2JqKXtcbiAgICogICAgIGxldCBkYXRhID0gb2JqLnZpZXdTdHJlYW1JbmZvO1xuICAgKiAgICAgbGV0IGFjdGlvbiA9IGRhdGEuYWN0aW9uO1xuICAgKiAgICAgbGV0IG5ld1BheWxvYWQgPSB0aGlzLnBhcnNlVmlld1N0cmVhbURhdGEoZGF0YSk7XG4gICAqICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIG5ld1BheWxvYWQpO1xuICAgKiB9XG4gICAqXG4gICAqXG4gICAqL1xuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqXG4gICAqIDxwPlRoaXMgbWV0aG9kIHRha2VzIGFuIGFjdGlvbiwgYSBkYXRhIG9iamVjdCBhbmQgb3RoZXIgcHJvcGVydGllcyB0byBjcmVhdGUgYW5kIHB1Ymxpc2ggYSBMSU5LWydDaGFubmVsUGF5bG9hZCcsICdjaGFubmVsLXBheWxvYWQnXSBvYmplY3QuPC9wPlxuICAgKiA8cD5PbmNlIHRoZSBhY3Rpb24gYW5kIHBheWxvYWQgaXMgdmFsaWRhdGVkLCB0aGlzIG1ldGhvZCB3aWxsIHB1Ymxpc2ggdGhlIGRhdGEgYnkgdXNpbmcgdGhlIGNoYW5uZWwncyBzb3VyY2UgU3ViamVjdCBuZXh0KCkgbWV0aG9kLlxuICAgKiA8cD5UaGlzIGNvbnNpc3RlbnQgZm9ybWF0IGFsbG93cyBzdWJzY3JpYmVycyB0byB1bmRlcnN0YW5kIGhvdyB0byBwYXJzZSBhbnkgaW5jb21pbmcgY2hhbm5lbCBkYXRhLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb2JzJFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBBbiBhY3Rpb24gaXMgYSBzdHJpbmcsIHR5cGljYWxseSBpbiB0aGUgZm9ybWF0IG9mIFwiQ0hBTk5FTF9OQU1FX0FDVElPTl9OQU1FX0VWRU5UXCIsIGFuZCB0aGF0IGhhcyBiZWVuIGFkZGVkIGluIHRoZSBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXlsb2FkIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBUaGlzIGNhbiBiZSBhbnkgamF2YXNjcmlwdCBvYmplY3QgYW5kIGlzIHVzZWQgdG8gc2VuZCBhbnkgY3VzdG9tIGRhdGEuXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnQgLSA9IE5vdCBSZXF1aXJlZC4gdW5kZWZpbmVkOyBUaGlzIGNhbiBiZSBlaXRoZXIgdGhlIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSB0aGUgVUkgQ2hhbm5lbCwgb3IgdGhlIHNyY0VsZW1lbnQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgTm90IFJlcXVpcmVkLiBUaGlzIHdpbGwgYmUgZGVmaW5lZCBpZiB0aGUgZXZlbnQgaXMgZnJvbSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYnNlcnZhYmxlfSBvYnMkIC0gPSB0aGlzLm9ic2VydmVyOyBUaGlzIGRlZmF1bHQgaXMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+UHVibGlzaGluZyBhIENoYW5uZWxQYXlsb2FkPC9oND4nXVxuICAgKiBsZXQgYWN0aW9uID0gXCJDSEFOTkVMX01ZX0NIQU5ORUxfUkVHSVNURVJFRF9BQ1RJT05fRVZFTlRcIjtcbiAgICogbGV0IGRhdGEgPSB7Zm9vOlwiYmFyXCJ9O1xuICAgKiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIGRhdGEpO1xuICAgKlxuICAgKi9cbiAgc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCA9IHt9LCBldmVudCA9IHt9LCBvYnMkID0gdGhpcy5vYnNlcnZlciQpIHtcbiAgICAvLyBNQUtFUyBBTEwgQ0hBTk5FTCBCQVNFIEFORCBEQVRBIFNUUkVBTVMgQ09OU0lTVEVOVFxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtID0gbmV3IENoYW5uZWxQYXlsb2FkKHRoaXMucHJvcHMubmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUwgU1RSRUVNIElURU0gXCIsY2hhbm5lbFBheWxvYWRJdGVtKTtcblxuICAgIC8vIGNvbnN0IG9uTmV4dEZyYW1lID0gKCk9Pm9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pO1xuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZShvbk5leHRGcmFtZSlcblxuICAgIG9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+QWxsb3dzIGNoYW5uZWxzIHRvIHN1YnNjcmliZSB0byBvdGhlciBjaGFubmVscy48L3A+XG4gICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNvdXJjZSByeGpzIFN1YmplY3QgZm9yIHRoZSByZXF1ZXN0ZWQgQ2hhbm5lbCwgd2hpY2ggY2FuIGJlIGxpc3RlbmVkIHRvIGJ5IGNhbGxpbmcgaXRzIHN1YnNjcmliZSBtZXRob2QuPC9wPlxuICAgKiA8cD5Lbm93bGVkZ2Ugb2YgcnhqcyBpcyBub3QgcmVxdWlyZWQgdG8gc3Vic2NyaWJlIHRvIGFuZCBwYXJzZSBDaGFubmVsIGRhdGEuPC9wPlxuICAgKiA8cD5CdXQgYWNjZXNzaW5nIHRoZSByeGpzIFN1YmplY3QgZ2l2ZXMgZGV2ZWxvcGVycyB0aGUgYWJpbGl0eSB0byB1c2UgYWxsIG9mIHRoZSBhdmFpbGFibGUgcnhqcyBtYXBwaW5nIGFuZCBvYnNlcnZhYmxlIHRvb2xzLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsLlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgc291cmNlIHJ4anMgU3ViamVjdCBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlN1YnNjcmliaW5nIHRvIGEgQ2hhbm5lbCBVc2luZyB0aGUgZ2V0Q2hhbm5lbCBtZXRob2Q8L2g0PlwiXVxuICAgKiBsZXQgcm91dGUkID0gdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9ST1VURVwiKVxuICAgKiByb3V0ZSQuc3Vic2NyaWJlKGxvY2FsTWV0aG9kKTtcbiAgICpcbiAgICpcbiAgICovXG4gIGdldENoYW5uZWwoY2hhbm5lbE5hbWUsIHBheWxvYWRGaWx0ZXIpIHtcbiAgICBjb25zdCBpc1ZhbGlkQ2hhbm5lbCA9IGMgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMoYylcbiAgICBjb25zdCBlcnJvciA9IGMgPT4gY29uc29sZS53YXJuKFxuICAgICAgICBgY2hhbm5lbCBuYW1lICR7Y30gaXMgbm90IHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1OYW1lc31gKVxuICAgIGNvbnN0IHN0YXJ0U3Vic2NyaWJlID0gKGMpID0+IHtcbiAgICAgIGNvbnN0IG9icyQgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFN0cmVhbShjKS5vYnNlcnZlclxuICAgICAgaWYgKHBheWxvYWRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb2JzJC5waXBlKGZpbHRlcihwYXlsb2FkRmlsdGVyKSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icyRcbiAgICB9XG4gICAgY29uc3QgZm4gPSBpZkVsc2UoaXNWYWxpZENoYW5uZWwsIHN0YXJ0U3Vic2NyaWJlLCBlcnJvcilcbiAgICByZXR1cm4gZm4oY2hhbm5lbE5hbWUpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JOb3RUcmFja0ZsYWcocHJvcHMgPSB7fSkge1xuICAgIGlmIChwcm9wcy5kb05vdFRyYWNrID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuZG9Ob3RUcmFja0NoYW5uZWwocHJvcHMuY2hhbm5lbE5hbWUpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc0VtcHR5LCBoZWFkLCB2YWx1ZXMsIGNvbXBvc2UsIHByb3AsIGNvbXBsZW1lbnQsIGlzTmlsLCBhbGxQYXNzLCByZWR1Y2UsIGZpbHRlciwgZXF1YWxzLCB0b1BhaXJzLCByZXBsYWNlLCBlaXRoZXIsIHByb3BFcSwgX18sIGludmVydCwgcGF0aCwgemlwT2JqLCByZWplY3QsIGtleXMsIGZpbmQsIGFzc29jLCBpcywgaGFzLCB3aGVuLCBzcGxpdCwgYWx3YXlzLCBjb25jYXQsIGpvaW4sIGZsYXR0ZW4sIG1hcCwgaWZFbHNlLCB0ZXN0LCBmaW5kTGFzdEluZGV4LCBsYXN0LCBkZWZhdWx0VG8sIGZyb21QYWlycyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcydcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmxcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCB1cmwgbWV0aG9kcyBmb3IgdGhlIFNweW5lUm91dGVDaGFubmVsXG4gICAgICovXG4gICAgdGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKG9iaikge1xuICAgIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgICBjb25zdCBpc05vdE5pbCA9IGNvbXBvc2UoY29tcGxlbWVudChpc05pbCksIGhlYWQsIHZhbHVlcylcbiAgICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdE5pbF0pXG4gICAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgocGFyYW1WYWx1ZSwgcm91dGVPYmopIHtcbiAgICBjb25zdCByZWplY3RQYXJhbUtleSA9IHJlamVjdChlcXVhbHMoJ3JvdXRlTmFtZScpKVxuICAgIGNvbnN0IGtleXNBcnIgPSBjb21wb3NlKHJlamVjdFBhcmFtS2V5LCBrZXlzKVxuICAgIGNvbnN0IHRlc3RGb3JSZWdleE1hdGNoID0gc3RyID0+IHRlc3QobmV3IFJlZ0V4cChzdHIpLCBwYXJhbVZhbHVlKVxuICAgIGNvbnN0IGNoZWNrZXIgPSBjb21wb3NlKGZpbmQodGVzdEZvclJlZ2V4TWF0Y2gpLCBrZXlzQXJyKVxuICAgIGNvbnN0IHJlZ2V4TWF0Y2hTdHIgPSBjaGVja2VyKHJvdXRlT2JqKVxuICAgIGlmIChpcyhTdHJpbmcsIHJlZ2V4TWF0Y2hTdHIpKSB7XG4gICAgICByb3V0ZU9iaiA9IGFzc29jKHBhcmFtVmFsdWUsIHByb3AocmVnZXhNYXRjaFN0ciwgcm91dGVPYmopLCByb3V0ZU9iailcbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlT2JqXG4gIH1cblxuICBzdGF0aWMgZm9ybWF0U3RyQXNXaW5kb3dMb2NhdGlvbihzdHIpIHtcbiAgICBjb25zdCBoYXNoID0gc3RyXG4gICAgY29uc3Qgc2VhcmNoID0gc3RyXG4gICAgY29uc3QgcGF0aG5hbWUgPSBzdHJcbiAgICByZXR1cm4geyBoYXNoLCBzZWFyY2gsIHBhdGhuYW1lIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvblN0ckJ5VHlwZSh0LCBpc0hhc2ggPSBmYWxzZSwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IGlzSGFzaCA9PT0gdHJ1ZSA/ICdoYXNoJyA6IHRcblxuICAgIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgICBzbGFzaDogJ3BhdGhuYW1lJyxcbiAgICAgIHF1ZXJ5OiAnc2VhcmNoJyxcbiAgICAgIGhhc2g6ICdoYXNoJ1xuICAgIH1cbiAgICBjb25zdCBwcm9wVmFsID0gdHlwZU1hcFt0eXBlXVxuICAgIGNvbnN0IHN0ciAgPSBwcm9wKHByb3BWYWwsIGxvYylcbiAgICBjb25zdCBjaGVja0ZvclNsYXNoQW5kSGFzaCA9IC9eKFxcLyk/KCMpPyhcXC8pPyguKikkL1xuICAgIC8vIGNvbnNvbGUubG9nKFwiREFUQSBMT0MgU1RSIFwiLHtzdHIsIGxvYywgcHJvcCwgdHlwZSxpc0hhc2h9KTtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoY2hlY2tGb3JTbGFzaEFuZEhhc2gsICckNCcpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMoZGF0YSwgcm91dGUsIHQgPSAnc2xhc2gnLCBwYXJhbXNGcm9tTG9jKSB7XG4gICAgY29uc3QgdXJsQXJyID0gW11cbiAgICBjb25zdCBsb29wVGhyb3VnaFBhcmFtID0gKHJvdXRlT2JqKSA9PiB7XG4gICAgICBjb25zdCB1cmxPYmogPSB7fVxuICAgICAgY29uc3Qga2V5d29yZCA9IHJvdXRlT2JqLnJvdXRlTmFtZSAvLyBQQVJBTSBGT1JNIFNQWU5FIENPTkZJR1xuICAgICAgbGV0IHBhcmFtVmFsRnJvbURhdGEgPSBkYXRhW2tleXdvcmRdICE9PSB1bmRlZmluZWQgPyBkYXRhW2tleXdvcmRdIDogcHJvcChrZXl3b3JkLCBwYXJhbXNGcm9tTG9jKSAvLyBQVUxMIFZBTFVFIEZPUiBUSElTIFBBUkFNIEZST00gREFUQVxuICAgICAgY29uc3QgcGFyYW1WYWxUeXBlID0gdHlwZW9mIChyb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXSlcblxuICAgICAgaWYgKHBhcmFtVmFsVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGFyYW1WYWxGcm9tRGF0YSA9IHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtVmFsVHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcm91dGVPYmogPSB0aGlzLmNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KHBhcmFtVmFsRnJvbURhdGEsIHJvdXRlT2JqKVxuICAgICAgfVxuXG4gICAgICB1cmxPYmpba2V5d29yZF0gPSBwYXJhbVZhbEZyb21EYXRhXG5cbiAgICAgIGlmICh0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwodXJsT2JqKSkge1xuICAgICAgICB1cmxBcnIucHVzaCh1cmxPYmopXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzT2JqZWN0ID0gaXMoT2JqZWN0LCByb3V0ZU9iailcbiAgICAgIGNvbnN0IG9iamVjdFBhcmFtRXhpc3RzID0gaGFzKHBhcmFtVmFsRnJvbURhdGEsIHJvdXRlT2JqKVxuICAgICAgY29uc3Qgb2JqZWN0Q29udGFpbnNSb3V0ZSA9IGhhcygncm91dGVQYXRoJywgcm91dGVPYmopXG4gICAgICBjb25zdCByZWN1cnNpdmVseUNhbGxMb29wQm9vbCA9IG9iamVjdFBhcmFtRXhpc3RzICYmIGlzT2JqZWN0XG4gICAgICBpZiAocmVjdXJzaXZlbHlDYWxsTG9vcEJvb2wgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgbmV3T2JqID0gcm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV1cbiAgICAgICAgaWYgKGhhcygncm91dGVQYXRoJywgbmV3T2JqKSkge1xuICAgICAgICAgIGxvb3BUaHJvdWdoUGFyYW0obmV3T2JqLnJvdXRlUGF0aClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvYmplY3RDb250YWluc1JvdXRlID09PSB0cnVlICYmIHBhcmFtVmFsRnJvbURhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb29wVGhyb3VnaFBhcmFtKHJvdXRlT2JqLnJvdXRlUGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb29wVGhyb3VnaFBhcmFtKHJvdXRlKVxuXG4gICAgcmV0dXJuIHVybEFyclxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVNsYXNoU3RyaW5nKGFycikge1xuICAgIGNvbnN0IGFyckNsZWFyID0gcmVqZWN0KGlzTmlsKVxuICAgIGNvbnN0IG5vdFVuZGVmaW5lZCA9IHdoZW4oY29tcGxlbWVudChpc05pbCwgX18pLCBqb2luKCcvJykpXG4gICAgY29uc3Qgc3RyaXBSZWdleCA9IHJlcGxhY2UoL14oXFxeKikoLip8XlxcJCkoXFwkKSQvLCAnJDInKVxuICAgIGNvbnN0IGpvaW5lciA9IGNvbXBvc2Uoc3RyaXBSZWdleCwgbm90VW5kZWZpbmVkLCBhcnJDbGVhciwgZmxhdHRlbiwgbWFwKHZhbHVlcykpXG4gICAgcmV0dXJuIGpvaW5lcihhcnIpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlTdHJpbmcoYXJyKSB7XG4gICAgY29uc3QgYXJyQ2xlYXIgPSByZWplY3QoaXNOaWwpXG5cbiAgICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSB0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWxcblxuICAgIGNvbnN0IGNyZWF0ZVBhaXIgPSBjb21wb3NlKFxuICAgICAgam9pbignPScpLFxuICAgICAgZmxhdHRlbixcbiAgICAgIHRvUGFpcnMpXG5cbiAgICBjb25zdCBjaGVja1BhaXIgPSBpZkVsc2UoXG4gICAgICBpc05vdE5pbEFuZElzTm90RW1wdHksXG4gICAgICBjcmVhdGVQYWlyLFxuICAgICAgYWx3YXlzKHVuZGVmaW5lZClcbiAgICApXG5cbiAgICBjb25zdCBtYXBBcnJheU9mUGFpcnMgPSBtYXAoY2hlY2tQYWlyKVxuXG4gICAgY29uc3QgY2hlY2tJZlN0cklzRW1wdHkgPSB3aGVuKFxuICAgICAgY29tcGxlbWVudChpc0VtcHR5KSxcbiAgICAgIGNvbmNhdCgnPycpKVxuXG4gICAgY29uc3QgY3JlYXRlUXMgPSBjb21wb3NlKFxuICAgICAgY2hlY2tJZlN0cklzRW1wdHksXG4gICAgICBqb2luKCcmJyksXG4gICAgICBhcnJDbGVhcixcbiAgICAgIG1hcEFycmF5T2ZQYWlycylcblxuICAgIHJldHVybiBjcmVhdGVRcyhhcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkRm9yUmVnZXhPdmVycmlkZXModXJsc0FyciwgZGF0YSwgcGFyc2VTdHJpbmcgPSAnVmFsdWUnKSB7XG4gICAgLy8gQ0hFQ0sgSUYgUEFZTE9BRCBIQVMgQU5ZIE9WRVJSSURFU1xuICAgIGNvbnN0IGdldFByb3BWYWxPdmVycmlkZSA9IChrZXkpID0+IHByb3AoYCR7a2V5fSR7cGFyc2VTdHJpbmd9YCwgZGF0YSlcblxuICAgIC8vIEdFVCBBTlkgUE9TU0lCTEUgVkFMVUUgVVNJTkcgVEhFIENVUlJFTlQgS0VZXG4gICAgY29uc3QgZ2V0T3ZlcnJpZGVWYWwgPSBjb21wb3NlKGdldFByb3BWYWxPdmVycmlkZSwgaGVhZCwga2V5cylcblxuICAgIC8vIE1BUCBBTEwgT0JKRUNUIFZBTFMgVE8gVEVTVCBGT1IgT1ZFUlJJREVTXG4gICAgY29uc3QgbWFwVXJsUHJvcHMgPSAocHJvcCkgPT4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGVWYWwgPSBnZXRPdmVycmlkZVZhbChwcm9wKVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIm92ZXJyaWRlIHZhbCBcIixvdmVycmlkZVZhbCwgZGF0YSk7XG4gICAgICAvLyBpZiByZWdleCB2YWx1ZSBpcyBmb3VuZFxuICAgICAgaWYgKG92ZXJyaWRlVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGNvbXBvc2UoaGVhZCwga2V5cykocHJvcCksIG92ZXJyaWRlVmFsLCBwcm9wKVxuICAgICAgfVxuICAgICAgLy8gaWRlbnRpdHlcbiAgICAgIHJldHVybiBwcm9wXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcChtYXBVcmxQcm9wcywgdXJsc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyh1cmxzQXJyKSB7XG4gICAgLy8gRGVmaW5lIHRoZSBpbnRlcm5hbCBtZXRob2QgdG8gZXh0cmFjdCB0aGUgc3RyaW5nIGJlZm9yZSB0aGUgcGlwZVxuICAgIGNvbnN0IGdldFN0cmluZ0JlZm9yZVBpcGUgPSAoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goL15bXnxdKi8pXG4gICAgICByZXR1cm4gbWF0Y2ggPyAobWF0Y2hbMF0gPT09ICdeJCcgPyAnJyA6IG1hdGNoWzBdKSA6IGlucHV0XG4gICAgfVxuXG4gICAgY29uc3QgbWFwVXJsQXJyT2JqID0gKG9iaikgPT4ge1xuICAgICAgY29uc3QgcGlwZVJlZHVjZXIgPSAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSBnZXRTdHJpbmdCZWZvcmVQaXBlKG9ialtrZXldKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvYmogPSBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShwaXBlUmVkdWNlciwge30pXG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodXJsc0FycikgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB1cmxzQXJyLm1hcChtYXBVcmxBcnJPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybHNBcnJcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCh1cmxzQXJyLCBkYXRhID0ge30pIHtcbiAgICAvKipcbiAgICAgKiAxLiBMb29wIHRocm91Z2ggdXJsc0FyclxuICAgICAqIDIuIExvb3AgdGhyb3VnaCBwcm9wZXJ0aWVzXG4gICAgICogMy4gQXBwbHkgbWF0Y2hHbG9iUGF0dGVybiB0byBlYWNoIHByb3BlcnR5IHZhbHVlIGFuZCBjaGVjayBmb3IgbWF0Y2ggd2l0aCBkYXRhIG9iamVjdCBwcm9wZXJ0eVxuICAgICAqIDQuIFJldHVybiB0aGUgdXBkYXRlZCBvYmplY3Qgd2l0aCBtYXRjaGVkIHZhbHVlcywgb3Iga2VlcCB0aGUgb3JpZ2luYWwgcGF0dGVybiBpZiBubyBtYXRjaFxuICAgICAqL1xuXG4gICAgY29uc3QgbWF0Y2hHbG9iUGF0dGVybiA9IChzdHIsIGdsb2JQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBnbG9iUGF0dGVybk1hdGNoID0gKHBhdHRlcm4sIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVyblxuICAgICAgICAgIC5yZXBsYWNlKC9bLS9cXFxcXiQrPy4oKXxbXFxde31dL2csICdcXFxcJCYnKSAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKi9nLCAnW1xcXFx3XFxcXGRfLV0qJykgLy8gKiBzaG91bGQgbWF0Y2ggYW55IHNlcXVlbmNlIG9mIGFscGhhbnVtZXJpYywgdW5kZXJzY29yZXMsIG9yIGRhc2hlc1xuXG4gICAgICAgIGNvbnN0IHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgKSAvLyBNYXRjaCB0aGUgZnVsbCBzdHJpbmdcbiAgICAgICAgcmV0dXJuIHJlZ2V4UGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgfVxuXG4gICAgICAvLyBTcGxpdCB0aGUgZ2xvYlBhdHRlcm4gYnkgcGlwZSAofClcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gZ2xvYlBhdHRlcm4uc3BsaXQoJ3wnKVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgYW55IG9mIHRoZSBwYXR0ZXJuc1xuICAgICAgY29uc3QgaGFzTWF0Y2ggPSBwYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBnbG9iUGF0dGVybk1hdGNoKHBhdHRlcm4sIHN0cikpXG5cbiAgICAgIC8vIFJldHVybiB0aGUgc3RyaW5nIGlmIHRoZXJlJ3MgYSBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZ2xvYiBwYXR0ZXJuXG4gICAgICByZXR1cm4gaGFzTWF0Y2ggPyBzdHIgOiBnbG9iUGF0dGVyblxuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGNoZWNrIGFuZCByZXBsYWNlIG1hdGNoaW5nIHByb3BlcnRpZXNcbiAgICBjb25zdCByZXBsYWNlTWF0Y2hpbmdQcm9wZXJ0eSA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRPYmogPSB7IC4uLm9iaiB9IC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9iamVjdCB0byBhdm9pZCBtdXRhdGlvblxuXG4gICAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBlYWNoIHByb3BlcnR5IGFuZCBhcHBseSBtYXRjaEdsb2JQYXR0ZXJuXG4gICAgICBjb25zdCBjaGVja0FuZFJlcGxhY2VQcm9wZXJ0eSA9IChrZXkpID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1cGRhdGVkT2JqLCBrZXkpICYmIGRhdGFba2V5XSkge1xuICAgICAgICAgIHVwZGF0ZWRPYmpba2V5XSA9IG1hdGNoR2xvYlBhdHRlcm4oZGF0YVtrZXldLCB1cGRhdGVkT2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3RcbiAgICAgIE9iamVjdC5rZXlzKHVwZGF0ZWRPYmopLmZvckVhY2goY2hlY2tBbmRSZXBsYWNlUHJvcGVydHkpXG5cbiAgICAgIHJldHVybiB1cGRhdGVkT2JqXG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBhcnJheSBhbmQgcmVwbGFjZSBtYXRjaGluZyBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIHVybHNBcnIubWFwKHJlcGxhY2VNYXRjaGluZ1Byb3BlcnR5KVxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRQYXJhbXNUb1JvdXRlKGRhdGEsIHIgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCB0LCBsb2NTdHIpIHtcbiAgICBjb25zdCB1cmxUeXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHIudHlwZVxuICAgIGNvbnN0IGlzSGFzaCA9IHIuaXNIYXNoXG4gICAgY29uc3Qgcm91dGUgPSByLnJvdXRlcy5yb3V0ZVBhdGhcbiAgICBjb25zdCBsb2NhdGlvblN0ciA9IGxvY1N0ciAhPT0gdW5kZWZpbmVkID8gbG9jU3RyIDogdGhpcy5nZXRMb2NhdGlvblN0ckJ5VHlwZSh1cmxUeXBlLCBpc0hhc2gpXG4gICAgY29uc3QgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiA9IHRoaXMuY29udmVydFJvdXRlVG9QYXJhbXMobG9jYXRpb25TdHIsIHIsIHVybFR5cGUpLnJvdXRlRGF0YVxuICAgIGxldCB1cmxBcnIgPSB0aGlzLmNyZWF0ZVJvdXRlQXJyYXlGcm9tUGFyYW1zKGRhdGEsIHJvdXRlLCB1cmxUeXBlLCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uKVxuXG4gICAgdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyh1cmxBcnIsIGRhdGEpXG4gICAgdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyh1cmxBcnIpXG4gICAgLy8gVEhJUyBXSUxMIE1BVENIIEVYQUNUTFkgVEhFIFBST1BFUlRZIElELCBTTyBwYWdlSWQ9XCJkYXNoYm9hcmRfMVwiIHdpbGwgcmV0dXJuIHRoYXQgaW5zdGVhZCBvZiBnbG9iUGF0dGVyblswXVxuICAgIC8vIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2godXJsQXJyLCBkYXRhKVxuICAgIC8vIGNvbnNvbGUubG9nKCdQQVJBTVMgVE8gUk9VVEUgJywgeyBkYXRhLCByLCB1cmxBcnIsIGxvY2F0aW9uU3RyLCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uIH0pXG5cbiAgICAvLyBUSElTIENSRUFURVMgQSBRVUVSWSBQQVRIIFNUUlxuICAgIGlmICh1cmxUeXBlID09PSAncXVlcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVyeVN0cmluZyh1cmxBcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2xhc2hTdHJpbmcodXJsQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgobWFpblN0ciwgcGFyYW1zQXJyKSB7XG4gICAgY29uc3QgY2hlY2tGb3JFbXB0eSA9ICByZXBsYWNlKC9eJC8sICdeJCcpXG4gICAgY29uc3QgY3JlYXRlU3RyUmVnZXhUZXN0ID0gKHN0cikgPT4ge1xuICAgICAgY29uc3QgcmVGbiA9IHMgPT4gbmV3IFJlZ0V4cChzKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyLFxuICAgICAgICByZTogcmVGbihzdHIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2ggPSAgZWl0aGVyKFxuICAgICAgcHJvcEVxKG1haW5TdHIsICdzdHInKSwgY29tcG9zZSh0ZXN0KF9fLCBtYWluU3RyKSwgcHJvcCgncmUnKSlcbiAgICApXG5cbiAgICBjb25zdCBmaW5kTWF0Y2hJbmRleCA9IGNvbXBvc2UoZmluZExhc3RJbmRleChlcXVhbHModHJ1ZSkpLCBtYXAoY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2gpLCBtYXAoY3JlYXRlU3RyUmVnZXhUZXN0KSwgbWFwKGNoZWNrRm9yRW1wdHkpKVxuXG4gICAgcmV0dXJuIGZpbmRNYXRjaEluZGV4KHBhcmFtc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKG9iaiwgc3RyLCByZWdleFRva2Vucykge1xuICAgIC8vXG4gICAgLy9cbiAgICAvLyAgICAgICBUSElTIElTIEEgVkVSWSBJTVBPUlRBTlQgTUVUSE9EXG4gICAgLy8gICAgICAgSVQgQ09NUEFSRVMgVEhFIFNUUklORyBUTyBCRSBNQVRDSEVEIFdJVEggVEhFIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgLy8gICAgICAgQU5EIElUIFdJTEwgUkVUVVJOIE9ORSBPRiBUSFJFRSBUSElOR1NcbiAgICAvLyAgICAgICAxLiBUSEUgU1RSSU5HIElUU0VMRlxuICAgIC8vICAgICAgIDIuIEEgTUFUQ0hJTkcgS0VZIEZST00gVEhFIENVUlJFTlQgT0JKRUNUXG4gICAgLy8gICAgICAgMy4gVEhFIFJPVVRFTkFNRVxuICAgIC8vXG5cbiAgICAvLyBHTyBUSFJPVUdIIEtFWVMgQU5EIENIRUNLIElGIFJFR0VYIE1BVENIRVNcblxuICAgIC8vIEdPIFRIUk9VR0ggUk9VVEUgQ09ORklHIFRPIEZJR1VSRSBPVVQgSUYgVkFMIE9SIEtFWSBTSE9VTEQgQkUgQ09NUEFSRURcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LCBjaG9vc2UgdGhlIGtleSBvZiB0aGUgcm91dGUgcGF0aCB0byBjaGVjayBhZ2FpbnN0XG4gICAgY29uc3QgZ2V0VmFsQ29tcGFyZUFyciA9IGNvbXBvc2UobWFwKGxhc3QpLCBtYXAoZmlsdGVyKGlzKFN0cmluZykpKSwgdG9QYWlycylcblxuICAgIC8vIENSRUFURSBUSEUgQVJSQVkgT0YgRUlUSEVSIFZBTFMgT1IgS0VZU1xuICAgIGNvbnN0IHBhcmFtc0FyciA9IGdldFZhbENvbXBhcmVBcnIob2JqKVxuXG4gICAgLy8gUkVTVUxUUyBGUk9NIFBBUkFNIENIRUNLXG4gICAgLy8gbGV0IHBhcmFtSW5kZXggPSBjaGVja0ZvclBhcmFtc01hdGNoKHBhcmFtc0Fycik7XG5cbiAgICBjb25zdCBwYXJhbUluZGV4ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5maW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4KHN0ciwgcGFyYW1zQXJyKVxuXG4gICAgLy8gREVGQVVMVCBWQUwgRk9SIFNUUklOR1xuICAgIGxldCBwYXJhbVN0ciA9IHN0clxuXG4gICAgLy8gTEVHQUNZIE1FVEhPRCAtLSBUVVJOIE9GRlxuICAgIC8vIFdIRU4gVEhFUkUgSVMgQSBNQVRDSCBGUk9NIFRIRSBDVVJSRU5UIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgaWYgKHBhcmFtSW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgcGFyYW0gPSBwYXJhbXNBcnJbcGFyYW1JbmRleF1cbiAgICAgIGNvbnN0IGludmVydGVkT2JqID0gaW52ZXJ0KG9iailcblxuICAgICAgLy8gUFVMTCBJTlZFUlRFRCBPQkpFQ1QgVE8gU0VFIElGIFNUUiBNQVRDSEVTXG4gICAgICBjb25zdCBnZXRQYXJhbUludmVydGVkID0gY29tcG9zZShoZWFkLCBkZWZhdWx0VG8oW10pLCBwcm9wKHBhcmFtKSlcbiAgICAgIGNvbnN0IHBhcmFtSW52ZXJ0ZWQgPSBnZXRQYXJhbUludmVydGVkKGludmVydGVkT2JqKVxuICAgICAgLy8gc3B5bmUgMTEuMC4xO1xuICAgICAgY29uc3QgcmUgPSAgL14oWy0kXFx3XSopJC9cbiAgICAgIGNvbnN0IGtleU1hdGNoID0gIHJlLnRlc3QocGFyYW1JbnZlcnRlZClcblxuICAgICAgaWYgKGtleU1hdGNoID09PSB0cnVlICYmIGlzKFN0cmluZywgcGFyYW1JbnZlcnRlZCkgPT09IHRydWUpIHtcbiAgICAgICAgcGFyYW1TdHIgPSBwYXJhbUludmVydGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtU3RyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cikge1xuICAgIGNvbnN0IHNsYXNoUmUgPSAvXihbL10pPyguKikkL1xuICAgIHJldHVybiBzdHIucmVwbGFjZShzbGFzaFJlLCAnJDInKS5zcGxpdCgnLycpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHN0clxuICAgIGNvbnN0IHZhbHVlc0FyciA9IHRoaXMuY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cilcbiAgICBjb25zdCBwYXRocyA9IFtdXG4gICAgY29uc3Qgcm91dGVkVmFsdWVzQXJyID0gW11cbiAgICBsZXQgbGF0ZXN0T2JqID0gdG9wTGV2ZWxSb3V0ZVxuICAgIGNvbnN0IGNyZWF0ZVBhcmFtc0Zyb21TdHIgPSAodG90YWwsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVWYWx1ZVN0ciA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbShsYXRlc3RPYmosIGN1cnJlbnRWYWx1ZSwgcmVnZXhUb2tlbnMpXG5cbiAgICAgIGxhdGVzdE9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgoY3VycmVudFZhbHVlLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGggPSAoc3RyKSA9PiBzdHIgIT09IGxhc3QocGF0aHMpXG5cbiAgICAgIGNvbnN0IGlzRW1wdHlPck5pbCA9IGVpdGhlcihpc0VtcHR5LCBpc05pbClcblxuICAgICAgaWYgKGxhdGVzdE9iaiAhPT0gdW5kZWZpbmVkICYmIHByZXZQYXRoTm90RXFDdXJyZW50UGF0aChsYXRlc3RPYmoucm91dGVOYW1lKSAmJiBpc0VtcHR5T3JOaWwocm91dGVWYWx1ZVN0cikgPT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGhzLnB1c2gobGF0ZXN0T2JqLnJvdXRlTmFtZSlcbiAgICAgICAgcm91dGVkVmFsdWVzQXJyLnB1c2gocm91dGVWYWx1ZVN0cilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0clBhdGggPSBbY3VycmVudFZhbHVlLCAncm91dGVQYXRoJ11cbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1QYXRoID0gWydyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVN0ciA9IHBhdGgoc3RyUGF0aCwgbGF0ZXN0T2JqKVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVJvdXRlUGFyYW0gPSBwYXRoKHJvdXRlUGFyYW1QYXRoLCBsYXRlc3RPYmopXG5cbiAgICAgIGlmIChvYmplY3RGcm9tU3RyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVN0clxuICAgICAgfSBlbHNlIGlmIChvYmplY3RGcm9tUm91dGVQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhdGVzdE9iaiA9IG9iamVjdEZyb21Sb3V0ZVBhcmFtXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVkdWNlKGNyZWF0ZVBhcmFtc0Zyb21TdHIsIDAsIHZhbHVlc0FycilcbiAgICBjb25zdCByb3V0ZURhdGEgPSB6aXBPYmoocGF0aHMsIHJvdXRlZFZhbHVlc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExhc3RBcnJWYWwoYXJyKSB7XG4gICAgY29uc3QgZ2V0TGFzdFBhcmFtID0gKGEpID0+IGxhc3QoYSkgIT09IHVuZGVmaW5lZCA/IGxhc3QoYSkgOiAnJ1xuICAgIHJldHVybiBnZXRMYXN0UGFyYW0oYXJyKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURlZmF1bHRQYXJhbUZyb21FbXB0eVN0cih0b3BMZXZlbFJvdXRlLCBzdHIpIHtcbiAgICBjb25zdCBvYmogPSB7fVxuICAgIGNvbnN0IGtleXdvcmQgPSB0b3BMZXZlbFJvdXRlLnJvdXRlTmFtZVxuICAgIG9ialtrZXl3b3JkXSA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbSh0b3BMZXZlbFJvdXRlLCBzdHIpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCBxdWVyeVJlID0gL14oWz9dKT8oLiopJC9cbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3Qgc3RyQXJyID0gc3RyLnJlcGxhY2UocXVlcnlSZSwgJyQyJylcbiAgICBjb25zdCBjb252ZXJ0VG9QYXJhbXMgPSBjb21wb3NlKG1hcChzcGxpdCgnPScpKSwgc3BsaXQoJyYnKSlcbiAgICBjb25zdCBwYXJhbXNBcnIgPSBjb252ZXJ0VG9QYXJhbXMoc3RyQXJyKVxuICAgIGxldCByb3V0ZURhdGEgPSBmcm9tUGFpcnMocGFyYW1zQXJyKVxuXG4gICAgbGV0IHBhdGhzID0gbWFwKGhlYWQsIHBhcmFtc0FycilcblxuICAgIGlmIChpc0VtcHR5KHN0cikgPT09IHRydWUpIHtcbiAgICAgIHJvdXRlRGF0YSA9IHRoaXMuY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gICAgICBwYXRocyA9IGtleXMocm91dGVEYXRhKVxuICAgIH1cbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgY29udmVydFJvdXRlVG9QYXJhbXMoc3RyLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IGFkZFNsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL1xcLyR8JC8sICcvJylcbiAgICBpZiAocm91dGVDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IHJlZ2V4VG9rZW5zID0gZGVmYXVsdFRvKHt9LCBwcm9wKCdyZWdleFRva2VucycsIHJvdXRlQ29uZmlnKSlcbiAgICBjb25zdCB0b3BMZXZlbFJvdXRlID0gcm91dGVDb25maWcucm91dGVzLnJvdXRlUGF0aFxuXG4gICAgaWYgKHR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0cilcbiAgICB9XG4gICAgc3RyID0gYWRkU2xhc2goc3RyKVxuXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGxhc3QsIGZsYXR0ZW4sIGNsb25lLCBwaWNrLCBwcm9wLCBwaWNrQWxsLCBwYXRoLCBlcXVhbHMsIGNvbXBvc2UsIGtleXMsIGZpbHRlciwgcHJvcEVxLCB1bmlxLCBtYXAsIF9fLCBjaGFpbiwgaXMsIGluY2x1ZGVzLCBmcm9tUGFpcnMsIHJlamVjdCwgbWVyZ2VEZWVwUmlnaHQsIG1lcmdlUmlnaHQsIHRlc3QsIHRvUGFpcnMsIHZhbHVlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS11cmwnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKlxuICAgICAqL1xuICAgIHRoaXMuY3JlYXRlUG9wU3RhdGVTdHJlYW0gPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQb3BTdGF0ZVN0cmVhbShzdWJzY3JpYmVGbikge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGhhbmRsZXJcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbigpIHt9XG4gICAgfVxuICAgIGNvbnN0IHBvcHVwT2JzJCA9IGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcilcblxuICAgIHBvcHVwT2JzJC5zdWJzY3JpYmUoc3Vic2NyaWJlRm4pXG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY29tcGFyZVJvdXRlS2V5d29yZHMob2JqID0ge30sIGFycikge1xuICAgIGNvbnN0IHBpY2tWYWx1ZXMgPSAobywgYSkgPT4gYSAhPT0gdW5kZWZpbmVkID8gcGljayhhLCBvKSA6IG9cbiAgICBsZXQgb2JqMSA9IHBpY2tWYWx1ZXMob2JqLCBhcnIpXG4gICAgcmV0dXJuIHtcbiAgICAgIHBpY2tWYWx1ZXMsXG4gICAgICBjb21wYXJlOiAob2JqID0ge30sIGFycikgPT4ge1xuICAgICAgICBjb25zdCBvYmoyID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICAgICAgY29uc3QgY29tcGFyZVByb3BzID0gcCA9PiB7XG4gICAgICAgICAgY29uc3QgcDEgPSBwcm9wKHAsIG9iajEpXG4gICAgICAgICAgY29uc3QgcDIgPSBwcm9wKHAsIG9iajIpXG4gICAgICAgICAgY29uc3Qgc2FtZSA9IGVxdWFscyhwMSwgcDIpXG4gICAgICAgICAgY29uc3QgcHJldmlvdXNFeGlzdHMgPSBwMSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgbmV4dEV4aXN0cyA9IHAyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gIXNhbWVcbiAgICAgICAgICBjb25zdCBhZGRlZCA9IHByZXZpb3VzRXhpc3RzID09PSBmYWxzZSAmJiBuZXh0RXhpc3RzID09PSB0cnVlXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHByZXZpb3VzRXhpc3RzID09PSB0cnVlICYmIG5leHRFeGlzdHMgPT09IGZhbHNlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQOiBcIixwLHtzYW1lLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0c30pO1xuICAgICAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICAgICAgb2JqW3BdID0geyBzYW1lLCBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCwgcHJldmlvdXNFeGlzdHMsIG5leHRFeGlzdHMgfVxuICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVByZWQgPSBwID0+IGNvbXBvc2Uoa2V5cywgZmlsdGVyKHByb3BFcSh0cnVlLCBwKSkpXG5cbiAgICAgICAgY29uc3QgZ2V0UHJvcHNTdGF0ZSA9IGNvbXBvc2UobWFwKGNvbXBhcmVQcm9wcyksIHVuaXEsIGNoYWluKGtleXMpKShbb2JqMSwgb2JqMl0pXG4gICAgICAgIGNvbnN0IHBhdGhzQ2hhbmdlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2NoYW5nZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNBZGRlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2FkZGVkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIGNvbnN0IHBhdGhzUmVtb3ZlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ3JlbW92ZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgb2JqMSA9IG9iajJcbiAgICAgICAgcmV0dXJuIHsgcGF0aHNBZGRlZCwgcGF0aHNSZW1vdmVkLCBwYXRoc0NoYW5nZWQgfVxuICAgICAgfSxcblxuICAgICAgZ2V0Q29tcGFyZXI6ICgpID0+IG9iajFcblxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZUFyckRhdGEocm91dGVBcnIsIHBhcmFtc0Fycikge1xuICAgIGNvbnN0IHBhdGhzID0gIGZpbHRlcihpbmNsdWRlcyhfXywgcm91dGVBcnIpLCBwYXJhbXNBcnIpXG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZ2V0TGFzdEFyclZhbChwYXRocylcbiAgICAvLyBjb25zb2xlLmxvZygnYXJyIGFuZCByb3V0ZU5hbWUgJyx7cGF0aHMsIHBhdGhJbm5lcm1vc3R9KTtcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCB9XG4gIH1cblxuICBzdGF0aWMgZmxhdHRlbkNvbmZpZ09iamVjdChvYmopIHtcbiAgICBjb25zdCBnbyA9IG9ial8gPT4gY2hhaW4oKFtrLCB2XSkgPT4ge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgcmV0dXJuIG1hcCgoW2tfLCB2X10pID0+IFtgJHtrfS4ke2tffWAsIHZfXSwgZ28odikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW1trLCB2XV1cbiAgICAgIH1cbiAgICB9LCB0b1BhaXJzKG9ial8pKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJGTEFUVEVOOiBcIix2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKSk7XG4gICAgcmV0dXJuIHZhbHVlcyhmcm9tUGFpcnMoZ28ob2JqKSkpXG4gIH1cblxuICBzdGF0aWMgYWRkUm91dGVEYXRhc2V0cyhjaGFubmVsUm91dGVPYmopIHtcbiAgICAvLyBjaGFubmVsUm91dGVPYmoudHlwZT0ncXVlcnknO1xuXG4gICAgY29uc3QgeyB0eXBlLCBpc0hhc2ggfSA9IGNoYW5uZWxSb3V0ZU9ialxuXG4gICAgLy8gY3JlYXRlIGhyZWYgYW5kIGNoZWNrIHRvIHNlZSBpZiBuZWVkIHRvIGNvbnZlcnQgdG8gaGFzaCBocmVmIGxpbmtzXG4gICAgY29uc3QgZ2V0SFJFRiA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHNhbnRpemVIUkVGID0gc3RyID0+IHtcbiAgICAgICAgY29uc3QgaHJlZlJFID0gL14oLipcXC8pKFtcXHctXSpcXC8/KSguKikkL2dtXG4gICAgICAgIC8vIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qKSguKikkL2dtO1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShocmVmUkUsICckMSQyJylcbiAgICAgICAgLy8gc3RyID0gU3RyaW5nKHN0cikucmVwbGFjZSgnXiQnLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHN0clxuICAgICAgfVxuXG4gICAgICBjb25zdCBoZWFkU3RyVmFsID0gdHlwZSA9PT0gJ3F1ZXJ5JyA/ICcnIDogaXNIYXNoID09PSB0cnVlID8gJyMnIDogJy8nXG4gICAgICBjb25zdCBocmVmU3RyID0gIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFBhcmFtc1RvUm91dGUob2JqLCBjaGFubmVsUm91dGVPYmopXG4gICAgICByZXR1cm4gaGVhZFN0clZhbCArIHNhbnRpemVIUkVGKGhyZWZTdHIpXG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcnMgZnJvbSBocmVmXG4gICAgY29uc3Qgc2FuaXRpemVTdHIgPSAoc3RyKSA9PiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oW15BLVphLXowLTktX10pL2csICcnKVxuXG4gICAgLy8gdGVzdCB3aGV0aGVyIHRvIHVzZSBrZXkgb3IgdmFsXG4gICAgY29uc3QgaXNWYWxpZFN0clJFID0gL14oW0EtWmEtejAtOV8tXSkrJC9tXG5cbiAgICBjb25zdCBjcmVhdGVJbml0aWFsVmFsRm4gPSAoYWNjTWFpbiA9IFtdLCByb3V0ZVBhdGhPYmosIG9iakFjYyA9IHt9KSA9PiB7XG4gICAgICBsZXQgeyByb3V0ZU5hbWUgfSA9IHJvdXRlUGF0aE9ialxuXG4gICAgICBjb25zdCBwcm9wc1JlZHVjZXIgPSAoYWNjLCBhcnJQYWlyKSA9PiB7XG4gICAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJQYWlyXG4gICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gaXMoT2JqZWN0LCB2YWwpXG5cbiAgICAgICAgY29uc3QgY3JlYXRlVGl0bGUgPSAoc3RyKSA9PiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oWy1fXSkvZywgJyAnKS50b1VwcGVyQ2FzZSgpXG5cbiAgICAgICAgY29uc3QgZ2V0TGlua1RleHQgPSBzdHIgPT4gdGVzdChpc1ZhbGlkU3RyUkUsIHN0cikgPyBjcmVhdGVUaXRsZShzdHIpIDoga2V5XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ3JvdXRlTmFtZScgfHwga2V5ID09PSAnNDA0Jykge1xuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlTmFtZSA9IHJvdXRlTmFtZSB8fCBwcm9wKCdyb3V0ZU5hbWUnLCB2YWwpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVEhFIEtFWSBJUyBcIix7a2V5LHZhbCxyb3V0ZU5hbWV9KVxuXG4gICAgICAgIGxldCBvID0gY2xvbmUob2JqQWNjKVxuICAgICAgICBvW3JvdXRlTmFtZV0gPSBzYW5pdGl6ZVN0cihrZXkpXG5cbiAgICAgICAgaWYgKGlzT2JqZWN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgaWYgKGtleXMobykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJSb3V0ZU5hbWUgPSBwYXRoKFsncm91dGVQYXRoJywgJ3JvdXRlTmFtZSddLCB2YWwpXG4gICAgICAgICAgICBpZiAoc3ViUm91dGVOYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9CYXNlID0gY2xvbmUobylcbiAgICAgICAgICAgICAgb0Jhc2Vbc3ViUm91dGVOYW1lXSA9ICcnXG4gICAgICAgICAgICAgIG9CYXNlLm5hdkxldmVsID0ga2V5cyhvYmpBY2MpLmxlbmd0aFxuICAgICAgICAgICAgICBvQmFzZS50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICAgICAgb0Jhc2UuaHJlZiA9IGdldEhSRUYob0Jhc2UpXG4gICAgICAgICAgICAgIGFjYy5wdXNoKG9CYXNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvID0gY3JlYXRlSW5pdGlhbFZhbEZuKGFjY01haW4sIHZhbCwgbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvLnRpdGxlID0gZ2V0TGlua1RleHQoa2V5KVxuICAgICAgICAgIG8uaHJlZiA9IGdldEhSRUYobylcbiAgICAgICAgfVxuICAgICAgICBvLm5hdkxldmVsID0ga2V5cyhvYmpBY2MpLmxlbmd0aFxuICAgICAgICBhY2MucHVzaChvKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b1BhaXJzKHJvdXRlUGF0aE9iaikucmVkdWNlKHByb3BzUmVkdWNlciwgW10pXG4gICAgfVxuXG4gICAgY29uc3QgcmVkdWNlZEFyciA9IGNyZWF0ZUluaXRpYWxWYWxGbihbXSwgY2hhbm5lbFJvdXRlT2JqLnJvdXRlcylcbiAgICBjb25zdCByb3V0ZURhdGFzZXRzQXJyID0gZmxhdHRlbihyZWR1Y2VkQXJyKVxuXG4gICAgY29uc3QgZ2V0TmF2UHJvcHMgPSAoZGF0YXNldHNBcnIpID0+IHtcbiAgICAgIGNvbnN0IGV4Y2x1ZGUgPSByZWplY3QoaW5jbHVkZXMoX18sIFsndGl0bGUnLCAnaHJlZicsICduYXZMZXZlbCddKSlcbiAgICAgIGNvbnN0IGdldE1haW5LZXlzID0gY29tcG9zZSh1bmlxLCBleGNsdWRlLCBmbGF0dGVuLCBtYXAoa2V5cykpXG4gICAgICByZXR1cm4gZ2V0TWFpbktleXMoZGF0YXNldHNBcnIpXG4gICAgfVxuICAgIGNvbnN0IHJvdXRlTmFtZXNBcnIgPSBnZXROYXZQcm9wcyhyb3V0ZURhdGFzZXRzQXJyKVxuXG4gICAgcmV0dXJuIHsgcm91dGVEYXRhc2V0c0Fyciwgcm91dGVOYW1lc0FyciB9XG4gIH1cblxuICBzdGF0aWMgY29uZm9ybVJvdXRlT2JqZWN0KGNoYW5uZWxSb3V0ZU9iaiA9IHt9LCBhZGQ0MDRQcm9wcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hhbm5lbHNSb3V0ZVBhdGggPSBwYXRoKFsnY2hhbm5lbHMnLCAnUk9VVEUnXSwgY2hhbm5lbFJvdXRlT2JqKVxuICAgIGxldCB7IGFkZDQwNHMgfSA9IGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQgPyBjaGFubmVsc1JvdXRlUGF0aCA6IGNoYW5uZWxSb3V0ZU9ialxuICAgIGFkZDQwNHMgPSBhZGQ0MDRzIHx8IGFkZDQwNFByb3BzXG4gICAgY29uc3QgcGFyc2VSb3V0ZVBhdGggPSAoYSkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gYVsxXVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgaWYgKHZhbCA9PT0gJycpIHtcbiAgICAgICAgYVsxXSA9ICdeJCdcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnIpIHtcbiAgICAgICAgYVsxXSA9IHZhbC5qb2luKCd8JylcbiAgICAgIH1cbiAgICAgIHJldHVybiBhXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNkdWNlQ29uZmlnID0gKGFycikgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsXSA9IGFyclxuICAgICAgY29uc3Qgb2JqNDA0ID0gYWRkNDA0cyA/IHsgNDA0OiAnLisnIH0gOiB7fVxuICAgICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QsIHZhbClcbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGNvbnN0IGl0ZXJPYmogPSBpc09iaiA9PT0gdHJ1ZSAmJiBpc0FyciA9PT0gZmFsc2VcbiAgICAgIGNvbnN0IGlzUm91dGVQYXRoID0ga2V5ID09PSAncm91dGVQYXRoJ1xuICAgICAgaWYgKGl0ZXJPYmopIHtcbiAgICAgICAgYXJyWzFdID0gY29uZmlnTWFwcGVyRm4oYXJyWzFdKVxuICAgICAgICBpZiAoaXNSb3V0ZVBhdGgpIHtcbiAgICAgICAgICBhcnJbMV0gPSBjb21wb3NlKG1lcmdlRGVlcFJpZ2h0KG9iajQwNCksIGZyb21QYWlycywgbWFwKHBhcnNlUm91dGVQYXRoKSwgdG9QYWlycykoYXJyWzFdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnTWFwcGVyRm4gPSBjb21wb3NlKGZyb21QYWlycywgbWFwKHRyYW5zZHVjZUNvbmZpZyksIHRvUGFpcnMpXG5cbiAgICBpZiAoY2hhbm5lbHNSb3V0ZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFID0gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFKVxuICAgICAgY29uc3QgZXh0cmFSb3V0ZURhdGEgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmFkZFJvdXRlRGF0YXNldHMoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFKVxuICAgICAgY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChjaGFubmVsUm91dGVPYmouY2hhbm5lbHMuUk9VVEUsIGV4dHJhUm91dGVEYXRhKVxuICAgICAgcmV0dXJuIGNoYW5uZWxSb3V0ZU9ialxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdNYXBwZXJGbihjaGFubmVsUm91dGVPYmopXG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQge1xuICBwaWNrLFxuICBmaW5kLFxuICBvbWl0LFxuICBvdmVyLFxuICBtZXJnZVJpZ2h0LFxuICBpcyxcbiAgb2JqT2YsXG4gIG1lcmdlQWxsLFxuICBwYXRoLFxuICBrZXlzLFxuICBwcm9wLFxuICBlcXVhbHMsXG4gIGhlYWQsXG4gIGNvbXBvc2UsXG4gIGxlbnNQcm9wLFxuICBjaGFpbixcbiAgcGlja0FsbCxcbiAgZGVmYXVsdFRvLFxuICBpc0VtcHR5LFxuICBjb25jYXQsXG4gIHdoZW4sXG4gIGNvbXBsZW1lbnQsXG4gIHJldmVyc2UsXG4gIGN1cnJ5TixcbiAgX18sXG4gIHRlc3QsXG4gIHJlcGxhY2UsXG4gIHRvUGFpcnMsXG4gIHJlZHVjZVxuICAsIGZpbHRlciBhcyByYW1kYUZpbHRlciwgbWVyZ2VSaWdodCBhcyByTWVyZ2Vcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxSb3V0ZSBleHRlbmRzIENoYW5uZWwge1xuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcyA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxSb3V0ZVxuICAgICAqIEB0eXBlIGNvcmVcbiAgICAgKlxuICAgICAqIEBkZXNjXG4gICAgICpcbiAgICAgKiA8cD5UaGUgU3B5bmVDaGFubmVsUm91dGUgaGFzIHRoZSB0d28gbWFpbiBkdXRpZXM6XG4gICAgICogIDx1bD5cbiAgICAgKiAgIDxsaT5Db21iaW5lIGRhdGEgd2l0aCB0aGUgY3VycmVudCB3aW5kb3cgbG9jYXRpb24gdG8gdXBkYXRlIHRoZSBsb2NhdGlvbidzIHBhdGhuYW1lLjwvbGk+XG4gICAgICogICA8bGk+TGlzdGVuIHRvIHdpbmRvdyBsb2NhdGlvbiBjaGFuZ2VzIHRvIHRyYW5zbGF0ZSB0aGUgbG9jYXRpb24gcGF0aG5hbWUgaW50byBhIHNlcmllcyBvZiBtb2RlbCBwcm9wZXJ0aWVzLjwvbGk+XG4gICAgICogPC91bD5cbiAgICAgKiA8cD5JbiBib3RoIGNhc2VzLCB0aGlzIGNoYW5uZWwgc2VuZHMgYSBDaGFubmVsUGF5bG9hZCBjb250YWluaW5nIHVwZGF0ZWQgcm91dGUgcHJvcGVydGllcy48L3A+XG4gICAgICpcbiAgICAgKiA8aDM+VGhlIHR3byBhY3Rpb25zIHRoYXQgYXJlIHJlZ3NpdGVyZWQgZm9yIHRoZSBSb3V0ZSBjaGFubmVsIGFyZTo8L2gzPlxuICAgICAqIDx1bD5cbiAgICAgKiA8bGk+Q0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVDwvbGk+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UPC9saT5cbiAgICAgKiAgPC91bD5cbiAgICAgKlxuICAgICAqICAgIDxoMz5UaGUgUm91dGVzIENvbmZpZ3VyYXRpb24gT2JqZWN0PC9oMz5cbiAgICAgKiAgICA8cD5UaHIgcm91dGVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHVzZWQgdG8gbWFwIHRoZSBsb2NhdGlvbiBzdHJpbmcgdG8gYW5kIGZyb20gYSByb3V0ZSBtb2RlbC48L3A+XG4gICAgICpcbiAgICAgKiAgICAgPHByZT4gICAgICAgICAgIHtcbiAgICAgKiAgICAgICAgICAgICAgICByb3V0ZVBhdGg6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsT25lUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjE6ICdicmFuY2hpbmctZW5kcy1oZXJlJyxcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlT3B0aW9uMjoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsVHdvUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxldmVsMjogJ2xldmVsLTItYnJhbmNoLWVuZHMtaGVyZSdcbiAgICAgKlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgIH1cbiAgICAgKlxuICAgICAqICAgICAgICAgIDwvcHJlPlxuICAgICAqICAgICA8cD5UaGlzIGNvbmZpZyBvYmplY3QgY29uc2lzdHMgb2YgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3RzIHRoYXQgY29ycmVzcG9uZHMgdG8gYWxsIG9mIHRoZSBicmFuY2hpbmcgcG9zc2libGl0aWVzIGZvciB0aGUgYXBwLjwvcD5cbiAgICAgKiAgICA8cD5UaGUgcm91dGVOYW1lIHZhbHVlIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciBlYWNoIHJvdXRlUGF0aC48L3A+XG4gICAgICogICAgPGgzPlJvdXRlIE9wdGlvbnM8L2gzPlxuICAgICAqICAgIDxwPkEgcm91dGVQYXRoIG1heSBjb250YWluIHNldmVyYWwgcm91dGUgb3B0aW9uIGtleS12YWx1ZSBwYWlycywgd2hpY2ggaXMgdXNlZCB0byBtYXAgYmV0d2VlbiBkYXRhIGFuZCB0aGUgd2luZG93IGxvY2F0aW9uLjwvcD5cbiAgICAgKiAgICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgIDxoNSBjbGFzcz0nYmFzaWMnPlRoZSBSb3V0ZSBPcHRpb24gS2V5IChvciBsZWZ0IHZhbHVlKTwvaDU+XG4gICAgICogICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgPGxpPk1hcHMgdGhlIHdpbmRvdyBsb2NhdGlvbiB0byByb3V0ZSBkYXRhIHByb3BlcnRpZXM8L2xpPlxuICAgICAqICAgICAgICAgPGxpPlRoaXMgY2hhbm5lbCBjYW4gJ2ZpbGwgaW4gdGhlIGJsYW5rcycgc28gdGhhdCBvbmx5IHRoZSB1cGRhdGVkIGxldmVsIHJvdXRlTmFtZXMgYXJlIHJlcXVpcmVkIHRvIHJldmlzZSB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+Q2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGRhdGEgcHJvcGVydGllcyBjYW4gc2hhcmUgdGhlIHNhbWUgYnJhbmNoaW5nIGxvZ2ljPC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKlxuICAgICAqICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIFZhbHVlIChvciByaWdodCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgICA8bGk+TWFwcyBkYXRhIHByb3BlcnRpZXMgdG8gcGFydCBvZiBhIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkRldGVybWluZXMgdGhlIHN0cmluZyB2YWx1ZSBmb3IgaXRzIGxldmVsIG9mIHRoZSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5UaGUgdmFsdWUgY2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGxvY2F0aW9ucyBjYW4gbWFwIHRvIHNhbWUgcm91dGVEYXRhIHByb3BlcnR5PC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+QnJhbmNoaW5nIGVuZHMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgZWl0aGVyIGEgU3RyaW5nIG9yIGEgcmVnZXggcGF0dGVybjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBjb250aW51ZXMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3Q8L2xpPlxuICAgICAqICAgICAgICAgIDwvdWw+XG4gICAgICogICAgICA8L2xpPlxuICAgICAqICAgICAgPC91bD5cbiAgICAgKlxuICAgICAqICAgICAgPGgzPkVuaGFuY2luZyBUaGUgQXBwJ3MgUm91dGluZyBMb2dpYzwvaDM+XG4gICAgICogICAgICA8cD5UaGUgYmVzdCBwcmFjdGljZSBmb3IgYSBTcHluZSBBcHAgaXMgdG8gaGF2ZSBvbmUgY29tcG9uZW50LCBhIGN1c3RvbSBjaGFubmVsLCBsaXN0ZW4gdG8gdGhlIFNweW5lUm91dGVDaGFubmVsLiBBbGwgb3RoZXIgY29tcG9uZW50cyB3aWxsIHRoZW4gbGlzdGVuIHRvIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbC4gVGhpcyBhbGxvd3MgdGhlIGN1c3RvbSByb3V0ZSBjaGFubmVsIHRvIGVuaGFuY2Ugcm91dGluZyBsb2dpYyB3aXRoIG1vcmUgZGF0YSBhbmQgY3VzdG9tIGFjdGlvbnMuPC9wPlxuICAgICAqICAgICAgPHA+WW91IGNhbiBzZWUgdGhpcyBjdXN0b20gcm91dGluZyBjaGFubmVsIGluIGFjdGlvbiBpbiB0aGUgU3B5bmUgU3RhcnRlciBBcHA8L3A+XG4gICAgICpcbiAgICAgKiAgICAgIDxoNCBjbGFzcz0nYmFzaWMnPkV4YW1pbmluZyB0aGlzIFNpdGUncyBSb3V0ZSBDb25maWd1cmF0aW9uPC9oND5cbiAgICAgKiAgICAgIDxhcnRpY2xlIGNsYXNzPSdjb2RlLWV4YW1wbGUnIGlkPSdyb3V0ZXMtY29uZmlnLWV4YW1wbGUnPjwvYXJ0aWNsZT5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgc2l0ZSByb3V0aW5nIGluIGFjdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBjb25zb2xlJ3Mgcm91dGVzIHBhbmVsPC9wPlxuICAgICAqICAgICAgPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZScgZGF0YS10eXBlPVwiY29uc29sZVwiIGRhdGEtdmFsdWU9XCJvcGVuXCIgZGF0YS1jaGFubmVsLXR5cGU9XCJyb3V0ZVwiPkNMSUNLIFRPIE9QRU4gUk9VVEUgUEFORUw8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+QmluZGluZyBVSSBFTGVtZW50cyB0byB0aGUgUm91dGUgQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogLy8gVGhpcyBhbHNvIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIG92ZXJyaWRlIHRoZSBSb3V0ZU9wdGlvbiB2YWx1ZSAodXNlZnVsIHdoZW4gdGhlIHZhbHVlIGlzIGEgcmVnZXggcGF0dGVybilcbiAgICAgKiA8ZGl2IGNsYXNzPSdidG4nIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgZGF0YS1wYWdlLWlkPSdob21lJyBkYXRhLXBhZ2UtaWQtdmFsdWU9Jyc+SE9NRTwvZGl2PlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBWaWV3U3RyZWFtJnJzcXVvO3Mgc2VuZEluZm9Ub0NoYW5uZWw8L2g0PlwiXVxuICAgICAqIGNvbnN0IGRhdGFVcGRhdGVPYmogPSB7cGFnZUlkOidndWlkZScsIHNlY3Rpb246J3JlZmVyZW5jZScsIG1lbnVJdGVtOidzcHluZS1yb3V0ZS1jaGFubmVsJ307XG4gICAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfUk9VVEVcIiwgZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PlVwZGF0aW5nIHRoZSBSb3V0ZSBDaGFubmVsIHVzaW5nIENoYW5uZWwmcnNxdW87cyBzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbChkYXRhVXBkYXRlT2JqKTtcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gY29uZmlnLnR5cGUgLSA9ICdzbGFzaCc7IFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgdXJsIHN0cnVjdHVyZSBieSBjb25mb3JtaW5nIHRoZSB3aW5kb3cgcGF0aG5hbWUgdG8gZWl0aGVyIHRoZSBzbGFzaCwgcXVlcnkgb3IgaGFzaCBmb3JtYXRzLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcucm91dGVzIC0gPSB7cm91dGVQYXRoOiB7cm91dGVOYW1lOidjaGFuZ2UnfTsgVGhpcyBuZXN0ZWQgT2JqZWN0IGlzIHVzZWQgdG8gY29udHJ1Y3QgdGhlIHdpbmRvdyBwYXRobmFtZSBhbmQgdG8gZXhwcmVzcyB0aGUgd2luZG93IGxvY2F0aW9uIGFzIG1vZGVsIHZhcmlhYmxlcy5cbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9ST1VURSc7XG4gICAgICpcbiAgICAgKi9cbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICBzdXBlcignQ0hBTk5FTF9ST1VURScsIHByb3BzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmooKVxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5uYXZUb1N0cmVhbSQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5uYXZUb1N0cmVhbSQucGlwZShtYXAoaW5mbyA9PiB0aGlzLm9uTWFwTmV4dChpbmZvKSkpXG4gICAgdGhpcy5jb21wYXJlUm91dGVLZXl3b3JkcyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29tcGFyZVJvdXRlS2V5d29yZHMoKVxuICB9XG5cbiAgY2hlY2tDb25maWdGb3JIYXNoKCkge1xuICAgIC8vIExFR0FDWSBDSEVDSyBUTyBTSU1QTElGWSBDT05GSUcgRk9SIEhBU0g7XG4gICAgY29uc3QgaXNIYXNoVHlwZSA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9PT0gJ2hhc2gnXG4gICAgaWYgKGlzSGFzaFR5cGUgPT09IHRydWUpIHtcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9ICdzbGFzaCdcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUuaXNIYXNoID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcbiAgICB0aGlzLmNoZWNrQ29uZmlnRm9ySGFzaCgpXG4gICAgdGhpcy5pbml0U3RyZWFtKClcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKCkge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICAgIGNvbnN0IGNvbnZlcnRlciA9IHN0ciA9PiBvYmpPZihzdHIsIHN0cilcbiAgICBjb25zdCBvYmogPSBtZXJnZUFsbChjaGFpbihjb252ZXJ0ZXIsIGFycikpXG4gICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IG9ialxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfUk9VVEVfVVBEQVRFX0NPTkZJR19FVkVOVCcsICd1cGRhdGVSb3V0ZUNvbmZpZyddXG4gICAgXVxuICB9XG5cbiAgdXBkYXRlUm91dGVDb25maWcoZSkge1xuICAgIGNvbnN0IG5ld1JvdXRlc09iaiAgPSBwaWNrKFsnaXNIYXNoJywgJ2lzSGlkZGVuJywgJ3JvdXRlcycsICd0eXBlJ10sIGUucGF5bG9hZClcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUgPSBtZXJnZVJpZ2h0KFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIG5ld1JvdXRlc09iailcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25mb3JtUm91dGVDb25maWcoKVxuXG4gICAgY29uc3Qgcm91dGVDb25maWcgPSB0aGlzLmdldFJvdXRlQ29uZmlnKClcbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCdcblxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gcm91dGVDb25maWdcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCByb3V0ZUNvbmZpZywge30sIHt9LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIGdldFJvdXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IHNweW5lQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZ1xuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIHNweW5lQ29uZmlnKVxuICAgIGlmIChyb3V0ZUNvbmZpZy50eXBlID09PSAncXVlcnknKSB7XG4gICAgICByb3V0ZUNvbmZpZy5pc0hhc2ggPSBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZmxhdHRlbkNvbmZpZ09iamVjdChyb3V0ZUNvbmZpZy5yb3V0ZXMpXG4gICAgcm91dGVDb25maWcucGFyYW1zQXJyID0gYXJyXG4gICAgcmV0dXJuIHJvdXRlQ29uZmlnXG4gIH1cblxuICBpbml0U3RyZWFtKCkge1xuICAgIHRoaXMuZmlyc3RMb2FkU3RyZWFtJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQodW5kZWZpbmVkLCB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgJycgKyAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpXG5cbiAgICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtKHRoaXMub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcykpXG5cbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuZmlyc3RMb2FkU3RyZWFtJCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgb25NYXBOZXh0KGRhdGEsIGZpcnN0TG9hZGVkID0gZmFsc2UpIHtcbiAgICBkYXRhLmFjdGlvbiA9ICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGF5bG9hZCkge1xuICAgIGNvbnN0IHJvdXRlTGVucyA9IGxlbnNQcm9wKFsncm91dGVEYXRhJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBheWxvYWQpXG4gIH1cblxuICBzdGF0aWMgb25JbmNvbWluZ0RvbUV2ZW50KGV2dCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGFjdG4pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuICE9PSB1bmRlZmluZWRcbiAgICAgID8gYWN0blxuICAgICAgOiB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICAvLyBDSEVDSyBJRiBUSElTIElTIEEgSElTVE9SWSBFVkVOVCBCWSBVU0lORyBUSEUgcm91dGVDb3VudCBQUk9QRVJUWVxuICAgIGNvbnN0IGV2ZW50Q291bnQgPSBwYXRoKFsnc3RhdGUnLCAncm91dGVDb3VudCddLCBldnQpXG4gICAgY29uc3QgaXNIaXN0b3J5Q291bnQgPSBpcyhOdW1iZXIsIGV2ZW50Q291bnQpID09PSB0cnVlXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tU3RyaW5nKGNvbmZpZywgaXNIaXN0b3J5Q291bnQpXG4gICAgaWYgKGlzSGlzdG9yeUNvdW50ID09PSB0cnVlKSB7XG4gICAgICBwYXlsb2FkLnJvdXRlQ291bnQgPSBldmVudENvdW50XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChhY3RuID09PSAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpIHtcbiAgICAgIHBheWxvYWQubGlua3NEYXRhID0gcHJvcCgncm91dGVEYXRhc2V0c0FycicsIGNvbmZpZylcbiAgICB9XG4gICAgY29uc3Qga2V5d29yZEFycnMgPSB0aGlzLmNvbXBhcmVSb3V0ZUtleXdvcmRzLmNvbXBhcmUocGF5bG9hZC5yb3V0ZURhdGEsIHBheWxvYWQucGF0aHMpXG4gICAgcGF5bG9hZCA9IHJNZXJnZShwYXlsb2FkLCBrZXl3b3JkQXJycylcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHVuZGVmaW5lZCwgZXZ0LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzKHBheWxvYWQpIHtcbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRXZlbnRNZXRob2RzKG9icykge1xuICAgIGNvbnN0IHJlID0gL14oZXZlbnQpKFtBLVpdLiopKFtBLVpdLiopJC9nbVxuICAgIGNvbnN0IGdldE1ldGhvZHMgPSBjb21wb3NlKHJhbWRhRmlsdGVyKHRlc3QocmUpKSwga2V5cywgcHJvcCgncGF5bG9hZCcpKVxuICAgIGNvbnN0IG1ldGhvZHNBcnIgPSBnZXRNZXRob2RzKG9icylcbiAgICBpZiAobWV0aG9kc0Fyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgZXZ0ID0gcHJvcCgnZXZlbnQnLCBvYnMpXG4gICAgICBpZiAoZXZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kVXBkYXRlID0gKG1hdGNoLCBwMSwgcDIsIHAzLCBwNCkgPT4gU3RyaW5nKHAyKS50b0xvd2VyQ2FzZSgpICsgcDMgKyBwNFxuICAgICAgICBjb25zdCBtZXRob2RTdHJSZXBsYWNlID0gcmVwbGFjZSgvXihldmVudCkoW0EtWl0pKC4qKShbQS1aXS4qKSQvZ20sIG1ldGhvZFVwZGF0ZSlcbiAgICAgICAgY29uc3QgcnVuTWV0aG9kID0gKG1ldGhvZFN0cikgPT4ge1xuICAgICAgICAgIGNvbnN0IG0gPSBtZXRob2RTdHJSZXBsYWNlKG1ldGhvZFN0cilcbiAgICAgICAgICBpZiAoZXZ0W21dICE9PSB1bmRlZmluZWQpIHsgZXZ0W21dKCkgfVxuICAgICAgICB9XG4gICAgICAgIG1ldGhvZHNBcnIuZm9yRWFjaChydW5NZXRob2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic1xuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRW5kUm91dGUocGwsIHJvdXRlQ29uZmlnSnNvbiA9IHRoaXMucm91dGVDb25maWdKc29uLCBkZWJ1Z0Jvb2wpIHtcbiAgICBjb25zdCBlbmRSb3V0ZSA9IGNvbXBvc2UoZXF1YWxzKCd0cnVlJyksIHBhdGgoWydwYXlsb2FkJywgJ2VuZFJvdXRlJ10pKShwbClcblxuICAgIGlmIChlbmRSb3V0ZSAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHBsXG4gICAgfVxuICAgIGNvbnN0IGRlYnVnID0gZGVidWdCb29sICE9PSB1bmRlZmluZWQgPyBkZWJ1Z0Jvb2wgOiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcbiAgICBjb25zdCB7IHBheWxvYWQgfSA9IHBsXG5cbiAgICBjb25zdCBnZXRQcm9wVmFsID0gKHJvdXRlUGF0aCkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVOYW1lID0gcHJvcCgncm91dGVOYW1lJywgcm91dGVQYXRoKVxuICAgICAgaWYgKHJvdXRlTmFtZSkge1xuICAgICAgICBjb25zdCBrZXlzQXJyID0gY29tcG9zZShrZXlzLCBvbWl0KFsncm91dGVOYW1lJ10pKShyb3V0ZVBhdGgpXG4gICAgICAgIGNvbnN0IHJvdXRlTmFtZVZhbCA9IHBheWxvYWRbcm91dGVOYW1lXVxuICAgICAgICBjb25zdCBwcmVkID0gYXJyU3RyID0+IG5ldyBSZWdFeHAoYF4ke2FyclN0cn0kYCkudGVzdChyb3V0ZU5hbWVWYWwpXG4gICAgICAgIGNvbnN0IHJvdXRlVmFsID0gZmluZChwcmVkLCBrZXlzQXJyKVxuICAgICAgICByZXR1cm4gcm91dGVWYWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaXRlciA9IDBcbiAgICBjb25zdCBvblJlZHVjZVJvdXRlUGF0aHMgPSAoYWNjID0gW10sIGFycikgPT4ge1xuICAgICAgLy8gY29uc3QgW2tleSwgdmFsXSA9IGFyclxuICAgICAgY29uc3QgdmFsID0gYXJyWzFdXG4gICAgICBjb25zdCB7IHJvdXRlUGF0aCB9ID0gdmFsXG4gICAgICBjb25zdCByb3V0ZU5hbWUgPSBwcm9wKCdyb3V0ZU5hbWUnLCByb3V0ZVBhdGgpXG4gICAgICBjb25zdCByb3V0ZU5hbWVWYWwgPSBnZXRQcm9wVmFsKHJvdXRlUGF0aClcbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBpdGVyID0gaXRlciArIDFcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGNvbnN0IG5leHRSb3V0ZVBhdGggPSByb3V0ZVBhdGhbcm91dGVOYW1lVmFsXVxuICAgICAgICAvLyBjb25zb2xlLmxvZygna2V5IGlzICcse2l0ZXIsYWNjLGtleSwgcm91dGVOYW1lLCByb3V0ZU5hbWVWYWwsIGl0ZXJPYmosIG5leHRSb3V0ZVBhdGh9KTtcbiAgICAgICAgaWYgKG5leHRSb3V0ZVBhdGgpIHtcbiAgICAgICAgICBjb21wb3NlKHJldmVyc2UsIHJlZHVjZShvblJlZHVjZVJvdXRlUGF0aHMsIGFjYyksIHRvUGFpcnMpKHsgbmV4dFJvdXRlUGF0aCB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiS0VZIElTIFwiLHtpdGVyLGtleSwgcm91dGVOYW1lLCByb3V0ZU5hbWVWYWx9KVxuICAgICAgICAgIGlmIChpdGVyID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB1c2Ugb2YgZW5kIHJvdXRlIG1ldGhvZCBzaG91bGQgYWRkIHN0YXJ0IHJvdXRlIHZhbHVlIG9mIFwiJHtyb3V0ZU5hbWV9XCIuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2gocm91dGVOYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IHsgcm91dGVzIH0gPSByb3V0ZUNvbmZpZ0pzb25cblxuICAgIGNvbnN0IGVuZFJvdXRlVmFsQXJyID0gY29tcG9zZShyZXZlcnNlLCByZWR1Y2Uob25SZWR1Y2VSb3V0ZVBhdGhzLCBbXSksIHRvUGFpcnMpKHsgcm91dGVzIH0pXG4gICAgLy8gY29uc29sZS5sb2coJ2VuZCByb3V0ZSB2YWwgYXJyICcsZW5kUm91dGVWYWxBcnIpO1xuICAgIGlmIChlbmRSb3V0ZVZhbEFyci5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGVuZFJvdXRlVmFsID0gZW5kUm91dGVWYWxBcnJbMF1cbiAgICAgIHBsLnBheWxvYWRbZW5kUm91dGVWYWxdID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGVuZCByb3V0ZSBwYXJhbSBkaWQgbm90IHlpZWxkIGFueSByZXN1bHRzIGZvciAke0pTT04uc3RyaW5naWZ5KHBheWxvYWQpfSBgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGxcbiAgfVxuXG4gIG9uVmlld1N0cmVhbUluZm8ocGwpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG4gICAgU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFdmVudE1ldGhvZHMocGwpXG4gICAgcGwgPSB0aGlzLmNoZWNrRm9yRW5kUm91dGUocGwpXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tUGFyYW1zKHBsKVxuXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHByb3AoJ3NyY0VsZW1lbnQnLCBwbClcbiAgICBjb25zdCBldmVudCA9IHByb3AoJ2V2ZW50JywgcGwpXG4gICAgY29uc3QgY2hhbmdlTG9jYXRpb25Cb29sID0gIXBheWxvYWQuaXNIaWRkZW5cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcblxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kUm91dGVTdHJlYW0ocGF5bG9hZCwgY2hhbmdlTG9jYXRpb25Cb29sKVxuXG4gICAgcGF5bG9hZCA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZVNTSUQocGF5bG9hZClcblxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMocm91dGVWYWx1ZSwgcmVnZXhUb2tlbk9iaikge1xuICAgIGNvbnN0IHRva2VuS2V5c0FyciA9IGtleXMocmVnZXhUb2tlbk9iailcblxuICAgIHJldHVybiB0b2tlbktleXNBcnJcbiAgfVxuXG4gIHNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VXaW5kb3dMb2MgPSB0cnVlKSB7XG4gICAgaWYgKGNoYW5nZVdpbmRvd0xvYyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRXaW5kb3dMb2NhdGlvbihwYXlsb2FkKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0YXRlKCkge1xuICAgIHJldHVybiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gIH1cblxuICBzdGF0aWMgZ2V0SXNEZWVwTGlua0Jvb2woaXNIaXN0b3J5KSB7XG4gICAgcmV0dXJuIGlzSGlzdG9yeSA9PT0gZmFsc2UgJiYgdGhpcy5fcm91dGVDb3VudCA9PT0gMFxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQ291bnQoaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5fcm91dGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yb3V0ZUNvdW50ID0gMFxuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlQ291bnRcbiAgICB9XG4gICAgaWYgKGlzSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgKz0gMVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICB9XG5cbiAgc3RhdGljIGdldEV4dHJhUGF5bG9hZFBhcmFtcyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCByb3V0ZUNvdW50ID0gdGhpcy5nZXRSb3V0ZUNvdW50KGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gdGhpcy5nZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpXG4gICAgY29uc3QgaXNIYXNoID0gY29uZmlnLmlzSGFzaFxuICAgIGNvbnN0IGlzSGlkZGVuID0gY29uZmlnLmlzSGlkZGVuXG4gICAgY29uc3Qgcm91dGVUeXBlID0gY29uZmlnLnR5cGVcbiAgICByZXR1cm4geyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21QYXJhbXMocGwsIGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uKSB7XG4gICAgbGV0IHJvdXRlRGF0YSA9IHByb3AoJ3BheWxvYWQnLCBwbClcblxuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyhyb3V0ZURhdGEsIGNvbmZpZylcblxuICAgIC8vIFdJTkRPVyBMT0NBVElPTiBIQVNOJ1QgQkVFTiBDSEFOR0VEIFlFVCwgU08gV0lMTCBHRVQgU1RSIFBBUkFNU1xuICAgIGNvbnN0IGdldFByb3BGcm9tQ29uZmlnID0gKHBycCwgZGVmYWx0KSA9PiBkZWZhdWx0VG8oZGVmYWx0LCBwcm9wKHBycCwgY29uZmlnKSlcbiAgICBjb25zdCB0eXBlRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ3R5cGUnLCAnc2xhc2gnKVxuICAgIGNvbnN0IGlzSGFzaEZvclN0ciA9IGdldFByb3BGcm9tQ29uZmlnKCdpc0hhc2gnLCBmYWxzZSlcbiAgICBjb25zdCBuZXh0V2luZG93TG9jID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5mb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHJvdXRlVmFsdWUpXG4gICAgY29uc3QgZGF0YUZyb21TdHIgPSB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIodHlwZUZvclN0ciwgaXNIYXNoRm9yU3RyLCBuZXh0V2luZG93TG9jKVxuXG4gICAgY29uc3QgeyBwYXRoSW5uZXJtb3N0LCBwYXRocyB9ID0gZGF0YUZyb21TdHJcblxuICAgIHJvdXRlRGF0YSA9IHJNZXJnZShkYXRhRnJvbVN0ci5yb3V0ZURhdGEsIHJvdXRlRGF0YSlcblxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCBpc0hpc3RvcnksIGlzSGlkZGVuLCByb3V0ZVR5cGUgfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnKVxuICAgIHJldHVybiB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVN0cmluZyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eXBlID0gY29uZmlnLnR5cGVcbiAgICBjb25zdCBoYXNoSXNUcnVlID0gY29uZmlnLmlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaGFzaElzVHJ1ZSlcbiAgICBjb25zdCB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgY29uZmlnLCB0eXBlKVxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCByb3V0ZVR5cGUsIGlzSGlkZGVuIH0gPSB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyhcbiAgICAgIGNvbmZpZywgaXNIaXN0b3J5KVxuXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgaXNEZWVwTGluayxcbiAgICAgIHJvdXRlQ291bnQsXG4gICAgICBwYXRoSW5uZXJtb3N0LFxuICAgICAgcGF0aHMsXG4gICAgICByb3V0ZURhdGEsXG4gICAgICByb3V0ZVZhbHVlLFxuICAgICAgaXNIYXNoLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBpc0hpc3RvcnksXG4gICAgICByb3V0ZVR5cGVcbiAgICB9XG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tTG9jYXRpb25TdHIodCA9ICdzbGFzaCcsIGlzSGFzaCA9IHRoaXMucm91dGVDb25maWdKc29uLmlzSGFzaCwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMucm91dGVDb25maWdKc29uICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5yb3V0ZUNvbmZpZ0pzb24udHlwZVxuICAgICAgOiB0XG5cbiAgICBjb25zdCBzdHIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmdldExvY2F0aW9uU3RyQnlUeXBlKHR5cGUsIGlzSGFzaCwgbG9jKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIoXG4gICAgICBzdHIsIHRoaXMucm91dGVDb25maWdKc29uLCB0eXBlKVxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuZ2V0Um91dGVTdGF0ZSgpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSwgYWN0aW9uIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3Qgb2JqID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0UGFyYW1zVG9Sb3V0ZShwYXJhbXNEYXRhLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKHN0ciwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKHN0ciwgcm91dGVDb25maWcsIHR5cGUpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgY2hlY2tFbXB0eVJvdXRlU3RyKHN0ciwgaXNIYXNoID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc0VtcHR5Qm9vbCA9IGlzRW1wdHkoc3RyKVxuICAgIGNvbnN0IHBhdGhOYW1lSXNFbXB0eUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gdHJ1ZSAmJiBpc0hhc2ggPT09IGZhbHNlXG4gICAgY29uc3QgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IGhhc2hOYW1lQm9vbCA9IGlzRW1wdHlCb29sID09PSBmYWxzZSAmJiBpc0hhc2ggPT09IHRydWVcblxuICAgIGlmIChwYXRoTmFtZUlzRW1wdHlCb29sID09PSB0cnVlIHx8IGhhc2hOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnLydcbiAgICB9IGVsc2UgaWYgKGhhc2hOYW1lQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCgnIycsIHN0cilcbiAgICB9XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgc3RhdGljIHJlbW92ZUxhc3RTbGFzaChzdHIpIHtcbiAgICBjb25zdCByZSA9IC9eKC4qKShcXC8pJC9cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocmUsICckMScpXG4gIH1cblxuICBzZXRXaW5kb3dMb2NhdGlvbihjaGFubmVsUGF5bG9hZCkge1xuICAgIGxldCB7IGlzSGFzaCwgcm91dGVWYWx1ZSwgcm91dGVUeXBlIH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIHJvdXRlVmFsdWUgPSB0aGlzLmNoZWNrRW1wdHlSb3V0ZVN0cihyb3V0ZVZhbHVlLCBpc0hhc2gpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50IH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIGlmIChpc0hhc2ggPT09IHRydWUgfHwgcm91dGVUeXBlID09PSAncXVlcnknKSB7XG4gICAgICBjb25zdCBwYXRoTmFtZSA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZUxhc3RTbGFzaCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICByb3V0ZVZhbHVlID0gcGF0aE5hbWUgKyByb3V0ZVZhbHVlXG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyByb3V0ZUNvdW50IH0sICcnLCByb3V0ZVZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGVja0ZvclNsYXNoID0gd2hlbihcbiAgICAgICAgY29tcG9zZShjb21wbGVtZW50KGVxdWFscygnLycpKSwgaGVhZCksIGNvbmNhdCgnLycsIF9fKSlcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIGNoZWNrRm9yU2xhc2gocm91dGVWYWx1ZSkpXG4gICAgfVxuICB9XG5cbiAgZ2V0V2luZG93TG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAvLyBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHMoKSB7XG4gICAgdGhpcy5jaGVja0ZvckVuZFJvdXRlID0gU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFbmRSb3V0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRJc0RlZXBMaW5rQm9vbCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldElzRGVlcExpbmtCb29sLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbUxvY2F0aW9uU3RyLmJpbmQoXG4gICAgICB0aGlzKVxuICAgIHRoaXMub25JbmNvbWluZ0RvbUV2ZW50ID0gU3B5bmVDaGFubmVsUm91dGUub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tU3RyaW5nID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21TdHJpbmcuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyLmJpbmQodGhpcylcbiAgICB0aGlzLmdldExvY2F0aW9uRGF0YSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldExvY2F0aW9uRGF0YS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRSb3V0ZVN0YXRlID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbVBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlQ291bnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZUNvdW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldEV4dHJhUGF5bG9hZFBhcmFtcy5iaW5kKHRoaXMpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKClcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKSB7XG4gICAgY29uc3QgY3VycmllZEdldFJvdXRlID0gY3VycnlOKDMsIFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlU3RyRnJvbVBhcmFtcylcbiAgICB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyA9IGN1cnJpZWRHZXRSb3V0ZShfXywgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sXG4gICAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGVxdWFscywgcGF0aCwgY29tcG9zZSwgcHJvcCwgZmlsdGVyLCByZXBsYWNlLCBsZW5zUHJvcCwgb3Zlciwgb21pdCwgdGVzdCwga2V5cywgZWl0aGVyLCB0b1VwcGVyIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxVSSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxVSVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgQ2hhbm5lbCBsaXN0ZW5zIHRvIGFsbCBVc2VyIEV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZXQgdG8gYnJvYWRjYXN0IGJ5IFZpZXdTdHJlYW0gaW5zdGFuY2VzLCB1c2luZyB0aGUgYnJvYWRDYXN0RXZlbnRzIG1ldGhvZC48L3A+XG4gICAqIDxwPkhUTUwgRWxlbWVudHMgdGhhdCBoYXZlIHRoZWlyIGRhdGEgY2hhbm5lbCBwcm9wZXJ0eSBzZXQgdG8gXCJST1VURVwiIHdpbGwgYnJvYWRjYXN0IHRoZWlyIHVpIGV2ZW50IHRvIHRoYXQgY2hhbm5lbCBpbnN0ZWFkLjwvcD5cbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0ndWlFdmVudHMnPlZpZXcgVUkgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKiA8cD5TZWUgTElOS1snVmlld1N0cmVhbScsICd2aWV3LXN0cmVhbSddIGZvciBhbiBleGFtcGxlIG9uIGhvdyB0byBiaW5kIEhUTUwgRWxlbWVudHMgdG8gdGhlIFVJIENoYW5uZWwuPC9wPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfVUknO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfVUknLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSBmYWxzZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLmtleUNvZGVBcnIgPSBbXVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1VJX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUJPUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUREVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRlRFUlNDUklQVEVYRUNVVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVBQSU5TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVYQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxPQ0tFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JPVU5EQVJZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JVRkZFUkVEQU1PVU5UTE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTlBMQVlUSFJPVUdIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBMRVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05VUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVOVERFTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05URVhUTUVOVV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NVRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREFUQUNIQU5ORUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREJMQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRU1PVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EVVJBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTVBUSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTlRFUlBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU09VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT1JNREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVOQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFEQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBTUVQQURESVNDT05ORUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HT1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNBTkRJREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRTT1VSQ0VTQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOU1RBTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xBTkdVQUdFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xFQVZFUElDVFVSRUlOUElDVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRERBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVETUVUQURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9TVFBPSU5URVJDQVBUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01BUktfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVSQ0hBTlRWQUxJREFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVTU0FHRUVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTkVHT1RJQVRJT05ORUVERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9NQVRDSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9OT1RJRklDQVRJT05DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUEVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09SSUVOVEFUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VTSE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBVVNFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWUVSREVUQUlMQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWU1FTlRNRVRIT0RDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QTEFZSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJDQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkRPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUlVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BST0dSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFVTSFNVQlNDUklQVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFQURZU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVKRUNUSU9OSEFORExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVUUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVTVFJFQU1fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVQRUFURVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTRVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU09VUkNFVElNSU5HQlVGRkVSRlVMTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNVTFRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVU1FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUFSQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VFS0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVEVEQ0FORElEQVRFUEFJUkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NISVBQSU5HQUREUkVTU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR09QVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSUdOQUxJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TTE9UQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5ERU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5EU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1BFRUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVE9SQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUNDRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVU1BFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9USU1FVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPR0dMRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT05FQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNITU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTkhBTkRMRURSRUpFQ1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTVVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VUEdSQURFTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZFUlNJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVklTSUJJTElUWUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0lDRVNDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZPTFVNRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlCTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUNPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZREVBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlESVNDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJSRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJVTlJFU1RSSUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUFJFU0VOVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XQUlUSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVENSRUFUSU9ORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUTE9TVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRSRVNUT1JFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVdJTExCRUdJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XSEVFTF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBsb2FkS2V5U3RyZWFtKCkge1xuICAgIGNvbnN0IGtleVVwcyA9IE9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5dXAnKVxuICAgIGNvbnN0IGZpbHRlcktleXMgPSBlID0+IHRoaXMua2V5Q29kZUFyci5pbmRleE9mKGUua2V5Q29kZSkgPj0gMFxuICAgIHRoaXMua2V5UHJlc3NlcyQgPSBrZXlVcHMuZ3JvdXBCeShlID0+IGUua2V5Q29kZSlcbiAgICAgIC5tZXJnZUFsbCgpXG4gICAgICAuZmlsdGVyKGZpbHRlcktleXMpXG4gICAgICAucmVwZWF0KClcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vbktleVByZXNzZWQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIGFkZEtleUV2ZW50KG51bSkge1xuICAgIGlmICh0aGlzLmtleUV2ZW50c0xvYWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubG9hZEtleVN0cmVhbSgpXG4gICAgfVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gdHJ1ZVxuICAgIHRoaXMucmVnaXN0ZXJLZXkobnVtKVxuICB9XG5cbiAgcmVnaXN0ZXJLZXkoYykge1xuICAgIHRoaXMua2V5Q29kZUFyci5wdXNoKGMpXG4gIH1cblxuICBvbktleVByZXNzZWQoZXZ0KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLCBldnQpO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGwpIHtcbiAgICBjb25zdCByb3V0ZUxlbnMgPSBsZW5zUHJvcChbJ3BheWxvYWQnXSlcbiAgICBjb25zdCBvbWl0U1NJRCA9IG92ZXIocm91dGVMZW5zLCBvbWl0KFsndnNpZCddKSlcbiAgICByZXR1cm4gb21pdFNTSUQocGwpXG4gIH1cblxuICBvbkluY29taW5nT2JzZXJ2YWJsZShvYmopIHtcbiAgICBjb25zdCBlcXNOYW1lID0gZXF1YWxzKG9iai5uYW1lLCB0aGlzLnByb3BzLm5hbWUpXG4gICAgb2JqLmRhdGEgPSBTcHluZUNoYW5uZWxVSS5yZW1vdmVTU0lEKG9iai5kYXRhKVxuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50OiBvYnNWYWwgfSlcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAob2JqKSA9PiBvYmoub2JzZXJ2YWJsZS5waXBlKG1hcChkYXRhT2JqKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vblVJRXZlbnQuYmluZCh0aGlzKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICBnZXRBY3Rpb25TdGF0ZSh2YWwpIHtcbiAgICBjb25zdCB0eXBlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGUnXSlcbiAgICBjb25zdCB0eXBlT3ZlclJpZGVWYWwgPSBwYXRoKFsnZXZlbnQnLCAndHlwZU92ZXJSaWRlJ10pXG4gICAgY29uc3QgZXZlbnRUeXBlID0gY29tcG9zZSh0b1VwcGVyLCBlaXRoZXIodHlwZU92ZXJSaWRlVmFsLCB0eXBlVmFsKSlcbiAgICBjb25zdCB0eXBlID0gZXZlbnRUeXBlKHZhbClcbiAgICBjb25zdCBtYWluQWN0aW9uID0gJ0NIQU5ORUxfVUknXG4gICAgcmV0dXJuIHR5cGUgIT09IHVuZGVmaW5lZCA/IGAke21haW5BY3Rpb259XyR7dHlwZX1fRVZFTlRgIDogbWFpbkFjdGlvblxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRXZlbnRNZXRob2RzKG9icykge1xuICAgIGNvbnN0IHJlID0gL14oZXZlbnQpKFtBLVpdLiopKFtBLVpdLiopJC9nbVxuICAgIGNvbnN0IGdldE1ldGhvZHMgPSBjb21wb3NlKGZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAoZXZ0W21dKSA9PT0gJ2Z1bmN0aW9uJykgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBvblVJRXZlbnQob2JzKSB7XG4gICAgU3B5bmVDaGFubmVsVUkuY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKVxuICAgIG9icy5hY3Rpb24gPSB0aGlzLmdldEFjdGlvblN0YXRlKG9icylcbiAgICBjb25zdCBhY3Rpb24gPSBvYnMuYWN0aW9uLy8gdGhpcy5nZXRBY3Rpb25TdGF0ZShvYnMpO1xuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JzXG4gICAgY29uc3QgZXZlbnQgPSBvYnMuZXZlbnRcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgbWFwT2JqSW5kZXhlZCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvd1xuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciBTcHluZVdpbmRvd0NoYW5uZWxcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQuYmluZChcbiAgICAgIHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudChldmVudE5hbWUsIG1hcEZuLCBpc1Bhc3NpdmUgPSB0cnVlLCBlbGVtZW50ID0gd2luZG93KSB7XG4gICAgY29uc3QgYWRkSGFuZGxlciA9IGhhbmRsZXIgPT4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcixcbiAgICAgIHsgcGFzc2l2ZTogaXNQYXNzaXZlIH0pXG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9ICgpID0+IHsgZWxlbWVudFtldmVudE5hbWVdID0gKHApID0+IHAgfVxuICAgIG1hcEZuID0gbWFwRm4gPT09IHVuZGVmaW5lZCA/IChwKSA9PiBwIDogbWFwRm5cbiAgICByZXR1cm4gZnJvbUV2ZW50UGF0dGVybihhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyKS5waXBlKG1hcChtYXBGbikpXG4gIH1cblxuICAvLyBNRURJQSBRVUVSSUVTXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5KHN0cikge1xuICAgIGNvbnN0IG1xID0gd2luZG93Lm1hdGNoTWVkaWEoc3RyKVxuICAgIHRoaXMuY2hlY2tJZlZhbGlkTWVkaWFRdWVyeShtcSwgc3RyKVxuICAgIHJldHVybiBtcSAhPT0gZmFsc2UgPyBtcSA6IGZhbHNlXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZhbGlkTWVkaWFRdWVyeShtcSwgc3RyKSB7XG4gICAgY29uc3Qgbm9TcGFjZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL1xccysvZ20sICcnKVxuICAgIGNvbnN0IGlzVmFsaWRCb29sID0gbXEubWF0Y2hlcyAhPT0gdW5kZWZpbmVkICYmIG5vU3BhY2VzKG1xLm1lZGlhKS5pbmRleE9mKG5vU3BhY2VzKHN0cikpID49IDBcbiAgICBjb25zdCB3YXJuTXNnID0gc3RyID0+IGNvbnNvbGUud2FybihgU3B5bmUgSW5mbzogdGhlIGZvbGxvd2luZyBxdWVyeSBzdHJpbmcsIFwiJHtzdHJ9XCIsIGhhcyBiZWVuIG9wdGltaXplZCB0byBcIiR7bXEubWVkaWF9XCIgYnkgdGhlIGJyb3dzZXIgYW5kIG1heSBub3QgYmUgYSB2YWxpZCBNZWRpYSBRdWVyeSBpdGVtIWApXG4gICAgaWYgKGlzVmFsaWRCb29sID09PSBmYWxzZSkge1xuICAgICAgd2Fybk1zZyhzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkQm9vbFxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyKHF1ZXJ5LCBrZXkpIHtcbiAgICBjb25zdCBrZXlGbiA9IGtleSA9PiBwID0+IHtcbiAgICAgIHAubWVkaWFRdWVyeU5hbWUgPSBrZXlcbiAgICAgIHJldHVybiBwXG4gICAgfVxuXG4gICAgY29uc3QgbWFwS2V5ID0ga2V5Rm4oa2V5KVxuXG4gICAgY29uc3QgaGFuZGxlcnMgPSAocSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5hZGRMaXN0ZW5lcihoYW5kbGVyKSB9LFxuICAgICAgICByZW1vdmVIYW5kbGVyOiAoaGFuZGxlcikgPT4geyBxLm9uY2hhbmdlID0gKCkgPT4ge30gfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZWRpYVF1ZXJ5SGFuZGxlciA9IGhhbmRsZXJzKHF1ZXJ5KVxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbiAgICByZXR1cm4gbmV3IGZyb21FdmVudFBhdHRlcm4oXG4gICAgICBtZWRpYVF1ZXJ5SGFuZGxlci5hZGRIYW5kbGVyLFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIucmVtb3ZlSGFuZGxlcilcbiAgICAgIC5waXBlKG1hcChtYXBLZXkpKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1lcmdlZE9ic0Zyb21PYmooY29uZmlnKSB7XG4gICAgY29uc3QgbWVkaWFRdWVyaWVzT2JqID0gY29uZmlnLm1lZGlhUXVlcmllcyB8fCBjb25maWcubWVkaWFRdWVyaWVzXG4gICAgY29uc3QgYXJyID0gW11cblxuICAgIGNvbnN0IGxvb3BRdWVyaWVzID0gKHZhbCwga2V5LCBvYmopID0+IHtcbiAgICAgIGNvbnN0IG1xID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeSh2YWwpXG4gICAgICBpZiAobXEgIT09IGZhbHNlKSB7XG4gICAgICAgIGFyci5wdXNoKFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyKG1xLCBrZXkpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQobG9vcFF1ZXJpZXMsIG1lZGlhUXVlcmllc09iailcbiAgICByZXR1cm4gYXJyXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwnXG5pbXBvcnQgeyBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtd2luZG93J1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwLCBkZWJvdW5jZVRpbWUsIHNraXBXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgY3VycnksIHBpY2ssIHBhcnRpYWxSaWdodCwgbWFwT2JqSW5kZXhlZCwgYXBwbHksIG1hcCBhcyByTWFwIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsV2luZG93IGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbFdpbmRvd1xuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoZSBXaW5kb3cgQ2hhbm5lbCB3aWxsIGxpc3RlbiB0byB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cyB0aGF0IGFyZSBzZXQgaW4gaXRzIGNvbmZpZ3VyYXRpb24gZmlsZVxuICAgKiA8ZGl2IGNsYXNzPSdidG4gYnRuLWJsdWUtcmVmIGJ0bi1jb25zb2xlIG1vZGFsLWJ0bicgIGRhdGEtdHlwZT0nbW9kYWwtd2luZG93JyBkYXRhLXZhbHVlPSd3aW5kb3dFdmVudHMnPlZpZXcgV2luZG93IEV2ZW50czwvZGl2PjwvYnI+PC9icj5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBDSEFOTkVMX05BTUVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhlIGNvbmZpZyBoYXMgc2V2ZXJhbCBvcHRpb25zIHVzZWQgdG8gbGlzdGVuIHRvIHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzLlxuICAgKiBAcHJvcGVydHkge0FycmF5fSBjb25maWcuZXZlbnRzIC0gPSBbXTsgQW55IHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzIGNhbiBiZSBhZGRlZCBoZXJlLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnLm1lZGlhUXVlcmllcyAtID0ge307IE1lZGlhIHF1ZXJpZXMgYXJlIGFkZGVkIGFzIGtleSx2YWx1ZSBwYWlyczsgdGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgYm9vbGVhbiBmb3IgdGhlIHF1ZXJ5LCB0aGUgdmFsdWUgaXMgdGhlIHF1ZXJ5IGl0c2VsZi5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yUmVzaXplIC0gPSB0cnVlOyBUaGlzIGlzIGRlZmF1bHQgbGlzdGVuaW5nIGZvciByZXNpemUgZXZlbnQuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvck9yaWVudGF0aW9uIC0gPSB0cnVlOyBMaXN0ZW4gZm9yIGhvcml6b250YWwgYW5kIGxhbmRzY2FwZSBvcmllbnRhdGlvbiBjaGFuZ2VzIG9uIG1vYmlsZSBkZXZpY2VzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JNb3VzZVdoZWVsIC0gPSBmYWxzZTsgSWYgc2V0IHRvIHRydWUsIHdpbGwgbGlzdGVuIGZvciBtb3VzZVdoZWVsIGFuZCB3aWxsIGFkZCBkaXJlY3Rpb24gYW5kIGRpc3RhbmNlIHBhcmFtZXRlcnMuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yUmVzaXplIC0gPSAyMDA7IFRoZSB0aW1lIGJldHdlZW4gcmVzaXplIGV2ZW50cyBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsIC0gPSAxNTA7IFRoZSB0aW1lIGJldHdlZW4gc2Nyb2xsIGV2ZW50cyBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9ICdDSEFOTkVMX1dJTkRPVyc7XG4gICAqXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihDSEFOTkVMX05BTUUgPSAnQ0hBTk5FTF9XSU5ET1cnKSB7XG4gICAgc3VwZXIoQ0hBTk5FTF9OQU1FKVxuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHMoKVxuICAgIHRoaXMuY3VycmVudFNjcm9sbFkgPSAwXG4gIH1cblxuICBpbml0aWFsaXplU3RyZWFtKCkge1xuICAgIHRoaXMuZG9tQ2hhbm5lbENvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuV0lORE9XXG4gICAgY29uc3Qgb2JzJEFyciA9IHRoaXMuZ2V0QWN0aXZlT2JzZXJ2YWJsZXMoKVxuICAgIGNvbnN0IGRvbSQgPSBtZXJnZSguLi5vYnMkQXJyKVxuICAgIHRoaXMuZG9tJCA9IGRvbSRcbiAgICBkb20kLnN1YnNjcmliZShwID0+IHtcbiAgICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gcFxuICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlV2hlZWxNYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfV0hFRUxfRVZFTlRcbiAgICBjb25zdCBzY3JvbGxEaXIgPSBldmVudC5kZWx0YVkgPD0gMCA/ICd1cCcgOiAnZG93bidcbiAgICBjb25zdCB7IGRlbHRhWCwgZGVsdGFZLCBkZWx0YVogfSA9IGV2ZW50XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgc2Nyb2xsRGlyLCBkZWx0YVgsIGRlbHRhWSwgZGVsdGFaIH1cbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQoYWN0aW9uU3RyKSB7XG4gICAgY29uc3QgYWN0aW9uID0gYENIQU5ORUxfV0lORE9XXyR7YWN0aW9uU3RyLnRvVXBwZXJDYXNlKCl9X0VWRU5UYFxuICAgIGNvbnN0IGN1cnJ5Rm4gPSBjdXJyeShTcHluZUNoYW5uZWxXaW5kb3cubWFwR2VuZXJpY0V2ZW50KVxuICAgIHJldHVybiBjdXJyeUZuKGFjdGlvbilcbiAgfVxuXG4gIHN0YXRpYyBtYXBHZW5lcmljRXZlbnQoYWN0biwgZXZlbnQpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcIm1hcCBnZW5lcmljIGV2ZW50IFwiLGFjdG4pO1xuICAgIGNvbnN0IGFjdGlvbiA9IGFjdG5cbiAgICBjb25zdCBwYXlsb2FkID0gZXZlbnRcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgc3RhdGljIGdldFJlc2l6ZU1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19SRVNJWkVfRVZFTlRcbiAgICBjb25zdCBwYXlsb2FkID0gcGljayhcbiAgICAgIFsnaW5uZXJXaWR0aCcsICdpbm5lckhlaWdodCcsICdvdXRlcldpZHRoJywgJ291dGVySGVpZ2h0J10sIHdpbmRvdylcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgc3RhdGljIGdldE9yaWVudGF0aW9uTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UXG4gICAgY29uc3Qgb3JpZW50YXRpb25TdHIgPSAnKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknXG4gICAgY29uc3QgaXNQb3J0cmFpdEJvb2wgPSB3aW5kb3cubWF0Y2hNZWRpYShvcmllbnRhdGlvblN0cikubWF0Y2hlc1xuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFxuICAgICAgWydpbm5lcldpZHRoJywgJ2lubmVySGVpZ2h0JywgJ291dGVyV2lkdGgnLCAnb3V0ZXJIZWlnaHQnXSwgd2luZG93KVxuICAgIHBheWxvYWQub3JpZW50YXRpb24gPSBpc1BvcnRyYWl0Qm9vbCA9PT0gdHJ1ZVxuICAgICAgPyAncG9ydHJhaXQnXG4gICAgICA6ICdsYW5kc2NhcGUnXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIGdldE1lZGlhUXVlcnlNYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlRcbiAgICBjb25zdCBwYXlsb2FkID0gcGljayhbJ21hdGNoZXMnLCAnbWVkaWEnLCAnbWVkaWFRdWVyeU5hbWUnXSwgZXZlbnQpXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIGNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGRlYm91bmNlVCA9IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclNjcm9sbFxuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3doZWVsJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRNb3VzZVdoZWVsTWFwRm4uYmluZCh0aGlzKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZGVib3VuY2VUKVxuICAgICAgKVxuICB9XG5cbiAgc3RhdGljIGdldFNjcm9sbERhdGEoKSB7XG4gICAgbGV0IGN1cnJlbnRTY3JvbGxZID0gMFxuXG4gICAgY29uc3QgZ2V0U2Nyb2xsRGF0YSA9IChzY3JvbGxZKSA9PiB7XG4gICAgICBjb25zdCBzY3JvbGxEaXN0YW5jZSA9IGN1cnJlbnRTY3JvbGxZIC0gc2Nyb2xsWVxuICAgICAgY29uc3Qgc2Nyb2xsRGlyID0gc2Nyb2xsRGlzdGFuY2UgPj0gMCA/ICd1cCcgOiAnZG93bidcbiAgICAgIGN1cnJlbnRTY3JvbGxZID0gc2Nyb2xsWVxuICAgICAgcmV0dXJuIHsgc2Nyb2xsWSwgc2Nyb2xsRGlzdGFuY2UsIHNjcm9sbERpciB9XG4gICAgfVxuICAgIHJldHVybiBnZXRTY3JvbGxEYXRhXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsWShzY3JvbGxFbGVtZW50KSB7XG4gICAgcmV0dXJuIHNjcm9sbEVsZW1lbnQucGFnZVlPZmZzZXQgIT09IHVuZGVmaW5lZCA/IHNjcm9sbEVsZW1lbnQucGFnZVlPZmZzZXQgOiBzY3JvbGxFbGVtZW50LnNjcm9sbFRvcFxuICB9XG5cbiAgc3RhdGljIGdldFNjcm9sbE1hcEZuKGV2ZW50LCBpbnRlcnZhbCwgYWN0aW9uLCBzY3JvbGxEYXRhRm4sIHNjcm9sbEVsZW1lbnQpIHtcbiAgICBjb25zdCBzY3JvbGxZID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbFkoc2Nyb2xsRWxlbWVudClcbiAgICBjb25zdCBwYXlsb2FkID0gc2Nyb2xsRGF0YUZuKHNjcm9sbFkpXG4gICAgY29uc3QgeyBzY3JvbGxEaXN0YW5jZSB9ID0gcGF5bG9hZFxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBzY3JvbGxEaXN0YW5jZSwgZXZlbnQgfVxuICB9XG5cbiAgY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShjb25maWcsIHNjcm9sbEVsZW1lbnQgPSB3aW5kb3csIGlzUGFzc2l2ZSA9IHRydWUpIHtcbiAgICBjb25zdCBza2lwV2hlbkRpcklzTWlzc2luZyA9IGV2dCA9PiBldnQuc2Nyb2xsRGlzdGFuY2UgPT09IDBcbiAgICBjb25zdCBkVGltZSA9IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclNjcm9sbFxuXG4gICAgY29uc3QgZWxlbWVudCA9IHNjcm9sbEVsZW1lbnRcblxuICAgIGNvbnN0IGlzV2luZG93ID0gc2Nyb2xsRWxlbWVudCA9PT0gd2luZG93XG5cbiAgICBjb25zdCBzY3JvbGxFbEZvclZhbHMgPSBjb25maWcuc2Nyb2xsRWxGb3JWYWxzICE9PSB1bmRlZmluZWQgPyBjb25maWcuc2Nyb2xsRWxGb3JWYWxzIDogc2Nyb2xsRWxlbWVudFxuICAgIGNvbnN0IGFjdGlvbiA9IGlzV2luZG93ID8gJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FVkVOVCcgOiAnQ0hBTk5FTF9XSU5ET1dfRUxFTUVOVF9TQ1JPTExfRVZFTlQnXG5cbiAgICBjb25zdCBzY3JvbGxEYXRhRm4gPSBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0U2Nyb2xsRGF0YSgpXG4gICAgLy8gY29uc29sZS5sb2coXCJTQ1JPTEwgRUxFTUVOVCBcIixhY3Rpb24sc2Nyb2xsRWxlbWVudCwgc2Nyb2xsRWxGb3JWYWxzKTtcbiAgICBjb25zdCBzY3JvbGxNYXBGbiA9IHBhcnRpYWxSaWdodChTcHluZUNoYW5uZWxXaW5kb3cuZ2V0U2Nyb2xsTWFwRm4sIFthY3Rpb24sIHNjcm9sbERhdGFGbiwgc2Nyb2xsRWxGb3JWYWxzLCBpc1Bhc3NpdmUsIGVsZW1lbnRdKS5iaW5kKHRoaXMpXG5cbiAgICAvLyBjb25zb2xlLmxvZyhcImNyZWF0ZVNjcm9sbE9ic2VydmFibGUgXCIsIHtzY3JvbGxNYXBGbiwgc2Nyb2xsRGF0YUZuLCBhY3Rpb24sIGNvbmZpZywgc2Nyb2xsRWxlbWVudCwgZWxlbWVudH0pXG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnc2Nyb2xsJyxcbiAgICAgIHNjcm9sbE1hcEZuLCBpc1Bhc3NpdmUsIGVsZW1lbnQpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRUaW1lKSxcbiAgICAgICAgc2tpcFdoaWxlKHNraXBXaGVuRGlySXNNaXNzaW5nKSxcbiAgICAgICAgbWFwKHAgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld1Njcm9sbFkgPSBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0U2Nyb2xsWShlbGVtZW50KVxuICAgICAgICAgIHAucGF5bG9hZC5zY3JvbGxEaXN0YW5jZUFicyA9IE1hdGguYWJzKHRoaXMuY3VycmVudFNjcm9sbFkgLSBuZXdTY3JvbGxZKVxuICAgICAgICAgIHRoaXMuY3VycmVudFNjcm9sbFkgPSBuZXdTY3JvbGxZXG4gICAgICAgICAgcmV0dXJuIHBcbiAgICAgICAgfSlcbiAgICAgIClcbiAgfVxuXG4gIGNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZShjb25maWcpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImFkZCBvcmllbnRhdGlvblwiKTtvcmllbnRhdGlvbmNoYW5nZVxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCdvcmllbnRhdGlvbmNoYW5nZScsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0T3JpZW50YXRpb25NYXBGbi5iaW5kKHRoaXMpKVxuICB9XG5cbiAgY3JlYXRlUmVzaXplT2JzZXJ2YWJsZShjb25maWcpIHtcbiAgICBjb25zdCBkVGltZSA9IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclJlc2l6ZVxuICAgIC8vIGNvbnNvbGUubG9nKCdyZXNpemUgdGhpcyAnLCB0aGlzKTtcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCdyZXNpemUnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldFJlc2l6ZU1hcEZuLmJpbmQodGhpcykpLnBpcGUoZGVib3VuY2VUaW1lKGRUaW1lKSlcbiAgfVxuXG4gIGdldEV2ZW50c0Zyb21Db25maWcoY29uZmlnID0gdGhpcy5kb21DaGFubmVsQ29uZmlnKSB7XG4gICAgY29uc3Qgb2JzJEFyciA9IGNvbmZpZy5ldmVudHNcblxuICAgIGNvbnN0IGFkZFdpbmRvd0V2ZW50VG9BcnIgPSBzdHIgPT4ge1xuICAgICAgY29uc3QgbWFwRm4gPSBTcHluZUNoYW5uZWxXaW5kb3cuY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudChzdHIpXG4gICAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudChzdHIsIG1hcEZuKVxuICAgIH1cblxuICAgIHJldHVybiByTWFwKGFkZFdpbmRvd0V2ZW50VG9BcnIsIG9icyRBcnIpXG4gIH1cblxuICBnZXRBY3RpdmVPYnNlcnZhYmxlcyhjb25maWcgPSB0aGlzLmRvbUNoYW5uZWxDb25maWcpIHtcbiAgICBsZXQgb2JzJEFyciA9IFtdXG5cbiAgICAvLyBDSEVDSyBUTyBBREQgTUVESUEgUVVFUlkgT0JTRVJWQUJMRVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbmZpZy5saXN0ZW5Gb3JNZWRpYVF1ZXJpZXMgPSBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKFxuICAgICAgY29uZmlnLm1lZGlhUXVlcmllcykgfHwgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbChcbiAgICAgIGNvbmZpZy5tZWRpYVF1ZXJpZXMpXG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgY29uc3QgbWV0aG9kcyA9IHtcbiAgICAgIGxpc3RlbkZvclJlc2l6ZTogdGhpcy5jcmVhdGVSZXNpemVPYnNlcnZhYmxlLmJpbmQodGhpcyksXG4gICAgICBsaXN0ZW5Gb3JPcmllbnRhdGlvbjogdGhpcy5jcmVhdGVPcmllbnRhdGlvbk9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvclNjcm9sbDogdGhpcy5jcmVhdGVTY3JvbGxPYnNlcnZhYmxlLmJpbmQodGhpcyksXG4gICAgICBsaXN0ZW5Gb3JXaGVlbDogdGhpcy5jcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZS5iaW5kKHRoaXMpXG4gICAgfVxuXG4gICAgY29uc3QgYWRkT2JzZXJ2YWJsZVRvQXJyID0gKG1ldGhvZCwga2V5LCBpKSA9PiB7XG4gICAgICBjb25zdCBhZGRPYnNCb29sID0gY29uZmlnW2tleV1cbiAgICAgIGlmIChhZGRPYnNCb29sKSB7XG4gICAgICAgIG9icyRBcnIucHVzaChtZXRob2QoY29uZmlnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtYXBPYmpJbmRleGVkKGFkZE9ic2VydmFibGVUb0FyciwgbWV0aG9kcylcblxuICAgIC8vICdsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMnIDogdGhpcy5nZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5jaGVja0Zvck1lZGlhUXVlcmllcyhjb25maWcubGlzdGVuRm9yTWVkaWFRdWVyaWVzKVxuXG4gICAgY29uc3QgZXZlbnRzQXJyID0gdGhpcy5nZXRFdmVudHNGcm9tQ29uZmlnKGNvbmZpZylcbiAgICBvYnMkQXJyID0gb2JzJEFyci5jb25jYXQoZXZlbnRzQXJyKVxuXG4gICAgcmV0dXJuIG9icyRBcnJcbiAgfVxuXG4gIGNoZWNrRm9yTWVkaWFRdWVyaWVzKGJvb2wpIHtcbiAgICBjb25zdCBzZW5kTVFTdHJlYW0gPSBwID0+IHtcbiAgICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gcFxuICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCxcbiAgICAgICAgdGhpcy5vYnNlcnZlciQpXG4gICAgfVxuXG4gICAgaWYgKGJvb2wgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUodGhpcy5kb21DaGFubmVsQ29uZmlnKVxuICAgICAgICAuc3Vic2NyaWJlKHNlbmRNUVN0cmVhbSlcbiAgICB9XG4gIH1cblxuICBnZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZShjb25maWcpIHtcbiAgICBjb25zdCBhcnIgPSB0aGlzLmNyZWF0ZU1lcmdlZE9ic0Zyb21PYmooY29uZmlnKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiQVJSIElTIFwiLHthcnJ9KTtcbiAgICBjb25zdCBvYnMkID0gYXBwbHkobWVyZ2UsIGFycilcbiAgICByZXR1cm4gb2JzJC5waXBlKG1hcCh0aGlzLmdldE1lZGlhUXVlcnlNYXBGbi5iaW5kKHRoaXMpKSlcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQUJPUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FGVEVSUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9OSVRFUkFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQVBQSU5TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUZPUkVQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVGT1JFVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUdJTkVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DQUNIRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NMT1NFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09NUE9TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09NUE9TSVRJT05VUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPUFlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREJMQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFTElHSFRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRU1PVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRVBST1hJTUlUWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQVRUUklCVVRFTkFNRUNIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUFUVFJNT0RJRklFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DT05URU5UTE9BREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DT05URU5UTE9BREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01FTEVNRU5UTkFNRUNIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0xFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUk9QX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19FTEVNRU5UX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZPQ1VTSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GVUxMU0NSRUVOQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GVUxMU0NSRUVORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0hBU0hDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0lOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19JTlZBTElEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlQUkVTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0xPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NRVNTQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VXSEVFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT0ZGTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT05MSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PUEVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFHRUhJREVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBR0VTSE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQVNURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QUk9HUkVTU0VWRU5UU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUkVTRVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VMRU1FTlRfQURERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0xPQ0tfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1dJTkRPV19TQ1JPTExfTE9DS19FVkVOVCcsICdvblNjcm9sbExvY2tFdmVudCddLFxuICAgICAgWydDSEFOTkVMX1dJTkRPV19TRVRfRUxFTUVOVF9UT19TQ1JPTExfRVZFTlQnLCAnb25TZXRFbGVtZW50VG9TY3JvbGwnXSxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TVE9SQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TVUJNSVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1RSQU5TSVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1RSQU5TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1RSQU5TSVRJT05SVU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1RSQU5TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBvblNjcm9sbExvY2tFdmVudChlKSB7XG4gICAgLy8gREVQUkVDQVRFRCAtLSBNT1ZFRCBUTyBzcHluZS1wbHVnaW4tc2Nyb2xsLWxvY2s7XG4gIH1cblxuICBvblNldEVsZW1lbnRUb1Njcm9sbChlKSB7XG4gICAgbGV0IHsgY29uZmlnLCBlbCwgc2Nyb2xsRWxlbWVudCB9ID0gZS5wYXlsb2FkXG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9XG4gICAgY29uZmlnID0gZGVlcE1lcmdlKHRoaXMuZG9tQ2hhbm5lbENvbmZpZywgY29uZmlnKVxuXG4gICAgc2Nyb2xsRWxlbWVudCA9IHNjcm9sbEVsZW1lbnQgfHwgZWxcblxuICAgIGNvbnN0IGFjdGlvbiA9ICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRUxFTUVOVF9BRERFRF9FVkVOVCdcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHsgZWwgfSwgZWwpXG5cbiAgICB0aGlzLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUoY29uZmlnLCBzY3JvbGxFbGVtZW50KVxuICAgICAgLnN1YnNjcmliZShwID0+IHtcbiAgICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgICB9KVxuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHMoKSB7XG4gICAgdGhpcy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyLmJpbmQoXG4gICAgICB0aGlzKVxuICAgIHRoaXMuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaiA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lcmdlZE9ic0Zyb21PYmouYmluZChcbiAgICAgIHRoaXMpXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsTGlmZWN5Y2xlXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgQ2hhbm5lbCB0aGF0IHB1Ymxpc2hlcyByZW5kZXJpbmcgYW5kIGRpc3Bvc2luZyBldmVudHMgb2YgYWxsIFZpZXdTdHJlYW1zIHdob3NlIHByb3BlcnR5LCBwcm9wZXIuc2VuZExpZmVjeWNsZUV2ZW50cyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGlzIGNoYW5uZWwgYXJlOjwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UPC9saT5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UPC9saT5cbiAgICogIDwvdWw+XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9MSUZFQ1lDTEUnO1xuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoJ0NIQU5ORUxfTElGRUNZQ0xFJywgcHJvcHMpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBzcmNFbGVtZW50IH0gPSBvYmpcbiAgICBjb25zdCBwYXlsb2FkID0gc3JjRWxlbWVudFxuICAgIHBheWxvYWQuYWN0aW9uID0gYWN0aW9uXG4gICAgdGhpcy5vblNlbmRFdmVudChhY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICBvblNlbmRFdmVudChhY3Rpb25TdHIsIHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnNbYWN0aW9uU3RyXVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7fVxuICAgIGNvbnN0IGV2ZW50ID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVsYXlTdHJlYW0gPSAoKSA9PiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5U3RyZWFtLCAwKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBpbmNsdWRlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVsYXlDYWxsIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFByb3h5IGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxQcm94eVxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEEgcHJveHkgY2hhbm5lbCBpcyBjcmVhdGVkIHdoZW4gYSBjaGFubmVsIGlzIHN1YnNjcmliZWQgdG8gYmVmb3JlIGl0IGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuaXNQcm94eSA9IHRydWVcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLnN1YmplY3QkID0gbmV3IFN1YmplY3QoKVxuICAgIHRoaXMucmVwbGF5U3ViJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vYnNlcnZlciQgPSBtZXJnZSh0aGlzLnN1YmplY3QkLCB0aGlzLnJlcGxheVN1YiQpXG4gICAgY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnXG4gICAgaWYgKGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eShuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lcmdlZFN1YmplY3QocGVyaXN0RGF0YSA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHBlcmlzdERhdGEgPT09IHRydWUgPyB0aGlzLnJlcGxheVN1YiQgOiB0aGlzLnN1YmplY3QkXG4gIH1cblxuICBjaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eShjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IG5hbWUgPSBjaGFubmVsTmFtZVxuXG4gICAgY29uc3QgY2hlY2tJZlByb3h5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgYm9vbCA9IGluY2x1ZGVzKG5hbWUsIFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkpXG4gICAgICBpZiAoYm9vbCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBjaGFubmVsLCAke25hbWV9IGRvZXMgbm90IGFwcGVhciB0byBiZSByZWdpc3RlcmVkIWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVsYXlDYWxsKGNoZWNrSWZQcm94eSwgMTAwMClcbiAgfVxuXG4gIGdldCByZXBsYXlTdWJqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnJlcGxheVN1YiRcbiAgfVxuXG4gIGdldCBzdWJqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3QkXG4gIH1cbn1cbiIsImltcG9ydCB7IFNweW5lQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLXJvdXRlJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsVUkgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtdWknXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxXaW5kb3cgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtd2luZG93J1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLWxpZmVjeWNsZSdcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDaGFubmVsUHJveHkgfSBmcm9tICcuL2NoYW5uZWwtcHJveHknXG5pbXBvcnQgeyBwcm9wRXEsIHBsdWNrLCBwcm9wLCBmaWx0ZXIsIHBhdGhFcSwgcmVqZWN0LCBjb21wb3NlLCBqb2luLCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuXG5jb25zdCBfbWFwID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsc01hcCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxzRGVsZWdhdG9yXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgb2JqZWN0IGNyZWF0ZXMgdGhlIGxvZ2ljIHNvIHRoYXQgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXJcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICBfbWFwLnNldCgnRElTUEFUQ0hFUicsIG5ldyBTdWJqZWN0KCkpXG4gICAgdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzID0gQ2hhbm5lbHNNYXAubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRDaGFubmVsc0xpc3QgPSBDaGFubmVsc01hcC5nZXRDaGFubmVsc0xpc3QuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IG1hcCgpIHtcbiAgICByZXR1cm4gX21hcFxuICB9XG5cbiAgc3RhdGljIGdldENoYW5uZWxzTGlzdCgpIHtcbiAgICBjb25zdCBwcm94eU1hcEZuID0gIChrLCB2KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBrWzBdXG4gICAgICBjb25zdCB2YWwgPSBrWzFdLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgIHJldHVybiB7IGtleSwgdmFsIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX21hcCwgcHJveHlNYXBGbilcbiAgfVxuXG4gIHN0YXRpYyBsaXN0UmVnaXN0ZXJlZENoYW5uZWxzKHNob3dPbmx5UHJveGllcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgcmVqZWN0UHJveHlGbiA9IHJlamVjdChwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZuID0gc2hvd09ubHlQcm94aWVzID09PSB0cnVlID8gZmlsdGVyUHJveHlGbiA6IHJlamVjdFByb3h5Rm5cbiAgICBjb25zdCByZW1vdmVkUHJveHlBcnIgPSBmbihwcm94eU1hcClcbiAgICByZXR1cm4gcGx1Y2soWydrZXknXSwgcmVtb3ZlZFByb3h5QXJyKVxuICB9XG5cbiAgbGlzdFByb3h5Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyh0cnVlKVxuICB9XG5cbiAgY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMoKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgZmlsdGVyUHJveHlGbiA9IGZpbHRlcihwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUFyciA9IGZpbHRlclByb3h5Rm4ocHJveHlNYXApXG5cbiAgICBpZiAoZmlsdGVyUHJveHlBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxTdHIgPSBmaWx0ZXJQcm94eUFyci5sZW5ndGggPT09IDEgPyAnQ2hhbm5lbCBoYXMnIDogJ0NoYW5uZWxzIGhhdmUnXG4gICAgICBjb25zdCBjaGFubmVscyA9IGNvbXBvc2Uoam9pbignLCAnKSwgck1hcChwcm9wKCdrZXknKSkpKGZpbHRlclByb3h5QXJyKVxuICAgICAgY29uc3QgZmlsdGVyUHJlZml4V2FybmluZyA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nICR7Y2hhbm5lbFN0cn0gbm90IGJlZW4gaW5pdGlhbGl6ZWQ6ICR7Y2hhbm5lbHN9YFxuICAgICAgY29uc29sZS53YXJuKGZpbHRlclByZWZpeFdhcm5pbmcpXG4gICAgfVxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZU1haW5TdHJlYW1zKClcbiAgfVxuXG4gIGNyZWF0ZU1haW5TdHJlYW1zKCkge1xuICAgIHRoaXMucm91dGVTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsUm91dGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1JPVVRFJywgdGhpcy5yb3V0ZVN0cmVhbSlcblxuICAgIHRoaXMudWlTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsVUkoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1VJJywgdGhpcy51aVN0cmVhbSlcblxuICAgIHRoaXMuZG9tU3RyZWFtID0gbmV3IFNweW5lQ2hhbm5lbFdpbmRvdygpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfV0lORE9XJywgdGhpcy5kb21TdHJlYW0pXG5cbiAgICB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUgPSBuZXcgU3B5bmVDaGFubmVsTGlmZWN5Y2xlKClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUpXG5cbiAgICB0aGlzLnJvdXRlU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICAgIHRoaXMuZG9tU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgYWRkS2V5RXZlbnQoa2V5KSB7XG4gICAgX21hcC5nZXQoJ1VJJykuYWRkS2V5RXZlbnQoa2V5KVxuICB9XG5cbiAgcmVnaXN0ZXJTdHJlYW0odmFsKSB7XG4gICAgY29uc3QgbmFtZSA9IHZhbC5jaGFubmVsTmFtZVxuICAgIGNvbnN0IG5hbWVFeGlzdHMgPSBfbWFwLmhhcyhuYW1lKVxuICAgIGlmIChuYW1lRXhpc3RzKSB7XG4gICAgICBjb25zdCBpc0FscmVhZHlSZWdpc3RlcmQgPSBjb21wb3NlKHBhdGhFcShbJ3Byb3BzJywgJ2lzUmVnaXN0ZXJlZCddLCB0cnVlKSkoX21hcC5nZXQobmFtZSkpXG4gICAgICBpZiAoaXNBbHJlYWR5UmVnaXN0ZXJkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIENoYW5uZWwsICR7bmFtZX0sIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCFgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbWFwLnNldChuYW1lLCB2YWwpXG4gICAgdmFsLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KHN0cikuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICB9XG5cbiAgZ2V0UHJveHlTdWJqZWN0KG5hbWUsIGlzUmVwbGF5U3ViamVjdCA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3ViamVjdFR5cGUgPSBpc1JlcGxheVN1YmplY3QgPT09IHRydWUgPyAncmVwbGF5U3ViamVjdCcgOiAnc3ViamVjdCdcblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVtzdWJqZWN0VHlwZV1cbiAgfVxuXG4gIHRlc3RTdHJlYW0obmFtZSkge1xuICAgIHJldHVybiBfbWFwLmdldChuYW1lKSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRTdHJlYW0obmFtZSkge1xuICAgIGlmICh0aGlzLnRlc3RTdHJlYW0obmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICBfbWFwLnNldChuYW1lLCBuZXcgQ2hhbm5lbFByb3h5KG5hbWUpKVxuICAgIH1cblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIERFQ09SQVRPUlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBjb3JlTWl4aW5zID0gIGJhc2VDb3JlTWl4aW5zKCk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIFNUUkVBTVMgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IHN0cmVhbXNNaXhpbnMgPSBCYXNlU3RyZWFtc01peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBnZXRBbGxNZXRob2ROYW1lcyB9IGZyb20gJy4vZnJwLXRvb2xzJ1xuaW1wb3J0IHsgcmVqZWN0LCBjdXJyeU4sIF9fLCBtYXAgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVHJhaXQge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZVRyYWl0XG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICogQHBhcmFtIHt0aGlzfSBwYXJlbnRDb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtCb29sZWFufSBhdXRvSW5pdFxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHt0aGlzfSBwYXJlbnRDb250ZW50IC0gPSB1bmRlZmluZWQ7IFRoaXMgYmluZHMgYWxsIG1ldGhvZHMgd2l0aGluIFNweW5lVHJhaXQgaW50byB0aGUgcGFyZW50Q29udGV4dCdzIG9iamVjdFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJlZml4IC0gPSB1bmRlZmluZWQ7IFNweW5lVHJhaXRzIGZvcmNlcyBhbGwgbWV0aG9kIG5hbWVzIHRvIGJlZ2luIHdpdGggdGhlIHNhbWUgcHJlZml4LiBUaGlzIGFsbG93cyBvdGhlciBvYmplY3RzIHRvIHF1aWNrbHkgdW5kZXJzdGFuZCB3aGVyZSB0aGUgb3JpZ2luYWwgbWV0aG9kIGlzIHNldC5cbiAgICogQGRlc2NcbiAgICogU3B5bmVUcmFpdHMgYWxsb3cgdGhlIGVoYW5jaW5nIG9mIGNsYXNzZXMgYW5kIG90aGVyIG9iamVjdHMgd2l0aG91dCBoYXZpbmcgdG8gZXh0ZW5kIGNsYXNzZXMgb3IgbWFuaXB1bGF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHBhcmVudENvbnRleHQsIHByZWZpeCA9ICcnLCBhdXRvSW5pdCA9IHRydWUpIHtcbiAgICB0aGlzLnBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0XG4gICAgdGhpcy5vbWl0dGVkTWV0aG9kcyA9IFtcbiAgICAgICdhdXRvQmluZGVyJyxcbiAgICAgICdpbml0QXV0b0JpbmRlcicsXG4gICAgICAnZ2V0RW5oYW5jZXJNZXRob2RzJyxcbiAgICAgICdjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMnLFxuICAgICAgJ2NhbGxlcicsXG4gICAgICAnYXJndW1lbnRzJyxcbiAgICAgICdiaW5kUGFyZW50Vmlld1N0cmVhbSddXG5cbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeFxuXG4gICAgaWYgKGF1dG9Jbml0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmF1dG9CaW5kZXIoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbGxNZXRob2RzTGlzdFxuICB9XG5cbiAgaW5pdEF1dG9CaW5kZXIoKSB7XG4gICAgdGhpcy5hdXRvQmluZGVyKClcbiAgfVxuXG4gIGdldEVuaGFuY2VyTWV0aG9kcygpIHtcbiAgICByZXR1cm4gZ2V0QWxsTWV0aG9kTmFtZXModGhpcywgdGhpcy5vbWl0dGVkTWV0aG9kcylcbiAgfVxuXG4gIGNoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcyhtZXRob2RzQXJyKSB7XG4gICAgaWYgKHRoaXMucHJlZml4ID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKGBTUFlORSBXQVJOSU5HOiBUaGUgZm9sbG93aW5nIFNweW5lVHJhaXQgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IG5lZWRzIGEgcHJlZml4YClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBsZXQgcmVTdHIgPSBgXigke3RoaXMucHJlZml4fSkoLiopJGA7XG4gICAgLy8gbGV0IHJlID0gbmV3IFJlZ0V4cChyZVN0cik7XG4gICAgY29uc3QgaGFzUHJlZml4ID0gKHN0cikgPT4gc3RyLmluZGV4T2YodGhpcy5wcmVmaXgpID09PSAwXG5cbiAgICBjb25zdCBtYWxmb3JtZWRNZXRob2RzQXJyID0gcmVqZWN0KGhhc1ByZWZpeCwgbWV0aG9kc0FycilcbiAgICBpZiAobWFsZm9ybWVkTWV0aG9kc0Fyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3Qgd2FybmluZ1N0ciA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIG1ldGhvZChzKSBpbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gcmVxdWlyZSB0aGUgcHJlZml4LCBcIiR7dGhpcy5wcmVmaXh9XCI6IFske21hbGZvcm1lZE1ldGhvZHNBcnIuam9pbignLCAnKX1dO2BcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nU3RyKVxuICAgIH1cbiAgfVxuXG4gIGJpbmRQYXJlbnRWaWV3U3RyZWFtKG1ldGhvZHNPYmosIGNvbnRleHQpIHtcbiAgICB0aGlzLmNoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcyhtZXRob2RzT2JqLmFsbE1ldGhvZHMpXG4gICAgY29uc3Qgb2JqID0ge31cbiAgICBjb25zdCBiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSA9IChzdHIsIGlzU3RhdGljID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yVHlwZSA9IGlzU3RhdGljID09PSB0cnVlID8gdGhpcy5jb25zdHJ1Y3RvciA6IHRoaXNcbiAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IHR5cGVvZiAoY29uc3RydWN0b3JUeXBlW3N0cl0pXG4gICAgICBpZiAocHJvcGVydHlUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9ialtzdHJdID0gY29udGV4dFtzdHJdID0gY29uc3RydWN0b3JUeXBlW3N0cl0uYmluZChjb250ZXh0KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJpbmRDdXJyeSA9IGN1cnJ5TigyLCBiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSlcbiAgICBjb25zdCBiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSA9IGJpbmRDdXJyeShfXywgdHJ1ZSlcbiAgICAvLyBNQVAgU1RBVElDIE1FVEhPRFNcbiAgICBtYXAoYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0sIG1ldGhvZHNPYmouc3RhdGljTWV0aG9kcylcbiAgICAvLyBNQVAgTUFJTiBNRVRIT0RTXG4gICAgbWFwKGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtLCBtZXRob2RzT2JqLm1ldGhvZHMpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgYXV0b0JpbmRlcigpIHtcbiAgICBjb25zdCBhbGxNZXRob2RzID0gdGhpcy5nZXRFbmhhbmNlck1ldGhvZHMoKVxuICAgIC8vIGNvbnNvbGUubG9nKCdhbGwgJyxhbGxNZXRob2RzKTtcbiAgICB0aGlzLmFsbE1ldGhvZHNMaXN0ID0gdGhpcy5iaW5kUGFyZW50Vmlld1N0cmVhbShhbGxNZXRob2RzLCB0aGlzLnBhcmVudENvbnRleHQpXG4gICAgcmV0dXJuIHRoaXMuYWxsTWV0aG9kc0xpc3RcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmbGF0TWFwLCBtYXAsIHB1Ymxpc2gsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgY29tcG9zZSwgcHJvcCwgZGVmYXVsdFRvLCBvdmVyLCBsZW5zUHJvcCwgaGFzLCBwcm9wRXEsIHdoZW4sIHByb3BJcywgYWxsUGFzcywgYXNzb2MsIHBpY2ssIG1lcmdlRGVlcFJpZ2h0IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEZldGNoVXRpbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxGZXRjaFV0aWxcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIGlzIHRoZSBjb3JlIG9iamVjdCB1c2VkIGZvciBDaGFubmVsRmV0Y2guIFRoaXMgdXRpbGl0eSB3cmFwcyB0aGUgamF2YXNjcmlwdCBmZXRjaCBhcGkgaW50byBhbiBvYnNlcnZhYmxlLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgUHJvcGVydGllcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZmV0Y2ggcmVxdWVzdFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWJzY3JpYmVyIEEgbWV0aG9kIGFzc2lnbmVkIHRvIGxpc3RlbiB0byB0aGUgcmVzdWx0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdE1vZGUgQ29udHJvbHMgdGhlIGluaXRpYWxpenRpb24gZm9yIHVuaXQgdGVzdHNcbiAgICpcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMudXJsIC0gPSB1bmRlZmluZWQ7IFRoZSB1cmwgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuc2VydmVyT3B0aW9ucyAtID0gdW5kZWZpbmVkOyBUaGUgcHJvcGVydGllcywgaGVhZGVyLCBib2R5LCBtb2RlLCBtZXRob2QsIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5tYXBGbiAtID0gdW5kZWZpbmVkOyBBIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnNlIHRoZSBkYXRhIGJlZm9yZSBpdCdzIHJldHVybmVkXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnJlc3BvbnNlVHlwZSAtID0gJ2pzb24nOyBEZWZhdWx0IGlzIGpzb25cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuZGVidWcgLSA9IGZhbHNlOyB3aWxsIHRyYWNlIHRoZSBmZXRjaCByZXNwb25zZSB0byB0aGUgY29uc29sZSBiZWZvciB0aGUgb2JzZXJ2YWJsZSBjb21wbGV0ZXNcbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gU3Vic2NyaWJlciAtID0gdW5kZWZpbmVkOyB0aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZmV0Y2ggaXMgY29tcGxldGUuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdGVzdE1vZGUgLSA9IGZhbHNlOyBVc2VkIGZvciB1bml0IHRlc3RpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBmZXRjaGVkIHJlc3BvbnNlIHBhcnNlZCBieSB0aGUgc2V0IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+VXNpbmcgQ2hhbm5lbEZldGNoVXRpbCB0byBSZXRyaWV2ZSBhbiBJbWFnZTwvaDQ+J11cbiAgICpcbiAgICogICBjb25zdCB1cmwgPSBcIi9zdGF0aWMvaW1hZ2VzL215aW1hZ2UuanBnXCI7XG4gICAqICAgY29uc3QgcmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XG4gICAqICAgY29uc3Qgb25JbWdCbG9iUmV0dXJuZWQgPSAoYmxvYik9PntcbiAgICogICAgICAgIGxldCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICogICAgICAgIHRoaXMuYXBwZW5kVmlldyhcbiAgICogICAgICAgICAgICBuZXcgVmlld1N0cmVhbSh7XG4gICAqICAgICAgICAgICAgICB0YWdOYW1lOiAnaW1nJyxcbiAgICogICAgICAgICAgICAgIHNyYzogYmxvYlVybCxcbiAgICogICAgICAgICAgICAgIHdpZHRoOjMwMFxuICAgKiAgICAgICAgICAgIH0pXG4gICAqICAgICAgICAgICApfVxuICAgKlxuICAgKiAgIG5ldyBDaGFubmVsRmV0Y2hVdGlsKHt1cmwsIHJlc3BvbnNlVHlwZX0sIG9uSW1nQmxvYlJldHVybmVkKTtcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgc3Vic2NyaWJlciwgdGVzdE1vZGUsIENIQU5ORUxfTkFNRSkge1xuICAgIGNvbnN0IHRlc3RTdWJzY3JpYmVyID0gKHApID0+IGNvbnNvbGUubG9nKCdGRVRDSCBSRVRVUk5FRCAnLCBwKVxuXG4gICAgdGhpcy5fbWFwRm4gPSBDaGFubmVsRmV0Y2hVdGlsLnNldE1hcEZuKG9wdGlvbnMpXG4gICAgdGhpcy5fdXJsID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRVcmwob3B0aW9ucylcbiAgICB0aGlzLl9yZXNwb25zZVR5cGUgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFJlc3BvbnNlVHlwZShvcHRpb25zKVxuICAgIHRoaXMuX3NlcnZlck9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFNlcnZlck9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlciAhPT0gdW5kZWZpbmVkID8gc3Vic2NyaWJlciA6IHRlc3RTdWJzY3JpYmVyXG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVidWcgOiBmYWxzZVxuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBDSEFOTkVMX05BTUVcblxuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB7XG4gICAgICBtYXBGbjogdGhpcy5tYXBGbixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiB0aGlzLnNlcnZlck9wdGlvbnMsXG4gICAgICByZXNwb25zZVR5cGU6IHRoaXMucmVzcG9uc2VUeXBlLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBDaGFubmVsRmV0Y2hVdGlsLnN0YXJ0V2luZG93RmV0Y2goZmV0Y2hQcm9wcywgdGhpcy5fc3Vic2NyaWJlciwgdGhpcy5jaGFubmVsTmFtZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgc3RhcnRXaW5kb3dGZXRjaChwcm9wcywgc3Vic2NyaWJlciwgY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCB7IG1hcEZuLCB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgZGVidWcgfSA9IHByb3BzXG4gICAgY29uc3QgdGFwTG9nRGVidWcgPSBwID0+IGNvbnNvbGUubG9nKCdERUJVRyBGRVRDSCA6JywgcCwgeyB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgY2hhbm5lbE5hbWUgfSlcbiAgICBjb25zdCB0YXBMb2cgPSBkZWJ1ZyA9PT0gdHJ1ZSA/IHRhcExvZ0RlYnVnIDogKCkgPT4ge31cblxuICAgIGNvbnN0IG1hcFdyYXBwZXIgPSAobWFwTWV0aG9kKSA9PiB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHsgY2hhbm5lbE5hbWUsIHVybCwgcmVzcG9uc2VUeXBlLCBzZXJ2ZXJPcHRpb25zIH1cblxuICAgICAgcmV0dXJuIChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBtYXBNZXRob2QoZGF0YSwgbWV0YWRhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UkID0gZnJvbSh3aW5kb3cuZmV0Y2godXJsLCBzZXJ2ZXJPcHRpb25zKSlcbiAgICAgIC5waXBlKHRhcCh0YXBMb2cpLCBmbGF0TWFwKHIgPT4gZnJvbShyW3Jlc3BvbnNlVHlwZV0oKSkpLFxuICAgICAgICBtYXAobWFwV3JhcHBlcihtYXBGbikpLFxuICAgICAgICBwdWJsaXNoKCkpXG5cbiAgICByZXNwb25zZSQuY29ubmVjdCgpXG5cbiAgICByZXNwb25zZSQuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICBzdGF0aWMgc2V0TWFwRm4ob3B0cykge1xuICAgIGNvbnN0IGdldEZuID0gY29tcG9zZShkZWZhdWx0VG8oKHApID0+IHApLCBwcm9wKCdtYXBGbicpKVxuICAgIHJldHVybiBnZXRGbihvcHRzKVxuICB9XG5cbiAgc3RhdGljIHNldFVybChvcHRzKSB7XG4gICAgY29uc3QgdXJsID0gcHJvcCgndXJsJywgb3B0cylcbiAgICBpZiAodXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU1BZTkUgV0FSTklORzogVVJMIGlzIHVuZGVmaW5lZCBmb3IgZGF0YSBjaGFubmVsJylcbiAgICB9XG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgc3RhdGljIHNldFJlc3BvbnNlVHlwZShvcHRzKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRUbygnanNvbicsIHByb3AoJ3Jlc3BvbnNlVHlwZScsIG9wdHMpKVxuICB9XG5cbiAgZ2V0IG1hcEZuKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXBGblxuICB9XG5cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsXG4gIH1cblxuICBnZXQgc2VydmVyT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyT3B0aW9uc1xuICB9XG5cbiAgZ2V0IHJlc3BvbnNlVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlXG4gIH1cblxuICBzdGF0aWMgc3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMob2JqKSB7XG4gICAgY29uc3QgY29udmVydFRvSlNPTiA9IHdoZW4ocHJvcElzKE9iamVjdCwgJ2JvZHknKSwgY29tcG9zZShvdmVyKGxlbnNQcm9wKCdib2R5JyksIEpTT04uc3RyaW5naWZ5KSkpXG5cbiAgICByZXR1cm4gY29udmVydFRvSlNPTihvYmopXG4gIH1cblxuICBzdGF0aWMgdXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMob3B0cykge1xuICAgIGNvbnN0IGhhc0JvZHkgPSBoYXMoJ2JvZHknKVxuICAgIGNvbnN0IG1ldGhvZElzR2V0ID0gcHJvcEVxKCdHRVQnLCAnbWV0aG9kJylcbiAgICBjb25zdCBwcmVkID0gYWxsUGFzcyhbaGFzQm9keSwgbWV0aG9kSXNHZXRdKVxuICAgIHJldHVybiB3aGVuKHByZWQsIGFzc29jKCdtZXRob2QnLCAnUE9TVCcpKShvcHRzKVxuICB9XG5cbiAgc3RhdGljIHNldFNlcnZlck9wdGlvbnMob3B0cykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBwaWNrKFtcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ2hlYWRlcnMnLFxuICAgICAgJ2JvZHknLFxuICAgICAgJ21vZGUnLFxuICAgICAgJ2NyZWRlbnRpYWxzJyxcbiAgICAgICdjYWNoZScsXG4gICAgICAncmVkaXJlY3QnLFxuICAgICAgJ3JlZmVycmVyJyxcbiAgICAgICdyZWZlcnJlclBvbGljeScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdrZWVwYWxpdmUnXG4gICAgXSwgb3B0cylcbiAgICBsZXQgbWVyZ2VkT3B0aW9ucyA9IG1lcmdlRGVlcFJpZ2h0KENoYW5uZWxGZXRjaFV0aWwuYmFzZU9wdGlvbnMoKSwgb3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC51cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyhtZXJnZWRPcHRpb25zKVxuICAgIG1lcmdlZE9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzKG1lcmdlZE9wdGlvbnMpXG4gICAgcmV0dXJuIG1lcmdlZE9wdGlvbnNcbiAgfVxuXG4gIHN0YXRpYyBiYXNlT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiAnR0VUJywgLy8gRGVmYXVsdCBtZXRob2RcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICAgICAgfSksXG4gICAgICBtb2RlOiAnY29ycycsIC8vIERlZmF1bHQgbW9kZVxuICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsIC8vIERlZmF1bHQgY3JlZGVudGlhbHMgcG9saWN5XG4gICAgICBjYWNoZTogJ2RlZmF1bHQnLCAvLyBEZWZhdWx0IGNhY2hlIHBvbGljeVxuICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLCAvLyBEZWZhdWx0IHJlZGlyZWN0IHBvbGljeVxuICAgICAgcmVmZXJyZXI6ICdjbGllbnQnLCAvLyBEZWZhdWx0IHJlZmVycmVyIHBvbGljeVxuICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZScsIC8vIERlZmF1bHQgcmVmZXJyZXIgcG9saWN5XG4gICAgICBpbnRlZ3JpdHk6ICcnLCAvLyBEZWZhdWx0IGludGVncml0eVxuICAgICAga2VlcGFsaXZlOiBmYWxzZSAvLyBEZWZhdWx0IGtlZXBhbGl2ZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbCdcbmltcG9ydCB7IENoYW5uZWxGZXRjaFV0aWwgfSBmcm9tICcuLi91dGlscy9jaGFubmVsLWZldGNoLXV0aWwnXG5pbXBvcnQgeyBwYXRoLCBwaWNrLCBtZXJnZURlZXBSaWdodCwgYWxsLCBhbGxQYXNzLCBlaXRoZXIsIHZhbHVlcywgZGVmYXVsdFRvLCByZWplY3QsIGNvbXBvc2UsIGlzTmlsIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoXG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbEZldGNoIGV4dGVuZHMgQ2hhbm5lbCBhbmQgaXMgZGVzaWduZWQgdG8gY3JlYXRlIGEgQ2hhbm5lbCBmcm9tIGZldGNoZWQgaHR0cCBkYXRhLjwvcD5cbiAgICogPHA+QSBDaGFubmVsRmV0Y2ggaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgd2l0aCBqdXN0IHRoZSBjaGFubmVsIG5hbWUgYW5kIHVybCBwcm9wZXJ0aWVzLjwvcD5cbiAgICogPHA+VGhlIGRhdGEgaXMgZmV0Y2hlZCBvbmNlLCBidXQgdGhlIENoYW5uZWxGZXRjaCdzIGRhdGEgaXMgYWx3YXlzIGF2YWlsYWJsZSB0byBvdGhlciBDaGFubmVsIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlczwvcD5cbiAgICpcbiAgICogPGgzPlRoZSBDaGFubmVsRmV0Y2ggQ2xhc3M8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5FeHRlbmRzIENoYW5uZWwgYW5kIHVzZXMgdGhlIENoYW5uZWxGZXRjaFV0aWwgdG8gbWFrZSBhbnkgdHlwZSBvZiBodHRwKHMpIHJlcXVlc3QuPC9saT5cbiAgICogPGxpPlJlcXVpcmVzIGEgdXJsIHByb3BlcnR5IGF0IGluc3RhbnRpYXRpb24uPC9saT5cbiAgICogPGxpPlRoZSByZXNwb25zZSBkYXRhIGlzIHB1Ymxpc2hlZCBhcyBhIENoYW5uZWxQYXlsb2FkLjwvbGk+XG4gICAqIDxsaT5UaGUgYWN0aW9uIGZvciB0aGUgcmV0dXJuZWQgQ2hhbm5lbEZldGNoIGRhdGEgaXMgYWx3YXlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LCBcIkNIQU5ORUxfTkFNRV9EQVRBX0VWRU5UXCI8L2xpPlxuICAgKiA8bGk+VGhlIGRlZmF1bHQgcmVxdWVzdCB0eXBlIGlzIGEgR0VUIHJlcXVlc3QgdGhhdCByZXR1cm5zIGEgSlNPTiBvYmplY3QuPC9saT5cbiAgICogPGxpPkhvd2V2ZXIsIGFueSB0eXBlIG9mIHJlcXVlc3QgYW5kIHJldHVybiB0eXBlIGNhbiBiZSBjb25maWd1cmVkIGJ5IHVzaW5nIHRoZSBib2R5IHByb3BlcnR5IHdoZW4gY3JlYXRpbmcgdGhlIGluc3RhbmNlLjwvbGk+XG4gICAqIDxsaT5UaGUgbWFwRm4gZ2l2ZXMgYWNjZXNzIHRvIHRoZSByZXR1cm5lZCByZXNwb25zZSBhbmQgY2FuIGJlIHVzZSB0byBwYXJzZSB0aGUgZGF0YSBiZWZvcmUgaXQgaXMgcHVibGlzaGVkIHRvIG90aGVyIENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlcy48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbCBGZXRjaCB3aWxsIHNlbmQgdGhlIGxhc3QgcmVzcG9uc2UgdG8gZnV0dXJlIHN1YnNjcmliZXJzLCBhbmQgd2lsbCBub3QgbWFrZSBmdXJ0aGVyIGh0dHAocykgcmVxdWVzdHMgdW5sZXNzIGRpcmVjdGVkIHRvIGRvICBzby48L2xpPlxuICAgKiA8bGk+RGF0YSBjYW4gYmUgRmV0Y2hlZCBhZ2FpbiwgYnkgc2VuZGluZyBhIFwiQ0hBTk5FTF9OQU1FX1VQREFURV9EQVRBX0VWRU5UXCIgYWN0aW9uIGZyb20gYSBWaWV3U3RyZWFtJ3Mgc2VuZEluZm9Ub0NoYW5uZWwgbWV0aG9kLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIHJlZ2lzdGVyZWQgbmFtZSBmb3IgdGhlIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm9wcy51cmwgLSA9IHVuZGVmaW5lZDsgVGhlIHVybCB0byBiZSBmZXRjaGVkLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBwcm9wcy5tYXBGbiAtID0gdW5kZWZpbmVkOyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZldGNoZWQgcmVzcG9uc2UgYW5kIGJlaGF2ZXMgbGlrZSBhbnkgbWFwIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLmJvZHkgLSA9IHVuZGVmaW5lZDsgVGhpcyB3aWxsIHVwZGF0ZSB0aGUgb3B0aW9ucywgaW5jbHVkaW5nIGhlYWRlciBvcHRpb25zLCBzZW50IGFsb25nIHdpdGggdGhlIGZldGNoIHJlcXVlc3QuIERlZmF1bHQgb3B0aW9ucyB1c2VzIGEgR0VUIHJlcXVlc3QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PkEgVmlld1N0cmVhbSBJbnN0YW5jZSBTZW5kaW5nIEEgRmV0Y2ggVXBkYXRlIFJlcXVlc3Q8L2g0PlwiXVxuICAgKiBjb25zdCBhY3Rpb24gPSBcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVfVVBEQVRFX0RBVEFfRVZFTlRcIjtcbiAgICogY29uc3QgdXJsID0gXCIvL3NpdGUuY29tL2pzb24vXCI7XG4gICAqIGNvbnN0IGJvZHkgPSB7XG4gICAqICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAqIH1cbiAgICpcbiAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVcIiwge2FjdGlvbiwgdXJsLCBib2R5fSk7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICAvLyBBTExPVyBGT1IgR0VORVJJQyBNQVAgUFJPUEVSVFlcblxuICAgIENoYW5uZWxGZXRjaC52YWxpZGF0ZU1hcE1ldGhvZChwcm9wcywgbmFtZSlcblxuICAgIGlmIChwcm9wcy5tYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMubWFwRm4gPSBwcm9wcy5tYXBcbiAgICB9XG4gICAgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyID0gW1xuICAgICAgYCR7bmFtZX1fREFUQV9FVkVOVGAsXG4gICAgICBbYCR7bmFtZX1fVVBEQVRFX0RBVEFfRVZFTlRgLCAnb25GZXRjaFVwZGF0ZSddXG4gICAgXVxuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lLCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGFyciA9PiBhcnIubGVuZ3RoID49IDFcbiAgICBjb25zdCBpc05vdEZ1bmN0aW9uID0gdmFsID0+IHR5cGVvZiAodmFsKSAhPT0gJ2Z1bmN0aW9uJ1xuICAgIGNvbnN0IGlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUgPSBlaXRoZXIoaXNOaWwsIGlzTm90RnVuY3Rpb24pXG4gICAgY29uc3QgaXNVbmRlZmluZWQgPSBhbGwoaXNVbmRlZmluZWRPcldyb25nVHlwZSlcbiAgICBjb25zdCBpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc1VuZGVmaW5lZCwgaXNOb3RFbXB0eV0pXG4gICAgY29uc3QgbWFwTWV0aG9kSXNJbnZhbGlkID0gY29tcG9zZShpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHksIHZhbHVlcywgcGljayhbJ21hcCcsICdtYXBGbiddKSkocHJvcHMpXG5cbiAgICBpZiAobWFwTWV0aG9kSXNJbnZhbGlkKSB7XG4gICAgICBpZiAodGVzdE1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1hcCBtZXRob2QgZm9yIENoYW5uZWxGZXRjaCwgJHtuYW1lfSwgYXBwZWFycyB0byBiZSBpbnZhbGlkYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG4gICAgdGhpcy5zdGFydEZldGNoKClcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKG5hbWUpIHtcbiAgICBjb25zdCBhcnIgPSBbXG4gICAgICAnQ0hBTk5FTF9EQVRBX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9VUERBVEVfREFUQV9FVkVOVCcsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG5cbiAgICBjb25zdCBleHRlbmRlZEFyciA9IGNvbXBvc2UoZGVmYXVsdFRvKFtdKSwgcGF0aChbJ3Byb3BzJywgJ2V4dGVuZGVkQWN0aW9uc0FyciddKSlcbiAgICByZXR1cm4gYXJyLmNvbmNhdChleHRlbmRlZEFycih0aGlzKSlcbiAgfVxuXG4gIHN0YXJ0RmV0Y2gob3B0aW9ucyA9IHt9LCBzdWJzY3JpYmVyID0gdGhpcy5vbkZldGNoUmV0dXJuZWQuYmluZCh0aGlzKSkge1xuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB0aGlzLmNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyhvcHRpb25zKVxuICAgIHJldHVybiBuZXcgQ2hhbm5lbEZldGNoVXRpbChmZXRjaFByb3BzLCBzdWJzY3JpYmVyLCBmYWxzZSwgdGhpcy5wcm9wcy5uYW1lKVxuICB9XG5cbiAgb25GZXRjaFVwZGF0ZShldnQpIHtcbiAgICBjb25zdCBwcm9wc09wdGlvbnMgPSB0aGlzLmdldFByb3BzRm9yRmV0Y2goZXZ0KVxuICAgIHRoaXMuc3RhcnRGZXRjaChwcm9wc09wdGlvbnMpXG4gIH1cblxuICBvbkZldGNoUmV0dXJuZWQoc3RyZWFtSXRlbSkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbShzdHJlYW1JdGVtKVxuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtKHBheWxvYWQsIGFjdGlvbiA9IGAke3RoaXMucHJvcHMubmFtZX1fREFUQV9FVkVOVGApIHtcbiAgICBjb25zdCB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBzcmNFbGVtZW50ID0geyBuYW1lLCBzZW5kQ2FjaGVkUGF5bG9hZCwgdXJsIH1cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQpXG4gIH1cblxuICBnZXRQcm9wc0ZvckZldGNoKGV2dCkge1xuICAgIGNvbnN0IGRhdGFPYmogPSBwYXRoKFsndmlld1N0cmVhbUluZm8nLCAncGF5bG9hZCddLCBldnQpXG4gICAgcmV0dXJuIHBpY2soWydtYXBGbicsICd1cmwnLCAnaGVhZGVyJywgJ2JvZHknLCAnbW9kZScsICdtZXRob2QnLCAncmVzcG9uc2VUeXBlJywgJ2RlYnVnJ10sIGRhdGFPYmopXG4gIH1cblxuICBjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMob3B0aW9ucywgcHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNPcHRpb25zID0gcGljayhbJ21hcEZuJywgJ3VybCcsICdoZWFkZXInLCAnYm9keScsICdtb2RlJywgJ21ldGhvZCcsICdyZXNwb25zZVR5cGUnLCAnZGVidWcnXSwgcHJvcHMpXG4gICAgY29uc3QgbWVyZ2VPcHRpb25zID0gKG8xLCBvMikgPT4gbWVyZ2VEZWVwUmlnaHQobzEsIG8yKVxuICAgIGNvbnN0IGZpbHRlck91dFVuZGVmaW5lZCA9IHJlamVjdChpc05pbClcbiAgICByZXR1cm4gY29tcG9zZShmaWx0ZXJPdXRVbmRlZmluZWQsIG1lcmdlT3B0aW9ucykocHJvcHNPcHRpb25zLCBvcHRpb25zKVxuICB9XG5cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG59XG4iLCJpbXBvcnQgeyBEb21FbGVtZW50IH0gZnJvbSAnLi92aWV3cy9kb20tZWxlbWVudCdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBpcywgY2xvbmUsIHBhdGhTYXRpc2ZpZXMgfSBmcm9tICdyYW1kYSdcbmV4cG9ydCBjbGFzcyBTcHluZVBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICBsZXQgeyBuYW1lLCBjb25maWcsIHBhcmVudEVsIH0gPSBwcm9wc1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcgPSBjbG9uZShwcm9wcylcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdlbXB0eSdcbiAgICB0aGlzLnByb3BzLm5hbWUgPSBuYW1lXG4gICAgY29uZmlnID0gU3B5bmVQbHVnaW4ubWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZywgdGhpcy5kZWZhdWx0Q29uZmlnKCkpXG4gICAgdGhpcy5wcm9wcy5wYXJlbnRFbCA9IHBhcmVudEVsIHx8IFNweW5lUGx1Z2luLmNyZWF0ZVBhcmVudEVsKClcbiAgICBTcHluZVBsdWdpbi5nZXRTcHluZUFwcChuYW1lLCBjb25maWcpXG5cbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuXG4gICAgdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIHN0YXRpYyBtZXJnZURlZmF1bHRDb25maWcoY29uZmlnID0ge30sIGRlZmF1bHRDb25maWcgPSB0aGlzLmRlZmF1bHRDb25maWcoKSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgfVxuXG4gIHN0YXRpYyBnZXRTcHluZUFwcChuYW1lLCBjb25maWcpIHtcbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBVbmFibGUgdG8gaW5zdGFsbCBwbHVnaW4sICR7bmFtZX0hIFNweW5lQXBwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCFgKVxuICAgICAgLy8gU3B5bmVBcHAuaW5pdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5hZGRQbHVnaW5Db25maWcobmFtZSwgY29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB1cGRhdGVTcHluZUNvbmZpZyhzcHluZUFwcCwgcGx1Z2luTmFtZSwgcGx1Z2luQ29uZmlnKSB7XG4gICAgY29uc3QgcGF0aEV4aXN0cyA9IHBhdGhTYXRpc2ZpZXMoaXMoT2JqZWN0KSwgWydjb25maWcnLCAncGx1Z2lucycsIHBsdWdpbk5hbWVdKShzcHluZUFwcClcblxuICAgIGlmIChwYXRoRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICBpZiAoc3B5bmVBcHAuY29uZmlnLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHBsdWdpbiwgJHtwbHVnaW5OYW1lfSwgYWxyZWFkeSBleGlzdHNgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHNweW5lQXBwLmNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luQ29uZmlnXG4gICAgcmV0dXJuIHNweW5lQXBwLmNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUGFyZW50RWwoZWwpIHtcbiAgICBjb25zdCBjcmVhdGVQbHVnaW5QYXJlbnRFbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHBsdWdpbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLXBsdWdpbnMnKVxuXG4gICAgICBjb25zdCBjcmVhdGVQbHVnaW5FbCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luRWwgPSBuZXcgRG9tRWxlbWVudCh7XG4gICAgICAgICAgaWQ6ICdzcHluZS1wbHVnaW5zJ1xuICAgICAgICB9KVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBsdWdpbkVsLnJlbmRlcigpKVxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1wbHVnaW5zJylcbiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDoxMDB2aDt6LWluZGV4OjEwMDAwMDA7IHBvaW50ZXItZXZlbnRzOm5vbmUnXG4gICAgICAgIHJldHVybiBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHBsdWdpbkVsIHx8IGNyZWF0ZVBsdWdpbkVsKClcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgY3JlYXRlUGx1Z2luUGFyZW50RWwoKVxuICB9XG5cbiAgYWRkVHJhaXRzKHRyYWl0cykge1xuICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICB9XG4gICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgfVxuXG4gICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gIH1cblxuICBvbkJlZm9yZVJlZ2lzdGVyZWQoKSB7XG4gICAgdGhpcy5wcm9wcy5wbHVnaW5OYW1lID0gdGhpcy5wcm9wcy5uYW1lXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHRoaXMucHJvcHMucGx1Z2luTmFtZSlcbiAgfVxuXG4gIGRlZmF1bHRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcblxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcblxuICB9XG5cbiAgb25SZW5kZXIoKSB7XG5cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbHNNYXAgfSBmcm9tICcuL2NoYW5uZWxzL2NoYW5uZWxzLW1hcCdcbmltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuL3ZpZXdzL3ZpZXctc3RyZWFtJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfSBmcm9tICcuL3V0aWxzL3Nhbml0aXplLWh0bWwnXG5cbmNvbnN0IF9jaGFubmVscyA9IG5ldyBDaGFubmVsc01hcCgpXG5jb25zdCB2ZXJzaW9uID0gJzAuMjAuMSdcblxuY2xhc3MgU3B5bmVBcHBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKlxuICAgKiBTcHluZUFwcCBjcmVhdGVzIHRoZSBnbG9iYWwgU3B5bmUgb2JqZWN0LCBhbmQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGl0ZW1zXG4gICAqIDx1bD5cbiAgICpcbiAgICogPGxpPkxJTktbJ0NoYW5uZWxzTWFwJywgJ2NoYW5uZWxzLWNvbnRyb2xsZXInXSB0aGF0IGRpcmVjdHMgdGhlIGZsb3cgb2YgZGF0YSB0byBhbGwgQ2hhbm5lbHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgdGhhdCBicm9hZGNhc3QgYWxsIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSwgdGhhdCBicm9hZGNhc3Qgd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgYW5kIGlzIHRoZSBvbmx5IG90aGVyIGNoYW5uZWwgdGhhdCBjYW4gYmUgYm91bmQgdG8gdXNlciBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIHRoYXQgYnJvYWRjYXN0IGFsbCByZXF1ZXN0ZWQgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMsIHN1Y2ggYXMgc2Nyb2xsaW5nLCByZXNpemluZyBhbmQgbWVkaWEgcXVlcmllczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgdGhhdCBicm9hZGNhc3RzIHJlbmRlcmluZyBhbmQgcmVtb3Zpbmcgb2YgVmlld1N0cmVhbSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkaXJlY3RlZCB0byBicm9hZGNhc3QgdGhlaXIgbGlmZWN5Y2xlIGV2ZW50czwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqXG4gICAqIEBtb2R1bGUgU3B5bmVBcHBcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhpcyBnbG9iYWwgY29uZmlnIG9iamVjdCBpcyBtYWlubHkgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdHdvIFNweW5lQ2hhbm5lbHMsIENIQU5ORUxfUk9VVEUgYW5kIENIQU5ORUxfV0lORE9XLlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG5cbiAgICAvLyBjb25zb2xlLmxvZygnc3B5bmUgYXBwIGNyZWF0ZWQnKVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNcbiAgfVxuXG4gIGluaXQoY29uZmlnID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmNoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKCk7XG4gICAgLyohXG4gICAgICogU3B5bmUgMC4yMC4xXG4gICAgICogaHR0cHM6Ly9zcHluZWpzLm9yZ1xuICAgICAqXG4gICAgICogQGxpY2Vuc2UgQ29weXJpZ2h0IDIwMTctMjAyMSwgRnJhbmsgQmF0aXN0YSwgUmVsZXZhbnQgQ29udGV4dCwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICAgICAqIFNweW5lIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMFxuICAgICAqXG4gICAgICogQGF1dGhvcjogRnJhbmsgQmF0aXN0YSxcbiAgICAgKiBAZW1haWw6ICBmcmJhdGlzdGEubnljQGdtYWlsLmNvbVxuICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5cblxuICAgIGlmKFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSl7XG4gICAgICBpZiAodGVzdE1vZGUpe1xuICAgICAgICByZXR1cm4gJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkISc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy9jb25zdCBpbWdQYXRoID0gSU1HX1BBVEggfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGltZ1BhdGggPSAodHlwZW9mIElNR19QQVRIICE9PSAndW5kZWZpbmVkJykgPyBJTUdfUEFUSCA6IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgIHNjcm9sbExvY2s6IGZhbHNlLFxuICAgICAgc2Nyb2xsTG9ja1g6IDMxLFxuICAgICAgc2Nyb2xsTG9ja1k6IDAsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgYmFzZUhyZWY6IHVuZGVmaW5lZCxcbiAgICAgIElNR19QQVRIOiBpbWdQYXRoLFxuICAgICAgcGx1Z2luTWV0aG9kczp7XG5cbiAgICAgIH0sXG4gICAgICBwbHVnaW5zOntcblxuICAgICAgfSxcbiAgICAgIHRtcDoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBXSU5ET1c6IHtcbiAgICAgICAgICBtZWRpYVF1ZXJpZXM6IHtcblxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yU2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JNb3VzZVdoZWVsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JXaGVlbDogZmFsc2UsXG4gICAgICAgICAgZGVib3VuY2VNU1RpbWVGb3JSZXNpemU6IDIwMCxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclNjcm9sbDogMTUwXG4gICAgICAgIH0sXG5cbiAgICAgICAgUk9VVEU6IHtcbiAgICAgICAgICB0eXBlOiAnc2xhc2gnLFxuICAgICAgICAgIGlzSGFzaDogZmFsc2UsXG4gICAgICAgICAgaXNIaWRkZW46IGZhbHNlLFxuICAgICAgICAgIGFkZDQwNHM6IGZhbHNlLFxuICAgICAgICAgIHJvdXRlczoge1xuICAgICAgICAgICAgJ3JvdXRlUGF0aCcgOiB7XG4gICAgICAgICAgICAgICdyb3V0ZU5hbWUnIDogJ2NoYW5nZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByb3V0ZVV0aWxzID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZTtcbiAgICAgICBjb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnLCBjb25maWcsIF9jaGFubmVscywgcm91dGVVdGlscyk7XG4gICAgICAgLy9jb25zb2xlLmxvZyhcIlNQWU5FIEFQUCBQUk9QUyBcIixTcHluZUFwcFByb3BlcnRpZXMpO1xuICAgICAgLy93aW5kb3cuU3B5bmUgPSB0aGlzO1xuICAgICAgLy93aW5kb3cuU3B5bmVbJ2NvbmZpZyddID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICB9XG4gICAgdGhpcy5wbHVnaW5zRm4gPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UGx1Z2luc01ldGhvZE9iaihjb25maWdbJ3BsdWdpbk1ldGhvZHMnXSk7XG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IChzdHIpID0+IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICAgIHRoaXMucmVnaXN0ZXJDaGFubmVsID0gKHZhbCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKHZhbCk7XG4gICAgdGhpcy5yZWdpc3RlckRhdGFDaGFubmVsID0gKG9icyQpID0+IF9jaGFubmVscy5yZWdpc3RlclN0cmVhbShvYnMkKTtcbiAgICB0aGlzLmxpc3RDaGFubmVscyA9ICgpID0+IEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpO1xuICAgIGxldCBudWxsSG9sZGVyID0gbmV3IFZpZXdTdHJlYW0oeyBpZDonc3B5bmUtbnVsbC12aWV3cycgfSk7XG4gICAgbnVsbEhvbGRlci5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICBudWxsSG9sZGVyLnByb3BzLmVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTpub25lOyBvcGFjaXR5OjA7IHBvaW50ZXItZXZlbnRzOm5vbmU7JztcbiAgICBfY2hhbm5lbHMuaW5pdCgpO1xuXG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuZGVidWc9PT10cnVlKXtcbiAgICAgICB3aW5kb3cuU3B5bmUgPSB7dmVyc2lvbn07XG4gICAgfVxuXG4gICAgc2FuaXRpemVIVE1MQ29uZmlndXJlKFNweW5lQXBwUHJvcGVydGllcy5jb25maWcpO1xuXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+TGlzdGluZyB0aGUgcmVnaXN0ZXJlZWQgQ2hhbm5lbHMgaW4gdGhlIGJyb3dzZXIgY29uc29sZTwvaDQ+J11cbiAgICogU3B5bmVBcHAubGlzdENoYW5uZWxzKCk7XG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBjaGFubmVsc1xuICAgKi9cbiAgc3RhdGljIGxpc3RDaGFubmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgQWN0aW9ucyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0b1xuICAgKi9cbiAgc3RhdGljIGdldENoYW5uZWxBY3Rpb25zKHN0cikge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgY2hhbm5lbCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0IHNvIHRoYXQgaXQgY2FuIHN1YnNjcmliZWQgYnkgYWxsIFZpZXdTdHJlYW0gYW5kIENoYW5uZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge0NoYW5uZWx9IGNcbiAgICpcbiAgICpcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNoYW5uZWwoYykge1xuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKGMpO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCBsZXQgU3B5bmVBcHAgPSBuZXcgU3B5bmVBcHBsaWNhdGlvbigpO1xuIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlcXVpcmUiLCJkZWZpbmUiLCJhbWQiLCJzZWxmIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MF9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNzI1X18iLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJ1bmRlZmluZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiZCIsImRlZmluaXRpb24iLCJrZXkiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0Iiwib2JqIiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwiX3BsdWdpbk1ldGhvZHNPYmoiLCJjcmVhdGUiLCJpc05vdEFyciIsImNvbXBvc2UiLCJub3QiLCJpcyIsIkFycmF5IiwiaXNPYmplY3RGbiIsImFsbFBhc3MiLCJpc01lcmdlYWJsZU9iamVjdCIsInZhbCIsInRvU3RyaW5nIiwiY2xvbmVJZk5lY2Vzc2FyeSIsIm9wdGlvbnNBcmd1bWVudCIsImNsb25lIiwiZGVlcE1lcmdlIiwiaXNBcnJheSIsImRlZmF1bHRBcnJheU1lcmdlIiwidGFyZ2V0Iiwic291cmNlIiwiZGVzdGluYXRpb24iLCJzbGljZSIsImZvckVhY2giLCJlIiwiaSIsImluZGV4T2YiLCJwdXNoIiwiYXJyYXkiLCJhcnJheU1lcmdlIiwia2V5cyIsIm1lcmdlT2JqZWN0IiwiX2NvbmZpZyIsIl9jaGFubmVscyIsIl9jaGFubmVsc01hcCIsIl9pbml0aWFsaXplZCIsImFsbCIsImxlbmd0aCIsIkVycm9yIiwicmVkdWNlIiwicHJldiIsIm5leHQiLCJfSU1HX1BBVEgiLCJfZGVidWciLCJfZG9Ob3RUcmFja0NoYW5uZWxzQXJyIiwiX3Byb3hpZXNNYXAiLCJNYXAiLCJfc3B5bmVQbHVnaW5NZXRob2RzIiwiY29uc3RydWN0b3IiLCJmb28iLCJjb25zb2xlIiwibG9nIiwiYWRkTWV0aG9kIiwiZm4iLCJ0ZXN0Iiwid2FyblN0ciIsIndhcm4iLCJhZGRNZXRob2RzIiwibWV0aG9kc09iaiIsIkpTT04iLCJzdHJpbmdpZnkiLCJtYXAiLCJrZXlTdHIiLCJtZXRob2RWYWwiLCJ0aGlzIiwiam9pbiIsImNoZWNrSWZNZXRob2RFeGlzdHMiLCJwbHVnaW5NZXRob2RzT2JqIiwiU3B5bmVBcHBQcm9wZXJ0aWVzIiwiY2hhbm5lbHNNYXAiLCJpbml0aWFsaXplZCIsImNvbmZpZyIsImRlYnVnIiwibGlzdENoYW5uZWxzIiwiZnJvbSIsImluaXRpYWxpemUiLCJkZWZhdWx0Q29uZmlnIiwicm91dGVVdGlscyIsImNoYW5uZWxzIiwiUk9VVEUiLCJjb25mb3JtUm91dGVPYmplY3QiLCJJTUdfUEFUSCIsImdldENoYW5uZWxBY3Rpb25zIiwiYmluZCIsImxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMiLCJzZXRDaGFubmVsc01hcCIsImJhc2VIcmVmIiwic2V0SGVhZEJhc2VIcmVmIiwic3RyIiwiYmFzZVRhZyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiLCJjb25mb3JtUm91dGVDb25maWciLCJhZGQ0MDRQcm9wcyIsIlNweW5lVXRpbHNDaGFubmVsUm91dGUiLCJnZXRTdHJlYW0iLCJ0ZXN0U3RyZWFtIiwiZ2V0UHJveHlTdWJqZWN0Iiwic2V0UHJvcCIsInRtcCIsImdldFByb3AiLCJwYXRoIiwic2V0Q2hhbm5lbENvbmZpZyIsImNoYW5uZWxOYW1lIiwiZ2V0Q2hhbm5lbENvbmZpZyIsImNoYW5uZWxDb25maWciLCJyZWdpc3RlckNoYW5uZWwiLCJhZGRQbHVnaW5Db25maWciLCJwbHVnaW5OYW1lIiwicGx1Z2luQ29uZmlnIiwicGx1Z2lucyIsImFkZFBsdWdpbk1ldGhvZHMiLCJwbHVnaW5NZXRob2RzIiwiZ2V0UGx1Z2luc01ldGhvZE9iaiIsImRvTm90VHJhY2tDaGFubmVsIiwiZ2V0VW50cmFja2VkQ2hhbm5lbHNMaXN0IiwicmVnaXN0ZXJQcm94eVJldml2ZXIiLCJuYW1lIiwibWV0aG9kIiwic2V0IiwiZ2V0UHJveHlSZXZpdmVyIiwicHJveHlOYW1lIiwiZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lIiwidGVtcEdldENoYW5uZWxzSW5zdGFuY2UiLCJ0ZW1wR2V0Q29uZmlnIiwicmVnaXN0ZXJlZFN0cmVhbU5hbWVzIiwiaW5jbHVkZXMiLCJyZWdpc3RlcmVkU3RlcHMiLCJyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZFN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZEFjdGlvbnMiLCJiYXNlVmFsaWRhdGlvbnMiLCJ2aWV3SW5mb1ZhbGlkYXRpb25zIiwidWlWYWxpZGF0aW9ucyIsImxpZmVzdHJlYW1WYWxpZGF0aW9ucyIsInN0ZXBWYWxpZGF0aW9ucyIsInN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMiLCJzdGVwVXBkYXRlVmFsaWRhdGlvbnMiLCJyb3V0ZVZhbGlkYXRpb25zIiwiU3RyZWFtc0NvbmZpZyIsIk9ic2VydmFibGUiLCJlcnJvciIsInByZWRpY2F0ZSIsInBheWxvYWQiLCJvYnNlcnZhYmxlIiwic3Vic2NyaWJlIiwiYWN0aW9uIiwiU3RyaW5nIiwiY29uY2F0IiwibGlmZVN0cmVhbVZhbGlkYXRpb25zIiwiU1RFUCIsInR5cGUiLCJ2aWV3SWQiLCJkYXRhIiwiZGlzcG9zZUl0ZW1zIiwic3RyZWFtVmFsaWRhdGlvbnMiLCJnZXRSeFR5cGUiLCJzdHJlYW1zIiwiaW5pdCIsIlN1YmplY3QiLCJzdHJ1Y3R1cmUiLCJ2YWxpZGF0aW9ucyIsInNhZmVDbG9uZSIsIl9fcHJveHlfX3Byb3h5TmFtZSIsInByb3h5UmV2aXZlck1ldGhvZCIsInByb3h5T2JqIiwiY2xvbmVOZXN0ZWRQcm94eU9iaiIsInBhdGhBcnIiLCJuZXN0ZWRQcm94eU9iaiIsIl9fcHJveHlfX2lzUHJveHkiLCJfX3Byb3h5X19wcm9wcyIsInJvb3RPYmoiLCJwcm94eUl0ZXJhYmxlIiwiaXRlck9iaiIsIml0ZXJQYXRoIiwiZGF0YVBhdGgiLCJlbnRyaWVzIiwicHJwIiwiZ2V0UHJvcFR5cGUiLCJjbG9uZWRQYXRoIiwiY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqIiwiaXNBcnIiLCJpc09iaiIsIm9iIiwiZnJvbVBhaXJzIiwidG9QYWlycyIsIkNoYW5uZWxQYXlsb2FkIiwic3JjRWxlbWVudCIsImV2ZW50IiwidGltZUxhYmVsIiwiY2hhbm5lbCIsInRpbWUiLCJjaGFubmVsUGF5bG9hZEl0ZW1PYmoiLCJmcm96ZW5QYXlsb2FkIiwiZGVlcEZyZWV6ZSIsInBheWxvYWRTdHIiLCJjaGFubmVsQWN0aW9uc0FyciIsInZhbGlkYXRlQWN0aW9uIiwibWVyZ2VBbGwiLCJjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcyIsIiRkaXIiLCJfZGlyIiwibG9jYXRpb24iLCJnZXRMb2NhdGlvbkRhdGEiLCJkZWZpbmVQcm9wZXJ0aWVzIiwidGltZUVuZCIsImFyciIsImlzSW5BcnIiLCJwaWNrQWxsIiwid2luZG93IiwiZ2V0U3RyZWFtSXRlbSIsImRlZXBDbG9uZSIsImVsSXNEb21FbGVtZW50IiwibHRlIiwiZGVmYXVsdFRvIiwiZnJlZXplIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImlzRnJvemVuIiwiZ2V0TW91c2VFdmVudEtleXMiLCJiYXNlQ29yZU1peGlucyIsImNyZWF0ZXByb3BzTWFwIiwid20iLCJXZWFrTWFwIiwib2JqS2V5IiwidnNpZCIsInByb3BzIiwid2Vha01hcCIsImdjIiwibSIsImNyZWF0ZUlkIiwiTWF0aCIsInJhbmRvbSIsInJlcGxhY2UiLCJzdWJzdHJpbmciLCJzZXRUcmFjZUZ1bmMiLCJnZXRDb25zdHJ1Y3Rvck5hbWUiLCJzdWJzdHIiLCJtYXRjaCIsImNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwiLCJpc05vdEVtcHR5IiwiY29tcGxlbWVudCIsImlzRW1wdHkiLCJ2YWx1ZXMiLCJpc05vdE5pbCIsImlzTmlsIiwiaXNOb3ROaWxBbmRJc05vdEVtcHR5Iiwic2V0UHJvdG90eXBlT2YiLCJnZXRQcm90b3R5cGVPZiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInNlYWwiLCJhcHBseSIsImNvbnN0cnVjdCIsIlJlZmxlY3QiLCJ4IiwiZnVuIiwidGhpc1ZhbHVlIiwiYXJncyIsIkZ1bmMiLCJhcnJheUZvckVhY2giLCJ1bmFwcGx5IiwiYXJyYXlQb3AiLCJwb3AiLCJhcnJheVB1c2giLCJzdHJpbmdUb0xvd2VyQ2FzZSIsInRvTG93ZXJDYXNlIiwic3RyaW5nVG9TdHJpbmciLCJzdHJpbmdNYXRjaCIsInN0cmluZ1JlcGxhY2UiLCJzdHJpbmdJbmRleE9mIiwic3RyaW5nVHJpbSIsInRyaW0iLCJvYmplY3RIYXNPd25Qcm9wZXJ0eSIsInJlZ0V4cFRlc3QiLCJSZWdFeHAiLCJ0eXBlRXJyb3JDcmVhdGUiLCJmdW5jIiwiVHlwZUVycm9yIiwiX2xlbjIiLCJhcmd1bWVudHMiLCJfa2V5MiIsInRoaXNBcmciLCJfbGVuIiwiX2tleSIsImFkZFRvU2V0IiwidHJhbnNmb3JtQ2FzZUZ1bmMiLCJsIiwiZWxlbWVudCIsImxjRWxlbWVudCIsImNsZWFuQXJyYXkiLCJpbmRleCIsIm9iamVjdCIsIm5ld09iamVjdCIsInByb3BlcnR5IiwibG9va3VwR2V0dGVyIiwiZGVzYyIsImh0bWwkMSIsInN2ZyQxIiwic3ZnRmlsdGVycyIsInN2Z0Rpc2FsbG93ZWQiLCJtYXRoTWwkMSIsIm1hdGhNbERpc2FsbG93ZWQiLCJodG1sIiwic3ZnIiwibWF0aE1sIiwieG1sIiwiTVVTVEFDSEVfRVhQUiIsIkVSQl9FWFBSIiwiVE1QTElUX0VYUFIiLCJEQVRBX0FUVFIiLCJBUklBX0FUVFIiLCJJU19BTExPV0VEX1VSSSIsIklTX1NDUklQVF9PUl9EQVRBIiwiQVRUUl9XSElURVNQQUNFIiwiRE9DVFlQRV9OQU1FIiwiQ1VTVE9NX0VMRU1FTlQiLCJFWFBSRVNTSU9OUyIsIl9fcHJvdG9fXyIsImdldEdsb2JhbCIsInB1cmlmeSIsImNyZWF0ZURPTVB1cmlmeSIsIkRPTVB1cmlmeSIsInZlcnNpb24iLCJyZW1vdmVkIiwibm9kZVR5cGUiLCJpc1N1cHBvcnRlZCIsIm9yaWdpbmFsRG9jdW1lbnQiLCJjdXJyZW50U2NyaXB0IiwiRG9jdW1lbnRGcmFnbWVudCIsIkhUTUxUZW1wbGF0ZUVsZW1lbnQiLCJOb2RlIiwiRWxlbWVudCIsIk5vZGVGaWx0ZXIiLCJOYW1lZE5vZGVNYXAiLCJNb3pOYW1lZEF0dHJNYXAiLCJIVE1MRm9ybUVsZW1lbnQiLCJET01QYXJzZXIiLCJ0cnVzdGVkVHlwZXMiLCJFbGVtZW50UHJvdG90eXBlIiwiY2xvbmVOb2RlIiwicmVtb3ZlIiwiZ2V0TmV4dFNpYmxpbmciLCJnZXRDaGlsZE5vZGVzIiwiZ2V0UGFyZW50Tm9kZSIsInRlbXBsYXRlIiwiY29udGVudCIsIm93bmVyRG9jdW1lbnQiLCJ0cnVzdGVkVHlwZXNQb2xpY3kiLCJlbXB0eUhUTUwiLCJpbXBsZW1lbnRhdGlvbiIsImNyZWF0ZU5vZGVJdGVyYXRvciIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImltcG9ydE5vZGUiLCJob29rcyIsImFmdGVyU2FuaXRpemVBdHRyaWJ1dGVzIiwiYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzIiwiYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTSIsImJlZm9yZVNhbml0aXplQXR0cmlidXRlcyIsImJlZm9yZVNhbml0aXplRWxlbWVudHMiLCJiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTSIsInVwb25TYW5pdGl6ZUF0dHJpYnV0ZSIsInVwb25TYW5pdGl6ZUVsZW1lbnQiLCJ1cG9uU2FuaXRpemVTaGFkb3dOb2RlIiwiY3JlYXRlSFRNTERvY3VtZW50IiwiSVNfQUxMT1dFRF9VUkkkMSIsIkFMTE9XRURfVEFHUyIsIkRFRkFVTFRfQUxMT1dFRF9UQUdTIiwiQUxMT1dFRF9BVFRSIiwiREVGQVVMVF9BTExPV0VEX0FUVFIiLCJDVVNUT01fRUxFTUVOVF9IQU5ETElORyIsInRhZ05hbWVDaGVjayIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiYXR0cmlidXRlTmFtZUNoZWNrIiwiYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzIiwiRk9SQklEX1RBR1MiLCJGT1JCSURfQVRUUiIsIkFMTE9XX0FSSUFfQVRUUiIsIkFMTE9XX0RBVEFfQVRUUiIsIkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIiwiQUxMT1dfU0VMRl9DTE9TRV9JTl9BVFRSIiwiU0FGRV9GT1JfVEVNUExBVEVTIiwiU0FGRV9GT1JfWE1MIiwiV0hPTEVfRE9DVU1FTlQiLCJTRVRfQ09ORklHIiwiRk9SQ0VfQk9EWSIsIlJFVFVSTl9ET00iLCJSRVRVUk5fRE9NX0ZSQUdNRU5UIiwiUkVUVVJOX1RSVVNURURfVFlQRSIsIlNBTklUSVpFX0RPTSIsIlNBTklUSVpFX05BTUVEX1BST1BTIiwiS0VFUF9DT05URU5UIiwiSU5fUExBQ0UiLCJVU0VfUFJPRklMRVMiLCJGT1JCSURfQ09OVEVOVFMiLCJERUZBVUxUX0ZPUkJJRF9DT05URU5UUyIsIkRBVEFfVVJJX1RBR1MiLCJERUZBVUxUX0RBVEFfVVJJX1RBR1MiLCJVUklfU0FGRV9BVFRSSUJVVEVTIiwiREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTIiwiTUFUSE1MX05BTUVTUEFDRSIsIlNWR19OQU1FU1BBQ0UiLCJIVE1MX05BTUVTUEFDRSIsIk5BTUVTUEFDRSIsIklTX0VNUFRZX0lOUFVUIiwiQUxMT1dFRF9OQU1FU1BBQ0VTIiwiREVGQVVMVF9BTExPV0VEX05BTUVTUEFDRVMiLCJNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMiLCJIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyIsIkNPTU1PTl9TVkdfQU5EX0hUTUxfRUxFTUVOVFMiLCJQQVJTRVJfTUVESUFfVFlQRSIsIlNVUFBPUlRFRF9QQVJTRVJfTUVESUFfVFlQRVMiLCJDT05GSUciLCJmb3JtRWxlbWVudCIsImlzUmVnZXhPckZ1bmN0aW9uIiwidGVzdFZhbHVlIiwiRnVuY3Rpb24iLCJfcGFyc2VDb25maWciLCJjZmciLCJBRERfVVJJX1NBRkVfQVRUUiIsIkFERF9EQVRBX1VSSV9UQUdTIiwiQUxMT1dFRF9VUklfUkVHRVhQIiwiQUREX1RBR1MiLCJBRERfQVRUUiIsInRhYmxlIiwidGJvZHkiLCJUUlVTVEVEX1RZUEVTX1BPTElDWSIsImNyZWF0ZUhUTUwiLCJjcmVhdGVTY3JpcHRVUkwiLCJwdXJpZnlIb3N0RWxlbWVudCIsImNyZWF0ZVBvbGljeSIsInN1ZmZpeCIsIkFUVFJfTkFNRSIsImhhc0F0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInBvbGljeU5hbWUiLCJzY3JpcHRVcmwiLCJfIiwiX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSIsIkFMTF9TVkdfVEFHUyIsIkFMTF9NQVRITUxfVEFHUyIsIl9mb3JjZVJlbW92ZSIsIm5vZGUiLCJyZW1vdmVDaGlsZCIsIl9yZW1vdmVBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGVOb2RlIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiX2luaXREb2N1bWVudCIsImRpcnR5IiwiZG9jIiwibGVhZGluZ1doaXRlc3BhY2UiLCJtYXRjaGVzIiwiZGlydHlQYXlsb2FkIiwicGFyc2VGcm9tU3RyaW5nIiwiZG9jdW1lbnRFbGVtZW50IiwiY3JlYXRlRG9jdW1lbnQiLCJpbm5lckhUTUwiLCJib2R5IiwiaW5zZXJ0QmVmb3JlIiwiY3JlYXRlVGV4dE5vZGUiLCJjaGlsZE5vZGVzIiwiX2NyZWF0ZU5vZGVJdGVyYXRvciIsIlNIT1dfRUxFTUVOVCIsIlNIT1dfQ09NTUVOVCIsIlNIT1dfVEVYVCIsIlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIsIlNIT1dfQ0RBVEFfU0VDVElPTiIsIl9pc0Nsb2JiZXJlZCIsIm5vZGVOYW1lIiwidGV4dENvbnRlbnQiLCJhdHRyaWJ1dGVzIiwibmFtZXNwYWNlVVJJIiwiaGFzQ2hpbGROb2RlcyIsIl9pc05vZGUiLCJfZXhlY3V0ZUhvb2tzIiwiY3VycmVudE5vZGUiLCJob29rIiwiX3Nhbml0aXplRWxlbWVudHMiLCJ0YWdOYW1lIiwiYWxsb3dlZFRhZ3MiLCJmaXJzdEVsZW1lbnRDaGlsZCIsIl9pc0Jhc2ljQ3VzdG9tRWxlbWVudCIsInBhcmVudE5vZGUiLCJjaGlsZENsb25lIiwiX19yZW1vdmFsQ291bnQiLCJwYXJlbnQiLCJwYXJlbnRUYWdOYW1lIiwiQm9vbGVhbiIsIl9jaGVja1ZhbGlkTmFtZXNwYWNlIiwiZXhwciIsIl9pc1ZhbGlkQXR0cmlidXRlIiwibGNUYWciLCJsY05hbWUiLCJfc2FuaXRpemVBdHRyaWJ1dGVzIiwiaG9va0V2ZW50IiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJrZWVwQXR0ciIsImFsbG93ZWRBdHRyaWJ1dGVzIiwiZm9yY2VLZWVwQXR0ciIsImF0dHIiLCJnZXRBdHRyaWJ1dGVUeXBlIiwic2V0QXR0cmlidXRlTlMiLCJfc2FuaXRpemVTaGFkb3dET00iLCJmcmFnbWVudCIsInNoYWRvd05vZGUiLCJzaGFkb3dJdGVyYXRvciIsIm5leHROb2RlIiwic2FuaXRpemUiLCJpbXBvcnRlZE5vZGUiLCJyZXR1cm5Ob2RlIiwiZmlyc3RDaGlsZCIsIm5vZGVJdGVyYXRvciIsInNoYWRvd3Jvb3QiLCJzaGFkb3dyb290bW9kZSIsInNlcmlhbGl6ZWRIVE1MIiwib3V0ZXJIVE1MIiwiZG9jdHlwZSIsInNldENvbmZpZyIsImNsZWFyQ29uZmlnIiwiaXNWYWxpZEF0dHJpYnV0ZSIsInRhZyIsImFkZEhvb2siLCJlbnRyeVBvaW50IiwiaG9va0Z1bmN0aW9uIiwicmVtb3ZlSG9vayIsInJlbW92ZUhvb2tzIiwicmVtb3ZlQWxsSG9va3MiLCJfc2FuaXRpemVIVE1MIiwiaXNDb25maWd1cmVkIiwiRG9tRWxlbWVudFRlbXBsYXRlIiwiZm9ybWF0VGVtcGxhdGUiLCJpc1Byb3h5RGF0YSIsIl9fY21zX19pc1Byb3h5Iiwic3B5bmVEYXRhIiwiY2hlY2tGb3JBcnJheURhdGEiLCJ0ZW1wbGF0ZURhdGEiLCJzdHJBcnIiLCJnZXRTdHJpbmdBcnJheSIsInN0ck1hdGNoZXMiLCJmaW5kVG1wbExvb3BzUkUiLCJwYXJzZVRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcEZuIiwicGFyc2VUaGVUbXBsTG9vcCIsImZpbmRUbXBsTG9vcHNQcmVkIiwiX18iLCJjaGVja0Zvck1hdGNoZXMiLCJpZkVsc2UiLCJhZGRQYXJhbXMiLCJmaW5hbEFyciIsImlzUHJpbWl0aXZlVGFnIiwiZ2V0TmVzdGVkRGF0YVJlZHVjZXIiLCJwYXJhbSIsInNwbGl0IiwibmVzdGVkRGF0YSIsImVtcHR5UkUiLCJyZWplY3QiLCJzIiwic3dhcFBhcmFtc0ZvclRhZ3NSRSIsInJlbW92ZVRoaXMiLCJyZW5kZXJEb2NGcmFnIiwicmVwbGFjZUltZ1BhdGgiLCJlbCIsImNyZWF0ZVJhbmdlIiwiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50Iiwic2V0VGltZW91dCIsInJlbmRlclRvU3RyaW5nIiwiZ2V0VGVtcGxhdGVTdHJpbmciLCJnZXREYXRhVmFsRnJvbVBhdGhTdHIiLCJwYXRoU3RyIiwiZGF0YUZpbGUiLCJwMSIsInAyIiwicDMiLCJ0ZW1wbGF0ZVN0ciIsInJlcGxhY2VBbGwiLCJyZURvdCIsInN1YlN0ciIsImVsRGF0YSIsImFycmF5U3RyaW5nVG9PYmpBZGFwdGVyIiwicGFyc2VTdHJpbmciLCJwYXJzZU9iamVjdCIsInNweW5lTG9vcEtleSIsImxvb3BJbmRleCIsImxvb3BOdW0iLCJfX2Ntc19fZGF0YUlkIiwib3JpZ0tleSIsImNyZWF0ZURhdGFPYmoiLCJpdGVtIiwib3JpZ0luZGV4IiwiaGFzaCIsImRhdGFSZWR1Y2VkVmFsIiwiRG9tRWxlbWVudCIsImdldERvbUF0dHJpYnV0ZXMiLCJhdHRycyIsInVwZGF0ZUF0dHJzIiwiYWRkTWl4aW5zIiwic2V0RWxBdHRycyIsInBhcmFtcyIsImZvckVhY2hPYmpJbmRleGVkIiwiZGF0YXNldCIsInRoZU1hcCIsIm1hcE9iakluZGV4ZWQiLCJhZGRUZW1wbGF0ZSIsImZyYWciLCJhZGRUbXBsIiwiYWRkQ29udGVudCIsInRleHQiLCJ0eHQiLCJleGVjdXRlIiwicGlwZSIsInJlbmRlciIsInJlbmRlclRvSFRNTFN0cmluZyIsInJldHVybklmRGVmaW5lZCIsInVwZGF0ZXByb3BzIiwidXBkYXRlcHJvcHNBbmRSdW4iLCJ1bm1vdW50IiwidXBkYXRlVGFnIiwidXBkYXRlQXR0cmlidXRlcyIsInVwZGF0ZVRlbXBsYXRlIiwidXBkYXRlRGF0YSIsImFkZFRhZ0FuZFJlbmRlciIsImFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyIiwiYWRkVGVtcGxhdGVBbmRSZW5kZXIiLCJhZGREYXRhQW5kUmVuZGVyIiwiY29yZU1peGlucyIsInBpY2siLCJhdHRyaWJ1dGVzQXJyYXkiLCJjcmVhdGVGYWRlcklubGluZVRleHQiLCJpc0luQm9vbCIsInQiLCJzdGFydFplcm9Cb29sIiwiVmlld1N0cmVhbU9ic2VydmFibGUiLCJvYnNlcnZhYmxlU3RyZWFtcyIsImNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMiLCJjcmVhdGVEaXJlY3Rpb25hbEZpbHRlcnNPYmplY3QiLCJkaXJJbnRlcm5hbCIsImRpclBhcmVudCIsImRpckNoaWxkIiwiUCIsIkMiLCJQQ0kiLCJDSSIsIlBJIiwiUEMiLCJhZGREZWZhdWx0RGlyIiwiZmxpcCIsIm1lcmdlUmlnaHQiLCJkZWZhdWx0cyIsImFkZERvd25JbnRlcm5hbERpciIsImFkZENoaWxkQW5kSW50ZXJuYWxEaXIiLCJtYXBUb0RlZmF1bHREaXIiLCJwIiwib2JzJCIsInZpZXdOYW1lIiwiZmlsdGVyU3RyZWFtcyIsInByb3BTYXRpc2ZpZXMiLCJhcnJUeXBlIiwiZmlsdGVyUGFyZW50IiwiZmlsdGVyQ2hpbGQiLCJmaWx0ZXJJbnRlcm5hbCIsImFkZGZyb20kIiwicmVsU3RyIiwiZnJvbSQiLCJhZGRQYXJlbnRmcm9tJCIsImFkZEludGVybmFsZnJvbSQiLCJhZGRDaGlsZGZyb20kIiwicmF3JCIsImZpbHRlciIsInRvSW50ZXJuYWwkIiwidG9QYXJlbnQkIiwidG9DaGlsZCQiLCJzdHJlYW1PYmoiLCJpbnRlcm5hbCIsImNoaWxkIiwiY29tcGxldGVBbGwiLCJjb21wbGV0ZSIsImlzU3RvcHBlZCIsImNvbXBsZXRlU3RyZWFtIiwiVmlld1N0cmVhbUVsZW1lbnQiLCJzaW5rJCIsInZpZXdQcm9wcyIsInZzTmFtZSIsIl9zdGF0ZSIsImV4dGVuZGVkSGFzaE1ldGhvZHMiLCJvcHRpb25zIiwiYWRkQWN0aW9uTGlzdGVuZXJzIiwiZnVuY1N0ciIsImhhc2hNZXRob2RzIiwic2V0SGFzaE1ldGhvZHMiLCJvbk9ic1NpbmtTdWJzY3JpYmUiLCIkZGlycyIsInNvdXJjZVN0cmVhbXMiLCJfc291cmNlJCIsImV4dGVuZGVkSGFzaE1ldGhvZHNPYmoiLCJWU19ERVRSSVRVU19DT0xMRUNUIiwib25HYXJiYWdlQ29sbGVjdCIsIlJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUIiwib25SZWFkeUZvckdDIiwiRVhUSVJQQVRFIiwib25EaXNwb3NlIiwiVlNfU1BBV04iLCJvblJlbmRlciIsIlZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UIiwib25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudCIsIlZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fRE9NIiwib25SZW5kZXJBbmRBdHRhY2hUb0RvbSIsIkFUVEFDSF9DSElMRF9UT19TRUxGIiwib25BdHRhY2hDaGlsZFRvU2VsZiIsImNyZWF0ZURvbUl0ZW0iLCJvbkRpc3Bvc2VDb21wbGV0ZWQiLCJhbmltYXRlSW5Ud2VlbiIsImN1cnJlbnRPcGFjaXR5IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9wYWNpdHkiLCJpbmxpbmVDc3MiLCJzdHlsZSIsImNzc1RleHQiLCJmYWRlaW4iLCJhbmltYXRlT3V0VHdlZW4iLCJjYWxsYmFjayIsImFkZEV2ZW50TGlzdGVuZXIiLCJmYWRlb3V0Iiwic2V0QW5pbWF0ZUluIiwiYW5pbWF0ZUluIiwiZG9tSXRlbSIsImFuaW1hdGVJblRpbWUiLCJkaXNwb3NlTWV0aG9kIiwiZ2NEYXRhIiwiZmFkZU91dE9icyIsImJpbmRDYWxsYmFjayIsImFuaW1hdGVPdXRUaW1lIiwib25GYWRlb3V0Q29tcGxldGVkIiwiYW5pbWF0ZU91dCIsInJlbW92ZVN0cmVhbSIsImdldFNvdXJjZVN0cmVhbSIsImNvbWJpbmVEb21JdGVtcyIsImNvbnRhaW5lciIsInF1ZXJ5IiwiYWZ0ZXIiLCJhdHRhY2hUeXBlIiwiY2hpbGRSZW5kZXJEYXRhIiwicmVuZGVyRG9tSXRlbSIsImdldEVsIiwiSSIsImV4dGVuZGVkTWV0aG9kcyIsImF0dGFjaERhdGEiLCJkZWZhdWx0VG9GbiIsInNlbmREYXRhIiwiVmlld1N0cmVhbVBheWxvYWQiLCJzZW5kVG9EaXJlY3RvclN0cmVhbSIsImRpcmVjdG9yU3RyZWFtJCIsImlzRGV2TW9kZSIsIlZpZXdTdHJlYW1Ccm9hZGNhc3RlciIsImJyb2FkY2FzdEZuIiwiYnJvYWRjYXN0ZXIiLCJhZGREYmxDbGlja0V2dCIsInEiLCJmcm9tRXZlbnQiLCJ0eXBlT3ZlclJpZGUiLCJicm9hZGNhc3QiLCJjaGFubmVsUGF5bG9hZHMiLCJVSSIsInNlbmRVSVBheWxvYWQiLCJzZW5kUm91dGVQYXlsb2FkIiwic2VsZWN0b3IiLCJsb2NhbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJjaGVja1BhcmVudEVscyIsImVsU2VsZWN0ZWQiLCJwYXJlbnRFbGVtZW50IiwicGx1Y2tFbEZyb21QYXJlbnQiLCJpc0xvY2FsRXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImRvbU1hcCIsImNvbnZlcnREb21TdHJpbmdNYXBUb09iaiIsIm9taXQiLCJpZCIsInNyY0V2ZW50IiwiYXJyRm4iLCJzdHJlYW1NaXhpbnMiLCJvYnMiLCJpc05vbkVtcHR5U3RyIiwiaXNOb25FbXB0eUFyciIsImlzTm9uRW1wdHlPYmplY3RGbiIsIkNoYW5uZWxQYXlsb2FkRmlsdGVyIiwiZmlsdGVycyIsImRlYnVnTGFiZWwiLCJ0ZXN0TW9kZSIsImRlYnVnTGFiZWxBcnIiLCJmaW5kIiwicHJvcEZpbHRlcnMiLCJhZGRTdHJpbmdTZWxlY3RvckZpbHRlciIsImZpbHRlclNlbGVjdG9yIiwiYWRkQXJyYXlTZWxlY3RvckZpbHRlciIsImFkZERhdGFGaWx0ZXIiLCJmaWx0ZXJEYXRhIiwiZmlsdGVyc0FyciIsImZpbHRlcnNBcmVFbXB0eSIsImFsd2F5cyIsImZpbHRlckpzb24iLCJmaWx0ZXJkZWJ1Z0xhYmVsIiwiY29tcGFyZVN0ciIsImZuVmFsIiwiZk1ldGhvZCIsIndoZXJlIiwiY29tcGFyZWRPYmoiLCJwcm9wc0Jvb2xlYW5zIiwidiIsImFzc2lnbiIsImNvbXBhcmVEYXRhIiwiY2hlY2tQYXlsb2FkU2VsZWN0b3IiLCJzcmNQYXlsb2FkIiwiYWNjIiwic3JjIiwiY29tcGFyZUVscyIsImVsQ29tcGFyZSIsImlzRXF1YWxOb2RlIiwibWFwTm9kZUFycldpdGhFbCIsInNlbCIsIm5vZGVBcnIiLCJmbGF0dGVuIiwibm9kZUFyclJlc3VsdHNEZWJ1Z2dlciIsInNlbGVjdG9yc0FyciIsIm5vZGVBcnJSZXN1bHQiLCJhbnkiLCJlcXVhbHMiLCJxdWVyeVNlbGVjdG9yIiwic2VsZWN0b3JBcnIiLCJjdXJyeSIsInBheWxvYWRDaGVjayIsImdldEVsT3JMaXN0IiwiY3h0IiwidmVyYm9zZUJvb2wiLCJsaXN0IiwiZ2V0Tm9kZUxpc3RBcnJheSIsInRlc3RTZWxlY3RvcnMiLCJpc1ZhbGlkU2VsZWN0b3IiLCJpc1ZhbGlkU2VsZWN0b3JCb29sIiwiaXNQYXJlbnQiLCJlbEFyciIsInJldHVyblNlbGVjdG9ySWZWYWxpZCIsInNldElubGluZUNzcyIsIlZpZXdTdHJlYW1TZWxlY3RvciIsImdlbmVyYXRlU3B5bmVTZWxlY3RvcklkIiwiYWRkQ2xhc3MiLCJjIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlQ2xhc3MiLCJzZXRDbGFzcyIsInJlbW92ZUNsYXNzU3RyQXJyIiwiY2xhc3NOYW1lIiwiY2xhc3NTdHJBcnIiLCJ0b2dnbGVDbGFzcyIsImJvb2wiLCJjb250YWlucyIsInRvZ2dsZSIsImh0bWxFbGVtZW50IiwiYWRkQW5pbUNsYXNzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0QWN0aXZlSXRlbSIsImVsU2VsIiwiY3VycmVudEVsIiwibm9kZUNoZWNrIiwiVmlld1N0cmVhbSIsInZzbnVtIiwiX3Bvc3RSZW5kZXJDYWxsZWQiLCJzZW5kTGlmZWN5bGVFdmVudHMiLCJoYXNoSWQiLCJpZCQiLCJ2aWV3Q2xhc3MiLCJleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyIsImFkZERlZmF1bHREaXJlY3Rpb24iLCJzZW5kTGlmZWN5Y2xlTWV0aG9kIiwic2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSIsInNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSIsImF0dHJpYnV0ZXNBcnIiLCJkb21BdHRyaWJ1dGVzIiwidHJhaXRzIiwiYWRkVHJhaXRzIiwibG9hZEFsbE1ldGhvZHMiLCJWaWV3Q2xhc3MiLCJ2aWV3IiwiX3Jhd1NvdXJjZSQiLCJzZW5kRXZlbnRzRG93blN0cmVhbSIsInNlbmRFdmVudHNEb3duU3RyZWFtRm4iLCJpbml0Vmlld1N0cmVhbSIsImFkZGVkQ2hhbm5lbHMiLCJjaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMiLCJzb3VyY2UkIiwiY2hlY2tJZkFjdGlvbnNBcmVSZWdpc3RlcmVkIiwiY2hhbm5lbHNBcnIiLCJhY3Rpb25zQXJyIiwiY2hlY2tGb3JNYXRjaCIsInN0ck1hdGNoIiwicmUiLCJmaW5kSW5kZXgiLCJnZXRBbGxBY3Rpb25zQXJyIiwiY2hhbm5lbFN5bnRheCIsImEiLCJnZXRBbGxBY3Rpb25zIiwiaXNWYWxpZE5lc3RlZEFyciIsImV2ZW50c0FyciIsImlzVHJ1ZSIsImFsbElzVHJ1ZSIsImlzU3RyaW5nIiwiaXNWYWxpZEFyciIsIm1hcEV2ZW50c0FyckZuIiwidXBkYXRlUHJvcHNUb01hdGNoRWwiLCJnZXRUYWdOYW1lIiwidG9Mb3dlciIsImVpdGhlciIsImVsSXNSZWFkeUJvb2wiLCJwb3N0UmVuZGVyIiwiY2hhbm5lbEZuIiwib25DaGFubmVsTWV0aG9kQ2FsbCIsImFjdGlvbkZpbHRlciIsImhhc2hTb3VyY2VNZXRob2RzIiwic2V0U291cmNlSGFzaE1ldGhvZHMiLCJkZWxldGVkIiwiZmlsdGVyUGF5bG9hZCIsInJ1bkZ1bmMiLCJoYXNoU291cmNlS2V5cyIsIkVYVElSUEFUSU5HIiwiY2hlY2tQYXJlbnREaXNwb3NlIiwiZGlzcG9zZVZpZXdTdHJlYW0iLCJWU19TUEFXTkVEIiwib25WU1JlbmRlcmVkIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UIiwib25SZWFkeVRvR0MiLCJWU19OVUxMSVRZIiwib25NYXBWaWV3U291cmNlIiwidGFrZVdoaWxlIiwibm90R0NTVEFURSIsImluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zIiwidXBkYXRlU291cmNlU3Vic2NyaXB0aW9uIiwiZXFHQ1NUQVRFIiwibm90Q09NUExFVEVEIiwibm90R0NDT01QTEVURSIsInRlc3RWYWwiLCJhZGRQYXJlbnRTdHJlYW0iLCJwYXJlbnQkIiwicmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJhZGRDaGlsZFN0cmVhbSIsImNoaWxkJCIsInRhcCIsInRyYWNlciIsImZpbmFsaXplIiwib25DaGlsZENvbXBsZXRlZCIsIm9uQ2hpbGREaXNwb3NlZCIsImNoaWxkQ29tcGxldGVkRGF0YSIsImZpbmFsRGVzdCIsInkiLCJmaW5kTmFtZSIsInN1YnNjcmliZXIiLCJvblN1YnNjcmliZVRvU291cmNlc05leHQiLCJvblN1YnNjcmliZVRvU291cmNlc0Vycm9yIiwib25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSIsImVsJCIsInViZXJTb3VyY2UkIiwiYXV0b1N1YnNjcmliZXIkIiwiZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkIiwib2JzQ291bnQiLCJhdXRvTWVyZ2VTdWJqZWN0JCIsIm1lcmdlTWFwIiwib2JzRGF0YSIsImJyYW5jaE9ic2VydmFibGUkIiwiYXV0b0Nsb3Nlc0Jvb2wiLCJyZWwiLCJzZW5kRXh0ZW5kZWRTdHJlYW1zIiwiaGFzaEFjdGlvblN0ciIsImNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMiLCJvcGVuU3BpZ290IiwicmVuZGVyVmlldyIsInJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbSIsIm9uQmVmb3JlRGlzcG9zZSIsIm1zIiwibWV0aG9kRm4iLCJvbkNoaWxkRGlzcG9zZSIsIm9uUGFyZW50RGlzcG9zaW5nIiwiaXNJbnRlcm5hbCIsInNldEF0dGFjaERhdGEiLCJjaGVja1F1ZXJ5IiwiZ2V0UGFyZW50RWxzIiwibnVtIiwiZ2V0RWxlbSIsIml0ZXIiLCJwYXJlbnRFbCIsInNldEF0dGFjaFBhcmVudERhdGEiLCJsZXZlbCIsImV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQiLCJjaGlsZFZpZXciLCJhcHBlbmRUb0RvbSIsImFwcGVuZFRvRG9tQWZ0ZXIiLCJwcmVwZW5kVG9Eb20iLCJhcHBlbmRWaWV3IiwiYXBwZW5kVmlld0FmdGVyIiwiYXBwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlldyIsImFwcGVuZFRvTnVsbCIsImdldEVsZW1lbnRCeUlkIiwiX3Bvc3RSZW5kZXJlZENhbGxlZCIsImJlZm9yZUFmdGVyUmVuZGVyIiwiYWZ0ZXJSZW5kZXIiLCJvblJlbmRlcmVkIiwib25BbmltRnJhbWVBZnRlclJlbmRlcmVkIiwiYnJvYWRjYXN0RXZlbnRzIiwiaW5pdGlhbGl6ZUNoYW5uZWxzIiwidmlld3NTdHJlYW1Ccm9hZGNhc3RlciIsImFmdGVyQnJvYWRjYXN0RXZlbnRzIiwiVHJhaXRDbGFzcyIsInB1bGxBY3Rpb25zRnJvbUxpc3QiLCJuZXN0ZWRBY3Rpb25zQXJyIiwiY2hlY2tGb3JFeGlzdGluZ01ldGhvZCIsImRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzIiwic2V0RGF0YVZTSUQiLCJkb3duU3RyZWFtIiwiZ2V0Q2hhbm5lbCIsIm9ic2VydmVyIiwic2tpcEZpcnN0IiwiYWRkQ2hhbm5lbCIsInNlbmREb3duU3RyZWFtIiwiZGlyZWN0aW9uQXJyIiwiaXNMb2NhbEV2ZW50Q2hlY2siLCJjaWRDaGVjayIsInBpcGVBcnIiLCJwbCIsImZpbHRlckV2ZW50IiwidW5zaGlmdCIsInNraXAiLCJjaGFubmVsJCIsImNoZWNrSWZDaGFubmVsRXhpc3RzIiwiY2hhbm5lbEV4aXN0cyIsInNlbmRJbmZvVG9DaGFubmVsIiwiZGVmYXVsdFRvQWN0aW9uIiwiZ2V0QWN0aW9uRm4iLCJDSEFOTkVMX1JPVVRFIiwib2YiLCJpc0Rpc3Bvc2VkIiwiY3JlYXRlQWN0aW9uRmlsdGVyIiwic2VsZWN0b3JzIiwiY2hhbm5lbFBheWxvYWRJdGVtIiwiaXRlbUVsIiwidGhpc0VsIiwiUm91dGVDaGFubmVsVXBkYXRlciIsImNyZWF0ZVRlbXBvcmFyeVZpZXdTdHJlYW1PYmoiLCJzZW5kUm91dGVDaGFubmVsVXBkYXRlIiwidnMiLCJDaGFubmVsIiwiQ0hBTk5FTF9OQU1FIiwiYWRkUmVnaXN0ZXJlZEFjdGlvbnMiLCJjcmVhdGVDaGFubmVsQWN0aW9uc09iaiIsImV4dGVuZGVkQWN0aW9uc0FyciIsImRlZmF1bHRBY3Rpb25zIiwiaXNSZWdpc3RlcmVkIiwiaXNQcm94eSIsImRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCIsInNlbmRDYWNoZWRQYXlsb2FkIiwic2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbCIsImNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzIiwic3RyZWFtc0NvbnRyb2xsZXIiLCJvYnNlcnZlciQiLCJnZXRNYWluT2JzZXJ2ZXIiLCJjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSIsImRpc3BhdGNoZXJTdHJlYW0kIiwicGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lIiwicHJvcEVxIiwib25SZWNlaXZlZE9ic2VydmFibGUiLCJSZXBsYXlTdWJqZWN0Iiwib25DaGFubmVsSW5pdGlhbGl6ZWQiLCJvblJlZ2lzdGVyZWQiLCJjaGFubmVsQWN0aW9ucyIsInNlbmRDaGFubmVsUGF5bG9hZCIsImNoZWNrRm9yVHJhaXRzIiwiaW5pdGlhbGl6ZVN0cmVhbSIsImFjdGlvbnNPYmoiLCJhY3Rpb25zT2JqSXNFbXB0eSIsImRhdGFJc0FkZGVkIiwiYWN0aW9uU3RyIiwic2V0RGVmYXVsdEFjdGlvbnNPYmoiLCJzZXRUcmFjZSIsImdldEFjdGlvblZhbCIsImlkZW50aXR5IiwibWFpbkFyciIsImNoYWluIiwib2JqT2YiLCJkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCIsIm1ldGhvZFN0ciIsImdldEFyck1ldGhvZCIsImxlbnNJbmRleCIsImNoYW5uZWxBY3Rpb25NZXRob2RzIiwib25JbmNvbWluZ09ic2VydmFibGUiLCJnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlIiwidW5wYWNrZWQiLCJkZWZhdWx0Rm4iLCJvblZpZXdTdHJlYW1JbmZvIiwiZXFzTmFtZSIsImRhdGFPYmoiLCJvYnNWYWwiLCJtZXJnZVByb3BzIiwib25TdWNjZXNzIiwib25FcnJvciIsInBheWxvYWRGaWx0ZXIiLCJjaGVja0Zvck5vdFRyYWNrRmxhZyIsImRvTm90VHJhY2siLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIiwiY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgiLCJwYXJhbVZhbHVlIiwicm91dGVPYmoiLCJyZWplY3RQYXJhbUtleSIsImtleXNBcnIiLCJyZWdleE1hdGNoU3RyIiwiY2hlY2tlciIsImFzc29jIiwiZm9ybWF0U3RyQXNXaW5kb3dMb2NhdGlvbiIsInNlYXJjaCIsInBhdGhuYW1lIiwiZ2V0TG9jYXRpb25TdHJCeVR5cGUiLCJpc0hhc2giLCJsb2MiLCJwcm9wVmFsIiwic2xhc2giLCJjcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyIsInJvdXRlIiwicGFyYW1zRnJvbUxvYyIsInVybEFyciIsImxvb3BUaHJvdWdoUGFyYW0iLCJ1cmxPYmoiLCJrZXl3b3JkIiwicm91dGVOYW1lIiwicGFyYW1WYWxGcm9tRGF0YSIsInBhcmFtVmFsVHlwZSIsImlzT2JqZWN0Iiwib2JqZWN0UGFyYW1FeGlzdHMiLCJoYXMiLCJvYmplY3RDb250YWluc1JvdXRlIiwibmV3T2JqIiwicm91dGVQYXRoIiwiY3JlYXRlU2xhc2hTdHJpbmciLCJhcnJDbGVhciIsIm5vdFVuZGVmaW5lZCIsIndoZW4iLCJzdHJpcFJlZ2V4Iiwiam9pbmVyIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJjcmVhdGVQYWlyIiwiY2hlY2tQYWlyIiwibWFwQXJyYXlPZlBhaXJzIiwiY2hlY2tJZlN0cklzRW1wdHkiLCJjcmVhdGVRcyIsImNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzIiwidXJsc0FyciIsImdldE92ZXJyaWRlVmFsIiwib3ZlcnJpZGVWYWwiLCJjaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyIsImlucHV0IiwiZ2V0U3RyaW5nQmVmb3JlUGlwZSIsImNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoIiwidXBkYXRlZE9iaiIsImdsb2JQYXR0ZXJuIiwic29tZSIsInBhdHRlcm4iLCJlc2NhcGVkUGF0dGVybiIsImdsb2JQYXR0ZXJuTWF0Y2giLCJjb252ZXJ0UGFyYW1zVG9Sb3V0ZSIsImxvY1N0ciIsInVybFR5cGUiLCJyb3V0ZXMiLCJsb2NhdGlvblN0ciIsInBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24iLCJjb252ZXJ0Um91dGVUb1BhcmFtcyIsInJvdXRlRGF0YSIsImZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgiLCJtYWluU3RyIiwicGFyYW1zQXJyIiwiY2hlY2tGb3JFbXB0eSIsImNoZWNrRm9yRWl0aGVyU3RyT3JSZU1hdGNoIiwiZmluZExhc3RJbmRleCIsImZpbmRNYXRjaEluZGV4IiwiY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbSIsInJlZ2V4VG9rZW5zIiwibGFzdCIsImdldFZhbENvbXBhcmVBcnIiLCJwYXJhbUluZGV4IiwicGFyYW1TdHIiLCJpbnZlcnRlZE9iaiIsImludmVydCIsInBhcmFtSW52ZXJ0ZWQiLCJnZXRQYXJhbUludmVydGVkIiwiY3JlYXRlQXJyRnJvbVNsYXNoU3RyIiwiY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaiIsInRvcExldmVsUm91dGUiLCJyb3V0ZVZhbHVlIiwidmFsdWVzQXJyIiwicGF0aHMiLCJyb3V0ZWRWYWx1ZXNBcnIiLCJsYXRlc3RPYmoiLCJ0b3RhbCIsImN1cnJlbnRWYWx1ZSIsInJvdXRlVmFsdWVTdHIiLCJpc0VtcHR5T3JOaWwiLCJwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgiLCJzdHJQYXRoIiwib2JqZWN0RnJvbVN0ciIsIm9iamVjdEZyb21Sb3V0ZVBhcmFtIiwiemlwT2JqIiwicGF0aElubmVybW9zdCIsImdldExhc3RBcnJWYWwiLCJjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIiLCJjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyIsImNvbnZlcnRUb1BhcmFtcyIsInJvdXRlQ29uZmlnIiwiY3JlYXRlUG9wU3RhdGVTdHJlYW0iLCJzdWJzY3JpYmVGbiIsImZyb21FdmVudFBhdHRlcm4iLCJoYW5kbGVyIiwib25wb3BzdGF0ZSIsImNvbXBhcmVSb3V0ZUtleXdvcmRzIiwicGlja1ZhbHVlcyIsIm9iajEiLCJjb21wYXJlIiwib2JqMiIsImNyZWF0ZVByZWQiLCJnZXRQcm9wc1N0YXRlIiwic2FtZSIsInByZXZpb3VzRXhpc3RzIiwibmV4dEV4aXN0cyIsImNoYW5nZWQiLCJhZGRlZCIsInVuaXEiLCJwYXRoc0NoYW5nZWQiLCJwYXRoc0FkZGVkIiwicGF0aHNSZW1vdmVkIiwiZ2V0Q29tcGFyZXIiLCJnZXRSb3V0ZUFyckRhdGEiLCJyb3V0ZUFyciIsImZsYXR0ZW5Db25maWdPYmplY3QiLCJnbyIsIm9ial8iLCJrIiwia18iLCJ2XyIsImFkZFJvdXRlRGF0YXNldHMiLCJjaGFubmVsUm91dGVPYmoiLCJnZXRIUkVGIiwiaXNWYWxpZFN0clJFIiwiY3JlYXRlSW5pdGlhbFZhbEZuIiwiYWNjTWFpbiIsInJvdXRlUGF0aE9iaiIsIm9iakFjYyIsImFyclBhaXIiLCJnZXRMaW5rVGV4dCIsInRvVXBwZXJDYXNlIiwiY3JlYXRlVGl0bGUiLCJzdWJSb3V0ZU5hbWUiLCJvQmFzZSIsIm5hdkxldmVsIiwidGl0bGUiLCJyZWR1Y2VkQXJyIiwicm91dGVEYXRhc2V0c0FyciIsInJvdXRlTmFtZXNBcnIiLCJkYXRhc2V0c0FyciIsImV4Y2x1ZGUiLCJnZXRNYWluS2V5cyIsImdldE5hdlByb3BzIiwiY2hhbm5lbHNSb3V0ZVBhdGgiLCJhZGQ0MDRzIiwicGFyc2VSb3V0ZVBhdGgiLCJjb25maWdNYXBwZXJGbiIsIm9iajQwNCIsImlzUm91dGVQYXRoIiwibWVyZ2VEZWVwUmlnaHQiLCJleHRyYVJvdXRlRGF0YSIsIlNweW5lQ2hhbm5lbFJvdXRlIiwic3VwZXIiLCJyb3V0ZUNvbmZpZ0pzb24iLCJnZXRSb3V0ZUNvbmZpZyIsImJpbmRTdGF0aWNNZXRob2RzIiwibmF2VG9TdHJlYW0kIiwiaW5mbyIsIm9uTWFwTmV4dCIsImNoZWNrQ29uZmlnRm9ySGFzaCIsImluaXRTdHJlYW0iLCJ1cGRhdGVSb3V0ZUNvbmZpZyIsIm5ld1JvdXRlc09iaiIsImJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEiLCJzcHluZUNvbmZpZyIsImZpcnN0TG9hZFN0cmVhbSQiLCJvbkluY29taW5nRG9tRXZlbnQiLCJtZXJnZSIsImZpcnN0TG9hZGVkIiwicmVtb3ZlU1NJRCIsInJvdXRlTGVucyIsImxlbnNQcm9wIiwib3ZlciIsIm9taXRTU0lEIiwiZXZ0IiwiYWN0biIsIkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UIiwiZXZlbnRDb3VudCIsImlzSGlzdG9yeUNvdW50IiwiTnVtYmVyIiwiZ2V0RGF0YUZyb21TdHJpbmciLCJyb3V0ZUNvdW50IiwibGlua3NEYXRhIiwia2V5d29yZEFycnMiLCJjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzIiwiY2hlY2tGb3JFdmVudE1ldGhvZHMiLCJtZXRob2RzQXJyIiwiZ2V0TWV0aG9kcyIsIm1ldGhvZFVwZGF0ZSIsInA0IiwibWV0aG9kU3RyUmVwbGFjZSIsInJ1bk1ldGhvZCIsImNoZWNrRm9yRW5kUm91dGUiLCJkZWJ1Z0Jvb2wiLCJvblJlZHVjZVJvdXRlUGF0aHMiLCJyb3V0ZU5hbWVWYWwiLCJwcmVkIiwiYXJyU3RyIiwiZ2V0UHJvcFZhbCIsIm5leHRSb3V0ZVBhdGgiLCJyZXZlcnNlIiwiZW5kUm91dGVWYWxBcnIiLCJlbmRSb3V0ZVZhbCIsImdldERhdGFGcm9tUGFyYW1zIiwiY2hhbmdlTG9jYXRpb25Cb29sIiwiaXNIaWRkZW4iLCJzZW5kUm91dGVTdHJlYW0iLCJjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMiLCJyZWdleFRva2VuT2JqIiwiY2hhbmdlV2luZG93TG9jIiwic2V0V2luZG93TG9jYXRpb24iLCJnZXRSb3V0ZVN0YXRlIiwiZ2V0SXNEZWVwTGlua0Jvb2wiLCJpc0hpc3RvcnkiLCJfcm91dGVDb3VudCIsImdldFJvdXRlQ291bnQiLCJnZXRFeHRyYVBheWxvYWRQYXJhbXMiLCJpc0RlZXBMaW5rIiwicm91dGVUeXBlIiwiZ2V0Um91dGVTdHJGcm9tUGFyYW1zIiwiZ2V0UHJvcEZyb21Db25maWciLCJkZWZhbHQiLCJ0eXBlRm9yU3RyIiwiaXNIYXNoRm9yU3RyIiwibmV4dFdpbmRvd0xvYyIsImRhdGFGcm9tU3RyIiwiZ2V0RGF0YUZyb21Mb2NhdGlvblN0ciIsImhhc2hJc1RydWUiLCJnZXRQYXJhbXNGcm9tUm91dGVTdHIiLCJwYXJhbXNEYXRhIiwiY2hlY2tFbXB0eVJvdXRlU3RyIiwiaXNFbXB0eUJvb2wiLCJyZW1vdmVMYXN0U2xhc2giLCJjaGFubmVsUGF5bG9hZCIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJjaGVja0ZvclNsYXNoIiwiZ2V0V2luZG93TG9jYXRpb24iLCJjdXJyaWVkR2V0Um91dGUiLCJjdXJyeU4iLCJTcHluZUNoYW5uZWxVSSIsImtleUV2ZW50c0xvYWRlZCIsImtleUNvZGVBcnIiLCJsb2FkS2V5U3RyZWFtIiwia2V5VXBzIiwia2V5UHJlc3NlcyQiLCJncm91cEJ5Iiwia2V5Q29kZSIsInJlcGVhdCIsIm9uS2V5UHJlc3NlZCIsImFkZEtleUV2ZW50IiwicmVnaXN0ZXJLZXkiLCJvblVJRXZlbnQiLCJnZXRBY3Rpb25TdGF0ZSIsInR5cGVWYWwiLCJ0eXBlT3ZlclJpZGVWYWwiLCJ0b1VwcGVyIiwiZXZlbnRUeXBlIiwibWFpbkFjdGlvbiIsIlNweW5lVXRpbHNDaGFubmVsV2luZG93IiwiY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCIsImV2ZW50TmFtZSIsIm1hcEZuIiwiaXNQYXNzaXZlIiwicGFzc2l2ZSIsImNyZWF0ZU1lZGlhUXVlcnkiLCJtcSIsIm1hdGNoTWVkaWEiLCJjaGVja0lmVmFsaWRNZWRpYVF1ZXJ5Iiwibm9TcGFjZXMiLCJpc1ZhbGlkQm9vbCIsIm1lZGlhIiwid2Fybk1zZyIsImNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyIiwibWFwS2V5IiwibWVkaWFRdWVyeU5hbWUiLCJrZXlGbiIsIm1lZGlhUXVlcnlIYW5kbGVyIiwiYWRkSGFuZGxlciIsImFkZExpc3RlbmVyIiwicmVtb3ZlSGFuZGxlciIsIm9uY2hhbmdlIiwiY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaiIsIm1lZGlhUXVlcmllc09iaiIsIm1lZGlhUXVlcmllcyIsIlNweW5lQ2hhbm5lbFdpbmRvdyIsImN1cnJlbnRTY3JvbGxZIiwiZG9tQ2hhbm5lbENvbmZpZyIsIldJTkRPVyIsIm9icyRBcnIiLCJnZXRBY3RpdmVPYnNlcnZhYmxlcyIsImRvbSQiLCJnZXRNb3VzZVdoZWVsTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCIsInNjcm9sbERpciIsImRlbHRhWSIsImRlbHRhWCIsImRlbHRhWiIsImNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQiLCJtYXBHZW5lcmljRXZlbnQiLCJjdXJyeUZuIiwiZ2V0UmVzaXplTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19SRVNJWkVfRVZFTlQiLCJnZXRPcmllbnRhdGlvbk1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlQiLCJpc1BvcnRyYWl0Qm9vbCIsIm9yaWVudGF0aW9uIiwiZ2V0TWVkaWFRdWVyeU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQiLCJjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZSIsImRlYm91bmNlVCIsImRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsIiwiZGVib3VuY2VUaW1lIiwiZ2V0U2Nyb2xsRGF0YSIsInNjcm9sbFkiLCJzY3JvbGxEaXN0YW5jZSIsImdldFNjcm9sbFkiLCJzY3JvbGxFbGVtZW50IiwicGFnZVlPZmZzZXQiLCJzY3JvbGxUb3AiLCJnZXRTY3JvbGxNYXBGbiIsImludGVydmFsIiwic2Nyb2xsRGF0YUZuIiwiY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZSIsImRUaW1lIiwiaXNXaW5kb3ciLCJzY3JvbGxFbEZvclZhbHMiLCJzY3JvbGxNYXBGbiIsInBhcnRpYWxSaWdodCIsInNraXBXaGlsZSIsIm5ld1Njcm9sbFkiLCJzY3JvbGxEaXN0YW5jZUFicyIsImFicyIsImNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZSIsImNyZWF0ZVJlc2l6ZU9ic2VydmFibGUiLCJkZWJvdW5jZU1TVGltZUZvclJlc2l6ZSIsImdldEV2ZW50c0Zyb21Db25maWciLCJldmVudHMiLCJsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMiLCJtZXRob2RzIiwibGlzdGVuRm9yUmVzaXplIiwibGlzdGVuRm9yT3JpZW50YXRpb24iLCJsaXN0ZW5Gb3JTY3JvbGwiLCJsaXN0ZW5Gb3JXaGVlbCIsImNoZWNrRm9yTWVkaWFRdWVyaWVzIiwiZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUiLCJvblNjcm9sbExvY2tFdmVudCIsIm9uU2V0RWxlbWVudFRvU2Nyb2xsIiwiU3B5bmVDaGFubmVsTGlmZWN5Y2xlIiwib25TZW5kRXZlbnQiLCJDaGFubmVsUHJveHkiLCJzdWJqZWN0JCIsInJlcGxheVN1YiQiLCJjaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eSIsImdldE1lcmdlZFN1YmplY3QiLCJwZXJpc3REYXRhIiwiYXN5bmMiLCJQcm9taXNlIiwicmVzb2x2ZSIsImRlbGF5Q2FsbCIsInJlcGxheVN1YmplY3QiLCJzdWJqZWN0IiwiX21hcCIsIkNoYW5uZWxzTWFwIiwiZ2V0Q2hhbm5lbHNMaXN0Iiwic2hvd09ubHlQcm94aWVzIiwicHJveHlNYXAiLCJyZWplY3RQcm94eUZuIiwiZmlsdGVyUHJveHlGbiIsInJlbW92ZWRQcm94eUFyciIsInBsdWNrIiwibGlzdFByb3h5Q2hhbm5lbHMiLCJjaGVja0Zvck1pc3NpbmdDaGFubmVscyIsImZpbHRlclByb3h5QXJyIiwiZmlsdGVyUHJlZml4V2FybmluZyIsImNyZWF0ZU1haW5TdHJlYW1zIiwicm91dGVTdHJlYW0iLCJ1aVN0cmVhbSIsImRvbVN0cmVhbSIsInZpZXdTdHJlYW1MaWZlY3ljbGUiLCJyZWdpc3RlclN0cmVhbSIsInBhdGhFcSIsImlzUmVwbGF5U3ViamVjdCIsInN1YmplY3RUeXBlIiwiU3B5bmVUcmFpdCIsInBhcmVudENvbnRleHQiLCJwcmVmaXgiLCJhdXRvSW5pdCIsIm9taXR0ZWRNZXRob2RzIiwiYXV0b0JpbmRlciIsImFsbE1ldGhvZHNMaXN0IiwiaW5pdEF1dG9CaW5kZXIiLCJnZXRFbmhhbmNlck1ldGhvZHMiLCJpbnN0YW5jZSIsImNvbWJpbmVkT21pdHRlZE1ldGhvZHMiLCJvbWl0UHJvcHNGcm9tQXJyIiwid2l0aG91dCIsInN0YXRpY01ldGhvZHMiLCJhbGxNZXRob2RzIiwiZ2V0QWxsTWV0aG9kTmFtZXMiLCJjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMiLCJtYWxmb3JtZWRNZXRob2RzQXJyIiwid2FybmluZ1N0ciIsImJpbmRQYXJlbnRWaWV3U3RyZWFtIiwiY29udGV4dCIsImJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtIiwiaXNTdGF0aWMiLCJjb25zdHJ1Y3RvclR5cGUiLCJiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSIsImJpbmRDdXJyeSIsIkNoYW5uZWxGZXRjaFV0aWwiLCJfbWFwRm4iLCJzZXRNYXBGbiIsIl91cmwiLCJzZXRVcmwiLCJfcmVzcG9uc2VUeXBlIiwic2V0UmVzcG9uc2VUeXBlIiwiX3NlcnZlck9wdGlvbnMiLCJzZXRTZXJ2ZXJPcHRpb25zIiwiX3N1YnNjcmliZXIiLCJmZXRjaFByb3BzIiwidXJsIiwic2VydmVyT3B0aW9ucyIsInJlc3BvbnNlVHlwZSIsInN0YXJ0V2luZG93RmV0Y2giLCJ0YXBMb2ciLCJyZXNwb25zZSQiLCJmZXRjaCIsImZsYXRNYXAiLCJtYXBNZXRob2QiLCJtZXRhZGF0YSIsIm1hcFdyYXBwZXIiLCJwdWJsaXNoIiwiY29ubmVjdCIsIm9wdHMiLCJnZXRGbiIsInN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzIiwicHJvcElzIiwiY29udmVydFRvSlNPTiIsInVwZGF0ZU1ldGhvZFdoZW5Cb2R5RXhpc3RzIiwiaGFzQm9keSIsIm1ldGhvZElzR2V0IiwibWVyZ2VkT3B0aW9ucyIsImJhc2VPcHRpb25zIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJBY2NlcHQiLCJtb2RlIiwiY3JlZGVudGlhbHMiLCJjYWNoZSIsInJlZGlyZWN0IiwicmVmZXJyZXIiLCJyZWZlcnJlclBvbGljeSIsImludGVncml0eSIsImtlZXBhbGl2ZSIsIkNoYW5uZWxGZXRjaCIsInZhbGlkYXRlTWFwTWV0aG9kIiwiaXNVbmRlZmluZWRPcldyb25nVHlwZSIsImlzVW5kZWZpbmVkIiwiaXNOb3RVbmRlZmluZWRBbmRJc05vdEVtcHR5Iiwic3RhcnRGZXRjaCIsImV4dGVuZGVkQXJyIiwib25GZXRjaFJldHVybmVkIiwiY29uc29saWRhdGVBbGxGZXRjaFByb3BzIiwib25GZXRjaFVwZGF0ZSIsInByb3BzT3B0aW9ucyIsImdldFByb3BzRm9yRmV0Y2giLCJzdHJlYW1JdGVtIiwiY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtIiwiZmlsdGVyT3V0VW5kZWZpbmVkIiwibzEiLCJvMiIsIlNweW5lUGx1Z2luIiwibWVyZ2VEZWZhdWx0Q29uZmlnIiwiY3JlYXRlUGFyZW50RWwiLCJnZXRTcHluZUFwcCIsIm9uQmVmb3JlUmVnaXN0ZXJlZCIsInVwZGF0ZVNweW5lQ29uZmlnIiwic3B5bmVBcHAiLCJwYXRoU2F0aXNmaWVzIiwicGx1Z2luRWwiLCJjcmVhdGVQbHVnaW5FbCIsIlNweW5lQXBwIiwic2Nyb2xsTG9jayIsInNjcm9sbExvY2tYIiwic2Nyb2xsTG9ja1kiLCJzdHJpY3QiLCJsaXN0ZW5Gb3JNb3VzZVdoZWVsIiwicGx1Z2luc0ZuIiwicmVnaXN0ZXJEYXRhQ2hhbm5lbCIsIm51bGxIb2xkZXIiLCJTcHluZSIsInBvbGljeSIsInRvX2VzY2FwZSIsInNhbml0aXplSFRNTENvbmZpZ3VyZSJdLCJzb3VyY2VSb290IjoiIn0=