@cloudflare/realtimekit 1.4.0-staging.2 → 1.4.0-staging.3

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.
@@ -1 +1 @@
1
- "use strict";var ml=Object.defineProperty,Gl=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var v=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,yl=Object.prototype.propertyIsEnumerable;var z=(Z,c,l)=>c in Z?ml(Z,c,{enumerable:!0,configurable:!0,writable:!0,value:l}):Z[c]=l,n=(Z,c)=>{for(var l in c||(c={}))pl.call(c,l)&&z(Z,l,c[l]);if(v)for(var l of v(c))yl.call(c,l)&&z(Z,l,c[l]);return Z},e=(Z,c)=>Gl(Z,Rl(c));var R=(Z,c,l)=>(z(Z,typeof c!="symbol"?c+"":c,l),l),B=(Z,c,l)=>{if(!c.has(Z))throw TypeError("Cannot "+l)};var M=(Z,c,l)=>(B(Z,c,"read from private field"),l?l.call(Z):c.get(Z)),p=(Z,c,l)=>{if(c.has(Z))throw TypeError("Cannot add the same private member more than once");c instanceof WeakSet?c.add(Z):c.set(Z,l)};var y=(Z,c,l)=>(B(Z,c,"access private method"),l);var J=(Z,c,l)=>new Promise((d,b)=>{var X=G=>{try{V(l.next(G))}catch(Y){b(Y)}},W=G=>{try{V(l.throw(G))}catch(Y){b(Y)}},V=G=>G.done?d(G.value):Promise.resolve(G.value).then(X,W);V((l=l.apply(Z,c)).next())});var I={},Yl={get exports(){return I},set exports(Z){I=Z}},u=typeof Reflect=="object"?Reflect:null,j=u&&typeof u.apply=="function"?u.apply:function(c,l,d){return Function.prototype.apply.call(c,l,d)},L;u&&typeof u.ownKeys=="function"?L=u.ownKeys:Object.getOwnPropertySymbols?L=function(c){return Object.getOwnPropertyNames(c).concat(Object.getOwnPropertySymbols(c))}:L=function(c){return Object.getOwnPropertyNames(c)};function hl(Z){console&&console.warn&&console.warn(Z)}var g=Number.isNaN||function(c){return c!==c};function m(){m.init.call(this)}Yl.exports=m;I.once=il;m.EventEmitter=m;m.prototype._events=void 0;m.prototype._eventsCount=0;m.prototype._maxListeners=void 0;var w=10;function o(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(m,"defaultMaxListeners",{enumerable:!0,get:function(){return w},set:function(Z){if(typeof Z!="number"||Z<0||g(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");w=Z}});m.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};m.prototype.setMaxListeners=function(c){if(typeof c!="number"||c<0||g(c))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+c+".");return this._maxListeners=c,this};function f(Z){return Z._maxListeners===void 0?m.defaultMaxListeners:Z._maxListeners}m.prototype.getMaxListeners=function(){return f(this)};m.prototype.emit=function(c){for(var l=[],d=1;d<arguments.length;d++)l.push(arguments[d]);var b=c==="error",X=this._events;if(X!==void 0)b=b&&X.error===void 0;else if(!b)return!1;if(b){var W;if(l.length>0&&(W=l[0]),W instanceof Error)throw W;var V=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw V.context=W,V}var G=X[c];if(G===void 0)return!1;if(typeof G=="function")j(G,this,l);else for(var Y=G.length,h=_(G,Y),d=0;d<Y;++d)j(h[d],this,l);return!0};function O(Z,c,l,d){var b,X,W;if(o(l),X=Z._events,X===void 0?(X=Z._events=Object.create(null),Z._eventsCount=0):(X.newListener!==void 0&&(Z.emit("newListener",c,l.listener?l.listener:l),X=Z._events),W=X[c]),W===void 0)W=X[c]=l,++Z._eventsCount;else if(typeof W=="function"?W=X[c]=d?[l,W]:[W,l]:d?W.unshift(l):W.push(l),b=f(Z),b>0&&W.length>b&&!W.warned){W.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(c)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=Z,V.type=c,V.count=W.length,hl(V)}return Z}m.prototype.addListener=function(c,l){return O(this,c,l,!1)};m.prototype.on=m.prototype.addListener;m.prototype.prependListener=function(c,l){return O(this,c,l,!0)};function ul(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function D(Z,c,l){var d={fired:!1,wrapFn:void 0,target:Z,type:c,listener:l},b=ul.bind(d);return b.listener=l,d.wrapFn=b,b}m.prototype.once=function(c,l){return o(l),this.on(c,D(this,c,l)),this};m.prototype.prependOnceListener=function(c,l){return o(l),this.prependListener(c,D(this,c,l)),this};m.prototype.removeListener=function(c,l){var d,b,X,W,V;if(o(l),b=this._events,b===void 0)return this;if(d=b[c],d===void 0)return this;if(d===l||d.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete b[c],b.removeListener&&this.emit("removeListener",c,d.listener||l));else if(typeof d!="function"){for(X=-1,W=d.length-1;W>=0;W--)if(d[W]===l||d[W].listener===l){V=d[W].listener,X=W;break}if(X<0)return this;X===0?d.shift():Jl(d,X),d.length===1&&(b[c]=d[0]),b.removeListener!==void 0&&this.emit("removeListener",c,V||l)}return this};m.prototype.off=m.prototype.removeListener;m.prototype.removeAllListeners=function(c){var l,d,b;if(d=this._events,d===void 0)return this;if(d.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):d[c]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete d[c]),this;if(arguments.length===0){var X=Object.keys(d),W;for(b=0;b<X.length;++b)W=X[b],W!=="removeListener"&&this.removeAllListeners(W);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=d[c],typeof l=="function")this.removeListener(c,l);else if(l!==void 0)for(b=l.length-1;b>=0;b--)this.removeListener(c,l[b]);return this};function r(Z,c,l){var d=Z._events;if(d===void 0)return[];var b=d[c];return b===void 0?[]:typeof b=="function"?l?[b.listener||b]:[b]:l?Nl(b):_(b,b.length)}m.prototype.listeners=function(c){return r(this,c,!0)};m.prototype.rawListeners=function(c){return r(this,c,!1)};m.listenerCount=function(Z,c){return typeof Z.listenerCount=="function"?Z.listenerCount(c):A.call(Z,c)};m.prototype.listenerCount=A;function A(Z){var c=this._events;if(c!==void 0){var l=c[Z];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}m.prototype.eventNames=function(){return this._eventsCount>0?L(this._events):[]};function _(Z,c){for(var l=new Array(c),d=0;d<c;++d)l[d]=Z[d];return l}function Jl(Z,c){for(;c+1<Z.length;c++)Z[c]=Z[c+1];Z.pop()}function Nl(Z){for(var c=new Array(Z.length),l=0;l<c.length;++l)c[l]=Z[l].listener||Z[l];return c}function il(Z,c){return new Promise(function(l,d){function b(W){Z.removeListener(c,X),d(W)}function X(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,c,X,{once:!0}),c!=="error"&&al(Z,b,{once:!0})})}function al(Z,c,l){typeof Z.on=="function"&&q(Z,"error",c,l)}function q(Z,c,l,d){if(typeof Z.on=="function")d.once?Z.once(c,l):Z.on(c,l);else if(typeof Z.addEventListener=="function")Z.addEventListener(c,function b(X){d.once&&Z.removeEventListener(c,b),l(X)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Z)}class $ extends I.EventEmitter{constructor(l){super();R(this,"logger");this.logger=l,super.setMaxListeners(25)}emit(l,...d){return super.emit("*",l,...d),super.emit(l,...d)}on(l,d){var b;try{const X=this.listenerCount(l);X>25&&X%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.on(l,d)}addListener(l,d){var b;try{const X=this.listenerCount(l);X>25&&X%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.addListener(l,d)}off(l,d){return super.off(l,d)}once(l,d){return super.once(l,d)}prependListener(l,d){return super.prependListener(l,d)}prependOnceListener(l,d){return super.prependOnceListener(l,d)}removeListener(l,d){return super.removeListener(l,d)}removeAllListeners(l){return super.removeAllListeners(l)}listeners(l){return super.listeners(l)}listenerCount(l){return super.listenerCount(l)}}const F="realtimekit_e2ee",nl="RealtimeKitFrameEncryptionKey",Fl={sharedKey:!1,ratchetSalt:nl,ratchetWindowSize:8};function x(){return typeof window.RTCRtpScriptTransform!="undefined"}function Ll(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Il(Z){return J(this,null,function*(){const c=new TextEncoder;return yield crypto.subtle.importKey("raw",c.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function sl(){return Ll()||x()}class Hl extends ${constructor(l={}){super(void 0);R(this,"keyInfoMap");R(this,"options");R(this,"onKeyRatcheted",(l,d)=>{});this.keyInfoMap=new Map,this.options=n(n({},Fl),l),this.on("keyRatcheted",this.onKeyRatcheted)}onSetEncryptionKey(l,d,b){const X={key:l,participantId:d,keyIndex:b};this.keyInfoMap.set(`${d!=null?d:"shared"}-${b!=null?b:0}`,X),this.emit("setKey",X)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,d){this.emit("ratchetRequest",l,d)}}class Sl extends Hl{constructor(l={}){const d=e(n({},l),{sharedKey:!0});super(d);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const d=yield Il(l);this.onSetEncryptionKey(d)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var N=(Z=>(Z.NEW_PRODUCER="NEW_PRODUCER",Z.ROOM_NODE_CONNECTION_ERROR="ROOM_NODE_CONNECTION_ERROR",Z.SOCKET_SERVICE_ROOM_JOINED="SOCKET_SERVICE_ROOM_JOINED",Z.SOCKET_SERVICE_RECONNECTED="SOCKET_SERVICE_RECONNECTED",Z.SOCKET_SERVICE_DISCONNECTED="SOCKET_SERVICE_DISCONNECTED",Z.SOCKET_SERVICE_FAILED="SOCKET_SERVICE_FAILED",Z.SOCKET_STATE_UPDATE="SOCKET_STATE_UPDATE",Z.ROOM_NODE_RECONNECTED="ROOM_NODE_RECONNECTED",Z.ROOM_NODE_DISCONNECTED="ROOM_NODE_DISCONNECTED",Z.ROOM_NODE_FAILED="ROOM_NODE_FAILED",Z.TRANSPORT_STATE_UPDATE="TRANSPORT_STATE_UPDATE",Z.PRODUCER_SCORE_UPDATE="PRODUCER_SCORE_UPDATE",Z.CONSUMER_SCORE_UPDATE="CONSUMER_SCORE_UPDATE",Z.PRODUCER_STATUS_UPDATE="PRODUCER_STATUS_UPDATE",Z.CONSUMER_STATUS_UPDATE="CONSUMER_STATUS_UPDATE",Z.LOW_CONSUMER_SCORE="LOW_CONSUMER_SCORE",Z.MEDIA_PERMISSION_ERROR="MEDIA_PERMISSION_ERROR",Z.MEDIA_PERMISSION_UPDATE="MEDIA_PERMISSION_UPDATE",Z.MESSAGE="websocket/message",Z.ROOM_MESSAGE="websocket/room-message",Z.PEER_JOINED_INTERNAL="peer/joined-internal",Z.PEER_CLOSED="websocket/peer-closed",Z.CONSUMER_CLOSED="websocket/consumer-closed",Z.CONSUMER_PAUSED="websocket/consumer-paused",Z.CONSUMER_RESUMED="websocket/consumer-resumed",Z.PRODUCER_CLOSED="websocket/producer-closed",Z.NEW_CONSUMER="websocket/new-consumer",Z.PRODUCER_SCORE="websocket/producer-score",Z.CONSUMER_SCORE="websocket/consumer-score",Z.PRODUCER_TOGGLE="cf/producer-toggle",Z.UPDATE_ACTIVE="media/update-active",Z.RESET_PRODUCER_STATE="cf/reset-producer-state",Z.ROOM_STATE="sockethub/room-state",Z.GET_STAGE_REQUESTS="GET_STAGE_REQUESTS",Z.UPDATE_STAGE_REQUESTS="UPDATE_STAGE_REQUESTS",Z.KICK_PEER="KICK_PEER",Z.UPDATE_PEER_STAGE_STATUS="UPDATE_PEER_STAGE_STATUS",Z.JOIN_MEDIA_ROOM="JOIN_MEDIA_ROOM",Z.LEAVE_MEDIA_ROOM="LEAVE_MEDIA_ROOM",Z.PIP_HANGUP="PIP_HANGUP",Z.E2EE_ACTIVE_PRODUCER="E2EE_ACTIVE_PRODUCER",Z.E2EE_INACTIVE_PRODUCER="E2EE_INACTIVE_PRODUCER",Z.E2EE_ACTIVE_CONSUMER="E2EE_ACTIVE_CONSUMER",Z.E2EE_INACTIVE_CONSUMER="E2EE_INACTIVE_CONSUMER",Z.SOCKET_PEERS="SOCKET_PEERS",Z.UPDATE_PERMISSIONS="UPDATE_PERMISSIONS",Z.MAX_SPATIAL_LAYER_CHANGE="MAX_SPATIAL_LAYER_CHANGE",Z.MUTE_SELF="MUTE_SELF",Z.MUTE_SELF_VIDEO="MUTE_SELF_VIDEO",Z))(N||{});const ll="dmFyIHdkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxNZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFpzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsa2Q9T2JqZWN0LmdldFByb3RvdHlwZU9mLE9kPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksTGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxEZD1SZWZsZWN0LmdldDt2YXIgc3I9KGssTyxBKT0+TyBpbiBrP3dkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6QX0pOmtbT109QSxRPShrLE8pPT57Zm9yKHZhciBBIGluIE98fChPPXt9KSlPZC5jYWxsKE8sQSkmJnNyKGssQSxPW0FdKTtpZihacylmb3IodmFyIEEgb2YgWnMoTykpTGQuY2FsbChPLEEpJiZzcihrLEEsT1tBXSk7cmV0dXJuIGt9LG90PShrLE8pPT5NZChrLEFkKE8pKTt2YXIgcD0oayxPLEEpPT4oc3Ioayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLEEpLEEpLGVuPShrLE8sQSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitBKX07dmFyIGVlPShrLE8sQSk9PihlbihrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksQT9BLmNhbGwoayk6Ty5nZXQoaykpLEl0PShrLE8sQSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLEEpfSxDZT0oayxPLEEsZGUpPT4oZW4oayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLEEpOk8uc2V0KGssQSksQSk7dmFyIHRuPShrLE8sQSk9PkRkKGtkKGspLEEsTyk7dmFyIEk9KGssTyxBKT0+bmV3IFByb21pc2UoKGRlLHd0KT0+e3ZhciBNdD1ZPT57dHJ5e0llKEEubmV4dChZKSl9Y2F0Y2goYmUpe3d0KGJlKX19LHE9WT0+e3RyeXtJZShBLnRocm93KFkpKX1jYXRjaChiZSl7d3QoYmUpfX0sSWU9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO0llKChBPUEuYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciBYcyxWZSxuZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsQT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sSWU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxzKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLHMpfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gcm4odCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIG5yPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBMKCl7TC5pbml0LmNhbGwodGhpcyl9SWUuZXhwb3J0cz1MLHEub25jZT1vbixMLkV2ZW50RW1pdHRlcj1MLEwucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEwucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEwucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBpcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEwsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxucih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtpcj10fX0pLEwuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sTC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxucihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gYXIodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9MLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUwucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBhcih0aGlzKX0sTC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10scz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspZS5wdXNoKGFyZ3VtZW50c1tzXSk7dmFyIG49cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMCluPW4mJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighbilyZXR1cm4hMTtpZihuKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxtPXVyKG8sbCkscz0wO3M8bDsrK3MpYmUobVtzXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBvcih0LHIsZSxzKXt2YXIgbixpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1zP1tlLGFdOlthLGVdOnM/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxuPWFyKHQpLG4+MCYmYS5sZW5ndGg+biYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLHJuKGQpfXJldHVybiB0fUwucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCExKX0sTC5wcm90b3R5cGUub249TC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsTC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gc24oKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGNyKHQscixlKXt2YXIgcz17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0sbj1zbi5iaW5kKHMpO3JldHVybiBuLmxpc3RlbmVyPWUscy53cmFwRm49bixufUwucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGNyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGNyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgcyxuLGksYSxkO2lmKGR0KGUpLG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz1uW3JdLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz09PWV8fHMubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgbltyXSxuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLHMubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPXMubGVuZ3RoLTE7YT49MDthLS0paWYoc1thXT09PWV8fHNbYV0ubGlzdGVuZXI9PT1lKXtkPXNbYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9zLnNoaWZ0KCk6bm4ocyxpKSxzLmxlbmd0aD09PTEmJihuW3JdPXNbMF0pLG4ucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEwucHJvdG90eXBlLm9mZj1MLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixMLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUscyxuO2lmKHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocy5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOnNbcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgc1tyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMocyksYTtmb3Iobj0wO248aS5sZW5ndGg7KytuKWE9aVtuXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPXNbcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iobj1lLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW25dKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gZHIodCxyLGUpe3ZhciBzPXQuX2V2ZW50cztpZihzPT09dm9pZCAwKXJldHVybltdO3ZhciBuPXNbcl07cmV0dXJuIG49PT12b2lkIDA/W106dHlwZW9mIG49PSJmdW5jdGlvbiI/ZT9bbi5saXN0ZW5lcnx8bl06W25dOmU/YW4obik6dXIobixuLmxlbmd0aCl9TC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiBkcih0aGlzLHIsITApfSxMLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIGRyKHRoaXMsciwhMSl9LEwubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpsci5jYWxsKHQscil9LEwucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9bHI7ZnVuY3Rpb24gbHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9TC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHVyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxzPTA7czxyOysrcyllW3NdPXRbc107cmV0dXJuIGV9ZnVuY3Rpb24gbm4odCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBhbih0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIG9uKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscyl7ZnVuY3Rpb24gbihhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSkscyhhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixuKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9cHIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmY24odCxuLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBjbih0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJnByKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIHByKHQscixlLHMpe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKXMub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIG4oaSl7cy5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixuKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIFQ7KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoVHx8KFQ9e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgZG49bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLFQuTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxULk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sVC5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixULk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxULk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELFQuTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsVC5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixULk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLFQuTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxULk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULFQuTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULFQuTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxULk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELFQuTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsVC5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLFQuTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxULk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLFQuTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsVC5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsVC5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixULk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLFQuTUlOT1JfRVZFTlRdXSk7Y2xhc3MgbG57Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgdW4gZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6cyxhcGlIb3N0bmFtZXM6bn0pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPXMsdGhpcy5hcGlFbmRwb2ludD1gaHR0cHM6Ly8ke24uZGFDb2xsZWN0b3J9L2FwaS92MS9tZXNzYWdlYCx0aGlzLmV2ZW50U3RvcmU9bmV3IGxufXNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgbjtjb25zdCBzPXtwYXlsb2FkOmUscGVlcklkOnRoaXMucGVlcklkfTt0cnl7cmV0dXJuIHlpZWxkIGZldGNoKHRoaXMuYXBpRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeShzKX0pLCEwfWNhdGNoKGkpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtlcnJvcjppfSksKG49ZS5lbnRyaWVzKT09bnVsbHx8bi5mb3JFYWNoKGE9Pnt0aGlzLmV2ZW50U3RvcmUuYWRkKGEpfSksITF9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksZG4uZ2V0KGUuZXZlbnQpPT09VC5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBzO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7cmV0dXJuKHM9ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmcy5sZW5ndGg/KHlpZWxkIHRoaXMuc2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSksITApOiExfSl9fXZhciBocjsoZnVuY3Rpb24odCl7dC5DSFJPTUlVTT0iY2hyb211bSIsdC5GSVJFRk9YPSJmaXJlZm94Iix0LlNBRkFSST0ic2FmYXJpIn0pKGhyfHwoaHI9e30pKTtjb25zdCBmcj17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIEo7KGZ1bmN0aW9uKHQpe3QuQVVESU89IkFVRElPIix0LlZJREVPPSJWSURFTyIsdC5TUEVBS0VSPSJTUEVBS0VSIix0LlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShKfHwoSj17fSkpO3ZhciBtcjsoZnVuY3Rpb24odCl7dFt0LklOSVQ9MF09IklOSVQiLHRbdC5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHRbdC5ERU5JRUQ9Ml09IkRFTklFRCIsdFt0LlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHRbdC5GQUlMRUQ9NF09IkZBSUxFRCIsdFt0Lk5PVEZPVU5EPTVdPSJOT1RGT1VORCIsdFt0Lk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KShtcnx8KG1yPXt9KSk7ZnVuY3Rpb24gYWUodCl7cmV0dXJuIHQ/dC5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIGx0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiB1dCh7cGFja2V0c0xvc3Q6dCxwYWNrZXRzUmVjZWl2ZWQ6cn0pe3JldHVybiByK3Q+MD90KjEwMC8ocit0KTowfWNvbnN0IGdyPTI0MCxTcj03MjAsdnI9OCx5cj0zLHB0PTEwLGh0PS4wMixmdD0uMDM7ZnVuY3Rpb24gdGUoe3N0YXQ6dCx3ZWlnaHQ6cixyYW5nZU1pbjplLHJhbmdlTWF4OnMscmFuZ2VSYW5raW5nRGlyZWN0aW9uOm59KXtyZXR1cm4gdD09bnVsbD9yOmU9PT1zP249PT0iVVAiP3Q8PWU/cjowOnQ+PXM/cjowOm49PT0iVVAiPygxLU1hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnModCkpLWUsMCkvKHMtZSkpKnI6bj09PSJET1dOIj9NYXRoLm1heChNYXRoLm1pbihzLE1hdGguYWJzKHQpKS1lLDApLyhzLWUpKnI6cn1mdW5jdGlvbiBicih7aXNMb3dRdWFsaXR5VmlkZW86dCxpc1ZpZGVvU3R1Y2s6cixpc1ZpZGVvTGFnZ2luZzplLGppdHRlclF1YWxpdHk6cyxwYWNrZXRzTG9zdFF1YWxpdHk6bn0pe2NvbnN0IGk9LjgqKCh0Py44NToxKSooZT8uNzoxKSoocj8uNToxKSkrLjIqKHMqbik7cmV0dXJuIE1hdGgucm91bmQoKGkrTnVtYmVyLkVQU0lMT04pKjEwMCkvMTAwfWZ1bmN0aW9uIEVyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiBfcih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyLGppdHRlcjplfSl7Y29uc3Qgbj10ZSh7c3RhdDpFcih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyfSksd2VpZ2h0Oi43LHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPXRlKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOmh0LHJhbmdlTWF4OmZ0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIG4rYX1mdW5jdGlvbiBwbih7ZnJhbWVXaWR0aDp0LGlzU2NyZWVuU2hhcmU6cn0pe3JldHVybiB0PChyP1NyOmdyKX1mdW5jdGlvbiBobih7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/eXI6dnIpfWZ1bmN0aW9uIGZuKHtmcmFtZXNFbmNvZGVkOnR9KXtyZXR1cm4gdD09PTB9ZnVuY3Rpb24gVHIoe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50OnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9dGUoe3N0YXQ6RXIoe3BhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0Om4sd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPXBuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT1obih7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1mbih7ZnJhbWVzRW5jb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBicih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWZ1bmN0aW9uIFJyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9ZnVuY3Rpb24gUHIoe2NvbmNlYWxtZW50RXZlbnRzOnQscGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6ZSxqaXR0ZXI6c30pe2NvbnN0IGk9dGUoe3N0YXQ6dCx3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPXRlKHtzdGF0OlJyKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplfSksd2VpZ2h0OmEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9dGUoe3N0YXQ6cyx3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gaStkK2x9ZnVuY3Rpb24gbW4oe2ZyYW1lc0RlY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiBnbih7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/eXI6dnIpfWZ1bmN0aW9uIFNuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/U3I6Z3IpfWZ1bmN0aW9uIENyKHtmcmFtZVdpZHRoOnQsZnJhbWVzUGVyU2Vjb25kOnIscGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6cyxqaXR0ZXI6bixpc1NjcmVlblNoYXJlOmksZnJhbWVzRGVjb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpScih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0Om4sd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPVNuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT1nbih7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1tbih7ZnJhbWVzRGVjb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBicih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWNsYXNzIHJle2NvbnN0cnVjdG9yKHIpe3AodGhpcywicGMxIik7cCh0aGlzLCJwYzIiKTtwKHRoaXMsImNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMiKTtwKHRoaXMsImNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyIsITEpO3AodGhpcywiaWNlQ2FuZGlkYXRlRmlsdGVyIik7Y29uc3QgZT1uZXcgUlRDUGVlckNvbm5lY3Rpb24ocikscz1uZXcgUlRDUGVlckNvbm5lY3Rpb24ocik7dGhpcy5wYzE9ZSx0aGlzLnBjMj1zLHRoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJlLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHIpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLHM9ci5pbmRleE9mKGUpK2UubGVuZ3RoLG49ci5zdWJzdHIocykuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpuWzddLHByb3RvY29sOm5bMl0sYWRkcmVzczpuWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHIpe3JldHVybiByLnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdChyKXtyZXR1cm4gci50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHIpe3JldHVybiByLnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZShyKXtyZXR1cm4gci50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIocil7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUocixlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgcz1yZS5wYXJzZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZS5jYW5kaWRhdGUpO3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyKHMpJiZyLmFkZEljZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZSl9fXNldEljZUNhbmRpZGF0ZUZpbHRlcihyKXt0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1yfWNvbnN0cmFpblZpZGVvQml0cmF0ZShyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHM9cn1kaXNhYmxlVmlkZW9GZWMoKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYz0hMH1nb3RPZmZlcihyKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoLyhtPXZpZGVvIDEgW15ccl0rKSgxMTYgMTE3KShcclxuKS9nLGAkMVxyCmApLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNiByZWRcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDoxMTcgdWxwZmVjXC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6OTggcnR4XC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1mbXRwOjk4IGFwdD0xMTZcclxuL2csIiIpKSx0aGlzLnBjMS5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMyLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpLHRoaXMucGMyLmNyZWF0ZUFuc3dlcigpLnRoZW4odGhpcy5nb3RBbnN3ZXIuYmluZCh0aGlzKSx0aGlzLnJlcG9ydEZhdGFsLmJpbmQodGhpcykpfWdvdEFuc3dlcihyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMmJihyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPW1pZDp2aWRlb1xyXG4vZyxgYT1taWQ6dmlkZW9ccgpiPUFTOiR7dGhpcy5jb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzfVxyCmApKSx0aGlzLnBjMi5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMxLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpfWVzdGFibGlzaENvbm5lY3Rpb24oKXt0aGlzLnBjMS5jcmVhdGVPZmZlcigpLnRoZW4odGhpcy5nb3RPZmZlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9cmVwb3J0RmF0YWwocil7Y29uc29sZS5lcnJvcigiRXJyb3I6IixyKX1nZXRSb3VuZFRyaXBUaW1lKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3IsZV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMucGMxLmdldFN0YXRzKCksdGhpcy5wYzIuZ2V0U3RhdHMoKV0pO2xldCBzLG47aWYoci5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzU2VudD4wJiYocz1pKX0pLGUuZm9yRWFjaChpPT57aS50eXBlPT09ImNhbmRpZGF0ZS1wYWlyIiYmaS5ub21pbmF0ZWQ9PT0hMCYmaS5ieXRlc1JlY2VpdmVkPjAmJihuPWkpfSkscyYmbil0cnl7aWYocy5jdXJyZW50Um91bmRUcmlwVGltZSYmbi5jdXJyZW50Um91bmRUcmlwVGltZSlyZXR1cm57cnR0OnMuY3VycmVudFJvdW5kVHJpcFRpbWUsYmFja2VuZFJUVDpuLmN1cnJlbnRSb3VuZFRyaXBUaW1lfTtjb25zdCBpPShuLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcC1zLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wKS8xZTM7cmV0dXJue3J0dDppLGJhY2tlbmRSVFQ6aX19Y2F0Y2goaSl7cmV0dXJufX0pfWNsb3NlKCl7dGhpcy5wYzEuY2xvc2UoKSx0aGlzLnBjMi5jbG9zZSgpfX1jbGFzcyBJciBleHRlbmRzIHF7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtwKHRoaXMsImNhbGwiKTtwKHRoaXMsInRpbWVPdXQiKTt0aGlzLmNhbGw9bmV3IHJlKGUpfXN0YXJ0KGU9MWU0KXt0aGlzLmNhbGwuZXN0YWJsaXNoQ29ubmVjdGlvbigpLHRoaXMudGltZU91dD1zZXRUaW1lb3V0KHRoaXMudGVzdEZhaWxlZC5iaW5kKHRoaXMpLGUpfXRlc3RDb21wbGV0ZShlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0KSx0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImRvbmUiLGUpfXRlc3RGYWlsZWQoZSl7dGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJmYWlsZWQiLGUpfX1jb25zdCB2bj04LHluPTEvMWUzO2NsYXNzIGJuIGV4dGVuZHMgSXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7cCh0aGlzLCJzZW5kZXJDaGFubmVsIik7cCh0aGlzLCJyZWNpZXZlQ2hhbm5lbCIpO3AodGhpcywic3RhcnRUaW1lIik7cCh0aGlzLCJsYXN0Qml0cmF0ZU1lYXN1cmVUaW1lIik7cCh0aGlzLCJzZW50UGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInJlY2lldmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsImxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcyIsMCk7cCh0aGlzLCJzdG9wU2VuZGluZyIsITEpO3AodGhpcywidGVzdFByb2dyZXNzIiwwKTtwKHRoaXMsInNhbXBsZVBhY2tldCIsIiIpO3AodGhpcywiZmluYWxCaXRyYXRlU3VtIiwwKTtwKHRoaXMsImJpdFJhdGVTYW1wZWxzIiwwKTtwKHRoaXMsIm1heE51bWJlck9mUGFja2V0c1RvU2VuZCIsMCk7cCh0aGlzLCJieXRlc1RvS2VlcEJ1ZmZlcmVkIiwwKTtwKHRoaXMsInRlc3REdXJhdGlvblNlY29uZHMiLDUpO3RoaXMuY2FsbC5zZXRJY2VDYW5kaWRhdGVGaWx0ZXIocmUuaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IHM9MDtzPDEwMjQqMjU2O3MrPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBuPTA7biE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtuKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgcz1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7cz49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1zLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IHM9bmV3IERhdGUsbj1zLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKG4+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqdm4vKG4vMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPXN9aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSp5bil9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpzLGJhY2tlbmRSVFQ6bn0pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpzLGJhY2tlbmRSVFQ6bix0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIEF0IGV4dGVuZHMgSXJ7Y29uc3RydWN0b3IoZSxzPXJlLm5vRmlsdGVyKXtzdXBlcihlKTtwKHRoaXMsImNoMSIpO3AodGhpcywiY2gyIik7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihzKTtjb25zdCBuPXRoaXMuY2FsbC5wYzEuY3JlYXRlRGF0YUNoYW5uZWwobnVsbCk7dGhpcy5jaDE9bixuLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgpPT57bi5zZW5kKCJoZWxsbyIpfSksbi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLm9uQ2gxUmVjaWV2ZS5iaW5kKHRoaXMpKSx0aGlzLmNhbGwucGMyLmFkZEV2ZW50TGlzdGVuZXIoImRhdGFjaGFubmVsIix0aGlzLmRhdGFDaGFubmVsSGFuZGxlci5iaW5kKHRoaXMpKX1vbkNoMVJlY2lldmUoZSl7ZS5kYXRhIT09IndvcmxkIj90aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpOnRoaXMudGVzdENvbXBsZXRlKHtjb25uZWN0aXZpdHk6ITB9KX1vbkNoMlJlY2lldmUoZSl7aWYoZS5kYXRhIT09ImhlbGxvIil0aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpO2Vsc2UgdHJ5e3RoaXMuY2gyLnNlbmQoIndvcmxkIil9Y2F0Y2gocyl7fX1kYXRhQ2hhbm5lbEhhbmRsZXIoZSl7Y29uc3Qgcz1lLmNoYW5uZWw7dGhpcy5jaDI9cyxzLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDJSZWNpZXZlLmJpbmQodGhpcykpfWhhbmd1cChlKXt0aGlzLnRlc3RGYWlsZWQoZSl9fWNsYXNzIEVuIGV4dGVuZHMgQXR7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc0hvc3QpfX1jbGFzcyBfbiBleHRlbmRzIEF0e2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIscmUuaXNSZWxheSl9fWNsYXNzIFRuIGV4dGVuZHMgQXR7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlZmxleGl2ZSl9fWNsYXNzIFJue2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJpcEluZm9ybWF0aW9uIixudWxsKX1nZXRJUERldGFpbHMobil7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6cixhcGlIb3N0bmFtZXM6ZSxsb2dnZXI6c30pe3ZhciBpLGEsZDtpZighdGhpcy5pcEluZm9ybWF0aW9uKXt0cnl7Y29uc3Qgbz1gaHR0cHM6Ly8ke2UubG9jYXRpb259YCxtPXlpZWxkKHlpZWxkIGZldGNoKG8pKS5qc29uKCk7aWYoKChpPW0ubG9jKT09bnVsbD92b2lkIDA6aS5sZW5ndGgpPjUpcmV0dXJuIHRoaXMuaXBJbmZvcm1hdGlvbj1tLChhPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmEuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSksbTt0aHJvdyBFcnJvcigiSW5zdWZmaWNpZW50IGRhdGEiKX1jYXRjaChvKXtzLmVycm9yKCJjYWxsc3RhdHM6OmlwRGV0YWlsczo6IGZhaWxlZCB0byBmZXRjaCBpcCB1c2luZyBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfXRyeXtjb25zdCBvPXlpZWxkIGZldGNoKGBodHRwczovLyR7ZS5sb2NhdGlvbkxlZ2FjeX0vP3Rva2VuPTNjNDkzOTMyYjA2MjRjJnBlZXJJZD0ke3J9YCx7bWV0aG9kOiJQT1NUIn0pO3RoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCBvLmpzb24oKSwoZD10aGlzLmlwSW5mb3JtYXRpb24pIT1udWxsJiZkLmlwJiYodGhpcy5pcEluZm9ybWF0aW9uLmlwPWFlKHRoaXMuaXBJbmZvcm1hdGlvbi5pcCkpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxlZ2FjeSBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfX1yZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9ufSl9cmVzZXRDYWNoZSgpe3RoaXMuaXBJbmZvcm1hdGlvbj1udWxsfX1jb25zdCB3cj1uZXcgUm4sTXI9W3t1cmxzOiJ0dXJuOnR1cm4uZHl0ZS5pbjo0NDM/dHJhbnNwb3J0PXRjcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn0se3VybHM6InR1cm46dHVybi5keXRlLmluOjM0Nzg/dHJhbnNwb3J0PXVkcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn1dO2Z1bmN0aW9uIEFyKHQpe2NvbnN0W3IsZV09dC5zcGxpdCgiLCIpO3JldHVybntjb29yZHM6e2xhdGl0dWRlOk51bWJlcihyKSxsb25naXR1ZGU6TnVtYmVyKGUpfX19Y2xhc3Mga3J7Y29uc3RydWN0b3IoKXtwKHRoaXMsInRyYW5zcG9ydCIpO3AodGhpcywiY2FuZGlkYXRlUGFpciIpO3AodGhpcywib3V0Ym91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kVmlkZW9SdHAiLG5ldyBNYXApO3AodGhpcywib3V0Ym91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQXVkaW9SdHAiLG5ldyBNYXApO3AodGhpcywicmVtb3RlSW5ib3VuZFJ0cCIsbmV3IE1hcCk7cCh0aGlzLCJwcm9kdWNlclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJzdGFsZVByb2R1Y2VyU3RyZWFtTWFwIiwhMSk7cCh0aGlzLCJzdGFsZUNvbnN1bWVyU3RyZWFtTWFwIiwhMSl9fWNsYXNzIE9yIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywib3V0Ym91bmRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJQZWVySWRNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkUHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywib3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsInZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsInZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlbyIsbmV3IFNldCk7cCh0aGlzLCJjb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsInByb2R1Y2VySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJmcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVQcm9kdWNlcnMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVDb25zdW1lcnMiLG5ldyBTZXQpO3AodGhpcywiaXBEZXRhaWxzIik7cCh0aGlzLCJjYWxsU3RhdHNJbnN0YW5jZSIpO3RoaXMub2JzZXJ2ZXI9bmV3IHF9cmVnaXN0ZXJQcm9kdWNlcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1wYXVzZVByb2R1Y2VyKGUpe3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiExfSl9cmVzdW1lUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZSl9cHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxzdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lclZpZGVvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGUscyxuKXt2YXIgYSxkO2NvbnN0IGk9KChkPShhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpkLmdldChlKSl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1JlY2VpdmVkPyh0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpby5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS5hdWRpbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJBdWRpb0ZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJwYXVzZSIsZSkpKToocy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1JlY2VpdmVkLHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRGVmcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMoZSxzLG4pe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsVmlkZW9QYWNrZXRzU2VudD1uLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtzLnRvdGFsQXVkaW9QYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzU2VudD1uLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoZSxzLG4pe3ZhciBtO2NvbnN0IGk9KChtPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDptLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fSx7YXVkaW86YSx2aWRlbzpkLHNjcmVlbjpvfT1pLGw9YXx8ZHx8bztzLnRvdGFsUGFja2V0c1NlbnQ9PT1uLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmwmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2luZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToocy50b3RhbFBhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2luZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoZSxzLG4pe3ZhciBkLG87Y29uc3QgYT0hIUFycmF5LmZyb20oKChvPShkPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpkLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpvLnZhbHVlcygpKXx8W10pLnJlZHVjZSgobCxtKT0+bHx8bS5hdWRpb3x8bS52aWRlb3x8bS5zY3JlZW4sITEpO3MudG90YWxQYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToocy50b3RhbFBhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNTZW50LHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5oYXMoZSkmJih0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydERlZnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUpLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuc2V0KGUuaWQse3Byb2R1Y2VySWQ6ZS5wcm9kdWNlcklkLHBlZXJJZDplLmFwcERhdGEucGVlcklkLGFwcERhdGE6ZS5hcHBEYXRhfSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmFkZChlLmlkKX0pfXBhdXNlQ29uc3VtZXIoZSl7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlKX1nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9cz90aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQobixbIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCJdLCExLGUuaWQpKVswXTp2b2lkIDA7Zm9yKGNvbnN0IGEgb2Ygbi52YWx1ZXMoKSlzd2l0Y2goYS50eXBlKXtjYXNlIm91dGJvdW5kLXJ0cCI6e3RoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9cz90aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQobixbImluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhlKXtyZXR1cm4gZS5maW5kKG49Pntjb25zdCBpPW4uZnJhbWVzRW5jb2RlZD4wLGE9bi5wYWNrZXRzU2VudD4wLGQ9bi5mcmFtZVdpZHRoJiZuLmZyYW1lSGVpZ2h0O3JldHVybiBpJiZhJiYhIWR9KXx8ZVtlLmxlbmd0aC0xXX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyICQsVixILFosdmUseWUsQmUseGUsamUsVWUsJGUsSGUsS2U7Y29uc3QgZD1lLG89bmV3IGtyLGw9cy5sZW5ndGg/bmV3IFNldChzKTp2b2lkIDAsbT1bXSx2PVtdLEU9W10sdz1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgZiBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKGYudHlwZSkpbiYmbC5kZWxldGUoZi50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChmLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7bS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMoZikpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3YucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PWYse3NlbGVjdGVkOnV9PWYsYj1mLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwoZi5ub21pbmF0ZWQ9PT0hMHx8Zi5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9ZjthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1mLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChmLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgSz10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKCgkPUs9PW51bGw/dm9pZCAwOksudHJhY2spPT1udWxsP3ZvaWQgMDokLnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHk9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9Yyx6PVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZWFzb246aC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50YXJnZXRCaXRyYXRlLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxQYWNrZXRTZW5kRGVsYXkscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHkpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGoseil9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9Yyx6PVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0seSk7by5vdXRib3VuZEF1ZGlvUnRwLnNldChmLmlkLHopLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaix6KX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSlicmVhaztjb25zdCBjPWYsdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IEs9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgeT1jLGg9USh7ZnJhbWVIZWlnaHQ6eS5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnkuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnkuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnkuZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzUmVjZWl2ZWQ6eS5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnkua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp5LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp5LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp5LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnkudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06eS5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp5LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp5LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp5LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnkudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp5LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnkudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnkuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp5LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnkucG93ZXJFZmZpY2llbnREZWNvZGVyfSxLKTtoLnNjb3JlPUNyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKFY9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpWLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEg9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpILnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoeWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp5ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxoPVEoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LEspO2guc2NvcmU9UHIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KGYuaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChmLGMpPT57dmFyIHUsYixqLEsseSxoLHosV2UsemUsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsc3QsbnQsaXQsYXQ7aWYoZi5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IE49W107Zi5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChycj0+e04ucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHJyKSl9KTtjb25zdCBNPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoTik7TS5zY29yZT1Ucih7ZnJhbWVXaWR0aDpNLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KE0ucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oSz10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOksucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihNLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLHcuc2V0KGMse3Njb3JlOisoTS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6TS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0Ok0uZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHo9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ei5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTS5wYWNrZXRzU2VudHx8MCktKCgoV2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpXZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHplPU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoTS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpNLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6TS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxNKX1lbHNlIGlmKGYub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQoZi5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO04uc2NvcmU9X3Ioe3BhY2tldHNTZW50OihOLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksdy5zZXQoYyx7c2NvcmU6KyhOLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKE4uYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHN0PU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnN0LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KG50PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6bnQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE4pfX0pLEUuZm9yRWFjaChmPT57Y29uc3QgYz1tLmZpbmQoYj0+Yi5pZD09PWYubG9jYWxDYW5kaWRhdGVJZD8oZi5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT12LmZpbmQoYj0+Yi5pZD09PWYucmVtb3RlQ2FuZGlkYXRlSWQ/KGYucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYoZi5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLGYubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksZi5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LGYubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLGYubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsZi5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsZi5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYoZi5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxmLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxmLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LGYucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxmLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYody5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLHcpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlcnNSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9ZS5tYXAobj0+dGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKG4sITApKTtyZXR1cm4gcy5sZW5ndGg+MD9Qcm9taXNlLmFsbChzKTp2b2lkIDB9KX1nZXRDb25zdW1lcnNSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9ZS5tYXAobj0+dGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKG4sITApKTtyZXR1cm4gcy5sZW5ndGg+MD9Qcm9taXNlLmFsbChzKTp2b2lkIDB9KX1nZXRUcmFuc3BvcnRSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiBlLmdldFN0YXRzKCl9KX1nZXRQcm9jZXNzZWRTdGF0cyhlLHMsbil7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGk9eWllbGQgdGhpcy5nZXRUcmFuc3BvcnRSZXBvcnQoZSksYT17cHJvZHVjaW5nOm4sY29uc3VtaW5nOnMsaWQ6ZS5pZH0sZD1pLG89dGhpcy5wYXJzZVJUQ1JlcG9ydChkLFsidHJhbnNwb3J0IiwiY2FuZGlkYXRlLXBhaXIiLCJpbmJvdW5kLXJ0cCIsIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCIsImxvY2FsLWNhbmRpZGF0ZSIsInJlbW90ZS1jYW5kaWRhdGUiXSwhMSx2b2lkIDAsYSk7aWYoIW8pcmV0dXJuO2NvbnN0IGw9e3N0YXRzOm8udHJhbnNwb3J0LHRyYW5zcG9ydElkOmUuaWQsY29uc3VtaW5nOnMscHJvZHVjaW5nOm59LG09by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KG8pLHY9by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KG8pO3JldHVybnt0cmFuc3BvcnRSZXBvcnQ6bCxwcm9kdWNlclJlcG9ydDptLGNvbnN1bWVyUmVwb3J0OnZ9fSl9Z2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57dmFyIGEsZDtzLnB1c2goe3Byb2R1Y2VySWQ6aSx2aWRlb1N0YXRzOm4ub3V0Ym91bmRWaWRlb1J0cElkLm1hcChvPT5lLm91dGJvdW5kVmlkZW9SdHAuZ2V0KG8pKSxhdWRpb1N0YXRzOm4ub3V0Ym91bmRBdWRpb1J0cElkLm1hcChvPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG8pKSxhcHBEYXRhOigoZD0oYT10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycyk9PW51bGw/dm9pZCAwOmEuZ2V0KGkpKT09bnVsbD92b2lkIDA6ZC5hcHBEYXRhKXx8bnVsbH0pfSl9Y2F0Y2gobil7dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpnZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydCIse2Vycm9yOntyZWFzb246bi5yZWFzb24sbWVzc2FnZTpuLm1lc3NhZ2V9fSl9cmV0dXJuIHN9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQoaSk7cy5wdXNoKHtjb25zdW1lcklkOmkscGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6byx2aWRlb1N0YXRzOm4uaW5ib3VuZFZpZGVvUnRwSWQubWFwKGw9PmUuaW5ib3VuZFZpZGVvUnRwLmdldChsKSksYXVkaW9TdGF0czpuLmluYm91bmRBdWRpb1J0cElkLm1hcChsPT5lLmluYm91bmRBdWRpb1J0cC5nZXQobCkpfSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRVc2VyTG9jYXRpb24oKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHMpPT57dHJ5e25hdmlnYXRvci5nZW9sb2NhdGlvbj9uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKG49PntlKG4pfSk6cygpfWNhdGNoKG4pe3Mobil9fSl9KX1nZXRDb25uZWN0aXZpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBzPXtpY2VTZXJ2ZXJzOmV8fE1yfSxuPW5ldyBQcm9taXNlKChtLHYpPT57dHJ5e2NvbnN0IEU9bmV3IEVuKHMpO0UuYWRkTGlzdGVuZXIoImRvbmUiLG0pLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PnttKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt2KEUpfX0pLGk9bmV3IFByb21pc2UoKG0sdik9Pnt0cnl7Y29uc3QgRT1uZXcgX24ocyk7RS5hZGRMaXN0ZW5lcigiZG9uZSIsbSksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e20oe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3YoRSl9fSksYT1uZXcgUHJvbWlzZSgobSx2KT0+e3RyeXtjb25zdCBFPW5ldyBUbihzKTtFLmFkZExpc3RlbmVyKCJkb25lIixtKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57bSh7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7dihFKX19KSxbZCxvLGxdPXlpZWxkIFByb21pc2UuYWxsKFtuLGksYV0pO3JldHVybntob3N0OmQ9PW51bGw/dm9pZCAwOmQuY29ubmVjdGl2aXR5LHJlbGF5Om89PW51bGw/dm9pZCAwOm8uY29ubmVjdGl2aXR5LHJlZmxleGl2ZTpsPT1udWxsP3ZvaWQgMDpsLmNvbm5lY3Rpdml0eX19Y2F0Y2gocyl7cmV0dXJue2hvc3Q6ITEscmVsYXk6ITEscmVmbGV4aXZlOiExfX19KX1nZXRUaHJvdWdocHV0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3Qgbj15aWVsZCBuZXcgUHJvbWlzZSgoaSxhKT0+e3RyeXtjb25zdCBkPXtpY2VTZXJ2ZXJzOmV8fE1yfSxvPW5ldyBibihkKTtvLmFkZExpc3RlbmVyKCJkb25lIixpKSxvLmFkZExpc3RlbmVyKCJmYWlsZWQiLGEpLG8uc3RhcnQoMWU0KX1jYXRjaChkKXthKGQpfX0pO3JldHVybnt0aHJvdWdocHV0Om4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczowLFJUVDpuLlJUVCxqaXR0ZXI6MCxiYWNrZW5kUlRUOm4uYmFja2VuZFJUVH19Y2F0Y2gocyl7cmV0dXJufX0pfWdldElQRGV0YWlscygpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgZSxzO3RyeXtyZXR1cm4gdGhpcy5pcERldGFpbHN8fCh0aGlzLmlwRGV0YWlscz15aWVsZCB3ci5nZXRJUERldGFpbHMoe3BlZXJJZDooZT10aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6ZS5wZWVySWQsYXBpSG9zdG5hbWVzOihzPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpzLmFwaUhvc3RuYW1lcyxsb2dnZXI6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXJ9KSksdGhpcy5pcERldGFpbHN9Y2F0Y2gobil7cmV0dXJufX0pfWdldE5ldHdvcmtRdWFsaXR5KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtzLG5dPXlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmdldENvbm5lY3Rpdml0eShlKSx0aGlzLmdldFRocm91Z2hwdXQoZSldKTtyZXR1cm57Y29ubmVjdGl2aXR5OnMsdGhyb3VnaHB1dDpuPT1udWxsP3ZvaWQgMDpuLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6bj09bnVsbD92b2lkIDA6bi5mcmFjdGlvbmFsTG9zcyxSVFQ6bj09bnVsbD92b2lkIDA6bi5SVFQsaml0dGVyOm49PW51bGw/dm9pZCAwOm4uaml0dGVyLGJhY2tlbmRSVFQ6bj09bnVsbD92b2lkIDA6bi5iYWNrZW5kUlRUfX0pfWdldE5ldHdvcmtJbmZvKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBkLG87aWYocyl7Y29uc3QgbD15aWVsZCB0aGlzLmdldElQRGV0YWlscygpO3JldHVybntpcERldGFpbHM6bCxlZmZlY3RpdmVOZXR3b3JrVHlwZTooZD1uYXZpZ2F0b3IuY29ubmVjdGlvbik9PW51bGw/dm9pZCAwOmQuZWZmZWN0aXZlVHlwZSxsb2NhdGlvbjpsIT1udWxsJiZsLmxvYz9BcihsPT1udWxsP3ZvaWQgMDpsLmxvYyk6dm9pZCAwfX1jb25zdFtuLGksYV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKSx0aGlzLmdldElQRGV0YWlscygpXSk7cmV0dXJue2lwRGV0YWlsczphLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihvPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6by5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmEhPW51bGwmJmEubG9jP0FyKGE9PW51bGw/dm9pZCAwOmEubG9jKTp2b2lkIDAsdHVybkNvbm5lY3Rpdml0eTpuP24uaG9zdHx8bi5yZWxheXx8bi5yZWZsZXhpdmU6ITEsY29ubmVjdGl2aXR5Om4sdGhyb3VnaHB1dDppPT1udWxsP3ZvaWQgMDppLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6aT09bnVsbD92b2lkIDA6aS5mcmFjdGlvbmFsTG9zcyxSVFQ6aT09bnVsbD92b2lkIDA6aS5SVFQsaml0dGVyOmk9PW51bGw/dm9pZCAwOmkuaml0dGVyLGJhY2tlbmRSVFQ6aT09bnVsbD92b2lkIDA6aS5iYWNrZW5kUlRUfX0pfX1jbGFzcyBQbiBleHRlbmRzIE9ye31jbGFzcyBMciBleHRlbmRzIE9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtwKHRoaXMsInByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyTWFwIixuZXcgTWFwKX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLnByb2R1Y2VyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVQcm9kdWNlclN0cmVhbU1hcChlKSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyUHJvZHVjZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuYWRkKGUuaWQpfSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jb25zdW1lck1hcC5zZXQoZS5pZCxlKSx5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9Z2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlLHM9ITEpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBuPXlpZWxkIGUuZ2V0U3RhdHMoKSxpPXRoaXMucGFyc2VSVENSZXBvcnQobixbImluYm91bmQtcnRwIl0sITEsZS5pZCksYT1bLi4uaS5jb25zdW1lclN0cmVhbU1hcC52YWx1ZXMoKV1bMF0sZD1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGksYSxlLmlkKTp2b2lkIDA7Zm9yKGNvbnN0IG8gb2Ygbi52YWx1ZXMoKSlzd2l0Y2goby50eXBlKXtjYXNlImluYm91bmQtcnRwIjp7dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuc2V0KG8uaWQsZS5pZCk7YnJlYWt9fXJldHVybiBkfSl9ZGVyZWdpc3RlclByb2R1Y2VyKGUpe3RoaXMucHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5kZWxldGUobil9KSx0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmRlbGV0ZShlLmlkKX1kZXJlZ2lzdGVyQ29uc3VtZXIoZSl7dGhpcy5jb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLmluYm91bmRDb25zdW1lck1hcC5kZWxldGUobil9KSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmRlbGV0ZShlLmlkKX1nZXRJY2VDYW5kaWRhdGVTdGF0cyhlKXt2YXIgcztyZXR1cm57aWQ6ZS5pZCx0eXBlOmUuY2FuZGlkYXRlVHlwZXx8ZS50eXBlLGFkZHJlc3M6ZS5hZGRyZXNzLHBvcnQ6ZS5wb3J0LHVybDplLnVybCxwcm90b2NvbDoocz1lLnJlbGF5UHJvdG9jb2wpIT1udWxsP3M6ZS5wcm90b2NvbCxuZXR3b3JrVHlwZTplLm5ldHdvcmtUeXBlLHJlbGF0ZWRBZGRyZXNzOmUucmVsYXRlZEFkZHJlc3MscmVsYXRlZFBvcnQ6ZS5yZWxhdGVkUG9ydH19cGFyc2VSVENSZXBvcnQoZSxzPVtdLG49ITEsaT12b2lkIDAsYT12b2lkIDApe3ZhciAkLFYsSCxaLHZlLHllLEJlLHhlLGplLFVlLCRlLEhlLEtlO2NvbnN0IGQ9ZSxvPW5ldyBrcixsPXMubGVuZ3RoP25ldyBTZXQocyk6dm9pZCAwLG09W10sdj1bXSxFPVtdLHc9bmV3IE1hcCx4PW5ldyBNYXA7Zm9yKGNvbnN0IGYgb2YgZC52YWx1ZXMoKSl7aWYobCl7aWYobC5zaXplPT09MClicmVhaztpZihsLmhhcyhmLnR5cGUpKW4mJmwuZGVsZXRlKGYudHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2goZi50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e20ucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOnt2LnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhmKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1mLHtzZWxlY3RlZDp1fT1mLGI9ZixqPXtub21pbmF0ZWQ6YyE9bnVsbD9jOnUsY3VycmVudFJvdW5kVHJpcFRpbWU6Yi5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6Yi50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDpiLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmIuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpiLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6Yi5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmIubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOmIubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDpiLmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6Yi5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDpiLmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OmIucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmIucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6Yi5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtFLnB1c2goaiksKGYubm9taW5hdGVkPT09ITB8fGYuc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9aik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPWY7YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IHU9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PXUsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX1pZihhLmNvbnN1bWluZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9Zix1PXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCx1KTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKWJyZWFrO2NvbnN0IGM9Zix1PWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhmLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IEs9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KHUpO2lmKCgoJD1LPT1udWxsP3ZvaWQgMDpLLnRyYWNrKT09bnVsbD92b2lkIDA6JC5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXModSl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KHUse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBoPWMsej1RKHtmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6aC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6aC5mcmFtZXNEcm9wcGVkP2guZnJhbWVzRHJvcHBlZDpoLmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kP2guZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVyYXRlTWVhbixmcmFtZXNTZW50OmguZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOmgua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpoLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpoLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpoLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OmgucGxpQ291bnQscXBTdW06aC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpoLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOmgudG90YWxFbmNvZGVUaW1lLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxFbmNvZGVUaW1lLHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6aC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOmgucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KGYuaWQseiksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHModSxqLHopfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBoPWMsej1RKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyh1LGoseil9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KGYuaWQpLGI9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyh1KXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQodSx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCBLPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxoPVEoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQ/eS5mcmFtZXNEcm9wcGVkOnkuZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQ/eS5mcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXJhdGVNZWFuLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0sSyk7aC5zY29yZT1Dcih7ZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDooaC5mcmFtZXNEZWNvZGVkfHwwKS0oKChWPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Vi5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChIPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SC5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFo9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpaLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChCZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkJlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRWaWRlb1J0cC5zZXQoZi5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kVmlkZW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHModSxqLGgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCB5PWMsaD1RKHthdWRpb0xldmVsOnkuYXVkaW9MZXZlbCxjb25jZWFsZWRTYW1wbGVzOnkuY29uY2VhbGVkU2FtcGxlcyxjb25jZWFsbWVudEV2ZW50czp5LmNvbmNlYWxtZW50RXZlbnRzLHRvdGFsQXVkaW9FbmVyZ3k6eS50b3RhbEF1ZGlvRW5lcmd5LHRvdGFsU2FtcGxlc0R1cmF0aW9uOnkudG90YWxTYW1wbGVzRHVyYXRpb24sdG90YWxTYW1wbGVzUmVjZWl2ZWQ6eS50b3RhbFNhbXBsZXNSZWNlaXZlZCxmZWNQYWNrZXRzRGlzY2FyZGVkOnkuZmVjUGFja2V0c0Rpc2NhcmRlZHx8MCxmZWNQYWNrZXRzUmVjZWl2ZWQ6eS5mZWNQYWNrZXRzUmVjZWl2ZWR8fDAsaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9uOnkuaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9ufHwwLHJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9uOnkucmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb258fDAsc2lsZW50Q29uY2VhbGVkU2FtcGxlczp5LnNpbGVudENvbmNlYWxlZFNhbXBsZXN8fDAscGxheW91dElkOnkucGxheW91dElkfSxLKTtoLnNjb3JlPVByKHtjb25jZWFsbWVudEV2ZW50czooaC5jb25jZWFsbWVudEV2ZW50c3x8MCktKCgoeGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp4ZS5jb25jZWFsbWVudEV2ZW50cyl8fDApLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChqZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOmplLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoVWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpVZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDB9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCgkZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoSGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEtlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6S2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZEF1ZGlvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRBdWRpb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyQXVkaW9TdGF0cyh1LGosaCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBJbmJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha319fWlmKG8ucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgoZixjKT0+e3ZhciB1LGIsaixLLHksaCx6LFdlLHplLEdlLHFlLFllLFFlLEplLFhlLFplLGV0LHR0LHJ0LHN0LG50LGl0LGF0O2lmKGYub3V0Ym91bmRWaWRlb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPVtdO2Yub3V0Ym91bmRWaWRlb1J0cElkLmZvckVhY2gocnI9PntOLnB1c2goby5vdXRib3VuZFZpZGVvUnRwLmdldChycikpfSk7Y29uc3QgTT10aGlzLmdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKE4pO00uc2NvcmU9VHIoe2ZyYW1lV2lkdGg6TS5mcmFtZVdpZHRofHwwLGZyYW1lc1BlclNlY29uZDpNLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh1PU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnUuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNTZW50OihNLnBhY2tldHNTZW50fHwwKS0oKChiPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Yi5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKGo9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ai5wYWNrZXRzTG9zdCl8fDApLSgoKHk9KEs9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpLLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp5LnBhY2tldHNMb3N0KXx8MCksZnJhbWVzRW5jb2RlZDooTS5mcmFtZXNFbmNvZGVkfHwwKS0oKChoPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6aC5mcmFtZXNFbmNvZGVkKXx8MCl9KSx3LnNldChjLHtzY29yZTorKE0uc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOk0uZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpNLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpNLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh6PU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnouaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KE0ucGFja2V0c1NlbnR8fDApLSgoKFdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKCh6ZT1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzTG9zdCl8fDApLSgoKHFlPShHZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkdlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpxZS5wYWNrZXRzTG9zdCl8fDApfSksYml0cmF0ZTooKE0uYnl0ZXNTZW50fHwwKS0oKChZZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlllLmJ5dGVzU2VudCl8fDApKSo4LzcsY3B1TGltaXRhdGlvbnM6TS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJjcHUiLGJhbmR3aWR0aExpbWl0YXRpb25zOk0ucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iYmFuZHdpZHRoIn0pLHRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsTSl9ZWxzZSBpZihmLm91dGJvdW5kQXVkaW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgTj1vLm91dGJvdW5kQXVkaW9SdHAuZ2V0KGYub3V0Ym91bmRBdWRpb1J0cElkWzBdKTtOLnNjb3JlPV9yKHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgoUWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpRZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKEplPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkplLnBhY2tldHNMb3N0KXx8MCktKCgoWmU9KFhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WGUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlplLnBhY2tldHNMb3N0KXx8MCksaml0dGVyOigoZXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ZXQuaml0dGVyKXx8MH0pLHcuc2V0KGMse3Njb3JlOisoTi5zY29yZSoxMCkudG9GaXhlZCgpLGJpdHJhdGU6KChOLmJ5dGVzU2VudHx8MCktKCgodHQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp0dC5ieXRlc1NlbnQpfHwwKSkqOC83LHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KE4ucGFja2V0c1NlbnR8fDApLSgoKHJ0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6cnQucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChzdD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpzdC5wYWNrZXRzTG9zdCl8fDApLSgoKGl0PShudD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOm50LnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDppdC5wYWNrZXRzTG9zdCl8fDApfSksaml0dGVyOigoYXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6YXQuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpfSksdGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxOKX19KSxFLmZvckVhY2goZj0+e2NvbnN0IGM9bS5maW5kKGI9PmIuaWQ9PT1mLmxvY2FsQ2FuZGlkYXRlSWQ/KGYubG9jYWxDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpLHU9di5maW5kKGI9PmIuaWQ9PT1mLnJlbW90ZUNhbmRpZGF0ZUlkPyhmLnJlbW90ZUNhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCk7YyYmKGYubG9jYWxDYW5kaWRhdGVUeXBlPWMudHlwZSxmLmxvY2FsQ2FuZGlkYXRlQWRkcmVzcz1hZShjLmFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVQb3J0PWMucG9ydCxmLmxvY2FsQ2FuZGlkYXRlUHJvdG9jb2w9Yy5wcm90b2NvbCxmLmxvY2FsQ2FuZGlkYXRlVXJsPWMudXJsLGYubG9jYWxDYW5kaWRhdGVOZXR3b3JrVHlwZT1jLm5ldHdvcmtUeXBlLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkQWRkcmVzcz1hZShjLnJlbGF0ZWRBZGRyZXNzKSxmLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZFBvcnQ9Yy5yZWxhdGVkUG9ydCksdSYmKGYucmVtb3RlQ2FuZGlkYXRlVHlwZT11LnR5cGUsZi5yZW1vdGVDYW5kaWRhdGVBZGRyZXNzPWFlKHUuYWRkcmVzcyksZi5yZW1vdGVDYW5kaWRhdGVQb3J0PXUucG9ydCxmLnJlbW90ZUNhbmRpZGF0ZVByb3RvY29sPXUucHJvdG9jb2wsZi5yZW1vdGVDYW5kaWRhdGVVcmw9dS51cmwpfSksby5jYW5kaWRhdGVQYWlyJiYoby50cmFuc3BvcnQ/KG8udHJhbnNwb3J0LmJ5dGVzUmVjZWl2ZWQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsby50cmFuc3BvcnQuYnl0ZXNTZW50PW8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYody5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLHcpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdCBhPXRoaXMucHJvZHVjZXJNYXAuZ2V0KGkpLGQ9YS50cmFjay5nZXRTZXR0aW5ncygpLG89bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG09Pntjb25zdCB2PWUub3V0Ym91bmRWaWRlb1J0cC5nZXQobSk7cmV0dXJuIHYuZnJhbWVIZWlnaHR8fCh2LmZyYW1lSGVpZ2h0PWQuaGVpZ2h0LHYuZnJhbWVXaWR0aD1kLndpZHRoLHYuZnJhbWVzUGVyU2Vjb25kPWQuZnJhbWVSYXRlKSx2fSksbD17cHJvZHVjZXJJZDppLGFwcERhdGE6YS5hcHBEYXRhLHZpZGVvU3RhdHM6byxhdWRpb1N0YXRzOm4ub3V0Ym91bmRBdWRpb1J0cElkLm1hcChtPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG0pKX07cy5wdXNoKGwpfSl9Y2F0Y2gobil7Y29uc29sZS5lcnJvcigiZ2V0UHJvZHVjZXJzUmVwb3J0OiAiLG4sZSl9cmV0dXJuIHN9Z2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUscyxuKXtsZXQgaTt0cnl7Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQobiksbD1zPT1udWxsP3ZvaWQgMDpzLmluYm91bmRWaWRlb1J0cElkLm1hcChtPT57Y29uc3QgRT10aGlzLmNvbnN1bWVyTWFwLmdldChuKS50cmFjay5nZXRTZXR0aW5ncygpLHc9ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KG0pO3JldHVybiB3LmZyYW1lSGVpZ2h0fHwody5mcmFtZUhlaWdodD1FLmhlaWdodCx3LmZyYW1lV2lkdGg9RS53aWR0aCx3LmZyYW1lc1BlclNlY29uZD1FLmZyYW1lUmF0ZSksd30pO2k9e2NvbnN1bWVySWQ6bixwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bCxhdWRpb1N0YXRzOnM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZEF1ZGlvUnRwSWQubWFwKG09PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChtKSl9fWNhdGNoKGEpe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0czogIixhLGUpfXJldHVybiBpfWdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UuY29uc3VtZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e3MucHVzaCh0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0cyhlLG4saSkpfSl9Y2F0Y2gobil7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQ6ICIsbixlKX1yZXR1cm4gc319Y2xhc3MgQ24gZXh0ZW5kcyBMcnt9ZnVuY3Rpb24gbXQodCxyLGUscyl7aWYodCE9bnVsbCYmdC5sb2dnZXImJnQubG9nZ2VyLmVycm9yKCJDYWxsc3RhdHM6OmhhbmRsZUVycm9yIix7ZXJyb3I6c30pLHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZzIGluc3RhbmNlb2YgcillLmNhbGwobnVsbCxzLHQpO2Vsc2UgdGhyb3cgc31mdW5jdGlvbiBEcih0LHIsZSl7Y29uc3Qgcz10LnZhbHVlO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKC4uLm4pe3RyeXtjb25zdCBpPXMuYXBwbHkodGhpcyxuKTtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS5jYXRjaChhPT57bXQodGhpcyxyLGUsYSl9KTppfWNhdGNoKGkpe210KHRoaXMscixlLGkpfXJldHVybiBudWxsfSx0fWNvbnN0IEM9KHQscik9PihlLHMsbik9Pntjb25zdCBpPW4udmFsdWU7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24oLi4uYSl7dHJ5e2NvbnN0IGQ9aS5hcHBseSh0aGlzLGEpO3JldHVybiBkJiZkIGluc3RhbmNlb2YgUHJvbWlzZT9kLmNhdGNoKG89PnttdCh0aGlzLHQscixvKX0pOmR9Y2F0Y2goZCl7bXQodGhpcyx0LHIsZCl9cmV0dXJuIG51bGx9LG59LEluPSh0LHIpPT4oZSxzLG4pPT57aWYobilyZXR1cm4gRHIobix0LHIpO2Zvcihjb25zdCBpIG9mIFJlZmxlY3Qub3duS2V5cyhlLnByb3RvdHlwZSkuZmlsdGVyKGE9PmEhPT0iY29uc3RydWN0b3IiKSl7Y29uc3QgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUucHJvdG90eXBlLGkpO2EudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLGksRHIoYSx0LHIpKX19O3ZhciBSPWZ1bmN0aW9uKHQscixlLHMpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgsaT1uPDM/cjpzPT09bnVsbD9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKTpzLGE7aWYodHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZ0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZT09ImZ1bmN0aW9uIilpPVJlZmxlY3QuZGVjb3JhdGUodCxyLGUscyk7ZWxzZSBmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wO2QtLSkoYT10W2RdKSYmKGk9KG48Mz9hKGkpOm4+Mz9hKHIsZSxpKTphKHIsZSkpfHxpKTtyZXR1cm4gbj4zJiZpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLGkpLGl9O2NvbnN0IFA9Y29uc29sZTtsZXQgXz1jbGFzcyBleHRlbmRzIHF7Y29uc3RydWN0b3IoZT0iaHR0cHM6Ly9hcGkudGVzdGluZ3YzLmR5dGUuaW4iLHM9IkJsaW5rIixuPWZyLlBST0QsaSxhLGQsbyl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJldmVudEhhbmRsZXIiKTtwKHRoaXMsIm1lYXN1cmVtZW50cyIpO3AodGhpcywicHJvZHVjaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJjb25zdW1pbmdUcmFuc3BvcnQiKTtwKHRoaXMsInByb2R1Y2VycyIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lcnMiLG5ldyBNYXApO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiY29ubmVjdGlvbkluZm9Qcm9taXNlIik7cCh0aGlzLCJwaW5nU3RhdHNUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsImVudiIpO3AodGhpcywiYXBpSG9zdG5hbWVzIik7cCh0aGlzLCJwZWVySWQiKTtwKHRoaXMsImNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXAiLG5ldyBNYXApO3AodGhpcywiY3VycmVudFVzZXJNZWRpYVN0YXRlcyIse30pO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1bih7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm99KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgUG47YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IExyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ247YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGwpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGwpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBsPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZsP24ucHJvZHVjZXJSZXBvcnQ9bDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmbD9pLmNvbnN1bWVyUmVwb3J0PWw6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksXz1SKFtJbihUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8pO3ZhciB3bj1fO2NsYXNzIE5yIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7cCh0aGlzLCJzdGF0cyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJiYWNrZW5kIik7cCh0aGlzLCJpY2VTZXJ2ZXJzIik7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywic3RhbGxlZCIsITEpO3AodGhpcywiaXBJbmZvcm1hdGlvbiIpO3AodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZSh2KXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj1mci5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpsLHNraXBDb25uZWN0aXZpdHlDaGVja3M6bT0hMX0pe3ZhciBFLHcseDt0cnl7dGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLHRoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCB3ci5nZXRJUERldGFpbHMoe3BlZXJJZDplLGFwaUhvc3RuYW1lczpsLGxvZ2dlcjpvfSksdGhpcy5iYWNrZW5kPW5ldyB3bihhLHMsbixkLG8sZSxsKSx0aGlzLmljZVNlcnZlcnM9aSwoRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKHg9KHc9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6dy5ldmVudEhhbmRsZXIpPT1udWxsfHx4LmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KG0pfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uOiAiLHtlcnJvcjokfSksdGhpcy5zdGFsbENhbGxTdGF0cygpfX0pfWNvbmZpZ3VyZVNlbmRUcmFuc3BvcnQoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMucmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl9KX1jb25maWd1cmVSZWN2VHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0KGUpfSl9Y2FuZGlkYXRlUmVnaW9uYWxOZXR3b3JrUXVhbGl0eVRlc3QoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuO3RyeXsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50KGUscyl9Y2F0Y2goaSl7dGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLHtlcnJvcjp7cmVhc29uOmkucmVhc29ufX0pfX0pfSl9cm9vbUpvaW5lZChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG4saTsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKSx0aGlzLmJhY2tlbmQsKGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zdGFydFBpbmdTdGF0cygpfSl9KX1hdWRpb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITEsZSl9KX1hdWRpb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQXVkaW9Ub2dnbGVFdmVudCghMCxlKX0pfXZpZGVvT2ZmKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMSxlKX0pfXZpZGVvT24oKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRWaWRlb1RvZ2dsZUV2ZW50KCEwLGUpfSl9Y2FsbEVuZGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHMsbjsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnN0b3BQaW5nU3RhdHMoKSwobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmREaXNjb25uZWN0RXZlbnQoZSl9KX1zY3JlZW5TaGFyZVN0YXJ0KGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQoITAsZSxzKX0pfWNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZShlLHMpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRDb25zdW1lclNoYXJlZE1lZGlhU3RhdGVFdmVudChlLHMpfSl9c2NyZWVuU2hhcmVTdG9wKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQoITEsZSxzKX0pfXNjcmVlblNoYXJlUmVxdWVzdGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKX0pfWFjdGl2ZVNwZWFrZXIoZSl7aWYoZSE9PXRoaXMucGVlcklkKXJldHVybjtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRBY3RpdmVTcGVha2VyRXZlbnQoZSxzKX0pfWRldmljZXMoZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmRldmljZXMoZSxzLG4pfSl9c2VsZWN0ZWREZXZpY2UoZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLnNlbGVjdGVkRGV2aWNlKGUscyxuKX0pfW1lZGlhUGVybWlzc2lvbihlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpOyhpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkubWVkaWFQZXJtaXNzaW9uKGUscyxuKX0pfW1lZGlhUGxheWJhY2tGYWlsZWQoZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5tZWRpYVBsYXliYWNrRmFpbGVkKGUscyl9KX1tZWRpYVRyYWNrTXV0ZWQoZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5tZWRpYVRyYWNrTXV0ZWQoZSxzKX0pfXRhYkNoYW5nZWQoZT0hMSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi50YWJDaGFuZ2VkKGUscyl9KX1icm93c2VyQmFja2dyb3VuZGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5icm93c2VyQmFja2dyb3VuZGVkKGUpfSl9YnJvd3NlckZvcmVncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckZvcmVncm91bmRlZChlKX0pfWxlZ2FjeVN3aXRjaChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmxlZ2FjeVN3aXRjaChlLHMpfSl9c3RhcnRQcmVDYWxsVGVzdChlPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kUHJlQ2FsbFRlc3RCZWdpbkV2ZW50KGUscyl9KX0pfW9uUHJlQ2FsbFRlc3RSZXN1bHRzKGUpe3JldHVybiB0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub25jZSgicHJlY2FsbF9lbmQiLGUpfSksZX1vblJlY2VpdmluZ0NvbnN1bWVyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1lclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjZXJBdWRpb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyVmlkZW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNpbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ0NvbnN1bWluZ1RyYW5zcG9ydFN0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIixlKX0pfW9uUHJvZHVjZXJTY29yZShlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oInByb2R1Y2VyX3Njb3JlIixlKX0pfW9uQ29uc3VtZXJTY29yZShlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3Njb3JlIixlKX0pfW9uU2FmZUluaXRpYWxpemF0aW9uKGUpe2lmKHRoaXMuaW5pdGlhbGl6ZWQpZSh0aGlzLmlwSW5mb3JtYXRpb24sITEpO2Vsc2UgaWYoIXRoaXMuc3RhbGxlZCl7Y29uc3Qgcz1uPT57ZShuLCEwKX07cmV0dXJuIHRoaXMub25jZSgiaW5pdGlhbGl6ZWQiLHMpLHN9cmV0dXJuKCk9Pnt9fXJlbW92ZUluaXRpYWxpemF0aW9uTGlzdGVuZXIoZSl7dGhpcy5yZW1vdmVMaXN0ZW5lcigiaW5pdGlhbGl6ZWQiLGUpfXN0YWxsQ2FsbFN0YXRzKCl7dGhpcy5zdGFsbGVkPSEwLHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJpbml0aWFsaXplZCIpfWl2c1BsYXllckV2ZW50KGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGksYSxkLG8sbCxtLHYsRSx3LHgsJDtzd2l0Y2goZSl7Y2FzZSJQbGF5ZXJSZWJ1ZmZlcmluZyI6KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChuKTticmVhaztjYXNlIlBsYXllckF1ZGlvQmxvY2tlZCI6KGE9dGhpcy5iYWNrZW5kKT09bnVsbHx8YS5zZW5kSVZTUGxheWVyQXVkaW9CbG9ja0V2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tCbG9ja2VkIjooZD10aGlzLmJhY2tlbmQpPT1udWxsfHxkLnNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChuKTticmVhaztjYXNlIlBsYXllck5ldHdvcmtVbmF2YWlsYWJsZSI6KG89dGhpcy5iYWNrZW5kKT09bnVsbHx8by5zZW5kSVZTUGxheWVyTmV0d29ya1VuYXZhaWxhYmxlRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJJbml0aWFsaXplZCI6KGw9dGhpcy5iYWNrZW5kKT09bnVsbHx8bC5zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChuKTticmVhaztjYXNlIlBsYXllcldvcmtlckVycm9yIjoobT10aGlzLmJhY2tlbmQpPT1udWxsfHxtLnNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVyRXJyb3IiOih2PXRoaXMuYmFja2VuZCk9PW51bGx8fHYuc2VuZElWU1BsYXllckVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllclJlY292ZXJhYmxlRXJyb3IiOihFPXRoaXMuYmFja2VuZCk9PW51bGx8fEUuc2VuZElWU1BsYXllclJlY292ZXJhYmxlRXJyb3JFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyQW5hbHl0aWNzRXZlbnQiOih3PXRoaXMuYmFja2VuZCk9PW51bGx8fHcuc2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkIjooeD10aGlzLmJhY2tlbmQpPT1udWxsfHx4LnNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllclF1YWxpdHlDaGFuZ2VkIjooJD10aGlzLmJhY2tlbmQpPT1udWxsfHwkLnNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZChzLG4pO2JyZWFrfX0pfWxpdmVzdHJlYW1MYXRlbmN5KGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFBsYXllckxpdmVMYXRlbmN5KGUscyl9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpOyhpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzLG4pfSl9ZXhwZWN0ZWRTY3JlZW5zaGFyZVJlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKX0pfX1uZXcgTnIoKS5zZXRNYXhMaXN0ZW5lcnMoMzApO2Z1bmN0aW9uIE1uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBGcih0LHIpe3JldHVybiB0PT09cnx8dCE9PXQmJnIhPT1yfWZ1bmN0aW9uIGd0KHQscil7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLTspaWYoRnIodFtlXVswXSxyKSlyZXR1cm4gZTtyZXR1cm4tMX12YXIgQW49QXJyYXkucHJvdG90eXBlLGtuPUFuLnNwbGljZTtmdW5jdGlvbiBPbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtpZihlPDApcmV0dXJuITE7dmFyIHM9ci5sZW5ndGgtMTtyZXR1cm4gZT09cz9yLnBvcCgpOmtuLmNhbGwocixlLDEpLC0tdGhpcy5zaXplLCEwfWZ1bmN0aW9uIExuKHQpe3ZhciByPXRoaXMuX19kYXRhX18sZT1ndChyLHQpO3JldHVybiBlPDA/dm9pZCAwOnJbZV1bMV19ZnVuY3Rpb24gRG4odCl7cmV0dXJuIGd0KHRoaXMuX19kYXRhX18sdCk+LTF9ZnVuY3Rpb24gTm4odCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fLHM9Z3QoZSx0KTtyZXR1cm4gczwwPygrK3RoaXMuc2l6ZSxlLnB1c2goW3Qscl0pKTplW3NdWzFdPXIsdGhpc31mdW5jdGlvbiBzZSh0KXt2YXIgcj0tMSxlPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrcjxlOyl7dmFyIHM9dFtyXTt0aGlzLnNldChzWzBdLHNbMV0pfX1zZS5wcm90b3R5cGUuY2xlYXI9TW4sc2UucHJvdG90eXBlLmRlbGV0ZT1PbixzZS5wcm90b3R5cGUuZ2V0PUxuLHNlLnByb3RvdHlwZS5oYXM9RG4sc2UucHJvdG90eXBlLnNldD1ObjtmdW5jdGlvbiBGbigpe3RoaXMuX19kYXRhX189bmV3IHNlLHRoaXMuc2l6ZT0wfWZ1bmN0aW9uIFZuKHQpe3ZhciByPXRoaXMuX19kYXRhX18sZT1yLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPXIuc2l6ZSxlfWZ1bmN0aW9uIEJuKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9dmFyIGpuPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxWcj1qbixVbj10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLCRuPVZyfHxVbnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxYPSRuLEhuPVguU3ltYm9sLEVlPUhuLEJyPU9iamVjdC5wcm90b3R5cGUsS249QnIuaGFzT3duUHJvcGVydHksV249QnIudG9TdHJpbmcsd2U9RWU/RWUudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHpuKHQpe3ZhciByPUtuLmNhbGwodCx3ZSksZT10W3dlXTt0cnl7dFt3ZV09dm9pZCAwO3ZhciBzPSEwfWNhdGNoKGkpe312YXIgbj1Xbi5jYWxsKHQpO3JldHVybiBzJiYocj90W3dlXT1lOmRlbGV0ZSB0W3dlXSksbn12YXIgR249T2JqZWN0LnByb3RvdHlwZSxxbj1Hbi50b1N0cmluZztmdW5jdGlvbiBZbih0KXtyZXR1cm4gcW4uY2FsbCh0KX12YXIgUW49IltvYmplY3QgTnVsbF0iLEpuPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHhyPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBNZSh0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP0puOlFuOnhyJiZ4ciBpbiBPYmplY3QodCk/em4odCk6WW4odCl9ZnVuY3Rpb24gQWUodCl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihyPT0ib2JqZWN0Inx8cj09ImZ1bmN0aW9uIil9dmFyIFhuPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixabj0iW29iamVjdCBGdW5jdGlvbl0iLGVpPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsdGk9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBqcih0KXtpZighQWUodCkpcmV0dXJuITE7dmFyIHI9TWUodCk7cmV0dXJuIHI9PVpufHxyPT1laXx8cj09WG58fHI9PXRpfXZhciByaT1YWyJfX2NvcmUtanNfc2hhcmVkX18iXSxrdD1yaSxVcj1mdW5jdGlvbigpe3ZhciB0PS9bXi5dKyQvLmV4ZWMoa3QmJmt0LmtleXMmJmt0LmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdD8iU3ltYm9sKHNyYylfMS4iK3Q6IiJ9KCk7ZnVuY3Rpb24gc2kodCl7cmV0dXJuISFVciYmVXIgaW4gdH12YXIgbmk9RnVuY3Rpb24ucHJvdG90eXBlLGlpPW5pLnRvU3RyaW5nO2Z1bmN0aW9uIGxlKHQpe2lmKHQhPW51bGwpe3RyeXtyZXR1cm4gaWkuY2FsbCh0KX1jYXRjaChyKXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHIpe319cmV0dXJuIiJ9dmFyIGFpPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxvaT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxjaT1GdW5jdGlvbi5wcm90b3R5cGUsZGk9T2JqZWN0LnByb3RvdHlwZSxsaT1jaS50b1N0cmluZyx1aT1kaS5oYXNPd25Qcm9wZXJ0eSxwaT1SZWdFeHAoIl4iK2xpLmNhbGwodWkpLnJlcGxhY2UoYWksIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gaGkodCl7aWYoIUFlKHQpfHxzaSh0KSlyZXR1cm4hMTt2YXIgcj1qcih0KT9waTpvaTtyZXR1cm4gci50ZXN0KGxlKHQpKX1mdW5jdGlvbiBmaSh0LHIpe3JldHVybiB0PT1udWxsP3ZvaWQgMDp0W3JdfWZ1bmN0aW9uIHVlKHQscil7dmFyIGU9ZmkodCxyKTtyZXR1cm4gaGkoZSk/ZTp2b2lkIDB9dmFyIG1pPXVlKFgsIk1hcCIpLGtlPW1pLGdpPXVlKE9iamVjdCwiY3JlYXRlIiksT2U9Z2k7ZnVuY3Rpb24gU2koKXt0aGlzLl9fZGF0YV9fPU9lP09lKG51bGwpOnt9LHRoaXMuc2l6ZT0wfWZ1bmN0aW9uIHZpKHQpe3ZhciByPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfXZhciB5aT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsYmk9T2JqZWN0LnByb3RvdHlwZSxFaT1iaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBfaSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKE9lKXt2YXIgZT1yW3RdO3JldHVybiBlPT09eWk/dm9pZCAwOmV9cmV0dXJuIEVpLmNhbGwocix0KT9yW3RdOnZvaWQgMH12YXIgVGk9T2JqZWN0LnByb3RvdHlwZSxSaT1UaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBQaSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiBPZT9yW3RdIT09dm9pZCAwOlJpLmNhbGwocix0KX12YXIgQ2k9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO2Z1bmN0aW9uIElpKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsZVt0XT1PZSYmcj09PXZvaWQgMD9DaTpyLHRoaXN9ZnVuY3Rpb24gcGUodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBzPXRbcl07dGhpcy5zZXQoc1swXSxzWzFdKX19cGUucHJvdG90eXBlLmNsZWFyPVNpLHBlLnByb3RvdHlwZS5kZWxldGU9dmkscGUucHJvdG90eXBlLmdldD1faSxwZS5wcm90b3R5cGUuaGFzPVBpLHBlLnByb3RvdHlwZS5zZXQ9SWk7ZnVuY3Rpb24gd2koKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBwZSxtYXA6bmV3KGtlfHxzZSksc3RyaW5nOm5ldyBwZX19ZnVuY3Rpb24gTWkodCl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuIHI9PSJzdHJpbmcifHxyPT0ibnVtYmVyInx8cj09InN5bWJvbCJ8fHI9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gU3QodCxyKXt2YXIgZT10Ll9fZGF0YV9fO3JldHVybiBNaShyKT9lW3R5cGVvZiByPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOmUubWFwfWZ1bmN0aW9uIEFpKHQpe3ZhciByPVN0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPXI/MTowLHJ9ZnVuY3Rpb24ga2kodCl7cmV0dXJuIFN0KHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIE9pKHQpe3JldHVybiBTdCh0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiBMaSh0LHIpe3ZhciBlPVN0KHRoaXMsdCkscz1lLnNpemU7cmV0dXJuIGUuc2V0KHQsciksdGhpcy5zaXplKz1lLnNpemU9PXM/MDoxLHRoaXN9ZnVuY3Rpb24gX2UodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBzPXRbcl07dGhpcy5zZXQoc1swXSxzWzFdKX19X2UucHJvdG90eXBlLmNsZWFyPXdpLF9lLnByb3RvdHlwZS5kZWxldGU9QWksX2UucHJvdG90eXBlLmdldD1raSxfZS5wcm90b3R5cGUuaGFzPU9pLF9lLnByb3RvdHlwZS5zZXQ9TGk7dmFyIERpPTIwMDtmdW5jdGlvbiBOaSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoZSBpbnN0YW5jZW9mIHNlKXt2YXIgcz1lLl9fZGF0YV9fO2lmKCFrZXx8cy5sZW5ndGg8RGktMSlyZXR1cm4gcy5wdXNoKFt0LHJdKSx0aGlzLnNpemU9KytlLnNpemUsdGhpcztlPXRoaXMuX19kYXRhX189bmV3IF9lKHMpfXJldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZT1lLnNpemUsdGhpc31mdW5jdGlvbiBUZSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fPW5ldyBzZSh0KTt0aGlzLnNpemU9ci5zaXplfVRlLnByb3RvdHlwZS5jbGVhcj1GbixUZS5wcm90b3R5cGUuZGVsZXRlPVZuLFRlLnByb3RvdHlwZS5nZXQ9Qm4sVGUucHJvdG90eXBlLmhhcz14bixUZS5wcm90b3R5cGUuc2V0PU5pO2Z1bmN0aW9uIEZpKHQscil7Zm9yKHZhciBlPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrZTxzJiZyKHRbZV0sZSx0KSE9PSExOyk7cmV0dXJuIHR9dmFyIFZpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXVlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaChyKXt9fSgpLCRyPVZpO2Z1bmN0aW9uIEhyKHQscixlKXtyPT0iX19wcm90b19fIiYmJHI/JHIodCxyLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplLHdyaXRhYmxlOiEwfSk6dFtyXT1lfXZhciBCaT1PYmplY3QucHJvdG90eXBlLHhpPUJpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEtyKHQscixlKXt2YXIgcz10W3JdOyghKHhpLmNhbGwodCxyKSYmRnIocyxlKSl8fGU9PT12b2lkIDAmJiEociBpbiB0KSkmJkhyKHQscixlKX1mdW5jdGlvbiB2dCh0LHIsZSxzKXt2YXIgbj0hZTtlfHwoZT17fSk7Zm9yKHZhciBpPS0xLGE9ci5sZW5ndGg7KytpPGE7KXt2YXIgZD1yW2ldLG89cz9zKGVbZF0sdFtkXSxkLGUsdCk6dm9pZCAwO289PT12b2lkIDAmJihvPXRbZF0pLG4/SHIoZSxkLG8pOktyKGUsZCxvKX1yZXR1cm4gZX1mdW5jdGlvbiBqaSh0LHIpe2Zvcih2YXIgZT0tMSxzPUFycmF5KHQpOysrZTx0OylzW2VdPXIoZSk7cmV0dXJuIHN9ZnVuY3Rpb24gTGUodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In12YXIgVWk9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gV3IodCl7cmV0dXJuIExlKHQpJiZNZSh0KT09VWl9dmFyIHpyPU9iamVjdC5wcm90b3R5cGUsJGk9enIuaGFzT3duUHJvcGVydHksSGk9enIucHJvcGVydHlJc0VudW1lcmFibGUsS2k9V3IoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9XcjpmdW5jdGlvbih0KXtyZXR1cm4gTGUodCkmJiRpLmNhbGwodCwiY2FsbGVlIikmJiFIaS5jYWxsKHQsImNhbGxlZSIpfSxHcj1LaSxXaT1BcnJheS5pc0FycmF5LHl0PVdpO2Z1bmN0aW9uIHppKCl7cmV0dXJuITF9dmFyIHFyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsWXI9cXImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxHaT1ZciYmWXIuZXhwb3J0cz09PXFyLFFyPUdpP1guQnVmZmVyOnZvaWQgMCxxaT1Rcj9Rci5pc0J1ZmZlcjp2b2lkIDAsWWk9cWl8fHppLE90PVlpLFFpPTkwMDcxOTkyNTQ3NDA5OTEsSmk9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIFhpKHQscil7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHI9cj09bnVsbD9RaTpyLCEhciYmKGU9PSJudW1iZXIifHxlIT0ic3ltYm9sIiYmSmkudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxyfXZhciBaaT05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIEpyKHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQ+LTEmJnQlMT09MCYmdDw9Wml9dmFyIGVhPSJbb2JqZWN0IEFyZ3VtZW50c10iLHRhPSJbb2JqZWN0IEFycmF5XSIscmE9IltvYmplY3QgQm9vbGVhbl0iLHNhPSJbb2JqZWN0IERhdGVdIixuYT0iW29iamVjdCBFcnJvcl0iLGlhPSJbb2JqZWN0IEZ1bmN0aW9uXSIsYWE9IltvYmplY3QgTWFwXSIsb2E9IltvYmplY3QgTnVtYmVyXSIsY2E9IltvYmplY3QgT2JqZWN0XSIsZGE9IltvYmplY3QgUmVnRXhwXSIsbGE9IltvYmplY3QgU2V0XSIsdWE9IltvYmplY3QgU3RyaW5nXSIscGE9IltvYmplY3QgV2Vha01hcF0iLGhhPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsZmE9IltvYmplY3QgRGF0YVZpZXddIixtYT0iW29iamVjdCBGbG9hdDMyQXJyYXldIixnYT0iW29iamVjdCBGbG9hdDY0QXJyYXldIixTYT0iW29iamVjdCBJbnQ4QXJyYXldIix2YT0iW29iamVjdCBJbnQxNkFycmF5XSIseWE9IltvYmplY3QgSW50MzJBcnJheV0iLGJhPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixFYT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLF9hPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsVGE9IltvYmplY3QgVWludDMyQXJyYXldIixCPXt9O0JbbWFdPUJbZ2FdPUJbU2FdPUJbdmFdPUJbeWFdPUJbYmFdPUJbRWFdPUJbX2FdPUJbVGFdPSEwLEJbZWFdPUJbdGFdPUJbaGFdPUJbcmFdPUJbZmFdPUJbc2FdPUJbbmFdPUJbaWFdPUJbYWFdPUJbb2FdPUJbY2FdPUJbZGFdPUJbbGFdPUJbdWFdPUJbcGFdPSExO2Z1bmN0aW9uIFJhKHQpe3JldHVybiBMZSh0KSYmSnIodC5sZW5ndGgpJiYhIUJbTWUodCldfWZ1bmN0aW9uIEx0KHQpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChyKX19dmFyIFhyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsRGU9WHImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxQYT1EZSYmRGUuZXhwb3J0cz09PVhyLER0PVBhJiZWci5wcm9jZXNzLENhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PURlJiZEZS5yZXF1aXJlJiZEZS5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fER0JiZEdC5iaW5kaW5nJiZEdC5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2gocil7fX0oKSxSZT1DYSxacj1SZSYmUmUuaXNUeXBlZEFycmF5LElhPVpyP0x0KFpyKTpSYSxlcz1JYSx3YT1PYmplY3QucHJvdG90eXBlLE1hPXdhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHRzKHQscil7dmFyIGU9eXQodCkscz0hZSYmR3IodCksbj0hZSYmIXMmJk90KHQpLGk9IWUmJiFzJiYhbiYmZXModCksYT1lfHxzfHxufHxpLGQ9YT9qaSh0Lmxlbmd0aCxTdHJpbmcpOltdLG89ZC5sZW5ndGg7Zm9yKHZhciBsIGluIHQpKHJ8fE1hLmNhbGwodCxsKSkmJiEoYSYmKGw9PSJsZW5ndGgifHxuJiYobD09Im9mZnNldCJ8fGw9PSJwYXJlbnQiKXx8aSYmKGw9PSJidWZmZXIifHxsPT0iYnl0ZUxlbmd0aCJ8fGw9PSJieXRlT2Zmc2V0Iil8fFhpKGwsbykpKSYmZC5wdXNoKGwpO3JldHVybiBkfXZhciBBYT1PYmplY3QucHJvdG90eXBlO2Z1bmN0aW9uIGJ0KHQpe3ZhciByPXQmJnQuY29uc3RydWN0b3IsZT10eXBlb2Ygcj09ImZ1bmN0aW9uIiYmci5wcm90b3R5cGV8fEFhO3JldHVybiB0PT09ZX1mdW5jdGlvbiBycyh0LHIpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChyKGUpKX19dmFyIGthPXJzKE9iamVjdC5rZXlzLE9iamVjdCksT2E9a2EsTGE9T2JqZWN0LnByb3RvdHlwZSxEYT1MYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBzcyh0KXtpZighYnQodCkpcmV0dXJuIE9hKHQpO3ZhciByPVtdO2Zvcih2YXIgZSBpbiBPYmplY3QodCkpRGEuY2FsbCh0LGUpJiZlIT0iY29uc3RydWN0b3IiJiZyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTnQodCl7cmV0dXJuIHQhPW51bGwmJkpyKHQubGVuZ3RoKSYmIWpyKHQpfWZ1bmN0aW9uIEZ0KHQpe3JldHVybiBOdCh0KT90cyh0KTpzcyh0KX1mdW5jdGlvbiBOYSh0LHIpe3JldHVybiB0JiZ2dChyLEZ0KHIpLHQpfWZ1bmN0aW9uIEZhKHQpe3ZhciByPVtdO2lmKHQhPW51bGwpZm9yKHZhciBlIGluIE9iamVjdCh0KSlyLnB1c2goZSk7cmV0dXJuIHJ9dmFyIFZhPU9iamVjdC5wcm90b3R5cGUsQmE9VmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24geGEodCl7aWYoIUFlKHQpKXJldHVybiBGYSh0KTt2YXIgcj1idCh0KSxlPVtdO2Zvcih2YXIgcyBpbiB0KXM9PSJjb25zdHJ1Y3RvciImJihyfHwhQmEuY2FsbCh0LHMpKXx8ZS5wdXNoKHMpO3JldHVybiBlfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBOdCh0KT90cyh0LCEwKTp4YSh0KX1mdW5jdGlvbiBqYSh0LHIpe3JldHVybiB0JiZ2dChyLFZ0KHIpLHQpfXZhciBucz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGlzPW5zJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsVWE9aXMmJmlzLmV4cG9ydHM9PT1ucyxhcz1VYT9YLkJ1ZmZlcjp2b2lkIDAsb3M9YXM/YXMuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uICRhKHQscil7aWYocilyZXR1cm4gdC5zbGljZSgpO3ZhciBlPXQubGVuZ3RoLHM9b3M/b3MoZSk6bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIHQuY29weShzKSxzfWZ1bmN0aW9uIEhhKHQscil7dmFyIGU9LTEscz10Lmxlbmd0aDtmb3Iocnx8KHI9QXJyYXkocykpOysrZTxzOylyW2VdPXRbZV07cmV0dXJuIHJ9ZnVuY3Rpb24gS2EodCxyKXtmb3IodmFyIGU9LTEscz10PT1udWxsPzA6dC5sZW5ndGgsbj0wLGk9W107KytlPHM7KXt2YXIgYT10W2VdO3IoYSxlLHQpJiYoaVtuKytdPWEpfXJldHVybiBpfWZ1bmN0aW9uIGNzKCl7cmV0dXJuW119dmFyIFdhPU9iamVjdC5wcm90b3R5cGUsemE9V2EucHJvcGVydHlJc0VudW1lcmFibGUsZHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxHYT1kcz9mdW5jdGlvbih0KXtyZXR1cm4gdD09bnVsbD9bXToodD1PYmplY3QodCksS2EoZHModCksZnVuY3Rpb24ocil7cmV0dXJuIHphLmNhbGwodCxyKX0pKX06Y3MsQnQ9R2E7ZnVuY3Rpb24gcWEodCxyKXtyZXR1cm4gdnQodCxCdCh0KSxyKX1mdW5jdGlvbiBscyh0LHIpe2Zvcih2YXIgZT0tMSxzPXIubGVuZ3RoLG49dC5sZW5ndGg7KytlPHM7KXRbbitlXT1yW2VdO3JldHVybiB0fXZhciBZYT1ycyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KSx1cz1ZYSxRYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLEphPVFhP2Z1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXTt0OylscyhyLEJ0KHQpKSx0PXVzKHQpO3JldHVybiByfTpjcyxwcz1KYTtmdW5jdGlvbiBYYSh0LHIpe3JldHVybiB2dCh0LHBzKHQpLHIpfWZ1bmN0aW9uIGhzKHQscixlKXt2YXIgcz1yKHQpO3JldHVybiB5dCh0KT9zOmxzKHMsZSh0KSl9ZnVuY3Rpb24gWmEodCl7cmV0dXJuIGhzKHQsRnQsQnQpfWZ1bmN0aW9uIGVvKHQpe3JldHVybiBocyh0LFZ0LHBzKX12YXIgdG89dWUoWCwiRGF0YVZpZXciKSx4dD10byxybz11ZShYLCJQcm9taXNlIiksanQ9cm8sc289dWUoWCwiU2V0IiksVXQ9c28sbm89dWUoWCwiV2Vha01hcCIpLCR0PW5vLGZzPSJbb2JqZWN0IE1hcF0iLGlvPSJbb2JqZWN0IE9iamVjdF0iLG1zPSJbb2JqZWN0IFByb21pc2VdIixncz0iW29iamVjdCBTZXRdIixTcz0iW29iamVjdCBXZWFrTWFwXSIsdnM9IltvYmplY3QgRGF0YVZpZXddIixhbz1sZSh4dCksb289bGUoa2UpLGNvPWxlKGp0KSxsbz1sZShVdCksdW89bGUoJHQpLGhlPU1lOyh4dCYmaGUobmV3IHh0KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT12c3x8a2UmJmhlKG5ldyBrZSkhPWZzfHxqdCYmaGUoanQucmVzb2x2ZSgpKSE9bXN8fFV0JiZoZShuZXcgVXQpIT1nc3x8JHQmJmhlKG5ldyAkdCkhPVNzKSYmKGhlPWZ1bmN0aW9uKHQpe3ZhciByPU1lKHQpLGU9cj09aW8/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAscz1lP2xlKGUpOiIiO2lmKHMpc3dpdGNoKHMpe2Nhc2UgYW86cmV0dXJuIHZzO2Nhc2Ugb286cmV0dXJuIGZzO2Nhc2UgY286cmV0dXJuIG1zO2Nhc2UgbG86cmV0dXJuIGdzO2Nhc2UgdW86cmV0dXJuIFNzfXJldHVybiByfSk7dmFyIEV0PWhlLHBvPU9iamVjdC5wcm90b3R5cGUsaG89cG8uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZm8odCl7dmFyIHI9dC5sZW5ndGgsZT1uZXcgdC5jb25zdHJ1Y3RvcihyKTtyZXR1cm4gciYmdHlwZW9mIHRbMF09PSJzdHJpbmciJiZoby5jYWxsKHQsImluZGV4IikmJihlLmluZGV4PXQuaW5kZXgsZS5pbnB1dD10LmlucHV0KSxlfXZhciBtbz1YLlVpbnQ4QXJyYXkseXM9bW87ZnVuY3Rpb24gSHQodCl7dmFyIHI9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IHlzKHIpLnNldChuZXcgeXModCkpLHJ9ZnVuY3Rpb24gZ28odCxyKXt2YXIgZT1yP0h0KHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3IoZSx0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX12YXIgU289L1x3KiQvO2Z1bmN0aW9uIHZvKHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLFNvLmV4ZWModCkpO3JldHVybiByLmxhc3RJbmRleD10Lmxhc3RJbmRleCxyfXZhciBicz1FZT9FZS5wcm90b3R5cGU6dm9pZCAwLEVzPWJzP2JzLnZhbHVlT2Y6dm9pZCAwO2Z1bmN0aW9uIHlvKHQpe3JldHVybiBFcz9PYmplY3QoRXMuY2FsbCh0KSk6e319ZnVuY3Rpb24gYm8odCxyKXt2YXIgZT1yP0h0KHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3IoZSx0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfXZhciBFbz0iW29iamVjdCBCb29sZWFuXSIsX289IltvYmplY3QgRGF0ZV0iLFRvPSJbb2JqZWN0IE1hcF0iLFJvPSJbb2JqZWN0IE51bWJlcl0iLFBvPSJbb2JqZWN0IFJlZ0V4cF0iLENvPSJbb2JqZWN0IFNldF0iLElvPSJbb2JqZWN0IFN0cmluZ10iLHdvPSJbb2JqZWN0IFN5bWJvbF0iLE1vPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsQW89IltvYmplY3QgRGF0YVZpZXddIixrbz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixPbz0iW29iamVjdCBGbG9hdDY0QXJyYXldIixMbz0iW29iamVjdCBJbnQ4QXJyYXldIixEbz0iW29iamVjdCBJbnQxNkFycmF5XSIsTm89IltvYmplY3QgSW50MzJBcnJheV0iLEZvPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixWbz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLEJvPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIseG89IltvYmplY3QgVWludDMyQXJyYXldIjtmdW5jdGlvbiBqbyh0LHIsZSl7dmFyIHM9dC5jb25zdHJ1Y3Rvcjtzd2l0Y2gocil7Y2FzZSBNbzpyZXR1cm4gSHQodCk7Y2FzZSBFbzpjYXNlIF9vOnJldHVybiBuZXcgcygrdCk7Y2FzZSBBbzpyZXR1cm4gZ28odCxlKTtjYXNlIGtvOmNhc2UgT286Y2FzZSBMbzpjYXNlIERvOmNhc2UgTm86Y2FzZSBGbzpjYXNlIFZvOmNhc2UgQm86Y2FzZSB4bzpyZXR1cm4gYm8odCxlKTtjYXNlIFRvOnJldHVybiBuZXcgcztjYXNlIFJvOmNhc2UgSW86cmV0dXJuIG5ldyBzKHQpO2Nhc2UgUG86cmV0dXJuIHZvKHQpO2Nhc2UgQ286cmV0dXJuIG5ldyBzO2Nhc2Ugd286cmV0dXJuIHlvKHQpfX12YXIgX3M9T2JqZWN0LmNyZWF0ZSxVbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKHIpe2lmKCFBZShyKSlyZXR1cm57fTtpZihfcylyZXR1cm4gX3Mocik7dC5wcm90b3R5cGU9cjt2YXIgZT1uZXcgdDtyZXR1cm4gdC5wcm90b3R5cGU9dm9pZCAwLGV9fSgpLCRvPVVvO2Z1bmN0aW9uIEhvKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIWJ0KHQpPyRvKHVzKHQpKTp7fX12YXIgS289IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gV28odCl7cmV0dXJuIExlKHQpJiZFdCh0KT09S299dmFyIFRzPVJlJiZSZS5pc01hcCx6bz1Ucz9MdChUcyk6V28sR289em8scW89IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gWW8odCl7cmV0dXJuIExlKHQpJiZFdCh0KT09cW99dmFyIFJzPVJlJiZSZS5pc1NldCxRbz1Scz9MdChScyk6WW8sSm89UW8sWG89MSxabz0yLGVjPTQsUHM9IltvYmplY3QgQXJndW1lbnRzXSIsdGM9IltvYmplY3QgQXJyYXldIixyYz0iW29iamVjdCBCb29sZWFuXSIsc2M9IltvYmplY3QgRGF0ZV0iLG5jPSJbb2JqZWN0IEVycm9yXSIsQ3M9IltvYmplY3QgRnVuY3Rpb25dIixpYz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLGFjPSJbb2JqZWN0IE1hcF0iLG9jPSJbb2JqZWN0IE51bWJlcl0iLElzPSJbb2JqZWN0IE9iamVjdF0iLGNjPSJbb2JqZWN0IFJlZ0V4cF0iLGRjPSJbb2JqZWN0IFNldF0iLGxjPSJbb2JqZWN0IFN0cmluZ10iLHVjPSJbb2JqZWN0IFN5bWJvbF0iLHBjPSJbb2JqZWN0IFdlYWtNYXBdIixoYz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGZjPSJbb2JqZWN0IERhdGFWaWV3XSIsbWM9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsZ2M9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsU2M9IltvYmplY3QgSW50OEFycmF5XSIsdmM9IltvYmplY3QgSW50MTZBcnJheV0iLHljPSJbb2JqZWN0IEludDMyQXJyYXldIixiYz0iW29iamVjdCBVaW50OEFycmF5XSIsRWM9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixfYz0iW29iamVjdCBVaW50MTZBcnJheV0iLFRjPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsRj17fTtGW1BzXT1GW3RjXT1GW2hjXT1GW2ZjXT1GW3JjXT1GW3NjXT1GW21jXT1GW2djXT1GW1NjXT1GW3ZjXT1GW3ljXT1GW2FjXT1GW29jXT1GW0lzXT1GW2NjXT1GW2RjXT1GW2xjXT1GW3VjXT1GW2JjXT1GW0VjXT1GW19jXT1GW1RjXT0hMCxGW25jXT1GW0NzXT1GW3BjXT0hMTtmdW5jdGlvbiBfdCh0LHIsZSxzLG4saSl7dmFyIGEsZD1yJlhvLG89ciZabyxsPXImZWM7aWYoZSYmKGE9bj9lKHQscyxuLGkpOmUodCkpLGEhPT12b2lkIDApcmV0dXJuIGE7aWYoIUFlKHQpKXJldHVybiB0O3ZhciBtPXl0KHQpO2lmKG0pe2lmKGE9Zm8odCksIWQpcmV0dXJuIEhhKHQsYSl9ZWxzZXt2YXIgdj1FdCh0KSxFPXY9PUNzfHx2PT1pYztpZihPdCh0KSlyZXR1cm4gJGEodCxkKTtpZih2PT1Jc3x8dj09UHN8fEUmJiFuKXtpZihhPW98fEU/e306SG8odCksIWQpcmV0dXJuIG8/WGEodCxqYShhLHQpKTpxYSh0LE5hKGEsdCkpfWVsc2V7aWYoIUZbdl0pcmV0dXJuIG4/dDp7fTthPWpvKHQsdixkKX19aXx8KGk9bmV3IFRlKTt2YXIgdz1pLmdldCh0KTtpZih3KXJldHVybiB3O2kuc2V0KHQsYSksSm8odCk/dC5mb3JFYWNoKGZ1bmN0aW9uKFYpe2EuYWRkKF90KFYscixlLFYsdCxpKSl9KTpHbyh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKFYsSCl7YS5zZXQoSCxfdChWLHIsZSxILHQsaSkpfSk7dmFyIHg9bD9vP2VvOlphOm8/VnQ6RnQsJD1tP3ZvaWQgMDp4KHQpO3JldHVybiBGaSgkfHx0LGZ1bmN0aW9uKFYsSCl7JCYmKEg9VixWPXRbSF0pLEtyKGEsSCxfdChWLHIsZSxILHQsaSkpfSksYX12YXIgUmM9MSxQYz00O2Z1bmN0aW9uIENjKHQpe3JldHVybiBfdCh0LFJjfFBjKX12YXIgd3M9ImhYZ1U4V2M4cHd1R05xOW1zNXE5SGgiO3R5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmKFhzPXByb2Nlc3M9PW51bGw/dm9pZCAwOnByb2Nlc3MuZW52KSE9bnVsbCYmWHMuRkxBR1NNSVRIX0VOVklST05NRU5UX0tFWSYmKHdzPXByb2Nlc3MuZW52LkZMQUdTTUlUSF9FTlZJUk9OTUVOVF9LRVkpO2Z1bmN0aW9uIEljKHQ9W10pe2NvbnN0IHI9e307cmV0dXJuIHQuZm9yRWFjaChlPT57cltlLmZlYXR1cmUubmFtZV09e2VuYWJsZWQ6ZS5lbmFibGVkLHZhbHVlOmUuZmVhdHVyZV9zdGF0ZV92YWx1ZX19KSxyfXZhciB3Yz1jbGFzc3tjb25zdHJ1Y3Rvcih0PXdzKXtwKHRoaXMsImZsYWdzIix7fSk7cCh0aGlzLCJlbnZpcm9ubWVudEtleSIsbnVsbCk7dGhpcy5lbnZpcm9ubWVudEtleT10fWlkZW50aWZ5QW5kRmV0Y2hGbGFnc1dpdGhSZXRyeShkKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3ByaW1hcnlFbmRwb2ludDp0LHNlY29uZGFyeUVuZHBvaW50OnIsZm9yY2VFdmFsdWF0ZTplLHRpbWVvdXQ6cyx1bmlxdWVJZGVudGlmaWVyOm4sdHJhaXRzT2JqOmksbG9nZ2VyOmF9KXtjb25zdCBvPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaSkpLGw9T2JqZWN0LmVudHJpZXMobykubWFwKHY9Pih7dHJhaXRfa2V5OnZbMF0sdHJhaXRfdmFsdWU6dlsxXX0pKSxtPVt0LHIscl07Zm9yKGNvbnN0IHYgb2YgbSl0cnl7Y29uc3QgRT1uZXcgQWJvcnRDb250cm9sbGVyLHc9c2V0VGltZW91dCgoKT0+RS5hYm9ydCgpLHMpLHg9YF8keyhNYXRoLnJhbmRvbSgpKzEpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMil9YCwkPXlpZWxkIGZldGNoKGBodHRwczovLyR7dn0vYXBpL3YxL2lkZW50aXRpZXMvYCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtRW52aXJvbm1lbnQtS2V5Ijp0aGlzLmVudmlyb25tZW50S2V5fSxib2R5OkpTT04uc3RyaW5naWZ5KHtpZGVudGlmaWVyOm4rKGU/eDoiIiksdHJhaXRzOmx9KSxzaWduYWw6RS5zaWduYWx9KTtpZihjbGVhclRpbWVvdXQodyksISQub2spdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAkeyQuc3RhdHVzfWApO2NvbnN0IFY9eWllbGQgJC5qc29uKCk7cmV0dXJuIEljKFYuZmxhZ3N8fFtdKX1jYXRjaChFKXthLmVycm9yKCJGbGFnc21pdGggaWRlbnRpZnkgZmFpbGVkISEiLHtlcnJvcjpFLHVybDp2fSl9cmV0dXJue319KX1pZGVudGlmeShhKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXt9LGU9ITEscz01ZTMsbj0iZWRnZS5hcGkuZmxhZ3NtaXRoLmNvbSIsaT1jb25zb2xlKXtyZXR1cm4gdGhpcy5mbGFncz15aWVsZCB0aGlzLmlkZW50aWZ5QW5kRmV0Y2hGbGFnc1dpdGhSZXRyeSh7dHJhaXRzT2JqOnIsdW5pcXVlSWRlbnRpZmllcjp0LGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0OnMscHJpbWFyeUVuZHBvaW50Om4sc2Vjb25kYXJ5RW5kcG9pbnQ6ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGxvZ2dlcjppfSksdGhpcy5mbGFnc30pfWdldFZhbHVlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLnZhbHVlfWhhc0ZlYXR1cmUodCl7cmV0dXJuIHRoaXMuZmxhZ3MmJnRoaXMuZmxhZ3NbdF0mJnRoaXMuZmxhZ3NbdF0uZW5hYmxlZH1nZXRBbGxGbGFncygpe3JldHVybiB0aGlzLmZsYWdzfX07ZnVuY3Rpb24gTWModCl7cmV0dXJuIG5ldyB3Yyh0KX12YXIgTXM9Wy0yLC0xLDAsMSwyXSxBYz1bMCwxLDIsMyw0XTtmdW5jdGlvbiBrYyh0KXt0PXQudHJpbSgpO2xldCByPSIwIixlPSIwIixzPSIwIjtyZXR1cm4gdC5sZW5ndGg9PTQ/KHI9YDB4JHt0WzFdfSR7dFsxXX1gLGU9YDB4JHt0WzJdfSR7dFsyXX1gLHM9YDB4JHt0WzNdfSR7dFszXX1gKTp0Lmxlbmd0aD42JiYocj1gMHgke3RbMV19JHt0WzJdfWAsZT1gMHgke3RbM119JHt0WzRdfWAscz1gMHgke3RbNV19JHt0WzZdfWApLFsrciwrZSwrc119dmFyIE9jPSh0LHIsZSk9PntsZXQgcyxuLGk7aWYocj09MClzPW49aT1lO2Vsc2V7Y29uc3QgYT0obCxtLHYpPT4odjwwJiYodis9MSksdj4xJiYodi09MSksdjwuMTY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSo2KnY6djwuNT9tOnY8LjY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSooLjY2NjY2NjY2NjY2NjY2NjYtdikqNjpsKSxkPWU8LjU/ZSooMStyKTplK3ItZSpyLG89MiplLWQ7cz1hKG8sZCx0KzEvMyksbj1hKG8sZCx0KSxpPWEobyxkLHQtMS8zKX1yZXR1cm5bTWF0aC5yb3VuZChzKjI1NSksTWF0aC5yb3VuZChuKjI1NSksTWF0aC5yb3VuZChpKjI1NSldfSxMYz0odCxyLGUpPT57dC89MjU1LHIvPTI1NSxlLz0yNTU7Y29uc3Qgcz1NYXRoLm1heCh0LHIsZSksbj1NYXRoLm1pbih0LHIsZSk7bGV0IGksYTtjb25zdCBkPShzK24pLzI7aWYocz09bilpPWE9MDtlbHNle2NvbnN0IG89cy1uO3N3aXRjaChhPWQ+LjU/by8oMi1zLW4pOm8vKHMrbikscyl7Y2FzZSB0Omk9KHItZSkvbysocjxlPzY6MCk7YnJlYWs7Y2FzZSByOmk9KGUtdCkvbysyO2JyZWFrO2Nhc2UgZTppPSh0LXIpL28rNDticmVha31pLz02fXJldHVybltpLGEsZF19LERjPSh0LHIsZSk9Pntjb25zdCBzPW49Pm4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gIyR7cyh0KX0ke3Mocil9JHtzKGUpfWB9LEFzPSh0LHI9TXMsZT0uNCk9Pntjb25zdCBzPVtdLFtuLGksYV09a2ModCksW2QsbyxsXT1MYyhuLGksYSksbT1NYXRoLnJvdW5kKGwqMTAwKTttPjcwP2U9Ljg6bT42MD9lPS45Om08MTA/ZT0uMDc1Om08NDImJihlPS4zKTtjb25zdCB2PXIuZmluZEluZGV4KFY9PlY9PT0wKTtpZih2PT09LTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJlZHVjZXIgcHJvdmlkZWQsIGl0IG11c3QgY29udGFpbiBhdGxlYXN0IG9uZSB6ZXJvIik7Y29uc3QgRT01LXYsdz12KzEseD0oMTAwLW0pL0UsJD1tL3c7Zm9yKGNvbnN0IFYgb2Ygcil7bGV0IEg7VjwwP0g9bStWKiQqZTpWPjA/SD1tK1YqeCplOkg9bTtjb25zdFtaLHZlLHllXT1PYyhkLG8sSC8xMDApO3MucHVzaChEYyhaLHZlLHllKSl9cmV0dXJuIHN9LGtzPXtkYXJrOntiYWNrZ3JvdW5kOnsxZTM6IiMyNTI1MjUiLDkwMDoiIzJGMkYyRiIsODAwOiIjMzIzMjMyIiw3MDA6IiMzRTNFM0UiLDYwMDoiIzRBNEE0QSJ9LHRleHQ6IiNGNUY1RjUiLCJ2aWRlby1iZyI6IiMxQzFDMUMifSxsaWdodDp7YmFja2dyb3VuZDp7MWUzOiIjRkZGRkZGIiw5MDA6IiNGNUY1RjUiLDgwMDoiI0VCRUJFQiIsNzAwOiIjRTBFMEUwIiw2MDA6IiNENkQ2RDYifSx0ZXh0OiIjMTExMTExIiwidGV4dC1vbi1icmFuZCI6IiNmZmZmZmYiLCJ2aWRlby1iZyI6IiNEQURBREEifX0sTmM9dD0+e2NvbnN0W3IsZSxzLG4saV09QXModCxNcyk7cmV0dXJuezMwMDpyLDQwMDplLDUwMDpzLDYwMDpuLDcwMDppfX0sRmM9dD0+e2lmKHQ9PT0iI0ZGRkZGRiIpcmV0dXJuIGtzLmxpZ2h0LmJhY2tncm91bmQ7aWYodD09PSIjMDAwMDAwIilyZXR1cm4ga3MuZGFyay5iYWNrZ3JvdW5kO2NvbnN0W3IsZSxzLG4saV09QXModCxBYyk7cmV0dXJuezFlMzpyLDkwMDplLDgwMDpzLDcwMDpuLDYwMDppfX0sVmM9e2JvcmRlcl9yYWRpdXM6InJvdW5kZWQiLGJvcmRlcl93aWR0aDoidGhpbiIsc3BhY2luZ19iYXNlOjQsdGhlbWU6ImRhcmsiLGNvbG9yczp7YnJhbmQ6TmMoIiMyMTYwRkQiKSxiYWNrZ3JvdW5kOkZjKCIjMTQxNDE0IiksZGFuZ2VyOiIjRkYyRDJEIix0ZXh0OiIjRUVFRUVFIix0ZXh0X29uX2JyYW5kOiIjRUVFRUVFIixzdWNjZXNzOiIjNjJBNTA0Iix2aWRlb19iZzoiIzE5MTkxOSIsd2FybmluZzoiI0ZGQ0QwNyJ9fTtmdW5jdGlvbiBPcygpe3JldHVybiBDYyhWYyl9T3MoKSxPcygpO2NsYXNzIEJje2NvbnN0cnVjdG9yKCl7SXQodGhpcyxWZSx2b2lkIDApfWdldCB0ZWxlbWV0cnkoKXt2YXIgcjtyZXR1cm4ocj1lZSh0aGlzLFZlKSk9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQocil7Q2UodGhpcyxWZSxyKX1pbmZvKHIsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlLHMpfWVycm9yKHIsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHIsZSxzKX1kZWJ1ZyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIixyLGUscyl9bG9nKHIsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIixyLGUscyl9d2FybihyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHIsZSxzKX19VmU9bmV3IFdlYWtNYXA7Y29uc3QgdHI9Y2xhc3MgZXh0ZW5kcyBxLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO0l0KHRoaXMsbmUsdm9pZCAwKTtJdCh0aGlzLGllLHZvaWQgMCk7cCh0aGlzLCJhc3luY1Byb21pc2VUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLENlKHRoaXMsbmUsbmV3IE1hcCksQ2UodGhpcyxpZSxuZXcgTWFwKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQ9OGUzfWVtaXRBc3luYyhlLC4uLnMpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtlZSh0aGlzLG5lKS5zZXQoZSxbXSk7Y29uc3Qgbj1lZSh0aGlzLGllKS5nZXQoZSkubWFwKCgpPT5uZXcgUHJvbWlzZShpPT57ZWUodGhpcyxuZSkuZ2V0KGUpLnB1c2goaSl9KSk7dG4odHIucHJvdG90eXBlLHRoaXMsImVtaXQiKS5jYWxsKHRoaXMsZSwuLi5zKSx5aWVsZCBQcm9taXNlLnJhY2UoW1Byb21pc2UuYWxsKG4pLG5ldyBQcm9taXNlKChpLGEpPT5zZXRUaW1lb3V0KCgpPT5hKG5ldyBFcnJvcihgZW1pdEFzeW5jIGZhaWxlZCB0byByZXNvbHZlIGZvciBldmVudCAke2V9LmApKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQpKV0pLGVlKHRoaXMsbmUpLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxzKXtjb25zdCBuPWVlKHRoaXMsbmUpLGk9KC4uLmEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgbzt0cnl7eWllbGQgcyguLi5hKX1jYXRjaChsKXt0aGlzLmxvZ2dlci5lcnJvcigiW29uQXN5bmNdIix7ZXJyb3I6bH0pfWNvbnN0IGQ9KG89bi5nZXQoZSkpPT1udWxsP3ZvaWQgMDpvLnNoaWZ0KCk7ZD09bnVsbHx8ZCgpfSk7cmV0dXJuIGVlKHRoaXMsaWUpLmdldChlKXx8ZWUodGhpcyxpZSkuc2V0KGUsW10pLGVlKHRoaXMsaWUpLmdldChlKS5wdXNoKGkpLHN1cGVyLm9uKGUsaSl9cmVzZXQoKXtDZSh0aGlzLG5lLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgS3Q9dHI7bmU9bmV3IFdlYWtNYXAsaWU9bmV3IFdlYWtNYXA7dmFyIFR0LHhjPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBqYygpe2lmKCFUdCYmKFR0PXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFUdCkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBUdCh4Yyl9dmFyIFVjPS9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtmdW5jdGlvbiAkYyh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiZVYy50ZXN0KHQpfWZvcih2YXIgVz1bXSxXdD0wO1d0PDI1NjsrK1d0KVcucHVzaCgoV3QrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBIYyh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MCxlPShXW3RbciswXV0rV1t0W3IrMV1dK1dbdFtyKzJdXStXW3RbciszXV0rIi0iK1dbdFtyKzRdXStXW3Rbcis1XV0rIi0iK1dbdFtyKzZdXStXW3Rbcis3XV0rIi0iK1dbdFtyKzhdXStXW3Rbcis5XV0rIi0iK1dbdFtyKzEwXV0rV1t0W3IrMTFdXStXW3RbcisxMl1dK1dbdFtyKzEzXV0rV1t0W3IrMTRdXStXW3RbcisxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCEkYyhlKSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiBlfWZ1bmN0aW9uIEtjKHQscixlKXt0PXR8fHt9O3ZhciBzPXQucmFuZG9tfHwodC5ybmd8fGpjKSgpO2lmKHNbNl09c1s2XSYxNXw2NCxzWzhdPXNbOF0mNjN8MTI4LHIpe2U9ZXx8MDtmb3IodmFyIG49MDtuPDE2OysrbilyW2Urbl09c1tuXTtyZXR1cm4gcn1yZXR1cm4gSGMocyl9dmFyIFdjPSJbb2JqZWN0IE1hcF0iLHpjPSJbb2JqZWN0IFNldF0iLEdjPU9iamVjdC5wcm90b3R5cGUscWM9R2MuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gWWModCl7aWYodD09bnVsbClyZXR1cm4hMDtpZihOdCh0KSYmKHl0KHQpfHx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0LnNwbGljZT09ImZ1bmN0aW9uInx8T3QodCl8fGVzKHQpfHxHcih0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciByPUV0KHQpO2lmKHI9PVdjfHxyPT16YylyZXR1cm4hdC5zaXplO2lmKGJ0KHQpKXJldHVybiFzcyh0KS5sZW5ndGg7Zm9yKHZhciBlIGluIHQpaWYocWMuY2FsbCh0LGUpKXJldHVybiExO3JldHVybiEwfWNvbnN0IHp0PXtQUk9QQUdBVEVfS0lDS19BTEw6InByb3BhZ2F0ZV9raWNrX2Fjcm9zc19yb29tcyIsUkVGUkVTSF9JRF9PTl9ESVNDT05ORUNUSU9OOiJyZWZyZXNoX2lkX29uX2Rpc2Nvbm5lY3Rpb24iLFNLSVBfT1RFTF9UUkFDRVM6InNraXBfb3RlbF90cmFjZXMiLENGX1RSQU5TUE9SVF9GT1JDRV9SRUxBWV9PTl9JQ0VfRkFJTEVEOiJjZl90cmFuc3BvcnRfZm9yY2VfcmVsYXlfb25faWNlX2ZhaWxlZCIsTE9HX0xFVkVMOiJsb2dfbGV2ZWwiLFYxX1BMVUdJTlM6InYxX3BsdWdpbnMiLExJVkVTVFJFQU06ImZlYXRfbGl2ZXN0cmVhbSIsVkFMX01JTl9GUkFNRVJBVEU6InZhbF9taW5fZnJhbWVyYXRlIixTQ1JFRUVOU0hBUkVfRVJSX0hBQ0s6InNjcmVlbnNoYXJlX2Vycl9oYWNrIixTQ1JFRUVOU0hBUkVfQ09OU1RSQUlOVFNfUkVUUlk6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzX3JldHJ5IixTQ1JFRU5TSEFSRV9DT05TVFJBSU5UUzoic2NyZWVuc2hhcmVfY29uc3RyYWludHMiLE9CU19RVUFMSVRZOiJvYnNfcXVhbGl0eSIsQUxMT1dfU0FGQVJJX01FRElBX01JRERMRVdBUkVTOiJhbGxvd19zYWZhcmlfbWVkaWFfbWlkZGxld2FyZXMiLEVYUF9SRVNIQVJFOiJleHBfcmVzaGFyZSIsU0tJUF9TRVRUSU5HX0lOX1VTRV9ERVZJQ0U6InNraXBfc2V0dGluZ19pbl91c2VfZGV2aWNlIixQUkVDQUxMX0JBTkRXSURUSF9URVNUOiJwcmVjYWxsX2JhbmR3aWR0aF90ZXN0IixERUJVR19TT0NLRVRfSk9JTjoiZGVidWdfc29ja2V0X2pvaW4iLEZPUkNFX1JFTEFZOiJmb3JjZV9yZWxheSIsRk9SQ0VfVklERU9fQ09ERUM6ImZvcmNlX3ZpZGVvX2NvZGVjIixUUkFDS19ISU5UOiJ0cmFja19oaW50IixQUkVDUkVBVEVfUFJPRFVDRVJTOiJwcmVjcmVhdGVfcHJvZHVjZXJzIixESVNBQkxFX09QVVNfRFRYX0NGOiJkaXNhYmxlX29wdXNfZHR4X2NmIixFTkFCTEVfQVVESU9fQUNUSVZJVFlfREVCVUdfTE9HUzoiZW5hYmxlX2F1ZGlvX2FjdGl2aXR5X2RlYnVnX2xvZ3MiLERJU0FCTEVfTEFZRVJfU1dJVENIOiJkaXNhYmxlX2xheWVyX3N3aXRjaCJ9O2Z1bmN0aW9uIFJ0KHQpe2NvbnN0IHI9e307cmV0dXJuIHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LmNvZGUpPT0ibnVtYmVyIiYmKHIuY29kZT10LmNvZGUpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LmNvZGUpPT0ic3RyaW5nIiYmKHIuY29kZT10LmNvZGUuc3Vic3RyaW5nKDAsMTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubmFtZSk9PSJzdHJpbmciJiYoci5uYW1lPXQubmFtZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5tZXNzYWdlKT09InN0cmluZyImJihyLm1lc3NhZ2U9dC5tZXNzYWdlLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnJlYXNvbik9PSJzdHJpbmciJiYoci5yZWFzb249dC5yZWFzb24uc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQuc3RhY2spPT0ic3RyaW5nIiYmKHIuc3RhY2s9dC5zdGFjay5zdWJzdHJpbmcoMCw1MDApKSxyfWZ1bmN0aW9uIFFjKHtzZXJ2aWNlUHJlZml4OnQsYmFzZVVSSTpyfSl7cmV0dXJuYCR7dH0uJHtyfWB9Y29uc3QgSmM9e2xvZ3M6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL2xvZ3Mvb3RlbC9sb2dzIixtb2NrOnt1cmw6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21vY2siLGRvbWFpbjoibW9jay5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsYXBwOiJodHRwczovL2V4YW1wbGVzLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21lZXRpbmciLHN0YWdpbmdBcHA6Imh0dHBzOi8vZXhhbXBsZXMuc3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tZWV0aW5nIn0sYXBpQmFzZTp7cHJvZDoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLHN0YWdpbmc6Imh0dHBzOi8vYXBpLnN0YWdpbmcucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLHByb2RBbHRlcm5hdGU6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIn0sYmFzZVVSSTp7cHJvZDoicmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLHN0YWdpbmc6InN0YWdpbmcucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20ifX07ZnVuY3Rpb24gWGModCl7dmFyIHMsbixpO2NvbnN0IHI9dHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJiFuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJigocz13aW5kb3cubG9jYXRpb24uaG9zdCk9PW51bGw/dm9pZCAwOnMuaW5jbHVkZXMoSmMuYmFzZVVSSS5zdGFnaW5nKSksZT0hISgoaT0obj10PT1udWxsP3ZvaWQgMDp0LmdldFZhbHVlKCJtb2R1bGVzIikpPT1udWxsP3ZvaWQgMDpuLmRldlRvb2xzKSE9bnVsbCYmaS5sb2dzKTtyZXR1cm4gcnx8ZX1mdW5jdGlvbiBaYyh0LHIpe3ZhciBlO2lmKHQhPW51bGwmJnQuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmhhc0ZlYXR1cmUoenQuTE9HX0xFVkVMKSl7bGV0IHM9KChlPXQuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmdldFZhbHVlKHp0LkxPR19MRVZFTCkpPT1udWxsP3ZvaWQgMDplLnRvU3RyaW5nKCkpfHwiYWxsIjtpZihzPXMudG9Mb3dlckNhc2UoKS50cmltKCkscz09PSJvZmYiKXJldHVybiExO2lmKHMhPT0iYWxsIil7Y29uc3Qgbj1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9bi5pbmRleE9mKHIpLGE9bi5pbmRleE9mKHMpO2lmKGk8YSlyZXR1cm4hMX19cmV0dXJuITB9ZnVuY3Rpb24gTHModCxyLGU9e30pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5mb3JFYWNoKHM9Pnt2YXIgaTtpZihbbnVsbCx2b2lkIDAsTmFOXS5pbmNsdWRlcyh0W3NdKXx8ciYmKCgoaT1yLm1hdGNoKC9cLi9nKSk9PW51bGw/dm9pZCAwOmkubGVuZ3RoKXx8MCk+PTEwKXJldHVybjtjb25zdCBuPXI/YCR7cn0uJHtzfWA6czt0eXBlb2YgdFtzXT09Im9iamVjdCI/THModFtzXSxuLGUpOlsibnVtYmVyIiwic3RyaW5nIiwiYm9vbGVhbiJdLmluY2x1ZGVzKHR5cGVvZiB0W3NdKSYmKGVbbl09dFtzXSl9KSxlfWZ1bmN0aW9uIERzKHQscixlPXt9LHM9IiIpe2NvbnN0IG49e307dHJ5e2NvbnN0IGk9SlNPTi5zdHJpbmdpZnkoZSksYT1KU09OLnBhcnNlKGkpLGQ9THMoYSxzKSxvPUpTT04uc3RyaW5naWZ5KGQpO3JldHVybiBKU09OLnBhcnNlKG8pfWNhdGNoKGkpe2NvbnN0IGE9UnQoaSk7bltgJHtzfS5lcnJvci5tZXNzYWdlYF09YS5tZXNzYWdlfHwiIixuW2Ake3N9LmVycm9yLnN0YWNrYF09YS5zdGFja3x8IiIsbltgJHtzfS5lcnJvci5yZWFzb25gXT1hLnJlYXNvbnx8IiIsbltgJHtzfS5lcnJvci5zb3VyY2VgXT0ic2FmZWx5RmxhdHRlbk9iakZvck9wZW5UZWxlbWV0cnkifXJldHVybiBufWNvbnN0IGVkPXsiQW1hem9uIFNpbGsiOiJhbWF6b25fc2lsayIsIkFuZHJvaWQgQnJvd3NlciI6ImFuZHJvaWQiLEJhZGE6ImJhZGEiLEJsYWNrQmVycnk6ImJsYWNrYmVycnkiLENocm9tZToiY2hyb21lIixDaHJvbWl1bToiY2hyb21pdW0iLEVsZWN0cm9uOiJlbGVjdHJvbiIsRXBpcGhhbnk6ImVwaXBoYW55IixGaXJlZm94OiJmaXJlZm94IixGb2N1czoiZm9jdXMiLEdlbmVyaWM6ImdlbmVyaWMiLCJHb29nbGUgU2VhcmNoIjoiZ29vZ2xlX3NlYXJjaCIsR29vZ2xlYm90OiJnb29nbGVib3QiLCJJbnRlcm5ldCBFeHBsb3JlciI6ImllIiwiSy1NZWxlb24iOiJrX21lbGVvbiIsTWF4dGhvbjoibWF4dGhvbiIsIk1pY3Jvc29mdCBFZGdlIjoiZWRnZSIsIk1aIEJyb3dzZXIiOiJteiIsIk5BVkVSIFdoYWxlIEJyb3dzZXIiOiJuYXZlciIsT3BlcmE6Im9wZXJhIiwiT3BlcmEgQ29hc3QiOiJvcGVyYV9jb2FzdCIsUGhhbnRvbUpTOiJwaGFudG9tanMiLFB1ZmZpbjoicHVmZmluIixRdXBaaWxsYToicXVwemlsbGEiLFFROiJxcSIsUVFMaXRlOiJxcWxpdGUiLFNhZmFyaToic2FmYXJpIixTYWlsZmlzaDoic2FpbGZpc2giLCJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIjoic2Ftc3VuZ19pbnRlcm5ldCIsU2VhTW9ua2V5OiJzZWFtb25rZXkiLFNsZWlwbmlyOiJzbGVpcG5pciIsU3dpbmc6InN3aW5nIixUaXplbjoidGl6ZW4iLCJVQyBCcm93c2VyIjoidWMiLFZpdmFsZGk6InZpdmFsZGkiLCJXZWJPUyBCcm93c2VyIjoid2Vib3MiLFdlQ2hhdDoid2VjaGF0IiwiWWFuZGV4IEJyb3dzZXIiOiJ5YW5kZXgiLFJva3U6InJva3UifSxOcz17YW1hem9uX3NpbGs6IkFtYXpvbiBTaWxrIixhbmRyb2lkOiJBbmRyb2lkIEJyb3dzZXIiLGJhZGE6IkJhZGEiLGJsYWNrYmVycnk6IkJsYWNrQmVycnkiLGNocm9tZToiQ2hyb21lIixjaHJvbWl1bToiQ2hyb21pdW0iLGVsZWN0cm9uOiJFbGVjdHJvbiIsZXBpcGhhbnk6IkVwaXBoYW55IixmaXJlZm94OiJGaXJlZm94Iixmb2N1czoiRm9jdXMiLGdlbmVyaWM6IkdlbmVyaWMiLGdvb2dsZWJvdDoiR29vZ2xlYm90Iixnb29nbGVfc2VhcmNoOiJHb29nbGUgU2VhcmNoIixpZToiSW50ZXJuZXQgRXhwbG9yZXIiLGtfbWVsZW9uOiJLLU1lbGVvbiIsbWF4dGhvbjoiTWF4dGhvbiIsZWRnZToiTWljcm9zb2Z0IEVkZ2UiLG16OiJNWiBCcm93c2VyIixuYXZlcjoiTkFWRVIgV2hhbGUgQnJvd3NlciIsb3BlcmE6Ik9wZXJhIixvcGVyYV9jb2FzdDoiT3BlcmEgQ29hc3QiLHBoYW50b21qczoiUGhhbnRvbUpTIixwdWZmaW46IlB1ZmZpbiIscXVwemlsbGE6IlF1cFppbGxhIixxcToiUVEgQnJvd3NlciIscXFsaXRlOiJRUSBCcm93c2VyIExpdGUiLHNhZmFyaToiU2FmYXJpIixzYWlsZmlzaDoiU2FpbGZpc2giLHNhbXN1bmdfaW50ZXJuZXQ6IlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWQiLHNlYW1vbmtleToiU2VhTW9ua2V5IixzbGVpcG5pcjoiU2xlaXBuaXIiLHN3aW5nOiJTd2luZyIsdGl6ZW46IlRpemVuIix1YzoiVUMgQnJvd3NlciIsdml2YWxkaToiVml2YWxkaSIsd2Vib3M6IldlYk9TIEJyb3dzZXIiLHdlY2hhdDoiV2VDaGF0Iix5YW5kZXg6IllhbmRleCBCcm93c2VyIn0sVT17dGFibGV0OiJ0YWJsZXQiLG1vYmlsZToibW9iaWxlIixkZXNrdG9wOiJkZXNrdG9wIix0djoidHYifSxHPXtXaW5kb3dzUGhvbmU6IldpbmRvd3MgUGhvbmUiLFdpbmRvd3M6IldpbmRvd3MiLE1hY09TOiJtYWNPUyIsaU9TOiJpT1MiLEFuZHJvaWQ6IkFuZHJvaWQiLFdlYk9TOiJXZWJPUyIsQmxhY2tCZXJyeToiQmxhY2tCZXJyeSIsQmFkYToiQmFkYSIsVGl6ZW46IlRpemVuIixMaW51eDoiTGludXgiLENocm9tZU9TOiJDaHJvbWUgT1MiLFBsYXlTdGF0aW9uNDoiUGxheVN0YXRpb24gNCIsUm9rdToiUm9rdSJ9LG9lPXtFZGdlSFRNTDoiRWRnZUhUTUwiLEJsaW5rOiJCbGluayIsVHJpZGVudDoiVHJpZGVudCIsUHJlc3RvOiJQcmVzdG8iLEdlY2tvOiJHZWNrbyIsV2ViS2l0OiJXZWJLaXQifTtjbGFzcyBne3N0YXRpYyBnZXRGaXJzdE1hdGNoKHIsZSl7Y29uc3Qgcz1lLm1hdGNoKHIpO3JldHVybiBzJiZzLmxlbmd0aD4wJiZzWzFdfHwiIn1zdGF0aWMgZ2V0U2Vjb25kTWF0Y2gocixlKXtjb25zdCBzPWUubWF0Y2gocik7cmV0dXJuIHMmJnMubGVuZ3RoPjEmJnNbMl18fCIifXN0YXRpYyBtYXRjaEFuZFJldHVybkNvbnN0KHIsZSxzKXtpZihyLnRlc3QoZSkpcmV0dXJuIHN9c3RhdGljIGdldFdpbmRvd3NWZXJzaW9uTmFtZShyKXtzd2l0Y2gocil7Y2FzZSJOVCI6cmV0dXJuIk5UIjtjYXNlIlhQIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4wIjpyZXR1cm4iMjAwMCI7Y2FzZSJOVCA1LjEiOnJldHVybiJYUCI7Y2FzZSJOVCA1LjIiOnJldHVybiIyMDAzIjtjYXNlIk5UIDYuMCI6cmV0dXJuIlZpc3RhIjtjYXNlIk5UIDYuMSI6cmV0dXJuIjciO2Nhc2UiTlQgNi4yIjpyZXR1cm4iOCI7Y2FzZSJOVCA2LjMiOnJldHVybiI4LjEiO2Nhc2UiTlQgMTAuMCI6cmV0dXJuIjEwIjtkZWZhdWx0OnJldHVybn19c3RhdGljIGdldE1hY09TVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksZVswXT09PTEwKXN3aXRjaChlWzFdKXtjYXNlIDU6cmV0dXJuIkxlb3BhcmQiO2Nhc2UgNjpyZXR1cm4iU25vdyBMZW9wYXJkIjtjYXNlIDc6cmV0dXJuIkxpb24iO2Nhc2UgODpyZXR1cm4iTW91bnRhaW4gTGlvbiI7Y2FzZSA5OnJldHVybiJNYXZlcmlja3MiO2Nhc2UgMTA6cmV0dXJuIllvc2VtaXRlIjtjYXNlIDExOnJldHVybiJFbCBDYXBpdGFuIjtjYXNlIDEyOnJldHVybiJTaWVycmEiO2Nhc2UgMTM6cmV0dXJuIkhpZ2ggU2llcnJhIjtjYXNlIDE0OnJldHVybiJNb2phdmUiO2Nhc2UgMTU6cmV0dXJuIkNhdGFsaW5hIjtkZWZhdWx0OnJldHVybn19c3RhdGljIGdldEFuZHJvaWRWZXJzaW9uTmFtZShyKXtjb25zdCBlPXIuc3BsaXQoIi4iKS5zcGxpY2UoMCwyKS5tYXAocz0+cGFyc2VJbnQocywxMCl8fDApO2lmKGUucHVzaCgwKSwhKGVbMF09PT0xJiZlWzFdPDUpKXtpZihlWzBdPT09MSYmZVsxXTw2KXJldHVybiJDdXBjYWtlIjtpZihlWzBdPT09MSYmZVsxXT49NilyZXR1cm4iRG9udXQiO2lmKGVbMF09PT0yJiZlWzFdPDIpcmV0dXJuIkVjbGFpciI7aWYoZVswXT09PTImJmVbMV09PT0yKXJldHVybiJGcm95byI7aWYoZVswXT09PTImJmVbMV0+MilyZXR1cm4iR2luZ2VyYnJlYWQiO2lmKGVbMF09PT0zKXJldHVybiJIb25leWNvbWIiO2lmKGVbMF09PT00JiZlWzFdPDEpcmV0dXJuIkljZSBDcmVhbSBTYW5kd2ljaCI7aWYoZVswXT09PTQmJmVbMV08NClyZXR1cm4iSmVsbHkgQmVhbiI7aWYoZVswXT09PTQmJmVbMV0+PTQpcmV0dXJuIktpdEthdCI7aWYoZVswXT09PTUpcmV0dXJuIkxvbGxpcG9wIjtpZihlWzBdPT09NilyZXR1cm4iTWFyc2htYWxsb3ciO2lmKGVbMF09PT03KXJldHVybiJOb3VnYXQiO2lmKGVbMF09PT04KXJldHVybiJPcmVvIjtpZihlWzBdPT09OSlyZXR1cm4iUGllIn19c3RhdGljIGdldFZlcnNpb25QcmVjaXNpb24ocil7cmV0dXJuIHIuc3BsaXQoIi4iKS5sZW5ndGh9c3RhdGljIGNvbXBhcmVWZXJzaW9ucyhyLGUscz0hMSl7Y29uc3Qgbj1nLmdldFZlcnNpb25QcmVjaXNpb24ociksaT1nLmdldFZlcnNpb25QcmVjaXNpb24oZSk7bGV0IGE9TWF0aC5tYXgobixpKSxkPTA7Y29uc3Qgbz1nLm1hcChbcixlXSxsPT57Y29uc3QgbT1hLWcuZ2V0VmVyc2lvblByZWNpc2lvbihsKSx2PWwrbmV3IEFycmF5KG0rMSkuam9pbigiLjAiKTtyZXR1cm4gZy5tYXAodi5zcGxpdCgiLiIpLEU9Pm5ldyBBcnJheSgyMC1FLmxlbmd0aCkuam9pbigiMCIpK0UpLnJldmVyc2UoKX0pO2ZvcihzJiYoZD1hLU1hdGgubWluKG4saSkpLGEtPTE7YT49ZDspe2lmKG9bMF1bYV0+b1sxXVthXSlyZXR1cm4gMTtpZihvWzBdW2FdPT09b1sxXVthXSl7aWYoYT09PWQpcmV0dXJuIDA7YS09MX1lbHNlIGlmKG9bMF1bYV08b1sxXVthXSlyZXR1cm4tMX19c3RhdGljIG1hcChyLGUpe2NvbnN0IHM9W107bGV0IG47aWYoQXJyYXkucHJvdG90eXBlLm1hcClyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHIsZSk7Zm9yKG49MDtuPHIubGVuZ3RoO24rPTEpcy5wdXNoKGUocltuXSkpO3JldHVybiBzfXN0YXRpYyBmaW5kKHIsZSl7bGV0IHMsbjtpZihBcnJheS5wcm90b3R5cGUuZmluZClyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbmQuY2FsbChyLGUpO2ZvcihzPTAsbj1yLmxlbmd0aDtzPG47cys9MSl7Y29uc3QgaT1yW3NdO2lmKGUoaSxzKSlyZXR1cm4gaX19c3RhdGljIGFzc2lnbihyLC4uLmUpe2NvbnN0IHM9cjtsZXQgbixpO2lmKE9iamVjdC5hc3NpZ24pcmV0dXJuIE9iamVjdC5hc3NpZ24ociwuLi5lKTtmb3Iobj0wLGk9ZS5sZW5ndGg7bjxpO24rPTEpe2NvbnN0IGE9ZVtuXTt0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsJiZPYmplY3Qua2V5cyhhKS5mb3JFYWNoKG89PntzW29dPWFbb119KX1yZXR1cm4gcn1zdGF0aWMgZ2V0QnJvd3NlckFsaWFzKHIpe3JldHVybiBlZFtyXX1zdGF0aWMgZ2V0QnJvd3NlclR5cGVCeUFsaWFzKHIpe3JldHVybiBOc1tyXXx8IiJ9fWNvbnN0IEQ9L3ZlcnNpb25cLyhcZCsoXC4/Xz9cZCspKykvaSx0ZD1be3Rlc3Q6Wy9nb29nbGVib3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiR29vZ2xlYm90In0sZT1nLmdldEZpcnN0TWF0Y2goL2dvb2dsZWJvdFwvKFxkKyhcLlxkKykpL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wZXJhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcGVyYSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcHJcL3xvcGlvcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcHJ8b3Bpb3MpW1xzL10oXFMrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9TYW1zdW5nQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpTYW1zdW5nQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9XaGFsZS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJOQVZFUiBXaGFsZSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzp3aGFsZSlbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01aQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNWiBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Ok1aQnJvd3NlcilbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9mb2N1cy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJGb2N1cyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpmb2N1cylbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zd2luZy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTd2luZyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpzd2luZylbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jb2FzdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSBDb2FzdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86Y29hc3QpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3B0XC9cZCsoPzouP18/XGQrKSsvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgVG91Y2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3B0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy95YWJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiWWFuZGV4IEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86eWFicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy91Y2Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVUMgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86dWNicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01heHRob258bXhpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWF4dGhvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86TWF4dGhvbnxteGlvcylbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lcGlwaGFueS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJFcGlwaGFueSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86ZXBpcGhhbnkpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcHVmZmluL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlB1ZmZpbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86cHVmZmluKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NsZWlwbmlyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNsZWlwbmlyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpzbGVpcG5pcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9rLW1lbGVvbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJLLU1lbGVvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86ay1tZWxlb24pW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbWljcm9tZXNzZW5nZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2VDaGF0In0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1pY3JvbWVzc2VuZ2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9xcWJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTovcXFicm93c2VybGl0ZS9pLnRlc3QodCk/IlFRIEJyb3dzZXIgTGl0ZSI6IlFRIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXFicm93c2VybGl0ZXxxcWJyb3dzZXIpWy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tc2llfHRyaWRlbnQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSW50ZXJuZXQgRXhwbG9yZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86bXNpZSB8cnY6KShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9cc2VkZ1wvL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1pY3Jvc29mdCBFZGdlIn0sZT1nLmdldEZpcnN0TWF0Y2goL1xzZWRnXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWRnKFtlYV18aW9zKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvZWRnKFtlYV18aW9zKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3ZpdmFsZGkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVml2YWxkaSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC92aXZhbGRpXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2VhbW9ua2V5L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNlYU1vbmtleSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zZWFtb25rZXlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWlsZmlzaC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYWlsZmlzaCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zYWlsZmlzaFxzP2Jyb3dzZXJcLyhcZCsoXC5cZCspPykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFtYXpvbiBTaWxrIn0sZT1nLmdldEZpcnN0TWF0Y2goL3NpbGtcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9waGFudG9tL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlBoYW50b21KUyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9waGFudG9tanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGltZXJqcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGltZXJKUyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zbGltZXJqc1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJCbGFja0JlcnJ5In0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5W1xkXStcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJXZWJPUyBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC93KD86ZWIpP1tvMF1zYnJvd3NlclwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2JhZGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmFkYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9kb2xmaW5cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy90aXplbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJUaXplbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzp0aXplblxzPyk/YnJvd3NlclwvKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9xdXB6aWxsYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJRdXBaaWxsYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpxdXB6aWxsYSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRmlyZWZveCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpmaXJlZm94fGljZXdlYXNlbHxmeGlvcylbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lbGVjdHJvbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJFbGVjdHJvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzplbGVjdHJvbilcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NaXVpQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaXVpIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Ok1pdWlCcm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2Nocm9taXVtL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkNocm9taXVtIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9taXVtKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWV8Y3Jpb3N8Y3Jtby9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWUifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Y2hyb21lfGNyaW9zfGNybW8pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvR1NBL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZSBTZWFyY2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86R1NBKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQW5kcm9pZCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9wbGF5c3RhdGlvbiA0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlBsYXlTdGF0aW9uIDQifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NhZmFyaXxhcHBsZXdlYmtpdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYWZhcmkifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbLy4qL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9L14oLiopXC8oLiopIC8sZT0vXiguKilcLyguKilbIFx0XVwoKC4qKS8sbj10LnNlYXJjaCgiXFwoIikhPT0tMT9lOnI7cmV0dXJue25hbWU6Zy5nZXRGaXJzdE1hdGNoKG4sdCksdmVyc2lvbjpnLmdldFNlY29uZE1hdGNoKG4sdCl9fX1dO3ZhciByZD1be3Rlc3Q6Wy9Sb2t1XC9EVlAvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUm9rdVwvRFZQLShcZCtcLlxkKykvaSx0KTtyZXR1cm57bmFtZTpHLlJva3UsdmVyc2lvbjpyfX19LHt0ZXN0Olsvd2luZG93cyBwaG9uZS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvd2luZG93cyBwaG9uZSAoPzpvcyk/XHM/KFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuV2luZG93c1Bob25lLHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9XaW5kb3dzICgoTlR8WFApKCBcZFxkPy5cZCk/KS9pLHQpLGU9Zy5nZXRXaW5kb3dzVmVyc2lvbk5hbWUocik7cmV0dXJue25hbWU6Ry5XaW5kb3dzLHZlcnNpb246cix2ZXJzaW9uTmFtZTplfX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpHLmlPU30sZT1nLmdldFNlY29uZE1hdGNoKC8oVmVyc2lvblwvKShcZFtcZC5dKykvLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21hY2ludG9zaC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvbWFjIG9zIHggKFxkKyhcLj9fP1xkKykrKS9pLHQpLnJlcGxhY2UoL1tfXHNdL2csIi4iKSxlPWcuZ2V0TWFjT1NWZXJzaW9uTmFtZShyKSxzPXtuYW1lOkcuTWFjT1MsdmVyc2lvbjpyfTtyZXR1cm4gZSYmKHMudmVyc2lvbk5hbWU9ZSksc319LHt0ZXN0OlsvKGlwb2R8aXBob25lfGlwYWQpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9vcyAoXGQrKFtfXHNdXGQrKSopIGxpa2UgbWFjIG9zIHgvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIik7cmV0dXJue25hbWU6Ry5pT1MsdmVyc2lvbjpyfX19LHt0ZXN0KHQpe2NvbnN0IHI9IXQudGVzdCgvbGlrZSBhbmRyb2lkL2kpLGU9dC50ZXN0KC9hbmRyb2lkL2kpO3JldHVybiByJiZlfSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvYW5kcm9pZFtccy8tXShcZCsoXC5cZCspKikvaSx0KSxlPWcuZ2V0QW5kcm9pZFZlcnNpb25OYW1lKHIpLHM9e25hbWU6Ry5BbmRyb2lkLHZlcnNpb246cn07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyh3ZWJ8aHB3KVtvMF1zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oPzp3ZWJ8aHB3KVtvMF1zXC8oXGQrKFwuXGQrKSopL2ksdCksZT17bmFtZTpHLldlYk9TfTtyZXR1cm4gciYmci5sZW5ndGgmJihlLnZlcnNpb249ciksZX19LHt0ZXN0OlsvYmxhY2tiZXJyeXxcYmJiXGQrL2ksL3JpbVxzdGFibGV0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9yaW1cc3RhYmxldFxzb3NccyhcZCsoXC5cZCspKikvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5XGQrXC8oXGQrKFtfXHNdXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvXGJiYihcZCspL2ksdCk7cmV0dXJue25hbWU6Ry5CbGFja0JlcnJ5LHZlcnNpb246cn19fSx7dGVzdDpbL2JhZGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2JhZGFcLyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLkJhZGEsdmVyc2lvbjpyfX19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3RpemVuWy9cc10oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5UaXplbix2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9saW51eC9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOkcuTGludXh9fX0se3Rlc3Q6Wy9Dck9TL10sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkNocm9tZU9TfX19LHt0ZXN0OlsvUGxheVN0YXRpb24gNC9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9QbGF5U3RhdGlvbiA0Wy9cc10oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5QbGF5U3RhdGlvbjQsdmVyc2lvbjpyfX19XSxzZD1be3Rlc3Q6Wy9nb29nbGVib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZToiYm90Iix2ZW5kb3I6Ikdvb2dsZSJ9fX0se3Rlc3Q6Wy9odWF3ZWkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhjYW4tbDAxKS9pLHQpJiYiTm92YSIsZT17dHlwZTpVLm1vYmlsZSx2ZW5kb3I6Ikh1YXdlaSJ9O3JldHVybiByJiYoZS5tb2RlbD1yKSxlfX0se3Rlc3Q6Wy9uZXh1c1xzKig/Ojd8OHw5fDEwKS4qL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJOZXh1cyJ9fX0se3Rlc3Q6Wy9pcGFkL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFwcGxlIixtb2RlbDoiaVBhZCJ9fX0se3Rlc3Q6Wy9rZnR0IGJ1aWxkL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBbWF6b24iLG1vZGVsOiJLaW5kbGUgRmlyZSBIRCA3In19fSx7dGVzdDpbL3NpbGsvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFtYXpvbiJ9fX0se3Rlc3Q6Wy90YWJsZXQoPyEgcGMpL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXR9fX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2lwb2R8aXBob25lL2kpLGU9dC50ZXN0KC9saWtlIChpcG9kfGlwaG9uZSkvaSk7cmV0dXJuIHImJiFlfSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKGlwb2R8aXBob25lKS9pLHQpO3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiQXBwbGUiLG1vZGVsOnJ9fX0se3Rlc3Q6Wy9uZXh1c1xzKlswLTZdLiovaSwvZ2FsYXh5IG5leHVzL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGUsdmVuZG9yOiJOZXh1cyJ9fX0se3Rlc3Q6Wy9bXi1dbW9iaS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJibGFja2JlcnJ5In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZSx2ZW5kb3I6IkJsYWNrQmVycnkifX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJiYWRhIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSgpPT09IndpbmRvd3MgcGhvbmUifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiTWljcm9zb2Z0In19fSx7dGVzdCh0KXtjb25zdCByPU51bWJlcihTdHJpbmcodC5nZXRPU1ZlcnNpb24oKSkuc3BsaXQoIi4iKVswXSk7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIiYmcj49M30sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImFuZHJvaWQifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0ibWFjb3MifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcCx2ZW5kb3I6IkFwcGxlIn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09IndpbmRvd3MifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImxpbnV4In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJwbGF5c3RhdGlvbiA0In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnR2fX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icm9rdSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50dn19fV0sbmQ9W3t0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJtaWNyb3NvZnQgZWRnZSJ9LGRlc2NyaWJlKHQpe2lmKC9cc2VkZ1wvL2kudGVzdCh0KSlyZXR1cm57bmFtZTpvZS5CbGlua307Y29uc3QgZT1nLmdldEZpcnN0TWF0Y2goL2VkZ2VcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm57bmFtZTpvZS5FZGdlSFRNTCx2ZXJzaW9uOmV9fX0se3Rlc3Q6Wy90cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuVHJpZGVudH0sZT1nLmdldEZpcnN0TWF0Y2goL3RyaWRlbnRcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7cmV0dXJuIHQudGVzdCgvcHJlc3RvL2kpfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlByZXN0b30sZT1nLmdldEZpcnN0TWF0Y2goL3ByZXN0b1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtjb25zdCByPXQudGVzdCgvZ2Vja28vaSksZT10LnRlc3QoL2xpa2UgZ2Vja28vaSk7cmV0dXJuIHImJiFlfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLkdlY2tvfSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZ2Vja29cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8oYXBwbGUpP3dlYmtpdFwvNTM3XC4zNi9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOm9lLkJsaW5rfX19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5XZWJLaXR9LGU9Zy5nZXRGaXJzdE1hdGNoKC93ZWJraXRcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX1dO2NsYXNzIEZze2NvbnN0cnVjdG9yKHIsZT0hMSl7aWYocj09bnVsbHx8cj09PSIiKXRocm93IG5ldyBFcnJvcigiVXNlckFnZW50IHBhcmFtZXRlciBjYW4ndCBiZSBlbXB0eSIpO3RoaXMuX3VhPXIsdGhpcy5wYXJzZWRSZXN1bHQ9e30sZSE9PSEwJiZ0aGlzLnBhcnNlKCl9Z2V0VUEoKXtyZXR1cm4gdGhpcy5fdWF9dGVzdChyKXtyZXR1cm4gci50ZXN0KHRoaXMuX3VhKX1wYXJzZUJyb3dzZXIoKXt0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyPXt9O2NvbnN0IHI9Zy5maW5kKHRkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXJ9Z2V0QnJvd3Nlcigpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyP3RoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI6dGhpcy5wYXJzZUJyb3dzZXIoKX1nZXRCcm93c2VyTmFtZShyKXtyZXR1cm4gcj9TdHJpbmcodGhpcy5nZXRCcm93c2VyKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRCcm93c2VyKCkubmFtZXx8IiJ9Z2V0QnJvd3NlclZlcnNpb24oKXtyZXR1cm4gdGhpcy5nZXRCcm93c2VyKCkudmVyc2lvbn1nZXRPUygpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5vcz90aGlzLnBhcnNlZFJlc3VsdC5vczp0aGlzLnBhcnNlT1MoKX1wYXJzZU9TKCl7dGhpcy5wYXJzZWRSZXN1bHQub3M9e307Y29uc3Qgcj1nLmZpbmQocmQsZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihlLnRlc3QgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gZS50ZXN0LnNvbWUocz0+dGhpcy50ZXN0KHMpKTt0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCIpfSk7cmV0dXJuIHImJih0aGlzLnBhcnNlZFJlc3VsdC5vcz1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0Lm9zfWdldE9TTmFtZShyKXtjb25zdHtuYW1lOmV9PXRoaXMuZ2V0T1MoKTtyZXR1cm4gcj9TdHJpbmcoZSkudG9Mb3dlckNhc2UoKXx8IiI6ZXx8IiJ9Z2V0T1NWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0T1MoKS52ZXJzaW9ufWdldFBsYXRmb3JtKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtP3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtOnRoaXMucGFyc2VQbGF0Zm9ybSgpfWdldFBsYXRmb3JtVHlwZShyPSExKXtjb25zdHt0eXBlOmV9PXRoaXMuZ2V0UGxhdGZvcm0oKTtyZXR1cm4gcj9TdHJpbmcoZSkudG9Mb3dlckNhc2UoKXx8IiI6ZXx8IiJ9cGFyc2VQbGF0Zm9ybSgpe3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXt9O2NvbnN0IHI9Zy5maW5kKHNkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm09ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybX1nZXRFbmdpbmUoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lP3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZTp0aGlzLnBhcnNlRW5naW5lKCl9Z2V0RW5naW5lTmFtZShyKXtyZXR1cm4gcj9TdHJpbmcodGhpcy5nZXRFbmdpbmUoKS5uYW1lKS50b0xvd2VyQ2FzZSgpfHwiIjp0aGlzLmdldEVuZ2luZSgpLm5hbWV8fCIifXBhcnNlRW5naW5lKCl7dGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXt9O2NvbnN0IHI9Zy5maW5kKG5kLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lfXBhcnNlKCl7cmV0dXJuIHRoaXMucGFyc2VCcm93c2VyKCksdGhpcy5wYXJzZU9TKCksdGhpcy5wYXJzZVBsYXRmb3JtKCksdGhpcy5wYXJzZUVuZ2luZSgpLHRoaXN9Z2V0UmVzdWx0KCl7cmV0dXJuIGcuYXNzaWduKHt9LHRoaXMucGFyc2VkUmVzdWx0KX1zYXRpc2ZpZXMocil7Y29uc3QgZT17fTtsZXQgcz0wO2NvbnN0IG49e307bGV0IGk9MDtpZihPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGQ9Pntjb25zdCBvPXJbZF07dHlwZW9mIG89PSJzdHJpbmciPyhuW2RdPW8saSs9MSk6dHlwZW9mIG89PSJvYmplY3QiJiYoZVtkXT1vLHMrPTEpfSkscz4wKXtjb25zdCBkPU9iamVjdC5rZXlzKGUpLG89Zy5maW5kKGQsbT0+dGhpcy5pc09TKG0pKTtpZihvKXtjb25zdCBtPXRoaXMuc2F0aXNmaWVzKGVbb10pO2lmKG0hPT12b2lkIDApcmV0dXJuIG19Y29uc3QgbD1nLmZpbmQoZCxtPT50aGlzLmlzUGxhdGZvcm0obSkpO2lmKGwpe2NvbnN0IG09dGhpcy5zYXRpc2ZpZXMoZVtsXSk7aWYobSE9PXZvaWQgMClyZXR1cm4gbX19aWYoaT4wKXtjb25zdCBkPU9iamVjdC5rZXlzKG4pLG89Zy5maW5kKGQsbD0+dGhpcy5pc0Jyb3dzZXIobCwhMCkpO2lmKG8hPT12b2lkIDApcmV0dXJuIHRoaXMuY29tcGFyZVZlcnNpb24obltvXSl9fWlzQnJvd3NlcihyLGU9ITEpe2NvbnN0IHM9dGhpcy5nZXRCcm93c2VyTmFtZSgpLnRvTG93ZXJDYXNlKCk7bGV0IG49ci50b0xvd2VyQ2FzZSgpO2NvbnN0IGk9Zy5nZXRCcm93c2VyVHlwZUJ5QWxpYXMobik7cmV0dXJuIGUmJmkmJihuPWkudG9Mb3dlckNhc2UoKSksbj09PXN9Y29tcGFyZVZlcnNpb24ocil7bGV0IGU9WzBdLHM9cixuPSExO2NvbnN0IGk9dGhpcy5nZXRCcm93c2VyVmVyc2lvbigpO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gclswXT09PSI+Inx8clswXT09PSI8Ij8ocz1yLnN1YnN0cigxKSxyWzFdPT09Ij0iPyhuPSEwLHM9ci5zdWJzdHIoMikpOmU9W10sclswXT09PSI+Ij9lLnB1c2goMSk6ZS5wdXNoKC0xKSk6clswXT09PSI9Ij9zPXIuc3Vic3RyKDEpOnJbMF09PT0ifiImJihuPSEwLHM9ci5zdWJzdHIoMSkpLGUuaW5kZXhPZihnLmNvbXBhcmVWZXJzaW9ucyhpLHMsbikpPi0xfWlzT1Mocil7cmV0dXJuIHRoaXMuZ2V0T1NOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzUGxhdGZvcm0ocil7cmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm1UeXBlKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzRW5naW5lKHIpe3JldHVybiB0aGlzLmdldEVuZ2luZU5hbWUoITApPT09U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCl9aXMocixlPSExKXtyZXR1cm4gdGhpcy5pc0Jyb3dzZXIocixlKXx8dGhpcy5pc09TKHIpfHx0aGlzLmlzUGxhdGZvcm0ocil9c29tZShyPVtdKXtyZXR1cm4gci5zb21lKGU9PnRoaXMuaXMoZSkpfX0vKiEKICogQm93c2VyIC0gYSBicm93c2VyIGRldGVjdG9yCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5jZWRpa3Nvbi9ib3dzZXIKICogTUlUIExpY2Vuc2UgfCAoYykgRHVzdGluIERpYXogMjAxMi0yMDE1CiAqIE1JVCBMaWNlbnNlIHwgKGMpIERlbmlzIERlbWNoZW5rbyAyMDE1LTIwMTkKICovY2xhc3MgaWR7c3RhdGljIGdldFBhcnNlcihyLGU9ITEpe2lmKHR5cGVvZiByIT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBzaG91bGQgYmUgYSBzdHJpbmciKTtyZXR1cm4gbmV3IEZzKHIsZSl9c3RhdGljIHBhcnNlKHIpe3JldHVybiBuZXcgRnMocikuZ2V0UmVzdWx0KCl9c3RhdGljIGdldCBCUk9XU0VSX01BUCgpe3JldHVybiBOc31zdGF0aWMgZ2V0IEVOR0lORV9NQVAoKXtyZXR1cm4gb2V9c3RhdGljIGdldCBPU19NQVAoKXtyZXR1cm4gR31zdGF0aWMgZ2V0IFBMQVRGT1JNU19NQVAoKXtyZXR1cm4gVX19Y29uc3QgTmU9ImNocm9tZSIsVnM9Im9wZXJhIixCcz0iZmlyZWZveCIseHM9ImlleHBsb3JlciIsanM9InNhZmFyaSIsVXM9Im53anMiLCRzPSJlbGVjdHJvbiIsSHM9InJlYWN0LW5hdGl2ZSIsR3Q9InVua25vd24iLFB0PXtDaHJvbWU6TmUsQ2hyb21pdW06TmUsT3BlcmE6VnMsRmlyZWZveDpCcywiSW50ZXJuZXQgRXhwbG9yZXIiOnhzLFNhZmFyaTpqc307ZnVuY3Rpb24gYWQoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yLHI9e25hbWU6R3QsdmVyc2lvbjp2b2lkIDB9O2lmKHQubWF0Y2goL0Nocm9tZS8pJiYhdC5tYXRjaCgvRWRnZS8pKWlmKHQubWF0Y2goL0VkZyhBPykvKSl7Y29uc3QgZT10Lm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV07TnVtYmVyLnBhcnNlSW50KGUsMTApPjcyJiYoci5uYW1lPU5lLHIudmVyc2lvbj1lKX1lbHNlIHIubmFtZT1OZSxyLnZlcnNpb249dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO3JldHVybiByfWZ1bmN0aW9uIG9kKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9FbGVjdHJvbi8pKXtjb25zdCByPXQubWF0Y2goL0VsZWN0cm9uXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOiRzLHZlcnNpb246cn19cmV0dXJuIG51bGx9ZnVuY3Rpb24gY2QoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yO2lmKHQubWF0Y2goL0ppdHNpTWVldE5XLykpe2NvbnN0IHI9dC5tYXRjaCgvSml0c2lNZWV0TldcLyhbXGQuXSspLylbMV07cmV0dXJue25hbWU6VXMsdmVyc2lvbjpyfX19ZnVuY3Rpb24gZGQoKXtjb25zdCB0PW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1xiKHJlYWN0WyBcdF8tXSpuYXRpdmUpKD86XC8oXFMrKSk/L2kpO2xldCByO2lmKHR8fG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlIilyZXR1cm4gdCYmdC5sZW5ndGg+MiYmKHRbMV0scj10WzJdKSxyfHwocj0idW5rbm93biIpLHtuYW1lOkhzLHZlcnNpb246cn19ZnVuY3Rpb24gbGQodCl7bGV0IHI7Y29uc3QgZT1bZGQsb2QsY2RdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bis9MSlpZihyPWVbbl0oKSxyKXJldHVybiByO2NvbnN0IHM9dC5nZXRCcm93c2VyTmFtZSgpO3JldHVybiBzIGluIFB0P3tuYW1lOlB0W3NdLHZlcnNpb246dC5nZXRCcm93c2VyVmVyc2lvbigpfToocj1hZCgpLHJ8fHtuYW1lOkd0LHZlcnNpb246dm9pZCAwfSl9Y2xhc3MgdWR7Y29uc3RydWN0b3IoKXtwKHRoaXMsIl9ib3dzZXIiKTtwKHRoaXMsIl9uYW1lIik7cCh0aGlzLCJfdmVyc2lvbiIpO3AodGhpcywiZ2V0RGV2aWNlSW5mbyIsKCk9Pih7aXNNb2JpbGU6dGhpcy5pc01vYmlsZSgpLGJyb3dzZXJOYW1lOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyTmFtZSgpLG9zTmFtZTp0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCksYnJvd3NlclZlcnNpb246dGhpcy5fYm93c2VyLmdldEJyb3dzZXJWZXJzaW9uKCksb3NWZXJzaW9uTmFtZTp0aGlzLl9ib3dzZXIuZ2V0T1NWZXJzaW9uKCksZW5naW5lTmFtZTp0aGlzLl9ib3dzZXIuZ2V0RW5naW5lTmFtZSgpfSkpfWluaXQocil7bGV0IGUscztpZih0aGlzLl9ib3dzZXI9aWQuZ2V0UGFyc2VyKG5hdmlnYXRvci51c2VyQWdlbnQpLHR5cGVvZiByPT0idW5kZWZpbmVkIil7Y29uc3Qgbj1sZCh0aGlzLl9ib3dzZXIpO2U9bi5uYW1lLHM9bi52ZXJzaW9ufWVsc2Ugci5uYW1lIGluIFB0PyhlPVB0W3IubmFtZV0scz1yLnZlcnNpb24pOihlPUd0LHM9dm9pZCAwKTt0aGlzLl9uYW1lPWUsdGhpcy5fdmVyc2lvbj1zfWdldE5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZX1pc0Nocm9tZSgpe3JldHVybiB0aGlzLl9uYW1lPT09TmV9aXNPcGVyYSgpe3JldHVybiB0aGlzLl9uYW1lPT09VnN9aXNGaXJlZm94KCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Cc31pc0lFeHBsb3Jlcigpe3JldHVybiB0aGlzLl9uYW1lPT09eHN9aXNTYWZhcmkoKXtyZXR1cm4gdGhpcy5fbmFtZT09PWpzfWlzTldKUygpe3JldHVybiB0aGlzLl9uYW1lPT09VXN9aXNFbGVjdHJvbigpe3JldHVybiB0aGlzLl9uYW1lPT09JHN9aXNSZWFjdE5hdGl2ZSgpe3JldHVybiB0aGlzLl9uYW1lPT09SHN8fG5hdmlnYXRvci5pc1JlYWN0TmF0aXZlPT09ITB9Z2V0VmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9ufWlzTW9iaWxlKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5nZXRQbGF0Zm9ybVR5cGUoKT09PSJtb2JpbGUifV9jaGVja0NvbmRpdGlvbihyKXtpZih0aGlzLl92ZXJzaW9uKXJldHVybiB0aGlzLl9ib3dzZXIuc2F0aXNmaWVzKHIpfWlzVmVyc2lvbkdyZWF0ZXJUaGFuKHIpe3JldHVybiB0aGlzLl9jaGVja0NvbmRpdGlvbih7W3RoaXMuX25hbWVdOmA+JHtyfWB9KX1pc1ZlcnNpb25MZXNzVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPCR7cn1gfSl9aXNWZXJzaW9uRXF1YWxUbyhyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgfiR7cn1gfSl9fWNsYXNzIHBkIGV4dGVuZHMgdWR7ZG9lc1ZpZGVvTXV0ZUJ5U3RyZWFtUmVtb3ZlKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzUDJQKCl7cmV0dXJuIXRoaXMudXNlc1VuaWZpZWRQbGFuKCl9aXNDaHJvbWl1bUJhc2VkKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWUoKXx8dGhpcy5pc0VsZWN0cm9uKCl8fHRoaXMuaXNOV0pTKCl8fHRoaXMuaXNPcGVyYSgpfWlzV2ViS2l0QmFzZWQoKXtyZXR1cm4gdGhpcy5fYm93c2VyLmlzRW5naW5lKCJ3ZWJraXQiKSYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEhPSJ1bmRlZmluZWQiJiZ0eXBlb2Ygd2luZG93LlJUQ1J0cFRyYW5zY2VpdmVyIT0idW5kZWZpbmVkIiYmT2JqZWN0LmtleXMoUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJjdXJyZW50RGlyZWN0aW9uIik+LTF9aXNTdXBwb3J0ZWQoKXtyZXR1cm4gdHlwZW9mIFJUQ1BlZXJDb25uZWN0aW9uIT0idW5kZWZpbmVkIn1pc1VzZXJJbnRlcmFjdGlvblJlcXVpcmVkRm9yVW5tdXRlKCl7cmV0dXJuIHRoaXMuaXNGaXJlZm94KCkmJnRoaXMuaXNWZXJzaW9uTGVzc1RoYW4oIjY4Iil9c3VwcG9ydHNWaWRlb011dGVPbkNvbm5JbnRlcnJ1cHRlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNCYW5kd2lkdGhTdGF0aXN0aWNzKCl7cmV0dXJuIXRoaXMuaXNGaXJlZm94KCkmJiF0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0NvZGVjUHJlZmVyZW5jZXMoKXtyZXR1cm4gdGhpcy51c2VzVW5pZmllZFBsYW4oKSYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoInNldENvZGVjUHJlZmVyZW5jZXMiKT4tMSYmT2JqZWN0LmtleXMoUlRDUnRwU2VuZGVyLnByb3RvdHlwZSkuaW5kZXhPZigiZ2V0Q2FwYWJpbGl0aWVzIik+LTEmJiF0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0RldmljZUNoYW5nZUV2ZW50KCl7cmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLm9uZGV2aWNlY2hhbmdlIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuYWRkRXZlbnRMaXN0ZW5lciE9InVuZGVmaW5lZCJ9c3VwcG9ydHNMb2NhbENhbmRpZGF0ZVJ0dFN0YXRpc3RpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzUGVyZm9ybWFuY2VPYnNlcnZlcigpe3JldHVybiB0eXBlb2Ygd2luZG93LlBlcmZvcm1hbmNlT2JzZXJ2ZXIhPSJ1bmRlZmluZWQiJiZQZXJmb3JtYW5jZU9ic2VydmVyLnN1cHBvcnRlZEVudHJ5VHlwZXMuaW5kZXhPZigibG9uZ3Rhc2siKT4tMX1zdXBwb3J0c1JlY2VpdmVyU3RhdHMoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5SVENSdHBSZWNlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFJlY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiZ2V0U3luY2hyb25pemF0aW9uU291cmNlcyIpPi0xfXN1cHBvcnRzUlRUU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpfXVzZXNQbGFuQigpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfXVzZXNTZHBNdW5naW5nRm9yU2ltdWxjYXN0KCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX11c2VzVW5pZmllZFBsYW4oKXtyZXR1cm4hISh0aGlzLmlzRmlyZWZveCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKSl9dXNlc05ld0d1bUZsb3coKXtyZXR1cm4hISh0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzRmlyZWZveCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKSl9dXNlc0FkYXB0ZXIoKXtyZXR1cm4gdGhpcy51c2VzTmV3R3VtRmxvdygpfXVzZXNSaWRzRm9yU2ltdWxjYXN0KCl7cmV0dXJuITF9c3VwcG9ydHNHZXREaXNwbGF5TWVkaWEoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvci5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifHx0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYSE9InVuZGVmaW5lZCJ9c3VwcG9ydHNJbnNlcnRhYmxlU3RyZWFtcygpe2lmKCEodHlwZW9mIHdpbmRvdy5SVENSdHBTZW5kZXIhPSJ1bmRlZmluZWQiJiYod2luZG93LlJUQ1J0cFNlbmRlci5wcm90b3R5cGUuY3JlYXRlRW5jb2RlZFN0cmVhbXN8fHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRWaWRlb1N0cmVhbXMpKSlyZXR1cm4hMTtjb25zdCByPW5ldyBSZWFkYWJsZVN0cmVhbTt0cnl7cmV0dXJuIHdpbmRvdy5wb3N0TWVzc2FnZShyLCIqIixbcl0pLCEwfWNhdGNoKGUpe3JldHVybiExfX1zdXBwb3J0c0F1ZGlvUmVkKCl7cmV0dXJuIEJvb2xlYW4od2luZG93LlJUQ1J0cFNlbmRlciYmd2luZG93LlJUQ1J0cFNlbmRlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzKCJhdWRpbyIpLmNvZGVjcy5zb21lKHI9PnIubWltZVR5cGU9PT0iYXVkaW8vcmVkIikmJndpbmRvdy5SVENSdHBSZWNlaXZlciYmd2luZG93LlJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcyYmd2luZG93LlJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpKX1zdXBwb3J0c1NkcFNlbWFudGljcygpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfV9nZXRDaHJvbWl1bUJhc2VkVmVyc2lvbigpe2lmKHRoaXMuaXNDaHJvbWl1bUJhc2VkKCkpe2lmKHRoaXMuaXNOV0pTKCkpcmV0dXJuIE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLmNocm9taXVtLDEwKTtjb25zdCByPW5hdmlnYXRvci51c2VyQWdlbnQ7aWYoci5tYXRjaCgvQ2hyb21lLykpcmV0dXJuIE51bWJlci5wYXJzZUludChyLm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV0sMTApfXJldHVybi0xfWlzSU9TTW9iaWxlKCl7cmV0dXJuIHRoaXMuaXNNb2JpbGUmJnRoaXMuX2Jvd3Nlci5nZXRPU05hbWUoKT09PSJpT1MifX1jb25zdCBoZD1uZXcgcGQ7Y2xhc3MgZmR7Y29uc3RydWN0b3IoKXtwKHRoaXMsImxvZ3NDYWNoZSIsW10pO3AodGhpcywibG9nc1Byb2Nlc3NvclRpbWVyIik7cCh0aGlzLCJ0cmFjaW5nRW5hYmxlZCIsITApO3AodGhpcywiaW5pdGlhbGl6ZWQiLCExKTtwKHRoaXMsImxvZ3NQcm9jZXNzaW5nSW50ZXJ2YWwiLDdlMyk7cCh0aGlzLCJsb2dFeGNsdXNpb25MaXN0IixbIm1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbWVzc2FnZSIsInJvb21NZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbWVzc2FnZSIsIndlYnNvY2tldC9yb29tLWxlZ2FjeS1tb2RlIiwiY2hhdE1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbmV3LWNoYXQtbWVzc2FnZSIsIndlYnNvY2tldC9uby1hY3RpdmUtc3BlYWtlciIsIndlYnNvY2tldC9zZWxlY3RlZC1wZWVycyIsIndlYnNvY2tldC9hY3RpdmUtc3BlYWtlciIsInBpbmciLCJ3ZWJzb2NrZXQvbmV3LWNvbnN1bWVyIiwid2Vic29ja2V0L3Byb2R1Y2VyLXNjb3JlIiwid2Vic29ja2V0L2NvbnN1bWVyLXNjb3JlIiwid2Vic29ja2V0L3BsdWdpbi1ldmVudCIsIndlYnNvY2tldC9wbHVnaW4tZGF0YSIsIndlYnNvY2tldC9wbHVnaW4taW50ZXJuYWwtZGF0YSJdKTtwKHRoaXMsIm1lZXRpbmdNZXRhZGF0YSIse30pfWdldCBsb2dzRW5kcG9pbnQoKXtjb25zdCByPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtyZXR1cm5gaHR0cHM6Ly8ke1FjKHtzZXJ2aWNlUHJlZml4OiJhcGktc2lsb3MiLGJhc2VVUkk6ci5nZXRWYWx1ZSgiYmFzZVVSSSIpfSl9L290ZWwvbG9nc2B9cmVzZXRQZWVySWQocil7dGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkPXJ9aW5pdChyLGUscyl7dGhpcy50cmFjaW5nRW5hYmxlZD0hMCx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMubG9nc0NhY2hlPVtdO2NvbnN0IG49ci5nZXRWYWx1ZSgicGVlcklkIik7dGhpcy5tZWV0aW5nTWV0YWRhdGE9ZSx0aGlzLnRyYWNpbmdFbmFibGVkPXMsdGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkPW4sdGhpcy5tZWV0aW5nTWV0YWRhdGEuc2RrVmVyc2lvbj1yLmdldFZhbHVlKCJzZGtWZXJzaW9uIik7Y29uc3R7Uk5EZXZpY2VJbmZvSW1wbDppfT1uYXZpZ2F0b3I7dGhpcy5tZWV0aW5nTWV0YWRhdGEuZGV2aWNlSW5mbz1uYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT9pPT1udWxsP3ZvaWQgMDppLmdldERldmljZUluZm8oKTpoZC5nZXREZXZpY2VJbmZvKCksdGhpcy5tZWV0aW5nTWV0YWRhdGEudmlzaXRlZFVybD0hbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cubG9jYXRpb24uaHJlZix0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcj1zZXRJbnRlcnZhbCh0aGlzLnByb2Nlc3NDYWNoZWRMb2dzLmJpbmQodGhpcyksdGhpcy5sb2dzUHJvY2Vzc2luZ0ludGVydmFsKSxzJiYodGhpcy5pbml0aWFsaXplZD0hMCl9c3RhdGljIHRyYWNlKHIsZT12b2lkIDApe3JldHVybihzLG4saSk9Pntjb25zdCBhPWkudmFsdWU7cmV0dXJuIGkudmFsdWU9ZnVuY3Rpb24oLi4ubyl7dmFyIEU7Y29uc3QgbD10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLnRlbGVtZXRyeTtpZighbHx8IWwuaW5pdGlhbGl6ZWR8fG5hdmlnYXRvci5pc1JlYWN0TmF0aXZlfHwhbC50cmFjaW5nRW5hYmxlZHx8KEU9UGUuZ2V0Q29udGV4dChsLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpKSE9bnVsbCYmRS5nZXRWYWx1ZSgiZmxhZ3NtaXRoIikuaGFzRmVhdHVyZSh6dC5TS0lQX09URUxfVFJBQ0VTKSlyZXR1cm4gYS5hcHBseSh0aGlzLG8pO2wuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlKTtjb25zdCBtPXBlcmZvcm1hbmNlLm5vdygpLHY9YS5hcHBseSh0aGlzLG8pO3JldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbigoKT0+e2NvbnN0IHc9cGVyZm9ybWFuY2Uubm93KCk7dy1tPjEwJiZsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3J9X3RpbWluZ2Ase2V4ZWNUaW1lOnctbX0pfSkuY2F0Y2goKCk9Pntjb25zdCB3PXBlcmZvcm1hbmNlLm5vdygpO2wuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsYCR7cn1fdGltaW5nYCx7ZXhlY1RpbWU6dy1tfSl9KSx2fSxpfX1pbmplY3RDb250ZXh0KHIpe3ZhciBuO2NvbnN0IGU9S2MoKS5yZXBsYWNlKC8tL2csIiIpLnN1YnN0cmluZygwLDE2KSxzPShuPXRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk9PW51bGw/dm9pZCAwOm4ucmVwbGFjZSgvLS9nLCIiKTtyLlRSQUNFUEFSRU5UPWAwMC0ke3N9LSR7ZX0tMDFgfWFkZExvZ0luQ3VycmVudFNwYW4ocixlLHM9e30sbj0hMSl7cyE9bnVsbCYmcy5lcnJvciYmT2JqZWN0LmFzc2lnbihzLHtlcnJvcjpSdChzLmVycm9yKX0pO2NvbnN0IGk9UGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO2lmKFhjKGkpJiYoWWMocyk/Y29uc29sZVtyXSgiSW50ZXJuYWxMb2dzOjogIixyLGUpOmNvbnNvbGVbcl0oIkludGVybmFsTG9nczo6ICIscixlLHMpKSwhIVpjKGkscikpdHJ5e2NvbnN0IGQ9RHMoaSxlLHMsIm1ldGFkYXRhIiksbz1uZXcgRGF0ZSxsPW90KFEoe21lc3NhZ2U6ZSxsZXZlbDpyfSxkKSx7bG9nZ2VkQXQ6by50b0lTT1N0cmluZygpLGxvZ2dlZEF0VHpPZmZzZXQ6by5nZXRUaW1lem9uZU9mZnNldCgpfSk7bj90aGlzLnNlbmRPdGVsTG9nc1RvTmV3UmVsaWMoW2xdKTp0aGlzLmxvZ3NDYWNoZS5wdXNoKGwpfWNhdGNoKGQpe3RoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjphZGRMb2dJbkN1cnJlbnRTcGFuX2ZhaWxlZCIse2Vycm9yOlJ0KGQpfSl9fXNlbmRPdGVsTG9nc1RvTmV3UmVsaWMocil7Y29uc3QgZT1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7ZmV0Y2godGhpcy5sb2dzRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6RHMoZSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmUuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnJ9KX0pLmNhdGNoKHM9Pnt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6c2VuZE90ZWxMb2dUb05ld1JlbGljX2ZhaWxlZCIse2Vycm9yOlJ0KHMpfSksdGhpcy5sb2dzQ2FjaGUucHVzaCguLi5yKX0pfXByb2Nlc3NDYWNoZWRMb2dzKCl7Y29uc3Qgcj10aGlzLmxvZ3NDYWNoZS5zcGxpY2UoMCwyNSk7ciE9bnVsbCYmci5sZW5ndGgmJnRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhyKX1kZXN0cnVjdCgpe2NsZWFySW50ZXJ2YWwodGhpcy5sb2dzUHJvY2Vzc29yVGltZXIpLHRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKX19ZnVuY3Rpb24gbWQodCl7Y29uc3Qgcj1RKHt9LHQpLGU9bmV3IE1hcCxzPShsLG0pPT4oZS5oYXMobCl8fGUuc2V0KGwsbmV3IFNldCksZS5nZXQobCkuYWRkKG0pLCgpPT57dmFyIHY7cmV0dXJuKHY9ZS5nZXQobCkpPT1udWxsP3ZvaWQgMDp2LmRlbGV0ZShtKX0pLG49KGwsbSk9Pnt2YXIgdjsodj1lLmdldChsKSk9PW51bGx8fHYuZGVsZXRlKG0pfSxpPWw9Pnt2YXIgbTsobT1lLmdldChsKSk9PW51bGx8fG0uZm9yRWFjaCh2PT57dHJ5e3YocltsXSl9Y2F0Y2goRSl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZToobCxtLHY9ITApPT57cltsXT1tLHYmJmkobCl9LGdldFZhbHVlOmw9PnJbbF0sZ2V0QWxsVmFsdWVzOigpPT5yfX1jbGFzcyBnZHtjb25zdHJ1Y3Rvcigpe3AodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3AodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dChyLGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHIpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldChyKTtjb25zdCBzPW5ldyBmZCxuPW5ldyBCYzt0aGlzLmNvbnRleHRzLnNldChyLG1kKGUpKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IEt0KG4pKTtjb25zdCBpPW5ldyBOcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJmbGFnc21pdGgiLE1jKCkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD1yLHRoaXMuY29udGV4dHMuZ2V0KHIpfXJlbWFwQ29udGV4dChyLGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXImJihlLnNldFZhbHVlKCJwZWVySWQiLHIpLHRoaXMubW9zdFJlY2VudFBlZXJJZD1yLHRoaXMuY29udGV4dHMuc2V0KHIsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQocil7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHIpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgUGU9bmV3IGdkO2NvbnN0IFNkPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LEN0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDEwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDEwMiI6IlByZXJlcXVpc2l0ZSBtb2R1bGUgbWlzc2luZyIsIjAyMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDMwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDA0IjoiTWlzc2luZyBwcmVyZXF1aXNpdGVzIHRvIGVzdGFibGlzaCBhIHdlYnNvY2tldCBjb25uZWN0aW9uIiwiMDUwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA1MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNTAyIjoiSW52YWxpZCBtZXNzYWdlIGJvZHkuIiwiMDUwMyI6IlRleHQgTWVzc2FnZSBpcyB0b28gbGFyZ2UiLCIwNTA0IjoiTWVzc2FnZSBub3QgZm91bmQgYnkgdGhlIGdpdmVuIGlkIiwiMDUwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDUwNiI6Ik1lc3NhZ2Ugc2VhcmNoIGlzIGRpc2FibGVkIiwiMDYwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA2MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNjAyIjoiQXV0aCB0b2tlbiBub3Qgc2V0IGZvciBwbHVnaW4iLCIwNjAzIjoiSWZyYW1lIHdhcyBub3QgcHJvdmlkZWQiLCIwNzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDcwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDgwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA4MDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjA5MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwOTA0IjoiQ291bGQgbm90IGxvYWQgcHJlc2V0IiwxZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMTAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDEwMDQ6IkNvdWxkIG5vdCBmaW5kIHNwZWNpZmllZCByZWNvcmRpbmciLDEwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGdpdmVuIHJlY29yZGluZyBzdGF0ZSIsMTEwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMTAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTEwMjoiVW5zdXBwb3J0ZWQiLDExMDM6Ik5hbWUgY2Fubm90IGJlIGVtcHR5IiwxMTA0OiJObyBkZXZpY2Ugc2VsZWN0ZWQgd2hpbGUgY2FsbGluZyBtZWV0aW5nLnNlbGYuc2V0RGV2aWNlIiwxMTA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTEwNjoiQ2FuJ3Qgc2V0IGN1cnJlbnRseSB1c2VkIGRldmljZSIsMTIwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMjAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTIwMjoiSW52YWxpZCBwYWdlIG51bWJlciB3YXMgcmVxdWVzdGVkIiwxMjAzOiJJbnZhbGlkIHBhcnRpY2lwYW50IGNvdW50IHBlciBwYWdlIHdhcyByZXF1ZXN0ZWQiLDEyMDQ6Ik5vIHBhcnRpY2lwYW50cyBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gVXNlcklkcyIsMTIwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDEyMDY6Ik1hbnVhbCBTdWJzY3JpcHRpb24gTW9kZSB3YXMgbm90IEFDVElWQVRFRCIsMTIwNzoiSW52YWxpZCB2aWV3IG1vZGUiLDEyMDg6Ik1hbnVhbCBTdWJzY3JpcHRpb24gbm90IGVuYWJsZWQgZm9yIG9yZ2FuaXphdGlvbiIsMTIwOToiQnJvYWRjYXN0IG1lc3NhZ2UgdHlwZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIsMTMwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNDAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDI6Ik5vIGV4aXN0aW5nIHJlbW90ZSByZXF1ZXN0cyIsMTQwMzoiTm8gcGVlciBleGlzdHMgd2l0aCBnaXZlbiBpZCIsMTUwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDE6IkZhaWxlZCB0byBnZXQgYXVkaW8gdHJhY2siLDE2MDI6IkZhaWxlZCB0byBnZXQgdmlkZW8gdHJhY2siLDE2MDM6IkluY29ycmVjdCBkZXZpY2UiLDE2MDQ6IkZhaWxlZCB0byBjaGFuZ2UgZGV2aWNlIiwxNjA1OiJGYWlsZWQgdG8gZ2V0IGF1ZGlvICYgdmlkZW8gdHJhY2siLDE2MDY6Ik5vIGF1ZGlvIGlucHV0IGRldmljZXMgYXJlIGF2YWlsYWJsZSIsMTYwNzoiTm8gdmlkZW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA4OiJObyBhdWRpbyBvdXRwdXQgZGV2aWNlcyAoc3BlYWtlcnMpIGFyZSBhdmFpbGFibGUiLDE2MDk6IkZhaWxlZCB0byBmZXRjaCBsaXN0IG9mIG1lZGlhIGRldmljZXMiLDE2MTA6Ik5vIG1lZGlhIHRyYWNrIGV4aXN0cyIsMTYxMToiRmFpbGVkIHRvIHVubXV0ZSB0cmFjayIsMTYxMjoiRmFpbGVkIHRvIGdldCBzY3JlZW5zaGFyZSB0cmFja3MiLDE3MDE6IkNyeXB0byBlcnJvciIsMTgwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxODAxOiJDYW4ndCBmZXRjaCB0cmFuc2NyaXB0IGZpbGUiLDE5MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTkwMToiUGVybWlzc2lvbiBkZW5pZWQuIiwxOTAyOiJMaXZlc3RyZWFtIHRoYXQgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgY2FuJ3QgYmUgc3RvcHBlZCIsMmUzOiJJbnRlcm5hbCBleGNlcHRpb24iLDIwMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwyMDAyOiJVbnN1cHBvcnRlZCIsMjAwMzoiU3RhZ2UgaXMgZGlzYWJsZWQiLDIwMDQ6Ik1ldGhvZCBub3QgaW1wbGVtZW50ZWQiLDIwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwyMDA2OiJBY3Rpb24gbm90IHBlcm1pdHRlZCBpbiBjdXJyZW50IHN0YWdlIHN0YXR1cyIsOTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIn07T2JqZWN0LmtleXMoQ3QpLmZvckVhY2godD0+e0N0W3RdPWB7JHtTZFt0LnNsaWNlKDAsMildfX0gJHtDdFt0XX1gfSk7Y2xhc3MgdmQgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHMsbj12b2lkIDAsaT0hMSl7c3VwZXIoZSk7cCh0aGlzLCJjb2RlIik7dGhpcy5jb2RlPXMsdGhpcy5uYW1lPSJDbGllbnRFcnJvciI7Y29uc3QgYT10aGlzLmNvZGU/YFtFUlIke3RoaXMuY29kZX1dYDoiW0VSUl0iLGQ9dGhpcy5jb2RlP0N0W3RoaXMuY29kZV06IiI7dGhpcy5tZXNzYWdlPWAke2F9OiAke2R9CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBvPWkmJiEhbjtzJiZzLmVuZHNXaXRoKCIwMCIpJiZuJiYobz0hMCksbyYmbi5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpzfX0pO2NvbnN0IGw9UGUuZ2V0Q29udGV4dChQZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGwpe2NvbnN0IG09bC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXttKHRoaXMpfWNhdGNoKHYpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChvKXt9fX12YXIgZmU9KHQ9Pih0W3QuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIsdFt0Lk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHRbdC5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIix0KSkoZmV8fHt9KTtjbGFzcyBtZSBleHRlbmRzIHZke2NvbnN0cnVjdG9yKGUscz0yKXtzdXBlcihlLCIxNzAxIik7cCh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1zfX1jbGFzcyBLcyBleHRlbmRzIHEuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLnMpe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLnMpLHN1cGVyLmVtaXQoZSwuLi5zKX1vbihlLHMpe3ZhciBuO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChuPXRoaXMubG9nZ2VyKT09bnVsbHx8bi53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLHMpfWFkZExpc3RlbmVyKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUscyl9b2ZmKGUscyl7cmV0dXJuIHN1cGVyLm9mZihlLHMpfW9uY2UoZSxzKXtyZXR1cm4gc3VwZXIub25jZShlLHMpfXByZXBlbmRMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxzKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKX1yZW1vdmVMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLHMpfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IHF0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24geWQodCl7cmV0dXJuInR5cGUiaW4gdH1mdW5jdGlvbiBiZChzKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXtuYW1lOmt9LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCxyLCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gV3ModCxyKXtjb25zdCBzPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyKTtzd2l0Y2godCl7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpzLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHt0fSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24genModCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1Xcyh0LmFsZ29yaXRobS5uYW1lLHIpLHM9eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSx0LHtuYW1lOmssbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6dCxlbmNyeXB0aW9uS2V5OnN9fSl9ZnVuY3Rpb24gRWQodCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1Xcyh0LmFsZ29yaXRobS5uYW1lLHIpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSx0LDI1Nil9KX1jbGFzcyBfZCBleHRlbmRzIEtze31jbGFzcyBHcyBleHRlbmRzIF9ke2NvbnN0cnVjdG9yKGUpe3ZhciBzO3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJzZW5kQ291bnRzIik7cCh0aGlzLCJpc0tleUludmFsaWQiLCExKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTtwKHRoaXMsInRyYWNrSWQiKTtwKHRoaXMsImtleXMiKTtwKHRoaXMsInZpZGVvQ29kZWMiKTtwKHRoaXMsInJ0cE1hcCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0ocz1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/czpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLHMpe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1zfXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxzLG4saSxhKXthJiYodGhpcy52aWRlb0NvZGVjPWEpO2NvbnN0IGQ9ZT09PSJlbmNvZGUiP3RoaXMuZW5jb2RlRnVuY3Rpb246dGhpcy5kZWNvZGVGdW5jdGlvbixvPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpkLmJpbmQodGhpcyl9KTtzLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhuKS5jYXRjaChsPT57dGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGwgaW5zdGFuY2VvZiBtZT9sOm5ldyBtZShsLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUscyl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gcy5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6bn09dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKG4pe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGw9bmV3IFVpbnQ4QXJyYXkoMik7bFswXT1kZSxsWzFdPWk7dHJ5e2NvbnN0IG09eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOmssaXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxuLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSx2PW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpLEU9bmV3IFVpbnQ4QXJyYXkodik7cmV0dXJuIEUuc2V0KG8pLEUuc2V0KG5ldyBVaW50OEFycmF5KG0pLG8uYnl0ZUxlbmd0aCksRS5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK20uYnl0ZUxlbmd0aCksRS5zZXQobCxvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPXYscy5lbnF1ZXVlKGUpfWNhdGNoKG0pe319ZWxzZSB0aGlzLmVtaXQocXQuRXJyb3IsbmV3IG1lKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsZmUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxUZChlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBzLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIG1lJiZhLnJlYXNvbj09PWZlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChxdC5FcnJvcixuZXcgbWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KHF0LkVycm9yLG5ldyBtZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsZmUuTWlzc2luZ0tleSkpO3JldHVybiBzLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxzLG49dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGw7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KHMpO3RyeXtjb25zdCBtPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksdj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxFPXZbMF0sdz1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtRS12LmJ5dGVMZW5ndGgsRSkseD1tLmJ5dGVMZW5ndGgsJD1lLmRhdGEuYnl0ZUxlbmd0aC0obS5ieXRlTGVuZ3RoK0Urdi5ieXRlTGVuZ3RoKSxWPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTprLGl2OncsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKX0sKGw9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9sOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEseCwkKSksSD1uZXcgQXJyYXlCdWZmZXIobS5ieXRlTGVuZ3RoK1YuYnl0ZUxlbmd0aCksWj1uZXcgVWludDhBcnJheShIKTtyZXR1cm4gWi5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKSksWi5zZXQobmV3IFVpbnQ4QXJyYXkoViksbS5ieXRlTGVuZ3RoKSxlLmRhdGE9SCxlfWNhdGNoKG0pe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgdjtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChzKSl7Y29uc3Qgdz15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShzLCExKTt2PXlpZWxkIHpzKHcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IEU9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxzLG58fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6dj09bnVsbD92b2lkIDA6di5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIEUmJnYmJih0aGlzLmtleXMuc2V0S2V5U2V0KHYscywhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChzKSksRX1uJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKG4ubWF0ZXJpYWwscyl9ZWxzZSB0aHJvdyBuZXcgbWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixmZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxzKXt2YXIgZDtjb25zdCBuPW5ldyBBcnJheUJ1ZmZlcihkZSksaT1uZXcgRGF0YVZpZXcobik7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQscyksaS5zZXRVaW50MzIoOCxzLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLG59Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgcztpZih5ZChlKSl7Y29uc3Qgbj0ocz10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP3M6dGhpcy52aWRlb0NvZGVjO2lmKG49PT0iYXYxInx8bj09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtufSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIEFbZS50eXBlXX1yZXR1cm4gQS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpzfT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIHM/dGhpcy5ydHBNYXAuZ2V0KHMpOnZvaWQgMH19ZnVuY3Rpb24gVGQodCxyKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQuc2xpY2UodC5ieXRlTGVuZ3RoLXIuYnl0ZUxlbmd0aCkpO3JldHVybiByLmV2ZXJ5KChzLG4pPT5zPT09ZVtuXSl9Y2xhc3MgcXMgZXh0ZW5kcyBLc3tjb25zdHJ1Y3RvcihlLHMsbil7c3VwZXIodm9pZCAwKTtwKHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3AodGhpcywiY3J5cHRvS2V5UmluZyIpO3AodGhpcywiZW5hYmxlZCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPXMsdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9bix0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUscz0hMCl7Y29uc3Qgbj1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPW4sYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxsKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IG09dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwsdj15aWVsZCBiZCh5aWVsZCBFZChtLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxtLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtzJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbCh2LGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIix2LG4sdGhpcy5wYXJ0aWNpcGFudElkKSxvKHYpfWNhdGNoKG0pe2wobSl9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxzPTAsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3M+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1zJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgenMoZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxuKX0pfXNldEtleVNldChlLHMsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tzJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUsbiYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwscyx0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBZdD1bXSxRdD1uZXcgTWFwLEp0PVtdO2xldCBjZSxYdD0hMSxZcz0hMSxadCxnZT1NdDtmdW5jdGlvbiBTZSh0LHIpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnQsc3RyOnJ9fSl9ZnVuY3Rpb24gUmQodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6cixtYXRlcmlhbDp0fX0pfWZ1bmN0aW9uIEZlKHQpe2lmKCF0KXJldHVybiBjZTtsZXQgcj1RdC5nZXQodCk7cmV0dXJuIHJ8fChyPW5ldyBxcyh0LCEwLGdlKSxadCYmci5zZXRLZXlGcm9tTWF0ZXJpYWwoWnQpLFF0LnNldCh0LHIpKSxyfWZ1bmN0aW9uIFBkKHQscil7cj9GZShyKS5zZXRFbmFibGVkKHQpOihYdD10LGNlLnNldEVuYWJsZWQodCkpfWZ1bmN0aW9uIFFzKHQpe3Qub24oImNyeXB0b3JFcnJvciIscj0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7ZmVbci5yZWFzb25dfTogJHtyLm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIGVyKHQscil7bGV0IGU9WXQuZmluZChzPT5zLmdldFRyYWNrSWQoKT09PXIpO2lmKGUpdCE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHQsRmUodCkpO2Vsc2V7aWYoU2UoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHt0fWApLCFnZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgR3Moe3BhcnRpY2lwYW50SWQ6dCxrZXlzOkZlKHQpLGtleVByb3ZpZGVyT3B0aW9uczpnZX0pLFFzKGUpLFl0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gSnModCl7bGV0IHI9SnQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXQpO2lmKCFyKXtpZighZ2UpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7cj1uZXcgR3Moe2tleXM6Y2UscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxRcyhyKSxKdC5wdXNoKHIpfXJldHVybiByfWZ1bmN0aW9uIENkKHQpe3ZhciByOyhyPVl0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KSk9PW51bGx8fHIudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIElkKHQscil7U2UoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksWnQ9dCxjZT09bnVsbHx8Y2Uuc2V0S2V5RnJvbU1hdGVyaWFsKHQscik7Zm9yKGNvbnN0WyxlXW9mIFF0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHQscil9b25tZXNzYWdlPXQ9Pntjb25zdHtraW5kOnIsZGF0YTplfT10LmRhdGE7c3dpdGNoKHIpe2Nhc2UiaW5pdCI6U2UoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxnZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxZcz0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBzPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6WHR9fTtjZT1uZXcgcXModm9pZCAwLFh0LGdlKSxjZS5vbigia2V5UmF0Y2hldGVkIixSZCkscG9zdE1lc3NhZ2Uocyk7YnJlYWs7Y2FzZSJlbmFibGUiOlBkKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLFNlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2UodC5kYXRhKTticmVhaztjYXNlImRlY29kZSI6ZXIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0ocixlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjpKcyhlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6WXM/KFNlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IiksSWQoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9GZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpTZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6Q2QoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjplcihlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjpKdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpGZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoU2UoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT10PT57Y29uc3R7dHJhbnNmb3JtZXI6cn09dDtyLmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6cyx0cmFja0lkOm4sY29kZWM6aX09ci5vcHRpb25zOyhlPT09ImVuY29kZSI/SnMobik6ZXIocyxuKSkuc2V0dXBUcmFuc2Zvcm0oZSxyLnJlYWRhYmxlLHIud3JpdGFibGUsbixpKX0pfSkoKTsK",P=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Ul(){const Z=P&&(window.URL||window.webkitURL).createObjectURL(P);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var i,T,s,H,cl,S,dl,a,C,Q,kl,U,bl,k,Xl,K,Wl,t,Vl;class Zl extends ${constructor(l){super(void 0);p(this,i);p(this,H);p(this,S);p(this,a);p(this,Q);p(this,U);p(this,k);p(this,K);p(this,t);R(this,"worker");R(this,"encryptionEnabled");R(this,"keyProvider");R(this,"peerSessionStore");R(this,"onWorkerMessage",l=>{const{kind:d,data:b}=l.data;switch(d){case"error":this.logger.error("error in worker",{error:b.error}),this.emit(E.Error,b.error);break;case"enable":this.encryptionEnabled!==b.enabled&&!b.participantId?this.encryptionEnabled=b.enabled:b.participantId,this.encryptionEnabled&&this.keyProvider.getKeys().forEach(X=>{y(this,a,C).call(this,X)});break;case"ratchetKey":this.keyProvider.emit("keyRatcheted",b.material,b.keyIndex);break;case"log":this.logger&&this.logger[b.level](b.str);break}});p(this,s,l=>{this.logger.error("e2ee worker encountered an error:",{error:l.error}),this.emit(E.Error,l.error)});this.keyProvider=l.keyProvider,this.worker=new Ul,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,d){this.logger=l,this.peerSessionStore=d,this.setup()}setup(){if(!sl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),y(this,H,cl).call(this,this.keyProvider);const l={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions()}};this.worker&&(this.logger.info("initializing worker"),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=M(this,s),this.worker.postMessage(l)),y(this,i,T).call(this,!0)}}i=new WeakSet,T=function(l,d){return J(this,null,function*(){if(this.logger.info(`set e2ee to ${l} for ${d||"self"}`),this.worker){const b={kind:"enable",data:{enabled:l,participantId:d}};this.worker.postMessage(b)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")})},s=new WeakMap,H=new WeakSet,cl=function(l){this.peerSessionStore.on(N.NEW_CONSUMER,({appData:d,peerId:b})=>{d.e2ee&&y(this,i,T).call(this,d.e2ee,b)}),this.peerSessionStore.on(N.E2EE_INACTIVE_CONSUMER,({peerId:d,trackId:b})=>{var W;const X={kind:"removeTransform",data:{participantId:d,trackId:b}};(W=this.worker)==null||W.postMessage(X)}),this.peerSessionStore.on(N.E2EE_ACTIVE_CONSUMER,({track:d,rtpReceiver:b,peerId:X})=>y(this,U,bl).call(this,d,b,X)),this.peerSessionStore.on(N.E2EE_ACTIVE_PRODUCER,({track:d,rtpSender:b,appData:X})=>y(this,k,Xl).call(this,d,b,X.peerId)),l.on("setKey",d=>y(this,a,C).call(this,d)).on("ratchetRequest",(d,b)=>y(this,S,dl).call(this,d,b))},S=new WeakSet,dl=function(l,d){if(!this.worker)throw Error("could not ratchet key, worker is missing");const b={kind:"ratchetRequest",data:{participantId:l,keyIndex:d}};this.worker.postMessage(b)},a=new WeakSet,C=function({key:l,participantId:d,keyIndex:b}){if(!this.worker)throw Error("could not set key, worker is missing");const X={kind:"setKey",data:{participantId:d,key:l,keyIndex:b}};this.worker.postMessage(X)},Q=new WeakSet,kl=function(l){if(!this.worker)throw Error("could not post rtp map, worker is missing");const d={kind:"setRTPMap",data:{map:l}};this.worker.postMessage(d)},U=new WeakSet,bl=function(l,d,b){y(this,K,Wl).call(this,d,l.id,b)},k=new WeakSet,Xl=function(l,d,b){y(this,t,Vl).call(this,d,l.id,b)},K=new WeakSet,Wl=function(l,d,b,X){return J(this,null,function*(){if(!this.worker)return;const W=l;if(x()){const V={kind:"decode",participantId:b,trackId:d,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{if(F in W&&X){const h={kind:"updateCodec",data:{trackId:d,codec:X,participantId:b}};this.worker.postMessage(h);return}let V=W.writableStream,G=W.readableStream;if(!V||!G){const h=W.createEncodedStreams();W.writableStream=h.writable,V=h.writable,W.readableStream=h.readable,G=h.readable}const Y={kind:"decode",data:{readableStream:G,writableStream:V,trackId:d,codec:X,participantId:b}};this.worker.postMessage(Y,[G,V])}W[F]=!0})},t=new WeakSet,Vl=function(l,d,b,X){if(F in l||!this.worker)return;const W=l;if(x()){this.logger.warn("initialize script transform");const V={kind:"encode",participantId:b,trackId:d,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{this.logger.warn("initialize encoded streams");const V=W.createEncodedStreams(),G={kind:"encode",data:{readableStream:V.readable,writableStream:V.writable,codec:X,trackId:d,participantId:b||"publisher"}};this.worker.postMessage(G,[V.readable,V.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Sl);module.exports=Zl;
1
+ "use strict";var ml=Object.defineProperty,Gl=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var v=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,yl=Object.prototype.propertyIsEnumerable;var z=(Z,c,l)=>c in Z?ml(Z,c,{enumerable:!0,configurable:!0,writable:!0,value:l}):Z[c]=l,n=(Z,c)=>{for(var l in c||(c={}))pl.call(c,l)&&z(Z,l,c[l]);if(v)for(var l of v(c))yl.call(c,l)&&z(Z,l,c[l]);return Z},e=(Z,c)=>Gl(Z,Rl(c));var R=(Z,c,l)=>(z(Z,typeof c!="symbol"?c+"":c,l),l),B=(Z,c,l)=>{if(!c.has(Z))throw TypeError("Cannot "+l)};var j=(Z,c,l)=>(B(Z,c,"read from private field"),l?l.call(Z):c.get(Z)),p=(Z,c,l)=>{if(c.has(Z))throw TypeError("Cannot add the same private member more than once");c instanceof WeakSet?c.add(Z):c.set(Z,l)};var y=(Z,c,l)=>(B(Z,c,"access private method"),l);var J=(Z,c,l)=>new Promise((d,b)=>{var V=G=>{try{X(l.next(G))}catch(Y){b(Y)}},W=G=>{try{X(l.throw(G))}catch(Y){b(Y)}},X=G=>G.done?d(G.value):Promise.resolve(G.value).then(V,W);X((l=l.apply(Z,c)).next())});var L={},Yl={get exports(){return L},set exports(Z){L=Z}},u=typeof Reflect=="object"?Reflect:null,M=u&&typeof u.apply=="function"?u.apply:function(c,l,d){return Function.prototype.apply.call(c,l,d)},I;u&&typeof u.ownKeys=="function"?I=u.ownKeys:Object.getOwnPropertySymbols?I=function(c){return Object.getOwnPropertyNames(c).concat(Object.getOwnPropertySymbols(c))}:I=function(c){return Object.getOwnPropertyNames(c)};function hl(Z){console&&console.warn&&console.warn(Z)}var g=Number.isNaN||function(c){return c!==c};function m(){m.init.call(this)}Yl.exports=m;L.once=Nl;m.EventEmitter=m;m.prototype._events=void 0;m.prototype._eventsCount=0;m.prototype._maxListeners=void 0;var w=10;function o(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(m,"defaultMaxListeners",{enumerable:!0,get:function(){return w},set:function(Z){if(typeof Z!="number"||Z<0||g(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");w=Z}});m.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};m.prototype.setMaxListeners=function(c){if(typeof c!="number"||c<0||g(c))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+c+".");return this._maxListeners=c,this};function O(Z){return Z._maxListeners===void 0?m.defaultMaxListeners:Z._maxListeners}m.prototype.getMaxListeners=function(){return O(this)};m.prototype.emit=function(c){for(var l=[],d=1;d<arguments.length;d++)l.push(arguments[d]);var b=c==="error",V=this._events;if(V!==void 0)b=b&&V.error===void 0;else if(!b)return!1;if(b){var W;if(l.length>0&&(W=l[0]),W instanceof Error)throw W;var X=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw X.context=W,X}var G=V[c];if(G===void 0)return!1;if(typeof G=="function")M(G,this,l);else for(var Y=G.length,h=_(G,Y),d=0;d<Y;++d)M(h[d],this,l);return!0};function f(Z,c,l,d){var b,V,W;if(o(l),V=Z._events,V===void 0?(V=Z._events=Object.create(null),Z._eventsCount=0):(V.newListener!==void 0&&(Z.emit("newListener",c,l.listener?l.listener:l),V=Z._events),W=V[c]),W===void 0)W=V[c]=l,++Z._eventsCount;else if(typeof W=="function"?W=V[c]=d?[l,W]:[W,l]:d?W.unshift(l):W.push(l),b=O(Z),b>0&&W.length>b&&!W.warned){W.warned=!0;var X=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(c)+" listeners added. Use emitter.setMaxListeners() to increase limit");X.name="MaxListenersExceededWarning",X.emitter=Z,X.type=c,X.count=W.length,hl(X)}return Z}m.prototype.addListener=function(c,l){return f(this,c,l,!1)};m.prototype.on=m.prototype.addListener;m.prototype.prependListener=function(c,l){return f(this,c,l,!0)};function ul(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function D(Z,c,l){var d={fired:!1,wrapFn:void 0,target:Z,type:c,listener:l},b=ul.bind(d);return b.listener=l,d.wrapFn=b,b}m.prototype.once=function(c,l){return o(l),this.on(c,D(this,c,l)),this};m.prototype.prependOnceListener=function(c,l){return o(l),this.prependListener(c,D(this,c,l)),this};m.prototype.removeListener=function(c,l){var d,b,V,W,X;if(o(l),b=this._events,b===void 0)return this;if(d=b[c],d===void 0)return this;if(d===l||d.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete b[c],b.removeListener&&this.emit("removeListener",c,d.listener||l));else if(typeof d!="function"){for(V=-1,W=d.length-1;W>=0;W--)if(d[W]===l||d[W].listener===l){X=d[W].listener,V=W;break}if(V<0)return this;V===0?d.shift():Jl(d,V),d.length===1&&(b[c]=d[0]),b.removeListener!==void 0&&this.emit("removeListener",c,X||l)}return this};m.prototype.off=m.prototype.removeListener;m.prototype.removeAllListeners=function(c){var l,d,b;if(d=this._events,d===void 0)return this;if(d.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):d[c]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete d[c]),this;if(arguments.length===0){var V=Object.keys(d),W;for(b=0;b<V.length;++b)W=V[b],W!=="removeListener"&&this.removeAllListeners(W);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=d[c],typeof l=="function")this.removeListener(c,l);else if(l!==void 0)for(b=l.length-1;b>=0;b--)this.removeListener(c,l[b]);return this};function r(Z,c,l){var d=Z._events;if(d===void 0)return[];var b=d[c];return b===void 0?[]:typeof b=="function"?l?[b.listener||b]:[b]:l?il(b):_(b,b.length)}m.prototype.listeners=function(c){return r(this,c,!0)};m.prototype.rawListeners=function(c){return r(this,c,!1)};m.listenerCount=function(Z,c){return typeof Z.listenerCount=="function"?Z.listenerCount(c):A.call(Z,c)};m.prototype.listenerCount=A;function A(Z){var c=this._events;if(c!==void 0){var l=c[Z];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}m.prototype.eventNames=function(){return this._eventsCount>0?I(this._events):[]};function _(Z,c){for(var l=new Array(c),d=0;d<c;++d)l[d]=Z[d];return l}function Jl(Z,c){for(;c+1<Z.length;c++)Z[c]=Z[c+1];Z.pop()}function il(Z){for(var c=new Array(Z.length),l=0;l<c.length;++l)c[l]=Z[l].listener||Z[l];return c}function Nl(Z,c){return new Promise(function(l,d){function b(W){Z.removeListener(c,V),d(W)}function V(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,c,V,{once:!0}),c!=="error"&&al(Z,b,{once:!0})})}function al(Z,c,l){typeof Z.on=="function"&&q(Z,"error",c,l)}function q(Z,c,l,d){if(typeof Z.on=="function")d.once?Z.once(c,l):Z.on(c,l);else if(typeof Z.addEventListener=="function")Z.addEventListener(c,function b(V){d.once&&Z.removeEventListener(c,b),l(V)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Z)}class $ extends L.EventEmitter{constructor(l){super();R(this,"logger");this.logger=l,super.setMaxListeners(25)}emit(l,...d){return super.emit("*",l,...d),super.emit(l,...d)}on(l,d){var b;try{const V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}return super.on(l,d)}addListener(l,d){var b;try{const V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}return super.addListener(l,d)}off(l,d){return super.off(l,d)}once(l,d){return super.once(l,d)}prependListener(l,d){return super.prependListener(l,d)}prependOnceListener(l,d){return super.prependOnceListener(l,d)}removeListener(l,d){return super.removeListener(l,d)}removeAllListeners(l){return super.removeAllListeners(l)}listeners(l){return super.listeners(l)}listenerCount(l){return super.listenerCount(l)}}const F="realtimekit_e2ee",nl="RealtimeKitFrameEncryptionKey",Fl={sharedKey:!1,ratchetSalt:nl,ratchetWindowSize:8};function x(){return typeof window.RTCRtpScriptTransform!="undefined"}function Il(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Ll(Z){return J(this,null,function*(){const c=new TextEncoder;return yield crypto.subtle.importKey("raw",c.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function sl(){return Il()||x()}class Hl extends ${constructor(l={}){super(void 0);R(this,"keyInfoMap");R(this,"options");R(this,"onKeyRatcheted",(l,d)=>{});this.keyInfoMap=new Map,this.options=n(n({},Fl),l),this.on("keyRatcheted",this.onKeyRatcheted)}onSetEncryptionKey(l,d,b){const V={key:l,participantId:d,keyIndex:b};this.keyInfoMap.set(`${d!=null?d:"shared"}-${b!=null?b:0}`,V),this.emit("setKey",V)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,d){this.emit("ratchetRequest",l,d)}}class Sl extends Hl{constructor(l={}){const d=e(n({},l),{sharedKey:!0});super(d);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const d=yield Ll(l);this.onSetEncryptionKey(d)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var i=(Z=>(Z.NEW_PRODUCER="NEW_PRODUCER",Z.ROOM_NODE_CONNECTION_ERROR="ROOM_NODE_CONNECTION_ERROR",Z.SOCKET_SERVICE_ROOM_JOINED="SOCKET_SERVICE_ROOM_JOINED",Z.SOCKET_SERVICE_RECONNECTED="SOCKET_SERVICE_RECONNECTED",Z.SOCKET_SERVICE_DISCONNECTED="SOCKET_SERVICE_DISCONNECTED",Z.SOCKET_SERVICE_FAILED="SOCKET_SERVICE_FAILED",Z.SOCKET_STATE_UPDATE="SOCKET_STATE_UPDATE",Z.ROOM_NODE_RECONNECTED="ROOM_NODE_RECONNECTED",Z.ROOM_NODE_DISCONNECTED="ROOM_NODE_DISCONNECTED",Z.ROOM_NODE_FAILED="ROOM_NODE_FAILED",Z.TRANSPORT_STATE_UPDATE="TRANSPORT_STATE_UPDATE",Z.PRODUCER_SCORE_UPDATE="PRODUCER_SCORE_UPDATE",Z.CONSUMER_SCORE_UPDATE="CONSUMER_SCORE_UPDATE",Z.PRODUCER_STATUS_UPDATE="PRODUCER_STATUS_UPDATE",Z.CONSUMER_STATUS_UPDATE="CONSUMER_STATUS_UPDATE",Z.LOW_CONSUMER_SCORE="LOW_CONSUMER_SCORE",Z.MEDIA_PERMISSION_ERROR="MEDIA_PERMISSION_ERROR",Z.MEDIA_PERMISSION_UPDATE="MEDIA_PERMISSION_UPDATE",Z.MESSAGE="websocket/message",Z.ROOM_MESSAGE="websocket/room-message",Z.PEER_JOINED_INTERNAL="peer/joined-internal",Z.PEER_CLOSED="websocket/peer-closed",Z.CONSUMER_CLOSED="websocket/consumer-closed",Z.CONSUMER_PAUSED="websocket/consumer-paused",Z.CONSUMER_RESUMED="websocket/consumer-resumed",Z.PRODUCER_CLOSED="websocket/producer-closed",Z.NEW_CONSUMER="websocket/new-consumer",Z.PRODUCER_SCORE="websocket/producer-score",Z.CONSUMER_SCORE="websocket/consumer-score",Z.PRODUCER_TOGGLE="cf/producer-toggle",Z.UPDATE_ACTIVE="media/update-active",Z.RESET_PRODUCER_STATE="cf/reset-producer-state",Z.ROOM_STATE="sockethub/room-state",Z.GET_STAGE_REQUESTS="GET_STAGE_REQUESTS",Z.UPDATE_STAGE_REQUESTS="UPDATE_STAGE_REQUESTS",Z.KICK_PEER="KICK_PEER",Z.UPDATE_PEER_STAGE_STATUS="UPDATE_PEER_STAGE_STATUS",Z.JOIN_MEDIA_ROOM="JOIN_MEDIA_ROOM",Z.LEAVE_MEDIA_ROOM="LEAVE_MEDIA_ROOM",Z.PIP_HANGUP="PIP_HANGUP",Z.E2EE_ACTIVE_PRODUCER="E2EE_ACTIVE_PRODUCER",Z.E2EE_INACTIVE_PRODUCER="E2EE_INACTIVE_PRODUCER",Z.E2EE_ACTIVE_CONSUMER="E2EE_ACTIVE_CONSUMER",Z.E2EE_INACTIVE_CONSUMER="E2EE_INACTIVE_CONSUMER",Z.SOCKET_PEERS="SOCKET_PEERS",Z.UPDATE_PERMISSIONS="UPDATE_PERMISSIONS",Z.MAX_SPATIAL_LAYER_CHANGE="MAX_SPATIAL_LAYER_CHANGE",Z.MUTE_SELF="MUTE_SELF",Z.MUTE_SELF_VIDEO="MUTE_SELF_VIDEO",Z))(i||{});const ll="dmFyIHdkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxNZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFpzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsa2Q9T2JqZWN0LmdldFByb3RvdHlwZU9mLE9kPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksTGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxEZD1SZWZsZWN0LmdldDt2YXIgc3I9KGssTyxBKT0+TyBpbiBrP3dkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6QX0pOmtbT109QSxRPShrLE8pPT57Zm9yKHZhciBBIGluIE98fChPPXt9KSlPZC5jYWxsKE8sQSkmJnNyKGssQSxPW0FdKTtpZihacylmb3IodmFyIEEgb2YgWnMoTykpTGQuY2FsbChPLEEpJiZzcihrLEEsT1tBXSk7cmV0dXJuIGt9LG90PShrLE8pPT5NZChrLEFkKE8pKTt2YXIgcD0oayxPLEEpPT4oc3Ioayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLEEpLEEpLGVuPShrLE8sQSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitBKX07dmFyIGVlPShrLE8sQSk9PihlbihrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksQT9BLmNhbGwoayk6Ty5nZXQoaykpLEl0PShrLE8sQSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLEEpfSxDZT0oayxPLEEsZGUpPT4oZW4oayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLEEpOk8uc2V0KGssQSksQSk7dmFyIHRuPShrLE8sQSk9PkRkKGtkKGspLEEsTyk7dmFyIEk9KGssTyxBKT0+bmV3IFByb21pc2UoKGRlLHd0KT0+e3ZhciBNdD1ZPT57dHJ5e0llKEEubmV4dChZKSl9Y2F0Y2goYmUpe3d0KGJlKX19LHE9WT0+e3RyeXtJZShBLnRocm93KFkpKX1jYXRjaChiZSl7d3QoYmUpfX0sSWU9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO0llKChBPUEuYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciBYcyxGZSxuZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsQT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sSWU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxzKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLHMpfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gcm4odCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIG5yPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBMKCl7TC5pbml0LmNhbGwodGhpcyl9SWUuZXhwb3J0cz1MLHEub25jZT1vbixMLkV2ZW50RW1pdHRlcj1MLEwucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEwucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEwucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBpcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEwsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxucih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtpcj10fX0pLEwuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sTC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxucihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gYXIodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9MLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUwucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBhcih0aGlzKX0sTC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10scz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspZS5wdXNoKGFyZ3VtZW50c1tzXSk7dmFyIG49cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMCluPW4mJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighbilyZXR1cm4hMTtpZihuKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxtPXVyKG8sbCkscz0wO3M8bDsrK3MpYmUobVtzXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBvcih0LHIsZSxzKXt2YXIgbixpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1zP1tlLGFdOlthLGVdOnM/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxuPWFyKHQpLG4+MCYmYS5sZW5ndGg+biYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLHJuKGQpfXJldHVybiB0fUwucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCExKX0sTC5wcm90b3R5cGUub249TC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsTC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gc24oKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGNyKHQscixlKXt2YXIgcz17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0sbj1zbi5iaW5kKHMpO3JldHVybiBuLmxpc3RlbmVyPWUscy53cmFwRm49bixufUwucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGNyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGNyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgcyxuLGksYSxkO2lmKGR0KGUpLG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz1uW3JdLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz09PWV8fHMubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgbltyXSxuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLHMubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPXMubGVuZ3RoLTE7YT49MDthLS0paWYoc1thXT09PWV8fHNbYV0ubGlzdGVuZXI9PT1lKXtkPXNbYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9zLnNoaWZ0KCk6bm4ocyxpKSxzLmxlbmd0aD09PTEmJihuW3JdPXNbMF0pLG4ucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEwucHJvdG90eXBlLm9mZj1MLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixMLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUscyxuO2lmKHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocy5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOnNbcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgc1tyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMocyksYTtmb3Iobj0wO248aS5sZW5ndGg7KytuKWE9aVtuXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPXNbcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iobj1lLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW25dKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gZHIodCxyLGUpe3ZhciBzPXQuX2V2ZW50cztpZihzPT09dm9pZCAwKXJldHVybltdO3ZhciBuPXNbcl07cmV0dXJuIG49PT12b2lkIDA/W106dHlwZW9mIG49PSJmdW5jdGlvbiI/ZT9bbi5saXN0ZW5lcnx8bl06W25dOmU/YW4obik6dXIobixuLmxlbmd0aCl9TC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiBkcih0aGlzLHIsITApfSxMLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIGRyKHRoaXMsciwhMSl9LEwubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpsci5jYWxsKHQscil9LEwucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9bHI7ZnVuY3Rpb24gbHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9TC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHVyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxzPTA7czxyOysrcyllW3NdPXRbc107cmV0dXJuIGV9ZnVuY3Rpb24gbm4odCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBhbih0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIG9uKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscyl7ZnVuY3Rpb24gbihhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSkscyhhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixuKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9cHIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmY24odCxuLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBjbih0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJnByKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIHByKHQscixlLHMpe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKXMub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIG4oaSl7cy5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixuKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIFQ7KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoVHx8KFQ9e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgZG49bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLFQuTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxULk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sVC5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixULk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxULk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELFQuTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsVC5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixULk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLFQuTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxULk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULFQuTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULFQuTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxULk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELFQuTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsVC5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLFQuTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxULk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLFQuTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsVC5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsVC5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixULk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLFQuTUlOT1JfRVZFTlRdXSk7Y2xhc3MgbG57Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgdW4gZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6cyxhcGlIb3N0bmFtZXM6bn0pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPXMsdGhpcy5hcGlFbmRwb2ludD1gaHR0cHM6Ly8ke24uZGFDb2xsZWN0b3J9L2FwaS92MS9tZXNzYWdlYCx0aGlzLmV2ZW50U3RvcmU9bmV3IGxufXNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgbjtjb25zdCBzPXtwYXlsb2FkOmUscGVlcklkOnRoaXMucGVlcklkfTt0cnl7cmV0dXJuIHlpZWxkIGZldGNoKHRoaXMuYXBpRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeShzKX0pLCEwfWNhdGNoKGkpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtlcnJvcjppfSksKG49ZS5lbnRyaWVzKT09bnVsbHx8bi5mb3JFYWNoKGE9Pnt0aGlzLmV2ZW50U3RvcmUuYWRkKGEpfSksITF9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksZG4uZ2V0KGUuZXZlbnQpPT09VC5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBzO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7cmV0dXJuKHM9ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmcy5sZW5ndGg/KHlpZWxkIHRoaXMuc2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSksITApOiExfSl9fXZhciBocjsoZnVuY3Rpb24odCl7dC5DSFJPTUlVTT0iY2hyb211bSIsdC5GSVJFRk9YPSJmaXJlZm94Iix0LlNBRkFSST0ic2FmYXJpIn0pKGhyfHwoaHI9e30pKTtjb25zdCBmcj17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIEo7KGZ1bmN0aW9uKHQpe3QuQVVESU89IkFVRElPIix0LlZJREVPPSJWSURFTyIsdC5TUEVBS0VSPSJTUEVBS0VSIix0LlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShKfHwoSj17fSkpO3ZhciBtcjsoZnVuY3Rpb24odCl7dFt0LklOSVQ9MF09IklOSVQiLHRbdC5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHRbdC5ERU5JRUQ9Ml09IkRFTklFRCIsdFt0LlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHRbdC5GQUlMRUQ9NF09IkZBSUxFRCIsdFt0Lk5PVEZPVU5EPTVdPSJOT1RGT1VORCIsdFt0Lk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KShtcnx8KG1yPXt9KSk7ZnVuY3Rpb24gYWUodCl7cmV0dXJuIHQ/dC5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIGx0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiB1dCh7cGFja2V0c0xvc3Q6dCxwYWNrZXRzUmVjZWl2ZWQ6cn0pe3JldHVybiByK3Q+MD90KjEwMC8ocit0KTowfWNvbnN0IGdyPTI0MCxTcj03MjAsdnI9OCx5cj0zLHB0PTEwLGh0PS4wMixmdD0uMDM7ZnVuY3Rpb24gdGUoe3N0YXQ6dCx3ZWlnaHQ6cixyYW5nZU1pbjplLHJhbmdlTWF4OnMscmFuZ2VSYW5raW5nRGlyZWN0aW9uOm59KXtyZXR1cm4gdD09bnVsbD9yOmU9PT1zP249PT0iVVAiP3Q8PWU/cjowOnQ+PXM/cjowOm49PT0iVVAiPygxLU1hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnModCkpLWUsMCkvKHMtZSkpKnI6bj09PSJET1dOIj9NYXRoLm1heChNYXRoLm1pbihzLE1hdGguYWJzKHQpKS1lLDApLyhzLWUpKnI6cn1mdW5jdGlvbiBicih7aXNMb3dRdWFsaXR5VmlkZW86dCxpc1ZpZGVvU3R1Y2s6cixpc1ZpZGVvTGFnZ2luZzplLGppdHRlclF1YWxpdHk6cyxwYWNrZXRzTG9zdFF1YWxpdHk6bn0pe2NvbnN0IGk9LjgqKCh0Py44NToxKSooZT8uNzoxKSoocj8uNToxKSkrLjIqKHMqbik7cmV0dXJuIE1hdGgucm91bmQoKGkrTnVtYmVyLkVQU0lMT04pKjEwMCkvMTAwfWZ1bmN0aW9uIEVyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiBfcih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyLGppdHRlcjplfSl7Y29uc3Qgbj10ZSh7c3RhdDpFcih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyfSksd2VpZ2h0Oi43LHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPXRlKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOmh0LHJhbmdlTWF4OmZ0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIG4rYX1mdW5jdGlvbiBwbih7ZnJhbWVXaWR0aDp0LGlzU2NyZWVuU2hhcmU6cn0pe3JldHVybiB0PChyP1NyOmdyKX1mdW5jdGlvbiBobih7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/eXI6dnIpfWZ1bmN0aW9uIGZuKHtmcmFtZXNFbmNvZGVkOnR9KXtyZXR1cm4gdD09PTB9ZnVuY3Rpb24gVHIoe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50OnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9dGUoe3N0YXQ6RXIoe3BhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0Om4sd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPXBuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT1obih7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1mbih7ZnJhbWVzRW5jb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBicih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWZ1bmN0aW9uIFJyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9ZnVuY3Rpb24gUHIoe2NvbmNlYWxtZW50RXZlbnRzOnQscGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6ZSxqaXR0ZXI6c30pe2NvbnN0IGk9dGUoe3N0YXQ6dCx3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPXRlKHtzdGF0OlJyKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplfSksd2VpZ2h0OmEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9dGUoe3N0YXQ6cyx3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gaStkK2x9ZnVuY3Rpb24gbW4oe2ZyYW1lc0RlY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiBnbih7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/eXI6dnIpfWZ1bmN0aW9uIFNuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/U3I6Z3IpfWZ1bmN0aW9uIENyKHtmcmFtZVdpZHRoOnQsZnJhbWVzUGVyU2Vjb25kOnIscGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6cyxqaXR0ZXI6bixpc1NjcmVlblNoYXJlOmksZnJhbWVzRGVjb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpScih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0Om4sd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPVNuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT1nbih7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1tbih7ZnJhbWVzRGVjb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBicih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWNsYXNzIHJle2NvbnN0cnVjdG9yKHIpe3AodGhpcywicGMxIik7cCh0aGlzLCJwYzIiKTtwKHRoaXMsImNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMiKTtwKHRoaXMsImNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyIsITEpO3AodGhpcywiaWNlQ2FuZGlkYXRlRmlsdGVyIik7Y29uc3QgZT1uZXcgUlRDUGVlckNvbm5lY3Rpb24ocikscz1uZXcgUlRDUGVlckNvbm5lY3Rpb24ocik7dGhpcy5wYzE9ZSx0aGlzLnBjMj1zLHRoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJlLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHIpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLHM9ci5pbmRleE9mKGUpK2UubGVuZ3RoLG49ci5zdWJzdHIocykuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpuWzddLHByb3RvY29sOm5bMl0sYWRkcmVzczpuWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHIpe3JldHVybiByLnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdChyKXtyZXR1cm4gci50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHIpe3JldHVybiByLnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZShyKXtyZXR1cm4gci50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIocil7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUocixlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgcz1yZS5wYXJzZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZS5jYW5kaWRhdGUpO3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyKHMpJiZyLmFkZEljZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZSl9fXNldEljZUNhbmRpZGF0ZUZpbHRlcihyKXt0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1yfWNvbnN0cmFpblZpZGVvQml0cmF0ZShyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHM9cn1kaXNhYmxlVmlkZW9GZWMoKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYz0hMH1nb3RPZmZlcihyKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoLyhtPXZpZGVvIDEgW15ccl0rKSgxMTYgMTE3KShcclxuKS9nLGAkMVxyCmApLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNiByZWRcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDoxMTcgdWxwZmVjXC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6OTggcnR4XC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1mbXRwOjk4IGFwdD0xMTZcclxuL2csIiIpKSx0aGlzLnBjMS5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMyLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpLHRoaXMucGMyLmNyZWF0ZUFuc3dlcigpLnRoZW4odGhpcy5nb3RBbnN3ZXIuYmluZCh0aGlzKSx0aGlzLnJlcG9ydEZhdGFsLmJpbmQodGhpcykpfWdvdEFuc3dlcihyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMmJihyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPW1pZDp2aWRlb1xyXG4vZyxgYT1taWQ6dmlkZW9ccgpiPUFTOiR7dGhpcy5jb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzfVxyCmApKSx0aGlzLnBjMi5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMxLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpfWVzdGFibGlzaENvbm5lY3Rpb24oKXt0aGlzLnBjMS5jcmVhdGVPZmZlcigpLnRoZW4odGhpcy5nb3RPZmZlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9cmVwb3J0RmF0YWwocil7Y29uc29sZS5lcnJvcigiRXJyb3I6IixyKX1nZXRSb3VuZFRyaXBUaW1lKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3IsZV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMucGMxLmdldFN0YXRzKCksdGhpcy5wYzIuZ2V0U3RhdHMoKV0pO2xldCBzLG47aWYoci5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzU2VudD4wJiYocz1pKX0pLGUuZm9yRWFjaChpPT57aS50eXBlPT09ImNhbmRpZGF0ZS1wYWlyIiYmaS5ub21pbmF0ZWQ9PT0hMCYmaS5ieXRlc1JlY2VpdmVkPjAmJihuPWkpfSkscyYmbil0cnl7aWYocy5jdXJyZW50Um91bmRUcmlwVGltZSYmbi5jdXJyZW50Um91bmRUcmlwVGltZSlyZXR1cm57cnR0OnMuY3VycmVudFJvdW5kVHJpcFRpbWUsYmFja2VuZFJUVDpuLmN1cnJlbnRSb3VuZFRyaXBUaW1lfTtjb25zdCBpPShuLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcC1zLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wKS8xZTM7cmV0dXJue3J0dDppLGJhY2tlbmRSVFQ6aX19Y2F0Y2goaSl7cmV0dXJufX0pfWNsb3NlKCl7dGhpcy5wYzEuY2xvc2UoKSx0aGlzLnBjMi5jbG9zZSgpfX1jbGFzcyBJciBleHRlbmRzIHF7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtwKHRoaXMsImNhbGwiKTtwKHRoaXMsInRpbWVPdXQiKTt0aGlzLmNhbGw9bmV3IHJlKGUpfXN0YXJ0KGU9MWU0KXt0aGlzLmNhbGwuZXN0YWJsaXNoQ29ubmVjdGlvbigpLHRoaXMudGltZU91dD1zZXRUaW1lb3V0KHRoaXMudGVzdEZhaWxlZC5iaW5kKHRoaXMpLGUpfXRlc3RDb21wbGV0ZShlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0KSx0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImRvbmUiLGUpfXRlc3RGYWlsZWQoZSl7dGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJmYWlsZWQiLGUpfX1jb25zdCB2bj04LHluPTEvMWUzO2NsYXNzIGJuIGV4dGVuZHMgSXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7cCh0aGlzLCJzZW5kZXJDaGFubmVsIik7cCh0aGlzLCJyZWNpZXZlQ2hhbm5lbCIpO3AodGhpcywic3RhcnRUaW1lIik7cCh0aGlzLCJsYXN0Qml0cmF0ZU1lYXN1cmVUaW1lIik7cCh0aGlzLCJzZW50UGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInJlY2lldmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsImxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcyIsMCk7cCh0aGlzLCJzdG9wU2VuZGluZyIsITEpO3AodGhpcywidGVzdFByb2dyZXNzIiwwKTtwKHRoaXMsInNhbXBsZVBhY2tldCIsIiIpO3AodGhpcywiZmluYWxCaXRyYXRlU3VtIiwwKTtwKHRoaXMsImJpdFJhdGVTYW1wZWxzIiwwKTtwKHRoaXMsIm1heE51bWJlck9mUGFja2V0c1RvU2VuZCIsMCk7cCh0aGlzLCJieXRlc1RvS2VlcEJ1ZmZlcmVkIiwwKTtwKHRoaXMsInRlc3REdXJhdGlvblNlY29uZHMiLDUpO3RoaXMuY2FsbC5zZXRJY2VDYW5kaWRhdGVGaWx0ZXIocmUuaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IHM9MDtzPDEwMjQqMjU2O3MrPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBuPTA7biE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtuKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgcz1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7cz49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1zLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IHM9bmV3IERhdGUsbj1zLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKG4+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqdm4vKG4vMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPXN9aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSp5bil9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpzLGJhY2tlbmRSVFQ6bn0pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpzLGJhY2tlbmRSVFQ6bix0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIEF0IGV4dGVuZHMgSXJ7Y29uc3RydWN0b3IoZSxzPXJlLm5vRmlsdGVyKXtzdXBlcihlKTtwKHRoaXMsImNoMSIpO3AodGhpcywiY2gyIik7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihzKTtjb25zdCBuPXRoaXMuY2FsbC5wYzEuY3JlYXRlRGF0YUNoYW5uZWwobnVsbCk7dGhpcy5jaDE9bixuLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgpPT57bi5zZW5kKCJoZWxsbyIpfSksbi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLm9uQ2gxUmVjaWV2ZS5iaW5kKHRoaXMpKSx0aGlzLmNhbGwucGMyLmFkZEV2ZW50TGlzdGVuZXIoImRhdGFjaGFubmVsIix0aGlzLmRhdGFDaGFubmVsSGFuZGxlci5iaW5kKHRoaXMpKX1vbkNoMVJlY2lldmUoZSl7ZS5kYXRhIT09IndvcmxkIj90aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpOnRoaXMudGVzdENvbXBsZXRlKHtjb25uZWN0aXZpdHk6ITB9KX1vbkNoMlJlY2lldmUoZSl7aWYoZS5kYXRhIT09ImhlbGxvIil0aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpO2Vsc2UgdHJ5e3RoaXMuY2gyLnNlbmQoIndvcmxkIil9Y2F0Y2gocyl7fX1kYXRhQ2hhbm5lbEhhbmRsZXIoZSl7Y29uc3Qgcz1lLmNoYW5uZWw7dGhpcy5jaDI9cyxzLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDJSZWNpZXZlLmJpbmQodGhpcykpfWhhbmd1cChlKXt0aGlzLnRlc3RGYWlsZWQoZSl9fWNsYXNzIEVuIGV4dGVuZHMgQXR7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc0hvc3QpfX1jbGFzcyBfbiBleHRlbmRzIEF0e2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIscmUuaXNSZWxheSl9fWNsYXNzIFRuIGV4dGVuZHMgQXR7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlZmxleGl2ZSl9fWNsYXNzIFJue2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJpcEluZm9ybWF0aW9uIixudWxsKX1nZXRJUERldGFpbHMobil7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6cixhcGlIb3N0bmFtZXM6ZSxsb2dnZXI6c30pe3ZhciBpLGEsZDtpZighdGhpcy5pcEluZm9ybWF0aW9uKXt0cnl7Y29uc3Qgbz1gaHR0cHM6Ly8ke2UubG9jYXRpb259YCxtPXlpZWxkKHlpZWxkIGZldGNoKG8pKS5qc29uKCk7aWYoKChpPW0ubG9jKT09bnVsbD92b2lkIDA6aS5sZW5ndGgpPjUpcmV0dXJuIHRoaXMuaXBJbmZvcm1hdGlvbj1tLChhPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmEuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSksbTt0aHJvdyBFcnJvcigiSW5zdWZmaWNpZW50IGRhdGEiKX1jYXRjaChvKXtzLmVycm9yKCJjYWxsc3RhdHM6OmlwRGV0YWlsczo6IGZhaWxlZCB0byBmZXRjaCBpcCB1c2luZyBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfXRyeXtjb25zdCBvPXlpZWxkIGZldGNoKGBodHRwczovLyR7ZS5sb2NhdGlvbkxlZ2FjeX0vP3Rva2VuPTNjNDkzOTMyYjA2MjRjJnBlZXJJZD0ke3J9YCx7bWV0aG9kOiJQT1NUIn0pO3RoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCBvLmpzb24oKSwoZD10aGlzLmlwSW5mb3JtYXRpb24pIT1udWxsJiZkLmlwJiYodGhpcy5pcEluZm9ybWF0aW9uLmlwPWFlKHRoaXMuaXBJbmZvcm1hdGlvbi5pcCkpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxlZ2FjeSBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfX1yZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9ufSl9cmVzZXRDYWNoZSgpe3RoaXMuaXBJbmZvcm1hdGlvbj1udWxsfX1jb25zdCB3cj1uZXcgUm4sTXI9W3t1cmxzOiJ0dXJuOnR1cm4uZHl0ZS5pbjo0NDM/dHJhbnNwb3J0PXRjcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn0se3VybHM6InR1cm46dHVybi5keXRlLmluOjM0Nzg/dHJhbnNwb3J0PXVkcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn1dO2Z1bmN0aW9uIEFyKHQpe2NvbnN0W3IsZV09dC5zcGxpdCgiLCIpO3JldHVybntjb29yZHM6e2xhdGl0dWRlOk51bWJlcihyKSxsb25naXR1ZGU6TnVtYmVyKGUpfX19Y2xhc3Mga3J7Y29uc3RydWN0b3IoKXtwKHRoaXMsInRyYW5zcG9ydCIpO3AodGhpcywiY2FuZGlkYXRlUGFpciIpO3AodGhpcywib3V0Ym91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kVmlkZW9SdHAiLG5ldyBNYXApO3AodGhpcywib3V0Ym91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQXVkaW9SdHAiLG5ldyBNYXApO3AodGhpcywicmVtb3RlSW5ib3VuZFJ0cCIsbmV3IE1hcCk7cCh0aGlzLCJwcm9kdWNlclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJzdGFsZVByb2R1Y2VyU3RyZWFtTWFwIiwhMSk7cCh0aGlzLCJzdGFsZUNvbnN1bWVyU3RyZWFtTWFwIiwhMSl9fWNsYXNzIE9yIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywib3V0Ym91bmRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJQZWVySWRNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkUHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywib3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsInZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsInZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlbyIsbmV3IFNldCk7cCh0aGlzLCJjb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsInByb2R1Y2VySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJmcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVQcm9kdWNlcnMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVDb25zdW1lcnMiLG5ldyBTZXQpO3AodGhpcywiaXBEZXRhaWxzIik7cCh0aGlzLCJjYWxsU3RhdHNJbnN0YW5jZSIpO3RoaXMub2JzZXJ2ZXI9bmV3IHF9cmVnaXN0ZXJQcm9kdWNlcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1wYXVzZVByb2R1Y2VyKGUpe3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiExfSl9cmVzdW1lUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZSl9cHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxzdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lclZpZGVvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGUscyxuKXt2YXIgYSxkO2NvbnN0IGk9KChkPShhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpkLmdldChlKSl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1JlY2VpdmVkPyh0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpby5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS5hdWRpbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJBdWRpb0ZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJwYXVzZSIsZSkpKToocy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1JlY2VpdmVkLHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRGVmcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMoZSxzLG4pe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsVmlkZW9QYWNrZXRzU2VudD1uLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtzLnRvdGFsQXVkaW9QYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzU2VudD1uLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoZSxzLG4pe3ZhciBtO2NvbnN0IGk9KChtPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDptLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fSx7YXVkaW86YSx2aWRlbzpkLHNjcmVlbjpvfT1pLGw9YXx8ZHx8bztzLnRvdGFsUGFja2V0c1NlbnQ9PT1uLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmwmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2luZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToocy50b3RhbFBhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2luZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoZSxzLG4pe3ZhciBkLG87Y29uc3QgYT0hIUFycmF5LmZyb20oKChvPShkPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpkLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpvLnZhbHVlcygpKXx8W10pLnJlZHVjZSgobCxtKT0+bHx8bS5hdWRpb3x8bS52aWRlb3x8bS5zY3JlZW4sITEpO3MudG90YWxQYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToocy50b3RhbFBhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNTZW50LHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5oYXMoZSkmJih0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydERlZnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUpLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuc2V0KGUuaWQse3Byb2R1Y2VySWQ6ZS5wcm9kdWNlcklkLHBlZXJJZDplLmFwcERhdGEucGVlcklkLGFwcERhdGE6ZS5hcHBEYXRhfSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmFkZChlLmlkKX0pfXBhdXNlQ29uc3VtZXIoZSl7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlKX1nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9cz90aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQobixbIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCJdLCExLGUuaWQpKVswXTp2b2lkIDA7Zm9yKGNvbnN0IGEgb2Ygbi52YWx1ZXMoKSlzd2l0Y2goYS50eXBlKXtjYXNlIm91dGJvdW5kLXJ0cCI6e3RoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9cz90aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQobixbImluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhlKXtyZXR1cm4gZS5maW5kKG49Pntjb25zdCBpPW4uZnJhbWVzRW5jb2RlZD4wLGE9bi5wYWNrZXRzU2VudD4wLGQ9bi5mcmFtZVdpZHRoJiZuLmZyYW1lSGVpZ2h0O3JldHVybiBpJiZhJiYhIWR9KXx8ZVtlLmxlbmd0aC0xXX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyICQsRixILFosdmUseWUsQmUseGUsamUsVWUsJGUsSGUsS2U7Y29uc3QgZD1lLG89bmV3IGtyLGw9cy5sZW5ndGg/bmV3IFNldChzKTp2b2lkIDAsbT1bXSx2PVtdLEU9W10sdz1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgZiBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKGYudHlwZSkpbiYmbC5kZWxldGUoZi50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChmLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7bS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMoZikpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3YucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PWYse3NlbGVjdGVkOnV9PWYsYj1mLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwoZi5ub21pbmF0ZWQ9PT0hMHx8Zi5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9ZjthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1mLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChmLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgSz10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKCgkPUs9PW51bGw/dm9pZCAwOksudHJhY2spPT1udWxsP3ZvaWQgMDokLnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHk9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9Yyx6PVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZWFzb246aC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50YXJnZXRCaXRyYXRlLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxQYWNrZXRTZW5kRGVsYXkscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHkpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGoseil9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9Yyx6PVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0seSk7by5vdXRib3VuZEF1ZGlvUnRwLnNldChmLmlkLHopLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaix6KX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSlicmVhaztjb25zdCBjPWYsdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IEs9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgeT1jLGg9USh7ZnJhbWVIZWlnaHQ6eS5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnkuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnkuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnkuZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzUmVjZWl2ZWQ6eS5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnkua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp5LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp5LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp5LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnkudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06eS5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp5LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp5LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp5LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnkudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp5LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnkudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnkuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp5LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnkucG93ZXJFZmZpY2llbnREZWNvZGVyfSxLKTtoLnNjb3JlPUNyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKEY9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpGLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEg9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpILnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoeWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp5ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxoPVEoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LEspO2guc2NvcmU9UHIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KGYuaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChmLGMpPT57dmFyIHUsYixqLEsseSxoLHosV2UsemUsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsc3QsbnQsaXQsYXQ7aWYoZi5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IE49W107Zi5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChycj0+e04ucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHJyKSl9KTtjb25zdCBNPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoTik7TS5zY29yZT1Ucih7ZnJhbWVXaWR0aDpNLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KE0ucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oSz10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOksucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihNLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLHcuc2V0KGMse3Njb3JlOisoTS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6TS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0Ok0uZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHo9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ei5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTS5wYWNrZXRzU2VudHx8MCktKCgoV2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpXZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHplPU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoTS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpNLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6TS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxNKX1lbHNlIGlmKGYub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQoZi5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO04uc2NvcmU9X3Ioe3BhY2tldHNTZW50OihOLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksdy5zZXQoYyx7c2NvcmU6KyhOLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKE4uYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHN0PU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnN0LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KG50PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6bnQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE4pfX0pLEUuZm9yRWFjaChmPT57Y29uc3QgYz1tLmZpbmQoYj0+Yi5pZD09PWYubG9jYWxDYW5kaWRhdGVJZD8oZi5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT12LmZpbmQoYj0+Yi5pZD09PWYucmVtb3RlQ2FuZGlkYXRlSWQ/KGYucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYoZi5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLGYubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksZi5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LGYubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLGYubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsZi5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsZi5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYoZi5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxmLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxmLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LGYucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxmLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYody5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLHcpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlcnNSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9ZS5tYXAobj0+dGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKG4sITApKTtyZXR1cm4gcy5sZW5ndGg+MD9Qcm9taXNlLmFsbChzKTp2b2lkIDB9KX1nZXRDb25zdW1lcnNSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9ZS5tYXAobj0+dGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKG4sITApKTtyZXR1cm4gcy5sZW5ndGg+MD9Qcm9taXNlLmFsbChzKTp2b2lkIDB9KX1nZXRUcmFuc3BvcnRSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiBlLmdldFN0YXRzKCl9KX1nZXRQcm9jZXNzZWRTdGF0cyhlLHMsbil7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGk9eWllbGQgdGhpcy5nZXRUcmFuc3BvcnRSZXBvcnQoZSksYT17cHJvZHVjaW5nOm4sY29uc3VtaW5nOnMsaWQ6ZS5pZH0sZD1pLG89dGhpcy5wYXJzZVJUQ1JlcG9ydChkLFsidHJhbnNwb3J0IiwiY2FuZGlkYXRlLXBhaXIiLCJpbmJvdW5kLXJ0cCIsIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCIsImxvY2FsLWNhbmRpZGF0ZSIsInJlbW90ZS1jYW5kaWRhdGUiXSwhMSx2b2lkIDAsYSk7aWYoIW8pcmV0dXJuO2NvbnN0IGw9e3N0YXRzOm8udHJhbnNwb3J0LHRyYW5zcG9ydElkOmUuaWQsY29uc3VtaW5nOnMscHJvZHVjaW5nOm59LG09by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KG8pLHY9by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KG8pO3JldHVybnt0cmFuc3BvcnRSZXBvcnQ6bCxwcm9kdWNlclJlcG9ydDptLGNvbnN1bWVyUmVwb3J0OnZ9fSl9Z2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57dmFyIGEsZDtzLnB1c2goe3Byb2R1Y2VySWQ6aSx2aWRlb1N0YXRzOm4ub3V0Ym91bmRWaWRlb1J0cElkLm1hcChvPT5lLm91dGJvdW5kVmlkZW9SdHAuZ2V0KG8pKSxhdWRpb1N0YXRzOm4ub3V0Ym91bmRBdWRpb1J0cElkLm1hcChvPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG8pKSxhcHBEYXRhOigoZD0oYT10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycyk9PW51bGw/dm9pZCAwOmEuZ2V0KGkpKT09bnVsbD92b2lkIDA6ZC5hcHBEYXRhKXx8bnVsbH0pfSl9Y2F0Y2gobil7dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpnZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydCIse2Vycm9yOntyZWFzb246bi5yZWFzb24sbWVzc2FnZTpuLm1lc3NhZ2V9fSl9cmV0dXJuIHN9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQoaSk7cy5wdXNoKHtjb25zdW1lcklkOmkscGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6byx2aWRlb1N0YXRzOm4uaW5ib3VuZFZpZGVvUnRwSWQubWFwKGw9PmUuaW5ib3VuZFZpZGVvUnRwLmdldChsKSksYXVkaW9TdGF0czpuLmluYm91bmRBdWRpb1J0cElkLm1hcChsPT5lLmluYm91bmRBdWRpb1J0cC5nZXQobCkpfSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRVc2VyTG9jYXRpb24oKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHMpPT57dHJ5e25hdmlnYXRvci5nZW9sb2NhdGlvbj9uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKG49PntlKG4pfSk6cygpfWNhdGNoKG4pe3Mobil9fSl9KX1nZXRDb25uZWN0aXZpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBzPXtpY2VTZXJ2ZXJzOmV8fE1yfSxuPW5ldyBQcm9taXNlKChtLHYpPT57dHJ5e2NvbnN0IEU9bmV3IEVuKHMpO0UuYWRkTGlzdGVuZXIoImRvbmUiLG0pLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PnttKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt2KEUpfX0pLGk9bmV3IFByb21pc2UoKG0sdik9Pnt0cnl7Y29uc3QgRT1uZXcgX24ocyk7RS5hZGRMaXN0ZW5lcigiZG9uZSIsbSksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e20oe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3YoRSl9fSksYT1uZXcgUHJvbWlzZSgobSx2KT0+e3RyeXtjb25zdCBFPW5ldyBUbihzKTtFLmFkZExpc3RlbmVyKCJkb25lIixtKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57bSh7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7dihFKX19KSxbZCxvLGxdPXlpZWxkIFByb21pc2UuYWxsKFtuLGksYV0pO3JldHVybntob3N0OmQ9PW51bGw/dm9pZCAwOmQuY29ubmVjdGl2aXR5LHJlbGF5Om89PW51bGw/dm9pZCAwOm8uY29ubmVjdGl2aXR5LHJlZmxleGl2ZTpsPT1udWxsP3ZvaWQgMDpsLmNvbm5lY3Rpdml0eX19Y2F0Y2gocyl7cmV0dXJue2hvc3Q6ITEscmVsYXk6ITEscmVmbGV4aXZlOiExfX19KX1nZXRUaHJvdWdocHV0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3Qgbj15aWVsZCBuZXcgUHJvbWlzZSgoaSxhKT0+e3RyeXtjb25zdCBkPXtpY2VTZXJ2ZXJzOmV8fE1yfSxvPW5ldyBibihkKTtvLmFkZExpc3RlbmVyKCJkb25lIixpKSxvLmFkZExpc3RlbmVyKCJmYWlsZWQiLGEpLG8uc3RhcnQoMWU0KX1jYXRjaChkKXthKGQpfX0pO3JldHVybnt0aHJvdWdocHV0Om4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczowLFJUVDpuLlJUVCxqaXR0ZXI6MCxiYWNrZW5kUlRUOm4uYmFja2VuZFJUVH19Y2F0Y2gocyl7cmV0dXJufX0pfWdldElQRGV0YWlscygpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgZSxzO3RyeXtyZXR1cm4gdGhpcy5pcERldGFpbHN8fCh0aGlzLmlwRGV0YWlscz15aWVsZCB3ci5nZXRJUERldGFpbHMoe3BlZXJJZDooZT10aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6ZS5wZWVySWQsYXBpSG9zdG5hbWVzOihzPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpzLmFwaUhvc3RuYW1lcyxsb2dnZXI6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXJ9KSksdGhpcy5pcERldGFpbHN9Y2F0Y2gobil7cmV0dXJufX0pfWdldE5ldHdvcmtRdWFsaXR5KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtzLG5dPXlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmdldENvbm5lY3Rpdml0eShlKSx0aGlzLmdldFRocm91Z2hwdXQoZSldKTtyZXR1cm57Y29ubmVjdGl2aXR5OnMsdGhyb3VnaHB1dDpuPT1udWxsP3ZvaWQgMDpuLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6bj09bnVsbD92b2lkIDA6bi5mcmFjdGlvbmFsTG9zcyxSVFQ6bj09bnVsbD92b2lkIDA6bi5SVFQsaml0dGVyOm49PW51bGw/dm9pZCAwOm4uaml0dGVyLGJhY2tlbmRSVFQ6bj09bnVsbD92b2lkIDA6bi5iYWNrZW5kUlRUfX0pfWdldE5ldHdvcmtJbmZvKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBkLG87aWYocyl7Y29uc3QgbD15aWVsZCB0aGlzLmdldElQRGV0YWlscygpO3JldHVybntpcERldGFpbHM6bCxlZmZlY3RpdmVOZXR3b3JrVHlwZTooZD1uYXZpZ2F0b3IuY29ubmVjdGlvbik9PW51bGw/dm9pZCAwOmQuZWZmZWN0aXZlVHlwZSxsb2NhdGlvbjpsIT1udWxsJiZsLmxvYz9BcihsPT1udWxsP3ZvaWQgMDpsLmxvYyk6dm9pZCAwfX1jb25zdFtuLGksYV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKSx0aGlzLmdldElQRGV0YWlscygpXSk7cmV0dXJue2lwRGV0YWlsczphLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihvPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6by5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmEhPW51bGwmJmEubG9jP0FyKGE9PW51bGw/dm9pZCAwOmEubG9jKTp2b2lkIDAsdHVybkNvbm5lY3Rpdml0eTpuP24uaG9zdHx8bi5yZWxheXx8bi5yZWZsZXhpdmU6ITEsY29ubmVjdGl2aXR5Om4sdGhyb3VnaHB1dDppPT1udWxsP3ZvaWQgMDppLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6aT09bnVsbD92b2lkIDA6aS5mcmFjdGlvbmFsTG9zcyxSVFQ6aT09bnVsbD92b2lkIDA6aS5SVFQsaml0dGVyOmk9PW51bGw/dm9pZCAwOmkuaml0dGVyLGJhY2tlbmRSVFQ6aT09bnVsbD92b2lkIDA6aS5iYWNrZW5kUlRUfX0pfX1jbGFzcyBQbiBleHRlbmRzIE9ye31jbGFzcyBMciBleHRlbmRzIE9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtwKHRoaXMsInByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyTWFwIixuZXcgTWFwKX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLnByb2R1Y2VyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVQcm9kdWNlclN0cmVhbU1hcChlKSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyUHJvZHVjZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuYWRkKGUuaWQpfSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jb25zdW1lck1hcC5zZXQoZS5pZCxlKSx5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9Z2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlLHM9ITEpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBuPXlpZWxkIGUuZ2V0U3RhdHMoKSxpPXRoaXMucGFyc2VSVENSZXBvcnQobixbImluYm91bmQtcnRwIl0sITEsZS5pZCksYT1bLi4uaS5jb25zdW1lclN0cmVhbU1hcC52YWx1ZXMoKV1bMF0sZD1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGksYSxlLmlkKTp2b2lkIDA7Zm9yKGNvbnN0IG8gb2Ygbi52YWx1ZXMoKSlzd2l0Y2goby50eXBlKXtjYXNlImluYm91bmQtcnRwIjp7dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuc2V0KG8uaWQsZS5pZCk7YnJlYWt9fXJldHVybiBkfSl9ZGVyZWdpc3RlclByb2R1Y2VyKGUpe3RoaXMucHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5kZWxldGUobil9KSx0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmRlbGV0ZShlLmlkKX1kZXJlZ2lzdGVyQ29uc3VtZXIoZSl7dGhpcy5jb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLmluYm91bmRDb25zdW1lck1hcC5kZWxldGUobil9KSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmRlbGV0ZShlLmlkKX1nZXRJY2VDYW5kaWRhdGVTdGF0cyhlKXt2YXIgcztyZXR1cm57aWQ6ZS5pZCx0eXBlOmUuY2FuZGlkYXRlVHlwZXx8ZS50eXBlLGFkZHJlc3M6ZS5hZGRyZXNzLHBvcnQ6ZS5wb3J0LHVybDplLnVybCxwcm90b2NvbDoocz1lLnJlbGF5UHJvdG9jb2wpIT1udWxsP3M6ZS5wcm90b2NvbCxuZXR3b3JrVHlwZTplLm5ldHdvcmtUeXBlLHJlbGF0ZWRBZGRyZXNzOmUucmVsYXRlZEFkZHJlc3MscmVsYXRlZFBvcnQ6ZS5yZWxhdGVkUG9ydH19cGFyc2VSVENSZXBvcnQoZSxzPVtdLG49ITEsaT12b2lkIDAsYT12b2lkIDApe3ZhciAkLEYsSCxaLHZlLHllLEJlLHhlLGplLFVlLCRlLEhlLEtlO2NvbnN0IGQ9ZSxvPW5ldyBrcixsPXMubGVuZ3RoP25ldyBTZXQocyk6dm9pZCAwLG09W10sdj1bXSxFPVtdLHc9bmV3IE1hcCx4PW5ldyBNYXA7Zm9yKGNvbnN0IGYgb2YgZC52YWx1ZXMoKSl7aWYobCl7aWYobC5zaXplPT09MClicmVhaztpZihsLmhhcyhmLnR5cGUpKW4mJmwuZGVsZXRlKGYudHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2goZi50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e20ucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOnt2LnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhmKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1mLHtzZWxlY3RlZDp1fT1mLGI9ZixqPXtub21pbmF0ZWQ6YyE9bnVsbD9jOnUsY3VycmVudFJvdW5kVHJpcFRpbWU6Yi5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6Yi50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDpiLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmIuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpiLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6Yi5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmIubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOmIubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDpiLmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6Yi5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDpiLmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OmIucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmIucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6Yi5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtFLnB1c2goaiksKGYubm9taW5hdGVkPT09ITB8fGYuc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9aik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPWY7YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IHU9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PXUsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX1pZihhLmNvbnN1bWluZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9Zix1PXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCx1KTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKWJyZWFrO2NvbnN0IGM9Zix1PWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhmLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IEs9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KHUpO2lmKCgoJD1LPT1udWxsP3ZvaWQgMDpLLnRyYWNrKT09bnVsbD92b2lkIDA6JC5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXModSl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KHUse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBoPWMsej1RKHtmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6aC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6aC5mcmFtZXNEcm9wcGVkP2guZnJhbWVzRHJvcHBlZDpoLmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kP2guZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVyYXRlTWVhbixmcmFtZXNTZW50OmguZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOmgua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpoLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpoLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpoLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OmgucGxpQ291bnQscXBTdW06aC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpoLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOmgudG90YWxFbmNvZGVUaW1lLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxFbmNvZGVUaW1lLHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6aC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOmgucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KGYuaWQseiksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHModSxqLHopfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBoPWMsej1RKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyh1LGoseil9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KGYuaWQpLGI9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyh1KXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQodSx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCBLPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxoPVEoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQ/eS5mcmFtZXNEcm9wcGVkOnkuZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQ/eS5mcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXJhdGVNZWFuLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0sSyk7aC5zY29yZT1Dcih7ZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDooaC5mcmFtZXNEZWNvZGVkfHwwKS0oKChGPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Ri5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChIPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SC5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFo9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpaLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChCZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkJlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRWaWRlb1J0cC5zZXQoZi5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kVmlkZW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHModSxqLGgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCB5PWMsaD1RKHthdWRpb0xldmVsOnkuYXVkaW9MZXZlbCxjb25jZWFsZWRTYW1wbGVzOnkuY29uY2VhbGVkU2FtcGxlcyxjb25jZWFsbWVudEV2ZW50czp5LmNvbmNlYWxtZW50RXZlbnRzLHRvdGFsQXVkaW9FbmVyZ3k6eS50b3RhbEF1ZGlvRW5lcmd5LHRvdGFsU2FtcGxlc0R1cmF0aW9uOnkudG90YWxTYW1wbGVzRHVyYXRpb24sdG90YWxTYW1wbGVzUmVjZWl2ZWQ6eS50b3RhbFNhbXBsZXNSZWNlaXZlZCxmZWNQYWNrZXRzRGlzY2FyZGVkOnkuZmVjUGFja2V0c0Rpc2NhcmRlZHx8MCxmZWNQYWNrZXRzUmVjZWl2ZWQ6eS5mZWNQYWNrZXRzUmVjZWl2ZWR8fDAsaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9uOnkuaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9ufHwwLHJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9uOnkucmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb258fDAsc2lsZW50Q29uY2VhbGVkU2FtcGxlczp5LnNpbGVudENvbmNlYWxlZFNhbXBsZXN8fDAscGxheW91dElkOnkucGxheW91dElkfSxLKTtoLnNjb3JlPVByKHtjb25jZWFsbWVudEV2ZW50czooaC5jb25jZWFsbWVudEV2ZW50c3x8MCktKCgoeGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp4ZS5jb25jZWFsbWVudEV2ZW50cyl8fDApLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChqZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOmplLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoVWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpVZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDB9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCgkZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoSGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEtlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6S2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZEF1ZGlvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRBdWRpb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyQXVkaW9TdGF0cyh1LGosaCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBJbmJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha319fWlmKG8ucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgoZixjKT0+e3ZhciB1LGIsaixLLHksaCx6LFdlLHplLEdlLHFlLFllLFFlLEplLFhlLFplLGV0LHR0LHJ0LHN0LG50LGl0LGF0O2lmKGYub3V0Ym91bmRWaWRlb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPVtdO2Yub3V0Ym91bmRWaWRlb1J0cElkLmZvckVhY2gocnI9PntOLnB1c2goby5vdXRib3VuZFZpZGVvUnRwLmdldChycikpfSk7Y29uc3QgTT10aGlzLmdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKE4pO00uc2NvcmU9VHIoe2ZyYW1lV2lkdGg6TS5mcmFtZVdpZHRofHwwLGZyYW1lc1BlclNlY29uZDpNLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh1PU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnUuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNTZW50OihNLnBhY2tldHNTZW50fHwwKS0oKChiPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Yi5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKGo9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ai5wYWNrZXRzTG9zdCl8fDApLSgoKHk9KEs9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpLLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp5LnBhY2tldHNMb3N0KXx8MCksZnJhbWVzRW5jb2RlZDooTS5mcmFtZXNFbmNvZGVkfHwwKS0oKChoPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6aC5mcmFtZXNFbmNvZGVkKXx8MCl9KSx3LnNldChjLHtzY29yZTorKE0uc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOk0uZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpNLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpNLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh6PU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnouaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KE0ucGFja2V0c1NlbnR8fDApLSgoKFdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKCh6ZT1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzTG9zdCl8fDApLSgoKHFlPShHZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkdlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpxZS5wYWNrZXRzTG9zdCl8fDApfSksYml0cmF0ZTooKE0uYnl0ZXNTZW50fHwwKS0oKChZZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlllLmJ5dGVzU2VudCl8fDApKSo4LzcsY3B1TGltaXRhdGlvbnM6TS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJjcHUiLGJhbmR3aWR0aExpbWl0YXRpb25zOk0ucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iYmFuZHdpZHRoIn0pLHRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsTSl9ZWxzZSBpZihmLm91dGJvdW5kQXVkaW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgTj1vLm91dGJvdW5kQXVkaW9SdHAuZ2V0KGYub3V0Ym91bmRBdWRpb1J0cElkWzBdKTtOLnNjb3JlPV9yKHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgoUWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpRZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKEplPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkplLnBhY2tldHNMb3N0KXx8MCktKCgoWmU9KFhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WGUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlplLnBhY2tldHNMb3N0KXx8MCksaml0dGVyOigoZXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ZXQuaml0dGVyKXx8MH0pLHcuc2V0KGMse3Njb3JlOisoTi5zY29yZSoxMCkudG9GaXhlZCgpLGJpdHJhdGU6KChOLmJ5dGVzU2VudHx8MCktKCgodHQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp0dC5ieXRlc1NlbnQpfHwwKSkqOC83LHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KE4ucGFja2V0c1NlbnR8fDApLSgoKHJ0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6cnQucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChzdD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpzdC5wYWNrZXRzTG9zdCl8fDApLSgoKGl0PShudD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOm50LnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDppdC5wYWNrZXRzTG9zdCl8fDApfSksaml0dGVyOigoYXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6YXQuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpfSksdGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxOKX19KSxFLmZvckVhY2goZj0+e2NvbnN0IGM9bS5maW5kKGI9PmIuaWQ9PT1mLmxvY2FsQ2FuZGlkYXRlSWQ/KGYubG9jYWxDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpLHU9di5maW5kKGI9PmIuaWQ9PT1mLnJlbW90ZUNhbmRpZGF0ZUlkPyhmLnJlbW90ZUNhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCk7YyYmKGYubG9jYWxDYW5kaWRhdGVUeXBlPWMudHlwZSxmLmxvY2FsQ2FuZGlkYXRlQWRkcmVzcz1hZShjLmFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVQb3J0PWMucG9ydCxmLmxvY2FsQ2FuZGlkYXRlUHJvdG9jb2w9Yy5wcm90b2NvbCxmLmxvY2FsQ2FuZGlkYXRlVXJsPWMudXJsLGYubG9jYWxDYW5kaWRhdGVOZXR3b3JrVHlwZT1jLm5ldHdvcmtUeXBlLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkQWRkcmVzcz1hZShjLnJlbGF0ZWRBZGRyZXNzKSxmLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZFBvcnQ9Yy5yZWxhdGVkUG9ydCksdSYmKGYucmVtb3RlQ2FuZGlkYXRlVHlwZT11LnR5cGUsZi5yZW1vdGVDYW5kaWRhdGVBZGRyZXNzPWFlKHUuYWRkcmVzcyksZi5yZW1vdGVDYW5kaWRhdGVQb3J0PXUucG9ydCxmLnJlbW90ZUNhbmRpZGF0ZVByb3RvY29sPXUucHJvdG9jb2wsZi5yZW1vdGVDYW5kaWRhdGVVcmw9dS51cmwpfSksby5jYW5kaWRhdGVQYWlyJiYoby50cmFuc3BvcnQ/KG8udHJhbnNwb3J0LmJ5dGVzUmVjZWl2ZWQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsby50cmFuc3BvcnQuYnl0ZXNTZW50PW8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYody5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLHcpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdCBhPXRoaXMucHJvZHVjZXJNYXAuZ2V0KGkpLGQ9YS50cmFjay5nZXRTZXR0aW5ncygpLG89bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG09Pntjb25zdCB2PWUub3V0Ym91bmRWaWRlb1J0cC5nZXQobSk7cmV0dXJuIHYuZnJhbWVIZWlnaHR8fCh2LmZyYW1lSGVpZ2h0PWQuaGVpZ2h0LHYuZnJhbWVXaWR0aD1kLndpZHRoLHYuZnJhbWVzUGVyU2Vjb25kPWQuZnJhbWVSYXRlKSx2fSksbD17cHJvZHVjZXJJZDppLGFwcERhdGE6YS5hcHBEYXRhLHZpZGVvU3RhdHM6byxhdWRpb1N0YXRzOm4ub3V0Ym91bmRBdWRpb1J0cElkLm1hcChtPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG0pKX07cy5wdXNoKGwpfSl9Y2F0Y2gobil7Y29uc29sZS5lcnJvcigiZ2V0UHJvZHVjZXJzUmVwb3J0OiAiLG4sZSl9cmV0dXJuIHN9Z2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUscyxuKXtsZXQgaTt0cnl7Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQobiksbD1zPT1udWxsP3ZvaWQgMDpzLmluYm91bmRWaWRlb1J0cElkLm1hcChtPT57Y29uc3QgRT10aGlzLmNvbnN1bWVyTWFwLmdldChuKS50cmFjay5nZXRTZXR0aW5ncygpLHc9ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KG0pO3JldHVybiB3LmZyYW1lSGVpZ2h0fHwody5mcmFtZUhlaWdodD1FLmhlaWdodCx3LmZyYW1lV2lkdGg9RS53aWR0aCx3LmZyYW1lc1BlclNlY29uZD1FLmZyYW1lUmF0ZSksd30pO2k9e2NvbnN1bWVySWQ6bixwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bCxhdWRpb1N0YXRzOnM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZEF1ZGlvUnRwSWQubWFwKG09PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChtKSl9fWNhdGNoKGEpe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0czogIixhLGUpfXJldHVybiBpfWdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UuY29uc3VtZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e3MucHVzaCh0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0cyhlLG4saSkpfSl9Y2F0Y2gobil7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQ6ICIsbixlKX1yZXR1cm4gc319Y2xhc3MgQ24gZXh0ZW5kcyBMcnt9ZnVuY3Rpb24gbXQodCxyLGUscyl7aWYodCE9bnVsbCYmdC5sb2dnZXImJnQubG9nZ2VyLmVycm9yKCJDYWxsc3RhdHM6OmhhbmRsZUVycm9yIix7ZXJyb3I6c30pLHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZzIGluc3RhbmNlb2YgcillLmNhbGwobnVsbCxzLHQpO2Vsc2UgdGhyb3cgc31mdW5jdGlvbiBEcih0LHIsZSl7Y29uc3Qgcz10LnZhbHVlO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKC4uLm4pe3RyeXtjb25zdCBpPXMuYXBwbHkodGhpcyxuKTtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS5jYXRjaChhPT57bXQodGhpcyxyLGUsYSl9KTppfWNhdGNoKGkpe210KHRoaXMscixlLGkpfXJldHVybiBudWxsfSx0fWNvbnN0IEM9KHQscik9PihlLHMsbik9Pntjb25zdCBpPW4udmFsdWU7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24oLi4uYSl7dHJ5e2NvbnN0IGQ9aS5hcHBseSh0aGlzLGEpO3JldHVybiBkJiZkIGluc3RhbmNlb2YgUHJvbWlzZT9kLmNhdGNoKG89PnttdCh0aGlzLHQscixvKX0pOmR9Y2F0Y2goZCl7bXQodGhpcyx0LHIsZCl9cmV0dXJuIG51bGx9LG59LEluPSh0LHIpPT4oZSxzLG4pPT57aWYobilyZXR1cm4gRHIobix0LHIpO2Zvcihjb25zdCBpIG9mIFJlZmxlY3Qub3duS2V5cyhlLnByb3RvdHlwZSkuZmlsdGVyKGE9PmEhPT0iY29uc3RydWN0b3IiKSl7Y29uc3QgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUucHJvdG90eXBlLGkpO2EudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLGksRHIoYSx0LHIpKX19O3ZhciBSPWZ1bmN0aW9uKHQscixlLHMpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgsaT1uPDM/cjpzPT09bnVsbD9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKTpzLGE7aWYodHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZ0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZT09ImZ1bmN0aW9uIilpPVJlZmxlY3QuZGVjb3JhdGUodCxyLGUscyk7ZWxzZSBmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wO2QtLSkoYT10W2RdKSYmKGk9KG48Mz9hKGkpOm4+Mz9hKHIsZSxpKTphKHIsZSkpfHxpKTtyZXR1cm4gbj4zJiZpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLGkpLGl9O2NvbnN0IFA9Y29uc29sZTtsZXQgXz1jbGFzcyBleHRlbmRzIHF7Y29uc3RydWN0b3IoZT0iaHR0cHM6Ly9hcGkudGVzdGluZ3YzLmR5dGUuaW4iLHM9IkJsaW5rIixuPWZyLlBST0QsaSxhLGQsbyl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJldmVudEhhbmRsZXIiKTtwKHRoaXMsIm1lYXN1cmVtZW50cyIpO3AodGhpcywicHJvZHVjaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJjb25zdW1pbmdUcmFuc3BvcnQiKTtwKHRoaXMsInByb2R1Y2VycyIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lcnMiLG5ldyBNYXApO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiY29ubmVjdGlvbkluZm9Qcm9taXNlIik7cCh0aGlzLCJwaW5nU3RhdHNUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsImVudiIpO3AodGhpcywiYXBpSG9zdG5hbWVzIik7cCh0aGlzLCJwZWVySWQiKTtwKHRoaXMsImNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXAiLG5ldyBNYXApO3AodGhpcywiY3VycmVudFVzZXJNZWRpYVN0YXRlcyIse30pO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1bih7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm99KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgUG47YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IExyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ247YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGwpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGwpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBsPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZsP24ucHJvZHVjZXJSZXBvcnQ9bDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmbD9pLmNvbnN1bWVyUmVwb3J0PWw6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksXz1SKFtJbihUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8pO3ZhciB3bj1fO2NsYXNzIE5yIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7cCh0aGlzLCJzdGF0cyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJiYWNrZW5kIik7cCh0aGlzLCJpY2VTZXJ2ZXJzIik7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywic3RhbGxlZCIsITEpO3AodGhpcywiaXBJbmZvcm1hdGlvbiIpO3AodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZSh2KXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj1mci5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpsLHNraXBDb25uZWN0aXZpdHlDaGVja3M6bT0hMX0pe3ZhciBFLHcseDt0cnl7dGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLHRoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCB3ci5nZXRJUERldGFpbHMoe3BlZXJJZDplLGFwaUhvc3RuYW1lczpsLGxvZ2dlcjpvfSksdGhpcy5iYWNrZW5kPW5ldyB3bihhLHMsbixkLG8sZSxsKSx0aGlzLmljZVNlcnZlcnM9aSwoRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKHg9KHc9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6dy5ldmVudEhhbmRsZXIpPT1udWxsfHx4LmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KG0pfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uOiAiLHtlcnJvcjokfSksdGhpcy5zdGFsbENhbGxTdGF0cygpfX0pfWNvbmZpZ3VyZVNlbmRUcmFuc3BvcnQoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMucmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl9KX1jb25maWd1cmVSZWN2VHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0KGUpfSl9Y2FuZGlkYXRlUmVnaW9uYWxOZXR3b3JrUXVhbGl0eVRlc3QoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuO3RyeXsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50KGUscyl9Y2F0Y2goaSl7dGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLHtlcnJvcjp7cmVhc29uOmkucmVhc29ufX0pfX0pfSl9cm9vbUpvaW5lZChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG4saTsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKSx0aGlzLmJhY2tlbmQsKGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zdGFydFBpbmdTdGF0cygpfSl9KX1hdWRpb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITEsZSl9KX1hdWRpb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQXVkaW9Ub2dnbGVFdmVudCghMCxlKX0pfXZpZGVvT2ZmKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMSxlKX0pfXZpZGVvT24oKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRWaWRlb1RvZ2dsZUV2ZW50KCEwLGUpfSl9Y2FsbEVuZGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHMsbjsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnN0b3BQaW5nU3RhdHMoKSwobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmREaXNjb25uZWN0RXZlbnQoZSl9KX1zY3JlZW5TaGFyZVN0YXJ0KGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQoITAsZSxzKX0pfWNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZShlLHMpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRDb25zdW1lclNoYXJlZE1lZGlhU3RhdGVFdmVudChlLHMpfSl9c2NyZWVuU2hhcmVTdG9wKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQoITEsZSxzKX0pfXNjcmVlblNoYXJlUmVxdWVzdGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKX0pfWFjdGl2ZVNwZWFrZXIoZSl7aWYoZSE9PXRoaXMucGVlcklkKXJldHVybjtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRBY3RpdmVTcGVha2VyRXZlbnQoZSxzKX0pfWRldmljZXMoZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmRldmljZXMoZSxzLG4pfSl9c2VsZWN0ZWREZXZpY2UoZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLnNlbGVjdGVkRGV2aWNlKGUscyxuKX0pfW1lZGlhUGVybWlzc2lvbihlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpOyhpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkubWVkaWFQZXJtaXNzaW9uKGUscyxuKX0pfW1lZGlhUGxheWJhY2tGYWlsZWQoZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5tZWRpYVBsYXliYWNrRmFpbGVkKGUscyl9KX1tZWRpYVRyYWNrTXV0ZWQoZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5tZWRpYVRyYWNrTXV0ZWQoZSxzKX0pfXRhYkNoYW5nZWQoZT0hMSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi50YWJDaGFuZ2VkKGUscyl9KX1icm93c2VyQmFja2dyb3VuZGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5icm93c2VyQmFja2dyb3VuZGVkKGUpfSl9YnJvd3NlckZvcmVncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckZvcmVncm91bmRlZChlKX0pfWxlZ2FjeVN3aXRjaChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmxlZ2FjeVN3aXRjaChlLHMpfSl9c3RhcnRQcmVDYWxsVGVzdChlPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kUHJlQ2FsbFRlc3RCZWdpbkV2ZW50KGUscyl9KX0pfW9uUHJlQ2FsbFRlc3RSZXN1bHRzKGUpe3JldHVybiB0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub25jZSgicHJlY2FsbF9lbmQiLGUpfSksZX1vblJlY2VpdmluZ0NvbnN1bWVyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1lclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjZXJBdWRpb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyVmlkZW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNpbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ0NvbnN1bWluZ1RyYW5zcG9ydFN0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIixlKX0pfW9uUHJvZHVjZXJTY29yZShlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oInByb2R1Y2VyX3Njb3JlIixlKX0pfW9uQ29uc3VtZXJTY29yZShlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3Njb3JlIixlKX0pfW9uU2FmZUluaXRpYWxpemF0aW9uKGUpe2lmKHRoaXMuaW5pdGlhbGl6ZWQpZSh0aGlzLmlwSW5mb3JtYXRpb24sITEpO2Vsc2UgaWYoIXRoaXMuc3RhbGxlZCl7Y29uc3Qgcz1uPT57ZShuLCEwKX07cmV0dXJuIHRoaXMub25jZSgiaW5pdGlhbGl6ZWQiLHMpLHN9cmV0dXJuKCk9Pnt9fXJlbW92ZUluaXRpYWxpemF0aW9uTGlzdGVuZXIoZSl7dGhpcy5yZW1vdmVMaXN0ZW5lcigiaW5pdGlhbGl6ZWQiLGUpfXN0YWxsQ2FsbFN0YXRzKCl7dGhpcy5zdGFsbGVkPSEwLHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJpbml0aWFsaXplZCIpfWl2c1BsYXllckV2ZW50KGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGksYSxkLG8sbCxtLHYsRSx3LHgsJDtzd2l0Y2goZSl7Y2FzZSJQbGF5ZXJSZWJ1ZmZlcmluZyI6KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChuKTticmVhaztjYXNlIlBsYXllckF1ZGlvQmxvY2tlZCI6KGE9dGhpcy5iYWNrZW5kKT09bnVsbHx8YS5zZW5kSVZTUGxheWVyQXVkaW9CbG9ja0V2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tCbG9ja2VkIjooZD10aGlzLmJhY2tlbmQpPT1udWxsfHxkLnNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChuKTticmVhaztjYXNlIlBsYXllck5ldHdvcmtVbmF2YWlsYWJsZSI6KG89dGhpcy5iYWNrZW5kKT09bnVsbHx8by5zZW5kSVZTUGxheWVyTmV0d29ya1VuYXZhaWxhYmxlRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJJbml0aWFsaXplZCI6KGw9dGhpcy5iYWNrZW5kKT09bnVsbHx8bC5zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChuKTticmVhaztjYXNlIlBsYXllcldvcmtlckVycm9yIjoobT10aGlzLmJhY2tlbmQpPT1udWxsfHxtLnNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVyRXJyb3IiOih2PXRoaXMuYmFja2VuZCk9PW51bGx8fHYuc2VuZElWU1BsYXllckVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllclJlY292ZXJhYmxlRXJyb3IiOihFPXRoaXMuYmFja2VuZCk9PW51bGx8fEUuc2VuZElWU1BsYXllclJlY292ZXJhYmxlRXJyb3JFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyQW5hbHl0aWNzRXZlbnQiOih3PXRoaXMuYmFja2VuZCk9PW51bGx8fHcuc2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkIjooeD10aGlzLmJhY2tlbmQpPT1udWxsfHx4LnNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllclF1YWxpdHlDaGFuZ2VkIjooJD10aGlzLmJhY2tlbmQpPT1udWxsfHwkLnNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZChzLG4pO2JyZWFrfX0pfWxpdmVzdHJlYW1MYXRlbmN5KGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFBsYXllckxpdmVMYXRlbmN5KGUscyl9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpOyhpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzLG4pfSl9ZXhwZWN0ZWRTY3JlZW5zaGFyZVJlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKX0pfX1uZXcgTnIoKS5zZXRNYXhMaXN0ZW5lcnMoMzApO2Z1bmN0aW9uIE1uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBWcih0LHIpe3JldHVybiB0PT09cnx8dCE9PXQmJnIhPT1yfWZ1bmN0aW9uIGd0KHQscil7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLTspaWYoVnIodFtlXVswXSxyKSlyZXR1cm4gZTtyZXR1cm4tMX12YXIgQW49QXJyYXkucHJvdG90eXBlLGtuPUFuLnNwbGljZTtmdW5jdGlvbiBPbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtpZihlPDApcmV0dXJuITE7dmFyIHM9ci5sZW5ndGgtMTtyZXR1cm4gZT09cz9yLnBvcCgpOmtuLmNhbGwocixlLDEpLC0tdGhpcy5zaXplLCEwfWZ1bmN0aW9uIExuKHQpe3ZhciByPXRoaXMuX19kYXRhX18sZT1ndChyLHQpO3JldHVybiBlPDA/dm9pZCAwOnJbZV1bMV19ZnVuY3Rpb24gRG4odCl7cmV0dXJuIGd0KHRoaXMuX19kYXRhX18sdCk+LTF9ZnVuY3Rpb24gTm4odCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fLHM9Z3QoZSx0KTtyZXR1cm4gczwwPygrK3RoaXMuc2l6ZSxlLnB1c2goW3Qscl0pKTplW3NdWzFdPXIsdGhpc31mdW5jdGlvbiBzZSh0KXt2YXIgcj0tMSxlPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrcjxlOyl7dmFyIHM9dFtyXTt0aGlzLnNldChzWzBdLHNbMV0pfX1zZS5wcm90b3R5cGUuY2xlYXI9TW4sc2UucHJvdG90eXBlLmRlbGV0ZT1PbixzZS5wcm90b3R5cGUuZ2V0PUxuLHNlLnByb3RvdHlwZS5oYXM9RG4sc2UucHJvdG90eXBlLnNldD1ObjtmdW5jdGlvbiBWbigpe3RoaXMuX19kYXRhX189bmV3IHNlLHRoaXMuc2l6ZT0wfWZ1bmN0aW9uIEZuKHQpe3ZhciByPXRoaXMuX19kYXRhX18sZT1yLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPXIuc2l6ZSxlfWZ1bmN0aW9uIEJuKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9dmFyIGpuPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxGcj1qbixVbj10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLCRuPUZyfHxVbnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxYPSRuLEhuPVguU3ltYm9sLEVlPUhuLEJyPU9iamVjdC5wcm90b3R5cGUsS249QnIuaGFzT3duUHJvcGVydHksV249QnIudG9TdHJpbmcsd2U9RWU/RWUudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHpuKHQpe3ZhciByPUtuLmNhbGwodCx3ZSksZT10W3dlXTt0cnl7dFt3ZV09dm9pZCAwO3ZhciBzPSEwfWNhdGNoKGkpe312YXIgbj1Xbi5jYWxsKHQpO3JldHVybiBzJiYocj90W3dlXT1lOmRlbGV0ZSB0W3dlXSksbn12YXIgR249T2JqZWN0LnByb3RvdHlwZSxxbj1Hbi50b1N0cmluZztmdW5jdGlvbiBZbih0KXtyZXR1cm4gcW4uY2FsbCh0KX12YXIgUW49IltvYmplY3QgTnVsbF0iLEpuPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHhyPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBNZSh0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP0puOlFuOnhyJiZ4ciBpbiBPYmplY3QodCk/em4odCk6WW4odCl9ZnVuY3Rpb24gQWUodCl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihyPT0ib2JqZWN0Inx8cj09ImZ1bmN0aW9uIil9dmFyIFhuPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixabj0iW29iamVjdCBGdW5jdGlvbl0iLGVpPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsdGk9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBqcih0KXtpZighQWUodCkpcmV0dXJuITE7dmFyIHI9TWUodCk7cmV0dXJuIHI9PVpufHxyPT1laXx8cj09WG58fHI9PXRpfXZhciByaT1YWyJfX2NvcmUtanNfc2hhcmVkX18iXSxrdD1yaSxVcj1mdW5jdGlvbigpe3ZhciB0PS9bXi5dKyQvLmV4ZWMoa3QmJmt0LmtleXMmJmt0LmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdD8iU3ltYm9sKHNyYylfMS4iK3Q6IiJ9KCk7ZnVuY3Rpb24gc2kodCl7cmV0dXJuISFVciYmVXIgaW4gdH12YXIgbmk9RnVuY3Rpb24ucHJvdG90eXBlLGlpPW5pLnRvU3RyaW5nO2Z1bmN0aW9uIGxlKHQpe2lmKHQhPW51bGwpe3RyeXtyZXR1cm4gaWkuY2FsbCh0KX1jYXRjaChyKXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHIpe319cmV0dXJuIiJ9dmFyIGFpPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxvaT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxjaT1GdW5jdGlvbi5wcm90b3R5cGUsZGk9T2JqZWN0LnByb3RvdHlwZSxsaT1jaS50b1N0cmluZyx1aT1kaS5oYXNPd25Qcm9wZXJ0eSxwaT1SZWdFeHAoIl4iK2xpLmNhbGwodWkpLnJlcGxhY2UoYWksIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gaGkodCl7aWYoIUFlKHQpfHxzaSh0KSlyZXR1cm4hMTt2YXIgcj1qcih0KT9waTpvaTtyZXR1cm4gci50ZXN0KGxlKHQpKX1mdW5jdGlvbiBmaSh0LHIpe3JldHVybiB0PT1udWxsP3ZvaWQgMDp0W3JdfWZ1bmN0aW9uIHVlKHQscil7dmFyIGU9ZmkodCxyKTtyZXR1cm4gaGkoZSk/ZTp2b2lkIDB9dmFyIG1pPXVlKFgsIk1hcCIpLGtlPW1pLGdpPXVlKE9iamVjdCwiY3JlYXRlIiksT2U9Z2k7ZnVuY3Rpb24gU2koKXt0aGlzLl9fZGF0YV9fPU9lP09lKG51bGwpOnt9LHRoaXMuc2l6ZT0wfWZ1bmN0aW9uIHZpKHQpe3ZhciByPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfXZhciB5aT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsYmk9T2JqZWN0LnByb3RvdHlwZSxFaT1iaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBfaSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKE9lKXt2YXIgZT1yW3RdO3JldHVybiBlPT09eWk/dm9pZCAwOmV9cmV0dXJuIEVpLmNhbGwocix0KT9yW3RdOnZvaWQgMH12YXIgVGk9T2JqZWN0LnByb3RvdHlwZSxSaT1UaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBQaSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiBPZT9yW3RdIT09dm9pZCAwOlJpLmNhbGwocix0KX12YXIgQ2k9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO2Z1bmN0aW9uIElpKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsZVt0XT1PZSYmcj09PXZvaWQgMD9DaTpyLHRoaXN9ZnVuY3Rpb24gcGUodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBzPXRbcl07dGhpcy5zZXQoc1swXSxzWzFdKX19cGUucHJvdG90eXBlLmNsZWFyPVNpLHBlLnByb3RvdHlwZS5kZWxldGU9dmkscGUucHJvdG90eXBlLmdldD1faSxwZS5wcm90b3R5cGUuaGFzPVBpLHBlLnByb3RvdHlwZS5zZXQ9SWk7ZnVuY3Rpb24gd2koKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBwZSxtYXA6bmV3KGtlfHxzZSksc3RyaW5nOm5ldyBwZX19ZnVuY3Rpb24gTWkodCl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuIHI9PSJzdHJpbmcifHxyPT0ibnVtYmVyInx8cj09InN5bWJvbCJ8fHI9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gU3QodCxyKXt2YXIgZT10Ll9fZGF0YV9fO3JldHVybiBNaShyKT9lW3R5cGVvZiByPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOmUubWFwfWZ1bmN0aW9uIEFpKHQpe3ZhciByPVN0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPXI/MTowLHJ9ZnVuY3Rpb24ga2kodCl7cmV0dXJuIFN0KHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIE9pKHQpe3JldHVybiBTdCh0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiBMaSh0LHIpe3ZhciBlPVN0KHRoaXMsdCkscz1lLnNpemU7cmV0dXJuIGUuc2V0KHQsciksdGhpcy5zaXplKz1lLnNpemU9PXM/MDoxLHRoaXN9ZnVuY3Rpb24gX2UodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBzPXRbcl07dGhpcy5zZXQoc1swXSxzWzFdKX19X2UucHJvdG90eXBlLmNsZWFyPXdpLF9lLnByb3RvdHlwZS5kZWxldGU9QWksX2UucHJvdG90eXBlLmdldD1raSxfZS5wcm90b3R5cGUuaGFzPU9pLF9lLnByb3RvdHlwZS5zZXQ9TGk7dmFyIERpPTIwMDtmdW5jdGlvbiBOaSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoZSBpbnN0YW5jZW9mIHNlKXt2YXIgcz1lLl9fZGF0YV9fO2lmKCFrZXx8cy5sZW5ndGg8RGktMSlyZXR1cm4gcy5wdXNoKFt0LHJdKSx0aGlzLnNpemU9KytlLnNpemUsdGhpcztlPXRoaXMuX19kYXRhX189bmV3IF9lKHMpfXJldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZT1lLnNpemUsdGhpc31mdW5jdGlvbiBUZSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fPW5ldyBzZSh0KTt0aGlzLnNpemU9ci5zaXplfVRlLnByb3RvdHlwZS5jbGVhcj1WbixUZS5wcm90b3R5cGUuZGVsZXRlPUZuLFRlLnByb3RvdHlwZS5nZXQ9Qm4sVGUucHJvdG90eXBlLmhhcz14bixUZS5wcm90b3R5cGUuc2V0PU5pO2Z1bmN0aW9uIFZpKHQscil7Zm9yKHZhciBlPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrZTxzJiZyKHRbZV0sZSx0KSE9PSExOyk7cmV0dXJuIHR9dmFyIEZpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXVlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaChyKXt9fSgpLCRyPUZpO2Z1bmN0aW9uIEhyKHQscixlKXtyPT0iX19wcm90b19fIiYmJHI/JHIodCxyLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplLHdyaXRhYmxlOiEwfSk6dFtyXT1lfXZhciBCaT1PYmplY3QucHJvdG90eXBlLHhpPUJpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEtyKHQscixlKXt2YXIgcz10W3JdOyghKHhpLmNhbGwodCxyKSYmVnIocyxlKSl8fGU9PT12b2lkIDAmJiEociBpbiB0KSkmJkhyKHQscixlKX1mdW5jdGlvbiB2dCh0LHIsZSxzKXt2YXIgbj0hZTtlfHwoZT17fSk7Zm9yKHZhciBpPS0xLGE9ci5sZW5ndGg7KytpPGE7KXt2YXIgZD1yW2ldLG89cz9zKGVbZF0sdFtkXSxkLGUsdCk6dm9pZCAwO289PT12b2lkIDAmJihvPXRbZF0pLG4/SHIoZSxkLG8pOktyKGUsZCxvKX1yZXR1cm4gZX1mdW5jdGlvbiBqaSh0LHIpe2Zvcih2YXIgZT0tMSxzPUFycmF5KHQpOysrZTx0OylzW2VdPXIoZSk7cmV0dXJuIHN9ZnVuY3Rpb24gTGUodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In12YXIgVWk9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gV3IodCl7cmV0dXJuIExlKHQpJiZNZSh0KT09VWl9dmFyIHpyPU9iamVjdC5wcm90b3R5cGUsJGk9enIuaGFzT3duUHJvcGVydHksSGk9enIucHJvcGVydHlJc0VudW1lcmFibGUsS2k9V3IoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9XcjpmdW5jdGlvbih0KXtyZXR1cm4gTGUodCkmJiRpLmNhbGwodCwiY2FsbGVlIikmJiFIaS5jYWxsKHQsImNhbGxlZSIpfSxHcj1LaSxXaT1BcnJheS5pc0FycmF5LHl0PVdpO2Z1bmN0aW9uIHppKCl7cmV0dXJuITF9dmFyIHFyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsWXI9cXImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxHaT1ZciYmWXIuZXhwb3J0cz09PXFyLFFyPUdpP1guQnVmZmVyOnZvaWQgMCxxaT1Rcj9Rci5pc0J1ZmZlcjp2b2lkIDAsWWk9cWl8fHppLE90PVlpLFFpPTkwMDcxOTkyNTQ3NDA5OTEsSmk9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIFhpKHQscil7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHI9cj09bnVsbD9RaTpyLCEhciYmKGU9PSJudW1iZXIifHxlIT0ic3ltYm9sIiYmSmkudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxyfXZhciBaaT05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIEpyKHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQ+LTEmJnQlMT09MCYmdDw9Wml9dmFyIGVhPSJbb2JqZWN0IEFyZ3VtZW50c10iLHRhPSJbb2JqZWN0IEFycmF5XSIscmE9IltvYmplY3QgQm9vbGVhbl0iLHNhPSJbb2JqZWN0IERhdGVdIixuYT0iW29iamVjdCBFcnJvcl0iLGlhPSJbb2JqZWN0IEZ1bmN0aW9uXSIsYWE9IltvYmplY3QgTWFwXSIsb2E9IltvYmplY3QgTnVtYmVyXSIsY2E9IltvYmplY3QgT2JqZWN0XSIsZGE9IltvYmplY3QgUmVnRXhwXSIsbGE9IltvYmplY3QgU2V0XSIsdWE9IltvYmplY3QgU3RyaW5nXSIscGE9IltvYmplY3QgV2Vha01hcF0iLGhhPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsZmE9IltvYmplY3QgRGF0YVZpZXddIixtYT0iW29iamVjdCBGbG9hdDMyQXJyYXldIixnYT0iW29iamVjdCBGbG9hdDY0QXJyYXldIixTYT0iW29iamVjdCBJbnQ4QXJyYXldIix2YT0iW29iamVjdCBJbnQxNkFycmF5XSIseWE9IltvYmplY3QgSW50MzJBcnJheV0iLGJhPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixFYT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLF9hPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsVGE9IltvYmplY3QgVWludDMyQXJyYXldIixCPXt9O0JbbWFdPUJbZ2FdPUJbU2FdPUJbdmFdPUJbeWFdPUJbYmFdPUJbRWFdPUJbX2FdPUJbVGFdPSEwLEJbZWFdPUJbdGFdPUJbaGFdPUJbcmFdPUJbZmFdPUJbc2FdPUJbbmFdPUJbaWFdPUJbYWFdPUJbb2FdPUJbY2FdPUJbZGFdPUJbbGFdPUJbdWFdPUJbcGFdPSExO2Z1bmN0aW9uIFJhKHQpe3JldHVybiBMZSh0KSYmSnIodC5sZW5ndGgpJiYhIUJbTWUodCldfWZ1bmN0aW9uIEx0KHQpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChyKX19dmFyIFhyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsRGU9WHImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxQYT1EZSYmRGUuZXhwb3J0cz09PVhyLER0PVBhJiZGci5wcm9jZXNzLENhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PURlJiZEZS5yZXF1aXJlJiZEZS5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fER0JiZEdC5iaW5kaW5nJiZEdC5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2gocil7fX0oKSxSZT1DYSxacj1SZSYmUmUuaXNUeXBlZEFycmF5LElhPVpyP0x0KFpyKTpSYSxlcz1JYSx3YT1PYmplY3QucHJvdG90eXBlLE1hPXdhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHRzKHQscil7dmFyIGU9eXQodCkscz0hZSYmR3IodCksbj0hZSYmIXMmJk90KHQpLGk9IWUmJiFzJiYhbiYmZXModCksYT1lfHxzfHxufHxpLGQ9YT9qaSh0Lmxlbmd0aCxTdHJpbmcpOltdLG89ZC5sZW5ndGg7Zm9yKHZhciBsIGluIHQpKHJ8fE1hLmNhbGwodCxsKSkmJiEoYSYmKGw9PSJsZW5ndGgifHxuJiYobD09Im9mZnNldCJ8fGw9PSJwYXJlbnQiKXx8aSYmKGw9PSJidWZmZXIifHxsPT0iYnl0ZUxlbmd0aCJ8fGw9PSJieXRlT2Zmc2V0Iil8fFhpKGwsbykpKSYmZC5wdXNoKGwpO3JldHVybiBkfXZhciBBYT1PYmplY3QucHJvdG90eXBlO2Z1bmN0aW9uIGJ0KHQpe3ZhciByPXQmJnQuY29uc3RydWN0b3IsZT10eXBlb2Ygcj09ImZ1bmN0aW9uIiYmci5wcm90b3R5cGV8fEFhO3JldHVybiB0PT09ZX1mdW5jdGlvbiBycyh0LHIpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChyKGUpKX19dmFyIGthPXJzKE9iamVjdC5rZXlzLE9iamVjdCksT2E9a2EsTGE9T2JqZWN0LnByb3RvdHlwZSxEYT1MYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBzcyh0KXtpZighYnQodCkpcmV0dXJuIE9hKHQpO3ZhciByPVtdO2Zvcih2YXIgZSBpbiBPYmplY3QodCkpRGEuY2FsbCh0LGUpJiZlIT0iY29uc3RydWN0b3IiJiZyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTnQodCl7cmV0dXJuIHQhPW51bGwmJkpyKHQubGVuZ3RoKSYmIWpyKHQpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBOdCh0KT90cyh0KTpzcyh0KX1mdW5jdGlvbiBOYSh0LHIpe3JldHVybiB0JiZ2dChyLFZ0KHIpLHQpfWZ1bmN0aW9uIFZhKHQpe3ZhciByPVtdO2lmKHQhPW51bGwpZm9yKHZhciBlIGluIE9iamVjdCh0KSlyLnB1c2goZSk7cmV0dXJuIHJ9dmFyIEZhPU9iamVjdC5wcm90b3R5cGUsQmE9RmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24geGEodCl7aWYoIUFlKHQpKXJldHVybiBWYSh0KTt2YXIgcj1idCh0KSxlPVtdO2Zvcih2YXIgcyBpbiB0KXM9PSJjb25zdHJ1Y3RvciImJihyfHwhQmEuY2FsbCh0LHMpKXx8ZS5wdXNoKHMpO3JldHVybiBlfWZ1bmN0aW9uIEZ0KHQpe3JldHVybiBOdCh0KT90cyh0LCEwKTp4YSh0KX1mdW5jdGlvbiBqYSh0LHIpe3JldHVybiB0JiZ2dChyLEZ0KHIpLHQpfXZhciBucz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGlzPW5zJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsVWE9aXMmJmlzLmV4cG9ydHM9PT1ucyxhcz1VYT9YLkJ1ZmZlcjp2b2lkIDAsb3M9YXM/YXMuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uICRhKHQscil7aWYocilyZXR1cm4gdC5zbGljZSgpO3ZhciBlPXQubGVuZ3RoLHM9b3M/b3MoZSk6bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIHQuY29weShzKSxzfWZ1bmN0aW9uIEhhKHQscil7dmFyIGU9LTEscz10Lmxlbmd0aDtmb3Iocnx8KHI9QXJyYXkocykpOysrZTxzOylyW2VdPXRbZV07cmV0dXJuIHJ9ZnVuY3Rpb24gS2EodCxyKXtmb3IodmFyIGU9LTEscz10PT1udWxsPzA6dC5sZW5ndGgsbj0wLGk9W107KytlPHM7KXt2YXIgYT10W2VdO3IoYSxlLHQpJiYoaVtuKytdPWEpfXJldHVybiBpfWZ1bmN0aW9uIGNzKCl7cmV0dXJuW119dmFyIFdhPU9iamVjdC5wcm90b3R5cGUsemE9V2EucHJvcGVydHlJc0VudW1lcmFibGUsZHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxHYT1kcz9mdW5jdGlvbih0KXtyZXR1cm4gdD09bnVsbD9bXToodD1PYmplY3QodCksS2EoZHModCksZnVuY3Rpb24ocil7cmV0dXJuIHphLmNhbGwodCxyKX0pKX06Y3MsQnQ9R2E7ZnVuY3Rpb24gcWEodCxyKXtyZXR1cm4gdnQodCxCdCh0KSxyKX1mdW5jdGlvbiBscyh0LHIpe2Zvcih2YXIgZT0tMSxzPXIubGVuZ3RoLG49dC5sZW5ndGg7KytlPHM7KXRbbitlXT1yW2VdO3JldHVybiB0fXZhciBZYT1ycyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KSx1cz1ZYSxRYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLEphPVFhP2Z1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXTt0OylscyhyLEJ0KHQpKSx0PXVzKHQpO3JldHVybiByfTpjcyxwcz1KYTtmdW5jdGlvbiBYYSh0LHIpe3JldHVybiB2dCh0LHBzKHQpLHIpfWZ1bmN0aW9uIGhzKHQscixlKXt2YXIgcz1yKHQpO3JldHVybiB5dCh0KT9zOmxzKHMsZSh0KSl9ZnVuY3Rpb24gWmEodCl7cmV0dXJuIGhzKHQsVnQsQnQpfWZ1bmN0aW9uIGVvKHQpe3JldHVybiBocyh0LEZ0LHBzKX12YXIgdG89dWUoWCwiRGF0YVZpZXciKSx4dD10byxybz11ZShYLCJQcm9taXNlIiksanQ9cm8sc289dWUoWCwiU2V0IiksVXQ9c28sbm89dWUoWCwiV2Vha01hcCIpLCR0PW5vLGZzPSJbb2JqZWN0IE1hcF0iLGlvPSJbb2JqZWN0IE9iamVjdF0iLG1zPSJbb2JqZWN0IFByb21pc2VdIixncz0iW29iamVjdCBTZXRdIixTcz0iW29iamVjdCBXZWFrTWFwXSIsdnM9IltvYmplY3QgRGF0YVZpZXddIixhbz1sZSh4dCksb289bGUoa2UpLGNvPWxlKGp0KSxsbz1sZShVdCksdW89bGUoJHQpLGhlPU1lOyh4dCYmaGUobmV3IHh0KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT12c3x8a2UmJmhlKG5ldyBrZSkhPWZzfHxqdCYmaGUoanQucmVzb2x2ZSgpKSE9bXN8fFV0JiZoZShuZXcgVXQpIT1nc3x8JHQmJmhlKG5ldyAkdCkhPVNzKSYmKGhlPWZ1bmN0aW9uKHQpe3ZhciByPU1lKHQpLGU9cj09aW8/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAscz1lP2xlKGUpOiIiO2lmKHMpc3dpdGNoKHMpe2Nhc2UgYW86cmV0dXJuIHZzO2Nhc2Ugb286cmV0dXJuIGZzO2Nhc2UgY286cmV0dXJuIG1zO2Nhc2UgbG86cmV0dXJuIGdzO2Nhc2UgdW86cmV0dXJuIFNzfXJldHVybiByfSk7dmFyIEV0PWhlLHBvPU9iamVjdC5wcm90b3R5cGUsaG89cG8uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZm8odCl7dmFyIHI9dC5sZW5ndGgsZT1uZXcgdC5jb25zdHJ1Y3RvcihyKTtyZXR1cm4gciYmdHlwZW9mIHRbMF09PSJzdHJpbmciJiZoby5jYWxsKHQsImluZGV4IikmJihlLmluZGV4PXQuaW5kZXgsZS5pbnB1dD10LmlucHV0KSxlfXZhciBtbz1YLlVpbnQ4QXJyYXkseXM9bW87ZnVuY3Rpb24gSHQodCl7dmFyIHI9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IHlzKHIpLnNldChuZXcgeXModCkpLHJ9ZnVuY3Rpb24gZ28odCxyKXt2YXIgZT1yP0h0KHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3IoZSx0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX12YXIgU289L1x3KiQvO2Z1bmN0aW9uIHZvKHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLFNvLmV4ZWModCkpO3JldHVybiByLmxhc3RJbmRleD10Lmxhc3RJbmRleCxyfXZhciBicz1FZT9FZS5wcm90b3R5cGU6dm9pZCAwLEVzPWJzP2JzLnZhbHVlT2Y6dm9pZCAwO2Z1bmN0aW9uIHlvKHQpe3JldHVybiBFcz9PYmplY3QoRXMuY2FsbCh0KSk6e319ZnVuY3Rpb24gYm8odCxyKXt2YXIgZT1yP0h0KHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3IoZSx0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfXZhciBFbz0iW29iamVjdCBCb29sZWFuXSIsX289IltvYmplY3QgRGF0ZV0iLFRvPSJbb2JqZWN0IE1hcF0iLFJvPSJbb2JqZWN0IE51bWJlcl0iLFBvPSJbb2JqZWN0IFJlZ0V4cF0iLENvPSJbb2JqZWN0IFNldF0iLElvPSJbb2JqZWN0IFN0cmluZ10iLHdvPSJbb2JqZWN0IFN5bWJvbF0iLE1vPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsQW89IltvYmplY3QgRGF0YVZpZXddIixrbz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixPbz0iW29iamVjdCBGbG9hdDY0QXJyYXldIixMbz0iW29iamVjdCBJbnQ4QXJyYXldIixEbz0iW29iamVjdCBJbnQxNkFycmF5XSIsTm89IltvYmplY3QgSW50MzJBcnJheV0iLFZvPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixGbz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLEJvPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIseG89IltvYmplY3QgVWludDMyQXJyYXldIjtmdW5jdGlvbiBqbyh0LHIsZSl7dmFyIHM9dC5jb25zdHJ1Y3Rvcjtzd2l0Y2gocil7Y2FzZSBNbzpyZXR1cm4gSHQodCk7Y2FzZSBFbzpjYXNlIF9vOnJldHVybiBuZXcgcygrdCk7Y2FzZSBBbzpyZXR1cm4gZ28odCxlKTtjYXNlIGtvOmNhc2UgT286Y2FzZSBMbzpjYXNlIERvOmNhc2UgTm86Y2FzZSBWbzpjYXNlIEZvOmNhc2UgQm86Y2FzZSB4bzpyZXR1cm4gYm8odCxlKTtjYXNlIFRvOnJldHVybiBuZXcgcztjYXNlIFJvOmNhc2UgSW86cmV0dXJuIG5ldyBzKHQpO2Nhc2UgUG86cmV0dXJuIHZvKHQpO2Nhc2UgQ286cmV0dXJuIG5ldyBzO2Nhc2Ugd286cmV0dXJuIHlvKHQpfX12YXIgX3M9T2JqZWN0LmNyZWF0ZSxVbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKHIpe2lmKCFBZShyKSlyZXR1cm57fTtpZihfcylyZXR1cm4gX3Mocik7dC5wcm90b3R5cGU9cjt2YXIgZT1uZXcgdDtyZXR1cm4gdC5wcm90b3R5cGU9dm9pZCAwLGV9fSgpLCRvPVVvO2Z1bmN0aW9uIEhvKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIWJ0KHQpPyRvKHVzKHQpKTp7fX12YXIgS289IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gV28odCl7cmV0dXJuIExlKHQpJiZFdCh0KT09S299dmFyIFRzPVJlJiZSZS5pc01hcCx6bz1Ucz9MdChUcyk6V28sR289em8scW89IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gWW8odCl7cmV0dXJuIExlKHQpJiZFdCh0KT09cW99dmFyIFJzPVJlJiZSZS5pc1NldCxRbz1Scz9MdChScyk6WW8sSm89UW8sWG89MSxabz0yLGVjPTQsUHM9IltvYmplY3QgQXJndW1lbnRzXSIsdGM9IltvYmplY3QgQXJyYXldIixyYz0iW29iamVjdCBCb29sZWFuXSIsc2M9IltvYmplY3QgRGF0ZV0iLG5jPSJbb2JqZWN0IEVycm9yXSIsQ3M9IltvYmplY3QgRnVuY3Rpb25dIixpYz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLGFjPSJbb2JqZWN0IE1hcF0iLG9jPSJbb2JqZWN0IE51bWJlcl0iLElzPSJbb2JqZWN0IE9iamVjdF0iLGNjPSJbb2JqZWN0IFJlZ0V4cF0iLGRjPSJbb2JqZWN0IFNldF0iLGxjPSJbb2JqZWN0IFN0cmluZ10iLHVjPSJbb2JqZWN0IFN5bWJvbF0iLHBjPSJbb2JqZWN0IFdlYWtNYXBdIixoYz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGZjPSJbb2JqZWN0IERhdGFWaWV3XSIsbWM9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsZ2M9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsU2M9IltvYmplY3QgSW50OEFycmF5XSIsdmM9IltvYmplY3QgSW50MTZBcnJheV0iLHljPSJbb2JqZWN0IEludDMyQXJyYXldIixiYz0iW29iamVjdCBVaW50OEFycmF5XSIsRWM9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixfYz0iW29iamVjdCBVaW50MTZBcnJheV0iLFRjPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsVj17fTtWW1BzXT1WW3RjXT1WW2hjXT1WW2ZjXT1WW3JjXT1WW3NjXT1WW21jXT1WW2djXT1WW1NjXT1WW3ZjXT1WW3ljXT1WW2FjXT1WW29jXT1WW0lzXT1WW2NjXT1WW2RjXT1WW2xjXT1WW3VjXT1WW2JjXT1WW0VjXT1WW19jXT1WW1RjXT0hMCxWW25jXT1WW0NzXT1WW3BjXT0hMTtmdW5jdGlvbiBfdCh0LHIsZSxzLG4saSl7dmFyIGEsZD1yJlhvLG89ciZabyxsPXImZWM7aWYoZSYmKGE9bj9lKHQscyxuLGkpOmUodCkpLGEhPT12b2lkIDApcmV0dXJuIGE7aWYoIUFlKHQpKXJldHVybiB0O3ZhciBtPXl0KHQpO2lmKG0pe2lmKGE9Zm8odCksIWQpcmV0dXJuIEhhKHQsYSl9ZWxzZXt2YXIgdj1FdCh0KSxFPXY9PUNzfHx2PT1pYztpZihPdCh0KSlyZXR1cm4gJGEodCxkKTtpZih2PT1Jc3x8dj09UHN8fEUmJiFuKXtpZihhPW98fEU/e306SG8odCksIWQpcmV0dXJuIG8/WGEodCxqYShhLHQpKTpxYSh0LE5hKGEsdCkpfWVsc2V7aWYoIVZbdl0pcmV0dXJuIG4/dDp7fTthPWpvKHQsdixkKX19aXx8KGk9bmV3IFRlKTt2YXIgdz1pLmdldCh0KTtpZih3KXJldHVybiB3O2kuc2V0KHQsYSksSm8odCk/dC5mb3JFYWNoKGZ1bmN0aW9uKEYpe2EuYWRkKF90KEYscixlLEYsdCxpKSl9KTpHbyh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKEYsSCl7YS5zZXQoSCxfdChGLHIsZSxILHQsaSkpfSk7dmFyIHg9bD9vP2VvOlphOm8/RnQ6VnQsJD1tP3ZvaWQgMDp4KHQpO3JldHVybiBWaSgkfHx0LGZ1bmN0aW9uKEYsSCl7JCYmKEg9RixGPXRbSF0pLEtyKGEsSCxfdChGLHIsZSxILHQsaSkpfSksYX12YXIgUmM9MSxQYz00O2Z1bmN0aW9uIENjKHQpe3JldHVybiBfdCh0LFJjfFBjKX12YXIgd3M9ImhYZ1U4V2M4cHd1R05xOW1zNXE5SGgiO3R5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmKFhzPXByb2Nlc3M9PW51bGw/dm9pZCAwOnByb2Nlc3MuZW52KSE9bnVsbCYmWHMuRkxBR1NNSVRIX0VOVklST05NRU5UX0tFWSYmKHdzPXByb2Nlc3MuZW52LkZMQUdTTUlUSF9FTlZJUk9OTUVOVF9LRVkpO2Z1bmN0aW9uIEljKHQ9W10pe2NvbnN0IHI9e307cmV0dXJuIHQuZm9yRWFjaChlPT57cltlLmZlYXR1cmUubmFtZV09e2VuYWJsZWQ6ZS5lbmFibGVkLHZhbHVlOmUuZmVhdHVyZV9zdGF0ZV92YWx1ZX19KSxyfXZhciB3Yz1jbGFzc3tjb25zdHJ1Y3Rvcih0PXdzKXtwKHRoaXMsImZsYWdzIix7fSk7cCh0aGlzLCJlbnZpcm9ubWVudEtleSIsbnVsbCk7dGhpcy5lbnZpcm9ubWVudEtleT10fWlkZW50aWZ5QW5kRmV0Y2hGbGFnc1dpdGhSZXRyeShkKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3ByaW1hcnlFbmRwb2ludDp0LHNlY29uZGFyeUVuZHBvaW50OnIsZm9yY2VFdmFsdWF0ZTplLHRpbWVvdXQ6cyx1bmlxdWVJZGVudGlmaWVyOm4sdHJhaXRzT2JqOmksbG9nZ2VyOmF9KXtjb25zdCBvPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaSkpLGw9T2JqZWN0LmVudHJpZXMobykubWFwKHY9Pih7dHJhaXRfa2V5OnZbMF0sdHJhaXRfdmFsdWU6dlsxXX0pKSxtPVt0LHIscl07Zm9yKGNvbnN0IHYgb2YgbSl0cnl7Y29uc3QgRT1uZXcgQWJvcnRDb250cm9sbGVyLHc9c2V0VGltZW91dCgoKT0+RS5hYm9ydCgpLHMpLHg9YF8keyhNYXRoLnJhbmRvbSgpKzEpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMil9YCwkPXlpZWxkIGZldGNoKGBodHRwczovLyR7dn0vYXBpL3YxL2lkZW50aXRpZXMvYCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtRW52aXJvbm1lbnQtS2V5Ijp0aGlzLmVudmlyb25tZW50S2V5fSxib2R5OkpTT04uc3RyaW5naWZ5KHtpZGVudGlmaWVyOm4rKGU/eDoiIiksdHJhaXRzOmx9KSxzaWduYWw6RS5zaWduYWx9KTtpZihjbGVhclRpbWVvdXQodyksISQub2spdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAkeyQuc3RhdHVzfWApO2NvbnN0IEY9eWllbGQgJC5qc29uKCk7cmV0dXJuIEljKEYuZmxhZ3N8fFtdKX1jYXRjaChFKXthLmVycm9yKCJGbGFnc21pdGggaWRlbnRpZnkgZmFpbGVkISEiLHtlcnJvcjpFLHVybDp2fSl9cmV0dXJue319KX1pZGVudGlmeShhKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXt9LGU9ITEscz01ZTMsbj0iZWRnZS5hcGkuZmxhZ3NtaXRoLmNvbSIsaT1jb25zb2xlKXtyZXR1cm4gdGhpcy5mbGFncz15aWVsZCB0aGlzLmlkZW50aWZ5QW5kRmV0Y2hGbGFnc1dpdGhSZXRyeSh7dHJhaXRzT2JqOnIsdW5pcXVlSWRlbnRpZmllcjp0LGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0OnMscHJpbWFyeUVuZHBvaW50Om4sc2Vjb25kYXJ5RW5kcG9pbnQ6ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGxvZ2dlcjppfSksdGhpcy5mbGFnc30pfWdldFZhbHVlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLnZhbHVlfWhhc0ZlYXR1cmUodCl7cmV0dXJuIHRoaXMuZmxhZ3MmJnRoaXMuZmxhZ3NbdF0mJnRoaXMuZmxhZ3NbdF0uZW5hYmxlZH1nZXRBbGxGbGFncygpe3JldHVybiB0aGlzLmZsYWdzfX07ZnVuY3Rpb24gTWModCl7cmV0dXJuIG5ldyB3Yyh0KX12YXIgTXM9Wy0yLC0xLDAsMSwyXSxBYz1bMCwxLDIsMyw0XTtmdW5jdGlvbiBrYyh0KXt0PXQudHJpbSgpO2xldCByPSIwIixlPSIwIixzPSIwIjtyZXR1cm4gdC5sZW5ndGg9PTQ/KHI9YDB4JHt0WzFdfSR7dFsxXX1gLGU9YDB4JHt0WzJdfSR7dFsyXX1gLHM9YDB4JHt0WzNdfSR7dFszXX1gKTp0Lmxlbmd0aD42JiYocj1gMHgke3RbMV19JHt0WzJdfWAsZT1gMHgke3RbM119JHt0WzRdfWAscz1gMHgke3RbNV19JHt0WzZdfWApLFsrciwrZSwrc119dmFyIE9jPSh0LHIsZSk9PntsZXQgcyxuLGk7aWYocj09MClzPW49aT1lO2Vsc2V7Y29uc3QgYT0obCxtLHYpPT4odjwwJiYodis9MSksdj4xJiYodi09MSksdjwuMTY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSo2KnY6djwuNT9tOnY8LjY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSooLjY2NjY2NjY2NjY2NjY2NjYtdikqNjpsKSxkPWU8LjU/ZSooMStyKTplK3ItZSpyLG89MiplLWQ7cz1hKG8sZCx0KzEvMyksbj1hKG8sZCx0KSxpPWEobyxkLHQtMS8zKX1yZXR1cm5bTWF0aC5yb3VuZChzKjI1NSksTWF0aC5yb3VuZChuKjI1NSksTWF0aC5yb3VuZChpKjI1NSldfSxMYz0odCxyLGUpPT57dC89MjU1LHIvPTI1NSxlLz0yNTU7Y29uc3Qgcz1NYXRoLm1heCh0LHIsZSksbj1NYXRoLm1pbih0LHIsZSk7bGV0IGksYTtjb25zdCBkPShzK24pLzI7aWYocz09bilpPWE9MDtlbHNle2NvbnN0IG89cy1uO3N3aXRjaChhPWQ+LjU/by8oMi1zLW4pOm8vKHMrbikscyl7Y2FzZSB0Omk9KHItZSkvbysocjxlPzY6MCk7YnJlYWs7Y2FzZSByOmk9KGUtdCkvbysyO2JyZWFrO2Nhc2UgZTppPSh0LXIpL28rNDticmVha31pLz02fXJldHVybltpLGEsZF19LERjPSh0LHIsZSk9Pntjb25zdCBzPW49Pm4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gIyR7cyh0KX0ke3Mocil9JHtzKGUpfWB9LEFzPSh0LHI9TXMsZT0uNCk9Pntjb25zdCBzPVtdLFtuLGksYV09a2ModCksW2QsbyxsXT1MYyhuLGksYSksbT1NYXRoLnJvdW5kKGwqMTAwKTttPjcwP2U9Ljg6bT42MD9lPS45Om08MTA/ZT0uMDc1Om08NDImJihlPS4zKTtjb25zdCB2PXIuZmluZEluZGV4KEY9PkY9PT0wKTtpZih2PT09LTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJlZHVjZXIgcHJvdmlkZWQsIGl0IG11c3QgY29udGFpbiBhdGxlYXN0IG9uZSB6ZXJvIik7Y29uc3QgRT01LXYsdz12KzEseD0oMTAwLW0pL0UsJD1tL3c7Zm9yKGNvbnN0IEYgb2Ygcil7bGV0IEg7RjwwP0g9bStGKiQqZTpGPjA/SD1tK0YqeCplOkg9bTtjb25zdFtaLHZlLHllXT1PYyhkLG8sSC8xMDApO3MucHVzaChEYyhaLHZlLHllKSl9cmV0dXJuIHN9LGtzPXtkYXJrOntiYWNrZ3JvdW5kOnsxZTM6IiMyNTI1MjUiLDkwMDoiIzJGMkYyRiIsODAwOiIjMzIzMjMyIiw3MDA6IiMzRTNFM0UiLDYwMDoiIzRBNEE0QSJ9LHRleHQ6IiNGNUY1RjUiLCJ2aWRlby1iZyI6IiMxQzFDMUMifSxsaWdodDp7YmFja2dyb3VuZDp7MWUzOiIjRkZGRkZGIiw5MDA6IiNGNUY1RjUiLDgwMDoiI0VCRUJFQiIsNzAwOiIjRTBFMEUwIiw2MDA6IiNENkQ2RDYifSx0ZXh0OiIjMTExMTExIiwidGV4dC1vbi1icmFuZCI6IiNmZmZmZmYiLCJ2aWRlby1iZyI6IiNEQURBREEifX0sTmM9dD0+e2NvbnN0W3IsZSxzLG4saV09QXModCxNcyk7cmV0dXJuezMwMDpyLDQwMDplLDUwMDpzLDYwMDpuLDcwMDppfX0sVmM9dD0+e2lmKHQ9PT0iI0ZGRkZGRiIpcmV0dXJuIGtzLmxpZ2h0LmJhY2tncm91bmQ7aWYodD09PSIjMDAwMDAwIilyZXR1cm4ga3MuZGFyay5iYWNrZ3JvdW5kO2NvbnN0W3IsZSxzLG4saV09QXModCxBYyk7cmV0dXJuezFlMzpyLDkwMDplLDgwMDpzLDcwMDpuLDYwMDppfX0sRmM9e2JvcmRlcl9yYWRpdXM6InJvdW5kZWQiLGJvcmRlcl93aWR0aDoidGhpbiIsc3BhY2luZ19iYXNlOjQsdGhlbWU6ImRhcmsiLGNvbG9yczp7YnJhbmQ6TmMoIiMyMTYwRkQiKSxiYWNrZ3JvdW5kOlZjKCIjMTQxNDE0IiksZGFuZ2VyOiIjRkYyRDJEIix0ZXh0OiIjRUVFRUVFIix0ZXh0X29uX2JyYW5kOiIjRUVFRUVFIixzdWNjZXNzOiIjNjJBNTA0Iix2aWRlb19iZzoiIzE5MTkxOSIsd2FybmluZzoiI0ZGQ0QwNyJ9fTtmdW5jdGlvbiBPcygpe3JldHVybiBDYyhGYyl9T3MoKSxPcygpO2NsYXNzIEJje2NvbnN0cnVjdG9yKCl7SXQodGhpcyxGZSx2b2lkIDApfWdldCB0ZWxlbWV0cnkoKXt2YXIgcjtyZXR1cm4ocj1lZSh0aGlzLEZlKSk9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQocil7Q2UodGhpcyxGZSxyKX1pbmZvKHIsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlLHMpfWVycm9yKHIsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHIsZSxzKX1kZWJ1ZyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIixyLGUscyl9bG9nKHIsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIixyLGUscyl9d2FybihyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHIsZSxzKX19RmU9bmV3IFdlYWtNYXA7Y29uc3QgdHI9Y2xhc3MgZXh0ZW5kcyBxLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO0l0KHRoaXMsbmUsdm9pZCAwKTtJdCh0aGlzLGllLHZvaWQgMCk7cCh0aGlzLCJhc3luY1Byb21pc2VUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLENlKHRoaXMsbmUsbmV3IE1hcCksQ2UodGhpcyxpZSxuZXcgTWFwKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQ9OGUzfWVtaXRBc3luYyhlLC4uLnMpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtlZSh0aGlzLG5lKS5zZXQoZSxbXSk7Y29uc3Qgbj1lZSh0aGlzLGllKS5nZXQoZSkubWFwKCgpPT5uZXcgUHJvbWlzZShpPT57ZWUodGhpcyxuZSkuZ2V0KGUpLnB1c2goaSl9KSk7dG4odHIucHJvdG90eXBlLHRoaXMsImVtaXQiKS5jYWxsKHRoaXMsZSwuLi5zKSx5aWVsZCBQcm9taXNlLnJhY2UoW1Byb21pc2UuYWxsKG4pLG5ldyBQcm9taXNlKChpLGEpPT5zZXRUaW1lb3V0KCgpPT5hKG5ldyBFcnJvcihgZW1pdEFzeW5jIGZhaWxlZCB0byByZXNvbHZlIGZvciBldmVudCAke2V9LmApKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQpKV0pLGVlKHRoaXMsbmUpLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxzKXtjb25zdCBuPWVlKHRoaXMsbmUpLGk9KC4uLmEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgbzt0cnl7eWllbGQgcyguLi5hKX1jYXRjaChsKXt0aGlzLmxvZ2dlci5lcnJvcigiW29uQXN5bmNdIix7ZXJyb3I6bH0pfWNvbnN0IGQ9KG89bi5nZXQoZSkpPT1udWxsP3ZvaWQgMDpvLnNoaWZ0KCk7ZD09bnVsbHx8ZCgpfSk7cmV0dXJuIGVlKHRoaXMsaWUpLmdldChlKXx8ZWUodGhpcyxpZSkuc2V0KGUsW10pLGVlKHRoaXMsaWUpLmdldChlKS5wdXNoKGkpLHN1cGVyLm9uKGUsaSl9cmVzZXQoKXtDZSh0aGlzLG5lLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgS3Q9dHI7bmU9bmV3IFdlYWtNYXAsaWU9bmV3IFdlYWtNYXA7dmFyIFR0LHhjPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBqYygpe2lmKCFUdCYmKFR0PXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFUdCkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBUdCh4Yyl9dmFyIFVjPS9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtmdW5jdGlvbiAkYyh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiZVYy50ZXN0KHQpfWZvcih2YXIgVz1bXSxXdD0wO1d0PDI1NjsrK1d0KVcucHVzaCgoV3QrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBIYyh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MCxlPShXW3RbciswXV0rV1t0W3IrMV1dK1dbdFtyKzJdXStXW3RbciszXV0rIi0iK1dbdFtyKzRdXStXW3Rbcis1XV0rIi0iK1dbdFtyKzZdXStXW3Rbcis3XV0rIi0iK1dbdFtyKzhdXStXW3Rbcis5XV0rIi0iK1dbdFtyKzEwXV0rV1t0W3IrMTFdXStXW3RbcisxMl1dK1dbdFtyKzEzXV0rV1t0W3IrMTRdXStXW3RbcisxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCEkYyhlKSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiBlfWZ1bmN0aW9uIEtjKHQscixlKXt0PXR8fHt9O3ZhciBzPXQucmFuZG9tfHwodC5ybmd8fGpjKSgpO2lmKHNbNl09c1s2XSYxNXw2NCxzWzhdPXNbOF0mNjN8MTI4LHIpe2U9ZXx8MDtmb3IodmFyIG49MDtuPDE2OysrbilyW2Urbl09c1tuXTtyZXR1cm4gcn1yZXR1cm4gSGMocyl9dmFyIFdjPSJbb2JqZWN0IE1hcF0iLHpjPSJbb2JqZWN0IFNldF0iLEdjPU9iamVjdC5wcm90b3R5cGUscWM9R2MuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gWWModCl7aWYodD09bnVsbClyZXR1cm4hMDtpZihOdCh0KSYmKHl0KHQpfHx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0LnNwbGljZT09ImZ1bmN0aW9uInx8T3QodCl8fGVzKHQpfHxHcih0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciByPUV0KHQpO2lmKHI9PVdjfHxyPT16YylyZXR1cm4hdC5zaXplO2lmKGJ0KHQpKXJldHVybiFzcyh0KS5sZW5ndGg7Zm9yKHZhciBlIGluIHQpaWYocWMuY2FsbCh0LGUpKXJldHVybiExO3JldHVybiEwfWNvbnN0IHp0PXtQUk9QQUdBVEVfS0lDS19BTEw6InByb3BhZ2F0ZV9raWNrX2Fjcm9zc19yb29tcyIsUkVGUkVTSF9JRF9PTl9ESVNDT05ORUNUSU9OOiJyZWZyZXNoX2lkX29uX2Rpc2Nvbm5lY3Rpb24iLFNLSVBfT1RFTF9UUkFDRVM6InNraXBfb3RlbF90cmFjZXMiLENGX1RSQU5TUE9SVF9GT1JDRV9SRUxBWV9PTl9JQ0VfRkFJTEVEOiJjZl90cmFuc3BvcnRfZm9yY2VfcmVsYXlfb25faWNlX2ZhaWxlZCIsTE9HX0xFVkVMOiJsb2dfbGV2ZWwiLFYxX1BMVUdJTlM6InYxX3BsdWdpbnMiLExJVkVTVFJFQU06ImZlYXRfbGl2ZXN0cmVhbSIsVkFMX01JTl9GUkFNRVJBVEU6InZhbF9taW5fZnJhbWVyYXRlIixTQ1JFRUVOU0hBUkVfRVJSX0hBQ0s6InNjcmVlbnNoYXJlX2Vycl9oYWNrIixTQ1JFRUVOU0hBUkVfQ09OU1RSQUlOVFNfUkVUUlk6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzX3JldHJ5IixTQ1JFRU5TSEFSRV9DT05TVFJBSU5UUzoic2NyZWVuc2hhcmVfY29uc3RyYWludHMiLE9CU19RVUFMSVRZOiJvYnNfcXVhbGl0eSIsQUxMT1dfU0FGQVJJX01FRElBX01JRERMRVdBUkVTOiJhbGxvd19zYWZhcmlfbWVkaWFfbWlkZGxld2FyZXMiLEVYUF9SRVNIQVJFOiJleHBfcmVzaGFyZSIsU0tJUF9TRVRUSU5HX0lOX1VTRV9ERVZJQ0U6InNraXBfc2V0dGluZ19pbl91c2VfZGV2aWNlIixQUkVDQUxMX0JBTkRXSURUSF9URVNUOiJwcmVjYWxsX2JhbmR3aWR0aF90ZXN0IixERUJVR19TT0NLRVRfSk9JTjoiZGVidWdfc29ja2V0X2pvaW4iLEZPUkNFX1JFTEFZOiJmb3JjZV9yZWxheSIsRk9SQ0VfVklERU9fQ09ERUM6ImZvcmNlX3ZpZGVvX2NvZGVjIixUUkFDS19ISU5UOiJ0cmFja19oaW50IixQUkVDUkVBVEVfUFJPRFVDRVJTOiJwcmVjcmVhdGVfcHJvZHVjZXJzIixESVNBQkxFX09QVVNfRFRYX0NGOiJkaXNhYmxlX29wdXNfZHR4X2NmIixFTkFCTEVfQVVESU9fQUNUSVZJVFlfREVCVUdfTE9HUzoiZW5hYmxlX2F1ZGlvX2FjdGl2aXR5X2RlYnVnX2xvZ3MiLERJU0FCTEVfTEFZRVJfU1dJVENIOiJkaXNhYmxlX2xheWVyX3N3aXRjaCJ9O2Z1bmN0aW9uIFJ0KHQpe2NvbnN0IHI9e307cmV0dXJuIHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LmNvZGUpPT0ibnVtYmVyIiYmKHIuY29kZT10LmNvZGUpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LmNvZGUpPT0ic3RyaW5nIiYmKHIuY29kZT10LmNvZGUuc3Vic3RyaW5nKDAsMTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubmFtZSk9PSJzdHJpbmciJiYoci5uYW1lPXQubmFtZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5tZXNzYWdlKT09InN0cmluZyImJihyLm1lc3NhZ2U9dC5tZXNzYWdlLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnJlYXNvbik9PSJzdHJpbmciJiYoci5yZWFzb249dC5yZWFzb24uc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQuc3RhY2spPT0ic3RyaW5nIiYmKHIuc3RhY2s9dC5zdGFjay5zdWJzdHJpbmcoMCw1MDApKSxyfWZ1bmN0aW9uIFFjKHtzZXJ2aWNlUHJlZml4OnQsYmFzZVVSSTpyfSl7cmV0dXJuYCR7dH0uJHtyfWB9Y29uc3QgSmM9e2xvZ3M6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL2xvZ3Mvb3RlbC9sb2dzIixtb2NrOnt1cmw6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21vY2siLGRvbWFpbjoibW9jay5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsYXBwOiJodHRwczovL2V4YW1wbGVzLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21lZXRpbmciLHN0YWdpbmdBcHA6Imh0dHBzOi8vZXhhbXBsZXMuc3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tZWV0aW5nIn0sYXBpQmFzZTp7cHJvZDoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLHN0YWdpbmc6Imh0dHBzOi8vYXBpLnN0YWdpbmcucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLHByb2RBbHRlcm5hdGU6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIn0sYmFzZVVSSTp7cHJvZDoicmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLHN0YWdpbmc6InN0YWdpbmcucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20ifX07ZnVuY3Rpb24gWGModCl7dmFyIHMsbixpO2NvbnN0IHI9dHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJiFuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJigocz13aW5kb3cubG9jYXRpb24uaG9zdCk9PW51bGw/dm9pZCAwOnMuaW5jbHVkZXMoSmMuYmFzZVVSSS5zdGFnaW5nKSksZT0hISgoaT0obj10PT1udWxsP3ZvaWQgMDp0LmdldFZhbHVlKCJtb2R1bGVzIikpPT1udWxsP3ZvaWQgMDpuLmRldlRvb2xzKSE9bnVsbCYmaS5sb2dzKTtyZXR1cm4gcnx8ZX1mdW5jdGlvbiBaYyh0LHIpe3ZhciBlO2lmKHQhPW51bGwmJnQuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmhhc0ZlYXR1cmUoenQuTE9HX0xFVkVMKSl7bGV0IHM9KChlPXQuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmdldFZhbHVlKHp0LkxPR19MRVZFTCkpPT1udWxsP3ZvaWQgMDplLnRvU3RyaW5nKCkpfHwiYWxsIjtpZihzPXMudG9Mb3dlckNhc2UoKS50cmltKCkscz09PSJvZmYiKXJldHVybiExO2lmKHMhPT0iYWxsIil7Y29uc3Qgbj1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9bi5pbmRleE9mKHIpLGE9bi5pbmRleE9mKHMpO2lmKGk8YSlyZXR1cm4hMX19cmV0dXJuITB9ZnVuY3Rpb24gTHModCxyLGU9e30pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5mb3JFYWNoKHM9Pnt2YXIgaTtpZihbbnVsbCx2b2lkIDAsTmFOXS5pbmNsdWRlcyh0W3NdKXx8ciYmKCgoaT1yLm1hdGNoKC9cLi9nKSk9PW51bGw/dm9pZCAwOmkubGVuZ3RoKXx8MCk+PTEwKXJldHVybjtjb25zdCBuPXI/YCR7cn0uJHtzfWA6czt0eXBlb2YgdFtzXT09Im9iamVjdCI/THModFtzXSxuLGUpOlsibnVtYmVyIiwic3RyaW5nIiwiYm9vbGVhbiJdLmluY2x1ZGVzKHR5cGVvZiB0W3NdKSYmKGVbbl09dFtzXSl9KSxlfWZ1bmN0aW9uIERzKHQscixlPXt9LHM9IiIpe2NvbnN0IG49e307dHJ5e2NvbnN0IGk9SlNPTi5zdHJpbmdpZnkoZSksYT1KU09OLnBhcnNlKGkpLGQ9THMoYSxzKSxvPUpTT04uc3RyaW5naWZ5KGQpO3JldHVybiBKU09OLnBhcnNlKG8pfWNhdGNoKGkpe2NvbnN0IGE9UnQoaSk7bltgJHtzfS5lcnJvci5tZXNzYWdlYF09YS5tZXNzYWdlfHwiIixuW2Ake3N9LmVycm9yLnN0YWNrYF09YS5zdGFja3x8IiIsbltgJHtzfS5lcnJvci5yZWFzb25gXT1hLnJlYXNvbnx8IiIsbltgJHtzfS5lcnJvci5zb3VyY2VgXT0ic2FmZWx5RmxhdHRlbk9iakZvck9wZW5UZWxlbWV0cnkifXJldHVybiBufWNvbnN0IGVkPXsiQW1hem9uIFNpbGsiOiJhbWF6b25fc2lsayIsIkFuZHJvaWQgQnJvd3NlciI6ImFuZHJvaWQiLEJhZGE6ImJhZGEiLEJsYWNrQmVycnk6ImJsYWNrYmVycnkiLENocm9tZToiY2hyb21lIixDaHJvbWl1bToiY2hyb21pdW0iLEVsZWN0cm9uOiJlbGVjdHJvbiIsRXBpcGhhbnk6ImVwaXBoYW55IixGaXJlZm94OiJmaXJlZm94IixGb2N1czoiZm9jdXMiLEdlbmVyaWM6ImdlbmVyaWMiLCJHb29nbGUgU2VhcmNoIjoiZ29vZ2xlX3NlYXJjaCIsR29vZ2xlYm90OiJnb29nbGVib3QiLCJJbnRlcm5ldCBFeHBsb3JlciI6ImllIiwiSy1NZWxlb24iOiJrX21lbGVvbiIsTWF4dGhvbjoibWF4dGhvbiIsIk1pY3Jvc29mdCBFZGdlIjoiZWRnZSIsIk1aIEJyb3dzZXIiOiJteiIsIk5BVkVSIFdoYWxlIEJyb3dzZXIiOiJuYXZlciIsT3BlcmE6Im9wZXJhIiwiT3BlcmEgQ29hc3QiOiJvcGVyYV9jb2FzdCIsUGhhbnRvbUpTOiJwaGFudG9tanMiLFB1ZmZpbjoicHVmZmluIixRdXBaaWxsYToicXVwemlsbGEiLFFROiJxcSIsUVFMaXRlOiJxcWxpdGUiLFNhZmFyaToic2FmYXJpIixTYWlsZmlzaDoic2FpbGZpc2giLCJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIjoic2Ftc3VuZ19pbnRlcm5ldCIsU2VhTW9ua2V5OiJzZWFtb25rZXkiLFNsZWlwbmlyOiJzbGVpcG5pciIsU3dpbmc6InN3aW5nIixUaXplbjoidGl6ZW4iLCJVQyBCcm93c2VyIjoidWMiLFZpdmFsZGk6InZpdmFsZGkiLCJXZWJPUyBCcm93c2VyIjoid2Vib3MiLFdlQ2hhdDoid2VjaGF0IiwiWWFuZGV4IEJyb3dzZXIiOiJ5YW5kZXgiLFJva3U6InJva3UifSxOcz17YW1hem9uX3NpbGs6IkFtYXpvbiBTaWxrIixhbmRyb2lkOiJBbmRyb2lkIEJyb3dzZXIiLGJhZGE6IkJhZGEiLGJsYWNrYmVycnk6IkJsYWNrQmVycnkiLGNocm9tZToiQ2hyb21lIixjaHJvbWl1bToiQ2hyb21pdW0iLGVsZWN0cm9uOiJFbGVjdHJvbiIsZXBpcGhhbnk6IkVwaXBoYW55IixmaXJlZm94OiJGaXJlZm94Iixmb2N1czoiRm9jdXMiLGdlbmVyaWM6IkdlbmVyaWMiLGdvb2dsZWJvdDoiR29vZ2xlYm90Iixnb29nbGVfc2VhcmNoOiJHb29nbGUgU2VhcmNoIixpZToiSW50ZXJuZXQgRXhwbG9yZXIiLGtfbWVsZW9uOiJLLU1lbGVvbiIsbWF4dGhvbjoiTWF4dGhvbiIsZWRnZToiTWljcm9zb2Z0IEVkZ2UiLG16OiJNWiBCcm93c2VyIixuYXZlcjoiTkFWRVIgV2hhbGUgQnJvd3NlciIsb3BlcmE6Ik9wZXJhIixvcGVyYV9jb2FzdDoiT3BlcmEgQ29hc3QiLHBoYW50b21qczoiUGhhbnRvbUpTIixwdWZmaW46IlB1ZmZpbiIscXVwemlsbGE6IlF1cFppbGxhIixxcToiUVEgQnJvd3NlciIscXFsaXRlOiJRUSBCcm93c2VyIExpdGUiLHNhZmFyaToiU2FmYXJpIixzYWlsZmlzaDoiU2FpbGZpc2giLHNhbXN1bmdfaW50ZXJuZXQ6IlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWQiLHNlYW1vbmtleToiU2VhTW9ua2V5IixzbGVpcG5pcjoiU2xlaXBuaXIiLHN3aW5nOiJTd2luZyIsdGl6ZW46IlRpemVuIix1YzoiVUMgQnJvd3NlciIsdml2YWxkaToiVml2YWxkaSIsd2Vib3M6IldlYk9TIEJyb3dzZXIiLHdlY2hhdDoiV2VDaGF0Iix5YW5kZXg6IllhbmRleCBCcm93c2VyIn0sVT17dGFibGV0OiJ0YWJsZXQiLG1vYmlsZToibW9iaWxlIixkZXNrdG9wOiJkZXNrdG9wIix0djoidHYifSxHPXtXaW5kb3dzUGhvbmU6IldpbmRvd3MgUGhvbmUiLFdpbmRvd3M6IldpbmRvd3MiLE1hY09TOiJtYWNPUyIsaU9TOiJpT1MiLEFuZHJvaWQ6IkFuZHJvaWQiLFdlYk9TOiJXZWJPUyIsQmxhY2tCZXJyeToiQmxhY2tCZXJyeSIsQmFkYToiQmFkYSIsVGl6ZW46IlRpemVuIixMaW51eDoiTGludXgiLENocm9tZU9TOiJDaHJvbWUgT1MiLFBsYXlTdGF0aW9uNDoiUGxheVN0YXRpb24gNCIsUm9rdToiUm9rdSJ9LG9lPXtFZGdlSFRNTDoiRWRnZUhUTUwiLEJsaW5rOiJCbGluayIsVHJpZGVudDoiVHJpZGVudCIsUHJlc3RvOiJQcmVzdG8iLEdlY2tvOiJHZWNrbyIsV2ViS2l0OiJXZWJLaXQifTtjbGFzcyBne3N0YXRpYyBnZXRGaXJzdE1hdGNoKHIsZSl7Y29uc3Qgcz1lLm1hdGNoKHIpO3JldHVybiBzJiZzLmxlbmd0aD4wJiZzWzFdfHwiIn1zdGF0aWMgZ2V0U2Vjb25kTWF0Y2gocixlKXtjb25zdCBzPWUubWF0Y2gocik7cmV0dXJuIHMmJnMubGVuZ3RoPjEmJnNbMl18fCIifXN0YXRpYyBtYXRjaEFuZFJldHVybkNvbnN0KHIsZSxzKXtpZihyLnRlc3QoZSkpcmV0dXJuIHN9c3RhdGljIGdldFdpbmRvd3NWZXJzaW9uTmFtZShyKXtzd2l0Y2gocil7Y2FzZSJOVCI6cmV0dXJuIk5UIjtjYXNlIlhQIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4wIjpyZXR1cm4iMjAwMCI7Y2FzZSJOVCA1LjEiOnJldHVybiJYUCI7Y2FzZSJOVCA1LjIiOnJldHVybiIyMDAzIjtjYXNlIk5UIDYuMCI6cmV0dXJuIlZpc3RhIjtjYXNlIk5UIDYuMSI6cmV0dXJuIjciO2Nhc2UiTlQgNi4yIjpyZXR1cm4iOCI7Y2FzZSJOVCA2LjMiOnJldHVybiI4LjEiO2Nhc2UiTlQgMTAuMCI6cmV0dXJuIjEwIjtkZWZhdWx0OnJldHVybn19c3RhdGljIGdldE1hY09TVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksZVswXT09PTEwKXN3aXRjaChlWzFdKXtjYXNlIDU6cmV0dXJuIkxlb3BhcmQiO2Nhc2UgNjpyZXR1cm4iU25vdyBMZW9wYXJkIjtjYXNlIDc6cmV0dXJuIkxpb24iO2Nhc2UgODpyZXR1cm4iTW91bnRhaW4gTGlvbiI7Y2FzZSA5OnJldHVybiJNYXZlcmlja3MiO2Nhc2UgMTA6cmV0dXJuIllvc2VtaXRlIjtjYXNlIDExOnJldHVybiJFbCBDYXBpdGFuIjtjYXNlIDEyOnJldHVybiJTaWVycmEiO2Nhc2UgMTM6cmV0dXJuIkhpZ2ggU2llcnJhIjtjYXNlIDE0OnJldHVybiJNb2phdmUiO2Nhc2UgMTU6cmV0dXJuIkNhdGFsaW5hIjtkZWZhdWx0OnJldHVybn19c3RhdGljIGdldEFuZHJvaWRWZXJzaW9uTmFtZShyKXtjb25zdCBlPXIuc3BsaXQoIi4iKS5zcGxpY2UoMCwyKS5tYXAocz0+cGFyc2VJbnQocywxMCl8fDApO2lmKGUucHVzaCgwKSwhKGVbMF09PT0xJiZlWzFdPDUpKXtpZihlWzBdPT09MSYmZVsxXTw2KXJldHVybiJDdXBjYWtlIjtpZihlWzBdPT09MSYmZVsxXT49NilyZXR1cm4iRG9udXQiO2lmKGVbMF09PT0yJiZlWzFdPDIpcmV0dXJuIkVjbGFpciI7aWYoZVswXT09PTImJmVbMV09PT0yKXJldHVybiJGcm95byI7aWYoZVswXT09PTImJmVbMV0+MilyZXR1cm4iR2luZ2VyYnJlYWQiO2lmKGVbMF09PT0zKXJldHVybiJIb25leWNvbWIiO2lmKGVbMF09PT00JiZlWzFdPDEpcmV0dXJuIkljZSBDcmVhbSBTYW5kd2ljaCI7aWYoZVswXT09PTQmJmVbMV08NClyZXR1cm4iSmVsbHkgQmVhbiI7aWYoZVswXT09PTQmJmVbMV0+PTQpcmV0dXJuIktpdEthdCI7aWYoZVswXT09PTUpcmV0dXJuIkxvbGxpcG9wIjtpZihlWzBdPT09NilyZXR1cm4iTWFyc2htYWxsb3ciO2lmKGVbMF09PT03KXJldHVybiJOb3VnYXQiO2lmKGVbMF09PT04KXJldHVybiJPcmVvIjtpZihlWzBdPT09OSlyZXR1cm4iUGllIn19c3RhdGljIGdldFZlcnNpb25QcmVjaXNpb24ocil7cmV0dXJuIHIuc3BsaXQoIi4iKS5sZW5ndGh9c3RhdGljIGNvbXBhcmVWZXJzaW9ucyhyLGUscz0hMSl7Y29uc3Qgbj1nLmdldFZlcnNpb25QcmVjaXNpb24ociksaT1nLmdldFZlcnNpb25QcmVjaXNpb24oZSk7bGV0IGE9TWF0aC5tYXgobixpKSxkPTA7Y29uc3Qgbz1nLm1hcChbcixlXSxsPT57Y29uc3QgbT1hLWcuZ2V0VmVyc2lvblByZWNpc2lvbihsKSx2PWwrbmV3IEFycmF5KG0rMSkuam9pbigiLjAiKTtyZXR1cm4gZy5tYXAodi5zcGxpdCgiLiIpLEU9Pm5ldyBBcnJheSgyMC1FLmxlbmd0aCkuam9pbigiMCIpK0UpLnJldmVyc2UoKX0pO2ZvcihzJiYoZD1hLU1hdGgubWluKG4saSkpLGEtPTE7YT49ZDspe2lmKG9bMF1bYV0+b1sxXVthXSlyZXR1cm4gMTtpZihvWzBdW2FdPT09b1sxXVthXSl7aWYoYT09PWQpcmV0dXJuIDA7YS09MX1lbHNlIGlmKG9bMF1bYV08b1sxXVthXSlyZXR1cm4tMX19c3RhdGljIG1hcChyLGUpe2NvbnN0IHM9W107bGV0IG47aWYoQXJyYXkucHJvdG90eXBlLm1hcClyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHIsZSk7Zm9yKG49MDtuPHIubGVuZ3RoO24rPTEpcy5wdXNoKGUocltuXSkpO3JldHVybiBzfXN0YXRpYyBmaW5kKHIsZSl7bGV0IHMsbjtpZihBcnJheS5wcm90b3R5cGUuZmluZClyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbmQuY2FsbChyLGUpO2ZvcihzPTAsbj1yLmxlbmd0aDtzPG47cys9MSl7Y29uc3QgaT1yW3NdO2lmKGUoaSxzKSlyZXR1cm4gaX19c3RhdGljIGFzc2lnbihyLC4uLmUpe2NvbnN0IHM9cjtsZXQgbixpO2lmKE9iamVjdC5hc3NpZ24pcmV0dXJuIE9iamVjdC5hc3NpZ24ociwuLi5lKTtmb3Iobj0wLGk9ZS5sZW5ndGg7bjxpO24rPTEpe2NvbnN0IGE9ZVtuXTt0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsJiZPYmplY3Qua2V5cyhhKS5mb3JFYWNoKG89PntzW29dPWFbb119KX1yZXR1cm4gcn1zdGF0aWMgZ2V0QnJvd3NlckFsaWFzKHIpe3JldHVybiBlZFtyXX1zdGF0aWMgZ2V0QnJvd3NlclR5cGVCeUFsaWFzKHIpe3JldHVybiBOc1tyXXx8IiJ9fWNvbnN0IEQ9L3ZlcnNpb25cLyhcZCsoXC4/Xz9cZCspKykvaSx0ZD1be3Rlc3Q6Wy9nb29nbGVib3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiR29vZ2xlYm90In0sZT1nLmdldEZpcnN0TWF0Y2goL2dvb2dsZWJvdFwvKFxkKyhcLlxkKykpL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wZXJhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcGVyYSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcHJcL3xvcGlvcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcHJ8b3Bpb3MpW1xzL10oXFMrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9TYW1zdW5nQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpTYW1zdW5nQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9XaGFsZS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJOQVZFUiBXaGFsZSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzp3aGFsZSlbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01aQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNWiBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Ok1aQnJvd3NlcilbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9mb2N1cy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJGb2N1cyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpmb2N1cylbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zd2luZy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTd2luZyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpzd2luZylbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jb2FzdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSBDb2FzdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86Y29hc3QpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3B0XC9cZCsoPzouP18/XGQrKSsvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgVG91Y2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3B0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy95YWJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiWWFuZGV4IEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86eWFicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy91Y2Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVUMgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86dWNicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01heHRob258bXhpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWF4dGhvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86TWF4dGhvbnxteGlvcylbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lcGlwaGFueS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJFcGlwaGFueSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86ZXBpcGhhbnkpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcHVmZmluL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlB1ZmZpbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86cHVmZmluKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NsZWlwbmlyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNsZWlwbmlyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpzbGVpcG5pcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9rLW1lbGVvbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJLLU1lbGVvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86ay1tZWxlb24pW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbWljcm9tZXNzZW5nZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2VDaGF0In0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1pY3JvbWVzc2VuZ2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9xcWJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTovcXFicm93c2VybGl0ZS9pLnRlc3QodCk/IlFRIEJyb3dzZXIgTGl0ZSI6IlFRIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXFicm93c2VybGl0ZXxxcWJyb3dzZXIpWy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tc2llfHRyaWRlbnQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSW50ZXJuZXQgRXhwbG9yZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86bXNpZSB8cnY6KShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9cc2VkZ1wvL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1pY3Jvc29mdCBFZGdlIn0sZT1nLmdldEZpcnN0TWF0Y2goL1xzZWRnXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWRnKFtlYV18aW9zKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvZWRnKFtlYV18aW9zKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3ZpdmFsZGkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVml2YWxkaSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC92aXZhbGRpXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2VhbW9ua2V5L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNlYU1vbmtleSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zZWFtb25rZXlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWlsZmlzaC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYWlsZmlzaCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zYWlsZmlzaFxzP2Jyb3dzZXJcLyhcZCsoXC5cZCspPykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFtYXpvbiBTaWxrIn0sZT1nLmdldEZpcnN0TWF0Y2goL3NpbGtcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9waGFudG9tL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlBoYW50b21KUyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9waGFudG9tanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGltZXJqcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGltZXJKUyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zbGltZXJqc1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJCbGFja0JlcnJ5In0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5W1xkXStcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJXZWJPUyBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC93KD86ZWIpP1tvMF1zYnJvd3NlclwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2JhZGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmFkYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9kb2xmaW5cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy90aXplbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJUaXplbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzp0aXplblxzPyk/YnJvd3NlclwvKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9xdXB6aWxsYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJRdXBaaWxsYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpxdXB6aWxsYSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRmlyZWZveCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpmaXJlZm94fGljZXdlYXNlbHxmeGlvcylbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lbGVjdHJvbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJFbGVjdHJvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzplbGVjdHJvbilcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NaXVpQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaXVpIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Ok1pdWlCcm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2Nocm9taXVtL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkNocm9taXVtIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9taXVtKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWV8Y3Jpb3N8Y3Jtby9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWUifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Y2hyb21lfGNyaW9zfGNybW8pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvR1NBL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZSBTZWFyY2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86R1NBKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQW5kcm9pZCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9wbGF5c3RhdGlvbiA0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlBsYXlTdGF0aW9uIDQifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NhZmFyaXxhcHBsZXdlYmtpdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYWZhcmkifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbLy4qL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9L14oLiopXC8oLiopIC8sZT0vXiguKilcLyguKilbIFx0XVwoKC4qKS8sbj10LnNlYXJjaCgiXFwoIikhPT0tMT9lOnI7cmV0dXJue25hbWU6Zy5nZXRGaXJzdE1hdGNoKG4sdCksdmVyc2lvbjpnLmdldFNlY29uZE1hdGNoKG4sdCl9fX1dO3ZhciByZD1be3Rlc3Q6Wy9Sb2t1XC9EVlAvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUm9rdVwvRFZQLShcZCtcLlxkKykvaSx0KTtyZXR1cm57bmFtZTpHLlJva3UsdmVyc2lvbjpyfX19LHt0ZXN0Olsvd2luZG93cyBwaG9uZS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvd2luZG93cyBwaG9uZSAoPzpvcyk/XHM/KFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuV2luZG93c1Bob25lLHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9XaW5kb3dzICgoTlR8WFApKCBcZFxkPy5cZCk/KS9pLHQpLGU9Zy5nZXRXaW5kb3dzVmVyc2lvbk5hbWUocik7cmV0dXJue25hbWU6Ry5XaW5kb3dzLHZlcnNpb246cix2ZXJzaW9uTmFtZTplfX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpHLmlPU30sZT1nLmdldFNlY29uZE1hdGNoKC8oVmVyc2lvblwvKShcZFtcZC5dKykvLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21hY2ludG9zaC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvbWFjIG9zIHggKFxkKyhcLj9fP1xkKykrKS9pLHQpLnJlcGxhY2UoL1tfXHNdL2csIi4iKSxlPWcuZ2V0TWFjT1NWZXJzaW9uTmFtZShyKSxzPXtuYW1lOkcuTWFjT1MsdmVyc2lvbjpyfTtyZXR1cm4gZSYmKHMudmVyc2lvbk5hbWU9ZSksc319LHt0ZXN0OlsvKGlwb2R8aXBob25lfGlwYWQpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9vcyAoXGQrKFtfXHNdXGQrKSopIGxpa2UgbWFjIG9zIHgvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIik7cmV0dXJue25hbWU6Ry5pT1MsdmVyc2lvbjpyfX19LHt0ZXN0KHQpe2NvbnN0IHI9IXQudGVzdCgvbGlrZSBhbmRyb2lkL2kpLGU9dC50ZXN0KC9hbmRyb2lkL2kpO3JldHVybiByJiZlfSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvYW5kcm9pZFtccy8tXShcZCsoXC5cZCspKikvaSx0KSxlPWcuZ2V0QW5kcm9pZFZlcnNpb25OYW1lKHIpLHM9e25hbWU6Ry5BbmRyb2lkLHZlcnNpb246cn07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyh3ZWJ8aHB3KVtvMF1zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oPzp3ZWJ8aHB3KVtvMF1zXC8oXGQrKFwuXGQrKSopL2ksdCksZT17bmFtZTpHLldlYk9TfTtyZXR1cm4gciYmci5sZW5ndGgmJihlLnZlcnNpb249ciksZX19LHt0ZXN0OlsvYmxhY2tiZXJyeXxcYmJiXGQrL2ksL3JpbVxzdGFibGV0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9yaW1cc3RhYmxldFxzb3NccyhcZCsoXC5cZCspKikvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5XGQrXC8oXGQrKFtfXHNdXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvXGJiYihcZCspL2ksdCk7cmV0dXJue25hbWU6Ry5CbGFja0JlcnJ5LHZlcnNpb246cn19fSx7dGVzdDpbL2JhZGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2JhZGFcLyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLkJhZGEsdmVyc2lvbjpyfX19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3RpemVuWy9cc10oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5UaXplbix2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9saW51eC9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOkcuTGludXh9fX0se3Rlc3Q6Wy9Dck9TL10sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkNocm9tZU9TfX19LHt0ZXN0OlsvUGxheVN0YXRpb24gNC9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9QbGF5U3RhdGlvbiA0Wy9cc10oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5QbGF5U3RhdGlvbjQsdmVyc2lvbjpyfX19XSxzZD1be3Rlc3Q6Wy9nb29nbGVib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZToiYm90Iix2ZW5kb3I6Ikdvb2dsZSJ9fX0se3Rlc3Q6Wy9odWF3ZWkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhjYW4tbDAxKS9pLHQpJiYiTm92YSIsZT17dHlwZTpVLm1vYmlsZSx2ZW5kb3I6Ikh1YXdlaSJ9O3JldHVybiByJiYoZS5tb2RlbD1yKSxlfX0se3Rlc3Q6Wy9uZXh1c1xzKig/Ojd8OHw5fDEwKS4qL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJOZXh1cyJ9fX0se3Rlc3Q6Wy9pcGFkL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFwcGxlIixtb2RlbDoiaVBhZCJ9fX0se3Rlc3Q6Wy9rZnR0IGJ1aWxkL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBbWF6b24iLG1vZGVsOiJLaW5kbGUgRmlyZSBIRCA3In19fSx7dGVzdDpbL3NpbGsvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFtYXpvbiJ9fX0se3Rlc3Q6Wy90YWJsZXQoPyEgcGMpL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXR9fX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2lwb2R8aXBob25lL2kpLGU9dC50ZXN0KC9saWtlIChpcG9kfGlwaG9uZSkvaSk7cmV0dXJuIHImJiFlfSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKGlwb2R8aXBob25lKS9pLHQpO3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiQXBwbGUiLG1vZGVsOnJ9fX0se3Rlc3Q6Wy9uZXh1c1xzKlswLTZdLiovaSwvZ2FsYXh5IG5leHVzL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGUsdmVuZG9yOiJOZXh1cyJ9fX0se3Rlc3Q6Wy9bXi1dbW9iaS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJibGFja2JlcnJ5In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZSx2ZW5kb3I6IkJsYWNrQmVycnkifX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJiYWRhIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSgpPT09IndpbmRvd3MgcGhvbmUifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiTWljcm9zb2Z0In19fSx7dGVzdCh0KXtjb25zdCByPU51bWJlcihTdHJpbmcodC5nZXRPU1ZlcnNpb24oKSkuc3BsaXQoIi4iKVswXSk7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIiYmcj49M30sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImFuZHJvaWQifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0ibWFjb3MifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcCx2ZW5kb3I6IkFwcGxlIn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09IndpbmRvd3MifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImxpbnV4In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJwbGF5c3RhdGlvbiA0In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnR2fX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icm9rdSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50dn19fV0sbmQ9W3t0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJtaWNyb3NvZnQgZWRnZSJ9LGRlc2NyaWJlKHQpe2lmKC9cc2VkZ1wvL2kudGVzdCh0KSlyZXR1cm57bmFtZTpvZS5CbGlua307Y29uc3QgZT1nLmdldEZpcnN0TWF0Y2goL2VkZ2VcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm57bmFtZTpvZS5FZGdlSFRNTCx2ZXJzaW9uOmV9fX0se3Rlc3Q6Wy90cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuVHJpZGVudH0sZT1nLmdldEZpcnN0TWF0Y2goL3RyaWRlbnRcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7cmV0dXJuIHQudGVzdCgvcHJlc3RvL2kpfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlByZXN0b30sZT1nLmdldEZpcnN0TWF0Y2goL3ByZXN0b1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtjb25zdCByPXQudGVzdCgvZ2Vja28vaSksZT10LnRlc3QoL2xpa2UgZ2Vja28vaSk7cmV0dXJuIHImJiFlfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLkdlY2tvfSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZ2Vja29cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8oYXBwbGUpP3dlYmtpdFwvNTM3XC4zNi9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOm9lLkJsaW5rfX19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5XZWJLaXR9LGU9Zy5nZXRGaXJzdE1hdGNoKC93ZWJraXRcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX1dO2NsYXNzIFZze2NvbnN0cnVjdG9yKHIsZT0hMSl7aWYocj09bnVsbHx8cj09PSIiKXRocm93IG5ldyBFcnJvcigiVXNlckFnZW50IHBhcmFtZXRlciBjYW4ndCBiZSBlbXB0eSIpO3RoaXMuX3VhPXIsdGhpcy5wYXJzZWRSZXN1bHQ9e30sZSE9PSEwJiZ0aGlzLnBhcnNlKCl9Z2V0VUEoKXtyZXR1cm4gdGhpcy5fdWF9dGVzdChyKXtyZXR1cm4gci50ZXN0KHRoaXMuX3VhKX1wYXJzZUJyb3dzZXIoKXt0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyPXt9O2NvbnN0IHI9Zy5maW5kKHRkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXJ9Z2V0QnJvd3Nlcigpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyP3RoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI6dGhpcy5wYXJzZUJyb3dzZXIoKX1nZXRCcm93c2VyTmFtZShyKXtyZXR1cm4gcj9TdHJpbmcodGhpcy5nZXRCcm93c2VyKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRCcm93c2VyKCkubmFtZXx8IiJ9Z2V0QnJvd3NlclZlcnNpb24oKXtyZXR1cm4gdGhpcy5nZXRCcm93c2VyKCkudmVyc2lvbn1nZXRPUygpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5vcz90aGlzLnBhcnNlZFJlc3VsdC5vczp0aGlzLnBhcnNlT1MoKX1wYXJzZU9TKCl7dGhpcy5wYXJzZWRSZXN1bHQub3M9e307Y29uc3Qgcj1nLmZpbmQocmQsZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihlLnRlc3QgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gZS50ZXN0LnNvbWUocz0+dGhpcy50ZXN0KHMpKTt0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCIpfSk7cmV0dXJuIHImJih0aGlzLnBhcnNlZFJlc3VsdC5vcz1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0Lm9zfWdldE9TTmFtZShyKXtjb25zdHtuYW1lOmV9PXRoaXMuZ2V0T1MoKTtyZXR1cm4gcj9TdHJpbmcoZSkudG9Mb3dlckNhc2UoKXx8IiI6ZXx8IiJ9Z2V0T1NWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0T1MoKS52ZXJzaW9ufWdldFBsYXRmb3JtKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtP3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtOnRoaXMucGFyc2VQbGF0Zm9ybSgpfWdldFBsYXRmb3JtVHlwZShyPSExKXtjb25zdHt0eXBlOmV9PXRoaXMuZ2V0UGxhdGZvcm0oKTtyZXR1cm4gcj9TdHJpbmcoZSkudG9Mb3dlckNhc2UoKXx8IiI6ZXx8IiJ9cGFyc2VQbGF0Zm9ybSgpe3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXt9O2NvbnN0IHI9Zy5maW5kKHNkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm09ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybX1nZXRFbmdpbmUoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lP3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZTp0aGlzLnBhcnNlRW5naW5lKCl9Z2V0RW5naW5lTmFtZShyKXtyZXR1cm4gcj9TdHJpbmcodGhpcy5nZXRFbmdpbmUoKS5uYW1lKS50b0xvd2VyQ2FzZSgpfHwiIjp0aGlzLmdldEVuZ2luZSgpLm5hbWV8fCIifXBhcnNlRW5naW5lKCl7dGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXt9O2NvbnN0IHI9Zy5maW5kKG5kLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lfXBhcnNlKCl7cmV0dXJuIHRoaXMucGFyc2VCcm93c2VyKCksdGhpcy5wYXJzZU9TKCksdGhpcy5wYXJzZVBsYXRmb3JtKCksdGhpcy5wYXJzZUVuZ2luZSgpLHRoaXN9Z2V0UmVzdWx0KCl7cmV0dXJuIGcuYXNzaWduKHt9LHRoaXMucGFyc2VkUmVzdWx0KX1zYXRpc2ZpZXMocil7Y29uc3QgZT17fTtsZXQgcz0wO2NvbnN0IG49e307bGV0IGk9MDtpZihPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGQ9Pntjb25zdCBvPXJbZF07dHlwZW9mIG89PSJzdHJpbmciPyhuW2RdPW8saSs9MSk6dHlwZW9mIG89PSJvYmplY3QiJiYoZVtkXT1vLHMrPTEpfSkscz4wKXtjb25zdCBkPU9iamVjdC5rZXlzKGUpLG89Zy5maW5kKGQsbT0+dGhpcy5pc09TKG0pKTtpZihvKXtjb25zdCBtPXRoaXMuc2F0aXNmaWVzKGVbb10pO2lmKG0hPT12b2lkIDApcmV0dXJuIG19Y29uc3QgbD1nLmZpbmQoZCxtPT50aGlzLmlzUGxhdGZvcm0obSkpO2lmKGwpe2NvbnN0IG09dGhpcy5zYXRpc2ZpZXMoZVtsXSk7aWYobSE9PXZvaWQgMClyZXR1cm4gbX19aWYoaT4wKXtjb25zdCBkPU9iamVjdC5rZXlzKG4pLG89Zy5maW5kKGQsbD0+dGhpcy5pc0Jyb3dzZXIobCwhMCkpO2lmKG8hPT12b2lkIDApcmV0dXJuIHRoaXMuY29tcGFyZVZlcnNpb24obltvXSl9fWlzQnJvd3NlcihyLGU9ITEpe2NvbnN0IHM9dGhpcy5nZXRCcm93c2VyTmFtZSgpLnRvTG93ZXJDYXNlKCk7bGV0IG49ci50b0xvd2VyQ2FzZSgpO2NvbnN0IGk9Zy5nZXRCcm93c2VyVHlwZUJ5QWxpYXMobik7cmV0dXJuIGUmJmkmJihuPWkudG9Mb3dlckNhc2UoKSksbj09PXN9Y29tcGFyZVZlcnNpb24ocil7bGV0IGU9WzBdLHM9cixuPSExO2NvbnN0IGk9dGhpcy5nZXRCcm93c2VyVmVyc2lvbigpO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gclswXT09PSI+Inx8clswXT09PSI8Ij8ocz1yLnN1YnN0cigxKSxyWzFdPT09Ij0iPyhuPSEwLHM9ci5zdWJzdHIoMikpOmU9W10sclswXT09PSI+Ij9lLnB1c2goMSk6ZS5wdXNoKC0xKSk6clswXT09PSI9Ij9zPXIuc3Vic3RyKDEpOnJbMF09PT0ifiImJihuPSEwLHM9ci5zdWJzdHIoMSkpLGUuaW5kZXhPZihnLmNvbXBhcmVWZXJzaW9ucyhpLHMsbikpPi0xfWlzT1Mocil7cmV0dXJuIHRoaXMuZ2V0T1NOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzUGxhdGZvcm0ocil7cmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm1UeXBlKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzRW5naW5lKHIpe3JldHVybiB0aGlzLmdldEVuZ2luZU5hbWUoITApPT09U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCl9aXMocixlPSExKXtyZXR1cm4gdGhpcy5pc0Jyb3dzZXIocixlKXx8dGhpcy5pc09TKHIpfHx0aGlzLmlzUGxhdGZvcm0ocil9c29tZShyPVtdKXtyZXR1cm4gci5zb21lKGU9PnRoaXMuaXMoZSkpfX0vKiEKICogQm93c2VyIC0gYSBicm93c2VyIGRldGVjdG9yCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5jZWRpa3Nvbi9ib3dzZXIKICogTUlUIExpY2Vuc2UgfCAoYykgRHVzdGluIERpYXogMjAxMi0yMDE1CiAqIE1JVCBMaWNlbnNlIHwgKGMpIERlbmlzIERlbWNoZW5rbyAyMDE1LTIwMTkKICovY2xhc3MgaWR7c3RhdGljIGdldFBhcnNlcihyLGU9ITEpe2lmKHR5cGVvZiByIT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBzaG91bGQgYmUgYSBzdHJpbmciKTtyZXR1cm4gbmV3IFZzKHIsZSl9c3RhdGljIHBhcnNlKHIpe3JldHVybiBuZXcgVnMocikuZ2V0UmVzdWx0KCl9c3RhdGljIGdldCBCUk9XU0VSX01BUCgpe3JldHVybiBOc31zdGF0aWMgZ2V0IEVOR0lORV9NQVAoKXtyZXR1cm4gb2V9c3RhdGljIGdldCBPU19NQVAoKXtyZXR1cm4gR31zdGF0aWMgZ2V0IFBMQVRGT1JNU19NQVAoKXtyZXR1cm4gVX19Y29uc3QgTmU9ImNocm9tZSIsRnM9Im9wZXJhIixCcz0iZmlyZWZveCIseHM9ImlleHBsb3JlciIsanM9InNhZmFyaSIsVXM9Im53anMiLCRzPSJlbGVjdHJvbiIsSHM9InJlYWN0LW5hdGl2ZSIsR3Q9InVua25vd24iLFB0PXtDaHJvbWU6TmUsQ2hyb21pdW06TmUsT3BlcmE6RnMsRmlyZWZveDpCcywiSW50ZXJuZXQgRXhwbG9yZXIiOnhzLFNhZmFyaTpqc307ZnVuY3Rpb24gYWQoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yLHI9e25hbWU6R3QsdmVyc2lvbjp2b2lkIDB9O2lmKHQubWF0Y2goL0Nocm9tZS8pJiYhdC5tYXRjaCgvRWRnZS8pKWlmKHQubWF0Y2goL0VkZyhBPykvKSl7Y29uc3QgZT10Lm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV07TnVtYmVyLnBhcnNlSW50KGUsMTApPjcyJiYoci5uYW1lPU5lLHIudmVyc2lvbj1lKX1lbHNlIHIubmFtZT1OZSxyLnZlcnNpb249dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO3JldHVybiByfWZ1bmN0aW9uIG9kKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9FbGVjdHJvbi8pKXtjb25zdCByPXQubWF0Y2goL0VsZWN0cm9uXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOiRzLHZlcnNpb246cn19cmV0dXJuIG51bGx9ZnVuY3Rpb24gY2QoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yO2lmKHQubWF0Y2goL0ppdHNpTWVldE5XLykpe2NvbnN0IHI9dC5tYXRjaCgvSml0c2lNZWV0TldcLyhbXGQuXSspLylbMV07cmV0dXJue25hbWU6VXMsdmVyc2lvbjpyfX19ZnVuY3Rpb24gZGQoKXtjb25zdCB0PW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1xiKHJlYWN0WyBcdF8tXSpuYXRpdmUpKD86XC8oXFMrKSk/L2kpO2xldCByO2lmKHR8fG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlIilyZXR1cm4gdCYmdC5sZW5ndGg+MiYmKHRbMV0scj10WzJdKSxyfHwocj0idW5rbm93biIpLHtuYW1lOkhzLHZlcnNpb246cn19ZnVuY3Rpb24gbGQodCl7bGV0IHI7Y29uc3QgZT1bZGQsb2QsY2RdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bis9MSlpZihyPWVbbl0oKSxyKXJldHVybiByO2NvbnN0IHM9dC5nZXRCcm93c2VyTmFtZSgpO3JldHVybiBzIGluIFB0P3tuYW1lOlB0W3NdLHZlcnNpb246dC5nZXRCcm93c2VyVmVyc2lvbigpfToocj1hZCgpLHJ8fHtuYW1lOkd0LHZlcnNpb246dm9pZCAwfSl9Y2xhc3MgdWR7Y29uc3RydWN0b3IoKXtwKHRoaXMsIl9ib3dzZXIiKTtwKHRoaXMsIl9uYW1lIik7cCh0aGlzLCJfdmVyc2lvbiIpO3AodGhpcywiZ2V0RGV2aWNlSW5mbyIsKCk9Pih7aXNNb2JpbGU6dGhpcy5pc01vYmlsZSgpLGJyb3dzZXJOYW1lOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyTmFtZSgpLG9zTmFtZTp0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCksYnJvd3NlclZlcnNpb246dGhpcy5fYm93c2VyLmdldEJyb3dzZXJWZXJzaW9uKCksb3NWZXJzaW9uTmFtZTp0aGlzLl9ib3dzZXIuZ2V0T1NWZXJzaW9uKCksZW5naW5lTmFtZTp0aGlzLl9ib3dzZXIuZ2V0RW5naW5lTmFtZSgpfSkpfWluaXQocil7bGV0IGUscztpZih0aGlzLl9ib3dzZXI9aWQuZ2V0UGFyc2VyKG5hdmlnYXRvci51c2VyQWdlbnQpLHR5cGVvZiByPT0idW5kZWZpbmVkIil7Y29uc3Qgbj1sZCh0aGlzLl9ib3dzZXIpO2U9bi5uYW1lLHM9bi52ZXJzaW9ufWVsc2Ugci5uYW1lIGluIFB0PyhlPVB0W3IubmFtZV0scz1yLnZlcnNpb24pOihlPUd0LHM9dm9pZCAwKTt0aGlzLl9uYW1lPWUsdGhpcy5fdmVyc2lvbj1zfWdldE5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZX1pc0Nocm9tZSgpe3JldHVybiB0aGlzLl9uYW1lPT09TmV9aXNPcGVyYSgpe3JldHVybiB0aGlzLl9uYW1lPT09RnN9aXNGaXJlZm94KCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Cc31pc0lFeHBsb3Jlcigpe3JldHVybiB0aGlzLl9uYW1lPT09eHN9aXNTYWZhcmkoKXtyZXR1cm4gdGhpcy5fbmFtZT09PWpzfWlzTldKUygpe3JldHVybiB0aGlzLl9uYW1lPT09VXN9aXNFbGVjdHJvbigpe3JldHVybiB0aGlzLl9uYW1lPT09JHN9aXNSZWFjdE5hdGl2ZSgpe3JldHVybiB0aGlzLl9uYW1lPT09SHN8fG5hdmlnYXRvci5pc1JlYWN0TmF0aXZlPT09ITB9Z2V0VmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9ufWlzTW9iaWxlKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5nZXRQbGF0Zm9ybVR5cGUoKT09PSJtb2JpbGUifV9jaGVja0NvbmRpdGlvbihyKXtpZih0aGlzLl92ZXJzaW9uKXJldHVybiB0aGlzLl9ib3dzZXIuc2F0aXNmaWVzKHIpfWlzVmVyc2lvbkdyZWF0ZXJUaGFuKHIpe3JldHVybiB0aGlzLl9jaGVja0NvbmRpdGlvbih7W3RoaXMuX25hbWVdOmA+JHtyfWB9KX1pc1ZlcnNpb25MZXNzVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPCR7cn1gfSl9aXNWZXJzaW9uRXF1YWxUbyhyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgfiR7cn1gfSl9fWNsYXNzIHBkIGV4dGVuZHMgdWR7ZG9lc1ZpZGVvTXV0ZUJ5U3RyZWFtUmVtb3ZlKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzUDJQKCl7cmV0dXJuIXRoaXMudXNlc1VuaWZpZWRQbGFuKCl9aXNDaHJvbWl1bUJhc2VkKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWUoKXx8dGhpcy5pc0VsZWN0cm9uKCl8fHRoaXMuaXNOV0pTKCl8fHRoaXMuaXNPcGVyYSgpfWlzV2ViS2l0QmFzZWQoKXtyZXR1cm4gdGhpcy5fYm93c2VyLmlzRW5naW5lKCJ3ZWJraXQiKSYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEhPSJ1bmRlZmluZWQiJiZ0eXBlb2Ygd2luZG93LlJUQ1J0cFRyYW5zY2VpdmVyIT0idW5kZWZpbmVkIiYmT2JqZWN0LmtleXMoUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJjdXJyZW50RGlyZWN0aW9uIik+LTF9aXNTdXBwb3J0ZWQoKXtyZXR1cm4gdHlwZW9mIFJUQ1BlZXJDb25uZWN0aW9uIT0idW5kZWZpbmVkIn1pc1VzZXJJbnRlcmFjdGlvblJlcXVpcmVkRm9yVW5tdXRlKCl7cmV0dXJuIHRoaXMuaXNGaXJlZm94KCkmJnRoaXMuaXNWZXJzaW9uTGVzc1RoYW4oIjY4Iil9c3VwcG9ydHNWaWRlb011dGVPbkNvbm5JbnRlcnJ1cHRlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNCYW5kd2lkdGhTdGF0aXN0aWNzKCl7cmV0dXJuIXRoaXMuaXNGaXJlZm94KCkmJiF0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0NvZGVjUHJlZmVyZW5jZXMoKXtyZXR1cm4gdGhpcy51c2VzVW5pZmllZFBsYW4oKSYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoInNldENvZGVjUHJlZmVyZW5jZXMiKT4tMSYmT2JqZWN0LmtleXMoUlRDUnRwU2VuZGVyLnByb3RvdHlwZSkuaW5kZXhPZigiZ2V0Q2FwYWJpbGl0aWVzIik+LTEmJiF0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0RldmljZUNoYW5nZUV2ZW50KCl7cmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLm9uZGV2aWNlY2hhbmdlIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuYWRkRXZlbnRMaXN0ZW5lciE9InVuZGVmaW5lZCJ9c3VwcG9ydHNMb2NhbENhbmRpZGF0ZVJ0dFN0YXRpc3RpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzUGVyZm9ybWFuY2VPYnNlcnZlcigpe3JldHVybiB0eXBlb2Ygd2luZG93LlBlcmZvcm1hbmNlT2JzZXJ2ZXIhPSJ1bmRlZmluZWQiJiZQZXJmb3JtYW5jZU9ic2VydmVyLnN1cHBvcnRlZEVudHJ5VHlwZXMuaW5kZXhPZigibG9uZ3Rhc2siKT4tMX1zdXBwb3J0c1JlY2VpdmVyU3RhdHMoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5SVENSdHBSZWNlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFJlY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiZ2V0U3luY2hyb25pemF0aW9uU291cmNlcyIpPi0xfXN1cHBvcnRzUlRUU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpfXVzZXNQbGFuQigpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfXVzZXNTZHBNdW5naW5nRm9yU2ltdWxjYXN0KCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX11c2VzVW5pZmllZFBsYW4oKXtyZXR1cm4hISh0aGlzLmlzRmlyZWZveCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKSl9dXNlc05ld0d1bUZsb3coKXtyZXR1cm4hISh0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzRmlyZWZveCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKSl9dXNlc0FkYXB0ZXIoKXtyZXR1cm4gdGhpcy51c2VzTmV3R3VtRmxvdygpfXVzZXNSaWRzRm9yU2ltdWxjYXN0KCl7cmV0dXJuITF9c3VwcG9ydHNHZXREaXNwbGF5TWVkaWEoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvci5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifHx0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYSE9InVuZGVmaW5lZCJ9c3VwcG9ydHNJbnNlcnRhYmxlU3RyZWFtcygpe2lmKCEodHlwZW9mIHdpbmRvdy5SVENSdHBTZW5kZXIhPSJ1bmRlZmluZWQiJiYod2luZG93LlJUQ1J0cFNlbmRlci5wcm90b3R5cGUuY3JlYXRlRW5jb2RlZFN0cmVhbXN8fHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRWaWRlb1N0cmVhbXMpKSlyZXR1cm4hMTtjb25zdCByPW5ldyBSZWFkYWJsZVN0cmVhbTt0cnl7cmV0dXJuIHdpbmRvdy5wb3N0TWVzc2FnZShyLCIqIixbcl0pLCEwfWNhdGNoKGUpe3JldHVybiExfX1zdXBwb3J0c0F1ZGlvUmVkKCl7cmV0dXJuIEJvb2xlYW4od2luZG93LlJUQ1J0cFNlbmRlciYmd2luZG93LlJUQ1J0cFNlbmRlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzKCJhdWRpbyIpLmNvZGVjcy5zb21lKHI9PnIubWltZVR5cGU9PT0iYXVkaW8vcmVkIikmJndpbmRvdy5SVENSdHBSZWNlaXZlciYmd2luZG93LlJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcyYmd2luZG93LlJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpKX1zdXBwb3J0c1NkcFNlbWFudGljcygpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfV9nZXRDaHJvbWl1bUJhc2VkVmVyc2lvbigpe2lmKHRoaXMuaXNDaHJvbWl1bUJhc2VkKCkpe2lmKHRoaXMuaXNOV0pTKCkpcmV0dXJuIE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLmNocm9taXVtLDEwKTtjb25zdCByPW5hdmlnYXRvci51c2VyQWdlbnQ7aWYoci5tYXRjaCgvQ2hyb21lLykpcmV0dXJuIE51bWJlci5wYXJzZUludChyLm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV0sMTApfXJldHVybi0xfWlzSU9TTW9iaWxlKCl7cmV0dXJuIHRoaXMuaXNNb2JpbGUmJnRoaXMuX2Jvd3Nlci5nZXRPU05hbWUoKT09PSJpT1MifX1jb25zdCBoZD1uZXcgcGQ7Y2xhc3MgZmR7Y29uc3RydWN0b3IoKXtwKHRoaXMsImxvZ3NDYWNoZSIsW10pO3AodGhpcywibG9nc1Byb2Nlc3NvclRpbWVyIik7cCh0aGlzLCJ0cmFjaW5nRW5hYmxlZCIsITApO3AodGhpcywiaW5pdGlhbGl6ZWQiLCExKTtwKHRoaXMsImxvZ3NQcm9jZXNzaW5nSW50ZXJ2YWwiLDdlMyk7cCh0aGlzLCJsb2dFeGNsdXNpb25MaXN0IixbIm1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbWVzc2FnZSIsInJvb21NZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbWVzc2FnZSIsIndlYnNvY2tldC9yb29tLWxlZ2FjeS1tb2RlIiwiY2hhdE1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbmV3LWNoYXQtbWVzc2FnZSIsIndlYnNvY2tldC9uby1hY3RpdmUtc3BlYWtlciIsIndlYnNvY2tldC9zZWxlY3RlZC1wZWVycyIsIndlYnNvY2tldC9hY3RpdmUtc3BlYWtlciIsInBpbmciLCJ3ZWJzb2NrZXQvbmV3LWNvbnN1bWVyIiwid2Vic29ja2V0L3Byb2R1Y2VyLXNjb3JlIiwid2Vic29ja2V0L2NvbnN1bWVyLXNjb3JlIiwid2Vic29ja2V0L3BsdWdpbi1ldmVudCIsIndlYnNvY2tldC9wbHVnaW4tZGF0YSIsIndlYnNvY2tldC9wbHVnaW4taW50ZXJuYWwtZGF0YSJdKTtwKHRoaXMsIm1lZXRpbmdNZXRhZGF0YSIse30pfWdldCBsb2dzRW5kcG9pbnQoKXtjb25zdCByPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtyZXR1cm5gaHR0cHM6Ly8ke1FjKHtzZXJ2aWNlUHJlZml4OiJhcGktc2lsb3MiLGJhc2VVUkk6ci5nZXRWYWx1ZSgiYmFzZVVSSSIpfSl9L290ZWwvbG9nc2B9cmVzZXRQZWVySWQocil7dGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkPXJ9aW5pdChyLGUscyl7dGhpcy50cmFjaW5nRW5hYmxlZD0hMCx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMubG9nc0NhY2hlPVtdO2NvbnN0IG49ci5nZXRWYWx1ZSgicGVlcklkIik7dGhpcy5tZWV0aW5nTWV0YWRhdGE9ZSx0aGlzLnRyYWNpbmdFbmFibGVkPXMsdGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkPW4sdGhpcy5tZWV0aW5nTWV0YWRhdGEuc2RrVmVyc2lvbj1yLmdldFZhbHVlKCJzZGtWZXJzaW9uIik7Y29uc3R7Uk5EZXZpY2VJbmZvSW1wbDppfT1uYXZpZ2F0b3I7dGhpcy5tZWV0aW5nTWV0YWRhdGEuZGV2aWNlSW5mbz1uYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT9pPT1udWxsP3ZvaWQgMDppLmdldERldmljZUluZm8oKTpoZC5nZXREZXZpY2VJbmZvKCksdGhpcy5tZWV0aW5nTWV0YWRhdGEudmlzaXRlZFVybD0hbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cubG9jYXRpb24uaHJlZix0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcj1zZXRJbnRlcnZhbCh0aGlzLnByb2Nlc3NDYWNoZWRMb2dzLmJpbmQodGhpcyksdGhpcy5sb2dzUHJvY2Vzc2luZ0ludGVydmFsKSxzJiYodGhpcy5pbml0aWFsaXplZD0hMCl9c3RhdGljIHRyYWNlKHIsZT12b2lkIDApe3JldHVybihzLG4saSk9Pntjb25zdCBhPWkudmFsdWU7cmV0dXJuIGkudmFsdWU9ZnVuY3Rpb24oLi4ubyl7dmFyIEU7Y29uc3QgbD10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLnRlbGVtZXRyeTtpZighbHx8IWwuaW5pdGlhbGl6ZWR8fG5hdmlnYXRvci5pc1JlYWN0TmF0aXZlfHwhbC50cmFjaW5nRW5hYmxlZHx8KEU9UGUuZ2V0Q29udGV4dChsLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpKSE9bnVsbCYmRS5nZXRWYWx1ZSgiZmxhZ3NtaXRoIikuaGFzRmVhdHVyZSh6dC5TS0lQX09URUxfVFJBQ0VTKSlyZXR1cm4gYS5hcHBseSh0aGlzLG8pO2wuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlKTtjb25zdCBtPXBlcmZvcm1hbmNlLm5vdygpLHY9YS5hcHBseSh0aGlzLG8pO3JldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbigoKT0+e2NvbnN0IHc9cGVyZm9ybWFuY2Uubm93KCk7dy1tPjEwJiZsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3J9X3RpbWluZ2Ase2V4ZWNUaW1lOnctbX0pfSkuY2F0Y2goKCk9Pntjb25zdCB3PXBlcmZvcm1hbmNlLm5vdygpO2wuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsYCR7cn1fdGltaW5nYCx7ZXhlY1RpbWU6dy1tfSl9KSx2fSxpfX1pbmplY3RDb250ZXh0KHIpe3ZhciBuO2NvbnN0IGU9S2MoKS5yZXBsYWNlKC8tL2csIiIpLnN1YnN0cmluZygwLDE2KSxzPShuPXRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk9PW51bGw/dm9pZCAwOm4ucmVwbGFjZSgvLS9nLCIiKTtyLlRSQUNFUEFSRU5UPWAwMC0ke3N9LSR7ZX0tMDFgfWFkZExvZ0luQ3VycmVudFNwYW4ocixlLHM9e30sbj0hMSl7cyE9bnVsbCYmcy5lcnJvciYmT2JqZWN0LmFzc2lnbihzLHtlcnJvcjpSdChzLmVycm9yKX0pO2NvbnN0IGk9UGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO2lmKFhjKGkpJiYoWWMocyk/Y29uc29sZVtyXSgiSW50ZXJuYWxMb2dzOjogIixyLGUpOmNvbnNvbGVbcl0oIkludGVybmFsTG9nczo6ICIscixlLHMpKSwhIVpjKGkscikpdHJ5e2NvbnN0IGQ9RHMoaSxlLHMsIm1ldGFkYXRhIiksbz1uZXcgRGF0ZSxsPW90KFEoe21lc3NhZ2U6ZSxsZXZlbDpyfSxkKSx7bG9nZ2VkQXQ6by50b0lTT1N0cmluZygpLGxvZ2dlZEF0VHpPZmZzZXQ6by5nZXRUaW1lem9uZU9mZnNldCgpfSk7bj90aGlzLnNlbmRPdGVsTG9nc1RvTmV3UmVsaWMoW2xdKTp0aGlzLmxvZ3NDYWNoZS5wdXNoKGwpfWNhdGNoKGQpe3RoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjphZGRMb2dJbkN1cnJlbnRTcGFuX2ZhaWxlZCIse2Vycm9yOlJ0KGQpfSl9fXNlbmRPdGVsTG9nc1RvTmV3UmVsaWMocil7Y29uc3QgZT1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7ZmV0Y2godGhpcy5sb2dzRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLEF1dGhvcml6YXRpb246YEJlYXJlciAke2UuZ2V0VmFsdWUoImF1dGhUb2tlbiIpfWB9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe21lZXRpbmdNZXRhZGF0YTpEcyhlLCJzZW5kT3RlbExvZ3NUb05ld1JlbGljIix0aGlzLm1lZXRpbmdNZXRhZGF0YSwibWVldGluZ01ldGFkYXRhIiksc2VydmljZU5hbWU6ZS5nZXRWYWx1ZSgic2RrTmFtZSIpLGxvZ3M6cn0pfSkuY2F0Y2gocz0+e3RoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6UnQocyl9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnIpfSl9cHJvY2Vzc0NhY2hlZExvZ3MoKXtjb25zdCByPXRoaXMubG9nc0NhY2hlLnNwbGljZSgwLDI1KTtyIT1udWxsJiZyLmxlbmd0aCYmdGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKHIpfWRlc3RydWN0KCl7Y2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lciksdGhpcy5wcm9jZXNzQ2FjaGVkTG9ncygpfX1mdW5jdGlvbiBtZCh0KXtjb25zdCByPVEoe30sdCksZT1uZXcgTWFwLHM9KGwsbSk9PihlLmhhcyhsKXx8ZS5zZXQobCxuZXcgU2V0KSxlLmdldChsKS5hZGQobSksKCk9Pnt2YXIgdjtyZXR1cm4odj1lLmdldChsKSk9PW51bGw/dm9pZCAwOnYuZGVsZXRlKG0pfSksbj0obCxtKT0+e3ZhciB2Oyh2PWUuZ2V0KGwpKT09bnVsbHx8di5kZWxldGUobSl9LGk9bD0+e3ZhciBtOyhtPWUuZ2V0KGwpKT09bnVsbHx8bS5mb3JFYWNoKHY9Pnt0cnl7dihyW2xdKX1jYXRjaChFKXt9fSl9O3JldHVybntzdWJzY3JpYmU6cyx1bnN1YnNjcmliZTpuLG5vdGlmeTppLHNldFZhbHVlOihsLG0sdj0hMCk9PntyW2xdPW0sdiYmaShsKX0sZ2V0VmFsdWU6bD0+cltsXSxnZXRBbGxWYWx1ZXM6KCk9PnJ9fWNsYXNzIGdke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJjb250ZXh0cyIsbmV3IE1hcCk7cCh0aGlzLCJtb3N0UmVjZW50UGVlcklkIixudWxsKX1jcmVhdGVDb250ZXh0KHIsZSl7aWYodGhpcy5jb250ZXh0cy5oYXMocikpcmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHIpO2NvbnN0IHM9bmV3IGZkLG49bmV3IEJjO3RoaXMuY29udGV4dHMuc2V0KHIsbWQoZSkpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJwZWVyU2Vzc2lvblN0b3JlIixuZXcgS3QobikpO2NvbnN0IGk9bmV3IE5yO3JldHVybiBpLnNldE1heExpc3RlbmVycyg1MCksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoImxvZ2dlciIsbiksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoInRlbGVtZXRyeSIscyksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoImNhbGxzdGF0cyIsaSksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoImZsYWdzbWl0aCIsTWMoKSksdGhpcy5tb3N0UmVjZW50UGVlcklkPXIsdGhpcy5jb250ZXh0cy5nZXQocil9cmVtYXBDb250ZXh0KHIsZSl7Y29uc3Qgcz1lLmdldFZhbHVlKCJwZWVySWQiKTtzIT09ciYmKGUuc2V0VmFsdWUoInBlZXJJZCIsciksdGhpcy5tb3N0UmVjZW50UGVlcklkPXIsdGhpcy5jb250ZXh0cy5zZXQocixlKSx0aGlzLmNvbnRleHRzLmRlbGV0ZShzKSl9Z2V0Q29udGV4dChyKXtyZXR1cm4gdGhpcy5jb250ZXh0cy5nZXQocil9Z2V0TW9zdFJlY2VudFBlZXJJZCgpe3JldHVybiB0aGlzLm1vc3RSZWNlbnRQZWVySWR9fXZhciBQZT1uZXcgZ2Q7Y29uc3QgU2Q9eyIwMCI6IkNsaWVudCIsIjAxIjoiQ29udHJvbGxlciIsIjAyIjoiUm9vbU5vZGVDbGllbnQiLCIwMyI6IkhpdmVOb2RlQ2xpZW50IiwiMDQiOiJTb2NrZXRTZXJ2aWNlIiwiMDUiOiJDaGF0IiwiMDYiOiJQbHVnaW4iLCIwNyI6IlBvbGxzIiwiMDgiOiJNZXRhIiwiMDkiOiJQcmVzZXQiLDEwOiJSZWNvcmRpbmciLDExOiJTZWxmIiwxMjoiUGFydGljaXBhbnQiLDEzOiJTcG90bGlnaHQiLDE0OiJSZW1vdGUgUmVxdWVzdCIsMTU6IldlYmluYXIiLDE2OiJMb2NhbE1lZGlhSGFuZGxlciIsMTc6IkVuZC1FbmQgRW5jcnlwdGlvbiIsMTg6IkFJIiwxOToiTGl2ZXN0cmVhbSIsMjA6IlN0YWdlIn0sQ3Q9eyIwMDAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uLiIsIjAwMDEiOiJGYWlsZWQgdG8gaW5pdGlhbGl6ZS4iLCIwMDAyIjoiRmFpbGVkIHRvIGpvaW4gcm9vbS4iLCIwMDAzIjoiRmFpbGVkIHRvIGxlYXZlIHJvb20uIiwiMDAwNCI6IkludmFsaWQgYXV0aCB0b2tlbiIsIjAwMTAiOiJCcm93c2VyIG5vdCBzdXBwb3J0ZWQiLCIwMDExIjoiSFRUUCBOZXR3b3JrIEVycm9yIiwiMDAxMiI6IldlYnNvY2tldCBOZXR3b3JrIEVycm9yIiwiMDAxMyI6IlJhdGUgTGltaXRlZCIsIjAxMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwMTAxIjoiUGVybWlzc2lvbiBkZW5pZWQiLCIwMTAyIjoiUHJlcmVxdWlzaXRlIG1vZHVsZSBtaXNzaW5nIiwiMDIwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDQiOiJNaXNzaW5nIHByZXJlcXVpc2l0ZXMgdG8gZXN0YWJsaXNoIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24iLCIwNTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDUwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA1MDIiOiJJbnZhbGlkIG1lc3NhZ2UgYm9keS4iLCIwNTAzIjoiVGV4dCBNZXNzYWdlIGlzIHRvbyBsYXJnZSIsIjA1MDQiOiJNZXNzYWdlIG5vdCBmb3VuZCBieSB0aGUgZ2l2ZW4gaWQiLCIwNTA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwNTA2IjoiTWVzc2FnZSBzZWFyY2ggaXMgZGlzYWJsZWQiLCIwNjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDYwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA2MDIiOiJBdXRoIHRva2VuIG5vdCBzZXQgZm9yIHBsdWdpbiIsIjA2MDMiOiJJZnJhbWUgd2FzIG5vdCBwcm92aWRlZCIsIjA3MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNzA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwODAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDgwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDkwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA5MDQiOiJDb3VsZCBub3QgbG9hZCBwcmVzZXQiLDFlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTAwNDoiQ291bGQgbm90IGZpbmQgc3BlY2lmaWVkIHJlY29yZGluZyIsMTAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gZ2l2ZW4gcmVjb3JkaW5nIHN0YXRlIiwxMTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDExMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMTAyOiJVbnN1cHBvcnRlZCIsMTEwMzoiTmFtZSBjYW5ub3QgYmUgZW1wdHkiLDExMDQ6Ik5vIGRldmljZSBzZWxlY3RlZCB3aGlsZSBjYWxsaW5nIG1lZXRpbmcuc2VsZi5zZXREZXZpY2UiLDExMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMTA2OiJDYW4ndCBzZXQgY3VycmVudGx5IHVzZWQgZGV2aWNlIiwxMjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDEyMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMjAyOiJJbnZhbGlkIHBhZ2UgbnVtYmVyIHdhcyByZXF1ZXN0ZWQiLDEyMDM6IkludmFsaWQgcGFydGljaXBhbnQgY291bnQgcGVyIHBhZ2Ugd2FzIHJlcXVlc3RlZCIsMTIwNDoiTm8gcGFydGljaXBhbnRzIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBVc2VySWRzIiwxMjA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTIwNjoiTWFudWFsIFN1YnNjcmlwdGlvbiBNb2RlIHdhcyBub3QgQUNUSVZBVEVEIiwxMjA3OiJJbnZhbGlkIHZpZXcgbW9kZSIsMTIwODoiTWFudWFsIFN1YnNjcmlwdGlvbiBub3QgZW5hYmxlZCBmb3Igb3JnYW5pemF0aW9uIiwxMjA5OiJCcm9hZGNhc3QgbWVzc2FnZSB0eXBlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIiwxMzAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMjoiTm8gZXhpc3RpbmcgcmVtb3RlIHJlcXVlc3RzIiwxNDAzOiJObyBwZWVyIGV4aXN0cyB3aXRoIGdpdmVuIGlkIiwxNTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMToiRmFpbGVkIHRvIGdldCBhdWRpbyB0cmFjayIsMTYwMjoiRmFpbGVkIHRvIGdldCB2aWRlbyB0cmFjayIsMTYwMzoiSW5jb3JyZWN0IGRldmljZSIsMTYwNDoiRmFpbGVkIHRvIGNoYW5nZSBkZXZpY2UiLDE2MDU6IkZhaWxlZCB0byBnZXQgYXVkaW8gJiB2aWRlbyB0cmFjayIsMTYwNjoiTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA3OiJObyB2aWRlbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDg6Ik5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIChzcGVha2VycykgYXJlIGF2YWlsYWJsZSIsMTYwOToiRmFpbGVkIHRvIGZldGNoIGxpc3Qgb2YgbWVkaWEgZGV2aWNlcyIsMTYxMDoiTm8gbWVkaWEgdHJhY2sgZXhpc3RzIiwxNjExOiJGYWlsZWQgdG8gdW5tdXRlIHRyYWNrIiwxNjEyOiJGYWlsZWQgdG8gZ2V0IHNjcmVlbnNoYXJlIHRyYWNrcyIsMTcwMToiQ3J5cHRvIGVycm9yIiwxODAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE4MDE6IkNhbid0IGZldGNoIHRyYW5zY3JpcHQgZmlsZSIsMTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxOTAxOiJQZXJtaXNzaW9uIGRlbmllZC4iLDE5MDI6IkxpdmVzdHJlYW0gdGhhdCBoYXMgbm90IHlldCBzdGFydGVkLCBjYW4ndCBiZSBzdG9wcGVkIiwyZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMjAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDIwMDI6IlVuc3VwcG9ydGVkIiwyMDAzOiJTdGFnZSBpcyBkaXNhYmxlZCIsMjAwNDoiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsMjAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDIwMDY6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIiw5OTAwOiJJbnRlcm5hbCBleGNlcHRpb24ifTtPYmplY3Qua2V5cyhDdCkuZm9yRWFjaCh0PT57Q3RbdF09YHske1NkW3Quc2xpY2UoMCwyKV19fSAke0N0W3RdfWB9KTtjbGFzcyB2ZCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUscyxuPXZvaWQgMCxpPSExKXtzdXBlcihlKTtwKHRoaXMsImNvZGUiKTt0aGlzLmNvZGU9cyx0aGlzLm5hbWU9IkNsaWVudEVycm9yIjtjb25zdCBhPXRoaXMuY29kZT9gW0VSUiR7dGhpcy5jb2RlfV1gOiJbRVJSXSIsZD10aGlzLmNvZGU/Q3RbdGhpcy5jb2RlXToiIjt0aGlzLm1lc3NhZ2U9YCR7YX06ICR7ZH0KJHt0aGlzLm1lc3NhZ2V9YDt0cnl7bGV0IG89aSYmISFuO3MmJnMuZW5kc1dpdGgoIjAwIikmJm4mJihvPSEwKSxvJiZuLmVycm9yKCJDbGllbnRFcnJvciIse2Vycm9yOnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxjb2RlOnN9fSk7Y29uc3QgbD1QZS5nZXRDb250ZXh0KFBlLmdldE1vc3RSZWNlbnRQZWVySWQoKSk7aWYobCl7Y29uc3QgbT1sLmdldFZhbHVlKCJvbkVycm9yIik7dHJ5e20odGhpcyl9Y2F0Y2godil7fX10eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJDbGllbnRFcnJvciIse2RldGFpbDp0aGlzfSkpfWNhdGNoKG8pe319fXZhciBmZT0odD0+KHRbdC5JbnZhbGlkS2V5PTBdPSJJbnZhbGlkS2V5Iix0W3QuTWlzc2luZ0tleT0xXT0iTWlzc2luZ0tleSIsdFt0LkludGVybmFsRXJyb3I9Ml09IkludGVybmFsRXJyb3IiLHQpKShmZXx8e30pO2NsYXNzIG1lIGV4dGVuZHMgdmR7Y29uc3RydWN0b3IoZSxzPTIpe3N1cGVyKGUsIjE3MDEiKTtwKHRoaXMsInJlYXNvbiIpO3RoaXMucmVhc29uPXN9fWNsYXNzIEtzIGV4dGVuZHMgcS5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtwKHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsc3VwZXIuc2V0TWF4TGlzdGVuZXJzKDI1KX1lbWl0KGUsLi4ucyl7cmV0dXJuIHN1cGVyLmVtaXQoIioiLGUsLi4ucyksc3VwZXIuZW1pdChlLC4uLnMpfW9uKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLm9uKGUscyl9YWRkTGlzdGVuZXIoZSxzKXt2YXIgbjt0cnl7Y29uc3QgaT10aGlzLmxpc3RlbmVyQ291bnQoZSk7aT4yNSYmaSUyNT09PTAmJigobj10aGlzLmxvZ2dlcik9PW51bGx8fG4ud2FybigiQ3VzdG9tRXZlbnRFbWl0dGVyOjptYXhMaXN0ZW5lcnNFeGNlZWRlZCIse2V2ZW50TGlzdGVuZXI6e2V2ZW50TmFtZTplLnRvU3RyaW5nKCksbGlzdGVuZXJDb3VudDp0aGlzLmxpc3RlbmVyQ291bnQoZSl9fSkpfWNhdGNoKGkpe31yZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIoZSxzKX1vZmYoZSxzKXtyZXR1cm4gc3VwZXIub2ZmKGUscyl9b25jZShlLHMpe3JldHVybiBzdXBlci5vbmNlKGUscyl9cHJlcGVuZExpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRMaXN0ZW5lcihlLHMpfXByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucHJlcGVuZE9uY2VMaXN0ZW5lcihlLHMpfXJlbW92ZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKGUscyl9cmVtb3ZlQWxsTGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSl9bGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5saXN0ZW5lcnMoZSl9bGlzdGVuZXJDb3VudChlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJDb3VudChlKX19Y29uc3QgcXQ9e0Vycm9yOiJjcnlwdG9yRXJyb3IifTtmdW5jdGlvbiB5ZCh0KXtyZXR1cm4idHlwZSJpbiB0fWZ1bmN0aW9uIGJkKHMpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih0LHI9e25hbWU6a30sZT0iZW5jcnlwdCIpe3JldHVybiBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3Iix0LHIsITEsZT09PSJkZXJpdmUiP1siZGVyaXZlQml0cyIsImRlcml2ZUtleSJdOlsiZW5jcnlwdCIsImRlY3J5cHQiXSl9KX1mdW5jdGlvbiBXcyh0LHIpe2NvbnN0IHM9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHIpO3N3aXRjaCh0KXtjYXNlIkhLREYiOnJldHVybntuYW1lOiJIS0RGIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaW5mbzpuZXcgQXJyYXlCdWZmZXIoMTI4KX07Y2FzZSJQQktERjIiOnJldHVybntuYW1lOiJQQktERjIiLHNhbHQ6cyxoYXNoOiJTSEEtMjU2IixpdGVyYXRpb25zOjFlNX07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGFsZ29yaXRobSAke3R9IGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZGApfX1mdW5jdGlvbiB6cyh0LHIpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPVdzKHQuYWxnb3JpdGhtLm5hbWUscikscz15aWVsZCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShlLHQse25hbWU6ayxsZW5ndGg6MTI4fSwhMSxbImVuY3J5cHQiLCJkZWNyeXB0Il0pO3JldHVybnttYXRlcmlhbDp0LGVuY3J5cHRpb25LZXk6c319KX1mdW5jdGlvbiBFZCh0LHIpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPVdzKHQuYWxnb3JpdGhtLm5hbWUscik7cmV0dXJuIGNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyhlLHQsMjU2KX0pfWNsYXNzIF9kIGV4dGVuZHMgS3N7fWNsYXNzIEdzIGV4dGVuZHMgX2R7Y29uc3RydWN0b3IoZSl7dmFyIHM7c3VwZXIodm9pZCAwKTtwKHRoaXMsInNlbmRDb3VudHMiKTtwKHRoaXMsImlzS2V5SW52YWxpZCIsITEpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3AodGhpcywidHJhY2tJZCIpO3AodGhpcywia2V5cyIpO3AodGhpcywidmlkZW9Db2RlYyIpO3AodGhpcywicnRwTWFwIik7cCh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTtwKHRoaXMsInVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlciIpO3RoaXMuc2VuZENvdW50cz1uZXcgTWFwLHRoaXMua2V5cz1lLmtleXMsdGhpcy5wYXJ0aWNpcGFudElkPWUucGFydGljaXBhbnRJZCx0aGlzLnJ0cE1hcD1uZXcgTWFwLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zPWUua2V5UHJvdmlkZXJPcHRpb25zLHRoaXMudW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyPShzPWUudW5lbmNyeXB0ZWRGcmFtZUJ5dGVzKSE9bnVsbD9zOm5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiTEtST0NLUyIpfXNldFBhcnRpY2lwYW50KGUscyl7dGhpcy5wYXJ0aWNpcGFudElkPWUsdGhpcy5rZXlzPXN9dW5zZXRQYXJ0aWNpcGFudCgpe3RoaXMucGFydGljaXBhbnRJZD12b2lkIDB9Z2V0UGFydGljaXBhbnRJZCgpe3JldHVybiB0aGlzLnBhcnRpY2lwYW50SWR9Z2V0VHJhY2tJZCgpe3JldHVybiB0aGlzLnRyYWNrSWR9c2V0VmlkZW9Db2RlYyhlKXt0aGlzLnZpZGVvQ29kZWM9ZX1zZXRSdHBNYXAoZSl7dGhpcy5ydHBNYXA9ZX1zZXR1cFRyYW5zZm9ybShlLHMsbixpLGEpe2EmJih0aGlzLnZpZGVvQ29kZWM9YSk7Y29uc3QgZD1lPT09ImVuY29kZSI/dGhpcy5lbmNvZGVGdW5jdGlvbjp0aGlzLmRlY29kZUZ1bmN0aW9uLG89bmV3IFRyYW5zZm9ybVN0cmVhbSh7dHJhbnNmb3JtOmQuYmluZCh0aGlzKX0pO3MucGlwZVRocm91Z2gobykucGlwZVRvKG4pLmNhdGNoKGw9Pnt0aGlzLmVtaXQoImNyeXB0b3JFcnJvciIsbCBpbnN0YW5jZW9mIG1lP2w6bmV3IG1lKGwubWVzc2FnZSkpfSksdGhpcy50cmFja0lkPWl9ZW5jb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGE7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3R7ZW5jcnlwdGlvbktleTpufT10aGlzLmtleXMuZ2V0S2V5U2V0KCksaT10aGlzLmtleXMuZ2V0Q3VycmVudEtleUluZGV4KCk7aWYobil7Y29uc3QgZD10aGlzLm1ha2VJVigoYT1lLmdldE1ldGFkYXRhKCkuc3luY2hyb25pemF0aW9uU291cmNlKSE9bnVsbD9hOi0xLGUudGltZXN0YW1wKSxvPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksbD1uZXcgVWludDhBcnJheSgyKTtsWzBdPWRlLGxbMV09aTt0cnl7Y29uc3QgbT15aWVsZCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoe25hbWU6ayxpdjpkLGFkZGl0aW9uYWxEYXRhOm5ldyBVaW50OEFycmF5KGUuZGF0YSwwLG8uYnl0ZUxlbmd0aCl9LG4sbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSkpLHY9bmV3IEFycmF5QnVmZmVyKG8uYnl0ZUxlbmd0aCttLmJ5dGVMZW5ndGgrZC5ieXRlTGVuZ3RoK2wuYnl0ZUxlbmd0aCksRT1uZXcgVWludDhBcnJheSh2KTtyZXR1cm4gRS5zZXQobyksRS5zZXQobmV3IFVpbnQ4QXJyYXkobSksby5ieXRlTGVuZ3RoKSxFLnNldChuZXcgVWludDhBcnJheShkKSxvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoKSxFLnNldChsLG8uYnl0ZUxlbmd0aCttLmJ5dGVMZW5ndGgrZC5ieXRlTGVuZ3RoKSxlLmRhdGE9dixzLmVucXVldWUoZSl9Y2F0Y2gobSl7fX1lbHNlIHRoaXMuZW1pdChxdC5FcnJvcixuZXcgbWUoImVuY3J5cHRpb24ga2V5IG1pc3NpbmcgZm9yIGVuY29kaW5nIixmZS5NaXNzaW5nS2V5KSl9KX1kZWNvZGVGdW5jdGlvbihlLHMpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZighdGhpcy5rZXlzLmlzRW5hYmxlZCgpfHxlLmRhdGEuYnl0ZUxlbmd0aD09PTB8fFRkKGUuZGF0YSx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcikpcmV0dXJuIHMuZW5xdWV1ZShlKTtjb25zdCBpPW5ldyBVaW50OEFycmF5KGUuZGF0YSlbZS5kYXRhLmJ5dGVMZW5ndGgtMV07aWYodGhpcy5rZXlzLmdldEtleVNldChpKSl0cnl7Y29uc3QgYT15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLGkpO2lmKGEpcmV0dXJuIHMuZW5xdWV1ZShhKTt0aGlzLmlzS2V5SW52YWxpZD0hMX1jYXRjaChhKXthIGluc3RhbmNlb2YgbWUmJmEucmVhc29uPT09ZmUuSW52YWxpZEtleSYmKHRoaXMuaXNLZXlJbnZhbGlkfHwodGhpcy5lbWl0KHF0LkVycm9yLG5ldyBtZShgaW52YWxpZCBrZXkgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsZmUuSW52YWxpZEtleSkpLHRoaXMuaXNLZXlJbnZhbGlkPSEwKSl9ZWxzZSB0aGlzLmVtaXQocXQuRXJyb3IsbmV3IG1lKGBrZXkgbWlzc2luZyBmb3IgcGFydGljaXBhbnQgJHt0aGlzLnBhcnRpY2lwYW50SWR9YCxmZS5NaXNzaW5nS2V5KSk7cmV0dXJuIHMuZW5xdWV1ZShlKX0pfWRlY3J5cHRGcmFtZShhLGQpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihlLHMsbj12b2lkIDAsaT17cmF0Y2hldENvdW50OjB9KXt2YXIgbDtjb25zdCBvPXRoaXMua2V5cy5nZXRLZXlTZXQocyk7dHJ5e2NvbnN0IG09bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSx2PW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC0yLDIpLEU9dlswXSx3PW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC1FLXYuYnl0ZUxlbmd0aCxFKSx4PW0uYnl0ZUxlbmd0aCwkPWUuZGF0YS5ieXRlTGVuZ3RoLShtLmJ5dGVMZW5ndGgrRSt2LmJ5dGVMZW5ndGgpLEY9eWllbGQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtuYW1lOmssaXY6dyxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxtLmJ5dGVMZW5ndGgpfSwobD1pLmVuY3J5cHRpb25LZXkpIT1udWxsP2w6by5lbmNyeXB0aW9uS2V5LG5ldyBVaW50OEFycmF5KGUuZGF0YSx4LCQpKSxIPW5ldyBBcnJheUJ1ZmZlcihtLmJ5dGVMZW5ndGgrRi5ieXRlTGVuZ3RoKSxaPW5ldyBVaW50OEFycmF5KEgpO3JldHVybiBaLnNldChuZXcgVWludDhBcnJheShlLmRhdGEsMCxtLmJ5dGVMZW5ndGgpKSxaLnNldChuZXcgVWludDhBcnJheShGKSxtLmJ5dGVMZW5ndGgpLGUuZGF0YT1ILGV9Y2F0Y2gobSl7aWYodGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemU+MCl7aWYoaS5yYXRjaGV0Q291bnQ8dGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemUpe2xldCB2O2lmKG89PT10aGlzLmtleXMuZ2V0S2V5U2V0KHMpKXtjb25zdCB3PXlpZWxkIHRoaXMua2V5cy5yYXRjaGV0S2V5KHMsITEpO3Y9eWllbGQgenModyx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCl9Y29uc3QgRT15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLHMsbnx8byx7cmF0Y2hldENvdW50OmkucmF0Y2hldENvdW50KzEsZW5jcnlwdGlvbktleTp2PT1udWxsP3ZvaWQgMDp2LmVuY3J5cHRpb25LZXl9KTtyZXR1cm4gRSYmdiYmKHRoaXMua2V5cy5zZXRLZXlTZXQodixzLCEwKSx0aGlzLmtleXMuc2V0Q3VycmVudEtleUluZGV4KHMpKSxFfW4mJnRoaXMua2V5cy5zZXRLZXlGcm9tTWF0ZXJpYWwobi5tYXRlcmlhbCxzKX1lbHNlIHRocm93IG5ldyBtZSgiRGVjcnlwdGlvbiBmYWlsZWQsIG1vc3QgbGlrZWx5IGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBrZXkiLGZlLkludmFsaWRLZXkpfX0pfW1ha2VJVihlLHMpe3ZhciBkO2NvbnN0IG49bmV3IEFycmF5QnVmZmVyKGRlKSxpPW5ldyBEYXRhVmlldyhuKTt0aGlzLnNlbmRDb3VudHMuaGFzKGUpfHx0aGlzLnNlbmRDb3VudHMuc2V0KGUsTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjY1NTM1KSk7Y29uc3QgYT0oZD10aGlzLnNlbmRDb3VudHMuZ2V0KGUpKSE9bnVsbD9kOjA7cmV0dXJuIGkuc2V0VWludDMyKDAsZSksaS5zZXRVaW50MzIoNCxzKSxpLnNldFVpbnQzMig4LHMtYSU2NTUzNSksdGhpcy5zZW5kQ291bnRzLnNldChlLGErMSksbn1nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpe3ZhciBzO2lmKHlkKGUpKXtjb25zdCBuPShzPXRoaXMuZ2V0VmlkZW9Db2RlYyhlKSkhPW51bGw/czp0aGlzLnZpZGVvQ29kZWM7aWYobj09PSJhdjEifHxuPT09InZwOSIpdGhyb3cgbmV3IEVycm9yKGAke259IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBlbmQgdG8gZW5kIGVuY3J5cHRpb25gKTtyZXR1cm4gQVtlLnR5cGVdfXJldHVybiBBLmF1ZGlvfWdldFZpZGVvQ29kZWMoZSl7aWYodGhpcy5ydHBNYXAuc2l6ZT09PTApcmV0dXJuO2NvbnN0e3BheWxvYWRUeXBlOnN9PWUuZ2V0TWV0YWRhdGEoKTtyZXR1cm4gcz90aGlzLnJ0cE1hcC5nZXQocyk6dm9pZCAwfX1mdW5jdGlvbiBUZCh0LHIpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodC5zbGljZSh0LmJ5dGVMZW5ndGgtci5ieXRlTGVuZ3RoKSk7cmV0dXJuIHIuZXZlcnkoKHMsbik9PnM9PT1lW25dKX1jbGFzcyBxcyBleHRlbmRzIEtze2NvbnN0cnVjdG9yKGUscyxuKXtzdXBlcih2b2lkIDApO3AodGhpcywiY3VycmVudEtleUluZGV4Iik7cCh0aGlzLCJjcnlwdG9LZXlSaW5nIik7cCh0aGlzLCJlbmFibGVkIik7cCh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTtwKHRoaXMsInJhdGNoZXRQcm9taXNlTWFwIik7cCh0aGlzLCJwYXJ0aWNpcGFudElkIik7dGhpcy5jdXJyZW50S2V5SW5kZXg9MCx0aGlzLmNyeXB0b0tleVJpbmc9bmV3IEFycmF5KDE2KSx0aGlzLmVuYWJsZWQ9cyx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1uLHRoaXMucmF0Y2hldFByb21pc2VNYXA9bmV3IE1hcCx0aGlzLnBhcnRpY2lwYW50SWQ9ZX1zZXRFbmFibGVkKGUpe3RoaXMuZW5hYmxlZD1lfXJhdGNoZXRLZXkoZSxzPSEwKXtjb25zdCBuPWUhPW51bGw/ZTp0aGlzLmdldEN1cnJlbnRLZXlJbmRleCgpLGk9bixhPXRoaXMucmF0Y2hldFByb21pc2VNYXAuZ2V0KGkpO2lmKHR5cGVvZiBhIT0idW5kZWZpbmVkIilyZXR1cm4gYTtjb25zdCBkPW5ldyBQcm9taXNlKChvLGwpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3QgbT10aGlzLmdldEtleVNldChpKS5tYXRlcmlhbCx2PXlpZWxkIGJkKHlpZWxkIEVkKG0sdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpLG0uYWxnb3JpdGhtLm5hbWUsImRlcml2ZSIpO3MmJnRoaXMuc2V0S2V5RnJvbU1hdGVyaWFsKHYsaSwhMCksdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLHYsbix0aGlzLnBhcnRpY2lwYW50SWQpLG8odil9Y2F0Y2gobSl7bChtKX1maW5hbGx5e3RoaXMucmF0Y2hldFByb21pc2VNYXAuZGVsZXRlKGkpfX0pKTtyZXR1cm4gdGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5zZXQoaSxkKSxkfXNldEtleUZyb21NYXRlcmlhbChlLHM9MCxuPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cz49MCYmKHRoaXMuY3VycmVudEtleUluZGV4PXMldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aCk7Y29uc3QgaT15aWVsZCB6cyhlLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KTt0aGlzLnNldEtleVNldChpLHRoaXMuY3VycmVudEtleUluZGV4LG4pfSl9c2V0S2V5U2V0KGUscyxuPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jcnlwdG9LZXlSaW5nW3MldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aF09ZSxuJiZ0aGlzLmVtaXQoImtleVJhdGNoZXRlZCIsZS5tYXRlcmlhbCxzLHRoaXMucGFydGljaXBhbnRJZCl9KX1zZXRDdXJyZW50S2V5SW5kZXgoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3VycmVudEtleUluZGV4PWUldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aH0pfWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLmVuYWJsZWR9Z2V0Q3VycmVudEtleUluZGV4KCl7cmV0dXJuIHRoaXMuY3VycmVudEtleUluZGV4fWdldEtleVNldChlKXtyZXR1cm4gdGhpcy5jcnlwdG9LZXlSaW5nW2UhPW51bGw/ZTp0aGlzLmN1cnJlbnRLZXlJbmRleF19fWNvbnN0IFl0PVtdLFF0PW5ldyBNYXAsSnQ9W107bGV0IGNlLFh0PSExLFlzPSExLFp0LGdlPU10O2Z1bmN0aW9uIFNlKHQscil7cG9zdE1lc3NhZ2Uoe2tpbmQ6ImxvZyIsZGF0YTp7bGV2ZWw6dCxzdHI6cn19KX1mdW5jdGlvbiBSZCh0LHIpe3Bvc3RNZXNzYWdlKHtraW5kOiJyYXRjaGV0S2V5IixkYXRhOntrZXlJbmRleDpyLG1hdGVyaWFsOnR9fSl9ZnVuY3Rpb24gVmUodCl7aWYoIXQpcmV0dXJuIGNlO2xldCByPVF0LmdldCh0KTtyZXR1cm4gcnx8KHI9bmV3IHFzKHQsITAsZ2UpLFp0JiZyLnNldEtleUZyb21NYXRlcmlhbChadCksUXQuc2V0KHQscikpLHJ9ZnVuY3Rpb24gUGQodCxyKXtyP1ZlKHIpLnNldEVuYWJsZWQodCk6KFh0PXQsY2Uuc2V0RW5hYmxlZCh0KSl9ZnVuY3Rpb24gUXModCl7dC5vbigiY3J5cHRvckVycm9yIixyPT57Y29uc3QgZT17a2luZDoiZXJyb3IiLGRhdGE6e2Vycm9yOm5ldyBFcnJvcihgJHtmZVtyLnJlYXNvbl19OiAke3IubWVzc2FnZX1gKX19O3Bvc3RNZXNzYWdlKGUpfSl9ZnVuY3Rpb24gZXIodCxyKXtsZXQgZT1ZdC5maW5kKHM9PnMuZ2V0VHJhY2tJZCgpPT09cik7aWYoZSl0IT09ZS5nZXRQYXJ0aWNpcGFudElkKCkmJmUuc2V0UGFydGljaXBhbnQodCxWZSh0KSk7ZWxzZXtpZihTZSgiaW5mbyIsYGNyZWF0aW5nIG5ldyBjcnlwdG9yIGZvciAke3R9YCksIWdlKXRocm93IEVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTtlPW5ldyBHcyh7cGFydGljaXBhbnRJZDp0LGtleXM6VmUodCksa2V5UHJvdmlkZXJPcHRpb25zOmdlfSksUXMoZSksWXQucHVzaChlKX1yZXR1cm4gZX1mdW5jdGlvbiBKcyh0KXtsZXQgcj1KdC5maW5kKGU9PmUuZ2V0VHJhY2tJZCgpPT09dCk7aWYoIXIpe2lmKCFnZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTtyPW5ldyBHcyh7a2V5czpjZSxwYXJ0aWNpcGFudElkOiJwdWJsaXNoZXIiLGtleVByb3ZpZGVyT3B0aW9uczpnZX0pLFFzKHIpLEp0LnB1c2gocil9cmV0dXJuIHJ9ZnVuY3Rpb24gQ2QodCl7dmFyIHI7KHI9WXQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXQpKT09bnVsbHx8ci51bnNldFBhcnRpY2lwYW50KCl9ZnVuY3Rpb24gSWQodCxyKXtTZSgiZGVidWciLCJzZXR0aW5nIHNoYXJlZCBrZXkiKSxadD10LGNlPT1udWxsfHxjZS5zZXRLZXlGcm9tTWF0ZXJpYWwodCxyKTtmb3IoY29uc3RbLGVdb2YgUXQpZS5zZXRLZXlGcm9tTWF0ZXJpYWwodCxyKX1vbm1lc3NhZ2U9dD0+e2NvbnN0e2tpbmQ6cixkYXRhOmV9PXQuZGF0YTtzd2l0Y2gocil7Y2FzZSJpbml0IjpTZSgiaW5mbyIsIndvcmtlciBpbml0aWFsaXplZCIpLGdlPWUua2V5UHJvdmlkZXJPcHRpb25zLFlzPSEhZS5rZXlQcm92aWRlck9wdGlvbnMuc2hhcmVkS2V5O2NvbnN0IHM9e2tpbmQ6ImVuYWJsZSIsZGF0YTp7ZW5hYmxlZDpYdH19O2NlPW5ldyBxcyh2b2lkIDAsWHQsZ2UpLGNlLm9uKCJrZXlSYXRjaGV0ZWQiLFJkKSxwb3N0TWVzc2FnZShzKTticmVhaztjYXNlImVuYWJsZSI6UGQoZS5lbmFibGVkLGUucGFydGljaXBhbnRJZCksU2UoImluZm8iLCJ1cGRhdGVkIGUyZWUgZW5hYmxlZCBzdGF0dXMiKSxwb3N0TWVzc2FnZSh0LmRhdGEpO2JyZWFrO2Nhc2UiZGVjb2RlIjplcihlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXR1cFRyYW5zZm9ybShyLGUucmVhZGFibGVTdHJlYW0sZS53cml0YWJsZVN0cmVhbSxlLnRyYWNrSWQsZS5jb2RlYyk7YnJlYWs7Y2FzZSJlbmNvZGUiOkpzKGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0ocixlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0S2V5IjpZcz8oU2UoImRlYnVnIiwic2V0IHNoYXJlZCBrZXkiKSxJZChlLmtleSxlLmtleUluZGV4KSk6ZS5wYXJ0aWNpcGFudElkP1ZlKGUucGFydGljaXBhbnRJZCkuc2V0S2V5RnJvbU1hdGVyaWFsKGUua2V5LGUua2V5SW5kZXgpOlNlKCJlcnJvciIsIm5vIHBhcnRpY2lwYW50IElkIHdhcyBwcm92aWRlZCBhbmQgc2hhcmVkIGtleSB1c2FnZSBpcyBkaXNhYmxlZCIpO2JyZWFrO2Nhc2UicmVtb3ZlVHJhbnNmb3JtIjpDZChlLnRyYWNrSWQpO2JyZWFrO2Nhc2UidXBkYXRlQ29kZWMiOmVyKGUucGFydGljaXBhbnRJZCxlLnRyYWNrSWQpLnNldFZpZGVvQ29kZWMoZS5jb2RlYyk7YnJlYWs7Y2FzZSJzZXRSVFBNYXAiOkp0LmZvckVhY2goYT0+e2Euc2V0UnRwTWFwKGUubWFwKX0pO2JyZWFrO2Nhc2UicmF0Y2hldFJlcXVlc3QiOlZlKGUucGFydGljaXBhbnRJZCkucmF0Y2hldEtleShlLmtleUluZGV4KTticmVha319LHNlbGYuUlRDVHJhbnNmb3JtRXZlbnQmJihTZSgiZGVidWciLCJzZXR1cCB0cmFuc2Zvcm0gZXZlbnQiKSxzZWxmLm9ucnRjdHJhbnNmb3JtPXQ9Pntjb25zdHt0cmFuc2Zvcm1lcjpyfT10O3IuaGFuZGxlZD0hMDtjb25zdHtraW5kOmUscGFydGljaXBhbnRJZDpzLHRyYWNrSWQ6bixjb2RlYzppfT1yLm9wdGlvbnM7KGU9PT0iZW5jb2RlIj9KcyhuKTplcihzLG4pKS5zZXR1cFRyYW5zZm9ybShlLHIucmVhZGFibGUsci53cml0YWJsZSxuLGkpfSl9KSgpOwo=",P=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Ul(){const Z=P&&(window.URL||window.webkitURL).createObjectURL(P);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,T,s,H,cl,S,dl,a,C,Q,kl,U,bl,k,Vl,K,Wl,t,Xl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,H);p(this,S);p(this,a);p(this,Q);p(this,U);p(this,k);p(this,K);p(this,t);R(this,"worker");R(this,"encryptionEnabled");R(this,"keyProvider");R(this,"peerSessionStore");R(this,"onWorkerMessage",l=>{const{kind:d,data:b}=l.data;switch(d){case"error":this.logger.error("error in worker",{error:b.error}),this.emit(E.Error,b.error);break;case"enable":this.encryptionEnabled!==b.enabled&&!b.participantId?this.encryptionEnabled=b.enabled:b.participantId,this.encryptionEnabled&&this.keyProvider.getKeys().forEach(V=>{y(this,a,C).call(this,V)});break;case"ratchetKey":this.keyProvider.emit("keyRatcheted",b.material,b.keyIndex);break;case"log":this.logger&&this.logger[b.level](b.str);break}});p(this,s,l=>{this.logger.error("e2ee worker encountered an error:",{error:l.error}),this.emit(E.Error,l.error)});this.keyProvider=l.keyProvider,this.worker=new Ul,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,d){this.logger=l,this.peerSessionStore=d,this.setup()}setup(){if(!sl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),y(this,H,cl).call(this,this.keyProvider);const l={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions()}};this.worker&&(this.logger.info("initializing worker"),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=j(this,s),this.worker.postMessage(l)),y(this,N,T).call(this,!0)}}N=new WeakSet,T=function(l,d){return J(this,null,function*(){if(this.logger.info(`set e2ee to ${l} for ${d||"self"}`),this.worker){const b={kind:"enable",data:{enabled:l,participantId:d}};this.worker.postMessage(b)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")})},s=new WeakMap,H=new WeakSet,cl=function(l){this.peerSessionStore.on(i.NEW_CONSUMER,({appData:d,peerId:b})=>{d.e2ee&&y(this,N,T).call(this,d.e2ee,b)}),this.peerSessionStore.on(i.E2EE_INACTIVE_CONSUMER,({peerId:d,trackId:b})=>{var W;const V={kind:"removeTransform",data:{participantId:d,trackId:b}};(W=this.worker)==null||W.postMessage(V)}),this.peerSessionStore.on(i.E2EE_ACTIVE_CONSUMER,({track:d,rtpReceiver:b,peerId:V})=>y(this,U,bl).call(this,d,b,V)),this.peerSessionStore.on(i.E2EE_ACTIVE_PRODUCER,({track:d,rtpSender:b,appData:V})=>y(this,k,Vl).call(this,d,b,V.peerId)),l.on("setKey",d=>y(this,a,C).call(this,d)).on("ratchetRequest",(d,b)=>y(this,S,dl).call(this,d,b))},S=new WeakSet,dl=function(l,d){if(!this.worker)throw Error("could not ratchet key, worker is missing");const b={kind:"ratchetRequest",data:{participantId:l,keyIndex:d}};this.worker.postMessage(b)},a=new WeakSet,C=function({key:l,participantId:d,keyIndex:b}){if(!this.worker)throw Error("could not set key, worker is missing");const V={kind:"setKey",data:{participantId:d,key:l,keyIndex:b}};this.worker.postMessage(V)},Q=new WeakSet,kl=function(l){if(!this.worker)throw Error("could not post rtp map, worker is missing");const d={kind:"setRTPMap",data:{map:l}};this.worker.postMessage(d)},U=new WeakSet,bl=function(l,d,b){y(this,K,Wl).call(this,d,l.id,b)},k=new WeakSet,Vl=function(l,d,b){y(this,t,Xl).call(this,d,l.id,b)},K=new WeakSet,Wl=function(l,d,b,V){return J(this,null,function*(){if(!this.worker)return;const W=l;if(x()){const X={kind:"decode",participantId:b,trackId:d,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{if(F in W&&V){const h={kind:"updateCodec",data:{trackId:d,codec:V,participantId:b}};this.worker.postMessage(h);return}let X=W.writableStream,G=W.readableStream;if(!X||!G){const h=W.createEncodedStreams();W.writableStream=h.writable,X=h.writable,W.readableStream=h.readable,G=h.readable}const Y={kind:"decode",data:{readableStream:G,writableStream:X,trackId:d,codec:V,participantId:b}};this.worker.postMessage(Y,[G,X])}W[F]=!0})},t=new WeakSet,Xl=function(l,d,b,V){if(F in l||!this.worker)return;const W=l;if(x()){this.logger.warn("initialize script transform");const X={kind:"encode",participantId:b,trackId:d,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{this.logger.warn("initialize encoded streams");const X=W.createEncodedStreams(),G={kind:"encode",data:{readableStream:X.readable,writableStream:X.writable,codec:V,trackId:d,participantId:b||"publisher"}};this.worker.postMessage(G,[X.readable,X.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Sl);module.exports=Zl;