@rongcloud/plugin-call-plus 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(g,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],l):(g=typeof globalThis<"u"?globalThis:g||self,l(g.CallPlus={},g.RCEngine,g.RCRTC))})(this,function(g,l,N){"use strict";var He=Object.defineProperty;var ke=(g,l,N)=>l in g?He(g,l,{enumerable:!0,configurable:!0,writable:!0,value:N}):g[l]=N;var I=(g,l,N)=>(ke(g,typeof l!="symbol"?l+"":l,N),N);const a={SUCCESS:0,PARAM_ERROR:80001,SESSION_EXIST:80002,NOT_IN_CALL:80003,MEDIATYPE_INVALID:80004,NOT_VIDEO_CALL:80005,RTC_SERVICE_UNAVAILABLE:80006,USER_LIST_INVAILD:80007,CALL_ID_INVALID:80008,TRANSACTION_ID_INVALID:80009,USER_ID_INVALID:80010,SINGLE_CALL_NOT_SUPPORT_MULTI_PERSON:80011,SIGNAL_DISCONNECTED:80012,CAMERA_CLOSED:80100,MICROPHONE_CLOSED:80101,MEDIA_RESOURCE_INVALIED:80102,NOT_INSTALL_RTC_PLUGIN:80103,PLAY_MEDIA_FAILED:80104,VIDEO_VIEW_NOT_SET:80105};var n=(t=>(t.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O="L-index_install_call_plus_plugin-O",t.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O="L-callplus_client_set_event_listener-O",t.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O="L-callplus_client_call_event_listener-O",t.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O="L-callplus_client_set_status_report_listener-O",t.L_CALLPLUS_CLIENT_CALL_STATUS_REPORT_LISTENER_O="L-callplus_client_call_status_report_listener-O",t.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T="L-callplus_client_set_video_config-T",t.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R="L-callplus_client_set_video_config-R",t.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O="L-callplus_video_config_set_frame_rate-O",t.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O="L-callplus_video_config_set_resolution-O",t.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O="L-callplus_video_config_set_bitrate-O",t.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T="L-callplus_client_set_audio_config-T",t.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R="L-callplus_client_set_audio_config-R",t.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O="L-callplus_audio_config_set_bitrate-O",t.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O="L-callplus_audio_config_set_sample_rate-O",t.L_CALLPLUS_CLIENT_PREVIEW_T="L-callplus_client_preview-T",t.L_CALLPLUS_CLIENT_PREVIEW_R="L-callplus_client_preview-R",t.L_CALLPLUS_CLIENT_START_CALL_T="L-callplus_client_start_call-T",t.L_CALLPLUS_CLIENT_START_CALL_R="L-callplus_client_start_call-R",t.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T="L-callplus_client_join_multi_call-T",t.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R="L-callplus_client_join_multi_call-R",t.L_CALLPLUS_CLIENT_ACCEPT_T="L-callplus_client_accept-T",t.L_CALLPLUS_CLIENT_ACCEPT_R="L-callplus_client_accept-R",t.L_CALLPLUS_CLIENT_HANGUP_T="L-callplus_client_hangup-T",t.L_CALLPLUS_CLIENT_HANGUP_R="L-callplus_client_hangup-R",t.L_CALLPLUS_CLIENT_INVITE_T="L-callplus_client_invite-T",t.L_CALLPLUS_CLIENT_INVITE_R="L-callplus_client_invite-R",t.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T="L-callplus_client_request_change_media_type-T",t.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R="L-callplus_client_request_change_media_type-R",t.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T="L-callplus_client_cancel_change_media_type-T",t.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R="L-callplus_client_cancel_change_media_type-R",t.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T="L-callplus_client_reply_change_media_type-T",t.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R="L-callplus_client_reply_change_media_type-R",t.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_T="L-callplus_client_get_current_call_session-T",t.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_R="L-callplus_client_get_current_call_session-R",t.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_get_available_call_sessions_from_server-T",t.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_get_available_call_sessions_from_server-R",t.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T="L-callplus_client_get_call_records-T",t.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R="L-callplus_client_get_call_records-R",t.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T="L-callplus_client_delete_call_records_by_callId-T",t.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R="L-callplus_client_delete_call_records_by_callId-R",t.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_delete_all_call_records_from_server-T",t.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_delete_all_call_records_from_server-R",t.L_CALLPLUS_CLIENT_START_CAMERA_T="L-callplus_client_start_camera-T",t.L_CALLPLUS_CLIENT_START_CAMERA_R="L-callplus_client_start_camera-R",t.L_CALLPLUS_CLIENT_STOP_CAMERA_T="L-callplus_client_stop_camera-T",t.L_CALLPLUS_CLIENT_STOP_CAMERA_R="L-callplus_client_stop_camera-R",t.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T="L-callplus_client_switch_camera-T",t.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R="L-callplus_client_switch_camera-R",t.L_CALLPLUS_CLIENT_START_MICROPHONE_T="L-callplus_client_start_microphone-T",t.L_CALLPLUS_CLIENT_START_MICROPHONE_R="L-callplus_client_start_microphone-R",t.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T="L-callplus_client_stop_microphone-T",t.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R="L-callplus_client_stop_microphone-R",t.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T="L-callplus_client_set_video_view-T",t.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R="L-callplus_client_set_video_view-R",t.L_RTC_MODULE_SET_VIDEO_VIEW_O="L-rtc_module_set_video_view-O",t.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T="L-callplus_client_remove_video_view-T",t.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R="L-callplus_client_remove_video_view-R",t.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O="L-rtc_module_remove_video_view-O",t.L_CALLPLUS_CLIENT_PLAY_MEDIA_T="L-callplus_client_play_media-T",t.L_CALLPLUS_CLIENT_PLAY_MEDIA_R="L-callplus_client_play_media-R",t.L_RTC_MODULE_PLAY_MEDIA_T="L-rtc_module_play_media-T",t.L_RTC_MODULE_PLAY_MEDIA_R="L-rtc_module_play_media-R",t.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T="L-rtc_module_set_all_remote_audio_enbale-T",t.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R="L-rtc_module_set_all_remote_audio_enable-R",t.L_RTC_MODULE_SUBSCRIBE_T="L-rtc_module_subscribe-T",t.L_RTC_MODULE_SUBSCRIBE_R="L-rtc_module_subscribe-R",t.L_RTC_MODULE_UNSUBSCRIBE_T="L-rtc_module_unsubscribe-T",t.L_RTC_MODULE_UNSUBSCRIBE_R="L-rtc_module_unsubscribe-R",t.L_RTC_MODULE_PUBLISH_T="L-rtc_module_publish-T",t.L_RTC_MODULE_PUBLISH_R="L-rtc_module_publish-R",t.L_RTC_MODULE_UNPUBLISH_T="L-rtc_module_unpublish-T",t.L_RTC_MODULE_UNPUBLISH_R="L-rtc_module_unpublish-R",t.L_RTC_MODULE_DESTROY_ALL_TRACKS_O="L-rtc_module_destroy_all_tracks-O",t.L_RTC_MODULE_SESSION_CONNECT_T="L-rtc_module_session_connect-T",t.L_RTC_MODULE_SESSION_CONNECT_P="L-rtc_module_session_connect-P",t.L_RTC_MODULE_SESSION_CONNECT_R="L-rtc_module_session_connect-R",t.L_RTC_MODULE_SESSION_CLOSE_T="L-rtc_module_session_close-T",t.L_RTC_MODULE_SESSION_CLOSE_P="L-rtc_module_session_close-P",t.L_RTC_MODULE_SESSION_CLOSE_R="L-rtc_module_session_close-R",t.L_RTC_MODULE_CREATE_VIDEO_TRACK_T="L-rtc_module_create_video_track-T",t.L_RTC_MODULE_CREATE_VIDEO_TRACK_R="L-rtc_module_create_video_track-R",t.L_RTC_MODULE_CREATE_AUDIO_TRACK_T="L-rtc_module_create_audio_track-T",t.L_RTC_MODULE_CREATE_AUDIO_TRACK_R="L-rtc_module_create_audio_track-R",t.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O="L-rtc_module_receive_track_publish-O",t.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O="L-rtc_module_receive_track_unpublish-O",t.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O="L-rtc_module_receive_track_enable_change-O",t.L_RTC_MODULE_RECEIVE_KICK_OFF_O="L-rtc_module_receive_kick_off-O",t.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O="L-rtc_module_receive_peerconnection_except_close-O",t.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T="L-rtc_module_change_media_type-T",t.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R="L-rtc_module_change_media_type-R",t.L_RTC_MODULE_JOIN_RTC_ROOM_T="L-rtc_module_join_rtc_room-T",t.L_RTC_MODULE_JOIN_RTC_ROOM_R="L-rtc_module_join_rtc_room-R",t.L_RTC_MODULE_QUIT_RTC_ROOM_T="L-rtc_module_quit_rtc_room-T",t.L_RTC_MODULE_QUIT_RTC_ROOM_R="L-rtc_module_quit_rtc_room-R",t.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T="L-signal_transporter_single_call-T",t.L_SIGNAL_TRANSPORTER_GROUP_CALL_T="L-signal_transporter_group_call-T",t.L_SIGNAL_TRANSPORTER_INVITE_T="L-signal_transporter_invite-T",t.L_SIGNAL_TRANSPORTER_RING_T="L-signal_transporter_ring-T",t.L_SIGNAL_TRANSPORTER_ACCEPT_T="L-signal_transporter_accept-T",t.L_SIGNAL_TRANSPORTER_ACCEPT_R="L-signal_transporter_accept-R",t.L_SIGNAL_TRANSPORTER_JOIN_CALL_T="L-signal_transporter_join_call-T",t.L_SIGNAL_TRANSPORTER_HANGUP_T="L-signal_transporter_hangup-T",t.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T="L-signal_transporter_call_status_up-T",t.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T="L-signal_transporter_call_event_up-T",t.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T="L-signal_transporter_call_dialog_up-T",t.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T="L-signal_transporter_delete_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T="L-signal_transporter_get_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T="L-signal_transporter_get_call_server_time-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T="L-signal_transporter_get_call_time_info-T",t.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T="L-signal_transporter_get_available_call_list-T",t.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T="L-signal_transporter_clear_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T="L-signal_transporter_get_call_info_by_callId-T",t.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T="L-signal_transporter_user_system_state_up-T",t.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O="L-signal_transporter_receive_call_signal_data-O",t.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O="L-signal_transporter_im_state_change-O",t.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O="L-signal_transporter_receive_invite-O",t.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O="L-signal_transporter_receive_call_status-O",t.L_CALL_ENGINE_UPDATE_USERS_STATE_O="L-call_engine_update_users_state-O",t.L_CALL_ENGINE_IM_STATE_CHANGE_O="L-call_engine_im_state_change-O",t.L_CALL_ENGINE_CALL_TIMEOUT_O="L-call_engine_call_timeout-O",t.L_CALL_ENGINE_START_CALL_TIMER_O="L-call_engine_start_call_timer-O",t.L_CALL_ENGINE_STOP_CALL_TIMER_O="L-call_engine_stop_call_timer-O",t.L_CALL_ENGINE_UP_ON_PHONE_END_T="L-call_engine_up_on_phone_end-T",t.L_CALL_ENGINE_UP_ON_PHONE_END_R="L-call_engine_up_on_phone_end-R",t.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O="L-call_engine_receive_first_frame_time-O",t.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O="L-call_engine_receive_mediatype_change-O",t.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O="L-call_engine_receive_close_session-O",t.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O="L-call_engine_receive_call_record-O",t.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O="L-call_engine_receive_complementary_data-O",t.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T="L-call_engine_create_session_by_server-T",t.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R="L-call_engine_create_session_by_server-R",t.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T="L-call_engine_up_first_frame_time-T",t.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R="L-call_engine_up_first_frame_time-R",t.L_TIME_CORRECT_START_O="L-time_correct_start-O",t.L_TIME_CORRECT_STOP_O="L-time_correct_stop-O",t.L_TIME_CORRECT_RESTART_O="L-time_correct_restart-O",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T="L-time_correct_get_call_client_time_by_server-T",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P="L-time_correct_get_call_client_time_by_server-P",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R="L-time_correct_get_call_client_time_by_server-R",t.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T="L-time_correct_calc_client_start_time-T",t.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R="L-time_correct_calc_client_start_time-R",t.L_TIME_CORRECT_SET_DELTA_TIME_O="L-time_correct_set_delta_time-O",t.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T="L-time_correct_loop_correct_client_time-T",t.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R="L-time_correct_loop_correct_client_time-R",t.L_INNER_SESSION_UPDATE_USER_STATE_O="L-inner_session_update_user_state-O",t.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O="L-inner_session_set_user_device_enable-O",t.L_CALL_PLUS_SESSION_GET_CREATE_TIME_T="L-call_plus_session_get_create_time-T",t.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R="L-call_plus_session_get_create_time-R",t.L_CALL_PLUS_SESSION_GET_DURATION_T="L-call_plus_session_get_duration-T",t.L_CALL_PLUS_SESSION_GET_DURATION_R="L-call_plus_session_get_duration-R",t))(n||{});class K{constructor(s,e,_){I(this,"_startTime",0);I(this,"_duration",0);I(this,"_callId","");this._session=s,this._callEngine=e,this._logger=_,this._callId=this._session.getCallId()}getCallId(){return this._callId}getState(){return this._session.getSessionState()}getCallType(){return this._session.getCallType()}getMediaType(){return this._session.getMediaType()}getUserList(){return this._session.getUserList().map(s=>{const{userId:e,userState:_,cameraEnable:i,microphoneEnable:r}=s;return{userId:e,state:_,cameraEnable:i,microphoneEnable:r}})}getCreatorUserId(){return this._session.getStartCallerId()}getInviterUserId(){return this._session.getCallerId()}async getCreateTimestamp(){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_T,"",s),this._startTime)return{code:a.SUCCESS,startTime:this._startTime};const{code:e,clientStartTime:_}=await this._callEngine.getCallStaringTime({callId:this._callId},s);return e!==a.SUCCESS?(this._logger.error(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R,`errCode: ${e}`,s),{code:e}):(this._logger.info(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R,"success",s),this._startTime=_,{code:a.SUCCESS,startTime:this._startTime})}async getDuration(){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_T,"",s),this._duration)return this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${this._duration}`,s),{code:a.SUCCESS,duration:this._duration};const{code:e,data:_}=await this._callEngine.getCallTimeInfo(this._callId,s);return e!==a.SUCCESS?(this._logger.error(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${_.duration}`,s),this._duration=_.duration,{code:a.SUCCESS,duration:this._duration})}}var D=(t=>(t[t.SINGLE=0]="SINGLE",t[t.MULTI=1]="MULTI",t))(D||{}),d=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ONPHONE=301]="ONPHONE",t[t.ENDED=1e3]="ENDED",t[t.NO_ANSWER=1001]="NO_ANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELLED=1003]="CANCELLED",t[t.DECLINED=1004]="DECLINED",t[t.ERROR=2e3]="ERROR",t))(d||{}),u=(t=>(t[t.AUDIO=0]="AUDIO",t[t.AUDIO_VIDEO=1]="AUDIO_VIDEO",t[t.VIDEO=2]="VIDEO",t))(u||{}),p=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ENDED=1e3]="ENDED",t[t.NOANSWER=1001]="NOANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELED=1003]="CANCELED",t[t.DECLINED=1004]="DECLINED",t[t.ERROR=2e3]="ERROR",t))(p||{}),k=(t=>(t[t.CANCEL_CHANGE_MEDIA_TYPE=0]="CANCEL_CHANGE_MEDIA_TYPE",t[t.REFUSE_CHANGE_MEDIA_TYPE=1]="REFUSE_CHANGE_MEDIA_TYPE",t[t.SERVER_ALLOW_MEDIA_TYPE=2]="SERVER_ALLOW_MEDIA_TYPE",t[t.CHANGE_MEDIA_TYPE_TIMEOUT=3]="CHANGE_MEDIA_TYPE_TIMEOUT",t))(k||{}),A=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ON_PHONE=301]="ON_PHONE",t[t.ON_PHONE_END=302]="ON_PHONE_END",t[t.ON_DEVICE_DISABLE=303]="ON_DEVICE_DISABLE",t[t.ON_DEVICE_ENABLE=304]="ON_DEVICE_ENABLE",t[t.ABNORMAL_END=999]="ABNORMAL_END",t[t.ENDED=1e3]="ENDED",t[t.NO_ANSWER=1001]="NO_ANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELLED=1003]="CANCELLED",t[t.DECLINED=1004]="DECLINED",t[t.OTHER_CLIENT_CALLING=1010]="OTHER_CLIENT_CALLING",t[t.OTHER_CLIENT_ACCEPT=1011]="OTHER_CLIENT_ACCEPT",t[t.JOIN_ROOM_ERR=1105]="JOIN_ROOM_ERR",t[t.PUBLISH_ERR=1106]="PUBLISH_ERR",t[t.SUBSCRIBE_ERR=1107]="SUBSCRIBE_ERR",t[t.ACCEPT_CARRIER=1108]="ACCEPT_CARRIER",t[t.KICKED_BY_SERVER=1109]="KICKED_BY_SERVER",t[t.CONNECTION_ERR=1110]="CONNECTION_ERR",t[t.LOGOUT=1111]="LOGOUT",t[t.OTHER_CLIENT_LOGIN=1112]="OTHER_CLIENT_LOGIN",t[t.OTHER_CLIENT_JOINED=1113]="OTHER_CLIENT_JOINED",t[t.OTHER_CLIENT_IN_ROOM=1114]="OTHER_CLIENT_IN_ROOM",t[t.OTHER_CLIENT_HANGUP=1151]="OTHER_CLIENT_HANGUP",t[t.REMOTE_JOIN_RTC_ERROR=1205]="REMOTE_JOIN_RTC_ERROR",t[t.REMOTE_PUBLISH_ERROR=1206]="REMOTE_PUBLISH_ERROR",t[t.REMOTE_SUBSCRIBE_ERROR=1207]="REMOTE_SUBSCRIBE_ERROR",t[t.REMOTE_KICKED_BY_SERVER=1209]="REMOTE_KICKED_BY_SERVER",t[t.REMOTE_CONNECTION_ERROR=1210]="REMOTE_CONNECTION_ERROR",t[t.REMOTE_LOGOUT=1211]="REMOTE_LOGOUT",t[t.REMOTE_OTHER_CLIENT_LOGIN=1212]="REMOTE_OTHER_CLIENT_LOGIN",t[t.REMOTE_OTHER_JOINED_RTC=1213]="REMOTE_OTHER_JOINED_RTC",t[t.REMOTE_OTHER_CLIENT_IN_RTC=1214]="REMOTE_OTHER_CLIENT_IN_RTC",t))(A||{});class Ee{constructor(s){I(this,"_audioConfig",{});this._logger=s}setDefaultMicrophoneId(s){return this._audioConfig.microphoneId=s,this}setBitrate(s,e){return!l.isNumber(s)||!l.isNumber(e)||e<=0||s<=0||e<s?(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${s}, max and min is a number > 0, max should > min`),this):(this._audioConfig.minBitrate=s,this._audioConfig.maxBitrate=e,this)}setSampleRate(s){return l.isNumber(s)?(this._audioConfig.sampleRate=s,this):(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O,`params error -> sampleRate: ${s}`),this)}build(){return this._audioConfig}}class Le{constructor(s){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});this._logger=s}setFrameRate(s){return N.RCFrameRate[s]?(this._videoConfig.frameRate=s,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O,`params error -> fps: ${s}`),this)}setVideoResolution(s){return N.RCResolution[s]?(this._videoConfig.resolution=s,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O,`params error -> resolution: ${s}`),this)}setDefaultCameraId(s){return this._videoConfig.cameraId=s,this}setBitrate(s,e){return!l.isNumber(s)||!l.isNumber(e)||e<=0||s<=0||e<s?(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${s}, max and min is a number > 0, max should > min`),this):(this._videoConfig.minBitrate=s,this._videoConfig.maxBitrate=e,this)}build(){return this._videoConfig}}const ce=t=>{const{callId:s,callType:e,callDir:_,mediaType:i,callingUserId:r,callUserIds:o,callStatus:E,sessionStatus:L,startTime:c,endTime:T,duration:S,secretChat:C,syncTime:h,sysStatus:f,crtTime:U}=t;return{callId:s,callType:e,callDirection:_,mediaType:i,callerUserId:r,callUserIds:o,sessionState:E,userState:L,startTimestamp:c,endTimestamp:T,duration:S,syncTimestamp:h,systemState:f,createTimestamp:U}},Ce=t=>{const{callId:s,callStatus:e}=t,_=[],i=[],r=[],o=[];return t.callSessionUsers.forEach(E=>{const{userId:L,sessionStatus:c,sysStatus:T}=E;switch(c){case d.INVITED:o.push({callId:s,userId:L,userState:c});break;case d.RINGING:_.push({callId:s,fromUserId:L});break;case d.CONNECTING:r.push({fromUserId:L});break;case d.CANCELLED:case d.DECLINED:case d.ENDED:case d.IDLE:i.push({callId:s,fromUserId:L,userState:c,systemState:T});break}}),{ringingData:_,hangupData:i,acceptData:r,otherInvitedData:o}},de=t=>t&&t.nodeName&&t.nodeName.toUpperCase()==="VIDEO",he=(t,s)=>{let e=!1;const _=[A.INVITED,A.RINGING,A.BUSYLINE_RINGING,A.BUSYLINE_WAIT,A.CONNECTING,A.ONCALL];switch(t){case A.ONCALL:_.includes(s)&&(e=!0);break}return e},Ne=(t,s)=>{let e=!1;const _=[d.INVITED,d.RINGING,d.BUSYLINE_RINGING,d.BUSYLINE_WAIT,d.CONNECTING,d.ONCALL];switch(t){case d.ONCALL:_.includes(s)&&(e=!0);break}return e},Ae=(t,s)=>{let e;switch(t){case d.CALLING:e=A.CANCELLED;break;case d.RINGING:case d.INVITED:e=A.DECLINED;break;case d.CONNECTING:e=s?A.DECLINED:A.CANCELLED;break;case d.ONCALL:e=A.ENDED;break}return e},ee=t=>{const{voipCallInfo:s}=t;if(!s)return!1;const{strategy:e}=JSON.parse(s);return e===1},Te=(t,s)=>(t||t===0)&&(!l.isNumber(t)||t<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> minBitrate: a number of > 0, value: ${t}`}:(s||s===0)&&(!l.isNumber(s)||s<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: a number of > 0, value: ${s}`}:t&&s&&s<t?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: ${s}, minBitrate: ${t}, maxBitrate should > minBitrate`}:{code:a.SUCCESS};var F=(t=>(t.L_QS_START_CALL_S="Call-start-S",t.L_QS_ACCEPT_CALL_S="Call-accept-S",t.L_QS_HANGUP_CALL_S="Call-hangup-S",t.L_QS_RECEIVE_CALL_S="Call-recv-S",t.L_QS_ABNORMAL_HANGUP_S="Call-interrupt-S",t))(F||{});class Re{constructor(s,e){this._logger=s,this._context=e}reportStatisticsData(s,e,_,i,r,o,E){const L=+new Date,{mediaType:c,callType:T,callId:S}=i?{mediaType:i.getMediaType(),callType:i.getCallType(),callId:i.getCallId()}:E,C={cr:"unknown",net:"unknown",cod:e,mtp:c,ctp:T,cid:S,time:L,uid:this._context.getCurrentId()};r&&Object.assign(C,{ccid:r});let h=null;switch(s){case F.L_QS_RECEIVE_CALL_S:h={...C,rf:o};break;case F.L_QS_ABNORMAL_HANGUP_S:h={...C};break;default:h={...C,dur:L-_}}this._logger.info("L-call-plus-statistic",JSON.stringify(h),s),this._logger.__statistics(s,JSON.stringify(h))}}var v=(t=>(t.REQUEST="request",t.ACCEPT="accept",t.REFUSE="refuse",t.CANCEL="cancel",t.NOTICE="notice",t.TIMEOUT="timeout",t))(v||{}),W=(t=>(t[t.SWITCH_MEDIA_TYPE=1]="SWITCH_MEDIA_TYPE",t))(W||{}),_e=(t=>(t[t.NORMAL=0]="NORMAL",t[t.SECRET=1]="SECRET",t))(_e||{}),te=(t=>(t.INVITER="inviter",t.INVITEE="invitee",t))(te||{});class ie extends l.EventEmitter{constructor(e,_,i,r,o,E,L,c){super();I(this,"_reqMediaType");I(this,"_inviterTimerId");I(this,"_inviteeTimerId");I(this,"_oldDialogData");I(this,"isLocalClientHangup",!1);this._callId=e,this._state=_,this._callType=i,this._mediaType=r,this._startCallerId=o,this._callerId=E,this._callUsers=L,this._logger=c}getCallId(){return this._callId}getSessionState(){return this._state}getCallType(){return this._callType}getMediaType(){return this._mediaType}getStartCallerId(){return this._startCallerId}getCallerId(){return this._callerId}getUserList(){return this._callUsers}getReqMediaType(){return this._reqMediaType}getInviterTimerId(){return this._inviterTimerId}getInviteeTimerId(){return this._inviteeTimerId}getAllTimerIds(){return[this._inviterTimerId,this._inviteeTimerId]}setUserDeviceEnable(e,_,i,r){this._logger.info(n.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O,`userId: ${e}, mediaType: ${_}, enable: ${i}`,r);const o=this._callUsers.find(E=>e===E.userId);_===u.AUDIO?o.microphoneEnable=i:o.cameraEnable=i}updateUserList(e,_){const i=[];return e.forEach(r=>{const{userState:o,stateTime:E,systemState:L}=r;if([d.CALLING,d.INVITED,d.BUSYLINE_WAIT].includes(o))this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`push user: ${JSON.stringify(r)}`,_),this._callUsers.push(r),i.push(r);else{let T=!1;for(let S=0;S<this._callUsers.length;S++){const{userId:C,stateTime:h,systemState:f,userState:U}=this._callUsers[S];if(C===r.userId){T=!0;const m=he(f,L),y=Ne(U,o),R=L===A.ON_PHONE_END&&f!==A.ON_PHONE&&o!==d.IDLE;if(E&&h&&E<h||m&&y){try{this._logger.warn(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`timeout user state: old:${JSON.stringify({userId:C,oldStateTime:h,oldSystemState:f,oldUserState:U})}; new:${JSON.stringify(r)}`,_)}catch(M){this._logger.error(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList err: ${M.message}`,_)}break}else{this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> cover ${JSON.stringify(r)}`,_),this._callUsers[S]=r,!R&&i.push(r);break}}}T||(this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> nouser push ${JSON.stringify(r)}`,_),this._callUsers.push(r),i.push(r))}}),i}setOldDialogData(e){this._oldDialogData=e}updateSessionState(e){this._state=e}updateCallType(e){this._callType=e}updateMediaType(e){this._mediaType=e}updateReqMediaType(e){this._reqMediaType=e}updateTimerId(e,_){e==="inviter"?this._inviterTimerId=_:this._inviteeTimerId=_}getOldDialogData(){return this._oldDialogData}setIsLocalClientHangup(e){this.isLocalClientHangup=e}getIsLocalClientHangup(){return this.isLocalClientHangup}}var O=(t=>(t.START_SINGLE_CALL="startSingleCall",t.START_GROUP_CALL="startGroupCall",t.INVITE_CALL="inviteCall",t.PUB_INVITE_CALL="pubInviteCall",t.RINGING_CALL="ringCall",t.ACCEPT_CALL="acceptCall",t.JOIN_CALL="joinCall",t.HANGUP_CALL="hangupCall",t.STATUS_UP_CALL="statusUpCall",t.STATUS_DOWN_CALL="statusDownCall",t.EVENT_UP_CALL="eventUpCall",t.EVENT_DOWN_CALL="eventDownCall",t.DIALOG_UP_CALL="dialogUpCall",t.DIALOG_DOWN_CALL="dialogDownCall",t.GET_CALL_USER_SESSION_LIST="getCallUSerSessionList",t.SYNC_CALL_LOG="syncCallLog",t.PUB_CALL_LOG="pubCallLog",t.DEL_CALL_LOG="deleteCallLog",t.QRY_CALL_STATE="queryUserHasCall",t.QRY_SRV_TIMESTAMP="getCallSrvTimeStamp",t.GET_CALL_STATE_LIST="getUserCallStateList",t.CLEAR_CALL_LOG="cleanCallLog",t.GET_CALL_SESSION="getCallSession",t.GET_CALL_TIME_INFO="getCallTimeInfo",t.END_ABNORMAL_CALL="endUserAbnormalCalls",t.SYS_STATUS_UP="sysStatusUp",t.UP_CALL_LOG_READED="upCallLogReaded",t.PUB_CALL_LOG_READED="pubCallLogReaded",t.PUB_NACK_SEQ_ID="pubNACKSeqId",t.GET_USER_CALL_SESSION_ID_LIST="getUserCallSessionIdList",t))(O||{});const se=(t,s)=>setTimeout(t,s),Oe=t=>new Promise(s=>{setTimeout(s,t)}),ue=[l.ErrorCode.RC_NET_CHANNEL_INVALID,l.ErrorCode.RC_NET_UNAVAILABLE,l.ErrorCode.RC_MSG_RESP_TIMEOUT,N.RCRTCCode.SIGNAL_DISCONNECTED,N.RCRTCCode.REQUEST_FAILED],j=async({asyncFn:t,fnArgs:s,currentRetryTime:e=Date.now(),maxDuration:_=60*1e3,intervals:i=[2*1e3,4*1e3,8*1e3,16*1e3,32*1e3,64*1e3],index:r=0,onError:o})=>{const E=await t(...s),L=2*1e3;return E.code===a.SUCCESS||!ue.includes(E.code)||Date.now()+L-e>_?E:(o&&o(E.code),await Oe(L),j({asyncFn:t,fnArgs:s,currentRetryTime:e,maxDuration:_,intervals:i,index:r,onError:o}))};var x=(t=>(t.onBeforePublish="onBeforePublish",t.onPublishRes="onPublishRes",t.onPubInviteCall="onPubInviteCall",t.onPubInviteCallPullKv="onPubInviteCallPullKv",t.onPubInviteCallMiss="onPubInviteCallMiss",t))(x||{}),X=(t=>(t.NOT_CURRENT_DEVICEID="not current device id",t.SECRET_CALL="secret call",t.NOT_INVITEE="not an invitee",t))(X||{}),Y=(t=>(t.PUB_INVITE="pubinvitecall",t.PULL_KV_INVITE="pullkv_invitecall",t.PUSH="system_pubsh",t))(Y||{});class ge extends l.EventEmitter{constructor(e,_,i,r,o){super();I(this,"_listener");I(this,"_needRetryActions",[O.START_SINGLE_CALL,O.START_GROUP_CALL,O.ACCEPT_CALL,O.JOIN_CALL,O.EVENT_UP_CALL]);I(this,"_sessionId","");this._context=e,this._runtime=_,this._initOpts=i,this._timeCorrectioner=r,this._logger=o,this._context.onCallInfo=this._onRecvCallSignal.bind(this),this._context.onconnectionstatechange=this._onIMConnectionStateChange.bind(this),this._sessionId=l.getUUID22()}getSessionId(){return this._sessionId}registerListener(e){this._listener=e}async startCall(e,_){const{clientCallId:i,callType:r,toUsers:o,mediaType:E,secretChat:L,targetType:c,targetId:T,nickName:S,oldRoomId:C}=e;return r===D.SINGLE?this.startSingleCall({clientCallId:i,toUserId:o[0].userId,mediaType:E,secretChat:L,targetType:c,targetId:T,oldRoomId:C,toOrgId:o[0].orgId||""},_):this.startGroupCall({clientCallId:i,toUsers:o,mediaType:E,targetType:c,targetId:T,nickName:S,oldRoomId:C},_)}async startSingleCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(this._context.getCurrentId(),O.START_SINGLE_CALL,e)}async startGroupCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GROUP_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(this._context.getCurrentId(),O.START_GROUP_CALL,e)}async inviteCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_INVITE_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.INVITE_CALL,e)}async ringingCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_RING_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.RINGING_CALL,e)}async acceptCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_ACCEPT_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.ACCEPT_CALL,e)}async joinCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_JOIN_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.JOIN_CALL,e)}async hangupCall(e,_){this._logger.info(n.L_SIGNAL_TRANSPORTER_HANGUP_T,`params: ${JSON.stringify(e)}`,_);const{code:i}=await this._sendCallSignal(e.callId,O.HANGUP_CALL,e);return i===a.NOT_IN_CALL?{code:a.SUCCESS}:{code:i}}async statusUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T,`call status up params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.STATUS_UP_CALL,e)}async eventUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.EVENT_UP_CALL,e)}async dialogUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.DIALOG_UP_CALL,e)}async deleteCallRecord(e,_,i){return this._logger.info(n.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T,`callIds: ${JSON.stringify(_)}`,i),this._sendCallSignal(e,O.DEL_CALL_LOG,{callIds:_})}async syncCallLog(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.userId,O.SYNC_CALL_LOG,e)}async queryUserHasCall(){const e=this._context.getCurrentId();return this._sendCallSignal(e,O.QRY_CALL_STATE,null)}async getCallServerTimestamp(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T,`userId: ${_}`,e),this._sendCallSignal(_,O.QRY_SRV_TIMESTAMP,null)}async getCallTimeInfo(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T,`callId: ${e}`,_),this._sendCallSignal(e,O.GET_CALL_TIME_INFO,{callId:e})}async getUserCallStateList(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T,`userId: ${_}`,e),this._sendCallSignal(_,O.GET_CALL_STATE_LIST,null)}async clearCallRecord(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T,`userId: ${_}`,e),this._sendCallSignal(_,O.CLEAR_CALL_LOG,null)}async getCallSession(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T,`callId: ${e.callId}`,_),this._sendCallSignal(e.callId,O.GET_CALL_SESSION,e)}async sysStatusUp(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T,`opts: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.SYS_STATUS_UP,e)}async upCallLogReaded(e){const _=this._context.getCurrentId();return this._sendCallSignal(_,O.UP_CALL_LOG_READED,e)}_onIMConnectionStateChange(e){const _=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O,`state: ${e}`,_),this._listener.onIMStateChange(e),e===l.RCConnectionStatus.CONNECTED?this._timeCorrectioner.start(_):this._timeCorrectioner.stop(_)}async _sendCallSignal(e,_,i){const r=i?JSON.stringify({...i,sessionId:this._sessionId}):"";let o;this._needRetryActions.includes(_)?o=await j({asyncFn:this._context.setCallInfo.bind(this._context),fnArgs:[e,_,r]}):o=await this._context.setCallInfo(e,_,r);const{code:E,data:L}=o;if(E!==l.ErrorCode.SUCCESS)return{code:E};const{key:c,value:T}=L,S=JSON.parse(T).data;return{code:a.SUCCESS,data:S}}_onRecvCallSignal(e){const _=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O,`data: ${e}`,_),JSON.parse(e).list.forEach(r=>{const{key:o}=r,E=JSON.parse(r.value);switch(o){case O.PUB_INVITE_CALL:this._onPubInviteCall(E,!0,_);break;case O.STATUS_DOWN_CALL:this._onStatusDownCall(E,_);break;case O.EVENT_DOWN_CALL:this._onEventDownCall(E,_);break;case O.DIALOG_DOWN_CALL:this._onDialogDownCall(E,_);break;case O.PUB_CALL_LOG:this._onPubCallLog(E,_);break;case O.PUB_CALL_LOG_READED:break;case O.PUB_NACK_SEQ_ID:break;default:this._onConpensationData(E,_);break}})}_isValidData(e){return!!(l.isNull(e)||l.isString(e)&&((e==null?void 0:e.length)===0||e===this._sessionId))}_onPubInviteCall(e,_=!0,i){try{const r=this._context.getCurrentId(),o=e.callSessionUsers.find(L=>L.userId===r),E=this._context.getConnectionStatus();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`currentUser: ${JSON.stringify(o)}, currentUserId: ${r}, state: ${E}`,i)}catch(r){this._logger.error(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`error: ${r.message}`,i)}if(!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,i);const r={extra:JSON.stringify(e),reason:X.NOT_CURRENT_DEVICEID,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE};_?this.emit(x.onPubInviteCallMiss,Object.assign(e,r)):this.emit(x.onPubInviteCallMiss,Object.assign(e,r));return}this._listener.onInvite(e,_,i),_?this.emit(x.onPubInviteCall,Object.assign(e,{extra:JSON.stringify(e)})):this.emit(x.onPubInviteCallPullKv,Object.assign(e,{extra:JSON.stringify(e)}))}_onStatusDownCall(e,_){if(e.callSessionUsers=e.callSessionUsers.filter(i=>!!i.changed),this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,"",_),!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,_),this._listener.onOtherClientStatusDown(e,_);return}this._listener.onStatusDown(e,_,this._sessionId)}_onEventDownCall(e,_){this._listener.onEventDown(e,_)}_onDialogDownCall(e,_){const{dialogType:i,action:r,extraKeyVal:o}=e;switch(i){case W.SWITCH_MEDIA_TYPE:this._listener.onSwitchMediaType(e,_);break}}_onPubCallLog(e,_){this._logger.info(n.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O,`call record: ${JSON.stringify(e)}`,_),this._listener.onRecvCallEndLog(e,_)}_onConpensationData(e,_){this._logger.info(n.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O,"",_);const{callId:i,callType:r,mediaType:o,secretChat:E,duration:L,callStatus:c,callingUserId:T,callSessionUsers:S,toDeviceId:C,callDialogEntitys:h}=e;S.some(U=>U.sessionStatus===d.INVITED&&U.userId===this._context.getCurrentId())?this._onPubInviteCall({callId:i,toDeviceId:C,callType:r,mediaType:o,inviteUserId:T,callingUserId:T,callSessionUsers:S,secretChat:E},!0,_):this._onStatusDownCall({callId:i,toDeviceId:C,callStatus:c,duration:L,callSessionUsers:S},_),h.length>0&&h.forEach(U=>this._onDialogDownCall(U,_),this)}}const Ue=t=>{const s="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),e=s.length+1;let _=+t;const i=[];do{const r=_%e;_=(_-r)/e,i.unshift(s[r])}while(_);return i.join("")},me=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const s=Math.random()*16|0;return(t==="x"?s:s&3|8).toString(16)}),fe=()=>{let t=me();return t=`${t.replace(/-/g,"")}0`,t=parseInt(t,16),t=Ue(t),t.length>22&&(t=t.slice(0,22)),t},pe="RC_CALLPLUS",Me=1;let B;const V=class V{constructor(){}static init(s,e){B=s,this.isSupport()||B.info("[RCCallIndexDB]","IndexDB is not support in the current environment");const _=window.indexedDB.open(pe,Me);_.onerror=i=>{B.warn("[RCCallIndexDB]",`open indexDB req failed -> ${i.target.error}`)},_.onsuccess=i=>{this._db=i.target.result,this._db&&(this._db.onclose=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has unexpectedly closed. ${r}`),this.unInit()},this._db.onerror=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening error. ${r}`),this.unInit()},this._db.onabort=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening aborted. ${r}`),this.unInit()}),V._instance=new V,e.onSuccess()},_.onupgradeneeded=i=>{this._db=i.target.result,V.createObjStore("CallBW_AbnormalCall",{keyPath:"userId"})}}static unInit(){this._db=null,this._instance=null}static getInstance(){return this._instance}static isSupport(){return!(typeof window>"u"||!window||!window.indexedDB)}static createObjStore(s,e){var _;(_=V._db)!=null&&_.objectStoreNames.contains(s)?B.debug("[RCCallIndexDB]",`createObjStore ${s} already exists`):V._db.createObjectStore(s,e)}addValue(s,e){return new Promise((_,i)=>{if(!V._db){_(!1);return}const o=V._db.transaction([s],"readwrite").objectStore(s).add(e);o.onsuccess=()=>{_(!0)},o.onerror=()=>{B.debug("[RCCallIndexDB]","addValue failed"),_(!1)}})}readByKey(s,e){return new Promise((_,i)=>{if(!V._db){_(null);return}const o=V._db.transaction([s]).objectStore(s).get(e);o.onsuccess=()=>{_(o.result)},o.onerror=E=>{B.warn("[RCCallIndexDB]",`readByKey onerror -> ${E}`),_(null)}})}updateByKey(s,e,_){return new Promise((i,r)=>{if(!V._db){i(!1);return}const E=V._db.transaction([s],"readwrite").objectStore(s).put(_);E.onsuccess=()=>{i(!0)},E.onerror=L=>{i(!1),B.warn("[RCCallIndexDB]",`updateByKey onerror -> ${L}`)}})}removeByKey(s,e){return new Promise((_,i)=>{if(!V._db){_(!1);return}const o=V._db.transaction([s],"readwrite").objectStore(s).delete(e);o.onsuccess=()=>{_(!0)},o.onerror=E=>{_(!1),B.warn("[RCCallIndexDB]",`removeByKey onerror -> ${E}`)}})}};I(V,"_db",null),I(V,"_instance",null);let q=V;class De{constructor(s,e){I(this,"_localStore");I(this,"_indexDBStore");I(this,"_storeKey","CallBW_AbnormalCall");I(this,"_isSupportIndexDB");if(this._runtime=s,this._logger=e,this._isSupportIndexDB=q.isSupport(),this._isSupportIndexDB){q.init(this._logger,{onSuccess:()=>{this._indexDBStore=q.getInstance()}});return}this._localStore=s.localStorage}addAbnormallCallId(s,e){(this._isSupportIndexDB?this._addByIndexDB:this._addByLocalStore).call(this,s,e)}removeAbnormalCallIds(s,e){(this._isSupportIndexDB?this._removeByIndexDB:this._removeByLocalStore).call(this,s,e)}getAbnormalCallIds(s){return(this._isSupportIndexDB?this._getByIndexDB:this._getByLocalStore).call(this,s)}_addByLocalStore(s,e){try{const _=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let i=_[s];i?i.push(e):i=[e],_[s]=i,this._localStore.setItem(this._storeKey,JSON.stringify(_))}catch(_){this._logger.warn("[AbnormalCall]",`_addByLocalStore err: ${_.message}`)}}_removeByLocalStore(s,e){try{const _=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let i=_[s];i&&(i=i.filter(r=>!e.includes(r)),i.length>0?_[s]=i:delete _[s],this._localStore.setItem(this._storeKey,JSON.stringify(_)))}catch(_){this._logger.warn("[AbnormalCall]",`_removeByLocalStore err: ${_.message}`)}}_getByLocalStore(s){let e=null;try{const i=JSON.parse(this._localStore.getItem(this._storeKey)||"{}")[s];i&&(e=i)}catch(_){this._logger.warn("[AbnormalCall]",`_getByLocalStore err: ${_.message}`)}return Promise.resolve(e)}async _addByIndexDB(s,e){try{const _=await this._indexDBStore.readByKey(this._storeKey,s);_?(_.callIds.push(e),this._indexDBStore.updateByKey(this._storeKey,s,{userId:s,callIds:_.callIds})):this._indexDBStore.addValue(this._storeKey,{userId:s,callIds:[e]})}catch(_){this._logger.warn("[AbnormalCall]",`_addByIndexDB err: ${_.message}`)}}async _removeByIndexDB(s,e){try{const _=await this._indexDBStore.readByKey(this._storeKey,s);_&&(_.callIds=_.callIds.filter(i=>!e.includes(i)),_.callIds.length>0?this._indexDBStore.updateByKey(this._storeKey,s,{userId:s,callIds:_.callIds}):this._indexDBStore.removeByKey(this._storeKey,s))}catch(_){this._logger.warn("[AbnormalCall]",`_removeByIndexDB err: ${_.message}`)}}async _getByIndexDB(s){let e=null;try{e=await this._indexDBStore.readByKey(this._storeKey,s)}catch(_){this._logger.warn("[AbnormalCall]",`_getByIndexDB err: ${_.message}`)}return e?e.callIds:null}}var re=(t=>(t[t.PROMPT=0]="PROMPT",t[t.CALL_DURATION=10]="CALL_DURATION",t[t.FIRST_FRAME=20]="FIRST_FRAME",t))(re||{}),b=(t=>(t[t.SUCCESS=0]="SUCCESS",t[t.INVALID_RESPONSE_TIME=80170]="INVALID_RESPONSE_TIME",t[t.NONOPTIMAL_RES_TIME=80171]="NONOPTIMAL_RES_TIME",t))(b||{});class ye{constructor(s,e,_){I(this,"_RTT",0);I(this,"_validMinRTT",200);I(this,"_validMaxRTT",1e3);I(this,"_deltaTime",0);I(this,"_timerId",null);I(this,"_interval",2*1e3);I(this,"_maxRetryTimes",8);I(this,"_startTimes",0);I(this,"_retryTimesInCall",0);I(this,"_maxRetryTimesInCall",3);this._callEngine=s,this._logger=e,this._singleCallDurationEv=_}async getCallClientTimeByServer(s,e){this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T,`callId: ${s}`,e),(!this._RTT||this._RTT>this._validMinRTT)&&await this._getDeltaTime(e),this._RTT>this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.INVALID_RESPONSE_TIME}`,e);const{code:_,data:i}=await this._callEngine.getCallTimeInfo(s,e);if(_!==a.SUCCESS)return this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${_}`,e),{code:_};const{startTime:r}=i,o=Math.floor(r-this._deltaTime);let L=(Date.now()+this._deltaTime-r)/1e3;return L<0&&(this._logger.warn(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P,`invalid duration: ${L}`,e),L=0),L=Math.floor(L),this._RTT>this._validMinRTT&&this._RTT<=this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.NONOPTIMAL_RES_TIME}`,e),this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,serverStartTime:r,clientStartTime:o,duration:L}),e),{code:_,duration:L,clientStartTime:o}}calcClientStartTime(s,e,_){if(this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T,`callId: ${s}, startTime: ${e}`,_),this._RTT>this._validMaxRTT)return this._logger.error(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,_),this._loopCorrectClientTime(s,_),{code:b.INVALID_RESPONSE_TIME};const i=Math.floor(e-this._deltaTime);return this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,startT:e,clientStartTime:i}),_),this._RTT>this._validMinRTT&&(this._retryTimesInCall=0,this._loopCorrectClientTime(s,_)),{code:b.SUCCESS,clientStartTime:i}}start(s){this._timerId||this._startTimes>=this._maxRetryTimes||(this._logger.info(n.L_TIME_CORRECT_START_O,`timerId: ${this._timerId}`),this._startTimes++,this._getDeltaTime(s),this._timerId=se(()=>{this._timerId=null,this.start(s)},this._interval))}stop(s){this._logger.info(n.L_TIME_CORRECT_STOP_O,`timerId: ${this._timerId}`,s),this._timerId&&clearTimeout(this._timerId),this._timerId=null,this._startTimes=0}restart(s){this._logger.info(n.L_TIME_CORRECT_RESTART_O,`legal rtt time, RTT: ${this._RTT}, validMinRTT: ${this._validMinRTT}`,s),!(this._RTT<this._validMinRTT)&&(this.stop(s),this.start(s))}getLocalDelayTime(){return this._deltaTime}getRTT(){return this._RTT}async _getDeltaTime(s){const e=Date.now(),{code:_,data:i}=await this._callEngine.getCallServerTimestamp(s),r=Date.now();if(_!==a.SUCCESS)return{code:_};const o=r-e;return(o<this._RTT||this._RTT===0)&&o<=this._validMaxRTT&&(this._RTT=o),o<this._validMinRTT&&this.stop(s),this._deltaTime=i-e-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime}),s),{code:_,delayTime:this._deltaTime}}async _getDeltaTimeInCall(s,e){const _=Date.now(),{code:i,data:r}=await this._callEngine.getCallTimeInfo(s,e),o=Date.now();if(i!==a.SUCCESS)return{code:i};const E=o-_;E<this._RTT&&(this._RTT=E),this._deltaTime=r.syncTime-_-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({callId:s,rtt:this._RTT,deltaT:this._deltaTime}),e);const L=Math.floor(r.startTime-this._deltaTime),c=Math.floor(r.firstFrametime-this._deltaTime);return E<this._validMinRTT?{code:b.SUCCESS,clientStartTime:L,clientFirstFrameTime:c}:{code:b.INVALID_RESPONSE_TIME,clientStartTime:L,clientFirstFrameTime:c}}async _loopCorrectClientTime(s,e){this.stop(e),this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T,`callId: ${s}`,e);const{code:_,clientStartTime:i,clientFirstFrameTime:r}=await this._getDeltaTimeInCall(s,e);if(_===b.SUCCESS){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${a.SUCCESS}`,e),this._singleCallDurationEv(s,i,r,e);return}if(this._retryTimesInCall>this._maxRetryTimesInCall&&_===b.INVALID_RESPONSE_TIME){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,e),this._singleCallDurationEv(s,i,r,e);return}this._retryTimesInCall>this._maxRetryTimesInCall||(this._retryTimesInCall++,setTimeout(()=>{this._loopCorrectClientTime(s,e)},this._interval))}}var Q=(t=>(t[t.SOON_AFETER=0]="SOON_AFETER",t[t.CURRENT=1]="CURRENT",t))(Q||{}),ne=(t=>(t[t.PUB_INVITE_CALL=0]="PUB_INVITE_CALL",t[t.PULL_KV_INVITE_CALL=1]="PULL_KV_INVITE_CALL",t[t.SYSTEM_PUSH=2]="SYSTEM_PUSH",t))(ne||{}),oe=(t=>(t[t.OUT=-1]="OUT",t[t.GROUP=0]="GROUP",t[t.IN=1]="IN",t))(oe||{});const Se=60*1e3,w=class w extends l.EventEmitter{constructor(e,_,i,r,o){super();I(this,"_mainSession",null);I(this,"_holdSessions",[]);I(this,"_signalModule");I(this,"_abnormalModule");I(this,"_isUpFirstFrameTime",!1);I(this,"_callStartMap",{});I(this,"_timeCorrectioner");this._context=e,this._runtime=_,this._initOpts=i,this._logger=r,this._reportAppEventModule=o,this._timeCorrectioner=new ye(this,r,this._onRecvSinCallDuration.bind(this)),this._signalModule=new ge(e,_,i,this._timeCorrectioner,this._logger),this._signalModule.registerListener({onInvite:this._onInvite.bind(this),onStatusDown:this._onStatusDown.bind(this),onOtherClientStatusDown:this._onOtherClientStatusDown.bind(this),onEventDown:this._onEventDown.bind(this),onSwitchMediaType:this._onSwitchMediaType.bind(this),onRecvCallEndLog:this._onRecvCallEndLog.bind(this),onIMStateChange:this._onIMStateChange.bind(this)}),this._abnormalModule=new De(_,r)}async startCall(e,_){const i=this._context.getCurrentId(),{callType:r,mediaType:o,toUsers:E,targetId:L,targetType:c,oldRoomId:T}=e,{code:S,data:C}=await this._signalModule.startCall({clientCallId:e.callId,callType:r,mediaType:o,toUsers:E,secretChat:_e.NORMAL,targetType:c,targetId:L,oldRoomId:T},_);if(S!==a.SUCCESS)return{code:S};const{callId:h,busylineUsers:f}=C;if(this._abnormalModule.addAbnormallCallId(i,h),this._mainSession=new ie(h,p.INVITED,r,o,i,i,[],this._logger),r===D.SINGLE){const R=this._startTimer(C.callId,d.NO_ANSWER,_);this._mainSession.updateTimerId(te.INVITER,R)}const U={userId:i,userState:d.CALLING,systemState:A.CALLING,targetType:c,targetId:L,cameraEnable:!1,microphoneEnable:!1};let m=E.map(({userId:R,targetType:M,targetId:P})=>({userId:R,userState:d.INVITED,systemState:A.INVITED,targetType:M,targetId:P,cameraEnable:!1,microphoneEnable:!1})),y=[];return f&&(y=f.map(R=>{const{targetType:M,targetId:P}=m.find(H=>H.userId===R.userId);return{userId:R.userId,userState:R.sessionStatus,systemState:A.BUSYLINE_RINGING,targetType:M,targetId:P,cameraEnable:!1,microphoneEnable:!1}}),m=m.filter(({userId:R})=>y.every(({userId:M})=>M!==R))),setTimeout(()=>{this.updateUsersState(h,[U,...m,...y],_)}),{code:S,data:C}}async invite(e,_){var L;if(!this._mainSession)return{code:a.NOT_IN_CALL};const{toUsers:i}=e,r=this._mainSession.getCallId(),{code:o,data:E}=await this._signalModule.inviteCall({callId:r,toUsers:i},_);if(o===a.SUCCESS){this._mainSession.getCallType()===D.SINGLE&&(this._mainSession.updateCallType(D.MULTI),this._onCallTypeChange(this._mainSession.getCallId(),D.MULTI,_));let c=i.map(({userId:S,targetType:C,targetId:h})=>({userId:S,userState:d.INVITED,systemState:A.INVITED,targetType:C,targetId:h,cameraEnable:!1,microphoneEnable:!1})),T=[];E.busylineUsers&&(T=(L=E.busylineUsers)==null?void 0:L.map(S=>{const{targetType:C,targetId:h}=c.find(f=>f.userId===S.userId);return{userId:S.userId,userState:S.sessionStatus,systemState:A.BUSYLINE_RINGING,targetType:C,targetId:h,cameraEnable:!1,microphoneEnable:!1}}),c=c.filter(({userId:S})=>T.every(({userId:C})=>C!==S))),this.updateUsersState(r,[...c,...T],_)}return{code:o,data:E}}clearAllTimer(e,_){[this._mainSession,...this._holdSessions].forEach(i=>{i&&i.getCallId()===e&&i.getAllTimerIds().forEach(r=>this._stopTimer.bind(this)(r,_))})}async hangup(e,_){return this._signalModule.hangupCall({callId:e.callId,sysStatus:e.systemState},_)}async accept(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const{code:i}=await this._signalModule.acceptCall({callId:e.callId},_);return this._stopTimer(this._mainSession.getInviteeTimerId(),_),i!==a.SUCCESS?{code:i}:(this._clearMobileOnPhone(e.callId,_),this._mainSession.updateSessionState(p.CONNECTING),{code:i})}async joinCall(e,_){const i=this._context.getCurrentId();this._mainSession&&this._stopTimer(this._mainSession.getInviteeTimerId(),_);const{code:r}=await this._signalModule.joinCall({callId:e.callId},_);return r!==a.SUCCESS?{code:r}:(this._abnormalModule.addAbnormallCallId(i,e.callId),this._mainSession?this._clearMobileOnPhone(e.callId,_):await this._createSessionByServer(e.callId,!0,_),{code:r})}async requestChangeMediaType(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const i={mediaType:e.mediaType};this._mainSession.updateReqMediaType(e.mediaType);const r=fe(),{code:o}=await this._signalModule.dialogUpCall({transactionId:r,callId:this._mainSession.getCallId(),toUserIds:e.toUserIds,dialogType:W.SWITCH_MEDIA_TYPE,action:v.REQUEST,extraKeyVal:i},_);return o!==a.SUCCESS?{code:o}:{code:a.SUCCESS,data:{transactionId:r}}}async responseChangeMediaType(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const i=this._mainSession.getReqMediaType();return e.agree&&(this._mainSession.updateMediaType(i),this._mainSession.updateReqMediaType(null)),this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:W.SWITCH_MEDIA_TYPE,action:e.agree?v.ACCEPT:v.REFUSE},_)}async cancelChangeMediaType(e,_){return this._mainSession?this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:W.SWITCH_MEDIA_TYPE,action:v.CANCEL},_):{code:a.NOT_IN_CALL}}async getCallLogList(e,_){const i=this._context.getCurrentId(),{code:r,data:o}=await this._signalModule.syncCallLog({userId:i,syncTime:e.timestamp,count:e.count},_);if(r!==a.SUCCESS)return{code:r};const E=o.callLogList.map(L=>ce(L));return{code:a.SUCCESS,data:{hasMore:!!(o!=null&&o.hasMore),maxTime:o.maxTime,list:E}}}async deleteCallLog(e,_){const i=this._context.getCurrentId();return this._signalModule.deleteCallRecord(i,e,_)}async getCallServerTimestamp(e){const{code:_,data:i}=await this._signalModule.getCallServerTimestamp(e);return _!==a.SUCCESS?{code:_}:{code:_,data:i.syncTime}}async getCallTimeInfo(e,_){return this._signalModule.getCallTimeInfo(e,_)}async getOpenCallList(e){const _=this._context.getCurrentId(),{code:i,data:r}=await this._signalModule.getUserCallStateList(e);if(i!==a.SUCCESS)return{code:i};const o=r.callStateList.map(E=>{const{callId:L,callType:c,mediaType:T,callingUserId:S,callUserIds:C,callStatus:h,crtTime:f,userSessionStatus:U,targetType:m,targetId:y,startTime:R,syncTime:M}=E,P=S===_?oe.OUT:oe.IN,{clientStartTime:H=R}=this._timeCorrectioner.calcClientStartTime(L,R,e);return{callId:L,callType:c,callDirection:P,mediaType:T,callerUserId:S,callUserIds:C,sessionState:h,userState:U,startTimestamp:R,endTimestamp:0,duration:Math.floor((+new Date-H)/1e3),syncTimestamp:M,systemState:0,createTimestamp:f}});return{code:i,data:o}}async removeAllCallLog(e){const{code:_}=await this._signalModule.clearCallRecord(e);return _!==a.SUCCESS?{code:_}:{code:_}}async getCallSession(e,_){const{code:i,data:r}=await this._signalModule.getCallSession(e,_);if(i!==a.SUCCESS)return{code:i};const{callId:o,callingUserId:E,callType:L,mediaType:c,callStatus:T,callSessionUsers:S,startTime:C,duration:h,syncTime:f}=r,U=S.map(m=>{const{userId:y,sessionStatus:R,sysStatus:M,targetType:P,targetId:H}=m;return{userId:y,userState:R,systemState:M,targetType:P,targetId:H,cameraEnable:!1,microphoneEnable:!1}});return{code:i,data:{callId:o,startCallerId:E,callType:L,mediaType:c,sessionState:T,callSessionUsers:U,startTime:C,duration:h,syncTime:f}}}getHoldSession(e){const _=this._holdSessions.find(i=>i&&i.getCallId()===e);return _?new K(_,this,this._logger):null}getLocalMainSession(){return this._mainSession?new K(this._mainSession,this,this._logger):null}updateMainSessionState(e){var _;(_=this._mainSession)==null||_.updateSessionState(e)}setIsLocalClientHangup(e){var _;(_=this._mainSession)==null||_.setIsLocalClientHangup(e)}updateUsersState(e,_,i){this._logger.info(n.L_CALL_ENGINE_UPDATE_USERS_STATE_O,`updateUsersState -> users: ${JSON.stringify(_)}`,i);const r=[this._mainSession,...this._holdSessions].find(E=>(E==null?void 0:E.getCallId())===e),o=[];if(r){const E=_.map(L=>{const c=r.getUserList().filter(({userId:h})=>h===L.userId)[0]||{},T=L.userState===d.IDLE,{cameraEnable:S=!1,microphoneEnable:C=!1}=T?{cameraEnable:!1,microphoneEnable:!1}:c;return{...L,cameraEnable:S,microphoneEnable:C}});o.push(...r.updateUserList(E,i))}else o.push(..._);o.length>0&&this._onUserStateChange(e,o,i)}setUserDeviceEnable(e,_,i,r){var o;(o=this._mainSession)==null||o.setUserDeviceEnable(e,_,i,r)}async getCallStaringTime(e,_){return this._timeCorrectioner.getCallClientTimeByServer(e.callId,_)}async systemStatusUp(e,_){return this._signalModule.sysStatusUp(e,_)}async upFirstFrameTime(e){if(!this._mainSession||this._mainSession&&this._mainSession.getCallType()!==D.SINGLE||this._isUpFirstFrameTime)return{code:a.SUCCESS};const i=Date.now(),r=this._timeCorrectioner.getLocalDelayTime(),o=Math.floor(i+r);this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T,`now: ${i}; delay: ${r}; streamReadyTime: ${o}`,e),this._isUpFirstFrameTime=!0;const E=this._mainSession.getCallId(),{code:L}=await this._signalModule.eventUpCall({callId:E,eventType:re.FIRST_FRAME,eventArgs:{streamReadyTime:o},eventTime:Date.now()},e);return this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R,`code: ${L}`,e),{code:L}}endCurrentSession(e,_,i){const r=this._context.getCurrentId();if(this._mainSession&&this._mainSession.getCallId()===_){const o=this._mainSession.getUserList().map(L=>{let{userId:c,userState:T,systemState:S,targetType:C,targetId:h}=L;return c===r&&(S=e),{userId:c,sessionStatus:d.ENDED,statusTime:Date.now(),duration:0,changed:1,inviteUserId:this._mainSession.getStartCallerId(),sysStatus:S,targetType:C,targetId:h}}),E={callId:this._mainSession.getCallId(),toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:o};this._onStatusDown(E,i)}}startTimeCorrection(e){this._timeCorrectioner.restart(e)}getDelayTimeInfo(){return{delayTime:this._timeCorrectioner.getLocalDelayTime(),rtt:this._timeCorrectioner.getRTT()}}upgradeMainSession(e){var i;const _=this._holdSessions.findIndex(r=>r.getCallId()===e);this._mainSession=(i=this._holdSessions.splice(_,1))==null?void 0:i[0]}_onIMStateChange(e){const _=this._logger.createTraceId();let i=0;e===l.RCConnectionStatus.DISCONNECTED&&this._mainSession&&this._mainSession.getSessionState()!==p.ONCALL&&(i=se(()=>{var r;this._logger.info(n.L_CALL_ENGINE_IM_STATE_CHANGE_O,"endCurrentSession, IM disconnected for more than 60s",_),this.endCurrentSession(A.CONNECTION_ERR,(r=this._mainSession)==null?void 0:r.getCallId(),_)},Se)),e===l.RCConnectionStatus.CONNECTED&&i&&clearTimeout(i)}_handleCallTimeout(e,_,i){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`call timeout callId: ${e}, userState: ${_}`,i);const r=[this._mainSession,...this._holdSessions].find(E=>E&&E.getCallId()===e);if(!r){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`handleCallTimeout without session, callId: ${e}`,i);return}const o=this._context.getCurrentId();this._onStatusDown({callId:e,toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:r.getUserList().map(E=>{const{userId:L,targetType:c,targetId:T,stateTime:S}=E;let C,h;return L===o?(C=_===d.MISSED?A.MISSED:A.NO_ANSWER,h=_===d.MISSED?d.MISSED:d.NO_ANSWER):(C=_===d.MISSED?A.NO_ANSWER:A.MISSED,h=_===d.MISSED?d.NO_ANSWER:d.MISSED),{userId:L,sessionStatus:h,statusTime:S?S+1:Date.now(),duration:0,changed:1,inviteUserId:r.getCallerId(),sysStatus:C,targetType:c,targetId:T}})},i)}_startTimer(e,_,i){const r=se(()=>{this._handleCallTimeout(e,_,i),this._signalModule.statusUpCall({callId:e,sessionStatus:_},i)},Se);return this._logger.info(n.L_CALL_ENGINE_START_CALL_TIMER_O,`callId: ${e}, timerId: ${r}`,i),r}_stopTimer(e,_){clearTimeout(e),this._logger.info(n.L_CALL_ENGINE_STOP_CALL_TIMER_O,`timerId: ${e}`,_)}_onInvite(e,_,i){var U,m,y;const r=this._context.getCurrentId(),{callId:o,inviteUserId:E,callType:L,mediaType:c,callSessionUsers:T,secretChat:S,callingUserId:C}=e;if(S===_e.SECRET){this.emit(x.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:X.SECRET_CALL,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE}));return}if(T.some(R=>R.userId===r)){this._abnormalModule.addAbnormallCallId(r,o);const R=new ie(o,p.RINGING,L,c,E,E,[],this._logger);this._signalModule.ringingCall({callId:o},i);const M=this._startTimer(o,d.MISSED,i);R.updateTimerId(te.INVITEE,M),this._mainSession?(this._holdSessions.push(R),this._mainSession.updateSessionState(p.BUSYLINE_WAIT)):this._mainSession=R;const P=new K(R,this,this._logger);this._reportAppEventModule.onReceivedCall(P,i);const H=_?ne.PUB_INVITE_CALL:ne.PULL_KV_INVITE_CALL;this.emit(w.__INNER_INVITE__,P,H);const Z=T.map(({userId:ae,sessionStatus:be,sysStatus:ve,targetType:Be,targetId:we,statusTime:$e})=>({userId:ae,userState:be,systemState:ve,targetType:Be,targetId:we,stateTime:$e,cameraEnable:!1,microphoneEnable:!1}));this.updateUsersState(o,Z,i)}else this.emit(x.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:X.NOT_INVITEE,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE}));const f=T.filter(R=>R.userId!==r&&R.userId!==E&&R.sessionStatus===d.INVITED);if(f.length>0){((U=this._mainSession)==null?void 0:U.getCallType())===D.SINGLE&&((m=this._mainSession)==null?void 0:m.getCallId())===o&&(this._onCallTypeChange(this._mainSession.getCallId(),D.MULTI,i),(y=this._mainSession)==null||y.updateCallType(D.MULTI));const R=[],M=[];f.forEach(P=>{const{userId:H,sessionStatus:Z,sysStatus:ae}=P;R.push({callId:o,userId:H,userState:Z}),M.push({userId:H,userState:Z,systemState:ae,cameraEnable:!1,microphoneEnable:!1})}),this._onOtherMemberInvite(R),this.updateUsersState(o,M,i)}}_onHangup(e,_,i){this._mainSession&&e.forEach(r=>{r.callId===this._mainSession.getCallId()&&(r.userState===d.CANCELLED?this._stopTimer(this._mainSession.getInviteeTimerId(),i):this._stopTimer(this._mainSession.getInviterTimerId(),i))})}_onAccept(e,_){var L,c,T,S;const i=(L=this._mainSession)==null?void 0:L.getSessionState(),r=[p.CONNECTING,p.ONCALL,p.BUSYLINE_WAIT];if(((c=this._mainSession)==null?void 0:c.getCallType())===D.SINGLE&&i&&r.includes(i))return;const o=this._mainSession.getStartCallerId(),E=this._context.getCurrentId();((T=this._mainSession)==null?void 0:T.getCallType())===D.SINGLE&&o===E&&e.filter(h=>h.fromUserId!==E)&&this.emit(w.__INNER_SESSION_CONNECT__,this.getLocalMainSession().getCallId(),_),(S=this._mainSession)==null||S.updateSessionState(p.CONNECTING),this._stopTimer(this._mainSession.getInviterTimerId(),_)}async _onStatusDown(e,_){var f,U;const{callStatus:i,startTime:r,syncTime:o,callId:E}=e;if(E!==((f=this._mainSession)==null?void 0:f.getCallId()))return;if(this._callStartMap[E]=this._callStartMap[E]||{},!this._callStartMap[E].isReceiveCallStartTime&&i===p.ONCALL){this._callStartMap[E].isReceiveCallStartTime=!0;const{code:m,clientStartTime:y}=await this._timeCorrectioner.calcClientStartTime(E,r,_);m===b.SUCCESS&&this._reportAppEventModule.onReceivedCallStartTime({callId:E,callStartTime:y},_)}let L=!1;const c=this._context.getCurrentId(),T=e.callSessionUsers.map(m=>([d.IDLE,d.DECLINED,d.MISSED,d.NO_ANSWER,d.CANCELLED].includes(m.sessionStatus)&&m.userId===c&&(L=!0),{userId:m.userId,userState:m.sessionStatus,systemState:m.sysStatus,stateTime:m.statusTime,cameraEnable:!1,microphoneEnable:!1}));if(T.length>0&&this.updateUsersState(E,T,_),!this._mainSession&&!this._holdSessions.length)return;const{hangupData:S,acceptData:C,otherInvitedData:h}=Ce(e);S.length>0&&this._onHangup(S,e.callStatus,_),C.length>0&&this._onAccept(C,_),h.length>0&&((U=this._mainSession)==null?void 0:U.getCallType())===D.MULTI&&this._onOtherMemberInvite(h),(e.callStatus===p.ENDED||L)&&this.sessionClose(e,_,!0)}_onOtherClientStatusDown(e,_){var c,T,S;const i=this._context.getCurrentId(),{callId:r,callSessionUsers:o,callStatus:E}=e,L=o.find(({userId:C})=>C===i);if(L&&(this._mainSession||this._holdSessions.length)){const{userId:C,sessionStatus:h,statusTime:f}=L;if(h===d.CONNECTING){const U=[d.ONCALL,d.CONNECTING],m=((c=this._mainSession)==null?void 0:c.getCallId())===r,y=(S=(T=this._mainSession)==null?void 0:T.getUserList().find(M=>M.userId===i))==null?void 0:S.userState;m&&y&&U.includes(y)||(this.updateUsersState(r,[{userId:C,userState:h,systemState:A.OTHER_CLIENT_ACCEPT,stateTime:f,cameraEnable:!1,microphoneEnable:!1}],_),this.sessionClose(e,_,!1))}}}async _onEventDown(e,_){var c;const{callId:i,eventTime:r,eventArgs:o,eventType:E,fromUserId:L}=e;if(E===re.CALL_DURATION&&i===((c=this._mainSession)==null?void 0:c.getCallId())){const{firstFrameTime:T}=o,{code:S,clientStartTime:C}=await this._timeCorrectioner.calcClientStartTime(i,T,_);this._logger.info(n.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O,`clientFirstFrameTime: ${C}`,_),S===b.SUCCESS&&this._reportAppEventModule.onReceivedCallFirstFrameTime(i,C,_)}}_onRecvSinCallDuration(e,_,i,r){var o;((o=this._mainSession)==null?void 0:o.getCallId())===e&&(this._reportAppEventModule.onReceivedCallStartTime({callId:e,callStartTime:_},r),this._reportAppEventModule.onReceivedCallFirstFrameTime(e,i,r))}_onSwitchMediaType(e,_){var U,m,y,R,M;const{callId:i,action:r,extraKeyVal:o,transactionId:E,promoterId:L}=e,{mediaType:c,reason:T}=o,S=(U=this._mainSession)==null?void 0:U.getCallId();if(i!==S){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`not current session callId: ${S}, recvCallId: ${i}`,_);return}const{transactionId:C,action:h,mediaType:f}=((m=this._mainSession)==null?void 0:m.getOldDialogData())||{};if(C===E&&h===r&&f===c){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,"duplicate dialog data",_);return}if(this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`action: ${r}, reason: ${T}`,_),(y=this._mainSession)==null||y.setOldDialogData({transactionId:E,action:r,mediaType:c}),r===v.REQUEST)this._onRequestChangeMediaType({transactionId:E,userId:L,mediaType:c},_);else{let P=null;switch(T){case v.CANCEL:P=k.CANCEL_CHANGE_MEDIA_TYPE;break;case v.ACCEPT:P=k.SERVER_ALLOW_MEDIA_TYPE,(R=this._mainSession)==null||R.updateMediaType(this._mainSession.getReqMediaType()),(M=this._mainSession)==null||M.updateReqMediaType(null);break;case v.REFUSE:P=k.REFUSE_CHANGE_MEDIA_TYPE;break;case v.TIMEOUT:P=k.CHANGE_MEDIA_TYPE_TIMEOUT;break}k[P]&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},P,_)}r===v.NOTICE&&c===u.AUDIO&&!T&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},k.SERVER_ALLOW_MEDIA_TYPE,_)}_onRecvCallEndLog(e,_){const i=ce(e);this._reportAppEventModule.onReceivedCallRecord(i,_)}sessionClose(e,_,i){const{callId:r}=e,o=this._context.getCurrentId();this._abnormalModule.removeAbnormalCallIds(o,[r]);let E=[this._mainSession,...this._holdSessions].find(T=>T&&T.getCallId()===r);if(!E){this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`unexpect session callId -> ${r}`,_);return}this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`callId: ${r}`,_),this._mainSession&&this._mainSession.getCallId()===r&&(this._mainSession.getAllTimerIds().forEach(T=>this._stopTimer.bind(this)(T,_)),E.getCallType()===D.SINGLE&&(this._isUpFirstFrameTime=!1),delete this._callStartMap[r]),this.emit(w.__INNER_SESSION_CLOSE__,r,_);const L=E.getUserList().find(T=>T.userId===o);let c;i&&e.toDeviceId!==this._signalModule.getSessionId()&&(c=E.getIsLocalClientHangup()?L.systemState:A.OTHER_CLIENT_HANGUP),this._reportAppEventModule.onCallEnded(new K(E,this,this._logger),c||L.systemState,_),this._removeSession(r)}_removeSession(e){var _;if(e===((_=this._mainSession)==null?void 0:_.getCallId()))this._mainSession=null;else{const i=this._holdSessions.findIndex(r=>(r==null?void 0:r.getCallId())===e);this._holdSessions.splice(i,1)}}async _createSessionByServer(e,_=!1,i){this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T,`callId: ${e}`,i);const{code:r,data:o}=await this.getCallSession({callId:e},i);if(r!==a.SUCCESS){this._logger.error(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`errcode: ${r}`,i);return}this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`code: ${r}, data: ${JSON.stringify(o)}`,i);const{callType:E,mediaType:L,callSessionUsers:c,startCallerId:T}=o;this._mainSession=new ie(e,p.CONNECTING,E,L,T,T,[],this._logger),_&&this._clearMobileOnPhone(e,i),this.updateUsersState(e,c,i)}async _clearMobileOnPhone(e,_){const i=[this._mainSession,...this._holdSessions].find(r=>(r==null?void 0:r.getCallId())===e);if(i&&i.getCallType()===D.MULTI){this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_T,`callId: ${e}`,_);const{code:r}=await this.systemStatusUp({callId:e,sysStatus:A.ON_PHONE_END,forward:Q.CURRENT},_);r===a.SUCCESS?this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}`,_):this._logger.warn(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}, errCode: ${r}`,_)}}_onUserStateChange(e,_,i){const r=this._context.getCurrentId();_.forEach(o=>{const{userId:E,userState:L,systemState:c}=o;E!==r&&this._reportAppEventModule.onRemoteUserStateChanged({callId:e,userId:E,userState:L,reason:c},i)}),_.forEach(({userId:o,systemState:E})=>{o===r&&E===A.ABNORMAL_END&&this.emit(w.__INNER_SESSION_CLOSE__,e,i)})}_onOtherMemberInvite(e){e.forEach(_=>{var E;const{userId:i,callId:r}=_,o=(E=this.getLocalMainSession())==null?void 0:E.getInviterUserId();this._reportAppEventModule.onRemoteUserInvited([i],o,r)})}_onRequestChangeMediaType(e,_){const{userId:i,transactionId:r,mediaType:o}=e;this._reportAppEventModule.onReceivedChangeMediaTypeRequest(i,r,o,_)}_receiveMediaTypeChangeResult(e,_,i){_===k.SERVER_ALLOW_MEDIA_TYPE&&this.emit(w.__INNER_CHANGE_MEDIA_TYPE__,e.mediaType,i),this._reportAppEventModule.onReceivedChangeMediaTypeResult({...e,code:_},i)}_onCallTypeChange(e,_,i){this._reportAppEventModule.onCallTypeChanged(_,e,i)}};I(w,"__INNER_SESSION_CLOSE__","inner-session-close"),I(w,"__INNER_SESSION_CONNECT__","inner-session-connect"),I(w,"__INNER_CHANGE_MEDIA_TYPE__","inner-change-media-type"),I(w,"__INNER_INVITE__","inner-invite");let J=w;var z=(t=>(t.NORMAL="RongCloudRTC",t.SCREEN="ScreenShare",t))(z||{});const G=class G extends l.EventEmitter{constructor(e,_,i,r,o,E){super();I(this,"_rtcClient");I(this,"_localTracks",[]);I(this,"_room",null);I(this,"_callId","");I(this,"_callMediaType");I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_isPubTiny",!1);I(this,"_videoConfigIsChange",!1);I(this,"_audioConfigIsChange",!1);I(this,"_userViewMap",{});I(this,"_callPlusStatusReportListener",null);I(this,"_remoteAudioEnable",!0);this._context=e,this._runtime=_,this._initOpts=i,this._logger=r,this._callEngine=o,this._reportAppEventModule=E,this._rtcClient=i==null?void 0:i.rtcClient,this._isPubTiny=i.isPubTiny||!1}setCallPlusStatusReportListener(e){this._callPlusStatusReportListener=e}async getCameraVideoTrack(e){const _=this.getLocalVideoTrack(),{code:i,track:r}=_&&!this._videoConfigIsChange?{track:_,code:a.SUCCESS}:await this._createVideoTrack(e);return this._videoConfigIsChange=!1,i!==a.SUCCESS?{code:i}:{code:a.SUCCESS,track:r}}async getMicrophoneAudioTrack(e){const _=this.getLocalAudioTrack(),{code:i,track:r}=_&&!this._audioConfigIsChange?{track:_,code:a.SUCCESS}:await this._createAudioTrack(e);return this._audioConfigIsChange=!1,i!==a.SUCCESS?{code:i}:{code:a.SUCCESS,track:r}}async createCallMediaTracks(e,_){this._callMediaType=e;const{code:i}=await this.getMicrophoneAudioTrack(_);if(i!==a.SUCCESS)return{code:i};if(e===u.AUDIO_VIDEO){const{code:r}=await this.getCameraVideoTrack(_);if(r!==a.SUCCESS)return{code:r}}return{code:a.SUCCESS}}setVideoConfig(e){this._videoConfigIsChange=!0,this._videoConfig=e}setAudioConfig(e){this._audioConfigIsChange=!0,this._audioConfig=e}destroyAllTracks(e){this._logger.info(n.L_RTC_MODULE_DESTROY_ALL_TRACKS_O,"",e),this._localTracks.forEach(_=>{_.destroy()}),this._localTracks.length=0}setAllRemoteAudioEnable(e,_){return this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T,`enable: ${e}`,_),l.isBoolean(e)?(this._remoteAudioEnable=e,this._room?(this._room.getRemoteTracks().filter(r=>r.isAudioTrack()).forEach(r=>{e?r.unmute():r.mute()}),this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,"success",_),{code:a.SUCCESS}):{code:a.SUCCESS}):(this._logger.error(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,`param error, enable: type is boolean, value: ${e}`),{code:a.PARAM_ERROR})}async destroyTrack(e){e.destroy();const _=this._localTracks.findIndex(i=>i.getTrackId()===e.getTrackId());this._localTracks.splice(_,1)}async sessionConnected(e,_){var i;this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_T,`callId: ${e}`,_);try{if(!this._room){const{code:r,room:o}=await this.joinRTCRoom(e,_);if(r!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`errCode -> ${r}`,_);return}this._callId=e,this._regRTCListeners(),this._room=o;const E=((i=this._room)==null?void 0:i.getRemoteUserIds())||[];E.length>0&&this._onOtherMemJoined(E.map(L=>({callId:e,userId:L})),_)}}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`callId -> ${e}, err msg -> ${r.message}`,_);return}try{if(this._localTracks.length>0){this.emit(x.onBeforePublish);const r=this._isPubTiny?this._localTracks.map(E=>E.isVideoTrack()?{track:E,isPubTiny:!0}:E):this._localTracks,{code:o}=await this.publish(r,_);this.emit(x.onPublishRes,o)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CONNECT_P,"sessionConnected local tracks is empty",_)}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`publish Exception callId -> ${e}, err msg -> ${r.message}`,_);return}this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_R,`code: ${a.SUCCESS}`,_)}async sessionClose(e,_){var r;this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_T,`callId: ${e}`,_),this.destroyAllTracks(_);const i=(r=this._room)==null?void 0:r.getRoomId();if(this._room&&e===i){const{code:o}=await this._rtcClient.leaveRoom(this._room);if(this._releaseStoredData(),o!==N.RCRTCCode.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CLOSE_R,`leaveRoom failed, code: ${o}`,_);return}this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom success",_)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom throw exception: not in room",_)}async disableVideoTrack(){const e=this.getLocalVideoTrack();return e?{code:await e.mute(),track:e}:{code:a.CAMERA_CLOSED}}async enableVideoTrack(e){const _=this.getLocalVideoTrack();return _?_.isOwnerMuted()?{code:await _.unmute()}:{code:a.SUCCESS}:{code:a.CAMERA_CLOSED}}async changeVideoDevice(e){const _=[],i=[],{code:r,track:o}=await this._rtcClient.createCameraVideoTrack(z.NORMAL,this._videoConfig);if(r!==N.RCRTCCode.SUCCESS)return{code:r};const{minBitrate:E,maxBitrate:L}=this._videoConfig;(E||L)&&o.setBitrate(L,E);let c;if(this._localTracks&&this._localTracks.forEach(T=>{T.isVideoTrack()?(T.destroy(),c=T):i.push(T)}),this._localTracks=this._localTracks.filter(T=>c&&T.getTrackId()!==c.getTrackId()),_.push(o),i.push(o),this._localTracks=i,this._onLocalTrackReady(_,e),this._room){const{code:T}=await this._room.publish(_);if(T!==N.RCRTCCode.SUCCESS)return{code:T}}return{code:a.SUCCESS,track:o}}async disableAudioTrack(){const e=this.getLocalAudioTrack();return e?{code:await e.mute(),track:e}:{code:a.MICROPHONE_CLOSED}}async changeMediaType(e,_){if(this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T,`mediaType: ${e}`,_),e===u.AUDIO_VIDEO){let i=this.getLocalVideoTrack();if(!i){const{code:E,track:L}=await this._createVideoTrack(_);if(E!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`create video track errCode: ${E}`,_);return}i=L;const{minBitrate:c,maxBitrate:T}=this._videoConfig;(c||T)&&i.setBitrate(T,c)}const r=this._isPubTiny?{track:i,isPubTiny:!0}:i,{code:o}=await this.publish([r],_);if(o!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`publish errCode: ${o}`,_);return}}if(e===u.AUDIO){const i=this.getLocalVideoTrack();if(i){const{code:r}=await this._room.unpublish([i]);r!==N.RCRTCCode.SUCCESS&&this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`unpublish errCode: ${r}`,_),this.destroyTrack(i)}}this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,"success",_)}async joinRTCRoom(e,_){this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_T,`call: ${e}`,_);const{code:i,room:r,tracks:o}=await j({asyncFn:this._rtcClient.joinRTCRoom.bind(this._rtcClient),fnArgs:[e,void 0,void 0,!1,l.RTCMode.CALL]});return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,`callId: ${e}, errCode: ${i}`,_),this._onRTCMethodFail(A.JOIN_ROOM_ERR,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,"success",_),this._room=r,this._onSelfJoined({callId:e,userId:this._context.getCurrentId()},_),o!=null&&o.length&&this._onRemoteTrackPublish(o),this._callId=e,{code:a.SUCCESS,room:r,tracks:o})}async subscribeTracks(e,_){if(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_T,JSON.stringify({params:e.map(r=>{const{track:o,subTiny:E}=r;return{trackId:o.getTrackId(),subTiny:E}})}),_),!this._room)return{code:a.SUCCESS};const{code:i}=await j({asyncFn:this._room.subscribe.bind(this._room),fnArgs:[e],onError:r=>{}});return i!==N.RCRTCCode.SUCCESS?(this._reportAppEventModule.onFetchRemoteMediaError(e,i),this._onRTCMethodFail(A.SUBSCRIBE_ERR,_),this._logger.error(n.L_RTC_MODULE_SUBSCRIBE_R,`errorCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_R,"success",_),{code:a.SUCCESS})}async unsubscribeTracks(e,_){if(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_T,JSON.stringify({trackIds:e.map(r=>r.getTrackId())}),_),!this._room)return{code:a.SUCCESS};const{code:i}=await this._room.unsubscribe(e);return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_UNSUBSCRIBE_R,`errorCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_R,"success",_),{code:a.SUCCESS})}_releaseStoredData(){this._room=null,this._remoteAudioEnable=!0,this._userViewMap={}}getRemoteTracks(){const e={};return this._room&&this._room.getRemoteUserIds().forEach(i=>{e[i]=this._room.getRemoteTracksByUserId(i)}),e}getRemoteTrack(e,_){var i;return(i=this._room)==null?void 0:i.getRemoteTracksByUserId(e).find(r=>_===u.AUDIO?r.isAudioTrack():r.isVideoTrack())}_regRTCListeners(){this._room.registerRoomEventListener({onKickOff:(e,_)=>{this._onKickOff(e,this._room.getRoomId(),_),this._releaseStoredData()},onUserJoin:e=>{const _=e.map(r=>({callId:this._callId,userId:r})),i=this._logger.createTraceId();this._onOtherMemJoined(_,i)},onUserLeave:e=>{e.forEach(_=>{delete this._userViewMap[_]})},onTrackPublish:this._onRemoteTrackPublish.bind(this),onTrackUnpublish:this._onTrackUnpublish.bind(this),onTrackReady:e=>{this._onRemoteTrackReady([e])},onVideoMuteChange:e=>{this._onVideoMuteChagne({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onAudioMuteChange:e=>{this._onAudioMuteChange({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onRTCPeerConnectionCloseByException:this._onRTCPeerConnectionCloseByException.bind(this)}),this._room.registerReportListener({onStateReport:this._onRTCStateReport.bind(this)}),this._room.onAudioLevelChange(e=>{this._reportAppEventModule.onUserAudioLevelChanged(e)})}_onLocalTrackReady(e,_){this._reportAppEventModule.onUserMediaAvailable(e,_)}_onRemoteTrackReady(e){this._reportAppEventModule.onUserMediaAvailable(e),this.emit(G.__INNER_RECEIVE_FIRST_FRAME__)}_onKickOff(e,_,i,r){this._logger.info(n.L_RTC_MODULE_RECEIVE_KICK_OFF_O,`roonId: ${_}, byServer: ${e}, state: ${i}, kickExtra: ${JSON.stringify(r)}`);let o=A.CONNECTION_ERR;if(e)if(r)o=r.kickReasonCode;else switch(i){case N.RCKickReason.SERVER_KICK:o=A.KICKED_BY_SERVER;break;case N.RCKickReason.OTHER_KICK:o=A.OTHER_CLIENT_JOINED;break;case N.RCKickReason.IM_DISCONNECTED:o=A.CONNECTION_ERR;break;case N.RCKickReason.IM_LOGOUT:o=A.LOGOUT;break;case N.RCKickReason.OTHER_CLIENT_IM_CONNECTED:o=A.OTHER_CLIENT_LOGIN;break}this.emit(G.__INNER_ON_KICKOFF__,o,_)}_onRTCPeerConnectionCloseByException(){const e=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O,"",e),this.emit(G.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,e)}async _onSelfJoined(e,_){this.emit(G.__INNER_ON_SELF_JOINED__,e.callId,_)}_onRemoteTrackPublish(e){const _=this._logger.createTraceId();this._onDeviceEnableChange(e,_),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(r=>r.getTrackId())}),_);const i=[];e.forEach(r=>{var E;const o=r.getUserId();if(r.isAudioTrack())i.push({track:r,subTiny:!1}),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,r);else if((E=this._userViewMap[o])!=null&&E.videoView){this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,r);const{isTiny:L}=this._userViewMap[o];i.push({track:r,subTiny:L})}}),i.length&&this.subscribeTracks(i,_)}async _onTrackUnpublish(e){const _=this._logger.createTraceId();this._onDeviceEnableChange(e,_),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(i=>i.getTrackId())}),_),await this.unsubscribeTracks(e,_)}_onAudioMuteChange(e){const _=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),_);const i=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([i],_),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,i)}_onVideoMuteChagne(e){const _=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),_);const i=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([i],_),this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,i)}_onRTCStateReport(e){const{senders:_,receivers:i}=e;_.forEach(r=>{var c;const{kind:o,packetsLostRate:E,rtt:L}=r;this._callMediaType===u.AUDIO_VIDEO&&o==="audio"||(c=this._callPlusStatusReportListener)==null||c.onSendPacketLoss(E||0,L||0)}),i.forEach(r=>{var C;const{trackId:o,kind:E,packetsLostRate:L,bitrate:c}=r;if(this._callMediaType===u.AUDIO_VIDEO&&E==="audio")return;const{userId:T}=N.helper.parseTrackId(o),S={};S[T]={packetLostRate:L,bitRate:c},(C=this._callPlusStatusReportListener)==null||C.onReceivePacketLoss(S)})}_onRTCMethodFail(e,_){this.emit(G.__INNER_RTC_PROCESS_FAILED__,e,_)}_onOtherMemJoined(e,_){this.emit(G.__INNER_ON_OTHER_JOINED__,e,_)}_onDeviceEnableChange(e,_){this.emit(G.__INNER_ON_DEVICE_ENABLE_CHANGE__,e,_)}async _createAudioTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isAudioTrack()))return this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:_,track:i}=await this._rtcClient.createMicrophoneAudioTrack(z.NORMAL,this._audioConfig);if(_!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,`errCode: ${_}`,e),{code:_};this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._audioConfig;return(r||o)&&i.setBitrate(o,r),this._localTracks.push(i),this._onLocalTrackReady([i],e),{code:a.SUCCESS,track:i}}async _createVideoTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isVideoTrack()&&!L.isDestroyed()))return this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:_,track:i}=await this._rtcClient.createCameraVideoTrack(z.NORMAL,this._videoConfig);if(_!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,`errCode: ${_}`,e),{code:_};this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._videoConfig;return(r||o)&&i.setBitrate(o,r),this._localTracks.push(i),this._onLocalTrackReady([i],e),{code:a.SUCCESS,track:i}}getLocalVideoTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(_=>_.isVideoTrack())),e}getLocalAudioTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(_=>_.isAudioTrack())),e}async publish(e,_){this._logger.info(n.L_RTC_MODULE_PUBLISH_T,`tracksIds: ${e.map(r=>r instanceof N.RCLocalTrack?r.getTrackId():r.track.getTrackId())}`,_);const{code:i}=await j({asyncFn:this._room.publish.bind(this._room),fnArgs:[e],onError:r=>{}});return i!==N.RCRTCCode.SUCCESS?(this._onRTCMethodFail(A.PUBLISH_ERR,_),this._logger.error(n.L_RTC_MODULE_PUBLISH_R,`errCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_PUBLISH_R,`code: ${a.SUCCESS}`,_),{code:a.SUCCESS})}publishVideoTrack(){const e=this.getLocalVideoTrack(),_=this._isPubTiny?{track:e,isPubTiny:!0}:e;return this._room.publish([_])}setVideoView(e,_){const i=[];e.forEach(r=>{const{userId:o,videoElement:E,isTiny:L=!1}=r;if(this._userViewMap[o]={videoView:E,isTiny:L},o===this._context.getCurrentId()||!this._room)return;const T=(this.getRemoteTracks()[o]||[]).map(S=>({track:S,subTiny:L})).filter(({track:S})=>!S.isSubscribed());i.push(...T)}),this._logger.info(n.L_RTC_MODULE_SET_VIDEO_VIEW_O,JSON.stringify({userViewMap:this._userViewMap,needSubTrackIds:i.map(({track:r})=>r.getTrackId())}),_),i.length&&this.subscribeTracks(i,_)}removeVideoView(e,_){const i=[];e.forEach(r=>{const o=this.getRemoteTracks()[r];if(o&&o.length){const E=o.filter(L=>L.isVideoTrack());E.length&&i.push(E[0])}delete this._userViewMap[r]}),this._logger.info(n.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O,JSON.stringify({userViewMap:this._userViewMap,unsubTracks:i.map(r=>r.getTrackId())}),_),i.length&&this.unsubscribeTracks(i,_)}getUserViewMap(){return this._userViewMap}async playMedia(e,_,i,r){this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_T,`userId: ${e}, mediaType: ${_}, videoView: ${i==null?void 0:i.nodeName}`,r);let o=null;if(e===this._context.getCurrentId()?o=_===u.AUDIO?this.getLocalAudioTrack():this.getLocalVideoTrack():o=this.getRemoteTracks()[e].filter(E=>_===u.AUDIO?E.isAudioTrack():E.isVideoTrack())[0],!o)return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`error code: ${a.MEDIA_RESOURCE_INVALIED}`,r),{code:a.MEDIA_RESOURCE_INVALIED};try{const{code:E}=o.isAudioTrack()?await o.play():await o.play(i);return o.isAudioTrack()&&!this._remoteAudioEnable&&o.mute(),E!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${E}`,r),{code:E}):(this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_R,"success",r),{code:a.SUCCESS})}catch(E){return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${a.PLAY_MEDIA_FAILED}, message: ${E.message},`,r),{code:a.PLAY_MEDIA_FAILED}}}};I(G,"__INNER_RTC_PROCESS_FAILED__","inner-rtc-process-failed"),I(G,"__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__","inner-rtc-peerconnection-abnormal-close"),I(G,"__INNER_ON_SELF_JOINED__","inner-on-self-joined"),I(G,"__INNER_ON_OTHER_JOINED__","inner-on-other-joined"),I(G,"__INNER_RECEIVE_FIRST_FRAME__","inner-receive-first-frame"),I(G,"__INNER_ON_KICKOFF__","inner-kickoff-frame"),I(G,"__INNER_ON_DEVICE_ENABLE_CHANGE__","inner-on-device-enable-change");let $=G;class Pe{constructor(s){I(this,"_listener");this._logger=s}registerEventListener(s){this._listener=s}_callAppListener(s,...e){var i;const _=(i=this._listener)==null?void 0:i[s];if(_)try{_(...e)}catch(r){this._logger.error(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({name:r.name,message:r.message}))}}onReceivedCall(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCall",callId:s.getCallId()}),e),this._callAppListener("onReceivedCall",s)}onRemoteUserInvited(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserInvited",inviteeUserList:s,inviterUserId:e,callId:_})),this._callAppListener("onRemoteUserInvited",s,e,_)}onCallConnected(s){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallConnected",callId:s.getCallId()})),this._callAppListener("onCallConnected",s)}onCallTypeChanged(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallTypeChanged",callId:e,callType:s}),_),this._callAppListener("onCallTypeChanged",s,e)}onRemoteUserStateChanged(s,e){const{callId:_,userId:i,userState:r,reason:o}=s;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserStateChanged",callId:_,userId:i,userState:r,reason:o}),e),this._callAppListener("onRemoteUserStateChanged",_,i,r,o)}onCallEnded(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallEnded",callId:s.getCallId(),closeReason:e}),_),this._callAppListener("onCallEnded",s,e)}onRemoteCameraStateChanged(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteCameraStateChanged",callId:s,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const _=e==null?void 0:e.getUserId();this._callAppListener("onRemoteCameraStateChanged",s,_,e==null?void 0:e.isOwnerMuted())}onRemoteMicrophoneStateChanged(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteMicrophoneStateChanged",callId:s,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const _=e==null?void 0:e.getUserId();this._callAppListener("onRemoteMicrophoneStateChanged",s,_,e==null?void 0:e.isOwnerMuted())}onReceivedCallRecord(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallRecord",record:s}),e),this._callAppListener("onReceivedCallRecord",s)}onReceivedChangeMediaTypeRequest(s,e,_,i){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeRequest",userId:s,transactionId:e}),i),this._callAppListener("onReceivedChangeMediaTypeRequest",s,e,_)}onReceivedChangeMediaTypeResult(s,e){const{userId:_,transactionId:i,mediaType:r,code:o}=s;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeResult",userId:_,mediaType:r}),e),this._callAppListener("onReceivedChangeMediaTypeResult",{userId:_,transactionId:i,mediaType:r,code:o})}onReceivedCallStartTime(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallStartTime",info:s}),e),this._callAppListener("onReceivedCallStartTime",s)}onReceivedCallFirstFrameTime(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallFirstFrameTime",callId:s,callFirstFrameTime:e}),_),this._callAppListener("onReceivedCallFirstFrameTime",s,e)}onUserMediaAvailable(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onUserMediaAvailable",trackIds:s.map(_=>_.getTrackId())}),e),s.forEach(_=>{const i=_.getUserId(),r=_.isAudioTrack()?u.AUDIO:u.VIDEO;this._callAppListener("onUserMediaAvailable",i,r)})}onFetchRemoteMediaError(s,e){s.forEach(({track:_})=>{const i=_.getUserId();this._callAppListener("onFetchRemoteMediaError",i,e)})}onUserAudioLevelChanged(s){s.forEach(({track:e,audioLevel:_})=>{const i=e.getUserId();this._callAppListener("onUserAudioLevelChanged",i,_)})}}var le=(t=>(t[t.UNKNOW_ERR=41e3]="UNKNOW_ERR",t[t.DB_ERR=41001]="DB_ERR",t[t.JSON_ERR=41002]="JSON_ERR",t[t.INVALID_JSON_ERR=41003]="INVALID_JSON_ERR",t[t.MISSING_PARAMS=41004]="MISSING_PARAMS",t[t.PARAMS_REQUIRED=41005]="PARAMS_REQUIRED",t[t.DATA_FORMAT_ERR=41006]="DATA_FORMAT_ERR",t[t.METHOD_NOT_IMPLEMENTED=41007]="METHOD_NOT_IMPLEMENTED",t[t.CALL_NOT_EXIST=41010]="CALL_NOT_EXIST",t[t.SINGAL_EXCEED_TWO_INVITEE=41011]="SINGAL_EXCEED_TWO_INVITEE",t[t.GROUP_EXCEEDS_QUORUM=41012]="GROUP_EXCEEDS_QUORUM",t[t.OPERATION_EXPIRED=41013]="OPERATION_EXPIRED",t[t.DEVICE_IS_CALLING=41014]="DEVICE_IS_CALLING",t[t.REPORT_STREAM_READY_TIME_IS_INVALID=41018]="REPORT_STREAM_READY_TIME_IS_INVALID",t[t.NOT_CALL_YOURSELF=41019]="NOT_CALL_YOURSELF",t[t.SESSION_STATUS_NOT_EXIST=41020]="SESSION_STATUS_NOT_EXIST",t[t.HANGUP_NOT_ALLOW=41021]="HANGUP_NOT_ALLOW",t[t.ACCEPT_NOT_ALLOW=41022]="ACCEPT_NOT_ALLOW",t[t.OPERATION_NOT_ALLOW=41025]="OPERATION_NOT_ALLOW",t[t.TRANSACTION_ID_ERR=41100]="TRANSACTION_ID_ERR",t[t.UP_VIDEO_CANCELED=41050]="UP_VIDEO_CANCELED",t[t.CURRENT_CALL_IS_AUDIO=41051]="CURRENT_CALL_IS_AUDIO",t[t.CURRENT_CALL_IS_VIDEO=41052]="CURRENT_CALL_IS_VIDEO",t))(le||{});class Ie{constructor(s,e,_,i){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_callPlusStatistics");I(this,"_clientCallId","");I(this,"_isLaunchHangup",!1);I(this,"_needHangupCallId",null);I(this,"_callEngine");I(this,"_rtcModule");I(this,"_reportAppEventModule");this._context=s,this._logger=e,this._runtime=_,this._initOpts=i,this._reportAppEventModule=new Pe(e),this._callPlusStatistics=new Re(this._logger,this._context),this._callEngine=new J(this._context,this._runtime,this._initOpts,this._logger,this._reportAppEventModule),this._rtcModule=new $(this._context,this._runtime,this._initOpts,this._logger,this._callEngine,this._reportAppEventModule),this._rtcModule.on($.__INNER_RTC_PROCESS_FAILED__,this._rtcProcessFailHandle.bind(this)),this._rtcModule.on($.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,this._peerConnectionAbnormalClose.bind(this)),this._rtcModule.on($.__INNER_ON_SELF_JOINED__,this._selfJoinedHandle.bind(this)),this._rtcModule.on($.__INNER_ON_OTHER_JOINED__,this._otherJoinedHandle.bind(this)),this._rtcModule.on($.__INNER_RECEIVE_FIRST_FRAME__,this._receiveFirstFrameHandle.bind(this)),this._rtcModule.on($.__INNER_ON_KICKOFF__,this._kickoffHandle.bind(this)),this._rtcModule.on($.__INNER_ON_DEVICE_ENABLE_CHANGE__,this._receiveDeviceEnableChangeHandle.bind(this)),this._callEngine.on(J.__INNER_SESSION_CONNECT__,this._rtcModule.sessionConnected.bind(this._rtcModule)),this._callEngine.on(J.__INNER_SESSION_CLOSE__,this._sessionCloseHandle.bind(this)),this._callEngine.on(J.__INNER_CHANGE_MEDIA_TYPE__,this._rtcModule.changeMediaType.bind(this._rtcModule)),this._callEngine.on(J.__INNER_INVITE__,(r,o)=>{this._callPlusStatistics.reportStatisticsData(F.L_QS_RECEIVE_CALL_S,a.SUCCESS,+new Date,r,"",o)})}_rtcProcessFailHandle(s,e){const _=this._callEngine.getLocalMainSession();if(_){const i=_.getCallId();this._callEngine.systemStatusUp({callId:i,sysStatus:s,forward:Q.CURRENT},e),this._callPlusStatistics.reportStatisticsData(F.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,_),this.__innerHangup({callId:i,systemState:s},e)}}_peerConnectionAbnormalClose(s){const e=this._callEngine.getLocalMainSession();e&&(this._callEngine.systemStatusUp({callId:e.getCallId(),sysStatus:A.CONNECTION_ERR,forward:Q.CURRENT},s),this._callEngine.endCurrentSession(A.CONNECTION_ERR,e.getCallId(),s))}async _selfJoinedHandle(s,e){const _=this._context.getCurrentId(),i=this._callEngine.getLocalMainSession();this._reportAppEventModule.onCallConnected(i);const r=this._rtcModule.getLocalVideoTrack(),o=this._rtcModule.getLocalAudioTrack(),E=r?!r.isOwnerMuted():!1,L=o?!o.isOwnerMuted():!1;this._callEngine.setUserDeviceEnable(_,u.VIDEO,E,e),this._callEngine.setUserDeviceEnable(_,u.AUDIO,L,e);const c=[{userId:_,userState:d.ONCALL,systemState:A.ONCALL,cameraEnable:E,microphoneEnable:L}];this._callEngine.updateUsersState(s,c,e),this._callEngine.startTimeCorrection(e)}_otherJoinedHandle(s,e){var r;let _="";const i=s.map(o=>(_=o.callId,{userId:o.userId,userState:d.ONCALL,systemState:A.ONCALL,cameraEnable:!1,microphoneEnable:!1}));this._callEngine.updateUsersState(_,i,e),((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL)}_receiveFirstFrameHandle(s){var e;((e=this._callEngine.getLocalMainSession())==null?void 0:e.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL),this._callEngine.upFirstFrameTime(s)}_kickoffHandle(s,e,_){if(s===A.CONNECTION_ERR){this._callEngine.endCurrentSession(s,e,_);return}const i=this._callEngine.getLocalMainSession();if(i){const r=i.getCallId();this._callPlusStatistics.reportStatisticsData(F.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,i,this._clientCallId),this._callEngine.systemStatusUp({callId:r,sysStatus:s,forward:Q.CURRENT},_),this._callEngine.endCurrentSession(s,e,_)}}_receiveDeviceEnableChangeHandle(s,e){s.forEach(_=>{const i=_.getUserId(),r=_.isAudioTrack()?u.AUDIO:u.VIDEO;this._callEngine.setUserDeviceEnable(i,r,!_.isOwnerMuted(),e)})}_sessionCloseHandle(s,e){this._isLaunchHangup||(this._clientCallId=""),this._isLaunchHangup=!1,this._rtcModule.sessionClose(s,e)}setCallPlusEventListener(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O,s?Object.keys(s).join(","):null),this._reportAppEventModule.registerEventListener(s)}setStatusReportListener(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O,s?Object.keys(s).join(","):null),this._rtcModule.setCallPlusStatusReportListener(s)}setVideoView(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T,JSON.stringify({list:s.map(_=>{const{userId:i,videoElement:r,isTiny:o}=_;return{userId:i,elementName:r==null?void 0:r.nodeName,isTiny:o}})}),e),!l.notEmptyArray(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, list: not empty array, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};for(let _=0;_<s.length;_++){const i=s[_],{userId:r,videoElement:o}=i;if(!l.notEmptyString(r))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, userId: not empty string, value: ${r}`,e),{code:a.PARAM_ERROR};if(!de(o))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, videoElement: need a video element, value: ${o instanceof HTMLElement?o.nodeName:o}`,e),{code:a.PARAM_ERROR}}return this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,"succes",e),this._rtcModule.setVideoView(s,e),{code:a.SUCCESS}}removeVideoView(s){const e=this._logger.createTraceId();return this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T,JSON.stringify({userIds:s}),e),l.notEmptyArray(s)&&s.every(_=>l.notEmptyString(_))?(this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,"succes",e),this._rtcModule.removeVideoView(s,e),{code:a.SUCCESS}):(this._logger.error(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR})}async playMedia(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_T,JSON.stringify({userId:s,mediaType:e}),_),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, userId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};if(l.isUndefined(u[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, mediaType is illegal, value: ${e}`,_),{code:a.PARAM_ERROR};const{videoView:i}=this._rtcModule.getUserViewMap()[s]||{};return e!==u.AUDIO&&!i?(this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`errCode: ${a.VIDEO_VIEW_NOT_SET}, video view not set`,_),{code:a.VIDEO_VIEW_NOT_SET}):this._rtcModule.playMedia(s,e,i,_)}createVideoConfigBuilder(){return new Le(this._logger)}setVideoConfig(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T,JSON.stringify(s));const{frameRate:e,resolution:_,maxBitrate:i,minBitrate:r}=s;if(!N.RCFrameRate[e])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, frameRate is illegal, value: ${e}`),{code:a.PARAM_ERROR};if(!N.RCResolution[_])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, resolution is illegal, value: ${_}`),{code:a.PARAM_ERROR};const{code:o,errorMsg:E}=Te(r,i);return o!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,E),this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,"success"),this._videoConfig={...s},this._rtcModule.setVideoConfig(this._videoConfig),{code:a.SUCCESS}}createAudioConfigBuilder(){return new Ee(this._logger)}setAudioConfig(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T,JSON.stringify(s));const{sampleRate:e,minBitrate:_,maxBitrate:i}=s;if(e&&!l.isNumber(e))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,`param error, sampleRate: type is number, value: ${e}`),{code:a.PARAM_ERROR};const{code:r,errorMsg:o}=Te(_,i);return r!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,o),this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,"success"),this._audioConfig={...s},this._rtcModule.setAudioConfig(this._audioConfig),{code:a.SUCCESS}}async startCall(s,e=D.SINGLE,_=u.AUDIO_VIDEO){this._clientCallId=l.getUUID();const i=+new Date,r=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_T,`userIds: ${s.join(",")}, callType: ${e}, mediaType: ${_}`,r),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,r),{code:a.SIGNAL_DISCONNECTED};const o=this._context.getNaviInfo();if(!o||!ee(o))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,r),{code:a.RTC_SERVICE_UNAVAILABLE};if(!(l.notEmptyArray(s)&&s.every(C=>l.notEmptyString(C))))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,r),{code:a.PARAM_ERROR};if(l.isUndefined(D[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, callType is illegal, value: ${e}`,r),{code:a.PARAM_ERROR};if(l.isUndefined(u[_]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, mediaType is illegal, value: ${_}`,r),{code:a.PARAM_ERROR};if(s.length>1&&e===D.SINGLE)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, You can only call one person in a single call, userIds: ${s.join(",")}`,r),{code:a.PARAM_ERROR};if(this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SESSION_EXIST}, session exist`,r),{code:a.SESSION_EXIST};const{code:E}=await this._rtcModule.createCallMediaTracks(_,r);if(E!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`create meida tracks error code: ${E}`,r),{code:E};const{code:L,data:c}=await this._callEngine.startCall({toUsers:s.map(C=>({userId:C})),callType:e,mediaType:_,callId:this._clientCallId},r);if(this._callPlusStatistics.reportStatisticsData(F.L_QS_START_CALL_S,L,i,null,this._clientCallId,null,{mediaType:_,callType:e,callId:(c==null?void 0:c.callId)||""}),L!==a.SUCCESS)return this._rtcModule.destroyAllTracks(r),this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`signal error code: ${L}`,r),{code:L};const{callId:T,clientCallId:S}=c;return this._needHangupCallId===S?(this._callEngine.clearAllTimer(T,r),this._callEngine.hangup({callId:T},r),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,`the ${T} call has been hangup`,r),{code:a.SUCCESS}):(e===D.MULTI&&await this._rtcModule.sessionConnected(T,r),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,JSON.stringify({data:c,code:L}),r),{code:a.SUCCESS,callId:T})}async joinMultiCall(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T,`callId: ${s}`,e),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SIGNAL_DISCONNECTED}`,e),{code:a.SIGNAL_DISCONNECTED};const _=this._context.getNaviInfo();if(!_||!ee(_))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.RTC_SERVICE_UNAVAILABLE}`,e),{code:a.RTC_SERVICE_UNAVAILABLE};if(!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`params err, callId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};const{code:i,data:r}=await this._callEngine.getCallSession({callId:s},e);if(i!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`get call data error, code: ${i}`,e),{code:i};const{mediaType:o}=r,E=this._callEngine.getLocalMainSession();if(E&&E.getCallId()!==s)return{code:a.SESSION_EXIST};const{code:L}=await this._rtcModule.createCallMediaTracks(o,e);if(L!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`create meida tracks error code: ${L}`,e),{code:L};const{code:c}=await this._callEngine.joinCall({callId:s,mediaType:o},e);return c!==a.SUCCESS?(this._rtcModule.destroyAllTracks(e),this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`signal error code: ${c}`,e),{code:c}):(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SUCCESS}`,e),await this._rtcModule.sessionConnected(s,e),{code:a.SUCCESS})}async invite(s){var o;const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_T,`callId: ${s.join(",")}`,e),!(l.notEmptyArray(s)&&s.every(E=>l.notEmptyString(E))))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};const{code:_,data:i}=await this._callEngine.invite({toUsers:s.map(E=>({userId:E}))},e);if(_!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`signal error code: ${_}`,e),{code:_};const r=[];return(o=i.busylineUsers)!=null&&o.length&&r.push(...i.busylineUsers.map(E=>({userId:E.userId,state:E.sessionStatus}))),this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_R,`success busyUsers: ${JSON.stringify(r)}`,e),{code:a.SUCCESS,busyUsers:r}}async accept(s){const e=+new Date,_=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_T,`callId: ${s}`,_),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,_),{code:a.SIGNAL_DISCONNECTED};const i=this._context.getNaviInfo();if(!i||!ee(i))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,_),{code:a.RTC_SERVICE_UNAVAILABLE};if(!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`params err, callId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};const r=this._callEngine.getLocalMainSession(),o=this._callEngine.getHoldSession(s);if(!r&&!o)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode : ${a.NOT_IN_CALL}, session not exist`,_),{code:a.NOT_IN_CALL};if(s===(o==null?void 0:o.getCallId())){const{code:S}=await this.hangup(r.getCallId());if(S!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`hangup mainSession error code: ${S}`,_),{code:S};this._callEngine.upgradeMainSession(s)}const L=r.getMediaType(),{code:c}=await this._rtcModule.createCallMediaTracks(L,_);if(c!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`create meida tracks error code: ${c}`,_),{code:c};const{code:T}=await this._callEngine.accept({callId:s},_);return this._callPlusStatistics.reportStatisticsData(F.L_QS_ACCEPT_CALL_S,T,e,r),T!==a.SUCCESS?(this._rtcModule.destroyAllTracks(_),this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`signal error code: ${T}`,_),{code:T}):(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_R,"success",_),this._rtcModule.sessionConnected(s,_),{code:a.SUCCESS})}async __innerHangup(s,e){var r;const{callId:_}=s;this._callEngine.setIsLocalClientHangup(!0),this._callEngine.clearAllTimer(_,e);const{code:i}=await this._callEngine.hangup(s,e);return i===le.CALL_NOT_EXIST?{code:a.SUCCESS}:(i===a.SUCCESS&&_===((r=this._callEngine.getLocalMainSession())==null?void 0:r.getCallId())&&await this._rtcModule.sessionClose(_,e),{code:i})}async hangup(s){const e=+new Date,_=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_T,`callId: ${s}`,_);const i=this._callEngine.getLocalMainSession();if(!i)return{code:a.NOT_IN_CALL};if(s&&!l.isString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId: type is string, value: ${s}`,_),{code:a.PARAM_ERROR};const r=i.getCallId();if(s&&s!==r&&!this._callEngine.getHoldSession(s))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId is invalid, value: ${s}`,_),{code:a.CALL_ID_INVALID};this._isLaunchHangup=!0,this._needHangupCallId=s||r;const E=this._callEngine.getHoldSession(this._needHangupCallId)||i,L=this._context.getCurrentId(),c=i.getUserList().filter(h=>h.userId===L)[0].state,T=[i.getCreatorUserId(),i.getInviterUserId()].includes(L),S=Ae(c,T),{code:C}=await this.__innerHangup({callId:this._needHangupCallId,systemState:S},_);return this._callPlusStatistics.reportStatisticsData(F.L_QS_HANGUP_CALL_S,C,e,E,this._clientCallId),C!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`signal error code : ${C}`,_),{code:C}):(this._needHangupCallId=null,this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_R,"success",_),{code:a.SUCCESS})}async requestChangeMediaType(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T,`mediaType: ${s}`,e),l.isUndefined(u[s]))return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`params err, mediaType is illegal, value: ${s}`,e),{code:a.PARAM_ERROR};const _=this.getCurrentCallSession(),i=_==null?void 0:_.getMediaType();if(s===i)return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code: ${a.MEDIATYPE_INVALID}`,e),{code:a.MEDIATYPE_INVALID};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const r=_==null?void 0:_.getUserList().filter(L=>L.userId!==this._context.getCurrentId()).map(L=>L.userId),{code:o,data:E}=await this._callEngine.requestChangeMediaType({mediaType:s,toUserIds:r||[]},e);return o!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`signal error code: ${o}`,e),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`success transactionId: ${E.transactionId}`,e),{code:a.SUCCESS,transactionId:E.transactionId})}async cancelChangeMediaType(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T,`transactionId: ${s}`,e),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const{code:_}=await this._callEngine.cancelChangeMediaType({transactionId:s},e);return _!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`signal error code: ${_}`,e),{code:_}):(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,"success",e),{code:a.SUCCESS})}async replyChangeMediaType(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T,`transactionId: ${s}`,_),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};if(!l.isBoolean(e))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, isAgree: type is boolean, value: ${e}`,_),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,_),{code:a.NOT_IN_CALL};const{code:i}=await this._callEngine.responseChangeMediaType({transactionId:s,agree:e},_);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`signal error: ${i}`,_),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,"success",_),{code:a.SUCCESS})}getCurrentCallSession(){return this._callEngine.getLocalMainSession()}async getAvailableCallRecordsFromServer(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T,"",s);const{code:e,data:_}=await this._callEngine.getOpenCallList(s);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`success, data: ${JSON.stringify(_)}`,s),{code:a.SUCCESS,records:_})}async getCallRecords(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T,`startTimestamp: ${s}, count: ${e}`,_),!(l.isNumber(s)&&s>=0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, startTimestamp: is a number >= 0, value: ${s}`,_),{code:a.PARAM_ERROR};if(!(l.isNumber(e)&&e>0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, count: is a number >= 0, value: ${e}`,_),{code:a.PARAM_ERROR};const{code:i,data:r}=await this._callEngine.getCallLogList({timestamp:s,count:e},_);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`signal error code: ${i}`,_),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,"success",_),{code:a.SUCCESS,result:r})}async deleteCallRecordsFromServer(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T,`callIds: ${s.join(",")}`,e),!(l.notEmptyArray(s)&&s.every(i=>l.notEmptyString(i))))return this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`params err, callIds: not empty array, callId: not empty string, callIds: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};const{code:_}=await this._callEngine.deleteCallLog(s,e);return _!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`signal error code: ${_}`,e),{code:_}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,"success",e),{code:a.SUCCESS})}async deleteAllCallRecordsFromServer(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T,"",s);const{code:e}=await this._callEngine.removeAllCallLog(s);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,"success",s),{code:a.SUCCESS})}async startCamera(){var r;const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_T,"",s);const{code:e,track:_}=await this._rtcModule.getCameraVideoTrack(s);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`create video track error code: ${e}`,s),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.VIDEO,!0,s),!(_!=null&&_.isPublished())&&((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())===p.ONCALL){const{code:o}=await this._rtcModule.publishVideoTrack();return o!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`publish error code: ${o}`,s),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",s),{code:a.SUCCESS})}const{code:i}=await this._rtcModule.enableVideoTrack(s);return i!==N.RCRTCCode.SUCCESS&&i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`signal error code: ${i}`,s),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",s),{code:a.SUCCESS})}async stopCamera(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_T,"",s);const{code:e,track:_}=await this._rtcModule.disableVideoTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,`error code: ${e}`,s),{code:e}):(this._rtcModule.destroyTrack(_),this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.VIDEO,!1,s),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,"success",s),{code:a.SUCCESS})}async switchCamera(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T,`cameraId: ${s}`,e),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`param error, cameraId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};const _=this._callEngine.getLocalMainSession();if(!_)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_IN_CALL}`,e),{code:a.NOT_IN_CALL};if(_.getMediaType()===u.AUDIO)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_VIDEO_CALL}`,e),{code:a.NOT_VIDEO_CALL};this._videoConfig.cameraId=s,this._rtcModule.setVideoConfig(this._videoConfig);const{code:i}=await this._rtcModule.changeVideoDevice(e);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`call client changeVideoDevice error code: ${i}`,e),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,"success",e),{code:a.SUCCESS})}async startMicrophone(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_T,"",s);const{code:e,track:_}=await this._rtcModule.getMicrophoneAudioTrack(s);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`create microphone audio track error code: ${e}`,s),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.AUDIO,!0,s),!_.isOwnerMuted())return this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",s),{code:a.SUCCESS};const i=await _.unmute();return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`signal error code: ${e}`,s),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",s),{code:a.SUCCESS})}async stopMicrophone(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T,"",s);const{code:e,track:_}=await this._rtcModule.disableAudioTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,`signal error code: ${e}`,s),{code:e}):(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.AUDIO,!1,s),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,"success",s),{code:a.SUCCESS})}isMicrophoneEnabled(){const s=this._rtcModule.getLocalAudioTrack();return!!s&&!s.isOwnerMuted()}async setAllRemoteAudioEnable(s){const e=this._logger.createTraceId();return this._rtcModule.setAllRemoteAudioEnable(s,e)}getVersion(){return"1.1.0"}async getCameras(){return await N.device.getCameras()}async getMicrophones(){return await N.device.getMicrophones()}}const Ve=t=>t?l.isObject(t)?Object.keys(t).includes("rtcClient")?l.isObject(t.rtcClient)?{isLegal:!0}:{isLegal:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:{isLegal:!1,code:a.NOT_INSTALL_RTC_PLUGIN}:{isLegal:!1,msg:"Initialization options must be an object"}:{isLegal:!1,msg:"Initialization missing parameter -> options"},Ge={tag:"RCCallPlus",verify(t){return l.VersionManage.add("plugin-call-plus","1.1.0"),l.VersionManage.validEngine("5.8.2")?!0:(console.error(`The current engine version '${l.VersionManage.getInfo().engine}' error, plugin-call-plus required engine version at least '5.8.2'.`),!1)},setup(t,s,e){const _=Ve(e);if(!_.isLegal)throw new Error(`[CallPlusLib installer steup]${_.msg}`);const i=t.createLogger("CallPlusLib","RTC"),r=l.isUndefined(e.logOutputLevel)?l.LogL.WARN:e.logOutputLevel;return i.setOutputLevel(r),i.warn(n.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O,"CallPlus Version: 1.1.0, Commit: 568b4853a74c41e90cb77a27e29264189c682d32"),new Ie(t,i,s,e)}};Object.defineProperty(g,"RCCallPlusFrameRate",{enumerable:!0,get:()=>N.RCFrameRate}),Object.defineProperty(g,"RCCallPlusResolution",{enumerable:!0,get:()=>N.RCResolution}),g.RCAudioConfigBuilder=Ee,g.RCCallPlusCallState=p,g.RCCallPlusClient=Ie,g.RCCallPlusCode=a,g.RCCallPlusMediaType=u,g.RCCallPlusMediaTypeChangeResult=k,g.RCCallPlusReason=A,g.RCCallPlusSession=K,g.RCCallPlusSessionUserState=d,g.RCCallPlusType=D,g.RCVideoConfigBuilder=Le,g.installer=Ge,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yYW5kb20udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9pbmRleERCLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9BYm5vcm1hbENhbGwudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXZlbnRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvVGltZUNvcnJlY3Rpb25lci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0ZvcndhcmRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsRGlyZWN0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvUkNDYWxsRW5naW5lLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUlRDUmVzb3VyY2VUYWcudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JUQ01vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahCBzZXNzaW9uXG4gICAqL1xuICBTRVNTSU9OX0VYSVNUOiA4MDAwMixcbiAgLyoqXG4gICAqIOacquWKoOWFpemAmuivnVxuICAgKi9cbiAgTk9UX0lOX0NBTEw6IDgwMDAzLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L6KKr56aB5q2iXG4gICAqL1xuICBNRURJQVRZUEVfSU5WQUxJRDogODAwMDQsXG4gIC8qKlxuICAgKiDlvZPliY3kuI3mmK/op4bpopHpgJror51cbiAgICovXG4gIE5PVF9WSURFT19DQUxMOiA4MDAwNSxcbiAgLyoqXG4gICAqIOW8gOmAmueahOmfs+inhumikeacjeWKoeayoeacieWPiuaXtueUn+aViOaIlumfs+inhumikeacjeWKoeW3suWFs+mXrVxuICAgKi9cbiAgUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEU6IDgwMDA2LFxuICAvKipcbiAgICog6LCD55So5Ye95pWw5pe277yM5Lyg5YWl55qE55So5oi35YiX6KGo5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0xJU1RfSU5WQUlMRDogODAwMDcsXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTpgJror50gSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBDQUxMX0lEX0lOVkFMSUQ6IDgwMDA4LFxuICAvKipcbiAgICog5LqL5YqhIElkIOS4uuepuumUmeivr1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfSU5WQUxJRDogODAwMDksXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTnlKjmiLcgSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0lEX0lOVkFMSUQ6IDgwMDEwLFxuICAvKipcbiAgICog5Y+R6LW35Y2V5Lq65ZG85Y+r5pe277yM5Lq65ZGY5YiX6KGo5Lit5Y+q6IO95pyJ5LiA5Liq5Lq6XG4gICAqL1xuICBTSU5HTEVfQ0FMTF9OT1RfU1VQUE9SVF9NVUxUSV9QRVJTT046IDgwMDExLFxuICAvKipcbiAgICogaW0g5pyq6L+e5o6lXG4gICAqL1xuICBTSUdOQUxfRElTQ09OTkVDVEVEOiA4MDAxMixcbiAgLyoqXG4gICAqIOaRhOWDj+WktOacquaJk+W8gFxuICAgKi9cbiAgQ0FNRVJBX0NMT1NFRDogODAxMDAsXG4gIC8qKlxuICAgKiDpuqblhYvpo47mnKrmiZPlvIBcbiAgICovXG4gIE1JQ1JPUEhPTkVfQ0xPU0VEOiA4MDEwMSxcbiAgLyoqXG4gICAqIOaXoOWqkuS9k+i1hOa6kFxuICAgKi9cbiAgTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQ6IDgwMTAyLFxuICAvKipcbiAgICog5pyqIGluc3RhbGwgUlRDIOaPkuS7tlxuICAgKi9cbiAgTk9UX0lOU1RBTExfUlRDX1BMVUdJTjogODAxMDMsXG4gIC8qKlxuICAgKiDmkq3mlL7lvILluLhcbiAgICovXG4gIFBMQVlfTUVESUFfRkFJTEVEOiA4MDEwNCxcbiAgLyoqXG4gICAqIOaSreaUvuinhumikemcgOimgSB2aWRlbyDlhYPntKBcbiAgICovXG4gIFZJREVPX1ZJRVdfTk9UX1NFVDogODAxMDUsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUkNDYWxsUGx1c0xvZ2dlclRhZyB7XG4gIExfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08gPSAnTC1pbmRleF9pbnN0YWxsX2NhbGxfcGx1c19wbHVnaW4tTycsXG4gIC8qKlxuICAgKiDkuJrliqHlsYLkuovku7bms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9ldmVudF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOS4muWKoeWxguS6i+S7tuiwg+eUqFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfZXZlbnRfbGlzdGVuZXItTycsXG4gIC8qKlxuICAgKiDpgJror53otKjph4/mlbDmja7nm5HlkKzms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9TVEFUVVNfUkVQT1JUX0xJU1RFTkVSX08gPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3N0YXR1c19yZXBvcnRfbGlzdGVuZXItTycsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfU1RBVFVTX1JFUE9SVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfc3RhdHVzX3JlcG9ydF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOiuvue9ruaRhOWDj+WktOinhumikemFjee9rumhuVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF92aWRlb19jb25maWctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zZXRfdmlkZW9fY29uZmlnLVInLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9mcmFtZV9yYXRlLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfUkVTT0xVVElPTl9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9yZXNvbHV0aW9uLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfQklUUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9iaXRyYXRlLU8nLFxuICAvKipcbiAgICog6K6+572u6bqm5YWL6aOO6Z+z6aKR6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X2F1ZGlvX2NvbmZpZy1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9hdWRpb19jb25maWctUicsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9CSVRSQVRFX08gPSAnTC1jYWxscGx1c19hdWRpb19jb25maWdfc2V0X2JpdHJhdGUtTycsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9TQU1QTEVfUkFURV9PID0gJ0wtY2FsbHBsdXNfYXVkaW9fY29uZmlnX3NldF9zYW1wbGVfcmF0ZS1PJyxcbiAgLyoqXG4gICAqIOmihOiniFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfUFJFVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3ByZXZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BSRVZJRVdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9wcmV2aWV3LVInLFxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfY2FsbC1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbGwtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror53ku7vliqFcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2pvaW5fbXVsdGlfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnee7k+aenFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IgPSAnTC1jYWxscGx1c19jbGllbnRfam9pbl9tdWx0aV9jYWxsLVInLFxuICAvKipcbiAgICog5o6l5ZCs6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9hY2NlcHQtVCcsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror53nu5PmnpxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2FjY2VwdC1SJyxcbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1QgPSAnTC1jYWxscGx1c19jbGllbnRfaGFuZ3VwLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9oYW5ndXAtUicsXG4gIC8qKlxuICAgKiDpgoDor7dcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2ludml0ZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfaW52aXRlLVInLFxuICAvKipcbiAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2i6K+35rGCXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1jYWxscGx1c19jbGllbnRfcmVxdWVzdF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcXVlc3RfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbmNlbF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfY2FuY2VsX2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i5bqU562UXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6L+b6KGM5Lit55qE6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ1VSUkVOVF9DQUxMX1NFU1NJT05fVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY3VycmVudF9jYWxsX3Nlc3Npb24tVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DVVJSRU5UX0NBTExfU0VTU0lPTl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9jdXJyZW50X2NhbGxfc2Vzc2lvbi1SJyxcbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKiBBdmFpbGFibGVDYWxsU2Vzc2lvbnNGcm9tU2VydmVyXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9hdmFpbGFibGVfY2FsbF9zZXNzaW9uc19mcm9tX3NlcnZlci1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfYXZhaWxhYmxlX2NhbGxfc2Vzc2lvbnNfZnJvbV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53orrDlvZVcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY2FsbF9yZWNvcmRzLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IgPSAnTC1jYWxscGx1c19jbGllbnRfZ2V0X2NhbGxfcmVjb3Jkcy1SJyxcbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg5riF55CG6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVInLFxuICAvKipcbiAgICog5riF55CG5omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVInLFxuICAvKipcbiAgICog5omT5byA5pGE5YOP5aS0XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdGFydF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zd2l0Y2hfY2FtZXJhLVInLFxuICAvKipcbiAgICog5omT5byA6bqm5YWL6aOOXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X21pY3JvcGhvbmUtUicsXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0b3BfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc3RvcF9taWNyb3Bob25lLVInLFxuICAvKipcbiAgICog6K6+572uIHZpZGVvIHZpZXdcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctUicsXG4gIExfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PID0gJ0wtcnRjX21vZHVsZV9zZXRfdmlkZW9fdmlldy1PJyxcbiAgLyoqXG4gICAqIOWIoOmZpCB2aWRlbyB2aWV3XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVInLFxuICBMX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTyA9ICdMLXJ0Y19tb2R1bGVfcmVtb3ZlX3ZpZGVvX3ZpZXctTycsXG4gIC8qKlxuICAgKiDmkq3mlL7lqpLkvZNcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9wbGF5X21lZGlhLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IgPSAnTC1jYWxscGx1c19jbGllbnRfcGxheV9tZWRpYS1SJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfVCA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1UJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1SJyxcbiAgLyoqXG4gICAqIOmdmemfs+i/nOerr+mfs+mikVxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9UID0gJ0wtcnRjX21vZHVsZV9zZXRfYWxsX3JlbW90ZV9hdWRpb19lbmJhbGUtVCcsXG4gIExfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiA9ICdMLXJ0Y19tb2R1bGVfc2V0X2FsbF9yZW1vdGVfYXVkaW9fZW5hYmxlLVInLFxuICAvKipcbiAgICog6K6i6ZiFXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QgPSAnTC1ydGNfbW9kdWxlX3N1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SID0gJ0wtcnRjX21vZHVsZV9zdWJzY3JpYmUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojorqLpmIVcbiAgICovXG4gIExfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9UID0gJ0wtcnRjX21vZHVsZV91bnN1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IgPSAnTC1ydGNfbW9kdWxlX3Vuc3Vic2NyaWJlLVInLFxuICAvKipcbiAgICog5Li75Yqo5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9UID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVQnLFxuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVInLFxuICAvKipcbiAgICog5Y+W5raI5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfVU5QVUJMSVNIX1QgPSAnTC1ydGNfbW9kdWxlX3VucHVibGlzaC1UJyxcbiAgTF9SVENfTU9EVUxFX1VOUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV91bnB1Ymxpc2gtUicsXG4gIC8qKlxuICAgKiDplIDmr4HmiYDmnInpn7Pop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTyA9ICdMLXJ0Y19tb2R1bGVfZGVzdHJveV9hbGxfdHJhY2tzLU8nLFxuICAvKipcbiAgICogc2Vzc2lvbiDlu7rnq4vlkI4gUlRDIOaooeWdl+eahOWkhOeQhlxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9UID0gJ0wtcnRjX21vZHVsZV9zZXNzaW9uX2Nvbm5lY3QtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCA9ICdMLXJ0Y19tb2R1bGVfc2Vzc2lvbl9jb25uZWN0LVAnLFxuICBMX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY29ubmVjdC1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g57uT5p2f5ZCOIFJUQyDmqKHlnZfnmoTlpITnkIZcbiAgICovXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1AgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUicsXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX3ZpZGVvX3RyYWNrLVQnLFxuICBMX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IgPSAnTC1ydGNfbW9kdWxlX2NyZWF0ZV92aWRlb190cmFjay1SJyxcbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikei1hOa6kFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19UID0gJ0wtcnRjX21vZHVsZV9jcmVhdGVfYXVkaW9fdHJhY2stVCcsXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX2F1ZGlvX3RyYWNrLVInLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfcHVibGlzaC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOi1hOa6kOWPlua2iOWPkeW4g1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfdW5wdWJsaXNoLU8nLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfZW5hYmxlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOiiq+i4ouWHuuaIv+mXtFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTyA9ICdMLXJ0Y19tb2R1bGVfcmVjZWl2ZV9raWNrX29mZi1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBwZWVyY29ubmVjdGlvbiDlvILluLjlhbPpl61cbiAgICovXG4gIExfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PID0gJ0wtcnRjX21vZHVsZV9yZWNlaXZlX3BlZXJjb25uZWN0aW9uX2V4Y2VwdF9jbG9zZS1PJyxcbiAgLyoqXG4gICAqIOWIh+aNouWqkuS9k+exu+Wei1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1ydGNfbW9kdWxlX2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiA9ICdMLXJ0Y19tb2R1bGVfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tUicsXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tUicsXG5cbiAgLy8gc2lnbmFsIOaooeWdl+aXpeW/l+agh+etvlxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3NpbmdsZV9jYWxsLVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ3JvdXBfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOmCgOivt1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW52aXRlLVQnLFxuICAvKipcbiAgICog5ZON6ZODXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmluZy1UJyxcbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfYWNjZXB0LVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9BQ0NFUFRfUiA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9hY2NlcHQtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2pvaW5fY2FsbC1UJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaGFuZ3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2NhbGxfc3RhdHVzX3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2FsbF9ldmVudF91cC1UJyxcbiAgLyoqXG4gICAqIOmAmuivneWvueivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9jYWxsX2RpYWxvZ191cC1UJyxcbiAgLyoqXG4gICAqIOWIoOmZpOmAmuivneiusOW9lVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfREVMRVRFX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZGVsZXRlX2NhbGxfcmVjb3JkLVQnLFxuICAvKipcbiAgICog6I635Y+W6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9SRUNPUkRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9TRVJWRVJfVElNRV9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX3NlcnZlcl90aW1lLVQnLFxuICAvKipcbiAgICog6I635Y+W5oyH5a6a6YCa6K+d55qE5pe26Ze05L+h5oGvXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9USU1FX0lORk9fVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF90aW1lX2luZm8tVCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfmnKrnu5PmnZ/nmoTpgJror53liJfooajkv6Hmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9BVkFJTEFCTEVfQ0FMTF9MSVNUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ2V0X2F2YWlsYWJsZV9jYWxsX2xpc3QtVCcsXG4gIC8qKlxuICAgKiDmuIXpmaTpgJror53orrDlvZVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2xlYXJfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlumAmuivneS/oeaBr1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfSU5GT19CWV9DQUxMSURfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9pbmZvX2J5X2NhbGxJZC1UJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfVVNFUl9TWVNURU1fU1RBVEVfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl91c2VyX3N5c3RlbV9zdGF0ZV91cC1UJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIHNpZ25hbCDmtojmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TSUdOQUxfREFUQV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfY2FsbF9zaWduYWxfZGF0YS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOWMllxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW1fc3RhdGVfY2hhbmdlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d6YKA6K+3XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfaW52aXRlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9jYWxsX3N0YXR1cy1PJyxcbiAgLyoqXG4gICAqIGNhbGwgZW5naW5lIOabtOaWsOS6uuWRmOeKtuaAgVxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTyA9ICdMLWNhbGxfZW5naW5lX3VwZGF0ZV91c2Vyc19zdGF0ZS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOabtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9JTV9TVEFURV9DSEFOR0VfTyA9ICdMLWNhbGxfZW5naW5lX2ltX3N0YXRlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq+OAgeaUtuWIsOmCgOivt+i2heaXtlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DQUxMX1RJTUVPVVRfTyA9ICdMLWNhbGxfZW5naW5lX2NhbGxfdGltZW91dC1PJyxcbiAgLyoqXG4gICAqIOW8gOWQr+mAmuivneWumuaXtuWZqFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9TVEFSVF9DQUxMX1RJTUVSX08gPSAnTC1jYWxsX2VuZ2luZV9zdGFydF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5riF6Zmk6YCa6K+d5a6a5pe25ZmoXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PID0gJ0wtY2FsbF9lbmdpbmVfc3RvcF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5LiK5oqlIG9uUGhvbmVFbmRcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtVCcsXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtUicsXG4gIC8qKlxuICAgKiDmlLbliLDpppbluKfml7bpl7TkuIvlj5FcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2ZpcnN0X2ZyYW1lX3RpbWUtTycsXG4gIC8qKlxuICAgKiDmlLbliLDlqpLkvZPnsbvlnovliIfmjaLkuovku7ZcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX21lZGlhdHlwZV9jaGFuZ2UtTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53nu5PmnZ9cbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2Nsb3NlX3Nlc3Npb24tTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53ml6Xlv5dcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jYWxsX3JlY29yZC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOihpeWBv+aVsOaNrlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jb21wbGVtZW50YXJ5X2RhdGEtTycsXG4gIC8qKlxuICAgKiDliJvlu7ogc2Vzc2lvblxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfVCA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1UJyxcbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOS4iuaKpemmluW4p+aXtumXtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9maXJzdF9mcmFtZV90aW1lLVQnLFxuICBMX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfUiA9ICdMLWNhbGxfZW5naW5lX3VwX2ZpcnN0X2ZyYW1lX3RpbWUtUicsXG4gIC8qKlxuICAgKiDlvIDlkK/ml7bpl7TmoKHmraNcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUQVJUX08gPSAnTC10aW1lX2NvcnJlY3Rfc3RhcnQtTycsXG4gIC8qKlxuICAgKiDlgZzmraLmoKHml7ZcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUT1BfTyA9ICdMLXRpbWVfY29ycmVjdF9zdG9wLU8nLFxuICAvKipcbiAgICog6YeN5paw5byA5ZCv5qCh5pe2XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9SRVNUQVJUX08gPSAnTC10aW1lX2NvcnJlY3RfcmVzdGFydC1PJyxcbiAgLyoqXG4gICAqIOS7juacjeWKoeerr+iOt+WPlumAmuivneaXtumVv+OAgemAmuivneW8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1QgPSAnTC10aW1lX2NvcnJlY3RfZ2V0X2NhbGxfY2xpZW50X3RpbWVfYnlfc2VydmVyLVQnLFxuICBMX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCA9ICdMLXRpbWVfY29ycmVjdF9nZXRfY2FsbF9jbGllbnRfdGltZV9ieV9zZXJ2ZXItUCcsXG4gIExfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SID0gJ0wtdGltZV9jb3JyZWN0X2dldF9jYWxsX2NsaWVudF90aW1lX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9UID0gJ0wtdGltZV9jb3JyZWN0X2NhbGNfY2xpZW50X3N0YXJ0X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiA9ICdMLXRpbWVfY29ycmVjdF9jYWxjX2NsaWVudF9zdGFydF90aW1lLVInLFxuICAvKipcbiAgICog5a2Y5YKo5a6i5oi356uv5ZKM5pyN5Yqh56uv5pe26Ze05YGP5beuXG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PID0gJ0wtdGltZV9jb3JyZWN0X3NldF9kZWx0YV90aW1lLU8nLFxuICAvKipcbiAgICog5b6q546v5LiJ5qyh5qCh5q2j57uZ5a6i5oi356uv55qE5pe26Ze0XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfVCA9ICdMLXRpbWVfY29ycmVjdF9sb29wX2NvcnJlY3RfY2xpZW50X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SID0gJ0wtdGltZV9jb3JyZWN0X2xvb3BfY29ycmVjdF9jbGllbnRfdGltZS1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g5YaF6YOo5pu05paw5Lq65ZGY54q25oCBXG4gICAqL1xuICBMX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTyA9ICdMLWlubmVyX3Nlc3Npb25fdXBkYXRlX3VzZXJfc3RhdGUtTycsXG4gIC8qKlxuICAgKiDorr7nva4gc2Vzc2lvbiDkurrlkZjorr7lpIfnirbmgIFcbiAgICovXG4gIExfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08gPSAnTC1pbm5lcl9zZXNzaW9uX3NldF91c2VyX2RldmljZV9lbmFibGUtTycsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1QgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtVCcsXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICovXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1QgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tVCcsXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1IgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tUicsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNUeXBlLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbm5lclNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbElubmVyU2Vzc2lvbic7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuLyoqXG4gKiDlr7nlpJYgc2Vzc2lvbiDlrp7kvovvvIzku4XmnInojrflj5bmlrnms5XvvIzml6Dms5Xkv67mlLlcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNTZXNzaW9uIHtcbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfZHVyYXRpb246IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9jYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9jYWxsSWQgPSB0aGlzLl9zZXNzaW9uLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBDYWxsSWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIGdldFN0YXRlKCk6IFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsVHlwZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneWqkuS9k+exu+Wei1xuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53kurrlkZjliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyTGlzdCgpOiB7IHVzZXJJZDogc3RyaW5nLCBzdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgY2FtZXJhRW5hYmxlLCBtaWNyb3Bob25lRW5hYmxlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHN0YXRlOiB1c2VyU3RhdGUsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5Y+R6LW36ICFIHVzZXJJZFxuICAgKi9cbiAgZ2V0Q3JlYXRvclVzZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53pgoDor7fogIUgdXNlcklkXG4gICAqIOWRvOWFpeacieWAvO+8jOWRvOWHuuaXtu+8jOWAvOS4uuacrOWcsOeUqOaItyBVc2VySWRcbiAgICovXG4gIGdldEludml0ZXJVc2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsZXJJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivnei1t+Wni+aXtumXtFxuICAgKi9cbiAgYXN5bmMgZ2V0Q3JlYXRlVGltZXN0YW1wKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgc3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfVCwgJycsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTdGFyaW5nVGltZSh7IGNhbGxJZDogdGhpcy5fY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9DUkVBVEVfVElNRV9SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBjbGllbnRTdGFydFRpbWUhO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICog6YCa6K+d5pyq57uT5p2f5YmN77yM5YC85Li6IDBcbiAgICovXG4gIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fZHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke3RoaXMuX2R1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgZHVyYXRpb246IHRoaXMuX2R1cmF0aW9uIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyh0aGlzLl9jYWxsSWQsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke2RhdGEhLmR1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2R1cmF0aW9uID0gZGF0YSEuZHVyYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkdXJhdGlvbjogdGhpcy5fZHVyYXRpb24sXG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlkbzlj6vnsbvlnotcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsUGx1c1R5cGUge1xuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqL1xuICBTSU5HTEUsXG4gIC8qKlxuICAgKiDlpJrkurrlkbzlj6tcbiAgICovXG4gIE1VTFRJXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiBJRExFXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOebtOaOpeaMguaWrVxuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOetieW+heaOpeWQrOWFtuS7lumAmuivnVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOato+WcqOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog5q2j5Zyo57O757uf6YCa6K+d5LitXG4gICAqL1xuICBPTlBIT05FID0gMzAxLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/otoXml7bmnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDpgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDpgJror53mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOW8guW4uFxuICAgKi9cbiAgRVJST1IgPSAyMDAwXG59XG4iLCIvKipcbiAqIOWRvOWPq+WqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgLyoqXG4gICAqIOmfs+mikVxuICAgKi9cbiAgQVVESU8sXG4gIC8qKlxuICAgKiDpn7Pop4bpopFcbiAgICovXG4gIEFVRElPX1ZJREVPLFxuICAvKipcbiAgICog6KeG6aKRXG4gICAqL1xuICBWSURFTyxcbn1cbiIsIi8qKlxuICog6YCa6K+d54q25oCBXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAvKipcbiAgICog5Yid5aeL54q25oCBXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOato+WcqOWRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW/mee6v+WTjemTg1xuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW/mee6v+etieW+hVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PQU5TV0VSID0gMTAwMSxcbiAgLyoqXG4gICAqIOW3seerr+acquaOpeWQrFxuICAgKi9cbiAgTUlTU0VEID0gMTAwMixcbiAgLyoqXG4gICAqIOW3seerr+WPlua2iOmAmuivnVxuICAgKi9cbiAgQ0FOQ0VMRUQgPSAxMDAzLFxuICAvKipcbiAgICog6L+c56uv5ouS57udXG4gICAqL1xuICBERUNMSU5FRCA9IDEwMDQsXG5cbiAgRVJST1IgPSAyMDAwXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IHtcbiAgLyoqXG4gICAqIOivt+axguaWueWPlua2iOWqkuS9k+exu+Wei+WPmOabtFxuICAgKi9cbiAgQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFID0gMCxcbiAgLyoqXG4gICAqIOW6lOetlOaWueaLkue7neWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFID0gMSxcbiAgLyoqXG4gICAqIOacjeWKoeS7suijgeWFgeiuuOWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgU0VSVkVSX0FMTE9XX01FRElBX1RZUEUgPSAyLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i6LaF5pe2XG4gICAqL1xuICBDSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUID0gMyxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNSZWFzb24ge1xuICBJRExFID0gMCxcbiAgQ0FMTElORyA9IDEwMCxcbiAgSU5WSVRFRCA9IDEwMSxcbiAgUklOR0lORyA9IDEwMixcbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgT05DQUxMID0gMzAwLFxuICBPTl9QSE9ORSA9IDMwMSxcbiAgT05fUEhPTkVfRU5EID0gMzAyLFxuICAvKipcbiAgICog6L6T5YWl6K6+5aSH5LiN5Y+v55SoXG4gICAqL1xuICBPTl9ERVZJQ0VfRElTQUJMRSA9IDMwMyxcbiAgLyoqXG4gICAqIOi+k+WFpeiuvuWkh+WPr+eUqFxuICAgKi9cbiAgT05fREVWSUNFX0VOQUJMRSA9IDMwNCxcbiAgLyoqXG4gICAqIOacrOerr+W8guW4uOemu+W8gFxuICAgKi9cbiAgQUJOT1JNQUxfRU5EID0gOTk5LFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDlt7Hnq6/pgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDov5znq6/mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+WRvOWHuijlvZPliY3nq6/ooqvouKIpXG4gICAqL1xuICBPVEhFUl9DTElFTlRfQ0FMTElORyA9IDEwMTAsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/lt7LmjqXlkKxcbiAgICovXG4gIE9USEVSX0NMSUVOVF9BQ0NFUFQgPSAxMDExLFxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKVcbiAgICovXG4gIEpPSU5fUk9PTV9FUlIgPSAxMTA1LFxuICAvKipcbiAgICog5Y+R5biD6LWE5rqQ5aSx6LSlXG4gICAqL1xuICBQVUJMSVNIX0VSUiA9IDExMDYsXG4gIC8qKlxuICAgKiDorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlIgPSAxMTA3LFxuICAvKipcbiAgICog5o6l5ZCs57O757uf6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FSUklFUiA9IDExMDgsXG4gIC8qKlxuICAgKiDooqvnpoHmraLpgJror51cbiAgICovXG4gIEtJQ0tFRF9CWV9TRVJWRVIgPSAxMTA5LFxuICAvKipcbiAgICogUlRDIFBpbmcg5aSx6LSl6KKr6Lii5Ye65oi/6Ze0XG4gICAqL1xuICBDT05ORUNUSU9OX0VSUiA9IDExMTAsXG4gIC8qKlxuICAgKiDnlKjmiLfpgIDlh7rnmbvlvZXooqvouKLlh7rmiL/pl7RcbiAgICovXG4gIExPR09VVCA9IDExMTEsXG4gIC8qKlxuICAgKiDnlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIE9USEVSX0NMSUVOVF9MT0dJTiA9IDExMTIsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/liqDlhaXmlrDpgJror51cbiAgICovXG4gIE9USEVSX0NMSUVOVF9KT0lORUQgPSAxMTEzLFxuICAvKipcbiAgICog5YW25LuW56uv5bey5Zyo5YW25LuW6YCa6K+d5Lit77yI5bex56uvIEExIOWFtuS7luerr+ato+WcqOmAmuivneS4re+8jEEyIOWkmuerr+WPiOWKoOWFpeaIv+mXtOiiq+aLkue7neWQjumAmuivnee7k+adnyBBMiDnmoTnirbmgIHvvIlcbiAgICovXG4gIE9USEVSX0NMSUVOVF9JTl9ST09NID0gMTExNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+W3suaMguaWrVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0hBTkdVUCA9IDExNTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfliqDlhaXmiL/pl7TlpLHotKVcbiAgICovXG4gIFJFTU9URV9KT0lOX1JUQ19FUlJPUiA9IDEyMDUsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflj5HluIPotYTmupDlpLHotKVcbiAgICovXG4gIFJFTU9URV9QVUJMSVNIX0VSUk9SID0gMTIwNixcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDEyMDcsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflt7Looqso5bCB56aBKeemgeatoumAmuivnVxuICAgKi9cbiAgUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIgPSAxMjA5LFxuICAvKipcbiAgICog6L+c56uv55So5oi3VURQ6L+e5o6l5pat5byAXG4gICAqL1xuICBSRU1PVEVfQ09OTkVDVElPTl9FUlJPUiA9IDEyMTAsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfpgIDlh7pJTeeZu+W9lVxuICAgKi9cbiAgUkVNT1RFX0xPR09VVCA9IDEyMTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfTE9HSU4gPSAxMjEyLFxuICAvKipcbiAgICog6L+c56uv55So5oi36KKr5YW25LuW56uv5Yqg5YWl5oi/6Ze0IGpvaW5Sb29tIOi4ouWHulxuICAgKi9cbiAgUkVNT1RFX09USEVSX0pPSU5FRF9SVEMgPSAxMjEzLFxuICAvKipcbiAgICog6L+c56uv55So5oi355qE5YW25LuW56uv5bey57uP5Zyo5oi/6Ze05Lit77yM5LiN5YWB6K64IGpvaW5Sb29tIOi/m+ihjOmfs+inhumikemAmuivnVxuICAgKi9cbiAgUkVNT1RFX09USEVSX0NMSUVOVF9JTl9SVEMgPSAxMjE0XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNOdW1iZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJQXVkaW9Db25maWcgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIOaMh+Wumum7mOiupOm6puWFi+mjjlxuICAgKiBtaWNyb3Bob25lSWQg5Y+W5YC85Y+v5Y+C6ICDIGh0dHBzOi8vZG9jLnJvbmdjbG91ZC5jbi9ydGMvV2ViLzUuWC9kZXZpY2UjJUU4JThFJUI3JUU1JThGJTk2JUU5JUJBJUE2JUU1JTg1JThCJUU5JUEzJThFJUU4JUFFJUJFJUU1JUE0JTg3JUU1JTg4JTk3JUU4JUExJUE4XG4gICAqL1xuICBzZXREZWZhdWx0TWljcm9waG9uZUlkKG1pY3JvcGhvbmVJZDogc3RyaW5nKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1pY3JvcGhvbmVJZCA9IG1pY3JvcGhvbmVJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mnIDlsI/jgIHmnIDlpKfnoIHnjodcbiAgICog5Y2V5L2NIGticHNcbiAgICog5LiN6K6+572u5pe277yM5Y+W5Yqo5oCB56CB546H6K6h566X57uT5p6cXG4gICAqIEBwYXJhbSBtaW4g5pyA5bCP56CB546HXG4gICAqIEBwYXJhbSBtYXgg5pyA5aSn56CB546HXG4gICAqL1xuICBzZXRCaXRyYXRlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IFJDQXVkaW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbikgfHwgIWlzTnVtYmVyKG1heCkgfHwgbWF4IDw9IDAgfHwgbWluIDw9IDAgfHwgbWF4IDwgbWluKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0FVRElPX0NPTkZJR19TRVRfQklUUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IG1heDogJHttYXh9LG1pbjogJHttaW59LCBtYXggYW5kIG1pbiBpcyBhIG51bWJlciA+IDAsIG1heCBzaG91bGQgPiBtaW5gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hdWRpb0NvbmZpZy5taW5CaXRyYXRlID0gbWluO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1heEJpdHJhdGUgPSBtYXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6Z+z6aKR6YeH5qC3546H77yM5LiN5bu66K6u6Ieq6KGM5L+u5pS5XG4gICAqIEBwYXJhbSBzYW1wbGVSYXRlIOmHh+agt+eOh1xuICAgKi9cbiAgc2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlOiBudW1iZXIpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19BVURJT19DT05GSUdfU0VUX1NBTVBMRV9SQVRFX08sIGBwYXJhbXMgZXJyb3IgLT4gc2FtcGxlUmF0ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOaehOW7uumFjee9riAqL1xuICBidWlsZCgpOiBJQXVkaW9Db25maWcge1xuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ZyYW1lUmF0ZSwgUkNDYWxsUGx1c1Jlc29sdXRpb24sIElWaWRlb0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruW4p+eOhyAqL1xuICBzZXRGcmFtZVJhdGUoZnBzOiBSQ0NhbGxQbHVzRnJhbWVSYXRlKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIGlmICghUkNDYWxsUGx1c0ZyYW1lUmF0ZVtmcHNdKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IGZwczogJHtmcHN9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcuZnJhbWVSYXRlID0gZnBzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruWIhui+qOeOhyAqL1xuICBzZXRWaWRlb1Jlc29sdXRpb24ocmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24pOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFSQ0NhbGxQbHVzUmVzb2x1dGlvbltyZXNvbHV0aW9uXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX1JFU09MVVRJT05fTywgYHBhcmFtcyBlcnJvciAtPiByZXNvbHV0aW9uOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6buY6K6kIGNhbWVyYUlkXG4gICAqIGNhbWVyYUlkIOWPluWAvOWPr+WPguiAgyBodHRwczovL2RvYy5yb25nY2xvdWQuY24vcnRjL1dlYi81LlgvZGV2aWNlIyVFOCU4RSVCNyVFNSU4RiU5NiVFNiU5MSU4NCVFNSU4MyU4RiVFNSVBNCVCNCVFOCVBRSVCRSVFNSVBNCU4NyVFNSU4OCU5NyVFOCVBMSVBOFxuICAgKiDkvZznlKjkuo7pooTop4jlip/og73jgIHlkbzlj6vlj5bmtYHnrYlcbiAgICovXG4gIHNldERlZmF1bHRDYW1lcmFJZChjYW1lcmFJZDogc3RyaW5nKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnLmNhbWVyYUlkID0gY2FtZXJhSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5pyA5bCP44CB5pyA5aSn56CB546HXG4gICAqIOWNleS9jSBrYnBzXG4gICAqIOS4jeiuvue9ruaXtu+8jOWPluWKqOaAgeeggeeOh+iuoeeul+e7k+aenFxuICAgKiBAcGFyYW0gbWluIOacgOWwj+eggeeOh1xuICAgKiBAcGFyYW0gbWF4IOacgOWkp+eggeeOh1xuICAgKi9cbiAgc2V0Qml0cmF0ZShtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihtaW4pIHx8ICFpc051bWJlcihtYXgpIHx8IG1heCA8PSAwIHx8IG1pbiA8PSAwIHx8IG1heCA8IG1pbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX0JJVFJBVEVfTywgYHBhcmFtcyBlcnJvciAtPiBtYXg6ICR7bWF4fSxtaW46ICR7bWlufSwgbWF4IGFuZCBtaW4gaXMgYSBudW1iZXIgPiAwLCBtYXggc2hvdWxkID4gbWluYCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcubWluQml0cmF0ZSA9IG1pbjtcbiAgICB0aGlzLl92aWRlb0NvbmZpZy5tYXhCaXRyYXRlID0gbWF4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g5p6E5bu66YWN572uXG4gIGJ1aWxkKCk6IElWaWRlb0NvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZGVvQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmF2aUluZm8sIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUsIFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0SW5mbywgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCBJSGFuZ3VwSW5mbywgSU90aGVyTWVtSW5mbywgSVJpbmdpbmdJbmZvLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgSVN0YXR1c0Rvd25Db250LCBJU3luY0NhbGxMb2dSZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbi8qKlxuICogY2FsbCBzZXJ2ZXIgbG9nIOi9rOaNolxuICovXG5leHBvcnQgY29uc3QgdHJhbjJDYWxsTG9nID0gKGNhbGxMb2dMaXN0OiBJU3luY0NhbGxMb2dSZXMpOiBJUkNDYWxsUGx1c0NhbGxSZWNvcmQgPT4ge1xuICBjb25zdCB7XG4gICAgY2FsbElkLFxuICAgIGNhbGxUeXBlLFxuICAgIGNhbGxEaXIsXG4gICAgbWVkaWFUeXBlLFxuICAgIGNhbGxpbmdVc2VySWQsXG4gICAgY2FsbFVzZXJJZHMsXG4gICAgY2FsbFN0YXR1cyxcbiAgICBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHNlY3JldENoYXQsXG4gICAgc3luY1RpbWUsXG4gICAgc3lzU3RhdHVzLFxuICAgIGNydFRpbWUsXG4gIH0gPSBjYWxsTG9nTGlzdDtcbiAgcmV0dXJuIHtcbiAgICBjYWxsSWQsXG4gICAgY2FsbFR5cGUsXG4gICAgY2FsbERpcmVjdGlvbjogY2FsbERpcixcbiAgICBtZWRpYVR5cGUsXG4gICAgLy8gaXNTZWNyZXRDaGF0OiBCb29sZWFuKHNlY3JldENoYXQpLFxuICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICBjYWxsVXNlcklkcyxcbiAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZXN0YW1wOiBzdGFydFRpbWUsXG4gICAgZW5kVGltZXN0YW1wOiBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VTdGF0dXMge1xuICByaW5naW5nRGF0YTogSVJpbmdpbmdJbmZvW107XG4gIGhhbmd1cERhdGE6IElIYW5ndXBJbmZvW107XG4gIGFjY2VwdERhdGE6IElBY2NlcHRJbmZvW107XG4gIG90aGVySW52aXRlZERhdGE6IElPdGhlck1lbUluZm9bXTtcbn1cblxuLyoqXG4gKiBwYXJzZVN0YXR1c1xuICovXG5leHBvcnQgY29uc3QgcGFyc2VTdGF0dXNEYXRhID0gKGRhdGE6IElTdGF0dXNEb3duQ29udCk6IElQYXJzZVN0YXR1cyA9PiB7XG4gIGNvbnN0IHsgY2FsbElkLCBjYWxsU3RhdHVzIH0gPSBkYXRhO1xuICBjb25zdCByaW5naW5nRGF0YTogSVJpbmdpbmdJbmZvW10gPSBbXTtcbiAgY29uc3QgaGFuZ3VwRGF0YTogSUhhbmd1cEluZm9bXSA9IFtdO1xuICBjb25zdCBhY2NlcHREYXRhOiBJQWNjZXB0SW5mb1tdID0gW107XG4gIGNvbnN0IG90aGVySW52aXRlZERhdGE6IElPdGhlck1lbUluZm9bXSA9IFtdO1xuICBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMgfSA9IGl0ZW07XG4gICAgc3dpdGNoIChzZXNzaW9uU3RhdHVzKSB7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQ6XG4gICAgICAgIG90aGVySW52aXRlZERhdGEucHVzaCh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORzpcbiAgICAgICAgLy8g6YCa55+l5ZON6ZODXG4gICAgICAgIHJpbmdpbmdEYXRhLnB1c2goeyBjYWxsSWQsIGZyb21Vc2VySWQ6IHVzZXJJZCB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkc6XG4gICAgICAgIC8vIOmAmuefpeWvueaWueW3suaOpeWQrFxuICAgICAgICBhY2NlcHREYXRhLnB1c2goeyBmcm9tVXNlcklkOiB1c2VySWQgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQ6XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkRFQ0xJTkVEOlxuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5FTkRFRDpcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTpcbiAgICAgICAgaGFuZ3VwRGF0YS5wdXNoKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgZnJvbVVzZXJJZDogdXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcmluZ2luZ0RhdGEsXG4gICAgaGFuZ3VwRGF0YSxcbiAgICBhY2NlcHREYXRhLFxuICAgIG90aGVySW52aXRlZERhdGEsXG4gIH07XG59O1xuXG4vKipcbiAqIOWug+ajgOafpeWFg+e0oOaYr+WQpuaYr+inhumikeiKgueCuVxuICogQHBhcmFtIHthbnl9IGVsZW1lbnQgLSDmgqjopoHmo4Dmn6XnmoTlhYPntKDmmK/lkKbkuLrop4bpopHlhYPntKDjgIJcbiAqIEByZXR1cm5zIOS4gOS4quW4g+WwlOWAvOOAglxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVWaWRlb05vZGVOYW1lID0gKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVOYW1lICYmIGVsZW1lbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1ZJREVPJztcblxuLyoqXG4gKiDmoLnmja7nlKjmiLflvZPliY3nmoQgc3lzdGVtU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHN5c3RlbVN0YXRlLOadpeWIpOaWreaWsCBzeXN0ZW1TdGF0ZSDmmK/lkKbml6DmlYhcbiAqIOS+i++8muW9k+WJjeeUqOaIt+W3suWcqCBjYWxsIOS4re+8jOWPiOaUtuWIsOatpOeUqOaIt+eahCDlk43pk4PjgIHov57mjqXkuK0g562JXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN5c1N0YXRlID0gKGNydFN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1JlYXNvbikgPT4ge1xuICBsZXQgaXNJblZhbGlkID0gZmFsc2U7XG4gIGNvbnN0IGludmFsaWRTdGF0ZXMgPSBbXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5JTlZJVEVELFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9XQUlULFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgXTtcbiAgc3dpdGNoIChjcnRTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEw6XG4gICAgICBpZiAoaW52YWxpZFN0YXRlcy5pbmNsdWRlcyhuZXdTdGF0ZSkpIHtcbiAgICAgICAgaXNJblZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaXNJblZhbGlkO1xufTtcblxuLyoqXG4gICAqIOagueaNrueUqOaIt+W9k+WJjeeahCB1c2VyU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHVzZXJTdGF0ZSzmnaXliKTmlq3mlrAgdXNlclN0YXRlIOaYr+WQpuaXoOaViFxuICAgKiDml6DmlYjnmoTnlKjmiLfnirbmgIFcbiAgICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVVc2VyU3RhdGUgPSAoY3J0U3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUpID0+IHtcbiAgbGV0IGlzSW5WYWxpZCA9IGZhbHNlO1xuICBjb25zdCBpbnZhbGlkU3RhdGVzID0gW1xuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gIF07XG4gIHN3aXRjaCAoY3J0U3RhdGUpIHtcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTDpcbiAgICAgIGlmIChpbnZhbGlkU3RhdGVzLmluY2x1ZGVzKG5ld1N0YXRlKSkge1xuICAgICAgICBpc0luVmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBpc0luVmFsaWQ7XG59O1xuXG4vKipcbiAqIOiOt+WPluaMguaWreaXtueahOS6uuWRmOezu+e7n+eKtuaAgVxuICogQHBhcmFtIHVzZXJTdGF0ZSDkurrlkZjnirbmgIFcbiAqIEBwYXJhbSBpc0NhbGxlZSDmmK/lkKbmmK/ooqvlj6tcbiAqIEByZXR1cm5zIOS6uuWRmOezu+e7n+eKtuaAgVxuICovXG5leHBvcnQgY29uc3QgZ2V0SGFuZ3VwU3lzdGVtU3RhdGUgPSAodXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgaXNDYWxsZWU6IGJvb2xlYW4pID0+IHtcbiAgbGV0IHN5c3RlbVN0YXRlO1xuICBzd2l0Y2ggKHVzZXJTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORzpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLlJJTkdJTkc6XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkRFQ0xJTkVEO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HOlxuICAgICAgc3lzdGVtU3RhdGUgPSBpc0NhbGxlZSA/IFJDQ2FsbFBsdXNSZWFzb24uREVDTElORUQgOiBSQ0NhbGxQbHVzUmVhc29uLkNBTkNFTExFRDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkVOREVEO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHN5c3RlbVN0YXRlO1xufTtcblxuLyoqXG4gKiDliKTmlq3mmK/lkKblvIDlp4vpn7Pop4bpopHmnI3liqFcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3VwcG9ydE1lZGlhU2VydmVyID0gKG5hdmlJbmZvOiBJTmF2aUluZm8pID0+IHtcbiAgY29uc3QgeyB2b2lwQ2FsbEluZm8gfSA9IG5hdmlJbmZvO1xuICBpZiAoIXZvaXBDYWxsSW5mbykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RyYXRlZ3kgfSA9IEpTT04ucGFyc2Uodm9pcENhbGxJbmZvKTtcbiAgaWYgKHN0cmF0ZWd5ICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVCaXRyYXRlID0gKG1pbkJpdHJhdGU/OiBudW1iZXIsIG1heEJpdHJhdGU/OiBudW1iZXIpID0+IHtcbiAgaWYgKG1pbkJpdHJhdGUgfHwgbWluQml0cmF0ZSA9PT0gMCkge1xuICAgIGlmICghaXNOdW1iZXIobWluQml0cmF0ZSkgfHwgbWluQml0cmF0ZSA8PSAwKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWluQml0cmF0ZTogYSBudW1iZXIgb2YgPiAwLCB2YWx1ZTogJHttaW5CaXRyYXRlfWAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAobWF4Qml0cmF0ZSB8fCBtYXhCaXRyYXRlID09PSAwKSB7XG4gICAgaWYgKCFpc051bWJlcihtYXhCaXRyYXRlKSB8fCBtYXhCaXRyYXRlIDw9IDApIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLCBlcnJvck1zZzogYHBhcmFtcyBlcnJvciAtPiBtYXhCaXRyYXRlOiBhIG51bWJlciBvZiA+IDAsIHZhbHVlOiAke21heEJpdHJhdGV9YCB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaW5CaXRyYXRlICYmIG1heEJpdHJhdGUgJiYgbWF4Qml0cmF0ZSA8IG1pbkJpdHJhdGUpIHtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogJHttYXhCaXRyYXRlfSwgbWluQml0cmF0ZTogJHttaW5CaXRyYXRlfSwgbWF4Qml0cmF0ZSBzaG91bGQgPiBtaW5CaXRyYXRlYCB9O1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIHtcbiAgLyoqXG4gICAqIOWPkei1t+mAmuivnVxuICAgKi9cbiAgTF9RU19TVEFSVF9DQUxMX1MgPSAnQ2FsbC1zdGFydC1TJyxcbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKi9cbiAgTF9RU19BQ0NFUFRfQ0FMTF9TID0gJ0NhbGwtYWNjZXB0LVMnLFxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqL1xuICBMX1FTX0hBTkdVUF9DQUxMX1MgPSAnQ2FsbC1oYW5ndXAtUycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror51cbiAgICovXG4gIExfUVNfUkVDRUlWRV9DQUxMX1MgPSAnQ2FsbC1yZWN2LVMnLFxuICAvKipcbiAgICog5byC5bi45oyC5patXG4gICAqL1xuICBMX1FTX0FCTk9STUFMX0hBTkdVUF9TID0gJ0NhbGwtaW50ZXJydXB0LVMnXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgUGx1Z2luQ29udGV4dCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c1Nlc3Npb24sIFJDQ2FsbFBsdXNUeXBlLFxufSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxQTHVzU3RhdGlzdGljcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U3RhdGlzdGljc0RhdGEoXG4gICAgdGFnOiBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyxcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsLFxuICAgIGNsaWVudENhbGxJZD86IHN0cmluZyxcbiAgICBpbnZpdGVTb3VyY2U/OiBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHwgbnVsbCxcbiAgICBleHRyYT86IHtcbiAgICAgIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAgIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAgIGNhbGxJZDogc3RyaW5nLFxuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IG5vd1RpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgY2FsbFR5cGUsIGNhbGxJZCB9ID0gc2Vzc2lvbiA/IHsgbWVkaWFUeXBlOiBzZXNzaW9uLmdldE1lZGlhVHlwZSgpLCBjYWxsVHlwZTogc2Vzc2lvbi5nZXRDYWxsVHlwZSgpLCBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCkgfSA6IGV4dHJhITtcbiAgICBjb25zdCBjb21tb25EYXRhID0ge1xuICAgICAgY3I6ICd1bmtub3duJyxcbiAgICAgIG5ldDogJ3Vua25vd24nLFxuICAgICAgY29kOiBjb2RlLFxuICAgICAgbXRwOiBtZWRpYVR5cGUsXG4gICAgICBjdHA6IGNhbGxUeXBlLFxuICAgICAgY2lkOiBjYWxsSWQsXG4gICAgICB0aW1lOiBub3dUaW1lLFxuICAgICAgdWlkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLFxuICAgIH07XG5cbiAgICBjbGllbnRDYWxsSWQgJiYgT2JqZWN0LmFzc2lnbihjb21tb25EYXRhLCB7IGNjaWQ6IGNsaWVudENhbGxJZCB9KTtcblxuICAgIGxldCBkYXRhID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOWRvOWPq1xuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICByZjogaW52aXRlU291cmNlLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIC8qKlxuICAgICAgICog5byC5bi45oyC5patXG4gICAgICAgKi9cbiAgICAgIGNhc2UgUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUzpcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAuLi5jb21tb25EYXRhLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HotbfjgIHmjqXlkKzjgIHmjILmlq3pgJror51cbiAgICAgICAgICovXG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICBkdXI6IG5vd1RpbWUgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ0wtY2FsbC1wbHVzLXN0YXRpc3RpYycsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB0YWcpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLl9fc3RhdGlzdGljcyh0YWcsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlr7nor53liqjkvZxcbiAqL1xuZXhwb3J0IGVudW0gRGlhbG9nQWN0aW9uIHtcbiAgLyoqXG4gICAqIOivt+axglxuICAgKi9cbiAgUkVRVUVTVCA9ICdyZXF1ZXN0JyxcbiAgLyoqXG4gICAqIOaOpeWPl1xuICAgKi9cbiAgQUNDRVBUID0gJ2FjY2VwdCcsXG4gIC8qKlxuICAgKiDmi5Lnu51cbiAgICovXG4gIFJFRlVTRSA9ICdyZWZ1c2UnLFxuICAvKipcbiAgICog6K+35rGC5Y+W5raIXG4gICAqL1xuICBDQU5DRUwgPSAnY2FuY2VsJyxcbiAgLyoqXG4gICAqIOmAmuefpVxuICAgKi9cbiAgTk9USUNFID0gJ25vdGljZScsXG4gIC8qKlxuICAgKiDotoXml7ZcbiAgICovXG4gIFRJTUVPVVQgPSAndGltZW91dCdcbn1cbiIsIi8qKlxuICog5a+56K+d57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ1R5cGUge1xuICBTV0lUQ0hfTUVESUFfVFlQRSA9IDFcbn1cbiIsIi8qKlxuICog6YCa6K+d6aKd5aSW57G75Z6L77yI56e75Yqo56uv54m55pyJ77yJXG4gKi9cbmV4cG9ydCBlbnVtIFNlY3JldENhbGxUeXBlIHtcbiAgLyoqXG4gICAqIOaZrumAmumAmuivnVxuICAgKi9cbiAgTk9STUFMLFxuICAvKipcbiAgICog5a+G6IGKXG4gICAqL1xuICBTRUNSRVRcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9EaWFsb2dBY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IElTZXNzaW9uVXNlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN5c1N0YXRlLCB2YWxpZGF0ZVVzZXJTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcblxuZXhwb3J0IGVudW0gQ2FsbFRpbWVyRXZlbnRUeXBlIHtcbiAgSU5WSVRFUiA9ICdpbnZpdGVyJyxcbiAgSU5WSVRFRSA9ICdpbnZpdGVlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPbGREaWFsb2dEYXRhe1xuICB0cmFuc2FjdGlvbklkPzogc3RyaW5nO1xuICBhY3Rpb246IERpYWxvZ0FjdGlvbjtcbiAgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlO1xufVxuXG4vKipcbiAqIFNESyDlhoXpg6jkvb/nlKggU2Vzc2lvbiDlrp7kvotcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbElubmVyU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwcml2YXRlIF9yZXFNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHwgbnVsbFxuXG4gIC8qKlxuICAgKiDpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZXJUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOiiq+mCgOivt+iAhei2heaXtuiuoeaXtuWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfaW52aXRlZVRpbWVySWQhOiBudW1iZXJcblxuICAvKipcbiAgICog5b2T5YmNIHNlc3Npb24g5Lq65ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICAvLyBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW11cblxuICAvKipcbiAgICog5penIGRpYWxvZyDmlbDmja7vvIznlKjkuo7lr7nmr5RcbiAgICovXG4gIHByaXZhdGUgX29sZERpYWxvZ0RhdGEhOiBJT2xkRGlhbG9nRGF0YVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmnKzlnLDmnInmjILmlq1cbiAgICovXG4gIHByaXZhdGUgaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogQ2FsbCBJRFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIHNlc3Npb24g54q25oCBXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG4gICAgLyoqXG4gICAgICog6YCa6K+d57G75Z6LXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneWqkuS9k+exu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX21lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOWRvOWPq+WPkei1t+iAhVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXJ0Q2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDmnKzmrKEgc2Vzc2lvbiDnmoTpgoDor7fogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxVc2VyczogSVNlc3Npb25Vc2VyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgQ2FsbElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uU3RhdGUoKTogUkNDYWxsUGx1c0NhbGxTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5aqS5L2T57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIHNlc3Npb24g5Y+R6LW36ICFXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhcnRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFydENhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOacrOasoSBzZXNzaW9uIOmCgOivt+iAhVxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIHVzZXIgbGlzdFxuICAgKi9cbiAgcHVibGljIGdldFVzZXJMaXN0KCk6IElTZXNzaW9uVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOivt+axguabtOaWsOeahCBtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRSZXFNZWRpYVR5cGUoKTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXFNZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlclRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVyVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVyVGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZpdGVlVGltZXJJZFxuICAgKi9cbiAgcHVibGljIGdldEludml0ZWVUaW1lcklkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0ZWVUaW1lcklkO1xuICB9XG5cbiAgcHVibGljIGdldEFsbFRpbWVySWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW3RoaXMuX2ludml0ZXJUaW1lcklkLCB0aGlzLl9pbnZpdGVlVGltZXJJZF07XG4gIH1cblxuICBwdWJsaWMgc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1NFVF9VU0VSX0RFVklDRV9FTkFCTEVfTywgYHVzZXJJZDogJHt1c2VySWR9LCBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfSwgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSB0aGlzLl9jYWxsVXNlcnMuZmluZCgoaXRlbSkgPT4gdXNlcklkID09PSBpdGVtLnVzZXJJZCk7XG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdXNlclN0YXRlIS5taWNyb3Bob25lRW5hYmxlID0gZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU3RhdGUhLmNhbWVyYUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pu05paw5Lq65ZGY5YiX6KGoLCDlubbov5Tlm57mm7TmlrDnmoTkurrlkZjliJfooahcbiAgICog5qC55o2u5Lq65ZGY54q25oCB5Y675re75Yqg44CB5Yig6Zmk44CB5pu05pawXG4gICAqIOagueaNrueKtuaAgeaXtumXtO+8jOWIpOaWreaYr+WQpuabtOaWsO+8jOaXoOaXtumXtOaIs+eahOS4uuacrOWcsOeKtuaAgeiwg+aVtO+8jOebtOaOpeabtOaWsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJMaXN0KHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKTogSVNlc3Npb25Vc2VyW10ge1xuICAgIGNvbnN0IGNoYW5nZWRVc2VyczogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJTdGF0ZTogbmV3VXNlclN0YXRlLFxuICAgICAgICBzdGF0ZVRpbWU6IG5ld1N0YXRlVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IG5ld1N5c1N0YXRlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICBjb25zdCBuZWVkQWRkU3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkcsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVRdO1xuICAgICAgaWYgKG5lZWRBZGRTdGF0ZXMuaW5jbHVkZXMobmV3VXNlclN0YXRlKSkge1xuICAgICAgICAvLyDnm7TmjqXmt7vliqDmlbDmja5cbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHB1c2ggdXNlcjogJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5pu05paw5pWw5o2uXG4gICAgICAgIGxldCBoYXNVc2VyID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FsbFVzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdXNlcklkLCBzdGF0ZVRpbWU6IG9sZFN0YXRlVGltZSwgc3lzdGVtU3RhdGU6IG9sZFN5c3RlbVN0YXRlLCB1c2VyU3RhdGU6IG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICB9ID0gdGhpcy5fY2FsbFVzZXJzW2ldO1xuICAgICAgICAgIGlmICh1c2VySWQgPT09IHVzZXIudXNlcklkKSB7XG4gICAgICAgICAgICBoYXNVc2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFN5c1N0YXRlID0gdmFsaWRhdGVTeXNTdGF0ZShvbGRTeXN0ZW1TdGF0ZSwgbmV3U3lzU3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkVXNlclN0YXRlID0gdmFsaWRhdGVVc2VyU3RhdGUob2xkVXNlclN0YXRlLCBuZXdVc2VyU3RhdGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRPbnBob25lRW5kID0gbmV3U3lzU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uT05fUEhPTkVfRU5EICYmIG9sZFN5c3RlbVN0YXRlICE9PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FICYmIG5ld1VzZXJTdGF0ZSAhPT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDml6DmlYjnmoTnirbmgIHvvJpcbiAgICAgICAgICAgICAqIOaWsOS4i+WPkeeKtuaAgeeahOaXtumXtOWwj+S6juW9k+WJjeeKtuaAgeeahOaXtumXtCDkuJQgc3lzdGVtU3RhdGUg5ZKMIHVzZXJTdGF0ZSDlnYfmmK/ml6DmlYjnmoRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChuZXdTdGF0ZVRpbWUgJiYgb2xkU3RhdGVUaW1lICYmIG5ld1N0YXRlVGltZSA8IG9sZFN0YXRlVGltZSkgfHwgKGlzSW52YWxpZFN5c1N0YXRlICYmIGlzSW52YWxpZFVzZXJTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdGltZW91dCB1c2VyIHN0YXRlOiBvbGQ6JHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICB1c2VySWQsIG9sZFN0YXRlVGltZSwgb2xkU3lzdGVtU3RhdGUsIG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICB9KX07IG5ldzoke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8g55u05o6l6KaG55uW5pu05pawXG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCAtPiBjb3ZlciAke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB0aGlzLl9jYWxsVXNlcnNbaV0gPSB1c2VyO1xuICAgICAgICAgICAgICAhaXNJbnZhbGlkT25waG9uZUVuZCAmJiBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOaXoOatpOeUqOaIt+ebtOaOpea3u+WKoFxuICAgICAgICBpZiAoIWhhc1VzZXIpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gbm91c2VyIHB1c2ggJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICB0aGlzLl9jYWxsVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VkVXNlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0T2xkRGlhbG9nRGF0YShkYXRhOiBJT2xkRGlhbG9nRGF0YSkge1xuICAgIHRoaXMuX29sZERpYWxvZ0RhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvKipcbiAgICog5pu05pawIHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlU2Vzc2lvblN0YXRlKHN0YXRlOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlKSB7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDpgJror53nsbvlnovvvIjljYfpmY3nuqforr7nva7vvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDYWxsVHlwZShjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUpIHtcbiAgICB0aGlzLl9jYWxsVHlwZSA9IGNhbGxUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6K+35rGC55qE5aqS5L2T57G75Z6L77yI5Y2H6ZmN57qn77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUmVxTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwpIHtcbiAgICB0aGlzLl9yZXFNZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05pawIGludnRlciB0aW1lciBpZFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVRpbWVySWQodHlwZTogQ2FsbFRpbWVyRXZlbnRUeXBlLCB0aW1lcklkOiBudW1iZXIpIHtcbiAgICBpZiAodHlwZSA9PT0gQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURVIpIHtcbiAgICAgIHRoaXMuX2ludml0ZXJUaW1lcklkID0gdGltZXJJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW52aXRlZVRpbWVySWQgPSB0aW1lcklkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZcbiAgICovXG4gIHB1YmxpYyBnZXRPbGREaWFsb2dEYXRhKCk6IElPbGREaWFsb2dEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fb2xkRGlhbG9nRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mmK/lkKbmmK/lt7Hnq6/mjILmlq1cbiAgICovXG4gIHB1YmxpYyBzZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXAgPSBpc0xvY2FsQ2xpZW50SGFuZ3VwO1xuICB9XG5cbiAgcHVibGljIGdldElzTG9jYWxDbGllbnRIYW5ndXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckFjdGlvbiB7XG4gIC8qKlxuICAgKiDlvIDlp4vljZXkurrlkbzlj6tcbiAgICovXG4gIFNUQVJUX1NJTkdMRV9DQUxMID0gJ3N0YXJ0U2luZ2xlQ2FsbCcsXG4gIC8qKlxuICAgKiDlvIDlp4vlpJrkurrlkbzlj6tcbiAgICovXG4gIFNUQVJUX0dST1VQX0NBTEwgPSAnc3RhcnRHcm91cENhbGwnLFxuICAvKipcbiAgICog6YKA6K+35aW95Y+L5Yqg5YWl6YCa6K+dXG4gICAqL1xuICBJTlZJVEVfQ0FMTCA9ICdpbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOS4i+WPkemCgOivt+mAmuivneaVsOaNrlxuICAgKi9cbiAgUFVCX0lOVklURV9DQUxMID0gJ3B1Ykludml0ZUNhbGwnLFxuICAvKipcbiAgICog6YCa6K+d5ZON6ZODXG4gICAqL1xuICBSSU5HSU5HX0NBTEwgPSAncmluZ0NhbGwnLFxuICAvKipcbiAgICog5o6l5Y+X6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FMTCA9ICdhY2NlcHRDYWxsJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnVxuICAgKi9cbiAgSk9JTl9DQUxMID0gJ2pvaW5DYWxsJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgSEFOR1VQX0NBTEwgPSAnaGFuZ3VwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIrmiqVcbiAgICovXG4gIFNUQVRVU19VUF9DQUxMID0gJ3N0YXR1c1VwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIvlj5FcbiAgICovXG4gIFNUQVRVU19ET1dOX0NBTEwgPSAnc3RhdHVzRG93bkNhbGwnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBFVkVOVF9VUF9DQUxMID0gJ2V2ZW50VXBDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4i+WPkVxuICAgKi9cbiAgRVZFTlRfRE9XTl9DQUxMID0gJ2V2ZW50RG93bkNhbGwnLFxuICAvKipcbiAgICog5a+56K+d5pWw5o2u5LiK6KGMXG4gICAqL1xuICBESUFMT0dfVVBfQ0FMTCA9ICdkaWFsb2dVcENhbGwnLFxuICAvKipcbiAgICog5a+56K+d5pWw5o2u5LiL6KGMXG4gICAqL1xuICBESUFMT0dfRE9XTl9DQUxMID0gJ2RpYWxvZ0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOiOt+WPlueUqOaIt+S8muivneaVsOaNruWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfVVNFUl9TRVNTSU9OX0xJU1QgPSAnZ2V0Q2FsbFVTZXJTZXNzaW9uTGlzdCcsXG4gIC8qKlxuICAgKiDml6Xlv5forrDlvZXlkIzmraVcbiAgICovXG4gIFNZTkNfQ0FMTF9MT0cgPSAnc3luY0NhbGxMb2cnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5LiL5Y+RXG4gICAqL1xuICBQVUJfQ0FMTF9MT0cgPSAncHViQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTpgJror53orrDlvZVcbiAgICovXG4gIERFTF9DQUxMX0xPRyA9ICdkZWxldGVDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+W3suacieeahCBjYWxsIOeKtuaAgVxuICAgKi9cbiAgUVJZX0NBTExfU1RBVEUgPSAncXVlcnlVc2VySGFzQ2FsbCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbFNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIFFSWV9TUlZfVElNRVNUQU1QID0gJ2dldENhbGxTcnZUaW1lU3RhbXAnLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN55So5oi36L+b6KGM55qEIGNhbGwg5YiX6KGoXG4gICAqL1xuICBHRVRfQ0FMTF9TVEFURV9MSVNUID0gJ2dldFVzZXJDYWxsU3RhdGVMaXN0JyxcbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+mAmuivneiusOW9lVxuICAgKi9cbiAgQ0xFQVJfQ0FMTF9MT0cgPSAnY2xlYW5DYWxsTG9nJyxcbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIOS8muivneS/oeaBr1xuICAgKi9cbiAgR0VUX0NBTExfU0VTU0lPTiA9ICdnZXRDYWxsU2Vzc2lvbicsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDml7bpl7Tkv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1RJTUVfSU5GTyA9ICdnZXRDYWxsVGltZUluZm8nLFxuICAvKipcbiAgICog57uT5p2f5b2T5YmN55So5oi35byC5bi455qEY2FsbFNlc3Npb24o5YyF5ZCr5ZCE5Liq6Zi25q61Ke+8jOS4u+imgeeUqOS6juW6lOeUqOW8guW4uOmAgOWHuuWGjeWQr+WKqOOAgeWQhOenjemAmuivneW8guW4uOW9k+S4reOAgumFjOaDheiwg+eUqFxuICAgKi9cbiAgRU5EX0FCTk9STUFMX0NBTEwgPSAnZW5kVXNlckFibm9ybWFsQ2FsbHMnLFxuICAvKipcbiAgICog55So5oi357O757uf54q25oCB5LiK5oqlXG4gICAqL1xuICBTWVNfU1RBVFVTX1VQID0gJ3N5c1N0YXR1c1VwJyxcbiAgLyoqXG4gICAqIOS4iuaKpemAmuivneiusOW9leW3suivu+eKtuaAgVxuICAgKi9cbiAgVVBfQ0FMTF9MT0dfUkVBREVEID0gJ3VwQ2FsbExvZ1JlYWRlZCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFBVQl9DQUxMX0xPR19SRUFERUQgPSAncHViQ2FsbExvZ1JlYWRlZCcsXG4gIC8qKlxuICAgKiDkuIvlj5HkuIvooYzkv6Hku6TmlbDmja7luo/lj7dJZCDvvIjlvLHnvZHooaXlgb/mlrnms5XvvIznp7vliqjnq6/lt7Llrp7njrDvvIxQQyDmnKrlrp7njrDvvIlcbiAgICovXG4gIFBVQl9OQUNLX1NFUV9JRCA9ICdwdWJOQUNLU2VxSWQnLFxuICAvKipcbiAgICog5p+l6K+i5b2T5YmN55So5oi35Y+C5LiO55qE5pyq57uT5p2f55qEY2FsbFNlc3Npb27nmoRDYWxsSWTliJfooajvvIxncm91cOS4k+eUqO+8jOWPr+WcqGdyb3VwY2FsbOe7k+adn+aXtu+8jOihpeWBv+WQhOerr+eahOW/q+aNt+WFpeWPo+aYr+WQpua2iOWkseeahOWIpOaWrVxuICAgKi9cbiAgR0VUX1VTRVJfQ0FMTF9TRVNTSU9OX0lEX0xJU1QgPSAnZ2V0VXNlckNhbGxTZXNzaW9uSWRMaXN0J1xufVxuIiwiZXhwb3J0IGNvbnN0IHRpbWVyU2V0VGltZW91dCA9IChmdW5jOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKTogbnVtYmVyID0+IHNldFRpbWVvdXQoZnVuYywgdGltZW91dCkgYXMgbnVtYmVyO1xuXG5leHBvcnQgY29uc3QgdGltZXJJbnRlcnZhbCA9IChmdW46IEZ1bmN0aW9uLCBpdHY6IG51bWJlcik6IG51bWJlciA9PiBzZXRJbnRlcnZhbChmdW4sIGl0dikgYXMgbnVtYmVyO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobWlsbGlzZWNvbmQ6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZCk7XG59KTtcbiIsImltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ29kZSB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQgeyBDYWxsU2VydmVyRXJyb3JDb2RlIH0gZnJvbSAnLi4vZW51bXMvQ2FsbFNlcnZlckVycm9yQ29kZSc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcblxuZXhwb3J0IHR5cGUgVFJldHJ5RXJyb3JDb2RlID0gQ2FsbFNlcnZlckVycm9yQ29kZSB8IFJDUlRDQ29kZSB8IG51bWJlciB8IEVycm9yQ29kZVxuZXhwb3J0IGludGVyZmFjZSByZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICog6KaB6YeN6K+V55qE5byC5q2l5Ye95pWwXG4gICAqL1xuICBhc3luY0ZuOiBGdW5jdGlvbjtcbiAgLyoqXG4gICAqIOWHveaVsOeahOWPguaVsFxuICAgKi9cbiAgZm5BcmdzOiBhbnlbXTtcbiAgLyoqXG4gICAqIOW9k+WJjemHjeivleaXtumXtOaIs1xuICAgKi9cbiAgY3VycmVudFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOacgOWkp+mHjeivleaXtumVv1xuICAgKi9cbiAgbWF4RHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmoq/luqbph43or5Xpl7TpmpRcbiAgICovXG4gIGludGVydmFscz86IG51bWJlcltdO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqU5pWw57uE5LiL5qCHXG4gICAqL1xuICBpbmRleD86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuY29uc3QgbmVlZFJldHJ5Q29kZTogVFJldHJ5RXJyb3JDb2RlW10gPSBbXG4gIC8qKlxuICAgKiBJTSDlupXlsYLov5Tlm57pnIDopoHph43or5XnmoTplJnor6/noIFcbiAgICovXG4gIEVycm9yQ29kZS5SQ19ORVRfQ0hBTk5FTF9JTlZBTElELFxuICBFcnJvckNvZGUuUkNfTkVUX1VOQVZBSUxBQkxFLFxuICBFcnJvckNvZGUuUkNfTVNHX1JFU1BfVElNRU9VVCxcbiAgLyoqXG4gICAqIFJUQyDov5Tlm57pnIDopoHph43or5XnmoTplJnor6/noIFcbiAgICovXG4gIFJDUlRDQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVELFxuICBSQ1JUQ0NvZGUuUkVRVUVTVF9GQUlMRUQsXG5cbl07XG5cbi8qKlxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5hc3luY0ZuIOimgemHjeivleeahOW8guatpeWHveaVsFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5mbkFyZ3Mg5Ye95pWw55qE5Y+C5pWwXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLmN1cnJlbnRSZXRyeVRpbWUg5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLm1heER1cmF0aW9uIOacgOWkp+mHjeivleaXtumVv1xuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5pbnRlcnZhbHMg5qKv5bqm6YeN6K+V6Ze06ZqUXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLmluZGV4IOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICovXG5leHBvcnQgY29uc3QgcmV0cnlBc3luY0ZuID0gYXN5bmMgPFIgZXh0ZW5kcyB7Y29kZTogVFJldHJ5RXJyb3JDb2RlfT4gKHtcbiAgYXN5bmNGbixcbiAgZm5BcmdzLFxuICBjdXJyZW50UmV0cnlUaW1lID0gRGF0ZS5ub3coKSxcbiAgbWF4RHVyYXRpb24gPSA2MCAqIDEwMDAsXG4gIGludGVydmFscyA9IFsyICogMTAwMCwgNCAqIDEwMDAsIDggKiAxMDAwLCAxNiAqIDEwMDAsIDMyICogMTAwMCwgNjQgKiAxMDAwXSxcbiAgaW5kZXggPSAwLFxuICBvbkVycm9yLFxufTogcmV0cnlPcHRpb25zKTogUHJvbWlzZTxSPiA9PiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGFzeW5jRm4oLi4uZm5BcmdzKTtcbiAgLy8gY29uc3QgaXR2ID0gaW50ZXJ2YWxzW2luZGV4XSB8fCBpbnRlcnZhbHNbaW50ZXJ2YWxzLmxlbmd0aCAtIDFdXG4gIC8vIGluZGV4KytcbiAgLy8gaXR2IOWGmeatuyAyMDAwIG1zICzlkI7nu63pnIDopoHlho3mlL7lvIDmoq/luqbph43or5VcbiAgY29uc3QgaXR2ID0gMiAqIDEwMDA7XG4gIGNvbnN0IGlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSA9IChyZXMuY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTU1xuICAgIHx8ICFuZWVkUmV0cnlDb2RlLmluY2x1ZGVzKHJlcy5jb2RlKSlcbiAgICB8fCAoKERhdGUubm93KCkgKyBpdHYgLSBjdXJyZW50UmV0cnlUaW1lKSA+IG1heER1cmF0aW9uKTtcblxuICBpZiAoIWlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSkge1xuICAgIG9uRXJyb3IgJiYgb25FcnJvcihyZXMuY29kZSk7XG4gICAgYXdhaXQgc2xlZXAoaXR2KTtcbiAgICByZXR1cm4gcmV0cnlBc3luY0ZuKHtcbiAgICAgIGFzeW5jRm4sXG4gICAgICBmbkFyZ3MsXG4gICAgICBjdXJyZW50UmV0cnlUaW1lLFxuICAgICAgbWF4RHVyYXRpb24sXG4gICAgICBpbnRlcnZhbHMsXG4gICAgICBpbmRleCxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgcmV0cnlCeVRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5XmrKHmlbAsIOm7mOiupCAyIOasoVxuICAgKi9cbiAgbWF4UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog6YeN6K+V5aSx6LSl55qE5Zue6LCDXG4gICAqL1xuICBvbkVycm9yPzogKGNvZGU6IFRSZXRyeUVycm9yQ29kZSkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgcmV0cnlBc255Y0ZuQnlUaW1lID0gYXN5bmMgPFIgZXh0ZW5kcyB7Y29kZTogVFJldHJ5RXJyb3JDb2RlfT4gKHtcbiAgYXN5bmNGbixcbiAgZm5BcmdzLFxuICBjdXJyZW50UmV0cnlUaW1lID0gMCxcbiAgbWF4UmV0cnlUaW1lID0gMixcbiAgb25FcnJvcixcbn06IHJldHJ5QnlUaW1lT3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjdXJyZW50UmV0cnlUaW1lKys7XG4gIGNvbnN0IGlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSA9IChyZXMuY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTU1xuICAgIHx8ICFuZWVkUmV0cnlDb2RlLmluY2x1ZGVzKHJlcy5jb2RlKSkgfHwgY3VycmVudFJldHJ5VGltZSA+IG1heFJldHJ5VGltZTtcblxuICBpZiAoIWlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSkge1xuICAgIG9uRXJyb3IgJiYgb25FcnJvcihyZXMuY29kZSk7XG4gICAgYXdhaXQgc2xlZXAoaXR2KTtcbiAgICByZXR1cm4gcmV0cnlBc255Y0ZuQnlUaW1lKHtcbiAgICAgIGFzeW5jRm4sXG4gICAgICBmbkFyZ3MsXG4gICAgICBjdXJyZW50UmV0cnlUaW1lLFxuICAgICAgbWF4UmV0cnlUaW1lLFxuICAgICAgb25FcnJvcixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCB7IElQdWJJbnZpdGVDb24gfSBmcm9tICcuL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbmV4cG9ydCBlbnVtIENhbGxIb29rc1R5cGUge1xuICBvbkJlZm9yZVB1Ymxpc2ggPSAnb25CZWZvcmVQdWJsaXNoJyxcbiAgb25QdWJsaXNoUmVzID0gJ29uUHVibGlzaFJlcycsXG4gIG9uUHViSW52aXRlQ2FsbCA9ICdvblB1Ykludml0ZUNhbGwnLFxuICBvblB1Ykludml0ZUNhbGxQdWxsS3YgPSAnb25QdWJJbnZpdGVDYWxsUHVsbEt2JyxcbiAgb25QdWJJbnZpdGVDYWxsTWlzcyA9ICdvblB1Ykludml0ZUNhbGxNaXNzJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiB7XG4gIE5PVF9DVVJSRU5UX0RFVklDRUlEID0gJ25vdCBjdXJyZW50IGRldmljZSBpZCcsXG4gIFNFQ1JFVF9DQUxMID0gJ3NlY3JldCBjYWxsJyxcbiAgTk9UX0lOVklURUUgPSAnbm90IGFuIGludml0ZWUnXG59XG5cbmV4cG9ydCBlbnVtIFB1Ykludml0ZUNhbGxNaXNzUmVmZXIge1xuICBQVUJfSU5WSVRFID0gJ3B1Ymludml0ZWNhbGwnLFxuICBQVUxMX0tWX0lOVklURSA9ICdwdWxsa3ZfaW52aXRlY2FsbCcsXG4gIFBVU0ggPSAnc3lzdGVtX3B1YnNoJ1xufVxuXG5leHBvcnQgdHlwZSBJUHViSW52aXRlQ2FsbEluZm8gPSBJUHViSW52aXRlQ29uICYgeyBleHRyYTogc3RyaW5nfVxuXG5leHBvcnQgdHlwZSBJUHViSW52aXRlQ2FsbE1pc3NJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZywgcmVhc29uOiBzdHJpbmcsIHJlZmVyOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyfVxuIiwiaW1wb3J0IHtcbiAgQmFzaWNMb2dnZXIsIEVycm9yQ29kZSwgRXZlbnRFbWl0dGVyLCBnZXRVVUlEMjIsIElSdW50aW1lLCBpc051bGwsIGlzU3RyaW5nLCBsb2dnZXIsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckFjdGlvbiB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24nO1xuaW1wb3J0IHtcbiAgSUFjY2VwdENhbGxDb24sXG4gIElCYXNlU2luZ2FsQ29uLFxuICBJQ2xlYXJDYWxsTG9nUmVzLFxuICBJQ29ucGVuc2F0aW9uRGF0YSxcbiAgSURpYWxvZ0Rvd25DYWxsQ29uLFxuICBJRGlhbG9nVXBDYWxsQ29uLFxuICBJRXZlbnREb3duQ2FsbENvbixcbiAgSUV2ZW50VXBDYWxsQ29uLFxuICBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXMsXG4gIElHZXRDYWxsVGltZUluZm9SZXMsXG4gIElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlcyxcbiAgSUhhbmd1cENhbGxDb24sXG4gIElJbnZpdGVDYWxsQ29uLFxuICBJSW52aXRlQ2FsbFJlcyxcbiAgSUpvaW5DYWxsQ29uLFxuICBJUHViQ2FsbExvZyxcbiAgSVB1Ykludml0ZUNvbixcbiAgSVFyeVVzZXJIYXNDYWxsUmVzLFxuICBJUmluZ2luZ0NhbGxDb24sXG4gIElTaWduYWxUcmFuc3BvcnRlckxpc3RlbmVyLFxuICBJU3RhcnRDYWxsQ29uLFxuICBJU3RhcnRDYWxsUmVzLFxuICBJU3RhcnRHcm91cENvbixcbiAgSVN0YXJ0U2luZ2xlQ29uLFxuICBJU3RhdHVzRG93bkNvbnQsXG4gIElTdGF0dXNVcENvbixcbiAgSVN5bmNDYWxsTG9nQ29uLFxuICBJU3luY0NhbGxMb2dSZXNMaXN0LFxuICBJU3lzU3RhdHVzVXBPcHRzLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi4vZW51bXMvRGlhbG9nVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lJbmRleCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25Vc2VyU3RhdGUnO1xuaW1wb3J0IHsgVGltZUNvcnJlY3Rpb25lciB9IGZyb20gJy4vVGltZUNvcnJlY3Rpb25lcic7XG5pbXBvcnQgeyByZXRyeUFzeW5jRm4gfSBmcm9tICcuLi91dGlscy9yZXRyeSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHtcbiAgQ2FsbEhvb2tzVHlwZSwgUHViSW52aXRlQ2FsbE1pc3NSZWFzb24sIFB1Ykludml0ZUNhbGxNaXNzUmVmZXIsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsVHJhbnNwb3J0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICog55uR5ZCs5a+56LGhXG4gICAqL1xuICBfbGlzdGVuZXIhOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lclxuXG4gIC8qKlxuICAgKiDpnIDopoHph43or5XnmoQgYWN0aW9uXG4gICAqL1xuICBfbmVlZFJldHJ5QWN0aW9uczogQ2FsbFNlcnZlckFjdGlvbltdID0gW1xuICAgIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfU0lOR0xFX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9HUk9VUF9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5KT0lOX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9VUF9DQUxMLFxuICBdXG5cbiAgX3Nlc3Npb25JZDogc3RyaW5nID0gJydcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29udGV4dC5vbkNhbGxJbmZvID0gdGhpcy5fb25SZWN2Q2FsbFNpZ25hbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NvbnRleHQub25jb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSB0aGlzLl9vbklNQ29ubmVjdGlvblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2Vzc2lvbklkID0gZ2V0VVVJRDIyKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xpc3RlbmVyID0gbGlzdGVuZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRDYWxsKG1zZzogSVN0YXJ0Q2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICBjb25zdCB7XG4gICAgICBjbGllbnRDYWxsSWQsIGNhbGxUeXBlLCB0b1VzZXJzLCBtZWRpYVR5cGUsIHNlY3JldENoYXQsIHRhcmdldFR5cGUsIHRhcmdldElkLCBuaWNrTmFtZSwgb2xkUm9vbUlkLFxuICAgIH0gPSBtc2c7XG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXJ0U2luZ2xlQ2FsbCh7XG4gICAgICAgIGNsaWVudENhbGxJZCxcbiAgICAgICAgdG9Vc2VySWQ6IHRvVXNlcnNbMF0udXNlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHNlY3JldENoYXQsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBvbGRSb29tSWQsXG4gICAgICAgIHRvT3JnSWQ6IHRvVXNlcnNbMF0ub3JnSWQgfHwgJycsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRHcm91cENhbGwoe1xuICAgICAgY2xpZW50Q2FsbElkLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG5pY2tOYW1lLFxuICAgICAgb2xkUm9vbUlkLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0U2luZ2xlQ2FsbChtc2c6IElTdGFydFNpbmdsZUNvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1NJTkdMRV9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXJ0U2luZ2xlQ29uLCBJU3RhcnRDYWxsUmVzPih0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX1NJTkdMRV9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0R3JvdXBDYWxsKG1zZzogSVN0YXJ0R3JvdXBDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXJ0R3JvdXBDb24sIElTdGFydENhbGxSZXM+KHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfR1JPVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbnZpdGVDYWxsKG1zZzogSUludml0ZUNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElJbnZpdGVDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUludml0ZUNhbGxDb24sIElJbnZpdGVDYWxsUmVzPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLklOVklURV9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJpbmdpbmdDYWxsKG1zZzogSVJpbmdpbmdDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVJpbmdpbmdDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uUklOR0lOR19DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjY2VwdENhbGwobXNnOiBJQWNjZXB0Q2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUFjY2VwdENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5BQ0NFUFRfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBqb2luQ2FsbChtc2c6IElKb2luQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSk9JTl9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUpvaW5DYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSk9JTl9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmd1cENhbGwobXNnOiBJSGFuZ3VwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NlbmRDYWxsU2lnbmFsPElIYW5ndXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSEFOR1VQX0NBTEwsIG1zZyk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMKSB7XG4gICAgICAvLyDlrZjlnKjljZXlkbwgQSDmjILmlq3lkI7nm7TmjqXouKLlh7ogQu+8jENhbGxTZXJ2ZXIg5bey56e76ZmkIGNhbGwsIEIg5ZCO5YiwIENhbGxTZXJ2ZXIg55qEIGhhbmd1cCDkvJrovazkuLogQ2FsbFNlcnZlckVycm9yQ29kZS5DQUxMX05PVF9FWElTVO+8jOaVheW/veeVpVxuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhdHVzVXBDYWxsKG1zZzogSVN0YXR1c1VwQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9ULCBgY2FsbCBzdGF0dXMgdXAgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGF0dXNVcENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlNUQVRVU19VUF9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV2ZW50VXBDYWxsKG1zZzogSUV2ZW50VXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUV2ZW50VXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uRVZFTlRfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaWFsb2dVcENhbGwobXNnOiBJRGlhbG9nVXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0RJQUxPR19VUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElEaWFsb2dVcENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5ESUFMT0dfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWxsUmVjb3JkKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0RFTEVURV9DQUxMX1JFQ09SRF9ULCBgY2FsbElkczogJHtKU09OLnN0cmluZ2lmeShjYWxsSWRzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8e2NhbGxJZHM6IHN0cmluZ1tdfSwgdW5kZWZpbmVkPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uREVMX0NBTExfTE9HLCB7XG4gICAgICBjYWxsSWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN5bmNDYWxsTG9nKG1zZzogSVN5bmNDYWxsTG9nQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3luY0NhbGxMb2dSZXNMaXN0fT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfUkVDT1JEX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN5bmNDYWxsTG9nQ29uLCBJU3luY0NhbGxMb2dSZXNMaXN0Pihtc2cudXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlNZTkNfQ0FMTF9MT0csIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcXVlcnlVc2VySGFzQ2FsbCgpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUXJ5VXNlckhhc0NhbGxSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSVFyeVVzZXJIYXNDYWxsUmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uUVJZX0NBTExfU1RBVEUsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXJ2ZXJUaW1lc3RhbXAodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogeyBzeW5jVGltZTogbnVtYmVyfX0+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfU0VSVkVSX1RJTUVfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIHsgc3luY1RpbWU6IG51bWJlcn0+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5RUllfU1JWX1RJTUVTVEFNUCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFRpbWVJbmZvUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfVElNRV9JTkZPX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDx7IGNhbGxJZDogc3RyaW5nfSwgSUdldENhbGxUaW1lSW5mb1Jlcz4oY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1RJTUVfSU5GTywgeyBjYWxsSWQgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlckNhbGxTdGF0ZUxpc3QodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQVZBSUxBQkxFX0NBTExfTElTVF9ULCBgdXNlcklkOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uR0VUX0NBTExfU1RBVEVfTElTVCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXJDYWxsUmVjb3JkKHRyYWNlSWQ6IHN0cmluZyk6UHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUNsZWFyQ2FsbExvZ1Jlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0xFQVJfQ0FMTF9SRUNPUkRfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElDbGVhckNhbGxMb2dSZXM+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5DTEVBUl9DQUxMX0xPRywgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUJhc2VTaW5nYWxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsU2Vzc2lvblNlcnZlclJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX0lORk9fQllfQ0FMTElEX1QsIGBjYWxsSWQ6ICR7b3B0cy5jYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElCYXNlU2luZ2FsQ29uLCBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXM+KG9wdHMuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1NFU1NJT04sIG9wdHMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN5c1N0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1VTRVJfU1lTVEVNX1NUQVRFX1VQX1QsIGBvcHRzOiAke0pTT04uc3RyaW5naWZ5KG9wdHMpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3lzU3RhdHVzVXBPcHRzLCB1bmRlZmluZWQ+KG9wdHMuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlNZU19TVEFUVVNfVVAsIG9wdHMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwQ2FsbExvZ1JlYWRlZChvcHRzOiBJQmFzZVNpbmdhbENvbik6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQmFzZVNpbmdhbENvbiwgdW5kZWZpbmVkPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uVVBfQ0FMTF9MT0dfUkVBREVELCBvcHRzKTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgcHJpdmF0ZSBfb25JTUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZTogUkNDb25uZWN0aW9uU3RhdHVzKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9JTV9TVEFURV9DSEFOR0VfTywgYHN0YXRlOiAke3N0YXRlfWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbGlzdGVuZXIub25JTVN0YXRlQ2hhbmdlKHN0YXRlKTtcbiAgICAvKipcbiAgICAgKiDov57mjqXmiJDlip/lkI7lkK/liqjml7bpl7TmoKHmraPlmahcbiAgICAgKi9cbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuc3RhcnQodHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuc3RvcCh0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2FsbCDkv6Hku6Tlj5HpgIFcbiAgICogQHBhcmFtIHRhcmdldElkIOiOt+WPliBjYWxsIGxvZyAoc3luY0NhbGxMb2cpIOaXtuS8oCB1c2VySWQsIOWFtuS7liBhY3Rpb24g5LygIGNhbGxJZFxuICAgKiBAcGFyYW0ga2V5IGNhbGwgc2VydmVyIOWumuS5iSBhY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgYWN0aW9uIOaQuuW4puWPguaVsO+8jOaXoOWPguaVsOS8oOepuuWtl+espuS4slxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZENhbGxTaWduYWwgPFQsIFI+KHRhcmdldElkOiBzdHJpbmcsIGtleTogQ2FsbFNlcnZlckFjdGlvbiwgb3B0aW9uczogVCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IFJ9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zID8gSlNPTi5zdHJpbmdpZnkoeyAuLi5vcHRpb25zLCAuLi57IHNlc3Npb25JZDogdGhpcy5fc2Vzc2lvbklkIH0gfSkgOiAnJztcblxuICAgIGxldCByZXN1bHQ6IHtkYXRhPzogeyBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZ30gfCB1bmRlZmluZWQsIGNvZGU6IEVycm9yQ29kZX07XG4gICAgaWYgKHRoaXMuX25lZWRSZXRyeUFjdGlvbnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDx7ZGF0YT86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCBjb2RlOiBFcnJvckNvZGV9Pih7XG4gICAgICAgIGFzeW5jRm46IHRoaXMuX2NvbnRleHQuc2V0Q2FsbEluZm8uYmluZCh0aGlzLl9jb250ZXh0KSxcbiAgICAgICAgZm5BcmdzOiBbdGFyZ2V0SWQsIGtleSwgdmFsdWVdLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2NvbnRleHQuc2V0Q2FsbEluZm8odGFyZ2V0SWQsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IHJlc3VsdDtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgY29uc3QgeyBrZXk6IHNlcnZlcktleSwgdmFsdWU6IHNlcnZlclZhbCB9ID0gZGF0YSE7XG4gICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2Uoc2VydmVyVmFsKS5kYXRhIGFzIFI7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkYXRhOiBwYXJzZWREYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogY2FsbCDkv6Hku6TmjqXmlLZcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdkNhbGxTaWduYWwoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU0lHTkFMX0RBVEFfTywgYGRhdGE6ICR7ZGF0YX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IGRhdGFMaXN0ID0gSlNPTi5wYXJzZShkYXRhKS5saXN0IGFzIHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdO1xuICAgIGRhdGFMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBpdGVtO1xuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UoaXRlbS52YWx1ZSk7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0lOVklURV9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uUHViSW52aXRlQ2FsbChpbmZvIGFzIElQdWJJbnZpdGVDb24sIHRydWUsIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uU1RBVFVTX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vblN0YXR1c0Rvd25DYWxsKGluZm8gYXMgSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vbkV2ZW50RG93bkNhbGwoaW5mbyBhcyBJRXZlbnREb3duQ2FsbENvbiwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5ESUFMT0dfRE9XTl9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uRGlhbG9nRG93bkNhbGwoaW5mbyBhcyBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0NBTExfTE9HOlxuICAgICAgICAgIHRoaXMuX29uUHViQ2FsbExvZyhpbmZvIGFzIElQdWJDYWxsTG9nLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9DQUxMX0xPR19SRUFERUQ6XG4gICAgICAgICAgLy8gcGFzcyDmmoLmnKrnlKjliLBcbiAgICAgICAgICAvLyB0aGlzLl9vblB1YkNhbGxMb2dSZWFkZWQoaW5mbyBhcyBJUHViQ2FsbExvZ1JlYWRlZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfTkFDS19TRVFfSUQ6XG4gICAgICAgICAgLy8gVE9ETyBjYWxsIOW8see9keihpeWBv+aWueahiOa2ieWPiuaWueazle+8jFBDIOacquWBmu+8jOatpOWkhOmYsuatoui1sOWIsCBkZWZhdWx0XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5fb25Db25wZW5zYXRpb25EYXRhKGluZm8gYXMgSUNvbnBlbnNhdGlvbkRhdGEsIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBkZXZpY2VJZCDliKTmlq3mlbDmja7mmK/lkKblupTor6XkuIvlj5FcbiAgICogZGV2aWNlSWQg5Li656m65a2X56ym5Liy5oiWIG51bGwg55u05o6l5LiL5Y+RXG4gICAqIGRldmljZUlkIOacieWFt+S9k+eahOWAvO+8jOagueaNriBkZXZpY2VJZCDliKTmlq3mmK/lkKbmmK/lt7Hnq6/nmoQgZGV2aWNlSWRcbiAgICovXG4gIHByaXZhdGUgX2lzVmFsaWREYXRhKGRldmljZUlkOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzTnVsbChkZXZpY2VJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcoZGV2aWNlSWQpICYmIChkZXZpY2VJZD8ubGVuZ3RoID09PSAwIHx8IGRldmljZUlkID09PSB0aGlzLl9zZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmCgOivt1xuICAgKiBAcGFyYW0gaXNEaXJlY3RseSDmmK/lkKbkuLrnm7Tlj5Hkv6Hku6RcbiAgICovXG4gIHByaXZhdGUgX29uUHViSW52aXRlQ2FsbChkYXRhOiBJUHViSW52aXRlQ29uLCBpc0RpcmVjdGx5ID0gdHJ1ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVSWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgICAgY29uc3QgY3VycmVudFVzZXIgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVSWQpO1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYGN1cnJlbnRVc2VyOiAke0pTT04uc3RyaW5naWZ5KGN1cnJlbnRVc2VyKX0sIGN1cnJlbnRVc2VySWQ6ICR7Y3VycmVudFVJZH0sIHN0YXRlOiAke3N0YXRlfWAsIHRyYWNlSWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYGVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgdHJhY2VJZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5faXNWYWxpZERhdGEoZGF0YS50b0RldmljZUlkIHx8ICcnKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PLCBgbm90IGN1cnJlbnQgZGV2aWNlSWQgLT4gZGV2aWNlSW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRvRGV2aWNlSWQ6IGRhdGEudG9EZXZpY2VJZCxcbiAgICAgICAgY2xpZW50RGV2aWNlSWQ6IHRoaXMuX3Nlc3Npb25JZCxcbiAgICAgIH0pfWAsIHRyYWNlSWQpO1xuICAgICAgLy8gQSDlkowgQiDnvqTpgJror53kuK3vvIxBIOWGjemCgOivtyBD77yMQiDlkowgQicg6YO95Lya5Lya5pS25YiwIHB1Ykludml0ZUNhbGwsIEInIOaUtuWIsOeahCBwdWJJbnZpdGVDYWxsIOeahCB0b0RldmljZUlkIOS4jeS4uuiHquW3se+8jOaXoOmcgOWkhOeQhlxuXG4gICAgICAvLyBob29rcyDlm57osIPlpITnkIZcbiAgICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVhc29uOiBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbi5OT1RfQ1VSUkVOVF9ERVZJQ0VJRCxcbiAgICAgICAgcmVmZXI6IGlzRGlyZWN0bHkgPyBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVQl9JTlZJVEUgOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVTExfS1ZfSU5WSVRFLFxuICAgICAgfTtcbiAgICAgIGlmIChpc0RpcmVjdGx5KSB7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwgaW5mbykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCBpbmZvKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdGVuZXIub25JbnZpdGUoZGF0YSwgaXNEaXJlY3RseSwgdHJhY2VJZCk7XG4gICAgaWYgKGlzRGlyZWN0bHkpIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbCwgT2JqZWN0LmFzc2lnbihkYXRhLCB7IGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbFB1bGxLdiwgT2JqZWN0LmFzc2lnbihkYXRhLCB7IGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOeKtuaAgeWPmOabtO+8muWTjemTg+OAgeW/meeijOOAgemAmuivneetieW+heOAgeWvueaWueacquaOpeWQrOOAgeW3seaWueacquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfb25TdGF0dXNEb3duQ2FsbChkYXRhOiBJU3RhdHVzRG93bkNvbnQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOaVsOaNruS4rei/h+a7pOaOieacquWPmOabtOeahCB1c2VyU2Vzc2lvblxuICAgIGRhdGEuY2FsbFNlc3Npb25Vc2VycyA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IEJvb2xlYW4oaXRlbS5jaGFuZ2VkKSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTywgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9pc1ZhbGlkRGF0YShkYXRhLnRvRGV2aWNlSWQgfHwgJycpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTywgYG5vdCBjdXJyZW50IGRldmljZUlkIC0+IGRldmljZUluZm86ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0b0RldmljZUlkOiBkYXRhLnRvRGV2aWNlSWQsXG4gICAgICAgIGNsaWVudERldmljZUlkOiB0aGlzLl9zZXNzaW9uSWQsXG4gICAgICB9KX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOS4jeaYr+e7meW9k+WJjeiuvuWkh+S4i+WPkeeahOeKtuaAgeWkhOeQhlxuICAgICAgdGhpcy5fbGlzdGVuZXIub25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyLm9uU3RhdHVzRG93bihkYXRhLCB0cmFjZUlkLCB0aGlzLl9zZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmAmuivneS6i+S7tuWPmOabtO+8muaJk+W8gHzlhbPpl60g5pGE5YOP5aS0XG4gICAqL1xuICBwcml2YXRlIF9vbkV2ZW50RG93bkNhbGwoZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xpc3RlbmVyLm9uRXZlbnREb3duKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmAmuivneiwg+aVtOS6i+S7tuWPiue7k+aenFxuICAgKiDkuovku7bvvJrlqpLkvZPnsbvlnovliIfmjaJcbiAgICog5Yqo5L2c77ya6K+35rGC44CB5o6l5Y+X44CB5ouS57ud44CB5Y+W5raIXG4gICAqL1xuICBwcml2YXRlIF9vbkRpYWxvZ0Rvd25DYWxsKGRhdGE6IElEaWFsb2dEb3duQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBkaWFsb2dUeXBlLCBhY3Rpb24sIGV4dHJhS2V5VmFsIH0gPSBkYXRhO1xuICAgIHN3aXRjaCAoZGlhbG9nVHlwZSkge1xuICAgICAgY2FzZSBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFOlxuICAgICAgICB0aGlzLl9saXN0ZW5lci5vblN3aXRjaE1lZGlhVHlwZShkYXRhLCB0cmFjZUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d57uT5p2f5ZCO77yM5pel5b+X5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIF9vblB1YkNhbGxMb2coZGF0YTogSVB1YkNhbGxMb2csIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NBTExfUkVDT1JEX08sIGBjYWxsIHJlY29yZDogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uUmVjdkNhbGxFbmRMb2coZGF0YSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KGl5YG/5pWw5o2u5aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbkNvbnBlbnNhdGlvbkRhdGEoZGF0YTogSUNvbnBlbnNhdGlvbkRhdGEsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PLCAnJywgdHJhY2VJZCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBzZWNyZXRDaGF0LCBkdXJhdGlvbiwgY2FsbFN0YXR1cywgY2FsbGluZ1VzZXJJZCwgY2FsbFNlc3Npb25Vc2VycywgdG9EZXZpY2VJZCwgY2FsbERpYWxvZ0VudGl0eXMsXG4gICAgfSA9IGRhdGE7XG5cbiAgICBjb25zdCBpc1B1Ykludml0ZUNhbGxEYXRhID0gY2FsbFNlc3Npb25Vc2Vycy5zb21lKChpdGVtKSA9PiBpdGVtLnNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQgJiYgaXRlbS51c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpO1xuXG4gICAgaWYgKGlzUHViSW52aXRlQ2FsbERhdGEpIHtcbiAgICAgIHRoaXMuX29uUHViSW52aXRlQ2FsbCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdG9EZXZpY2VJZCxcbiAgICAgICAgY2FsbFR5cGUsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgaW52aXRlVXNlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgICBzZWNyZXRDaGF0LFxuICAgICAgfSwgdHJ1ZSwgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uU3RhdHVzRG93bkNhbGwoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHRvRGV2aWNlSWQsXG4gICAgICAgIGNhbGxTdGF0dXMsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxEaWFsb2dFbnRpdHlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNhbGxEaWFsb2dFbnRpdHlzLmZvckVhY2goKGRhdGEpID0+IHRoaXMuX29uRGlhbG9nRG93bkNhbGwoZGF0YSwgdHJhY2VJZCksIHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIiwiY29uc3Qgc3RyaW5nMTB0bzY0ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlna2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUdLTE1OT1BRUlNUVVZXWFlaKy8nLnNwbGl0KCcnKTtcbiAgY29uc3QgcmFkaXggPSBjaGFycy5sZW5ndGggKyAxO1xuICBsZXQgcXV0aWVudCA9ICtudW1iZXI7XG4gIGNvbnN0IGFyciA9IFtdO1xuICBkbyB7XG4gICAgY29uc3QgbW9kID0gcXV0aWVudCAlIHJhZGl4O1xuICAgIHF1dGllbnQgPSAocXV0aWVudCAtIG1vZCkgLyByYWRpeDtcbiAgICBhcnIudW5zaGlmdChjaGFyc1ttb2RdKTtcbiAgfSB3aGlsZSAocXV0aWVudCk7XG4gIHJldHVybiBhcnIuam9pbignJyk7XG59O1xuXG5jb25zdCBnZXRVVUlEID0gKCkgPT4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICBjb25zdCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDtcbiAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XG4gIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbn0pO1xuXG4vKiDojrflj5YgMjIg5L2N55qEIFVVSUQgKi9cbmV4cG9ydCBjb25zdCBnZXRVVUlEMjIgPSAoKSA9PiB7XG4gIGxldCB1dWlkOiBzdHJpbmcgfCBudW1iZXIgPSBnZXRVVUlEKCk7XG4gIHV1aWQgPSBgJHt1dWlkLnJlcGxhY2UoLy0vZywgJycpfTBgO1xuICB1dWlkID0gcGFyc2VJbnQodXVpZCwgMTYpO1xuICB1dWlkID0gc3RyaW5nMTB0bzY0KHV1aWQpO1xuICBpZiAodXVpZC5sZW5ndGggPiAyMikge1xuICAgIHV1aWQgPSB1dWlkLnNsaWNlKDAsIDIyKTtcbiAgfVxuICByZXR1cm4gdXVpZDtcbn07XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcblxuY29uc3QgQ0FMTF9EQl9OQU1FID0gJ1JDX0NBTExQTFVTJztcblxuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5cbmludGVyZmFjZSBJT2JqU3RvcmVQYXJhbXMge1xuICAvKipcbiAgICog5Li76ZSuXG4gICAqL1xuICBrZXlQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICog5aaC5p6c5rKh5pyJ5ZCI6YCC55qE5Li76ZSu77yM5Y+v5Lul6K6+572u5Li6IHRydWUg6Ieq5Yqo55Sf5oiQXG4gICAqL1xuICBhdXRvSW5jcmVtZW50PzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSUluZGV4REJPcHRzIHtcbiAgb25TdWNjZXNzOiAoKSA9PiB2b2lkO1xuICBvbkVycm9yPzogKCkgPT4gdm9pZDtcbn1cblxubGV0IGxvZ2dlcjogQmFzaWNMb2dnZXI7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxJbmRleERCIHtcbiAgLyoqXG4gICAqIGNhbGwgaW5kZXhEQiDlupNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9kYjogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSQ0NhbGxJbmRleERCIOWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBSQ0NhbGxJbmRleERCIHwgbnVsbCA9IG51bGxcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGluaXQoX2xvZ2dlcjogQmFzaWNMb2dnZXIsIG9wdHM6IElJbmRleERCT3B0cykge1xuICAgIGxvZ2dlciA9IF9sb2dnZXI7XG4gICAgaWYgKCF0aGlzLmlzU3VwcG9ydCgpKSB7XG4gICAgICBsb2dnZXIuaW5mbygnW1JDQ2FsbEluZGV4REJdJywgJ0luZGV4REIgaXMgbm90IHN1cHBvcnQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXEgPSB3aW5kb3cuaW5kZXhlZERCLm9wZW4oQ0FMTF9EQl9OQU1FLCBEQl9WRVJTSU9OKTtcblxuICAgIHJlcS5vbmVycm9yID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgb3BlbiBpbmRleERCIHJlcSBmYWlsZWQgLT4gJHtldi50YXJnZXQuZXJyb3J9YCk7XG4gICAgfTtcblxuICAgIHJlcS5vbnN1Y2Nlc3MgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgdGhpcy5fZGIgPSBldi50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKHRoaXMuX2RiKSB7XG4gICAgICAgIHRoaXMuX2RiLm9uY2xvc2UgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyB1bmV4cGVjdGVkbHkgY2xvc2VkLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RiLm9uZXJyb3IgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyBvcGVuaW5nIGVycm9yLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RiLm9uYWJvcnQgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyBvcGVuaW5nIGFib3J0ZWQuICR7ZXZ9YCk7XG4gICAgICAgICAgdGhpcy51bkluaXQoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFJDQ2FsbEluZGV4REIuX2luc3RhbmNlID0gbmV3IFJDQ2FsbEluZGV4REIoKTtcbiAgICAgIG9wdHMub25TdWNjZXNzKCk7XG4gICAgfTtcblxuICAgIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgdGhpcy5fZGIgPSBldi50YXJnZXQucmVzdWx0O1xuXG4gICAgICBSQ0NhbGxJbmRleERCLmNyZWF0ZU9ialN0b3JlKCdDYWxsQldfQWJub3JtYWxDYWxsJywgeyBrZXlQYXRoOiAndXNlcklkJyB9KTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHVuSW5pdCgpIHtcbiAgICB0aGlzLl9kYiA9IG51bGw7XG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICB9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IFJDQ2FsbEluZGV4REIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgaXNTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cgfHwgIXdpbmRvdy5pbmRleGVkREIpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU9ialN0b3JlKG9iak5hbWU6IHN0cmluZywgb3B0czogSU9ialN0b3JlUGFyYW1zKSB7XG4gICAgbGV0IG9ialN0b3JlOiBJREJPYmplY3RTdG9yZTtcbiAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiPy5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKG9iak5hbWUpKSB7XG4gICAgICBvYmpTdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiIS5jcmVhdGVPYmplY3RTdG9yZShvYmpOYW1lLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbUkNDYWxsSW5kZXhEQl0nLCBgY3JlYXRlT2JqU3RvcmUgJHtvYmpOYW1lfSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2JqTmFtZSDooajmmI5cbiAgICogQHBhcmFtIHZhbCDopoHmt7vliqDnmoTmlbDmja5cbiAgICovXG4gIHB1YmxpYyBhZGRWYWx1ZSA8VD4ob2JqTmFtZTogc3RyaW5nLCB2YWw6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYikge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSwgJ3JlYWR3cml0ZScpLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuICAgICAgY29uc3QgcmVxID0gc3RvcmUuYWRkKHZhbCk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdbUkNDYWxsSW5kZXhEQl0nLCAnYWRkVmFsdWUgZmFpbGVkJyk7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7kuLvplK7or7vlj5bmlbDmja5cbiAgICogQHBhcmFtIGtleSDkuLvplK5cbiAgICovXG4gIHB1YmxpYyByZWFkQnlLZXkgPFQ+KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSkub2JqZWN0U3RvcmUob2JqTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLmdldChrZXkpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoZXYpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGByZWFkQnlLZXkgb25lcnJvciAtPiAke2V2fWApO1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7kuLvplK7mm7TmlrDmlbDmja5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVCeUtleSA8VD4ob2JqTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcblxuICAgICAgY29uc3QgcmVxID0gc3RvcmUucHV0KHZhbCk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9IChldikgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGB1cGRhdGVCeUtleSBvbmVycm9yIC0+ICR7ZXZ9YCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUJ5S2V5KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYikge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSwgJ3JlYWR3cml0ZScpLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuXG4gICAgICBjb25zdCByZXEgPSBzdG9yZS5kZWxldGUoa2V5KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcS5vbmVycm9yID0gKGV2KSA9PiB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYHJlbW92ZUJ5S2V5IG9uZXJyb3IgLT4gJHtldn1gKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBJUnVudGltZSwgSVN0b3JhZ2UgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbmRleERCIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXhEQic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9ialN0b3JlIHtbdXNlcklkOiBzdHJpbmddOiBzdHJpbmdbXX1cblxuaW50ZXJmYWNlIElTdG9yZVZhbCB7dXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdfVxuXG4vKipcbiAqIOW8guW4uOe7k+adnyBjYWxsIOWkhOeQhuWtmOWCqOexu1xuICog5Zyo5ZG85Ye65oiW5ZG85YWl6Zi25q6155qEIGNhbGwg6L+b6KGM5pys5Zyw5a2Y5YKo77yM5q2j5bi457uT5p2f5ZCO5riF6ZmkXG4gKiDlvILluLjnu5PmnZ/lkI7vvIzmnKzlnLDlj5bmnKrmuIXpmaTnmoQgY2FsbElkLCDpgJrov4fmnI3liqHmjqXlj6PmuIXpmaTlvILluLjnu5PmnZ/nmoQgY2FsbCAs6Ziy5q2i5peg5rOV5ZG85Ye65oiW5ZG85YWlXG4gKi9cbmV4cG9ydCBjbGFzcyBBYm5vcm1hbENhbGwge1xuICBwcml2YXRlIF9sb2NhbFN0b3JlITogSVN0b3JhZ2VcblxuICBwcml2YXRlIF9pbmRleERCU3RvcmUhOiBSQ0NhbGxJbmRleERCXG5cbiAgcHJpdmF0ZSBfc3RvcmVLZXk6IHN0cmluZyA9ICdDYWxsQldfQWJub3JtYWxDYWxsJ1xuXG4gIHByaXZhdGUgX2lzU3VwcG9ydEluZGV4REI6IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9pc1N1cHBvcnRJbmRleERCID0gUkNDYWxsSW5kZXhEQi5pc1N1cHBvcnQoKTtcbiAgICBpZiAodGhpcy5faXNTdXBwb3J0SW5kZXhEQikge1xuICAgICAgUkNDYWxsSW5kZXhEQi5pbml0KHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUgPSBSQ0NhbGxJbmRleERCLmdldEluc3RhbmNlKCkhO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xvY2FsU3RvcmUgPSBfcnVudGltZS5sb2NhbFN0b3JhZ2U7XG4gIH1cblxuICAvKipcbiAgICog5re75Yqg5byC5bi4IGNhbGxJZFxuICAgKi9cbiAgcHVibGljIGFkZEFibm9ybWFsbENhbGxJZCh1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRGdW5jID0gdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA/IHRoaXMuX2FkZEJ5SW5kZXhEQiA6IHRoaXMuX2FkZEJ5TG9jYWxTdG9yZTtcbiAgICBhZGRGdW5jLmNhbGwodGhpcywgdXNlcklkLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOW8guW4uCBjYWxsSWRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVBYm5vcm1hbENhbGxJZHModXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcmVtb3ZlRnVuYyA9IHRoaXMuX2lzU3VwcG9ydEluZGV4REIgPyB0aGlzLl9yZW1vdmVCeUluZGV4REIgOiB0aGlzLl9yZW1vdmVCeUxvY2FsU3RvcmU7XG4gICAgcmVtb3ZlRnVuYy5jYWxsKHRoaXMsIHVzZXJJZCwgY2FsbElkcyk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5byC5bi457uT5p2f55qEIGNhbGxJZCDliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRBYm5vcm1hbENhbGxJZHModXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdldEZ1bmMgPSB0aGlzLl9pc1N1cHBvcnRJbmRleERCID8gdGhpcy5fZ2V0QnlJbmRleERCIDogdGhpcy5fZ2V0QnlMb2NhbFN0b3JlO1xuICAgIHJldHVybiBnZXRGdW5jLmNhbGwodGhpcywgdXNlcklkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZEJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqU3RvcmU6IElPYmpTdG9yZSA9IDxJT2JqU3RvcmU+SlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JlLmdldEl0ZW0odGhpcy5fc3RvcmVLZXkpIHx8ICd7fScpO1xuICAgICAgbGV0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcy5wdXNoKGNhbGxJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VyQWJub3JtYWxDYWxsSWRzID0gW2NhbGxJZF07XG4gICAgICB9XG4gICAgICBvYmpTdG9yZVt1c2VySWRdID0gdXNlckFibm9ybWFsQ2FsbElkcztcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmUuc2V0SXRlbSh0aGlzLl9zdG9yZUtleSwgSlNPTi5zdHJpbmdpZnkob2JqU3RvcmUpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfYWRkQnlMb2NhbFN0b3JlIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZUJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqU3RvcmU6IElPYmpTdG9yZSA9IDxJT2JqU3RvcmU+SlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JlLmdldEl0ZW0odGhpcy5fc3RvcmVLZXkpIHx8ICd7fScpO1xuICAgICAgbGV0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcyA9IHVzZXJBYm5vcm1hbENhbGxJZHMuZmlsdGVyKChpZCkgPT4gIWNhbGxJZHMuaW5jbHVkZXMoaWQpKTtcbiAgICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9ialN0b3JlW3VzZXJJZF0gPSB1c2VyQWJub3JtYWxDYWxsSWRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yZS5zZXRJdGVtKHRoaXMuX3N0b3JlS2V5LCBKU09OLnN0cmluZ2lmeShvYmpTdG9yZSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9yZW1vdmVCeUxvY2FsU3RvcmUgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QnlMb2NhbFN0b3JlKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBsZXQgY2FsbElkcyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGNvbnN0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgY2FsbElkcyA9IHVzZXJBYm5vcm1hbENhbGxJZHM7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2dldEJ5TG9jYWxTdG9yZSBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWxsSWRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2FkZEJ5SW5kZXhEQih1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEuY2FsbElkcy5wdXNoKGNhbGxJZCk7XG4gICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS51cGRhdGVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkLCB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGNhbGxJZHM6IGRhdGEuY2FsbElkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUuYWRkVmFsdWUodGhpcy5fc3RvcmVLZXksIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgY2FsbElkczogW2NhbGxJZF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9hZGRCeUluZGV4REIgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVtb3ZlQnlJbmRleERCKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5faW5kZXhEQlN0b3JlLnJlYWRCeUtleTxJU3RvcmVWYWw+KHRoaXMuX3N0b3JlS2V5LCB1c2VySWQpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5jYWxsSWRzID0gZGF0YS5jYWxsSWRzLmZpbHRlcigoaWQpID0+ICFjYWxsSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICAgIGlmIChkYXRhLmNhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS51cGRhdGVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkLCB7XG4gICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICBjYWxsSWRzOiBkYXRhLmNhbGxJZHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlLnJlbW92ZUJ5S2V5KHRoaXMuX3N0b3JlS2V5LCB1c2VySWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX3JlbW92ZUJ5SW5kZXhEQiBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRCeUluZGV4REIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIGxldCBkYXRhID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfZ2V0QnlJbmRleERCIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGEuY2FsbElkcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIi8qKlxuICog5LqL5Lu257G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJFdmVudFR5cGUge1xuICAvKipcbiAgICog5o+Q56S656qX5Y+jXG4gICAqL1xuICBQUk9NUFQgPSAwLFxuICAvKipcbiAgICogQ2FsbFNlcnZlciDkuIvlj5HpgJror53ml7bplb/lj5jmm7TnsbvlnotcbiAgICovXG4gIENBTExfRFVSQVRJT04gPSAxMCxcbiAgLyoqXG4gICAqIOaUtuWIsOi/nOerr+esrOS4gOW4p+aXtumXtFxuICAgKi9cbiAgRklSU1RfRlJBTUUgPSAyMCxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNJbm5lckNvZGUge1xuICBTVUNDRVNTID0gMCxcbiAgLyoqXG4gICAqIOaXoOaViOeahOWTjeW6lOaXtumXtO+8iOaOpeWPo+WTjeW6lOaXtumXtOi/h+mVv++8iVxuICAgKi9cbiAgSU5WQUxJRF9SRVNQT05TRV9USU1FID0gODAxNzAsXG4gIC8qKlxuICAgKiDpnZ7mnIDkvJjlk43lupTml7bpl7RcbiAgICovXG4gIE5PTk9QVElNQUxfUkVTX1RJTUUgPSA4MDE3MSxcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRW5naW5lIH0gZnJvbSAnLi4vUkNDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL3V0aWxzL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0lubmVyQ29kZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUnO1xuXG4vKipcbiAqIOagoeaXtuaooeWdl1xuICovXG5leHBvcnQgY2xhc3MgVGltZUNvcnJlY3Rpb25lciB7XG4gIC8qKlxuICAgKiDmjqXlj6Plk43lupTml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX1JUVDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiDlj6/nlKjnmoTmjqXlj6Plk43lupTml7bpl7TkuIvpmZDvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF92YWxpZE1pblJUVDogbnVtYmVyID0gMjAwXG5cbiAgLyoqXG4gICAqIOWPr+eUqOeahOaOpeWPo+WTjeW6lOaXtumXtOS4iumZkO+8iOWNleS9jTogbXPvvIlcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkTWF4UlRUOiBudW1iZXIgPSAxMDAwXG5cbiAgLyoqXG4gICAqIOS4jiBjYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruaXtumXtO+8iOWNleS9jTogbXPvvIlcbiAgICovXG4gIHByaXZhdGUgX2RlbHRhVGltZTogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiB0aW1lcklkXG4gICAqL1xuICBwcml2YXRlIF90aW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDova7orq3ml7bpl7Tpl7TpmpTvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcnZhbDogbnVtYmVyID0gMiAqIDEwMDBcblxuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhSZXRyeVRpbWVzOiBudW1iZXIgPSA4XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2luZ2xlQ2FsbER1cmF0aW9uRXY6IChjYWxsSWQ6IHN0cmluZywgY2xpZW50U3RhcnRUaW1lOiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDku47mnI3liqHnq6/ojrflj5bpgJror53ml7bplb/jgIHpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsQ2xpZW50VGltZUJ5U2VydmVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBpZiAoIXRoaXMuX1JUVCB8fCB0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCkge1xuICAgICAgYXdhaXQgdGhpcy5fZ2V0RGVsdGFUaW1lKHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FfWAsIHRyYWNlSWQpO1xuICAgICAgLy8gcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3RhcnRUaW1lOiBzZXJ2ZXJTdGFydFRpbWUgfSA9IGRhdGEhO1xuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3Ioc2VydmVyU3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gKGN1cnJlbnRUaW1lICsgdGhpcy5fZGVsdGFUaW1lIC0gc2VydmVyU3RhcnRUaW1lKSAvIDEwMDA7XG5cbiAgICBpZiAoZHVyYXRpb24gPCAwKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9QLCBgaW52YWxpZCBkdXJhdGlvbjogJHtkdXJhdGlvbn1gLCB0cmFjZUlkKTtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICAvLyDlkJHkuIvlj5bmlbRcbiAgICBkdXJhdGlvbiA9IE1hdGguZmxvb3IoZHVyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuX1JUVCA+IHRoaXMuX3ZhbGlkTWluUlRUICYmIHRoaXMuX1JUVCA8PSB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuTk9OT1BUSU1BTF9SRVNfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuTk9OT1BUSU1BTF9SRVNfVElNRSwgZHVyYXRpb24sIGNsaWVudFN0YXJ0VGltZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJ0dDogdGhpcy5fUlRULFxuICAgICAgZGVsdGFUOiB0aGlzLl9kZWx0YVRpbWUsXG4gICAgICBzZXJ2ZXJTdGFydFRpbWUsXG4gICAgICBjbGllbnRTdGFydFRpbWUsXG4gICAgICBkdXJhdGlvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZSwgZHVyYXRpb24sIGNsaWVudFN0YXJ0VGltZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgcHVibGljIGNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkOiBzdHJpbmcsIHN0YXJ0VGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpOiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciB9IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfVCwgYGNhbGxJZDogJHtjYWxsSWR9LCBzdGFydFRpbWU6ICR7c3RhcnRUaW1lfWAsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOWGjeasoemHjeaWsOiOt+WPliBSVFQg5bm26YeN5paw6K6h566X5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FIH07XG4gICAgfVxuXG4gICAgY29uc3QgY2xpZW50U3RhcnRUaW1lID0gTWF0aC5mbG9vcihzdGFydFRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9SLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgICAgc3RhcnRUOiBzdGFydFRpbWUsXG4gICAgICBjbGllbnRTdGFydFRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX1JUVCA+IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDph43nva4gY2FsbCDkuK3ph43or5XmrKHmlbBcbiAgICAgIHRoaXMuX3JldHJ5VGltZXNJbkNhbGwgPSAwO1xuICAgICAgLy8g5YaN5qyh6YeN5paw6I635Y+WIFJUVCDlubbph43mlrDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIHRoaXMuX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUywgY2xpZW50U3RhcnRUaW1lIH07XG4gIH1cblxuICBwcml2YXRlIF9zdGFydFRpbWVzID0gMDtcblxuICAvKipcbiAgICog5byA5aeL5a6a5pe26YCS5b2S6I635Y+W5LiOIENhbGxTZXJ2ZXIg55qE5pe26Ze05YGP5beu5YC8XG4gICAqL1xuICBwdWJsaWMgc3RhcnQodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVySWQgfHwgdGhpcy5fc3RhcnRUaW1lcyA+PSB0aGlzLl9tYXhSZXRyeVRpbWVzKSB7XG4gICAgICAvLyDpmLLmraLph43lpI3lkK/liqhcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NUQVJUX08sIGB0aW1lcklkOiAke3RoaXMuX3RpbWVySWR9YCk7XG5cbiAgICB0aGlzLl9zdGFydFRpbWVzKys7XG5cbiAgICAvLyDojrflj5ZcbiAgICB0aGlzLl9nZXREZWx0YVRpbWUodHJhY2VJZCk7XG5cbiAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3RpbWVySWQgPSBudWxsO1xuICAgICAgdGhpcy5zdGFydCh0cmFjZUlkKTtcbiAgICB9LCB0aGlzLl9pbnRlcnZhbCk7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i5a6a5pe26L2u6K6tXG4gICAqL1xuICBwdWJsaWMgc3RvcCh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NUT1BfTywgYHRpbWVySWQ6ICR7dGhpcy5fdGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICB0aGlzLl90aW1lcklkICYmIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcklkKTtcbiAgICB0aGlzLl90aW1lcklkID0gbnVsbDtcbiAgICAvLyDph43nva7mrKHmlbBcbiAgICB0aGlzLl9zdGFydFRpbWVzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiDph43mlrDlrprml7bova7orq1cbiAgICovXG4gIHB1YmxpYyByZXN0YXJ0KHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfUkVTVEFSVF9PLCBgbGVnYWwgcnR0IHRpbWUsIFJUVDogJHt0aGlzLl9SVFR9LCB2YWxpZE1pblJUVDogJHt0aGlzLl92YWxpZE1pblJUVH1gLCB0cmFjZUlkKTtcbiAgICBpZiAodGhpcy5fUlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5riF6Zmk5b2T5YmN5q2j5Zyo6L+b6KGM55qEXG4gICAgdGhpcy5zdG9wKHRyYWNlSWQpO1xuICAgIC8vIOmHjeaWsOWQr+WKqFxuICAgIHRoaXMuc3RhcnQodHJhY2VJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9jYWxEZWxheVRpbWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsdGFUaW1lO1xuICB9XG5cbiAgcHVibGljIGdldFJUVCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9SVFQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5LiOIENhbGxTZXJ2ZXIg55qE5pe26Ze05YGP5beu5YC877yM6Z2e6YCa6K+d5Lit55qE6K6h566XXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXREZWx0YVRpbWUodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgZGVsYXlUaW1lPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiBzeW5jVGltZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UlRUID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIOWwj+S6jiAxMDAwbXMg5Li65Y+v55SoIHJ0dFxuICAgIGlmICgoY3VycmVudFJUVCA8IHRoaXMuX1JUVCB8fCB0aGlzLl9SVFQgPT09IDApICYmIGN1cnJlbnRSVFQgPD0gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX1JUVCA9IGN1cnJlbnRSVFQ7XG4gICAgfVxuXG4gICAgLy8g5Y+q5pyJ5bCP5LqOIDIwMG1zIOWBnOatouiOt+WPllxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIC8vIOWwj+S6juacgOWwj+WPr+eUqCBydHTvvIzlgZzmraLova7orq3orqHnrpdcbiAgICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YVRpbWUgPSAoc3luY1RpbWUhIC0gc3RhcnRUaW1lKSAtIHRoaXMuX1JUVCAvIDI7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NFVF9ERUxUQV9USU1FX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJ0dDogdGhpcy5fUlRULFxuICAgICAgZGVsdGFUOiB0aGlzLl9kZWx0YVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgZGVsYXlUaW1lOiB0aGlzLl9kZWx0YVRpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3ojrflj5blvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldERlbHRhVGltZUluQ2FsbChjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciwgY2xpZW50Rmlyc3RGcmFtZVRpbWU/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UlRUID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIOWwj+S6jiAxMDAwbXMg5Li65Y+v55SoIHJ0dFxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fUlRUKSB7XG4gICAgICB0aGlzLl9SVFQgPSBjdXJyZW50UlRUO1xuICAgIH1cblxuICAgIHRoaXMuX2RlbHRhVGltZSA9IChkYXRhIS5zeW5jVGltZSAtIHN0YXJ0VGltZSkgLSB0aGlzLl9SVFQgLyAyO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQsXG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3IoZGF0YSEuc3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICBjb25zdCBjbGllbnRGaXJzdEZyYW1lVGltZSA9IE1hdGguZmxvb3IoZGF0YSEuZmlyc3RGcmFtZXRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuXG4gICAgLy8g5Y+q5pyJ5bCP5LqOIDIwMG1zIOWBnOatouiOt+WPllxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIC8vIOacgOS8mOe7k+aenO+8jOWBnOatoui9ruiureiuoeeul1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTLCBjbGllbnRTdGFydFRpbWUsIGNsaWVudEZpcnN0RnJhbWVUaW1lIH07XG4gICAgfVxuICAgIC8vIOmdnuacgOS8mOe7k+aenFxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FLCBjbGllbnRTdGFydFRpbWUsIGNsaWVudEZpcnN0RnJhbWVUaW1lIH07XG4gIH1cblxuICBwcml2YXRlIF9yZXRyeVRpbWVzSW5DYWxsOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4UmV0cnlUaW1lc0luQ2FsbDogbnVtYmVyID0gM1xuXG4gIC8qKlxuICAgKiDlpJrmrKHmoKHmraPmipvnu5nkuJrliqHlsYLnmoTpgJror53lvIDlp4vml7bpl7TjgIHpppbluKfml7bpl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLy8g5YWI5YGc5q2i5pyq57uT5p2f55qE6K6h566XXG4gICAgdGhpcy5zdG9wKHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gYXdhaXQgdGhpcy5fZ2V0RGVsdGFUaW1lSW5DYWxsKGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g57uT5p6c5pyA5LyY77yM5oqb57uZ5bqU55So5bGC5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9zaW5nbGVDYWxsRHVyYXRpb25FdihjYWxsSWQsIGNsaWVudFN0YXJ0VGltZSEsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID4gdGhpcy5fbWF4UmV0cnlUaW1lc0luQ2FsbCAmJiBjb2RlID09PSBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDpnZ7mnIDkvJjnu5PmnpzvvIzmipvnu5nlupTnlKjlsYLlvIDlp4vml7bpl7TvvIzmoLnmja7ph43or5XmrKHmlbDov5vooYzph43or5U7IOmHjeivlSAzIOasoeWQjuWGjeaKm+WHuuS4u+imgeaYr+S4uuS6huiOt+WPluacgOWwjyBSVFRcbiAgICAgIHRoaXMuX3NpbmdsZUNhbGxEdXJhdGlvbkV2KGNhbGxJZCwgY2xpZW50U3RhcnRUaW1lISwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JldHJ5VGltZXNJbkNhbGwgPiB0aGlzLl9tYXhSZXRyeVRpbWVzSW5DYWxsKSB7XG4gICAgICAvLyDml6DmnIDkvJjnu5PmnpzvvIzlupTnlKjlsYLmoLnmja7oh6rlt7HnmoTml7bpl7TotbDooagsIOebuOW9k+S6jiBSVFQg5oyJIDAg5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmV0cnlUaW1lc0luQ2FsbCsrO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fbG9vcENvcnJlY3RDbGllbnRUaW1lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBGb3J3YXJkVHlwZSB7XG4gIC8qKlxuICAgKiDpgJrov4fkuIvkuIDmrKHkurrlkZjnirbmgIEgdXNlclN0YXRlIOeahOS4i+WPkeWQjOatpeW4puS4i+WOu1xuICAgKi9cbiAgU09PTl9BRkVURVIgPSAwLFxuICAvKipcbiAgICog56uL5Y2z6L2s5Y+RXG4gICAqL1xuICBDVVJSRU5UID0gMSxcbn1cbiIsImltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2Uge1xuICBQVUJfSU5WSVRFX0NBTEwgPSAwLFxuICBQVUxMX0tWX0lOVklURV9DQUxMID0gMSxcbiAgU1lTVEVNX1BVU0ggPSAyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdGF0aXN0aWNzRGF0YSB7XG4gIC8qKlxuICAgKiDkuIrmiqXml7bpl7RcbiAgICovXG4gIHRpbWU6IG51bWJlcixcbiAgLyoqXG4gICAqIOi/kOiQpeWVhu+8jOS+i+WmgiDkuK3lm73ogZTpgJpcbiAgICovXG4gIGNyOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDnvZHnu5znsbvlnovvvIzkvovlpoIgNEdcbiAgICovXG4gIG5ldDogc3RyaW5nLFxuICAvKipcbiAgICogdXNlcklkXG4gICAqL1xuICB1aWQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIOmUmeivr+eggVxuICAgKi9cbiAgY29kOiBudW1iZXIsXG4gIC8qKlxuICAgKiDosIPnlKjmiafooYzml7bplb9cbiAgICovXG4gIGR1cjogbnVtYmVyXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnotcbiAgICovXG4gIG10cDogUkNDYWxsUGx1c01lZGlhVHlwZVxuICAvKipcbiAgICog6YCa6K+d57G75Z6L77yM56eB6IGK5oiW576k6IGKXG4gICAqL1xuICBjdHA6IFJDQ2FsbFBsdXNUeXBlXG4gIC8qKlxuICAgKiBjYWxsSWRcbiAgICovXG4gIGNpZDogc3RyaW5nXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBjY2lkOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDpgoDor7fmjqXmlLbmnaXmupBcbiAgICovXG4gIHJmOiBSQ0NhbGxQbHVzSW52aXRlU291cmNlXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxEaXJlY3Rpb24ge1xuICAvKipcbiAgICog5ZG85Ye6XG4gICAqL1xuICBPVVQgPSAtMSxcbiAgLyoqXG4gICAqIOe+pOWRvFxuICAgKi9cbiAgR1JPVVAgPSAwLFxuICAvKipcbiAgICog5ZG85YWlXG4gICAqL1xuICBJTiA9IDFcbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIsIElSdW50aW1lLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IERpYWxvZ0FjdGlvbiB9IGZyb20gJy4vZW51bXMvRGlhbG9nQWN0aW9uJztcbmltcG9ydCB7IERpYWxvZ1R5cGUgfSBmcm9tICcuL2VudW1zL0RpYWxvZ1R5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ2FsbFN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgU2VjcmV0Q2FsbFR5cGUgfSBmcm9tICcuL2VudW1zL1NlY3JldENhbGxUeXBlJztcbmltcG9ydCB7IElSQ0NhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHtcbiAgSUFjY2VwdEluZm8sXG4gIElBY2NlcHRPcHRzLFxuICBJQ2FsbElkLFxuICBJUkNDYWxsUGx1c0NhbGxSZWNvcmQsXG4gIElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyxcbiAgSUNhbmNlbENoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElHZXRDYWxsTG9nTGlzdE9wdHMsXG4gIElHZXRDYWxsU2Vzc2lvblJlcyxcbiAgSUhhbmd1cEluZm8sXG4gIElJbnZpdGVPcHRzLFxuICBJSW52aXRlUmVzLFxuICBJSm9pbkNhbGxPcHRzLFxuICBJT3RoZXJNZW1JbmZvLFxuICBJUmVxQ2hhbmdlTWVkaWFUeXBlT3B0cyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZVJlcyxcbiAgSVJlc0NoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElTZXNzaW9uVXNlcixcbiAgSVN0YXJ0Q2FsbE9wdHMsXG4gIElTdGFydENhbGxSZXN1bHQsXG4gIElIYW5ndXBGb3JCdXN5T3B0cyxcbiAgSUNoYW5nZU1lZGlhVHlwZUluZm8sXG59IGZyb20gJy4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7XG4gIElDYWxsU2Vzc2lvblVzZXIsXG4gIElEaWFsb2dEb3duQ2FsbENvbixcbiAgSUV2ZW50RG93bkNhbGxDb24sXG4gIElHZXRDYWxsVGltZUluZm9SZXMsXG4gIElHZXREZWxheVRpbWVJbmZvUmVzLFxuICBJUHViQ2FsbExvZyxcbiAgSVB1Ykludml0ZUNvbixcbiAgSVN0YXR1c0Rvd25Db250LFxuICBJU3lzU3RhdHVzVXBPcHRzLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVNpZ25hbFRyYW5zcG9ydGVyJztcbmltcG9ydCB7IENhbGxUaW1lckV2ZW50VHlwZSwgUkNDYWxsSW5uZXJTZXNzaW9uIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbic7XG5pbXBvcnQgeyBTaWduYWxUcmFuc3BvcnRlciB9IGZyb20gJy4vbW9kdWxlcy9TaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBwYXJzZVN0YXR1c0RhdGEsIHRyYW4yQ2FsbExvZyB9IGZyb20gJy4vdXRpbHMvaGVscGVyJztcbmltcG9ydCB7IGdldFVVSUQyMiB9IGZyb20gJy4vdXRpbHMvcmFuZG9tJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vdXRpbHMvdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IEFibm9ybWFsQ2FsbCB9IGZyb20gJy4vbW9kdWxlcy9BYm5vcm1hbENhbGwnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckV2ZW50VHlwZSB9IGZyb20gJy4vZW51bXMvQ2FsbFNlcnZlckV2ZW50VHlwZSc7XG5pbXBvcnQgeyBUaW1lQ29ycmVjdGlvbmVyIH0gZnJvbSAnLi9tb2R1bGVzL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuL2VudW1zL0ZvcndhcmRUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSwgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzSW52aXRlU291cmNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbFBsdXNSZXBvcnRNb2R1bGUnO1xuaW1wb3J0IHsgUkNDYWxsRGlyZWN0aW9uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxEaXJlY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0lubmVyQ29kZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZSc7XG5cbmNvbnN0IENBTExfVElNRV9PVVQgPSA2MCAqIDEwMDA7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxFbmdpbmUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzdGF0aWMgX19JTk5FUl9TRVNTSU9OX0NMT1NFX186IHN0cmluZyA9ICdpbm5lci1zZXNzaW9uLWNsb3NlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fOiBzdHJpbmcgPSAnaW5uZXItc2Vzc2lvbi1jb25uZWN0J1xuXG4gIHN0YXRpYyBfX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX186IHN0cmluZyA9ICdpbm5lci1jaGFuZ2UtbWVkaWEtdHlwZSdcblxuICBzdGF0aWMgX19JTk5FUl9JTlZJVEVfXzogc3RyaW5nID0gJ2lubmVyLWludml0ZSdcblxuICAvKipcbiAgICog5Li7IHNlc3Npb25cbiAgICovXG4gIF9tYWluU2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5Zyo6YCa6K+d5Lit5pS25Yiw55qEIOmCgOivtyBzZXNzaW9uXG4gICAqL1xuICBfaG9sZFNlc3Npb25zOiBSQ0NhbGxJbm5lclNlc3Npb25bXSA9IFtdXG5cbiAgLyoqXG4gICAqIOS/oeS7pOaooeWdl1xuICAgKi9cbiAgX3NpZ25hbE1vZHVsZTogU2lnbmFsVHJhbnNwb3J0ZXJcblxuICAvKipcbiAgICog5byC5bi457uT5p2fIGNhbGwg5aSE55CG5ZmoXG4gICAqL1xuICBfYWJub3JtYWxNb2R1bGU6IEFibm9ybWFsQ2FsbFxuXG4gIC8qKlxuICAgKiDorrDlvZXljZXlkbzkuK3vvIzmmK/lkKbkuIrmiqXov4fnrKzkuIDluKdcbiAgICog572uIHRydWUg5pe25py677ya5pS25Yiw6L+c56uv56ys5LiA5bin77yM5oiQ5Yqf5LiK5oqlIFNlcnZlclxuICAgKiDnva4gZmFsc2Ug5pe25py677ya6YCa6K+d57uT5p2fXG4gICAqL1xuICBwcml2YXRlIF9pc1VwRmlyc3RGcmFtZVRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDpgJror53kuLogT05DQUxMIOaXtu+8jFNESyDpnIDnu5nkuJrliqHlsYLkuIrmiqXpgJror53lvIDlp4vorqHml7bkuovku7ZcbiAgICog5Lya5pS25Yiw5aSa5qyhIE9OQ0FMTO+8jOaJgOS7pemcgOimgeagh+ivhuaYr+WQpuW3suaKm+i/h+S6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFN0YXJ0TWFwOiB7XG4gICAgW2NhbGxJZDogc3RyaW5nXToge1xuICAgICAgaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZTogYm9vbGVhbixcbiAgICB9XG4gIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDmoKHml7blmahcbiAgICovXG4gIF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSVJDQ2FsbEluaXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lciA9IG5ldyBUaW1lQ29ycmVjdGlvbmVyKHRoaXMsIF9sb2dnZXIsIHRoaXMuX29uUmVjdlNpbkNhbGxEdXJhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9zaWduYWxNb2R1bGUgPSBuZXcgU2lnbmFsVHJhbnNwb3J0ZXIoX2NvbnRleHQsIF9ydW50aW1lLCBfaW5pdE9wdHMsIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIsIHRoaXMuX2xvZ2dlcik7XG4gICAgdGhpcy5fc2lnbmFsTW9kdWxlLnJlZ2lzdGVyTGlzdGVuZXIoe1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG4gICAgICBvblN0YXR1c0Rvd246IHRoaXMuX29uU3RhdHVzRG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25PdGhlckNsaWVudFN0YXR1c0Rvd246IHRoaXMuX29uT3RoZXJDbGllbnRTdGF0dXNEb3duLmJpbmQodGhpcyksXG4gICAgICBvbkV2ZW50RG93bjogdGhpcy5fb25FdmVudERvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uU3dpdGNoTWVkaWFUeXBlOiB0aGlzLl9vblN3aXRjaE1lZGlhVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgb25SZWN2Q2FsbEVuZExvZzogdGhpcy5fb25SZWN2Q2FsbEVuZExvZy5iaW5kKHRoaXMpLFxuICAgICAgb25JTVN0YXRlQ2hhbmdlOiB0aGlzLl9vbklNU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZSA9IG5ldyBBYm5vcm1hbENhbGwoX3J1bnRpbWUsIF9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q2FsbChvcHRzOiBJU3RhcnRDYWxsT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc3VsdH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsVHlwZSwgbWVkaWFUeXBlLCB0b1VzZXJzLCB0YXJnZXRJZCwgdGFyZ2V0VHlwZSwgb2xkUm9vbUlkLFxuICAgIH0gPSBvcHRzO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN0YXJ0Q2FsbCh7XG4gICAgICBjbGllbnRDYWxsSWQ6IG9wdHMuY2FsbElkLFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB0b1VzZXJzLFxuICAgICAgc2VjcmV0Q2hhdDogU2VjcmV0Q2FsbFR5cGUuTk9STUFMLFxuICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgb2xkUm9vbUlkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNhbGxJZCwgYnVzeWxpbmVVc2VycyB9ID0gZGF0YSE7XG5cbiAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBjYWxsSWQpO1xuXG4gICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICBjYWxsSWQsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLklOVklURUQsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGN1cnJlbnRVc2VySWQsXG4gICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgW10sXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgKTtcblxuICAgIC8vIOWNleWRvOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqCwg576k5ZG85peg6LaF5pe26YC76L6RXG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIGNvbnN0IGludml0ZXJUaW1lcklkID0gdGhpcy5fc3RhcnRUaW1lcihkYXRhIS5jYWxsSWQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUiwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVUaW1lcklkKENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVSLCBpbnZpdGVyVGltZXJJZCk7XG4gICAgfVxuXG4gICAgLy8g6YCa55+l5bex5pa55Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgY29uc3Qgc2VsZlN0YXRlID0ge1xuICAgICAgdXNlcklkOiBjdXJyZW50VXNlcklkLFxuICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQUxMSU5HLFxuICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uQ0FMTElORyxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICB9O1xuICAgIGxldCBpbnZpdGVlc1N0YXRlID0gdG9Vc2Vycy5tYXAoKHsgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9KSA9PiAoe1xuICAgICAgdXNlcklkLFxuICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVELFxuICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICB9KSk7XG5cbiAgICBsZXQgYnVzeVVzZXJzU3RhdGU6IElTZXNzaW9uVXNlcltdID0gW107XG4gICAgaWYgKGJ1c3lsaW5lVXNlcnMpIHtcbiAgICAgIGJ1c3lVc2Vyc1N0YXRlID0gYnVzeWxpbmVVc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9ID0gaW52aXRlZXNTdGF0ZS5maW5kKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCA9PT0gaXRlbS51c2VySWQpITtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogaXRlbS5zZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICAvLyDooqvpgoDor7fogIXkuK3pnIDov4fmu6Tlh7rlv5nnooznlKjmiLdcbiAgICAgIGludml0ZWVzU3RhdGUgPSBpbnZpdGVlc1N0YXRlLmZpbHRlcigoeyB1c2VySWQgfSkgPT4gYnVzeVVzZXJzU3RhdGUhLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFtzZWxmU3RhdGUsIC4uLmludml0ZWVzU3RhdGUsIC4uLmJ1c3lVc2Vyc1N0YXRlIV0sIHRyYWNlSWQpO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGNvZGUsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3pgoDor7dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZpdGUob3B0czogSUludml0ZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElJbnZpdGVSZXN9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOmCgOivt1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyB0b1VzZXJzIH0gPSBvcHRzO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuaW52aXRlQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICB0b1VzZXJzLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICBpZiAodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICAgIC8vIOWNleWRvOS4remCgOivt+aIkOWKn++8jOWNs+abtOaWsCBjYWxsIHNlc3Npb24g6YCa6K+d57G75Z6L5Li6576k5ZG8XG4gICAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZUNhbGxUeXBlKFJDQ2FsbFBsdXNUeXBlLk1VTFRJKTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGxUeXBlIOWPmOabtOS4uue+pOWRvFxuICAgICAgICB0aGlzLl9vbkNhbGxUeXBlQ2hhbmdlKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLCBSQ0NhbGxQbHVzVHlwZS5NVUxUSSwgdHJhY2VJZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOmAmuefpeiiq+mCgOivt+S6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgbGV0IGludml0ZWRVc2Vyc1N0YXRlID0gdG9Vc2Vycy5tYXAoKHsgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9KSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBsZXQgYnVzeWxpbmVVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgICAgaWYgKGRhdGEhLmJ1c3lsaW5lVXNlcnMpIHtcbiAgICAgICAgYnVzeWxpbmVVc2Vyc1N0YXRlID0gZGF0YSEuYnVzeWxpbmVVc2Vycz8ubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9ID0gaW52aXRlZFVzZXJzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVzZXJJZDogaXRlbS51c2VySWQsXG4gICAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGludml0ZWRVc2Vyc1N0YXRlID0gaW52aXRlZFVzZXJzU3RhdGUuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiBidXN5bGluZVVzZXJzU3RhdGUhLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgWy4uLmludml0ZWRVc2Vyc1N0YXRlLCAuLi5idXN5bGluZVVzZXJzU3RhdGVdLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSwgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGJlZm9yZUhhbmd1cFxuICAgKi9cbiAgcHVibGljIGNsZWFyQWxsVGltZXIoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOa4hemZpOaJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5mb3JFYWNoKChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgICAgc2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICog6YCa6K+d6K+35rGC5Y+W5raI44CB6YCa6K+d5ouS57udXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZ3VwKG9wdHM6IElIYW5ndXBGb3JCdXN5T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuaGFuZ3VwQ2FsbCh7XG4gICAgICBjYWxsSWQ6IG9wdHMuY2FsbElkLFxuICAgICAgc3lzU3RhdHVzOiBvcHRzLnN5c3RlbVN0YXRlLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeaUtumCgOivt1xuICAgKiDpgJror53kuK3lj4jmlLbliLDmlrDmnaXnlLXlkI7vvIzmjqXlkKzmlrDmnaXnlLXml7bvvIzlv4XpobvlhYjmjILmlq3kuYvliY3nmoTpgJror53vvIhtYWluU2Vzc2lvbu+8iVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjY2VwdChvcHRzOiBJQWNjZXB0T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIC8vIOS4jeWtmOWcqCBzZXNzaW9uIOS4jeWFgeiuuOaOpeWQrFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmFjY2VwdENhbGwoeyBjYWxsSWQ6IG9wdHMuY2FsbElkIH0sIHRyYWNlSWQpO1xuXG4gICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9jbGVhck1vYmlsZU9uUGhvbmUob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeWKoOWFpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW5DYWxsKG9wdHM6IElKb2luQ2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlhYjmlLbliLAgb25JbnZpdGXvvIzmsqHmnInmjqXpgJrov4cgam9pbkNhbGwg5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fbWFpblNlc3Npb24gJiYgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5qb2luQ2FsbCh7IGNhbGxJZDogb3B0cy5jYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBvcHRzLmNhbGxJZCk7XG5cbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDlpoLmnpzkuI3lrZjlnKggbWFpblNlc3Npb24g5LuOIHNlcnZlciDojrflj5blvZPliY3liqDlhaXnmoQgc2Vzc2lvblxuICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlU2Vzc2lvbkJ5U2VydmVyKG9wdHMuY2FsbElkLCB0cnVlLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T5Y+Y5pu06K+35rGCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdENoYW5nZU1lZGlhVHlwZShvcHRzOiBJUmVxQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJlcUNoYW5nZU1lZGlhVHlwZVJlc30+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRyYUtleVZhbCA9IHtcbiAgICAgIG1lZGlhVHlwZTogb3B0cy5tZWRpYVR5cGUsXG4gICAgfTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVSZXFNZWRpYVR5cGUob3B0cy5tZWRpYVR5cGUpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSBnZXRVVUlEMjIoKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICB0b1VzZXJJZHM6IG9wdHMudG9Vc2VySWRzLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogRGlhbG9nQWN0aW9uLlJFUVVFU1QsXG4gICAgICBleHRyYUtleVZhbCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIGRhdGE6IHsgdHJhbnNhY3Rpb25JZCB9IH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T57G75Z6L5Y+Y5pu06K+35rGC5ZON5bqUXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUob3B0czogSVJlc0NoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFNZWRpYVR5cGUgPSB0aGlzLl9tYWluU2Vzc2lvbi5nZXRSZXFNZWRpYVR5cGUoKTtcbiAgICBpZiAob3B0cy5hZ3JlZSkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlTWVkaWFUeXBlKHJlcU1lZGlhVHlwZSEpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlUmVxTWVkaWFUeXBlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBvcHRzLnRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogb3B0cy5hZ3JlZSA/IERpYWxvZ0FjdGlvbi5BQ0NFUFQgOiBEaWFsb2dBY3Rpb24uUkVGVVNFLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOmAmuivneWqkuS9k+exu+Wei+WIh+aNouivt+axglxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbmNlbENoYW5nZU1lZGlhVHlwZShvcHRzOiBJQ2FuY2VsQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjosIPnlKhcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQ6IG9wdHMudHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICBkaWFsb2dUeXBlOiBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFLFxuICAgICAgYWN0aW9uOiBEaWFsb2dBY3Rpb24uQ0FOQ0VMLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIGxvZyDliJfooahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsTG9nTGlzdChvcHRzOiBJR2V0Q2FsbExvZ0xpc3RPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXN9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuc3luY0NhbGxMb2coe1xuICAgICAgdXNlcklkOiBjdXJyZW50VXNlcklkLFxuICAgICAgc3luY1RpbWU6IG9wdHMudGltZXN0YW1wLFxuICAgICAgY291bnQ6IG9wdHMuY291bnQsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgY29uc3QgY2FsbExvZzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gPSBkYXRhIS5jYWxsTG9nTGlzdC5tYXAoKGl0ZW0pID0+IHRyYW4yQ2FsbExvZyhpdGVtKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaGFzTW9yZTogQm9vbGVhbihkYXRhPy5oYXNNb3JlKSxcbiAgICAgICAgbWF4VGltZTogZGF0YSEubWF4VGltZSxcbiAgICAgICAgbGlzdDogY2FsbExvZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTpgJror53ml6Xlv5dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWxsTG9nKGNhbGxJZHM6IHN0cmluZ1tdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kZWxldGVDYWxsUmVjb3JkKGN1cnJlbnRVc2VySWQsIGNhbGxJZHMsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIHNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IG51bWJlcn0+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUsIGRhdGE6IGRhdGEhLnN5bmNUaW1lIH07XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFRpbWVJbmZvUmVzfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5pyq57uT5p2f55qE6YCa6K+d5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3BlbkNhbGxMaXN0KHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGE6IHJlc0RhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRVc2VyQ2FsbFN0YXRlTGlzdCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3QgPSByZXNEYXRhIS5jYWxsU3RhdGVMaXN0Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjYWxsSWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxpbmdVc2VySWQsIGNhbGxVc2VySWRzLCBjYWxsU3RhdHVzLCBjcnRUaW1lLCB1c2VyU2Vzc2lvblN0YXR1cywgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXJ0VGltZSwgc3luY1RpbWUsXG4gICAgICB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGNhbGxEaXJlY3Rpb24gPSAoY2FsbGluZ1VzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkgPyBSQ0NhbGxEaXJlY3Rpb24uT1VUIDogUkNDYWxsRGlyZWN0aW9uLklOO1xuICAgICAgY29uc3QgeyBjbGllbnRTdGFydFRpbWUgPSBzdGFydFRpbWUgfSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBjYWxsRGlyZWN0aW9uLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFVzZXJJZHMsXG4gICAgICAgIHNlc3Npb25TdGF0ZTogY2FsbFN0YXR1cyxcbiAgICAgICAgdXNlclN0YXRlOiB1c2VyU2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZXN0YW1wOiAwLFxuICAgICAgICBkdXJhdGlvbjogTWF0aC5mbG9vcigoK25ldyBEYXRlKCkgLSBjbGllbnRTdGFydFRpbWUpIC8gMTAwMCksXG4gICAgICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogMCxcbiAgICAgICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlLFxuICAgICAgZGF0YTogbGlzdCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+eahCBjYWxsIGxvZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbW92ZUFsbENhbGxMb2codHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5jbGVhckNhbGxSZWNvcmQodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/hyBjYWxsSWQg6I635Y+WIHNlc3Npb24g6K+m57uG5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxTZXNzaW9uUmVzfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxTZXNzaW9uKG9wdHMsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsaW5nVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU3RhdHVzLCBjYWxsU2Vzc2lvblVzZXJzLCBzdGFydFRpbWUsIGR1cmF0aW9uLCBzeW5jVGltZSxcbiAgICB9ID0gZGF0YSE7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJzID0gY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzdGFydENhbGxlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb25Vc2VycyxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgc3luY1RpbWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0SG9sZFNlc3Npb24oY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgcmV0dXJuIGlubmVyU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihpbm5lclNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeS4uyBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxNYWluU2Vzc2lvbigpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYWluU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbih0aGlzLl9tYWluU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5Li7IHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTWFpblNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiusOW9leaYr+WQpuaYr+acrOerr+aMguaWrVxuICAgKi9cbiAgcHVibGljIHNldElzTG9jYWxDbGllbnRIYW5ndXAoaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbikge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXApO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuefpeS6uuWRmOeKtuaAgVxuICAgKiBDYWxsQ2xpZW50IOS5n+mcgOimgeabtOaWsOS6uuWRmOeKtuaAge+8jOWumuS5ieS4uuWFrOWFseWHveaVsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQREFURV9VU0VSU19TVEFURV9PLCBgdXBkYXRlVXNlcnNTdGF0ZSAtPiB1c2VyczogJHtKU09OLnN0cmluZ2lmeSh1c2Vycyl9YCwgdHJhY2VJZCk7XG5cbiAgICAvLyDmm7TmlrAgc2Vzc2lvbiDkurrlkZjliJfooahcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuXG4gICAgY29uc3QgY2hhbmdlZFVzZXJzID0gW107XG4gICAgaWYgKHNlc3Npb24pIHtcbiAgICAgIGNvbnN0IG5ld1VzZXJzID0gdXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFVzZXJTdGF0ZSA9IHNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IHVzZXJJZCA9PT0gaXRlbS51c2VySWQpWzBdIHx8IHt9O1xuICAgICAgICBjb25zdCBpc0lkbGUgPSBpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcbiAgICAgICAgY29uc3QgeyBjYW1lcmFFbmFibGUgPSBmYWxzZSwgbWljcm9waG9uZUVuYWJsZSA9IGZhbHNlIH0gPSBpc0lkbGUgPyB7IGNhbWVyYUVuYWJsZTogZmFsc2UsIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlIH0gOiBvbGRVc2VyU3RhdGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBjYW1lcmFFbmFibGUsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi5zZXNzaW9uLnVwZGF0ZVVzZXJMaXN0KG5ld1VzZXJzLCB0cmFjZUlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKC4uLnVzZXJzKTtcbiAgICB9XG4gICAgLy8g6YCa55+l5LqL5Lu2XG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkLCBjaGFuZ2VkVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIHNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIG1lZGlhVHlwZSwgZW5hYmxlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU3RhcmluZ1RpbWUob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldENhbGxDbGllbnRUaW1lQnlTZXJ2ZXIob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS6uuWRmOezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5c3RlbVN0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5zeXNTdGF0dXNVcChvcHRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlkbzkuK3mlLbliLDov5znq6/mtYHlkI7vvIznu5kgQ2FsbFNlcnZlciDkuIrmiqXvvIznlKjkuo7lpITnkIborqHml7bpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cEZpcnN0RnJhbWVUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBub05lZWRVcENvbmRpdGlvbiA9ICF0aGlzLl9tYWluU2Vzc2lvblxuICAgICAgfHwgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgIT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSlcbiAgICAgIHx8IHRoaXMuX2lzVXBGaXJzdEZyYW1lVGltZTtcbiAgICBpZiAobm9OZWVkVXBDb25kaXRpb24pIHtcbiAgICAgIC8vIOS4jeWtmCBtYWluU2Vzc2lvbiDmiJYg6YCa6L+H57G75Z6L5LiN5Li65Y2V5ZG85pe277yM5LiN5LiK5oql77yM55u05o6l6L+U5Zue5oiQ5YqfXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVsYXlUaW1lID0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRMb2NhbERlbGF5VGltZSgpO1xuICAgIGNvbnN0IHN0cmVhbVJlYWR5VGltZSA9IE1hdGguZmxvb3Iobm93ICsgZGVsYXlUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9ULCBgbm93OiAke25vd307IGRlbGF5OiAke2RlbGF5VGltZX07IHN0cmVhbVJlYWR5VGltZTogJHtzdHJlYW1SZWFkeVRpbWV9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSB0cnVlO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmV2ZW50VXBDYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV2ZW50VHlwZTogQ2FsbFNlcnZlckV2ZW50VHlwZS5GSVJTVF9GUkFNRSxcbiAgICAgIGV2ZW50QXJnczogeyBzdHJlYW1SZWFkeVRpbWUgfSxcbiAgICAgIGV2ZW50VGltZTogRGF0ZS5ub3coKSxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1IsIGBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGC5qih5oufIHN0YXR1c0Rvd25DYWxsLCDnu5PmnZ8gc2Vzc2lvblxuICAgKiDpgJror53lu7rnq4vlkI7vvIzlj6rog73nu5PmnZ8gbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBlbmRDdXJyZW50U2Vzc2lvbihjdXJyZW50VXNlclN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIGNvbnN0IHNlc3Npb25Vc2VyczogSUNhbGxTZXNzaW9uVXNlcltdID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgc3lzdGVtU3RhdGUsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgICB9ID0gaXRlbTtcbiAgICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIHN5c3RlbVN0YXRlID0gY3VycmVudFVzZXJTeXN0ZW1TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5FTkRFRCxcbiAgICAgICAgICBzdGF0dXNUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiB0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0U3RhcnRDYWxsZXJJZCgpLFxuICAgICAgICAgIHN5c1N0YXR1czogc3lzdGVtU3RhdGUsXG4gICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YTogSVN0YXR1c0Rvd25Db250ID0ge1xuICAgICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgICB0b0RldmljZUlkOiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgIGNhbGxTdGF0dXM6IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQsXG4gICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uVXNlcnMsXG4gICAgICB9O1xuICAgICAgdGhpcy5fb25TdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkuIrlsYIgUlRDIOWKoOWFpeaIv+mXtOWQjumHjeaWsOW8gOWni+agoeaXtlxuICAgKi9cbiAgcHVibGljIHN0YXJ0VGltZUNvcnJlY3Rpb24odHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5yZXN0YXJ0KHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGdldERlbGF5VGltZUluZm8oKTogSUdldERlbGF5VGltZUluZm9SZXMge1xuICAgIHJldHVybiB7XG4gICAgICBkZWxheVRpbWU6IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKSxcbiAgICAgIHJ0dDogdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRSVFQoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGhvbGRTZXNzaW9uIOWNh+e6p+S4uiBtYWluU2Vzc2lvblxuICAgKi9cbiAgcHVibGljIHVwZ3JhZGVNYWluU2Vzc2lvbihob2xkQ2FsbElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kSW5kZXgoKHNlc3Npb24pID0+IHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGhvbGRDYWxsSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uID0gdGhpcy5faG9sZFNlc3Npb25zLnNwbGljZShpbmRleCwgMSk/LlswXTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogSU0g54q25oCB5Y+Y5pu05aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbklNU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIGxldCB0aW1lcklkOiBudW1iZXIgPSAwO1xuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgICAvLyDmlq3nvZHnrYnlvoUgNjBzIOWQjuinpuWPkSBvblNlc3Npb25DbG9zZVxuICAgICAgICB0aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfSU1fU1RBVEVfQ0hBTkdFX08sICdlbmRDdXJyZW50U2Vzc2lvbiwgSU0gZGlzY29ubmVjdGVkIGZvciBtb3JlIHRoYW4gNjBzJywgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5lbmRDdXJyZW50U2Vzc2lvbihSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLCB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkhLCB0cmFjZUlkKTtcbiAgICAgICAgfSwgQ0FMTF9USU1FX09VVCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuWPkei1t+mCgOivt+OAgeaUtuWIsOmCgOivt+WQjuiuoeaXtui2heaXtlxuICAgKiDmj5DliY3mqKHmi58gX29uU3RhdHVzRG93biwg5LiN5YaN5L6d6LWWIENhbGxTZXJ2ZXIg5LiL5Y+R55qEIF9vblN0YXR1c0Rvd25cbiAgICog5aSE55CG572R57uc5byC5bi45oOF5Ya15LiL5LiK5oqlIENhbGxTZXJ2ZXIg5aSx6LSl77yMQ2FsbFNlcnZlciDkuI3kvJrkuIvlj5EgX29uU3RhdHVzRG93biDmg4XlhrVcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNhbGxUaW1lb3V0KGNhbGxJZDogc3RyaW5nLCB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBjYWxsIHRpbWVvdXQgY2FsbElkOiAke2NhbGxJZH0sIHVzZXJTdGF0ZTogJHt1c2VyU3RhdGV9YCwgdHJhY2VJZCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBoYW5kbGVDYWxsVGltZW91dCB3aXRob3V0IHNlc3Npb24sIGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICB0aGlzLl9vblN0YXR1c0Rvd24oe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgY2FsbFN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZS5FTkRFRCxcbiAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdGVUaW1lLFxuICAgICAgICB9ID0gdXNlcjtcblxuICAgICAgICBsZXQgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uO1xuICAgICAgICBsZXQgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGU7XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXNTdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNSZWFzb24uTUlTU0VEIDogUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVI7XG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEIDogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN5c1N0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzUmVhc29uLk1JU1NFRDtcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RpbWU6IHN0YXRlVGltZSA/IHN0YXRlVGltZSArIDEgOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiBzZXNzaW9uLmdldENhbGxlcklkKCksXG4gICAgICAgICAgc3lzU3RhdHVzLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/otoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0YXJ0VGltZXIoY2FsbElkOiBzdHJpbmcsIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIHRyYWNlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8g5ZCv5Yqo5ZG85Y+r6LaF5pe26K6h5pe25ZmoXG4gICAgY29uc3QgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVDYWxsVGltZW91dChjYWxsSWQsIHVzZXJTdGF0ZSwgdHJhY2VJZCk7XG4gICAgICAvLyDkuIrmiqUgY2FsbCBzZXJ2ZXIg6LaF5pe2XG4gICAgICB0aGlzLl9zaWduYWxNb2R1bGUuc3RhdHVzVXBDYWxsKHsgY2FsbElkLCBzZXNzaW9uU3RhdHVzOiB1c2VyU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfSwgQ0FMTF9USU1FX09VVCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RBUlRfQ0FMTF9USU1FUl9PLCBgY2FsbElkOiAke2NhbGxJZH0sIHRpbWVySWQ6ICR7dGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlgZzmraLotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0b3BUaW1lcih0aW1lcklkOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RPUF9DQUxMX1RJTUVSX08sIGB0aW1lcklkOiAke3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOmAmuivnemCgOivt1xuICAgKi9cbiAgcHJpdmF0ZSBfb25JbnZpdGUoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBpbnZpdGVVc2VySWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxTZXNzaW9uVXNlcnMsIHNlY3JldENoYXQsIGNhbGxpbmdVc2VySWQsXG4gICAgfSA9IGRhdGE7XG5cbiAgICBpZiAoc2VjcmV0Q2hhdCA9PT0gU2VjcmV0Q2FsbFR5cGUuU0VDUkVUKSB7XG4gICAgICAvLyDlpoLmnpzmmK/lr4bogYrpgJror53kuI3lpITnkIZcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwge1xuICAgICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIHJlYXNvbjogUHViSW52aXRlQ2FsbE1pc3NSZWFzb24uU0VDUkVUX0NBTEwsXG4gICAgICAgIHJlZmVyOiBpc0RpcmVjdGx5ID8gUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUJfSU5WSVRFIDogUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUxMX0tWX0lOVklURSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzoh6rlt7HmmK/ooqvpgoDor7fnmoTnlKjmiLdcbiAgICBjb25zdCBpc0ludml0ZWUgPSBjYWxsU2Vzc2lvblVzZXJzLnNvbWUoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoaXNJbnZpdGVlKSB7XG4gICAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgICAgdGhpcy5fYWJub3JtYWxNb2R1bGUuYWRkQWJub3JtYWxsQ2FsbElkKGN1cnJlbnRVc2VySWQsIGNhbGxJZCk7XG5cbiAgICAgIC8vIOeUn+aIkCBjYWxsU2Vzc2lvblxuICAgICAgY29uc3QgaW5uZXJTZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLlJJTkdJTkcsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgICAgaW52aXRlVXNlcklkLFxuICAgICAgICBbXSxcbiAgICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgKTtcbiAgICAgIC8vIGNhbGwgc2VydmVyIOWTjemTg+S4iuaKpVxuICAgICAgdGhpcy5fc2lnbmFsTW9kdWxlLnJpbmdpbmdDYWxsKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvKipcbiAgICAgICAqIOWQr+WKqOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgICovXG4gICAgICBjb25zdCBpbnZpdGVlVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsIHRyYWNlSWQpO1xuICAgICAgaW5uZXJTZXNzaW9uLnVwZGF0ZVRpbWVySWQoQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURUUsIGludml0ZWVUaW1lcklkKTtcblxuICAgICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IGlubmVyU2Vzc2lvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOeUn+aIkOWJryBzZXNzaW9uc1xuICAgICAgICB0aGlzLl9ob2xkU2Vzc2lvbnMucHVzaChpbm5lclNlc3Npb24pO1xuICAgICAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIHkuLogSE9MRFxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlUKTtcbiAgICAgIH1cblxuICAgICAgLy8g5oqb5Ye65bex5pa56KKr6YKA6K+3XG4gICAgICBjb25zdCBjYWxsUGx1c1Nlc3Npb24gPSBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGwoY2FsbFBsdXNTZXNzaW9uLCB0cmFjZUlkKTtcblxuICAgICAgY29uc3QgaW52aXRlU291cmNlID0gaXNEaXJlY3RseSA/IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UuUFVCX0lOVklURV9DQUxMIDogUkNDYWxsUGx1c0ludml0ZVNvdXJjZS5QVUxMX0tWX0lOVklURV9DQUxMO1xuICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0lOVklURV9fLCBjYWxsUGx1c1Nlc3Npb24sIGludml0ZVNvdXJjZSk7XG5cbiAgICAgIGNvbnN0IG90aGVyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IGNhbGxTZXNzaW9uVXNlcnMubWFwKCh7XG4gICAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdHVzVGltZSxcbiAgICAgIH0pID0+ICh7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgc3RhdGVUaW1lOiBzdGF0dXNUaW1lLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIC8vIOaKm+WHuuS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgb3RoZXJzU3RhdGUsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLk5PVF9JTlZJVEVFLFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8g6L+H5ruk5Ye65YW25LuW55So5oi35ZKM6Ieq5bexXG4gICAgY29uc3Qgb3RoZXJJbnZpdGVkTWVtYmVyID0gY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udXNlcklkICE9PSBjdXJyZW50VXNlcklkICYmIGl0ZW0udXNlcklkICE9PSBpbnZpdGVVc2VySWQgJiYgaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEKTtcbiAgICAvLyDmipvlh7rnvqTogYrkuK3ooqvpgoDor7fnmoTlhbbku5bkurpcbiAgICBpZiAob3RoZXJJbnZpdGVkTWVtYmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIOmAmuefpSBjYWxsVHlwZSDnsbvlnovlj5jmm7RcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICAgIHRoaXMuX29uQ2FsbFR5cGVDaGFuZ2UodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksIFJDQ2FsbFBsdXNUeXBlLk1VTFRJLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZUNhbGxUeXBlKFJDQ2FsbFBsdXNUeXBlLk1VTFRJKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW52aXRlZE1lbWJlcjogSU90aGVyTWVtSW5mb1tdID0gW107XG4gICAgICBjb25zdCB1c2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgICAgb3RoZXJJbnZpdGVkTWVtYmVyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cyB9ID0gaXRlbTtcbiAgICAgICAgaW52aXRlZE1lbWJlci5wdXNoKHsgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyB9KTtcbiAgICAgICAgdXNlcnNTdGF0ZS5wdXNoKHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29uT3RoZXJNZW1iZXJJbnZpdGUoaW52aXRlZE1lbWJlcik7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCB1c2Vyc1N0YXRlLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOaMguaWre+8iOWvueaWuemAmuivneWPlua2iOOAgemAmuivneaLkue7ne+8iVxuICAgKi9cbiAgcHJpdmF0ZSBfb25IYW5ndXAoZGF0YTogSUhhbmd1cEluZm9bXSwgY2FsbFNlc3Npb25hU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpKSB7XG4gICAgICAgICAgaWYgKGl0ZW0udXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQpIHtcbiAgICAgICAgICAgIC8vIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g5ouS5o6l44CB5b+Z56KM44CB5pyq5o6l5ZCsIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVyVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAg5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9vbkFjY2VwdChkYXRhOiBJQWNjZXB0SW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0U2Vzc2lvblN0YXRlKCk7XG4gICAgY29uc3QgdW5OZWVkVXBTdGF0ZSA9IFtcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlULFxuICAgIF07XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEVcbiAgICAgICYmIHNlc3Npb25TdGF0ZSAmJiB1bk5lZWRVcFN0YXRlLmluY2x1ZGVzKHNlc3Npb25TdGF0ZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydENhbGxlcklkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8qKlxuICAgICAqIOWNleWRvOaUtuWIsOWvueaWueaOpeWQrOaXtu+8jOmcgOWujOaIkOWPkeW4g+i1hOa6kOS4gOezu+WIl+WKqOS9nFxuICAgICAqL1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHN0YXJ0Q2FsbGVySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIGNvbnN0IGFjY2VwdFVzZXJJbmZvID0gZGF0YS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZnJvbVVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCk7XG4gICAgICBhY2NlcHRVc2VySW5mbyAmJiB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DT05ORUNUX18sIHRoaXMuZ2V0TG9jYWxNYWluU2Vzc2lvbigpIS5nZXRDYWxsSWQoKSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIC8vIOabtOaWsOS4uyBzZXNzaW9uIOeKtuaAgVxuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HKTtcblxuICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlclRpbWVySWQoKSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw54q25oCB5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9vblN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiDpgJror53nirbmgIHkuLrov57mjqXnirbmgIHml7bvvIzkv53lrZjmnI3liqHkuIvlj5HnmoTpgJror53lvIDlp4vml7bpl7RcbiAgICAgKi9cbiAgICBjb25zdCB7XG4gICAgICBjYWxsU3RhdHVzLCBzdGFydFRpbWUsIHN5bmNUaW1lLCBjYWxsSWQsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGNhbGxJZCAhPT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gPSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXSB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpemAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqIOadoeS7tu+8mumAmuivneeKtuaAgeS4uiBPTkNBTEwg5LiU5pyq5LiK5oql6L+H6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXS5pc1JlY2VpdmVDYWxsU3RhcnRUaW1lXG4gICAgICAmJiBjYWxsU3RhdHVzID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZSA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSB9ID0gYXdhaXQgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgc3RhcnRUaW1lISwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgY2FsbFN0YXJ0VGltZTogY2xpZW50U3RhcnRUaW1lISxcbiAgICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6K6h566X5piv5ZCm6YCa6K+d57uT5p2fXG4gICAgbGV0IHNlbGZFbmQgPSBmYWxzZTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOS4iuaKpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IGNoYW5nZWRVc2VycyA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGlzTGVmdCA9IFtcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRSxcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuREVDTElORUQsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCxcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSLFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQsXG4gICAgICBdLmluY2x1ZGVzKGl0ZW0uc2Vzc2lvblN0YXR1cyk7XG4gICAgICBpZiAoaXNMZWZ0ICYmIGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHNlbGZFbmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IGl0ZW0uc3lzU3RhdHVzLFxuICAgICAgICBzdGF0ZVRpbWU6IGl0ZW0uc3RhdHVzVGltZSxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOayoeaciSBzZXNzaW9uIOS4jeWkhOeQhuS8muivneeKtuaAgeWPmOabtFxuICAgICAqL1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24gJiYgIXRoaXMuX2hvbGRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDorqHnrpflh7rlk43lupTliqjkvZzvvIzlubbmipvlh7rkv6Hmga9cbiAgICBjb25zdCB7XG4gICAgICBoYW5ndXBEYXRhLCBhY2NlcHREYXRhLCBvdGhlckludml0ZWREYXRhLFxuICAgIH0gPSBwYXJzZVN0YXR1c0RhdGEoZGF0YSk7XG5cbiAgICBoYW5ndXBEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25IYW5ndXAoaGFuZ3VwRGF0YSwgZGF0YS5jYWxsU3RhdHVzLCB0cmFjZUlkKTtcbiAgICBhY2NlcHREYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25BY2NlcHQoYWNjZXB0RGF0YSwgdHJhY2VJZCk7XG5cbiAgICBpZiAob3RoZXJJbnZpdGVkRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fb25PdGhlck1lbWJlckludml0ZShvdGhlckludml0ZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyDlj6rmnInlnKggY2FsbFNlc3Npb24g54q25oCB5Li6IEVuZGVkIOaXtumAmuefpSBvblNlc3Npb25DbG9zZVxuICAgIGlmIChkYXRhLmNhbGxTdGF0dXMgPT09IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQgfHwgc2VsZkVuZCkge1xuICAgICAgdGhpcy5zZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOWFtuS7luerr+eahOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNhbGxJZCwgY2FsbFNlc3Npb25Vc2VycywgY2FsbFN0YXR1cyB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGNhbGxTZXNzaW9uVXNlcnMuZmluZCgoeyB1c2VySWQgfSkgPT4gdXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcblxuICAgIGlmIChjdXJyZW50VXNlciAmJiAodGhpcy5fbWFpblNlc3Npb24gfHwgdGhpcy5faG9sZFNlc3Npb25zLmxlbmd0aCkpIHtcbiAgICAgIC8vIOaYr+W3seerr+eKtuaAgeWPmOabtOS4lOWtmOWcqCBzZXNzaW9uIOWGjeWOu+mAmuefpeS6uuWRmOeKtuaAgeWPmOabtOWbnuiwg++8jOS4jeWtmOWcqCBzZXNzaW9uIOS4jemcgOimgemAmuefpVxuICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN0YXR1c1RpbWUgfSA9IGN1cnJlbnRVc2VyO1xuICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElOR107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWmguaenOiHquW3seacquaOpeWQrOS4u+mAmuivne+8jOaUtuWIsOWkmuerryBDb25uZWN0aW5nIOeKtuaAge+8jOmcgOaKm+WHuiBzZXNzaW9uQ2xvc2VcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGlzTWFpblNlc3Npb24gPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZDtcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXJTYXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFVzZXJMaXN0KCkuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpPy51c2VyU3RhdGU7XG4gICAgICAgIGNvbnN0IGlzQWNjZXB0TWFpblNlc3Npb24gPSBpc01haW5TZXNzaW9uICYmIGN1cnJlbnRVc2VyU2F0ZSAmJiBzdGF0ZXMuaW5jbHVkZXMoY3VycmVudFVzZXJTYXRlKTtcbiAgICAgICAgaWYgKCFpc0FjY2VwdE1haW5TZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgW3tcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9BQ0NFUFQsXG4gICAgICAgICAgICBzdGF0ZVRpbWU6IHN0YXR1c1RpbWUsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfV0sIHRyYWNlSWQpO1xuXG4gICAgICAgICAgdGhpcy5zZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOS6i+S7tuS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25FdmVudERvd24oZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgZXZlbnRUaW1lLCBldmVudEFyZ3MsIGV2ZW50VHlwZSwgZnJvbVVzZXJJZCxcbiAgICB9ID0gZGF0YTtcbiAgICBpZiAoZXZlbnRUeXBlID09PSBDYWxsU2VydmVyRXZlbnRUeXBlLkNBTExfRFVSQVRJT04gJiYgY2FsbElkID09PSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIGNvbnN0IHsgZmlyc3RGcmFtZVRpbWUgfSA9IGV2ZW50QXJncyBhcyB7IGZpcnN0RnJhbWVUaW1lOiBudW1iZXIgfTtcbiAgICAgIC8vIOiuoeeul+W8gOWni+aXtumXtFxuICAgICAgY29uc3QgeyBjb2RlLCBjbGllbnRTdGFydFRpbWU6IGNsaWVudEZpcnN0RnJhbWVUaW1lIH0gPSBhd2FpdCB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkLCBmaXJzdEZyYW1lVGltZSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08sIGBjbGllbnRGaXJzdEZyYW1lVGltZTogJHtjbGllbnRGaXJzdEZyYW1lVGltZX1gLCB0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzSW5uZXJDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmuefpeWNleWRvCBkdXJhdGlvbiDlj5jmm7RcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdlNpbkNhbGxEdXJhdGlvbihjYWxsSWQ6IHN0cmluZywgY2xpZW50U3RhcnRUaW1lOiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxTdGFydFRpbWUoeyBjYWxsSWQsIC4uLnsgY2FsbFN0YXJ0VGltZTogY2xpZW50U3RhcnRUaW1lIH0gfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lKGNhbGxJZCwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw5aqS5L2T5Y+Y5pu055u45YWz5LqL5Lu2XG4gICAqL1xuICBwcml2YXRlIF9vblN3aXRjaE1lZGlhVHlwZShkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgYWN0aW9uLCBleHRyYUtleVZhbCwgdHJhbnNhY3Rpb25JZCwgcHJvbW90ZXJJZCxcbiAgICB9ID0gZGF0YTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgcmVhc29uIH0gPSBleHRyYUtleVZhbDtcblxuICAgIGNvbnN0IGN1cnJlbnRDYWxsSWQgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGNhbGxJZCAhPT0gY3VycmVudENhbGxJZCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgbm90IGN1cnJlbnQgc2Vzc2lvbiBjYWxsSWQ6ICR7Y3VycmVudENhbGxJZH0sIHJlY3ZDYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRyYW5zYWN0aW9uSWQ6IG9sZFRyYW5zSWQsIGFjdGlvbjogb2xkQWN0aW9uLCBtZWRpYVR5cGU6IE9sZE1lZGlhVHlwZSB9ID0gdGhpcy5fbWFpblNlc3Npb24/LmdldE9sZERpYWxvZ0RhdGEoKSB8fCB7fTtcbiAgICBpZiAob2xkVHJhbnNJZCA9PT0gdHJhbnNhY3Rpb25JZCAmJiBvbGRBY3Rpb24gPT09IGFjdGlvbiAmJiBPbGRNZWRpYVR5cGUgPT09IG1lZGlhVHlwZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCAnZHVwbGljYXRlIGRpYWxvZyBkYXRhJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgYWN0aW9uOiAke2FjdGlvbn0sIHJlYXNvbjogJHtyZWFzb259YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0T2xkRGlhbG9nRGF0YSh7IHRyYW5zYWN0aW9uSWQsIGFjdGlvbiwgbWVkaWFUeXBlIH0pO1xuXG4gICAgLy8g5Y2H57qn5rWB56iL5aSE55CGXG4gICAgaWYgKGFjdGlvbiA9PT0gRGlhbG9nQWN0aW9uLlJFUVVFU1QpIHtcbiAgICAgIHRoaXMuX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZSh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gbnVsbDtcbiAgICAgIHN3aXRjaCAocmVhc29uKSB7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLkNBTkNFTDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LkNBTkNFTF9DSEFOR0VfTUVESUFfVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uQUNDRVBUOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEU7XG4gICAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZU1lZGlhVHlwZSh0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0UmVxTWVkaWFUeXBlKCkhKTtcbiAgICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlUmVxTWVkaWFUeXBlKG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5SRUZVU0U6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5SRUZVU0VfQ0hBTkdFX01FRElBX1RZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLlRJTUVPVVQ6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5DSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0W2NoYW5nZU1lZGlhVHlwZVJlc3VsdCBhcyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0XVxuICAgICAgJiYgdGhpcy5fcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCBhcyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICAvLyDpmY3nuqfpgJrnn6XlpITnkIZcbiAgICBpZiAoYWN0aW9uID09PSBEaWFsb2dBY3Rpb24uTk9USUNFICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyAmJiAhcmVhc29uKSB7XG4gICAgICB0aGlzLl9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb25JZCEsXG4gICAgICAgIHVzZXJJZDogcHJvbW90ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgfSwgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5TRVJWRVJfQUxMT1dfTUVESUFfVFlQRSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIGxvZyDml6Xlv5dcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdkNhbGxFbmRMb2coZGF0YTogSVB1YkNhbGxMb2csIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhbGxMb2cgPSB0cmFuMkNhbGxMb2coZGF0YSk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxSZWNvcmQoY2FsbExvZywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBwdWJsaWMgc2Vzc2lvbkNsb3NlKGRhdGE6IHsgY2FsbElkOiBzdHJpbmcsIHRvRGV2aWNlSWQ6IHN0cmluZ30sIHRyYWNlSWQ6IHN0cmluZywgaXNTZWxmSGFuZ3VwOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBjYWxsSWQgfSA9IGRhdGE7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvLyDmraPluLjnu5PmnZ/vvIzmuIXpmaTmnKzlnLDlrZjlgqjnmoQgY2FsbElkXG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUucmVtb3ZlQWJub3JtYWxDYWxsSWRzKGN1cnJlbnRVc2VySWQsIFtjYWxsSWRdKTtcblxuICAgIGxldCBjbG9zZWRTZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKHNlc3Npb24pID0+IHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICBpZiAoIWNsb3NlZFNlc3Npb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NMT1NFX1NFU1NJT05fTywgYHVuZXhwZWN0IHNlc3Npb24gY2FsbElkIC0+ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NMT1NFX1NFU1NJT05fTywgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvLyBzZXNzaW9uIGNsb3NlIOWQjue7k+adn+aJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIC8vIOe7k+adnyDkuIrmiqXnrKzkuIDluKdcbiAgICAgIGlmIChjbG9zZWRTZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmtL7lj5HpgJror53nu5PmnZ/vvIzlpITnkIbpgJror53nu5PmnZ/lkI4gUlRDIOmAgOaIv+mXtOetiemAu+i+kVxuICAgICAqL1xuICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NMT1NFX18sIGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXpgJror53nu5PmnZ9cbiAgICAgKiDlpJrnq6/lhbbku5bnq6/mjILmlq3pgJror53vvIzpnIDmiormnKznq6/kurrlkZjns7vnu5/nirbmgIHovazljJbkuLogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSEFOR1VQXG4gICAgICovXG4gICAgY29uc3QgY3J0VXNlckRhdGEgPSBjbG9zZWRTZXNzaW9uLmdldFVzZXJMaXN0KCkuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpO1xuICAgIGxldCBoYW5ndXBSZWFzb247XG4gICAgaWYgKGlzU2VsZkhhbmd1cCAmJiBkYXRhLnRvRGV2aWNlSWQgIT09IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRTZXNzaW9uSWQoKSkge1xuICAgICAgaGFuZ3VwUmVhc29uID0gY2xvc2VkU2Vzc2lvbi5nZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKCkgPyBjcnRVc2VyRGF0YSEuc3lzdGVtU3RhdGUgOiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9IQU5HVVA7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsRW5kZWQobmV3IFJDQ2FsbFBsdXNTZXNzaW9uKGNsb3NlZFNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlciksIGhhbmd1cFJlYXNvbiB8fCBjcnRVc2VyRGF0YSEuc3lzdGVtU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcmVtb3ZlU2Vzc2lvbihjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg56e76ZmkIHNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZVNlc3Npb24oY2FsbElkOiBzdHJpbmcpIHtcbiAgICBpZiAoY2FsbElkID09PSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZEluZGV4KChzZXNzaW9uKSA9PiBzZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICAgIHRoaXMuX2hvbGRTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkuI3lrZjlnKggbWFpblNlc3Npb24g5pe277yM5LuO5pyN5Yqh56uv6I635Y+W5pWw5o2u55Sf5oiQIG1haW5TZXNzaW9uLCDlubbpgJrnn6XkurrlkZjnirbmgIHlj5jmm7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZVNlc3Npb25CeVNlcnZlcihjYWxsSWQ6IHN0cmluZywgaXNOZWVkVXA6Ym9vbGVhbiA9IGZhbHNlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5nZXRDYWxsU2Vzc2lvbih7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiwgYGVycmNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IsIGBjb2RlOiAke2NvZGV9LCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFNlc3Npb25Vc2Vycywgc3RhcnRDYWxsZXJJZCxcbiAgICB9ID0gZGF0YSE7XG5cbiAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgIHRoaXMuX21haW5TZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgIGNhbGxJZCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgc3RhcnRDYWxsZXJJZCxcbiAgICAgIHN0YXJ0Q2FsbGVySWQsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICApO1xuICAgIGlmIChpc05lZWRVcCkge1xuICAgICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuICAgIC8vIOS6uuWRmOeKtuaAgeWPmOabtOmAmuefpVxuICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIGNhbGxTZXNzaW9uVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWFvOWuueenu+WKqOerryBvblBob25lIOaXoOazlea2iOmZpOmXrumimFxuICAgKiBBMSDnp7vliqjnq6/lkowgQiDmraPlnKggY2FsbCDkuK3vvIzkuJQgb25QaG9uZSDnirbmgIHvvIwgQTEg5p2A6L+b56iL5ZCO77yMQiDnq6/lsZXnpLrnmoQgb25QaG9uZSDnirbmgIHml6Dms5XmtojlpLFcbiAgICogQTIg5aSa56uv5Zyo5o6l5ZCs5ZKM55u05o6l5Yqg5YWlIGNhbGwg5pe277yM5LiK5oqlIG9uUGhvbmVFbmQg54q25oCB77yM5raI6ZmkIEIg56uv5bGV56S655qEIG9uUGhvbmUg54q25oCBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jbGVhck1vYmlsZU9uUGhvbmUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoaXRlbSkgPT4gaXRlbT8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FX0VORCxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SLCBgY2FsbElkOiAke2NhbGxJZH0sIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDljp8gY2xpZW50IOS4reWumuS5ieeahOS6i+S7tlxuICBwcml2YXRlIF9vblVzZXJTdGF0ZUNoYW5nZShjYWxsSWQ6IHN0cmluZywgdXNlcnM6IElTZXNzaW9uVXNlcltdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgdXNlclN0YXRlLCBzeXN0ZW1TdGF0ZSB9ID0gdXNlcjtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZSxcbiAgICAgICAgcmVhc29uOiBzeXN0ZW1TdGF0ZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog5pS25Yiw6Ieq5bexIHN5c3RlbVN0YXRlIOS4uiA5OTnvvIznm7TmjqXnprvlvIDmiL/pl7RcbiAgICAgKiDlpITnkIbooqvlj6vmjqXlkKznmoTnnqzpl7TvvIzkuLvlj6vlkIzml7bmjILmlq3nmoTmg4XlhrXvvIzkuI3mjonnprvlvIDmiL/pl7TpgJror53kuI3kvJrnu5PmnZ9cbiAgICAgKi9cbiAgICB1c2Vycy5mb3JFYWNoKCh7IHVzZXJJZCwgc3lzdGVtU3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCAmJiBzeXN0ZW1TdGF0ZSA9PT0gUkNDYWxsUGx1c1JlYXNvbi5BQk5PUk1BTF9FTkQpIHtcbiAgICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uT3RoZXJNZW1iZXJJbnZpdGUoaW5mbzogSU90aGVyTWVtSW5mb1tdKSB7XG4gICAgaW5mby5mb3JFYWNoKChpbmZvKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgY2FsbElkIH0gPSBpbmZvO1xuICAgICAgY29uc3QgaW52aXRlclVzZXJJZCA9IHRoaXMuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRJbnZpdGVyVXNlcklkKCk7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZVVzZXJJbnZpdGVkKFt1c2VySWRdLCBpbnZpdGVyVXNlcklkISwgY2FsbElkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZShpbmZvOiBJQ2hhbmdlTWVkaWFUeXBlSW5mbywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSB9ID0gaW5mbztcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KGluZm86IElDaGFuZ2VNZWRpYVR5cGVJbmZvLCBjb2RlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5TRVJWRVJfQUxMT1dfTUVESUFfVFlQRSkge1xuICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX18sIGluZm8ubWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCh7XG4gICAgICAuLi5pbmZvLFxuICAgICAgY29kZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ2FsbFR5cGVDaGFuZ2UoY2FsbElkOiBzdHJpbmcsIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsVHlwZUNoYW5nZWQoY2FsbFR5cGUsIGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFJUQ1Jlc291cmNlVGFnIHtcbiAgLyoqXG4gICAqIOaZrumAmumfs+inhumikea1gVxuICAgKi9cbiAgTk9STUFMID0gJ1JvbmdDbG91ZFJUQycsXG4gIC8qKlxuICAgKiDlsY/luZXliIbkuqvmtYFcbiAgICovXG4gIFNDUkVFTiA9ICdTY3JlZW5TaGFyZSdcbn1cbiIsImltcG9ydCB7XG4gIFBsdWdpbkNvbnRleHQsIElSdW50aW1lLCBSVENNb2RlLCBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBpc0Jvb2xlYW4sXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDUlRDUm9vbSxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ0xvY2FsQXVkaW9UcmFjayxcbiAgSVN1YnNjcmliZUF0dHIsXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ0tpY2tSZWFzb24sXG4gIFJDVHJhY2ssXG4gIFJDTG9jYWxWaWRlb1RyYWNrLFxuICBJUHVibGlzaEF0dHJzLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgaGVscGVyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSUF1ZGlvQ29uZmlnLFxuICBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgSVN0YXR1c1JlcG9ydExpc3RlbmVyLFxuICBJVmlkZW9Db25maWcsXG4gIFJDQ2FsbFBsdXNDb2RlLFxuICBSQ0NhbGxQbHVzRnJhbWVSYXRlLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzUGFja2V0TG9zc1N0YXRzLFxuICBSQ0NhbGxQbHVzUmVzb2x1dGlvbixcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSVENSZXNvdXJjZVRhZyB9IGZyb20gJy4uL2VudW1zL1JUQ1Jlc291cmNlVGFnJztcbmltcG9ydCB7IHJldHJ5QXN5bmNGbiB9IGZyb20gJy4uL3V0aWxzL3JldHJ5JztcbmltcG9ydCB7IENhbGxIb29rc1R5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbEtpY2tFeHRyYSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJUQ01vZHVsZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgSU1lZGlhTXV0ZUNoYW5nZUluZm8sIElNZW1iZXJJbmZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcblxuaW50ZXJmYWNlIElKb2luUlRDUm9vbVJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgcm9vbT86IFJDUlRDUm9vbSB8IHVuZGVmaW5lZDtcbiAgdXNlcklkcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJhY2tzPzogUkNSZW1vdGVUcmFja1tdIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSVN1YlJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgZmFpbGVkTGlzdD86IChJU3Vic2NyaWJlQXR0cilbXSB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElQdWJSZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIGxpdmVVcmw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbn1cblxuaW50ZXJmYWNlIFJDS2lja0V4dHJhIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgUlRDTW9kdWxlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIF9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX186IHN0cmluZyA9ICdpbm5lci1ydGMtcHJvY2Vzcy1mYWlsZWQnXG5cbiAgc3RhdGljIF9fSU5ORVJfUlRDX1BFRVJDT05ORUNUSU9OX0FCTk9STUFMX0NMT1NFX186IHN0cmluZyA9ICdpbm5lci1ydGMtcGVlcmNvbm5lY3Rpb24tYWJub3JtYWwtY2xvc2UnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fU0VMRl9KT0lORURfXzogc3RyaW5nID0gJ2lubmVyLW9uLXNlbGYtam9pbmVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX09USEVSX0pPSU5FRF9fOiBzdHJpbmcgPSAnaW5uZXItb24tb3RoZXItam9pbmVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXzogc3RyaW5nID0gJ2lubmVyLXJlY2VpdmUtZmlyc3QtZnJhbWUnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fS0lDS09GRl9fOiBzdHJpbmcgPSAnaW5uZXIta2lja29mZi1mcmFtZSdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9ERVZJQ0VfRU5BQkxFX0NIQU5HRV9fOiBzdHJpbmcgPSAnaW5uZXItb24tZGV2aWNlLWVuYWJsZS1jaGFuZ2UnXG5cbiAgLyoqXG4gICAqIFJDUlRDIOWunuS+i1xuICAgKi9cbiAgcHVibGljIF9ydGNDbGllbnQ6IFJDUlRDQ2xpZW50XG5cbiAgLyoqXG4gICAqIOW3seaWueeahOmfs+inhumikSB0cmFja3NcbiAgICovXG4gIHByaXZhdGUgX2xvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdXG5cbiAgLyoqXG4gICAqIFJDUlRDUm9vbSDlrp7kvotcbiAgICovXG4gIHB1YmxpYyBfcm9vbTogUkNSVENSb29tIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIF9jYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgcHJpdmF0ZSBfY2FsbE1lZGlhVHlwZSE6IFJDQ2FsbFBsdXNNZWRpYVR5cGVcblxuICBwcml2YXRlIF92aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnID0ge1xuICAgIHJlc29sdXRpb246IFJDQ2FsbFBsdXNSZXNvbHV0aW9uLlc2NDBfSDQ4MCxcbiAgICBmcmFtZVJhdGU6IFJDQ2FsbFBsdXNGcmFtZVJhdGUuRlBTXzE1LFxuICB9XG5cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZyA9IHt9XG5cbiAgcHJpdmF0ZSBfaXNQdWJUaW55OiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6KeG6aKR6YWN572u5piv5ZCm5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF92aWRlb0NvbmZpZ0lzQ2hhbmdlOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6Z+z6aKR6YWN572u5piv5ZCm5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZ0lzQ2hhbmdlOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog5a2Y5YKo6K6+572u55qE5Lq65ZGY5ZKM6KeG5Zu+XG4gICAqL1xuICBwcml2YXRlIF91c2VyVmlld01hcDogeyBbdXNlcklkOiBzdHJpbmddOiB7IHZpZGVvVmlldzogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55OiBib29sZWFuIH0gfSA9IHt9XG5cbiAgcHJpdmF0ZSBfY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcjogSVN0YXR1c1JlcG9ydExpc3RlbmVyIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIF9yZW1vdGVBdWRpb0VuYWJsZTogYm9vbGVhbiA9IHRydWVcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRPcHRzOiBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9ydGNDbGllbnQgPSBfaW5pdE9wdHM/LnJ0Y0NsaWVudDtcbiAgICB0aGlzLl9pc1B1YlRpbnkgPSBfaW5pdE9wdHMuaXNQdWJUaW55IHx8IGZhbHNlO1xuICB9XG5cbiAgc2V0Q2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcihsaXN0ZW5lcjogSVN0YXR1c1JlcG9ydExpc3RlbmVyKSB7XG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPluaRhOWDj+WktOi1hOa6kFxuICAgKiDlhoXlrZjkuK3mnInml7bvvIzov5Tlm57lhoXlrZjkuK3nmoTop4bovahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2t9PiB7XG4gICAgY29uc3QgZGVmYXVsdFZpZGVvVHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IChkZWZhdWx0VmlkZW9UcmFjayAmJiAhdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSkgPyB7IHRyYWNrOiBkZWZhdWx0VmlkZW9UcmFjaywgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9IDogYXdhaXQgdGhpcy5fY3JlYXRlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICB0aGlzLl92aWRlb0NvbmZpZ0lzQ2hhbmdlID0gZmFsc2U7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFjayxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlum6puWFi+mjjui1hOa6kFxuICAgKiDlhoXlrZjkuK3mnInml7bvvIzov5Tlm57lhoXlrZjkuK3nmoTpn7PovahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IGRlZmF1bHRBdWRpb1RyYWNrID0gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSAoZGVmYXVsdEF1ZGlvVHJhY2sgJiYgIXRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UpID8geyB0cmFjazogZGVmYXVsdEF1ZGlvVHJhY2ssIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfSA6IGF3YWl0IHRoaXMuX2NyZWF0ZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgdGhpcy5fYXVkaW9Db25maWdJc0NoYW5nZSA9IGZhbHNlO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFjayxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNrumAmuivneexu+Wei+WIm+W7uumfs+OAgeinhumikei1hOa6kFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOmfs+mikeaIlumfs+inhumikVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9jYWxsTWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5nZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5nZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaWRlb0NvbmZpZyh2aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnKSB7XG4gICAgdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSA9IHRydWU7XG4gICAgdGhpcy5fdmlkZW9Db25maWcgPSB2aWRlb0NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdWRpb0NvbmZpZyhhdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnKSB7XG4gICAgdGhpcy5fYXVkaW9Db25maWdJc0NoYW5nZSA9IHRydWU7XG4gICAgdGhpcy5fYXVkaW9Db25maWcgPSBhdWRpb0NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0RFU1RST1lfQUxMX1RSQUNLU19PLCAnJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHVibGljIHNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1QsIGBlbmFibGU6ICR7ZW5hYmxlfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCFpc0Jvb2xlYW4oZW5hYmxlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9SLCBgcGFyYW0gZXJyb3IsIGVuYWJsZTogdHlwZSBpcyBib29sZWFuLCB2YWx1ZTogJHtlbmFibGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX3JlbW90ZUF1ZGlvRW5hYmxlID0gZW5hYmxlO1xuXG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgYXVkaW9UcmFja3MgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFja3MoKS5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgYXVkaW9UcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGlmIChlbmFibGUpIHtcbiAgICAgICAgdHJhY2sudW5tdXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFjay5tdXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVzdHJveVRyYWNrKHRyYWNrOiBSQ0xvY2FsVHJhY2spIHtcbiAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9sb2NhbFRyYWNrcy5maW5kSW5kZXgoKGxvY2FsVHJhY2spID0+IGxvY2FsVHJhY2suZ2V0VHJhY2tJZCgpID09PSB0cmFjay5nZXRUcmFja0lkKCkpO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogc2Vzc2lvbiDov57mjqVcbiAgICovXG4gIGFzeW5jIHNlc3Npb25Db25uZWN0ZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAvLyAxLiDliqDmiL/pl7RcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgcm9vbSB9ID0gYXdhaXQgdGhpcy5qb2luUlRDUm9vbShjYWxsSWQsIHRyYWNlSWQpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYGVyckNvZGUgLT4gJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyDms6jlhowgUlRDIOebuOWFs+ebkeWQrFxuICAgICAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgICAgIHRoaXMuX3JlZ1JUQ0xpc3RlbmVycygpO1xuXG4gICAgICAgIHRoaXMuX3Jvb20gPSByb29tITtcbiAgICAgICAgY29uc3Qgcm9vbVVzZXJzSWQgPSB0aGlzLl9yb29tPy5nZXRSZW1vdGVVc2VySWRzKCkgfHwgW107XG4gICAgICAgIGlmIChyb29tVXNlcnNJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fb25PdGhlck1lbUpvaW5lZChyb29tVXNlcnNJZC5tYXAoKHVzZXJJZCkgPT4gKHsgY2FsbElkLCB1c2VySWQgfSkpLCB0cmFjZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBjYWxsSWQgLT4gJHtjYWxsSWR9LCBlcnIgbXNnIC0+ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDIuIOWPkeW4g+a1gVxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5fbG9jYWxUcmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vbkJlZm9yZVB1Ymxpc2gpO1xuICAgICAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnlcbiAgICAgICAgICA/IHRoaXMuX2xvY2FsVHJhY2tzLm1hcCgodHJhY2spID0+ICh0cmFjay5pc1ZpZGVvVHJhY2soKSA/IHsgdHJhY2ssIGlzUHViVGlueTogdHJ1ZSB9IDogdHJhY2spKVxuICAgICAgICAgIDogdGhpcy5fbG9jYWxUcmFja3M7XG4gICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5wdWJsaXNoKHB1YlBhcmFtcywgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHVibGlzaFJlcywgY29kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCwgJ3Nlc3Npb25Db25uZWN0ZWQgbG9jYWwgdHJhY2tzIGlzIGVtcHR5JywgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYHB1Ymxpc2ggRXhjZXB0aW9uIGNhbGxJZCAtPiAke2NhbGxJZH0sIGVyciBtc2cgLT4gJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gIH1cblxuICBhc3luYyBzZXNzaW9uQ2xvc2UoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDplIDmr4HmnKznq6/otYTmupBcbiAgICAgKi9cbiAgICB0aGlzLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG5cbiAgICBjb25zdCBjdXJyZW50Um9vbUlkID0gdGhpcy5fcm9vbT8uZ2V0Um9vbUlkKCk7XG4gICAgaWYgKHRoaXMuX3Jvb20gJiYgY2FsbElkID09PSBjdXJyZW50Um9vbUlkKSB7XG4gICAgICAvLyDpgIDlh7rmiL/pl7RcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbSh0aGlzLl9yb29tKTtcbiAgICAgIC8vIOazqOmUgOWGheWtmOaVsOaNrlxuICAgICAgdGhpcy5fcmVsZWFzZVN0b3JlZERhdGEoKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCBgbGVhdmVSb29tIGZhaWxlZCwgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsICdsZWF2ZVJvb20gc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsICdsZWF2ZVJvb20gdGhyb3cgZXhjZXB0aW9uOiBub3QgaW4gcm9vbScsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjop4bpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVWaWRlb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQU1FUkFfQ0xPU0VEIH07XG4gICAgfVxuXG4gICAgLy8g56aB55So6KeG6aKRXG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHRyYWNrLm11dGUoKTtcblxuICAgIHJldHVybiB7IGNvZGUsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog5ZCv55So6KeG6aKRdHJhY2tcbiAgICogMS4g5ZCv55So5YmN5bqU55So5bGC6ZyA5YWI5Yib5bu66KeG6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBlbmFibGVWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGV9PiB7XG4gICAgLy8g6I635Y+W5pys56uv6KeG6aKRIHRyYWNrXG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTUVSQV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlpoLmnpzotYTmupDmsqHooqvnpoHnlKjvvIzov5Tlm57miJDlip9cbiAgICAgKi9cbiAgICBpZiAoIXRyYWNrIS5pc093bmVyTXV0ZWQoKSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWQr+eUqOi1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjayEudW5tdXRlKCk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4reWIh+aNouinhumikeiuvuWkh1xuICAgKi9cbiAgYXN5bmMgY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2sgfT4ge1xuICAgIC8vIOaWsOiuvuWkh+eahOi9qFxuICAgIGNvbnN0IHJlY2VudFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICAvLyDmlbTnkIblkI7nmoTovahcbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fdmlkZW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIGxldCBuZWVkRGVzdHJveVRyYWNrOiBSQ0xvY2FsVHJhY2s7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MgJiYgdGhpcy5fbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDotYTmupDph4rmlL5cbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgICBuZWVkRGVzdHJveVRyYWNrID0gdHJhY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOS7juacrOWcsOe8k+WtmOS4reWIoOmZpOmUgOavgeeahCB0cmFja1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzID0gdGhpcy5fbG9jYWxUcmFja3MuZmlsdGVyKChpdGVtKSA9PiBuZWVkRGVzdHJveVRyYWNrICYmIChpdGVtLmdldFRyYWNrSWQoKSAhPT0gbmVlZERlc3Ryb3lUcmFjay5nZXRUcmFja0lkKCkpKTtcblxuICAgIHJlY2VudFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICAvLyDnu5nmnKzlnLDliqDkuIrmlrDkuqfnlJ/nmoTop4bpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICB0aGlzLl9sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuXG4gICAgLy8g6YCa55+l5LiK5bGCIHRyYWNrUmVhZHlcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShyZWNlbnRUcmFja3MsIHRyYWNlSWQpO1xuXG4gICAgLy8g5bey5Yqg5YWl5oi/6Ze0XG4gICAgaWYgKHRoaXMuX3Jvb20pIHtcbiAgICAgIC8vIOWPkeW4g+a1gVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2gocmVjZW50VHJhY2tzKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NSUNST1BIT05FX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOmfs+mikVxuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjay5tdXRlKCk7XG5cbiAgICByZXR1cm4geyBjb2RlLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWqkuS9k+exu+Wei+WNh+OAgemZjVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfVCwgYG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgLyoqXG4gICAgICog5Y2H57qnIOmfs+mikSAtPiDpn7Pop4bpopFcbiAgICAgKiAxLiDkuJrliqHlsYLpnIDopoHlhYjpgJrov4cgY3JlYXRlTG9jYWxUcmFja3Mg5Yib5bu65pys5Zyw6KeG6aKRIHRyYWNrXG4gICAgICogMi4gU0RLIOWPquWkhOeQhuWPkeW4g+inhumikSB0cmFja1xuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIC8vIDEuIOiOt+WPlue8k+WtmOS4reeahOinhumikSB0cmFja1xuICAgICAgbGV0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCB0cmFjazogbmV3VHJhY2sgfSA9IGF3YWl0IHRoaXMuX2NyZWF0ZVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBjcmVhdGUgdmlkZW8gdHJhY2sgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cmFjayA9IG5ld1RyYWNrO1xuICAgICAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgICAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuICAgICAgfVxuICAgICAgLy8gMi4g5Y+R5biD5rWBXG4gICAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnkgPyB7IHRyYWNrOiB0cmFjayEsIGlzUHViVGlueTogdHJ1ZSB9IDogdHJhY2shO1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLnB1Ymxpc2goW3B1YlBhcmFtc10sIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwdWJsaXNoIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmZjee6pyDpn7Pop4bpopEgLT4g6Z+z6aKRXG4gICAgICovXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgLy8gMS4g6I635Y+W5pys5Zyw6KeG6aKRIHRyYWNrXG4gICAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG5cbiAgICAgIGlmICh0cmFjaykge1xuICAgICAgICAvLyDlj5bmtojlj5HluIPop4bpopFcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tIS51bnB1Ymxpc2goW3RyYWNrXSk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgdW5wdWJsaXNoIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOmHiuaUvuinhumikSB0cmFja1xuICAgICAgICB0aGlzLmRlc3Ryb3lUcmFjayh0cmFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luUlRDUm9vbShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcm9vbT86IFJDUlRDUm9vbSwgdHJhY2tzPzogUkNSZW1vdGVUcmFja1tdIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QsIGBjYWxsOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIHJvb20sIHRyYWNrcyB9ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDxJSm9pblJUQ1Jvb21SZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbS5iaW5kKHRoaXMuX3J0Y0NsaWVudCksXG4gICAgICBmbkFyZ3M6IFtjYWxsSWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmYWxzZSwgUlRDTW9kZS5DQUxMXSxcbiAgICB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IsIGBjYWxsSWQ6ICR7Y2FsbElkfSwgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uSk9JTl9ST09NX0VSUiwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX3Jvb20gPSByb29tITtcbiAgICB0aGlzLl9vblNlbGZKb2luZWQoeyBjYWxsSWQsIHVzZXJJZDogdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSB9LCB0cmFjZUlkKTtcbiAgICB0cmFja3M/Lmxlbmd0aCAmJiB0aGlzLl9vblJlbW90ZVRyYWNrUHVibGlzaCh0cmFja3MpO1xuXG4gICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHJvb20sIHRyYWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJUQyDorqLpmIVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJzY3JpYmVUcmFja3ModHJhY2tzOiAoSVN1YnNjcmliZUF0dHIpW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBwYXJhbXM6IHRyYWNrcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB0cmFjaywgc3ViVGlueSB9ID0gaXRlbTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0cmFja0lkOiB0cmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgICAgc3ViVGlueSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDxJU3ViUmVzPih7XG4gICAgICBhc3luY0ZuOiB0aGlzLl9yb29tIS5zdWJzY3JpYmUuYmluZCh0aGlzLl9yb29tKSxcbiAgICAgIGZuQXJnczogW3RyYWNrc10sXG4gICAgICBvbkVycm9yOiAoY29kZSkgPT4ge30sXG4gICAgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vbkZldGNoUmVtb3RlTWVkaWFFcnJvcih0cmFja3MsIGNvZGUpO1xuXG4gICAgICB0aGlzLl9vblJUQ01ldGhvZEZhaWwoUkNDYWxsUGx1c1JlYXNvbi5TVUJTQ1JJQkVfRVJSLCB0cmFjZUlkKTtcblxuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SLCBgZXJyb3JDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJUQyDlj5bmtojorqLpmIVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnN1YnNjcmliZVRyYWNrcyh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbSEudW5zdWJzY3JpYmUodHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9SLCBgZXJyb3JDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwcml2YXRlIF9yZWxlYXNlU3RvcmVkRGF0YSgpIHtcbiAgICB0aGlzLl9yb29tID0gbnVsbDtcbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IHRydWU7XG4gICAgdGhpcy5fdXNlclZpZXdNYXAgPSB7fTtcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrcygpOiB7IFt1c2VySWQ6IHN0cmluZ106IFJDUmVtb3RlVHJhY2tbXX0ge1xuICAgIGNvbnN0IHRyYWNrczogeyBbdXNlcklkOiBzdHJpbmddOiBSQ1JlbW90ZVRyYWNrW119ID0ge307XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gdHJhY2tzO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJJZHMgPSB0aGlzLl9yb29tLmdldFJlbW90ZVVzZXJJZHMoKTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICB0cmFja3NbdXNlcklkXSA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKHVzZXJJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNrcztcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vbT8uZ2V0UmVtb3RlVHJhY2tzQnlVc2VySWQodXNlcklkKS5maW5kKCh0cmFjaykgPT4gKChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pID8gdHJhY2suaXNBdWRpb1RyYWNrKCkgOiB0cmFjay5pc1ZpZGVvVHJhY2soKSkpO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvKipcbiAgICogUlRDIOS6i+S7tuebkeWQrOazqOWGjFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnUlRDTGlzdGVuZXJzKCkge1xuICAgIC8vIOazqOWGjOaIv+mXtOS6i+S7tuebkeWQrFxuICAgIHRoaXMuX3Jvb20hLnJlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDmnKznq6/ooqvouKLlh7rmiL/pl7Tml7bop6blj5FcbiAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAqIOWPpuS4gOenjeWPr+iDveaYr+W3seaWuSBydGNQaW5nIOWksei0peasoeaVsOi2heWHuuS4iumZkO+8jOaVheiAjOS4u+WKqOaWree6v1xuICAgICAgICogQHBhcmFtIGJ5U2VydmVyXG4gICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgKiDlvZPlgLzkuLogdHJ1ZSDml7bvvIzor7TmmI7mnKznq6/mlLbliLDooqvouKLlh7rmiL/pl7TpgJrnn6VcbiAgICAgICAqL1xuICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIHRoaXMuX29uS2lja09mZihieVNlcnZlciwgdGhpcy5fcm9vbSEuZ2V0Um9vbUlkKCksIHN0YXRlKTtcbiAgICAgICAgdGhpcy5fcmVsZWFzZVN0b3JlZERhdGEoKTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/nlKjmiLfliqDlhaVcbiAgICAgIG9uVXNlckpvaW46ICh1c2VySWQ6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB1c2VySWQubWFwKChpZCkgPT4gKHsgY2FsbElkOiB0aGlzLl9jYWxsSWQsIHVzZXJJZDogaWQgfSkpO1xuICAgICAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICAgICAgdGhpcy5fb25PdGhlck1lbUpvaW5lZChpbmZvLCB0cmFjZUlkKTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/nlKjmiLfnprvlvIBcbiAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5Y+R5biDXG4gICAgICBvblRyYWNrUHVibGlzaDogdGhpcy5fb25SZW1vdGVUcmFja1B1Ymxpc2guYmluZCh0aGlzKSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWPlua2iOWPkeW4g1xuICAgICAgb25UcmFja1VucHVibGlzaDogdGhpcy5fb25UcmFja1VucHVibGlzaC5iaW5kKHRoaXMpLFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5YeG5aSH5bCx57uqXG4gICAgICBvblRyYWNrUmVhZHk6ICh0cmFjazogUkNSZW1vdGVUcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vblJlbW90ZVRyYWNrUmVhZHkoW3RyYWNrXSk7XG4gICAgICB9LFxuICAgICAgLy8g5Y+R5biD6ICF56aB55So44CB5ZCv55So6KeG6aKRXG4gICAgICBvblZpZGVvTXV0ZUNoYW5nZTogKHZpZGVvVHJhY2s6IFJDUmVtb3RlVmlkZW9UcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vblZpZGVvTXV0ZUNoYWduZSh7XG4gICAgICAgICAgZnJvbVVzZXJJZDogdmlkZW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8g5Y+R5biD6ICF56aB55So44CB5ZCv55So6Z+z6aKRXG4gICAgICBvbkF1ZGlvTXV0ZUNoYW5nZTogKGF1ZGlvVHJhY2s6IFJDUmVtb3RlQXVkaW9UcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vbkF1ZGlvTXV0ZUNoYW5nZSh7XG4gICAgICAgICAgZnJvbVVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICBtdXRlZDogYXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICB0cmFja0lkOiBhdWRpb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgb25SVENQZWVyQ29ubmVjdGlvbkNsb3NlQnlFeGNlcHRpb246IHRoaXMuX29uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgLy8g5rOo5YaM6LSo6YeP5pWw5o2u5oql5ZGK55uR5ZCsXG4gICAgdGhpcy5fcm9vbSEucmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcih7XG4gICAgICBvblN0YXRlUmVwb3J0OiB0aGlzLl9vblJUQ1N0YXRlUmVwb3J0LmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgLy8g5rOo5YaM6Z+z6YeP5LiK5oql5LqL5Lu2XG4gICAgdGhpcy5fcm9vbSEub25BdWRpb0xldmVsQ2hhbmdlKChhdWRpb0xldmVsUmVwb3J0TGlzdCkgPT4ge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyQXVkaW9MZXZlbENoYW5nZWQoYXVkaW9MZXZlbFJlcG9ydExpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Mb2NhbFRyYWNrUmVhZHkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyTWVkaWFBdmFpbGFibGUodHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVtb3RlVHJhY2tSZWFkeSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrcyk7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXyk7XG4gIH1cblxuICBwcml2YXRlIF9vbktpY2tPZmYoYnlTZXJ2ZXI6IGJvb2xlYW4sIHJvb21JZDogc3RyaW5nLCBzdGF0ZT86IFJDS2lja1JlYXNvbiwga2lja0V4dHJhPzogUkNDYWxsS2lja0V4dHJhKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9LSUNLX09GRl9PLCBgcm9vbklkOiAke3Jvb21JZH0sIGJ5U2VydmVyOiAke2J5U2VydmVyfSwgc3RhdGU6ICR7c3RhdGV9LCBraWNrRXh0cmE6ICR7SlNPTi5zdHJpbmdpZnkoa2lja0V4dHJhKX1gKTtcbiAgICBsZXQgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24gPSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSO1xuICAgIGlmIChieVNlcnZlcikge1xuICAgICAgaWYgKGtpY2tFeHRyYSkge1xuICAgICAgICBzeXN0ZW1TdGF0ZSA9IGtpY2tFeHRyYS5raWNrUmVhc29uQ29kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5TRVJWRVJfS0lDSzpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5LSUNLRURfQllfU0VSVkVSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSzpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uSU1fRElTQ09OTkVDVEVEOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uSU1fTE9HT1VUOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkxPR09VVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLk9USEVSX0NMSUVOVF9JTV9DT05ORUNURUQ6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0xPR0lOO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fS0lDS09GRl9fLCBzeXN0ZW1TdGF0ZSwgcm9vbUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMgUGVlciDlvILluLjlhbPpl61cbiAgICog56e75Yqo56uv5pyq5aSE55CG5q2k5Zue6LCD77yM5a6a5LmJIHN5c1N0YXR1cyDkuLogQ09OTkVDVElPTl9FUlJcbiAgICovXG4gIHByaXZhdGUgX29uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uKCkge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfUEVFUkNPTk5FQ1RJT05fRVhDRVBUX0NMT1NFX08sICcnLCB0cmFjZUlkKTtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BFRVJDT05ORUNUSU9OX0FCTk9STUFMX0NMT1NFX18sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfb25TZWxmSm9pbmVkKGluZm86IElNZW1iZXJJbmZvLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fU0VMRl9KT0lORURfXywgaW5mby5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SZW1vdGVUcmFja1B1Ymxpc2godHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3MsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfUFVCTElTSF9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBuZWVkU3ViVHJhY2tzOiBJU3Vic2NyaWJlQXR0cltdID0gW107XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw6Z+z6aKR5pe277yM55u05o6l6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSkge1xuICAgICAgICBuZWVkU3ViVHJhY2tzLnB1c2goeyB0cmFjaywgc3ViVGlueTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXT8udmlkZW9WaWV3KSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2spO1xuICAgICAgICBjb25zdCB7IGlzVGlueSB9ID0gdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKHsgdHJhY2ssIHN1YlRpbnk6IGlzVGlueSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZWVkU3ViVHJhY2tzLmxlbmd0aCAmJiB0aGlzLnN1YnNjcmliZVRyYWNrcyhuZWVkU3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX29uVHJhY2tVbnB1Ymxpc2godHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3MsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGF3YWl0IHRoaXMudW5zdWJzY3JpYmVUcmFja3ModHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQXVkaW9NdXRlQ2hhbmdlKGluZm86IElNZWRpYU11dGVDaGFuZ2VJbmZvKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08sIEpTT04uc3RyaW5naWZ5KHsgaW5mbyB9KSwgdHJhY2VJZCk7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFjayhpbmZvLnRyYWNrSWQpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25WaWRlb011dGVDaGFnbmUoaW5mbzogSU1lZGlhTXV0ZUNoYW5nZUluZm8pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX0VOQUJMRV9DSEFOR0VfTywgSlNPTi5zdHJpbmdpZnkoeyBpbmZvIH0pLCB0cmFjZUlkKTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrKGluZm8udHJhY2tJZCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2shKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUlRDU3RhdGVSZXBvcnQocmVwb3J0OiBJUkNSVENTdGF0ZVJlcG9ydCkge1xuICAgIGNvbnN0IHsgc2VuZGVycywgcmVjZWl2ZXJzIH0gPSByZXBvcnQ7XG4gICAgc2VuZGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IGtpbmQsIHBhY2tldHNMb3N0UmF0ZSwgcnR0IH0gPSBpdGVtO1xuICAgICAgaWYgKHRoaXMuX2NhbGxNZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8gJiYga2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyPy5vblNlbmRQYWNrZXRMb3NzKHBhY2tldHNMb3N0UmF0ZSB8fCAwLCBydHQgfHwgMCk7XG4gICAgfSk7XG4gICAgcmVjZWl2ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdHJhY2tJZCwga2luZCwgcGFja2V0c0xvc3RSYXRlLCBiaXRyYXRlLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICBpZiAodGhpcy5fY2FsbE1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyAmJiBraW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlcklkIH0gPSBoZWxwZXIucGFyc2VUcmFja0lkKHRyYWNrSWQpO1xuICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICBbdXNlcklkOiBzdHJpbmddOiBSQ0NhbGxQbHVzUGFja2V0TG9zc1N0YXRzO1xuICAgICAgfSA9IHt9O1xuICAgICAgZGF0YVt1c2VySWRdID0ge1xuICAgICAgICBwYWNrZXRMb3N0UmF0ZTogcGFja2V0c0xvc3RSYXRlISxcbiAgICAgICAgYml0UmF0ZTogYml0cmF0ZSxcbiAgICAgIH07XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyPy5vblJlY2VpdmVQYWNrZXRMb3NzKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBSVEMg5o6l5pS25pyA57uI5aSx6LSl5ZCO6ZyA6KaB6LCD55SoIGhhbmd1cCDmjILmlq3nmoTmg4XlhrVcbiAqL1xuICBwcml2YXRlIF9vblJUQ01ldGhvZEZhaWwoc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SVENfUFJPQ0VTU19GQUlMRURfXywgc3lzdGVtU3RhdGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25PdGhlck1lbUpvaW5lZChpbmZvOiBJTWVtYmVySW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fT1RIRVJfSk9JTkVEX18sIGluZm8sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9ERVZJQ0VfRU5BQkxFX0NIQU5HRV9fLCB0cmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuacrOWcsOmfs+mikSB0cmFjaywg5Yib5bu65oiQ5Yqf5ZCO5L+d5a2Y5pys5Zyw5bm25Zue6LCD6YCa55+lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVBdWRpb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsQXVkaW9UcmFja30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzQXVkaW9UcmFjaygpKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fYXVkaW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl9hdWRpb0NvbmZpZztcbiAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuXG4gICAgLy8g5pys5qyh57yT5a2YXG4gICAgdGhpcy5fbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIC8vIOmAmuefpeS4iuWxglxuICAgIHRoaXMuX29uTG9jYWxUcmFja1JlYWR5KFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuacrOWcsOinhumikSB0cmFjaywg5Yib5bu65oiQ5Yqf5ZCO5L+d5a2Y5pys5Zyw5bm25Zue6LCD6YCa55+lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVmlkZW9UcmFja30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzVmlkZW9UcmFjaygpICYmICFpdGVtLmlzRGVzdHJveWVkKCkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX3ZpZGVvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIC8vIOacrOasoee8k+WtmFxuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICAvLyDpgJrnn6XkuIrlsYJcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDnvJPlrZjop4bpopEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbFZpZGVvVHJhY2soKTogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzKSB7XG4gICAgICBbbG9jYWxWaWRlb1RyYWNrXSA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzVmlkZW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlkZW9UcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDnvJPlrZjpn7PpopEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbEF1ZGlvVHJhY2soKTogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG9jYWxBdWRpb1RyYWNrOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzKSB7XG4gICAgICBbbG9jYWxBdWRpb1RyYWNrXSA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzQXVkaW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsQXVkaW9UcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HluIPmnKzlnLDotYTmupDnmoTpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdWJsaXNoKHRyYWNrczogKFJDTG9jYWxUcmFjayB8IElQdWJsaXNoQXR0cnMpW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9ULCBgdHJhY2tzSWRzOiAke3RyYWNrcy5tYXAoKGl0ZW0pID0+ICgoaXRlbSBpbnN0YW5jZW9mIFJDTG9jYWxUcmFjaykgPyBpdGVtLmdldFRyYWNrSWQoKSA6IGl0ZW0udHJhY2suZ2V0VHJhY2tJZCgpKSl9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SVB1YlJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcm9vbSEucHVibGlzaC5iaW5kKHRoaXMuX3Jvb20pLFxuICAgICAgZm5BcmdzOiBbdHJhY2tzXSxcbiAgICAgIG9uRXJyb3I6IChjb2RlKSA9PiB7fSxcbiAgICB9KTtcblxuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uUFVCTElTSF9FUlIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIHB1Ymxpc2hWaWRlb1RyYWNrKCkge1xuICAgIGNvbnN0IGRlZmF1bHRWaWRlb1RyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnkgPyB7IHRyYWNrOiBkZWZhdWx0VmlkZW9UcmFjayEsIGlzUHViVGlueTogdHJ1ZSB9IDogZGVmYXVsdFZpZGVvVHJhY2shO1xuICAgIHJldHVybiB0aGlzLl9yb29tIS5wdWJsaXNoKFtwdWJQYXJhbXNdKTtcbiAgfVxuXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmVlZFN1YlRyYWNrczogSVN1YnNjcmliZUF0dHJbXSA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55ID0gZmFsc2UgfSA9IGl0ZW07XG4gICAgICB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdID0ge1xuICAgICAgICB2aWRlb1ZpZXc6IHZpZGVvRWxlbWVudCxcbiAgICAgICAgaXNUaW55LFxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICog6K6+572u5pys56uv6KeG5Zu+5pe277yM5Y+q5a2Y5YKo5pWw5o2u77yM5peg6ZyA6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICh1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiDorr7nva7ov5znq6/op4blm77ml7bvvIzlpoLmnpzlt7Lnu4/liqDlhaXmiL/pl7TvvIzliJnojrflj5bov5znq6/otYTmupDnm7TmjqXorqLpmIVcbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbW90ZVRyYWNrcyA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKCk7XG4gICAgICBjb25zdCBzdWJQYXJhbXMgPSAocmVtb3RlVHJhY2tzIVt1c2VySWRdIHx8IFtdKS5tYXAoKHRyYWNrKSA9PiAoe1xuICAgICAgICB0cmFjayxcbiAgICAgICAgc3ViVGlueTogaXNUaW55LFxuICAgICAgfSkpLmZpbHRlcigoeyB0cmFjayB9KSA9PiAhdHJhY2suaXNTdWJzY3JpYmVkKCkpO1xuICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKC4uLnN1YlBhcmFtcyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PLCBKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgdXNlclZpZXdNYXA6IHRoaXMuX3VzZXJWaWV3TWFwLFxuICAgICAgICBuZWVkU3ViVHJhY2tJZHM6IG5lZWRTdWJUcmFja3MubWFwKCh7IHRyYWNrIH0pID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgICB9LFxuICAgICksIHRyYWNlSWQpO1xuXG4gICAgbmVlZFN1YlRyYWNrcy5sZW5ndGggJiYgdGhpcy5zdWJzY3JpYmVUcmFja3MobmVlZFN1YlRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yig6Zmk6KeG5Zu+5pe277yM5Y+W5raI6K6i6ZiF6LWE5rqQXG4gICAqL1xuICByZW1vdmVWaWRlb1ZpZXcodXNlcklkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHVuc3ViVHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10gPSBbXTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB0cmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpW3VzZXJJZF07XG4gICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9UcmFjayA9IHRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgICAgIHZpZGVvVHJhY2subGVuZ3RoICYmIHVuc3ViVHJhY2tzLnB1c2godmlkZW9UcmFja1swXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFTU9WRV9WSURFT19WSUVXX08sIEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICB1c2VyVmlld01hcDogdGhpcy5fdXNlclZpZXdNYXAsXG4gICAgICAgIHVuc3ViVHJhY2tzOiB1bnN1YlRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgICAgfSxcbiAgICApLCB0cmFjZUlkKTtcblxuICAgIGlmICh1bnN1YlRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVUcmFja3ModW5zdWJUcmFja3MsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blrZjlgqjnmoTkurrlkZjlkowgdmlkZW8g5YWD57Sg5pWw5o2uXG4gICAqL1xuICBnZXRVc2VyVmlld01hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlclZpZXdNYXA7XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5aqS5L2T6LWE5rqQXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1QsIGB1c2VySWQ6ICR7dXNlcklkfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX0sIHZpZGVvVmlldzogJHt2aWRlb1ZpZXc/Lm5vZGVOYW1lfWAsIHRyYWNlSWQpO1xuICAgIGxldCB0cmFjazogUkNUcmFjayB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIOWMuuWIhuacrOerr+WSjOi/nOerr1xuICAgICAqL1xuICAgIGlmICh1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgIHRyYWNrID0gKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykgPyB0aGlzLmdldExvY2FsQXVkaW9UcmFjaygpISA6IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCkhO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgIHRyYWNrID0gdGhpcy5nZXRSZW1vdGVUcmFja3MoKVt1c2VySWRdLmZpbHRlcigodHJhY2spID0+IChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gPyB0cmFjay5pc0F1ZGlvVHJhY2soKSA6IHRyYWNrLmlzVmlkZW9UcmFjaygpKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgYGVycm9yIGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NRURJQV9SRVNPVVJDRV9JTlZBTElFRCB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gYXdhaXQgdHJhY2sucGxheSgpIDogYXdhaXQgdHJhY2sucGxheSh2aWRlb1ZpZXcpO1xuICAgICAgLyoqXG4gICAgICAgKiDlpITnkIbpgJror53liY3orr7nva7kuobpnZnpn7PmiYDmnInov5znq6/pn7PpopHmtYFcbiAgICAgICAqL1xuICAgICAgdHJhY2suaXNBdWRpb1RyYWNrKCkgJiYgIXRoaXMuX3JlbW90ZUF1ZGlvRW5hYmxlICYmIHRyYWNrLm11dGUoKTtcblxuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5QTEFZX01FRElBX0ZBSUxFRH0sIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX0sYCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QTEFZX01FRElBX0ZBSUxFRCB9O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJU3Vic2NyaWJlQXR0cixcbiAgUkNMb2NhbEF1ZGlvVHJhY2ssXG4gIFJDUlRDQ29kZSxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ1RyYWNrLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7XG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzQ2FsbFJlY29yZCxcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1JlYXNvbixcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBSQ0NhbGxQbHVzVHlwZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCc7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXIhOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDnirbmgIHmnLrkuovku7bms6jlhoxcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICog5Zue6LCD5bqU55So5bGC5LqL5Lu2XG4gICogQHBhcmFtIGV2ZW50TmFtZVxuICAqIEBwYXJhbSBhdHRyc1xuICAqIEByZXR1cm5zXG4gICovXG4gIHByaXZhdGUgX2NhbGxBcHBMaXN0ZW5lcihldmVudE5hbWU6IGtleW9mIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsIC4uLmF0dHJzOiBhbnlbXSkge1xuICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuX2xpc3RlbmVyPy5bZXZlbnROYW1lXSBhcyBGdW5jdGlvbjtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaGFuZGxlKC4uLmF0dHJzKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGwoc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbCcsXG4gICAgICBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGwnLCBzZXNzaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZVVzZXJJbnZpdGVkKGludml0ZWVVc2VyTGlzdDogc3RyaW5nW10sIGludml0ZXJVc2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VySW52aXRlZCcsXG4gICAgICBpbnZpdGVlVXNlckxpc3QsXG4gICAgICBpbnZpdGVyVXNlcklkLFxuICAgICAgY2FsbElkLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlVXNlckludml0ZWQnLCBpbnZpdGVlVXNlckxpc3QsIGludml0ZXJVc2VySWQhLCBjYWxsSWQpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbENvbm5lY3RlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxDb25uZWN0ZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbENvbm5lY3RlZCcsIHNlc3Npb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxUeXBlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxUeXBlQ2hhbmdlZCcsIGNhbGxUeXBlLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWinumHj+S4iuaKpei/nOerr+S6uuWRmOeKtuaAgeWPmOWMllxuICAgKi9cbiAgcHVibGljIG9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZChkYXRhOiB7XG4gICAgY2FsbElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgICByZWFzb24/OiBSQ0NhbGxQbHVzUmVhc29uLFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIHVzZXJJZCwgdXNlclN0YXRlLCByZWFzb24sXG4gICAgfSA9IGRhdGE7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyU3RhdGUsXG4gICAgICByZWFzb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkJywgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZSwgcmVhc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNhbGxFbmRlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbiwgcmVhc29uOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25DYWxsRW5kZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgY2xvc2VSZWFzb246IHJlYXNvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxFbmRlZCcsIHNlc3Npb24sIHJlYXNvbik7XG4gIH1cblxuICBwdWJsaWMgb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRyYWNrSWQ6IHRyYWNrPy5nZXRUcmFja0lkKCksXG4gICAgICBlbmFibGU6IHRyYWNrPy5pc093bmVyTXV0ZWQoKSxcbiAgICB9KSk7XG4gICAgY29uc3QgdXNlcklkID0gdHJhY2s/LmdldFVzZXJJZCgpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQnLCBjYWxsSWQsIHVzZXJJZCwgdHJhY2s/LmlzT3duZXJNdXRlZCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB0cmFja0lkOiB0cmFjaz8uZ2V0VHJhY2tJZCgpLFxuICAgICAgZW5hYmxlOiB0cmFjaz8uaXNPd25lck11dGVkKCksXG4gICAgfSkpO1xuICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrPy5nZXRVc2VySWQoKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsIGNhbGxJZCwgdXNlcklkLCB0cmFjaz8uaXNPd25lck11dGVkKCkpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsUmVjb3JkKHJlY29yZDogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxSZWNvcmQnLFxuICAgICAgcmVjb3JkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDYWxsUmVjb3JkJywgcmVjb3JkKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQ6IHN0cmluZywgdHJhbnNhY3Rpb25JZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCcsXG4gICAgICB1c2VySWQsXG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0JywgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoaW5mbzoge1xuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIHRyYW5zYWN0aW9uSWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgY29kZSxcbiAgICB9ID0gaW5mbztcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsXG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsIHtcbiAgICAgIHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlLCBjb2RlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKGluZm86IHsgY2FsbElkOiBzdHJpbmcsIGNhbGxTdGFydFRpbWU6IG51bWJlciB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxTdGFydFRpbWUnLFxuICAgICAgaW5mbyxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbFN0YXJ0VGltZScsIGluZm8pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkOiBzdHJpbmcsIGNhbGxGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsRmlyc3RGcmFtZVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsIGNhbGxJZCwgY2FsbEZpcnN0RnJhbWVUaW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3M6IFJDVHJhY2tbXSwgdHJhY2VJZD86IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblVzZXJNZWRpYUF2YWlsYWJsZScsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlck1lZGlhQXZhaWxhYmxlJywgdXNlcklkLCBtZWRpYVR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uRmV0Y2hSZW1vdGVNZWRpYUVycm9yKHRyYWNrczogSVN1YnNjcmliZUF0dHJbXSwgY29kZTogUkNSVENDb2RlKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHsgdHJhY2sgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uRmV0Y2hSZW1vdGVNZWRpYUVycm9yJywgdXNlcklkLCBjb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJBdWRpb0xldmVsQ2hhbmdlZChhdWRpb0xldmVsUmVwb3J0TGlzdDoge1xuICAgIHRyYWNrOiBSQ0xvY2FsQXVkaW9UcmFjayB8IFJDUmVtb3RlQXVkaW9UcmFjaztcbiAgICBhdWRpb0xldmVsOiBudW1iZXI7XG4gIH1bXSkge1xuICAgIGF1ZGlvTGV2ZWxSZXBvcnRMaXN0LmZvckVhY2goKHsgdHJhY2ssIGF1ZGlvTGV2ZWwgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkJywgdXNlcklkLCBhdWRpb0xldmVsKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmnKrnn6XplJnor69cbiAgICovXG4gIFVOS05PV19FUlIgPSA0MTAwMCxcbiAgLyoqXG4gICAqIOaVsOaNruW6k+mUmeivr1xuICAgKi9cbiAgREJfRVJSID0gNDEwMDEsXG4gIC8qKlxuICAgKiBqc29uIOmUmeivr1xuICAgKi9cbiAgSlNPTl9FUlIgPSA0MTAwMixcbiAgLyoqXG4gICAqIGpzb24g5qC85byP6ZSZ6K+vXG4gICAqL1xuICBJTlZBTElEX0pTT05fRVJSID0gNDEwMDMsXG4gIC8qKlxuICAgKiDlj4LmlbDkuKLlpLFcbiAgICovXG4gIE1JU1NJTkdfUEFSQU1TID0gNDEwMDQsXG4gIC8qKlxuICAgKiDlj4LmlbDkuI3og73kuLrnqbpcbiAgICovXG4gIFBBUkFNU19SRVFVSVJFRCA9IDQxMDA1LFxuICAvKipcbiAgICog5pWw5o2u5qC85byP6ZSZ6K+vXG4gICAqL1xuICBEQVRBX0ZPUk1BVF9FUlIgPSA0MTAwNixcbiAgLyoqXG4gICAqIOaWueazleacquWunueOsFxuICAgKi9cbiAgTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IDQxMDA3LFxuICAvKipcbiAgICogY2FsbCDkuI3lrZjlnKjmiJblt7Lnu5PmnZ9cbiAgICovXG4gIENBTExfTk9UX0VYSVNUID0gNDEwMTAsXG4gIC8qKlxuICAgKiDljZXlkbwg6KKr6YKA6K+36ICF5LiN6IO96LaF6L+H5Lik5Lq6XG4gICAqL1xuICBTSU5HQUxfRVhDRUVEX1RXT19JTlZJVEVFID0gNDEwMTEsXG4gIC8qKlxuICAgKiDnvqTnu4Tlkbzlj6votoXov4fop4TlrprkurrmlbDvvIjmnIDlpJogMzIg5Lq677yJXG4gICAqL1xuICBHUk9VUF9FWENFRURTX1FVT1JVTSA9IDQxMDEyLFxuICAvKipcbiAgICog5pON5L2c5bey6L+H5pyfXG4gICAqL1xuICBPUEVSQVRJT05fRVhQSVJFRCA9IDQxMDEzLFxuICAvKipcbiAgICog5b2T5YmN6K6+5aSH5q2j5Zyo5ZG85Y+r5LitXG4gICAqL1xuICBERVZJQ0VfSVNfQ0FMTElORyA9IDQxMDE0LFxuICAvKipcbiAgICog5LiK5oql55qEIHN0cmVhbVJlYWR5VGltZSDml6DmlYhcbiAgICovXG4gIFJFUE9SVF9TVFJFQU1fUkVBRFlfVElNRV9JU19JTlZBTElEID0gNDEwMTgsXG4gIC8qKlxuICAgKiDkuI3og73lkbzoh6rlt7FcbiAgICovXG4gIE5PVF9DQUxMX1lPVVJTRUxGID0gNDEwMTksXG4gIC8qKlxuICAgKiDkvJror53nirbmgIHkuI3lrZjlnKhcbiAgICovXG4gIFNFU1NJT05fU1RBVFVTX05PVF9FWElTVCA9IDQxMDIwLFxuICAvKipcbiAgICogaGFuZ3VwIOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgSEFOR1VQX05PVF9BTExPVyA9IDQxMDIxLFxuICAvKipcbiAgICogYWNjZXB0IOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgQUNDRVBUX05PVF9BTExPVyA9IDQxMDIyLFxuICAvKipcbiAgICog5pON5L2c5Zyo5b2T5YmN5pa55rOV5LiN5YWB6K646LCD55SoXG4gICAqL1xuICBPUEVSQVRJT05fTk9UX0FMTE9XID0gNDEwMjUsXG4gIC8qKlxuICAgKiDkuJrliqFJZOS4jeato+ehruaIluiAheS4muWKoeW3sue7k+adn1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfRVJSID0gNDExMDAsXG4gIC8qKlxuICAgKiDpn7PpopHljYfnuqfop4bpopHlt7Looqvlj5HotbfogIXlj5bmtohcbiAgICovXG4gIFVQX1ZJREVPX0NBTkNFTEVEID0gNDEwNTAsXG4gIC8qKlxuICAgKiDlvZPliY3pgJror53lt7Lnu4/mmK/pn7PpopHpgJror53vvIzml6DpnIDpmY3nuqdcbiAgICovXG4gIENVUlJFTlRfQ0FMTF9JU19BVURJTyA9IDQxMDUxLFxuICAvKipcbiAgICog5b2T5YmN6YCa6K+d5bey57uP5piv6KeG6aKR6YCa6K+d77yM5peg6ZyA5Y2H57qnXG4gICAqL1xuICAgQ1VSUkVOVF9DQUxMX0lTX1ZJREVPID0gNDEwNTIsXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgZ2V0VVVJRCwgSVJ1bnRpbWUsIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgbm90RW1wdHlBcnJheSwgbm90RW1wdHlTdHJpbmcsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZW1vdGVUcmFjaywgUkNSVENDb2RlLCBkZXZpY2UgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElDYWxsUGx1c0luaXRPcHRzLFxuICBJU3RhdHVzUmVwb3J0TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyxcbiAgUkNDYWxsUGx1c0NhbGxVc2VyLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNDYWxsUGx1c1R5cGUsXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBJQXVkaW9Db25maWcsXG4gIElWaWRlb0NvbmZpZyxcbiAgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7XG4gIGdldEhhbmd1cFN5c3RlbVN0YXRlLCBpc1N1cHBvcnRNZWRpYVNlcnZlciwgdmFsaWRhdGVCaXRyYXRlLCB2YWxpZGF0ZVZpZGVvTm9kZU5hbWUsXG59IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgUkNDYWxsUEx1c1N0YXRpc3RpY3MgZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQTHVzU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnJztcbmltcG9ydCB7XG4gIElIYW5ndXBGb3JCdXN5T3B0cywgSU1lbWJlckluZm8sXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUlRDTW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SVENNb2R1bGUnO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9Gb3J3YXJkVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJFcnJvckNvZGUgfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyRXJyb3JDb2RlJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNDbGllbnQge1xuICAvKipcbiAgICog5pGE5YOP5aS06YeH6ZuG6YWN572uXG4gICAqL1xuICBwcml2YXRlIF92aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnID0ge1xuICAgIHJlc29sdXRpb246IFJDQ2FsbFBsdXNSZXNvbHV0aW9uLlc2NDBfSDQ4MCxcbiAgICBmcmFtZVJhdGU6IFJDQ2FsbFBsdXNGcmFtZVJhdGUuRlBTXzE1LFxuICB9XG5cbiAgLyoqXG4gICAqIOm6puWFi+mjjumHh+mbhumFjee9rlxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZyA9IHt9XG5cbiAgLyoqXG4gICAqIOe7n+iuoeWfi+eCueexu1xuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFBsdXNTdGF0aXN0aWNzOiBSQ0NhbGxQTHVzU3RhdGlzdGljc1xuXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBwcml2YXRlIF9jbGllbnRDYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIOaYr+WQpuS4uuS4u+WKqOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNMYXVuY2hIYW5ndXAgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDlkbzlj6vov4fnqIvkuK3mjILmlq1cbiAgICovXG4gIHByaXZhdGUgX25lZWRIYW5ndXBDYWxsSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lO1xuXG4gIHByaXZhdGUgX3J0Y01vZHVsZTogUlRDTW9kdWxlO1xuXG4gIC8qKlxuICAgKiDkuIrmiqXlupTnlKjlsYLkuovku7bmqKHlnZdcbiAgICovXG4gIF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlID0gbmV3IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUoX2xvZ2dlcik7XG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzID0gbmV3IFJDQ2FsbFBMdXNTdGF0aXN0aWNzKHRoaXMuX2xvZ2dlciwgdGhpcy5fY29udGV4dCk7XG4gICAgLy8g5Yid5aeL5YyW54q25oCB5py65a6e5L6LXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5faW5pdE9wdHMsIHRoaXMuX2xvZ2dlciwgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlID0gbmV3IFJUQ01vZHVsZSh0aGlzLl9jb250ZXh0LCB0aGlzLl9ydW50aW1lLCB0aGlzLl9pbml0T3B0cywgdGhpcy5fbG9nZ2VyLCB0aGlzLl9jYWxsRW5naW5lLCB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZSk7XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX18sIHRoaXMuX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXywgdGhpcy5fcGVlckNvbm5lY3Rpb25BYm5vcm1hbENsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fLCB0aGlzLl9zZWxmSm9pbmVkSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXywgdGhpcy5fb3RoZXJKb2luZWRIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXywgdGhpcy5fcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX09OX0tJQ0tPRkZfXywgdGhpcy5fa2lja29mZkhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXywgdGhpcy5fcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZS5iaW5kKHRoaXMpKTtcblxuICAgIC8qKlxuICAgICAqIOmAmuivneW7uueri+WQju+8jFJUQyDmqKHlnZfpnIDlj5HluIPotYTmupBcbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZC5iaW5kKHRoaXMuX3J0Y01vZHVsZSkpO1xuICAgIC8qKlxuICAgICAqIOmAmuivneaMguaWreWQju+8jFJUQyDmqKHlnZfpnIDpgIDlh7rmiL/pl7TjgIHlpITnkIblhoXlrZjmlbDmja5cbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgdGhpcy5fc2Vzc2lvbkNsb3NlSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIC8qKlxuICAgICAqIOWkhOeQhiBSVEMg5qih5Z2X5aqS5L2T5Y2H6ZmN57qn6YC76L6RXG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlTWVkaWFUeXBlLmJpbmQodGhpcy5fcnRjTW9kdWxlKSk7XG4gICAgLyoqXG4gICAgICog5pS25Yiw6YCa6K+d6YKA6K+35ZCO77yM6ZyA5LiK5oql5Z+L54K5XG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgKG5ld1Nlc3Npb24sIGludml0ZVNvdXJjZSkgPT4ge1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1MsIFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsICtuZXcgRGF0ZSgpLCBuZXdTZXNzaW9uLCAnJywgaW52aXRlU291cmNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliqDmiL/pl7TjgIHlj5HluIPjgIHorqLpmIXlpLHotKXml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgY29uc3QgY2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUywgUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgK25ldyBEYXRlKCksIG1haW5TZXNzaW9uKTtcbiAgICAgIHRoaXMuX19pbm5lckhhbmd1cCh7IGNhbGxJZCwgc3lzdGVtU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJ0YyBwZWVyQ29ubmVjdGlvbiDlvILluLjmlq3lvIDml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3BlZXJDb25uZWN0aW9uQWJub3JtYWxDbG9zZSh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgLy8g5LiK5oql54q25oCB6K6p5a+55pa555+l6YGT6Ieq5bex56a75byA55qE5Y6f5ZugXG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkOiBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmVuZEN1cnJlbnRTZXNzaW9uKFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIsIG1haW5TZXNzaW9uLmdldENhbGxJZCgpLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pys56uv5Yqg5YWlIFJUQyDmiL/pl7TvvIzpnIDmm7TmlrDmnKzkurogT05DQUxMIOeKtuaAge+8jOmHjeaWsOagoeaXtlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VsZkpvaW5lZEhhbmRsZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsQ29ubmVjdGVkKHNlc3Npb24hKTtcblxuICAgIC8qKlxuICAgICAqIOabtOaWsOiHquW3seeahOeKtuaAgVxuICAgICAqL1xuICAgIGNvbnN0IHZpZGVvVHJhY2sgPSB0aGlzLl9ydGNNb2R1bGUuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgYXVkaW9UcmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBjb25zdCBjYW1lcmFFbmFibGUgPSB2aWRlb1RyYWNrID8gIXZpZGVvVHJhY2suaXNPd25lck11dGVkKCkgOiBmYWxzZTtcbiAgICBjb25zdCBtaWNyb3Bob25lRW5hYmxlID0gYXVkaW9UcmFjayA/ICFhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpIDogZmFsc2U7XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBjYW1lcmFFbmFibGUsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIG1pY3JvcGhvbmVFbmFibGUsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qgc2VsZlN0YXRlID0gW1xuICAgICAge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBzZWxmU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g6YeN5paw5byA5aeL5qCh5pe26YC76L6RXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+S6uuWRmOWKoOWFpeaIv+mXtO+8jOabtOaWsOi/nOerr+S6uuWRmOeKtuaAgeWSjOmAmuivneeKtuaAgeS4uiBPTkNBTExcbiAgICovXG4gIHByaXZhdGUgX290aGVySm9pbmVkSGFuZGxlKGluZm86IElNZW1iZXJJbmZvW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOabtOaWsOWKoOWFpeaIv+mXtOS6uuWRmOeKtuaAgVxuICAgIGxldCBjYWxsSWQgPSAnJztcbiAgICBjb25zdCB1c2Vyc1N0YXRlID0gaW5mby5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNhbGxJZCA9IGl0ZW0uY2FsbElkO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIHVzZXJzU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pyJ5Lq65Y+q5Yqg5oi/6Ze077yM5LiN5Y+R5rWB77yM5pWF5q2k5aSE5Lmf5pu05paw5Li6IENPTk5FQ1RFRFxuICAgIGlmICh0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlTWFpblNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmmluW4p+S4iuaKpee7meS4muWKoeWxglxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS51cGRhdGVNYWluU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKTtcbiAgICB9XG5cbiAgICAvLyDnu5kgQ2FsbFNlcnZlciDkuIrmiqXmtYHliLDovr5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwRmlyc3RGcmFtZVRpbWUodHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KKr6Lii5Ye65oi/6Ze05pe277yM6ZyA57uT5p2f6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9raWNrb2ZmSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCByb29tSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog5pys56uv572R57uc5pyJ6Zeu6aKY77yMcGluZyDlpLHotKXml7ZcbiAgICAgKi9cbiAgICBpZiAoc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiiq+acjeWKoeerr+i4ouWHuuaXtueahOWkhOeQhlxuICAgICAqL1xuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uKSB7XG4gICAgICBjb25zdCBjYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FCTk9STUFMX0hBTkdVUF9TLCBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCArbmV3IERhdGUoKSwgbWFpblNlc3Npb24sIHRoaXMuX2NsaWVudENhbGxJZCk7XG5cbiAgICAgIC8vIOS4iuaKpeeKtuaAgeebtOaOpeiuqeWvueaWueefpemBk+iHquW3seemu+W8gOeahOWOn+WboFxuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBzeXN0ZW1TdGF0ZSxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvLyDnm7TmjqXnu5PmnZ/lt7HmlrnpgJror51cbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOmfs+inhumikeeKtuaAgeWPmOWMlu+8jOmcgOabtOaWsCBzZXNzaW9uIOS4reS6uuWRmOeahOiuvuWkh+eKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsICF0cmFjay5pc093bmVyTXV0ZWQoKSwgdHJhY2VJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5pe277yM6ZyA5riF56m65YaF5a2Y77yM56a75byA5oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uQ2xvc2VIYW5kbGUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8qKlxuICAgICAqIOS7heWcqOiiq+WKqOaMguaWreaXtua4heepuuWIm+W7uueahOWuouaIt+erryBjYWxsSWTvvIxcbiAgICAgKiDkuI3lvbHlk43kuLvliqjlkbzlj6vlkI7mjILmlq3ml7bkuIrmiqUg5a6i5oi356uvIGNhbGxJZFxuICAgICAqL1xuICAgIGlmICghdGhpcy5faXNMYXVuY2hIYW5ndXApIHtcbiAgICAgIHRoaXMuX2NsaWVudENhbGxJZCA9ICcnO1xuICAgIH1cbiAgICB0aGlzLl9pc0xhdW5jaEhhbmd1cCA9IGZhbHNlO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozlupTnlKjlsYLkuovku7ZcbiAgICog5YyF5ZCr4oCc5pS25Yiw5ZG85Y+r44CB6YCa6K+d57uT5p2f44CB6YCa6K+d5Lq65ZGY54q25oCB5Y+Y5pu044CB6YCa6K+d57G75Z6L5Y+Y5pu04oCd562J5LqL5Lu2XG4gICAqIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIg5a+56LGh6K+35Y+C6ICDIGFwaURvY1xuICAgKi9cbiAgc2V0Q2FsbFBsdXNFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfRVZFTlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUucmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozpn7Pop4bpopHkuIrkuIvooYzkuKLljIXmlbDmja7nm5HlkKxcbiAgICog5q+P56eS5LiK5oql5LiA5qyhXG4gICAqIEBwYXJhbSBsaXN0ZW5lciDnsbvlnovkuLogSVN0YXR1c1JlcG9ydExpc3RlbmVy77yM6K+m57uG5a6a5LmJ5Y+v5Y+C6ICDIGFwaURvY1xuICAgKiBAcGFyYW0gbGlzdGVuZXIub25TZW5kUGFja2V0TG9zcyAg5Y+R6YCB5Lii5YyF546H5L+h5oGv5Zue6LCDXG4gICAqIEBwYXJhbSBsaXN0ZW5lci5vblJlY2VpdmVQYWNrZXRMb3NzIOaOpeaUtuS4ouWMheeOh+S/oeaBr+Wbnuiwg1xuICAgKi9cbiAgc2V0U3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1NUQVRVU19SRVBPUlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruimgeingueci+S6uuWRmCjljIXmi6zoh6rlt7Hlkozlr7nmlrkp55qE5aqS5L2T5pKt5pS+5ZmoXG4gICAqIEBwYXJhbSBsaXN0IOS4uuS4gOS4quWIl+ihqO+8jOWPr+S8oOWFpeWkmuS6uueahOWqkuS9k+aSreaUvuWZqFxuICAgKiBAcGFyYW0gaXRlbS51c2VySWQg55So5oi3IGlkXG4gICAqIEBwYXJhbSBpdGVtLnZpZGVvRWxlbWVudCDkuIDkuKogdmlkZW8g5YWD57Sg77yM55So5LqO5pKt5pS+6KeG6aKR77yM6ZyA6KaB5oyC6L295Zyo5Lia5Yqh5bGC6aG16Z2i5LiKXG4gICAqIEBwYXJhbSBpdGVtLmlzVGlueSDmmK/lkKbop4LnnIvliKvkurrnmoTlsI/mtYHvvIzlsI/nqpflj6Pml7blj6/ku6XphY3nva7kuLogdHJ1Ze+8jOWPr+iKguecgeW4puWuve+8jHVzZXJJZCDkuLrov5znq6/nlKjmiLfml7bmnInmlYhcbiAgICogQHJldHVybnMgY29kZSDov5Tlm57mmK/lkKborr7nva7miJDlip9cbiAgICovXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbGlzdDogbGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55IH0gPSBpdGVtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBlbGVtZW50TmFtZTogdmlkZW9FbGVtZW50Py5ub2RlTmFtZSxcbiAgICAgICAgICBpc1RpbnksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmo4DmtYtcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5QXJyYXkobGlzdCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCBsaXN0OiBub3QgZW1wdHkgYXJyYXksIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGxpc3QpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBsaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQgfSA9IGl0ZW07XG4gICAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbGlkYXRlVmlkZW9Ob2RlTmFtZSh2aWRlb0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB2aWRlb0VsZW1lbnQ6IG5lZWQgYSB2aWRlbyBlbGVtZW50LCB2YWx1ZTogJHt2aWRlb0VsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHZpZGVvRWxlbWVudC5ub2RlTmFtZSA6IHZpZGVvRWxlbWVudH1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsICdzdWNjZXMnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9WaWV3KGxpc3QsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTmn5DkuKrkurrnmoTlqpLkvZPmkq3mlL7lmahcbiAgICog5LiN6KeC55yL5p+Q5Liq5Lq655qE6KeG6aKR5pe277yM5Lia5Yqh5bGC5Y+v5Lul55u05o6l56e76Zmk5a+55bqU55qEIHZpZGVvIOagh+etvu+8jFxuICAgKiDosIMgcmVtb3ZlVmlkZW9WaWV3IOaWueazle+8jFNESyDlhoXpg6jkvJrlgZzmraLmjqXmlLblr7nmlrnnmoTlqpLkvZPkvKDovpNcbiAgICogQHBhcmFtIHVzZXJJZHMg55So5oi3IGlkIOWIl+ihqFxuICAgKiBAcmV0dXJucyBjb2RlIOi/lOWbnuaYr+WQpuWIoOmZpOaIkOWKn1xuICAgKi9cbiAgcmVtb3ZlVmlkZW9WaWV3KHVzZXJJZHM6IHN0cmluZ1tdKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWRzLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOajgOa1i1xuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFTU9WRV9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB1c2VySWRzOiBub3QgZW1wdHkgYXJyYXksIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVNT1ZFX1ZJREVPX1ZJRVdfUiwgJ3N1Y2NlcycsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlLnJlbW92ZVZpZGVvVmlldyh1c2VySWRzLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5oyH5a6a5Lq65ZGY55qE6Z+z6KeG6aKR5aqS5L2TXG4gICAqIOaSreaUvuafkOS4quS6uueahOinhumikeWJje+8jOivt+ehruS/neW3sue7j+iwg+eUqCBgc2V0VmlkZW9WaWV3YCDmlrnms5XkuLrlhbborr7nva7op4bpopHop4blm75cbiAgICogQHBhcmFtIHVzZXJJZCDmjIflrpropoHmn6XnnIvmn5DkuKrkurrnmoTlqpLkvZPotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDmjIflrprmkq3mlL7pn7PpopHov5jmmK/op4bpopFcbiAgICogQHJldHVybnMg6L+U5Zue5piv5ZCm5pKt5pS+5oiQ5YqfXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IsIGBwYXJhbXMgZXJyLCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreS4muWKoeWxguaYr+WQpuiuvue9rui/h+W9k+WJjeS6uuWRmOeahOinhumikeinhuWbvlxuICAgICAqL1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3IH0gPSB0aGlzLl9ydGNNb2R1bGUuZ2V0VXNlclZpZXdNYXAoKVt1c2VySWRdIHx8IHt9O1xuICAgIGlmIChtZWRpYVR5cGUgIT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgIXZpZGVvVmlldykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVR9LCB2aWRlbyB2aWV3IG5vdCBzZXRgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlZJREVPX1ZJRVdfTk9UX1NFVCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ydGNNb2R1bGUucGxheU1lZGlhKHVzZXJJZCwgbWVkaWFUeXBlLCB2aWRlb1ZpZXcsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuinhumikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDop4bpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7mkYTlg4/lpLTorr7lpIcgaWTjgIHluKfnjofjgIHliIbovqjnjofnrYnvvIxcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRWaWRlb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZVZpZGVvQ29uZmlnQnVpbGRlcigpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ1ZpZGVvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruinhumikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLliIfmjaLmkYTlg4/lpLTjgIHph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldFZpZGVvQ29uZmlnKGNmZzogSVZpZGVvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZnJhbWVSYXRlLCByZXNvbHV0aW9uLCBtYXhCaXRyYXRlLCBtaW5CaXRyYXRlLFxuICAgIH0gPSBjZmc7XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNGcmFtZVJhdGVbZnJhbWVSYXRlXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIGZyYW1lUmF0ZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtmcmFtZVJhdGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmICghUkNDYWxsUGx1c1Jlc29sdXRpb25bcmVzb2x1dGlvbl0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCByZXNvbHV0aW9uIGlzIGlsbGVnYWwsIHZhbHVlOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlQml0cmF0ZShtaW5CaXRyYXRlLCBtYXhCaXRyYXRlKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBlcnJvck1zZyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsICdzdWNjZXNzJyk7XG4gICAgdGhpcy5fdmlkZW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb0NvbmZpZyh0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ0F1ZGlvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDpn7PpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7puqblhYvpo47orr7lpIcgaWRcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRBdWRpb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZUF1ZGlvQ29uZmlnQnVpbGRlcigpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ0F1ZGlvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9rumfs+mikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldEF1ZGlvQ29uZmlnKGNmZzogSUF1ZGlvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuICAgIGNvbnN0IHsgc2FtcGxlUmF0ZSwgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gY2ZnO1xuICAgIGlmIChzYW1wbGVSYXRlICYmICFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIHNhbXBsZVJhdGU6IHR5cGUgaXMgbnVtYmVyLCB2YWx1ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuXG4gICAgdGhpcy5fYXVkaW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRBdWRpb0NvbmZpZyh0aGlzLl9hdWRpb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvlj6vkurrlkZggdXNlcklkIOWIl+ihqO+8jOWNleS6uuWRvOWPq+S7hemcgOWcqOaVsOe7hOS4reaUvue9ruWvueaWueS4gOS6uueahCB1c2VySWRcbiAgICogQHBhcmFtIHR5cGUg5Y2V5Lq65ZG85Y+rIG9yIOWkmuS6uuWRvOWPq1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOmAmuivneWqkuS9k+exu+Weizog6Z+z6aKRIG9yIOmfs+inhumikVxuICAgKiBAcmV0dXJucyBjYWxsSWQg5ZG85Y+r5oiQ5Yqf5ZCO77yM5Lqn55Sf55qE5Lya6K+dIGlkXG4gICAqL1xuICBhc3luYyBzdGFydENhbGwodXNlcklkczogc3RyaW5nW10sIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSA9IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSwgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlID0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGNhbGxJZD86IHN0cmluZyB9PiB7XG4gICAgdGhpcy5fY2xpZW50Q2FsbElkID0gZ2V0VVVJRCgpO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9ULCBgdXNlcklkczogJHt1c2VySWRzLmpvaW4oJywnKX0sIGNhbGxUeXBlOiAke2NhbGxUeXBlfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgdXNlcklkczogbm90IGVtcHR5IGFycmF5LCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c1R5cGVbY2FsbFR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbFR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7Y2FsbFR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDljZXogYogdXNlcklkcyDplb/luqbkuI3og73otoXov4cgMVxuICAgICAqL1xuICAgIGlmICh1c2VySWRzLmxlbmd0aCA+IDEgJiYgY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgWW91IGNhbiBvbmx5IGNhbGwgb25lIHBlcnNvbiBpbiBhIHNpbmdsZSBjYWxsLCB1c2VySWRzOiAke3VzZXJJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlt7LlrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjlho3lj5Hotbflkbzlj6tcbiAgICBpZiAodGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0VTU0lPTl9FWElTVH0sIHNlc3Npb24gZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuc3RhcnRDYWxsKHtcbiAgICAgIHRvVXNlcnM6IHVzZXJJZHMubWFwKCh1c2VySWQpID0+ICh7IHVzZXJJZCB9KSksXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2xpZW50Q2FsbElkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfU1RBUlRfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIG51bGwsIHRoaXMuX2NsaWVudENhbGxJZCwgbnVsbCwgeyBtZWRpYVR5cGUsIGNhbGxUeXBlLCBjYWxsSWQ6IGRhdGE/LmNhbGxJZCB8fCAnJyB9KTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ZG85Y+r6L+H56iL5Lit5oyC5patXG4gICAgICovXG4gICAgY29uc3QgeyBjYWxsSWQsIGNsaWVudENhbGxJZCB9ID0gZGF0YSE7XG4gICAgaWYgKHRoaXMuX25lZWRIYW5ndXBDYWxsSWQgPT09IGNsaWVudENhbGxJZCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5jbGVhckFsbFRpbWVyKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmhhbmd1cCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgdGhlICR7Y2FsbElkfSBjYWxsIGhhcyBiZWVuIGhhbmd1cGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIEpTT04uc3RyaW5naWZ5KHsgZGF0YSwgY29kZSB9KSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgY2FsbElkIH07XG4gIH1cblxuICAvKipcbiAgICog55u05o6l5Yqg5YWl6L+b6KGM5Lit55qE576k57uE6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg6YCa6K+dIGlkXG4gICAqL1xuICBhc3luYyBqb2luTXVsdGlDYWxsKGNhbGxJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZTogZ2V0U2Vzc2lvbkNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFNlc3Npb24oeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldFNlc3Npb25Db2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGdldCBjYWxsIGRhdGEgZXJyb3IsIGNvZGU6ICR7Z2V0U2Vzc2lvbkNvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRTZXNzaW9uQ29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgbWVkaWFUeXBlIH0gPSBkYXRhITtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uICYmIG1haW5TZXNzaW9uLmdldENhbGxJZCgpICE9PSBjYWxsSWQpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5qb2luQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQoY2FsbElkLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6YKA6K+35LuW5Lq6XG4gICAqIOWNleS6uumAmuivneS4remCgOivt+S7luS6uuS8muW8leWPkemAmuivneexu+Wei+WPmOabtFxuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fkurrliJfooahcbiAgICogQHJldHVybnMgYnVzeVVzZXJzIOi/lOWbnuW/mee6v+S6uuWRmOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgYnVzeVVzZXJzPzogUkNDYWxsUGx1c0NhbGxVc2VyW10gfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1QsIGBjYWxsSWQ6ICR7dXNlcklkcy5qb2luKCcsJyl9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIShcbiAgICAgIG5vdEVtcHR5QXJyYXkodXNlcklkcylcbiAgICAgICYmIHVzZXJJZHMuZXZlcnkoKHVzZXJJZCkgPT4gbm90RW1wdHlTdHJpbmcodXNlcklkKSlcbiAgICApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW36YKA6K+3XG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmludml0ZSh7XG4gICAgICB0b1VzZXJzOiB1c2VySWRzLm1hcCgodXNlcklkKSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICB9KSksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGJ1c3lVc2VycyA9IFtdO1xuICAgIGlmIChkYXRhIS5idXN5bGluZVVzZXJzPy5sZW5ndGgpIHtcbiAgICAgIGJ1c3lVc2Vycy5wdXNoKC4uLmRhdGEhLmJ1c3lsaW5lVXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICB1c2VySWQ6IHVzZXIudXNlcklkLFxuICAgICAgICBzdGF0ZTogdXNlci5zZXNzaW9uU3RhdHVzLFxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgc3VjY2VzcyBidXN5VXNlcnM6ICR7SlNPTi5zdHJpbmdpZnkoYnVzeVVzZXJzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGJ1c3lVc2VycyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKiBAcGFyYW0gY2FsbElkIOmAmuivnSBpZFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KGNhbGxJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgcGFyYW1zIGVyciwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWtmOWcqOmAmuivnVxuICAgICAqIOmcgOS7juW9k+WJjemAmuivneiOt+WPliBtZWlkYVR5cGVcbiAgICAgKi9cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGNvbnN0IGhvbGRTZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbihjYWxsSWQpO1xuICAgIGlmICghbWFpblNlc3Npb24gJiYgIWhvbGRTZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yy65YiG5o6l5ZCsIG1haW5TZXNzaW9uIOWSjCBob2xkU2Vzc2lvblxuICAgICAqIOWmguaenOaOpeWQrCBob2xkU2Vzc2lvbu+8jOmcgOWFiOaMguaWrSBtYWluU2Vzc2lvblxuICAgICAqL1xuICAgIGNvbnN0IGlzQWNjZXB0SG9sZFNlc3Npb24gPSBjYWxsSWQgPT09IGhvbGRTZXNzaW9uPy5nZXRDYWxsSWQoKTtcbiAgICBpZiAoaXNBY2NlcHRIb2xkU2Vzc2lvbikge1xuICAgICAgY29uc3QgeyBjb2RlOiBoYW5ndXBNYWluU2Vzc2lvbkNvZGUgfSA9IGF3YWl0IHRoaXMuaGFuZ3VwKG1haW5TZXNzaW9uIS5nZXRDYWxsSWQoKSk7XG4gICAgICBpZiAoaGFuZ3VwTWFpblNlc3Npb25Db2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgaGFuZ3VwIG1haW5TZXNzaW9uIGVycm9yIGNvZGU6ICR7aGFuZ3VwTWFpblNlc3Npb25Db2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBoYW5ndXBNYWluU2Vzc2lvbkNvZGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBncmFkZU1haW5TZXNzaW9uKGNhbGxJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgbWVkaWFUeXBlID0gbWFpblNlc3Npb24hLmdldE1lZGlhVHlwZSgpO1xuICAgIGNvbnN0IHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY3JlYXRlQ2FsbE1lZGlhVHJhY2tzKG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldE1lZGlhVHJhY2tzQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW35o6l5ZCsXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmFjY2VwdCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FDQ0VQVF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgbWFpblNlc3Npb24hKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfX2lubmVySGFuZ3VwKG9wdHM6IElIYW5ndXBGb3JCdXN5T3B0cywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBjYWxsSWQgfSA9IG9wdHM7XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldElzTG9jYWxDbGllbnRIYW5ndXAodHJ1ZSk7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5jbGVhckFsbFRpbWVyKGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuaGFuZ3VwKG9wdHMsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgPT09IENhbGxTZXJ2ZXJFcnJvckNvZGUuQ0FMTF9OT1RfRVhJU1QpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyAmJiBjYWxsSWQgPT09IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRDYWxsSWQoKSkge1xuICAgICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25DbG9zZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq3pgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDkuLrlj6/pgInlj4LmlbDvvIzkuI3kvKDml7bvvIzmjILmlq3mraPlnKjov5vooYznmoTkuLsgc2Vzc2lvbu+8jOS8oOWFpeaXtuWPr+aMh+WumuaMguaWreS4u+mAmuivneaIluaaguacquW7uueri+i/nuaOpeeahOmAmuivnVxuICAgKiDmmoLmnKrlu7rnq4vov57mjqXnmoTpgJror53vvJrmjIflt7LlnKjpgJror53kuK3ml7bvvIzmlLbliLDlkbzlj6vkvYbmmoLmnKrmjqXlkKznmoTpgJror51cbiAgICovXG4gIGFzeW5jIGhhbmd1cChjYWxsSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFtYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDnsbvlnovmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmICFpc1N0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWFpblNlc3Npb25DYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcblxuICAgIC8qKlxuICAgICAqIOagoemqjOS8oOWFpeeahCBjYWxsSWQg5piv5ZCm5q2j56GuXG4gICAgICovXG4gICAgaWYgKGNhbGxJZCAmJiBjYWxsSWQgIT09IG1haW5TZXNzaW9uQ2FsbElkICYmICF0aGlzLl9jYWxsRW5naW5lLmdldEhvbGRTZXNzaW9uKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCBgcGFyYW1zIGVyciwgY2FsbElkIGlzIGludmFsaWQsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTExfSURfSU5WQUxJRCB9O1xuICAgIH1cblxuICAgIHRoaXMuX2lzTGF1bmNoSGFuZ3VwID0gdHJ1ZTtcblxuICAgIHRoaXMuX25lZWRIYW5ndXBDYWxsSWQgPSBjYWxsSWQgfHwgbWFpblNlc3Npb25DYWxsSWQ7XG4gICAgY29uc3QgaG9sZFNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldEhvbGRTZXNzaW9uKHRoaXMuX25lZWRIYW5ndXBDYWxsSWQpO1xuICAgIGNvbnN0IGhhbmd1cFNlc3Npb24gPSBob2xkU2Vzc2lvbiB8fCBtYWluU2Vzc2lvbjtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaMguaWreaXtueahOS6uuWRmOezu+e7n+eKtuaAgVxuICAgICAqL1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHVzZXJTdGF0ZSA9IG1haW5TZXNzaW9uLmdldFVzZXJMaXN0KCkuZmlsdGVyKCh1c2VySW5mbykgPT4gdXNlckluZm8udXNlcklkID09PSBjdXJyZW50VXNlcklkKVswXS5zdGF0ZTtcbiAgICBjb25zdCBpc0NhbGxlZSA9IFttYWluU2Vzc2lvbi5nZXRDcmVhdG9yVXNlcklkKCksIG1haW5TZXNzaW9uLmdldEludml0ZXJVc2VySWQoKV0uaW5jbHVkZXMoY3VycmVudFVzZXJJZCk7XG4gICAgY29uc3Qgc3lzdGVtU3RhdGUgPSBnZXRIYW5ndXBTeXN0ZW1TdGF0ZSh1c2VyU3RhdGUsIGlzQ2FsbGVlKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fX2lubmVySGFuZ3VwKHsgY2FsbElkOiB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkLCBzeXN0ZW1TdGF0ZSB9LCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpeaMguaWreWfi+eCueaVsOaNrlxuICAgICAqL1xuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0hBTkdVUF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgaGFuZ3VwU2Vzc2lvbiEsIHRoaXMuX2NsaWVudENhbGxJZCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBzaWduYWwgZXJyb3IgY29kZSA6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID0gbnVsbDtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3lj5HotbflqpLkvZPnsbvlnovlj5jmm7Tor7fmsYJcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDlqpLkvZPnsbvlnotcbiAgICogQHJldHVybnMgdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzlnKjlj5bmtojmiJblupTnrZTlqpLkvZPnsbvlnovliIfmjaLml7bkvKDlhaVcbiAgICovXG4gIGFzeW5jIHJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgdHJhbnNhY3Rpb25JZD86IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QsIGBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5nZXRDdXJyZW50Q2FsbFNlc3Npb24oKTtcbiAgICBjb25zdCBvbGRNZWRpYVR5cGUgPSBtYWluU2Vzc2lvbj8uZ2V0TWVkaWFUeXBlKCk7XG5cbiAgICBpZiAobWVkaWFUeXBlID09PSBvbGRNZWRpYVR5cGUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTUVESUFUWVBFX0lOVkFMSUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NRURJQVRZUEVfSU5WQUxJRCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2iXG4gICAgICovXG4gICAgY29uc3QgdG9Vc2VySWRzID0gbWFpblNlc3Npb24/LmdldFVzZXJMaXN0KCkuZmlsdGVyKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCAhPT0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSkubWFwKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoeyBtZWRpYVR5cGUsIHRvVXNlcklkczogdG9Vc2VySWRzIHx8IFtdIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc3VjY2VzcyB0cmFuc2FjdGlvbklkOiAke2RhdGEhLnRyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFuc2FjdGlvbklkOiBkYXRhIS50cmFuc2FjdGlvbklkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+W5raI5YiH5o2i5aqS5L2T57G75Z6L5Y+Y5pu06K+35rGCXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIOWuouaIt+err+WSjOacjeWKoeerr+S6pOS6kueahOS6i+WKoSBpZO+8jOS4uuWPkei1t+WqkuS9k+exu+Wei+WPmOabtOivt+axgui/lOWbnueahCB0cmFuc2FjdGlvbklkXG4gICAqL1xuICBhc3luYyBjYW5jZWxDaGFuZ2VNZWRpYVR5cGUodHJhbnNhY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfVCwgYHRyYW5zYWN0aW9uSWQ6ICR7dHJhbnNhY3Rpb25JZH1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlTdHJpbmcodHJhbnNhY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcGFyYW0gZXJyb3IsIHRyYW5zYWN0aW9uSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaJcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKHsgdHJhbnNhY3Rpb25JZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWqkuS9k+exu+Wei+WPmOabtOW6lOetlFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzkuLogb25SZWNlaXZlZENoYW5nZVRvVmlkZW8g55uR5ZCs5pS25YiwIHRyYW5zYWN0aW9uSWQg5Y+C5pWw5YC8XG4gICAqL1xuICBhc3luYyByZXBseUNoYW5nZU1lZGlhVHlwZSh0cmFuc2FjdGlvbklkOiBzdHJpbmcsIGlzQWdyZWU6IGJvb2xlYW4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1QsIGB0cmFuc2FjdGlvbklkOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHRyYW5zYWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcGFyYW0gZXJyb3IsIHRyYW5zYWN0aW9uSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihpc0FncmVlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCBpc0FncmVlOiB0eXBlIGlzIGJvb2xlYW4sIHZhbHVlOiAke2lzQWdyZWV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZXNwb25zZUNoYW5nZU1lZGlhVHlwZSh7XG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgICAgYWdyZWU6IGlzQWdyZWUsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3I6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjei/m+ihjOS4reeahOmAmuivnVxuICAgKiBAcmV0dXJucyBSQ0NhbGxQbHVzU2Vzc2lvbiDlr7nosaHmiJYgbnVsbCDkuLrlvZPliY3mraPlnKjov5vooYznmoTpgJror53lr7nosaFcbiAgICovXG4gIGdldEN1cnJlbnRDYWxsU2Vzc2lvbigpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDku47mnI3liqHlmajojrflj5bmnKrnu5PmnZ/nmoTpgJror53orrDlvZVcbiAgICogQHJldHVybnMgcmVjb3JkcyDkuIDnu4TmnKrnu5PmnZ/nmoTpgJror53orrDlvZVcbiAgICovXG4gIGFzeW5jIGdldEF2YWlsYWJsZUNhbGxSZWNvcmRzRnJvbVNlcnZlcigpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByZWNvcmRzPzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldE9wZW5DYWxsTGlzdCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCBgc3VjY2VzcywgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHJlY29yZHM6IGRhdGEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIbpobXmn6Xmib7lvZPliY3nlKjmiLfnmoTlhajpg6jpgJror53orrDlvZVcbiAgICogQHBhcmFtIHN0YXJ0VGltZXN0YW1wIOi1t+Wni+aXtumXtOaIs++8jOi/lOWbnuWkp+S6juatpOaXtumXtOaIs+eahOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gY291bnQg5q+P5qyh6I635Y+W55qE5pWw6YePXG4gICAqIEByZXR1cm5zIHJlc3VsdC5oYXNNb3JlIOaYr+WQpuacieabtOWkmumAmuivneiusOW9lVxuICAgKiBAcmV0dXJucyByZXN1bHQubGlzdCDpgJror53orrDlvZXliJfooajvvIznsbvlnovkuLogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW13vvIzlj6/pgJrov4cgYXBpRG9jIOafpeeci+WFt+S9k+WMheWQq+Wtl+autVxuICAgKiBAcmV0dXJucyByZXN1bHQubWF4VGltZSDliJfooajkuK3mnIDlpKfml7bpl7TmiLPvvIzlpoLmnpwgaGFzTW9yZSDkuLogdHJ1Ze+8jOe7p+e7reiOt+WPluaXtu+8jOS8oOWFpeatpOaXtumXtOaIs1xuICAgKi9cbiAgYXN5bmMgZ2V0Q2FsbFJlY29yZHMoc3RhcnRUaW1lc3RhbXA6IG51bWJlciwgY291bnQ6IG51bWJlcik6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHJlc3VsdD86IElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1QsIGBzdGFydFRpbWVzdGFtcDogJHtzdGFydFRpbWVzdGFtcH0sIGNvdW50OiAke2NvdW50fWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCEoaXNOdW1iZXIoc3RhcnRUaW1lc3RhbXApICYmIHN0YXJ0VGltZXN0YW1wID49IDApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBwYXJhbXMgZXJyb3IsIHN0YXJ0VGltZXN0YW1wOiBpcyBhIG51bWJlciA+PSAwLCB2YWx1ZTogJHtzdGFydFRpbWVzdGFtcH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKCEoaXNOdW1iZXIoY291bnQpICYmIGNvdW50ID4gMCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgYHBhcmFtcyBlcnJvciwgY291bnQ6IGlzIGEgbnVtYmVyID49IDAsIHZhbHVlOiAke2NvdW50fWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbExvZ0xpc3Qoe1xuICAgICAgdGltZXN0YW1wOiBzdGFydFRpbWVzdGFtcCxcbiAgICAgIGNvdW50LFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgcmVzdWx0OiBkYXRhISxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg6ZuG5ZCI5om56YeP5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBjYWxsSWRzIGNhbGxJZCDliJfooahcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUNhbGxSZWNvcmRzRnJvbVNlcnZlcihjYWxsSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfVCwgYGNhbGxJZHM6ICR7Y2FsbElkcy5qb2luKCcsJyl9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIShcbiAgICAgIG5vdEVtcHR5QXJyYXkoY2FsbElkcylcbiAgICAgICYmIGNhbGxJZHMuZXZlcnkoKGNhbGxJZCkgPT4gbm90RW1wdHlTdHJpbmcoY2FsbElkKSlcbiAgICApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCBgcGFyYW1zIGVyciwgY2FsbElkczogbm90IGVtcHR5IGFycmF5LCBjYWxsSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIGNhbGxJZHM6ICR7SlNPTi5zdHJpbmdpZnkoY2FsbElkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5kZWxldGVDYWxsTG9nKGNhbGxJZHMsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXnqbrmiYDmnInpgJror53orrDlvZVcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENhbGxSZWNvcmRzRnJvbVNlcnZlcigpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9BTExfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZW1vdmVBbGxDYWxsTG9nKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9BTExfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+aRhOWDj+WktFxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5omT5byA5pGE5YOP5aS077yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5omT5byA5pGE5YOP5aS055qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqIEByZXR1cm5zIHRyYWNrIOaRhOWDj+WktOinhumikei1hOa6kFxuICAgKi9cbiAgYXN5bmMgc3RhcnRDYW1lcmEoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog6I635Y+W5pGE5YOP5aS06LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmdldENhbWVyYVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCBgY3JlYXRlIHZpZGVvIHRyYWNrIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5WSURFTywgdHJ1ZSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRyYWNrPy5pc1B1Ymxpc2hlZCgpICYmIHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUucHVibGlzaFZpZGVvVHJhY2soKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYHB1Ymxpc2ggZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWQr+eUqOi1hOa6kFxuICAgICAqIOaJqeaVo+WQr+eUqOi1hOa6kOa2iOaBr++8jOWmguaenOWksei0pe+8jOWImSBzdGFydENhbWVyYSDooYzkuLrlpLHotKVcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IHVubXV0ZUNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5lbmFibGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmICh1bm11dGVDb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUyAmJiB1bm11dGVDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke3VubXV0ZUNvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiB1bm11dGVDb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5YWz6Zet5pGE5YOP5aS0XG4gICAqL1xuICBhc3luYyBzdG9wQ2FtZXJhKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmRpc2FibGVWaWRlb1RyYWNrKCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyAmJiBjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiwgYGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveVRyYWNrKHRyYWNrISk7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIGZhbHNlLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKiDliIfmjaLmiJDlip/lkI4gYElDYWxsUGx1c0V2ZW50TGlzdGVuZXJgIOebkeWQrOWZqOeahCBgb25Vc2VyTWVkaWFBdmFpbGFibGVgIOS4reS8muaUtuWIsOaWsOWIh+aNoueahOaRhOWDj+WktOi1hOa6kOWPr+aSreaUvu+8jOatpOaXtuiwg+eUqCBgY2FsbFBsdXNDbGllbnQucGxheU1lZGlhKClgIOWPr+aYvuekuuaWsOaRhOWDj+WktOeahOeUu+mdolxuICAgKiBAcGFyYW0gY2FtZXJhSWQg5rWP6KeI5Zmo5Lit5Y+W5b6X55qE5pGE5YOP5aS06K6+5aSHIGlk77yM5Y+v6LCDIHBsdWdpbi1ydGMg55qEIGdldENhbWVyYXMg5pa55rOV5Y+W5b6XXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53liY3lkozpgJror53kuK3pg73lj6/osIPnlKhcbiAgICovXG4gIGFzeW5jIHN3aXRjaENhbWVyYShjYW1lcmFJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfVCwgYGNhbWVyYUlkOiAke2NhbWVyYUlkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYW1lcmFJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYHBhcmFtIGVycm9yLCBjYW1lcmFJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FtZXJhSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGlmIChzZXNzaW9uLmdldE1lZGlhVHlwZSgpID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9WSURFT19DQUxMfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX1ZJREVPX0NBTEwgfTtcbiAgICB9XG5cbiAgICB0aGlzLl92aWRlb0NvbmZpZy5jYW1lcmFJZCA9IGNhbWVyYUlkO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb0NvbmZpZyh0aGlzLl92aWRlb0NvbmZpZyk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jaGFuZ2VWaWRlb0RldmljZSh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgY2FsbCBjbGllbnQgY2hhbmdlVmlkZW9EZXZpY2UgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5byA5ZCv6bqm5YWL6aOOXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3miZPlvIDpuqblhYvpo47vvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/miZPlvIDpuqblhYvpo47nmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICovXG4gIGFzeW5jIHN0YXJ0TWljcm9waG9uZSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmdldE1pY3JvcGhvbmVBdWRpb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsIGBjcmVhdGUgbWljcm9waG9uZSBhdWRpbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIHRydWUsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0cmFjayEuaXNPd25lck11dGVkKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVubXV0ZUNvZGUgPSBhd2FpdCB0cmFjayEudW5tdXRlKCk7XG4gICAgaWYgKHVubXV0ZUNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogdW5tdXRlQ29kZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reWFs+mXrem6puWFi+mjju+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+WFs+mXrem6puWFi+mjjueahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKi9cbiAgYXN5bmMgc3RvcE1pY3JvcGhvbmUoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmRpc2FibGVBdWRpb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTywgZmFsc2UsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6bqm5YWL6aOO5piv5ZCm5byA5ZCvXG4gICAqL1xuICBpc01pY3JvcGhvbmVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcnRjTW9kdWxlLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIHJldHVybiAhIXRyYWNrICYmICF0cmFjay5pc093bmVyTXV0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7miYDmnInov5znq6/pn7PpopHmtYHmmK/lkKblj6/nlKhcbiAgICogQHBhcmFtIGVuYWJsZSDkuLogdHJ1ZSDml7bvvIzpnZnpn7PmiYDmnInov5znq6/pn7PpopHmtYHvvJvkuLogZmFsc2Ug5pe277yM5ZCv55So5omA5pyJ6L+c56uv6Z+z6aKR5rWBXG4gICAqL1xuICBhc3luYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIFNESyDniYjmnKzkv6Hmga9cbiAgICogQHJldHVybnMgU0RLIOeJiOacrOWPt1xuICAgKi9cbiAgZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBfX1ZFUlNJT05fXztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmkYTlg4/lpLTliJfooahcbiAgICovXG4gIGFzeW5jIGdldENhbWVyYXMoKSB7XG4gICAgY29uc3QgY2FtZXJhcyA9IGF3YWl0IGRldmljZS5nZXRDYW1lcmFzKCk7XG4gICAgcmV0dXJuIGNhbWVyYXM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6bqm5YWL6aOO5YiX6KGoXG4gICAqL1xuICBhc3luYyBnZXRNaWNyb3Bob25lcygpIHtcbiAgICBjb25zdCBtaWNyb3Bob25lcyA9IGF3YWl0IGRldmljZS5nZXRNaWNyb3Bob25lcygpO1xuICAgIHJldHVybiBtaWNyb3Bob25lcztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzVW5kZWZpbmVkLCBMb2dMZXZlbCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgSVJDQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHsgSVZhbGlkYXRlUmVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JVmFsaWRhdGlvbic7XG5pbXBvcnQgeyBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLCBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuXG4vKipcbiAqIOWIneWni+WMluWPguaVsOagoemqjFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVJbml0T3B0cyA9IChvcHRzOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBJVmFsaWRhdGVSZXMgPT4ge1xuICBpZiAoIW9wdHMpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gbWlzc2luZyBwYXJhbWV0ZXIgLT4gb3B0aW9ucycgfTtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KG9wdHMpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0cyk7XG4gIC8vIOW/heS8oOWPguaVsOmqjOivgVxuICBpZiAoIWtleXMuaW5jbHVkZXMoJ3J0Y0NsaWVudCcpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTlNUQUxMX1JUQ19QTFVHSU4gfTtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KG9wdHMucnRjQ2xpZW50KSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdydGNDbGllbnRcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdvYmplY3RcXCcnIH07XG4gIH1cblxuICByZXR1cm4geyBpc0xlZ2FsOiB0cnVlIH07XG59O1xuXG4vKipcbiAqIHJlZ2lzdGVyQ2FsbEV2ZW50TGlzdGVuZXIg5Y+C5pWw5qCh6aqMXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxpc3RlbmVyID0gKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKTogSVZhbGlkYXRlUmVzID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdtaXNzaW5nIHBhcmFtZXRlciAtPiBsaXN0ZW5lcicgfTtcbiAgfVxuXG4gIC8vIOagoemqjOaYr+WQpue8uuWwkeW/heimgeebkeWQrOWbnuiwg+azqOWGjFxuICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ29uSW52aXRlJywgJ29uU2Vzc2lvbkNsb3NlJywgJ29uUmVtb3RlVHJhY2tSZWFkeSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGxpc3RlbmVyKTtcbiAgY29uc3QgbWlzc2luZ0tleXM6IHN0cmluZ1tdID0gW107XG4gIHJlcXVpcmVkS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiBgbWlzc2luZyBwYXJhbWV0ZXIgLT4gXCIke21pc3NpbmdLZXlzLmpvaW4oJywnKX1cImAgfTtcbiAgfVxuXG4gIGxldCByZXM6IElWYWxpZGF0ZVJlcyA9IHsgaXNMZWdhbDogdHJ1ZSB9O1xuXG4gIC8vIOagoemqjOW/heimgeebkeWQrOaYr+WQpuaYryBmdW5jdGlvbiDnsbvlnotcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSByZXF1aXJlZEtleXNbaV07XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyWzxrZXlvZiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyPmtleV0pKSB7XG4gICAgICByZXMgPSB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6IGAnJHtrZXl9JyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlICdmdW5jdGlvbidgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCB7XG4gIElQbHVnaW5HZW5lcmF0b3IsIElSdW50aW1lLCBpc1VuZGVmaW5lZCwgTG9nTCwgUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NsaWVudCB9IGZyb20gJy4vY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvbiB9IGZyb20gJy4vY29yZS9tb2R1bGVzL1JDQ2FsbFBsdXNTZXNzaW9uJztcbmltcG9ydCB7IHZhbGlkYXRlSW5pdE9wdHMgfSBmcm9tICcuL2NvcmUvdXRpbHMvdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBJQ2FsbFBsdXNJbml0T3B0cyB9IGZyb20gJy4vY29yZS9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCBSQ0F1ZGlvQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDQXVkaW9Db25maWdCdWlsZGVyJztcbmltcG9ydCBSQ1ZpZGVvQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDVmlkZW9Db25maWdCdWlsZGVyJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5jb25zdCBpbnN0YWxsZXI6IElQbHVnaW5HZW5lcmF0b3I8UkNDYWxsUGx1c0NsaWVudCwgSUNhbGxQbHVzSW5pdE9wdHM+ID0ge1xuICB0YWc6ICdSQ0NhbGxQbHVzJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgVmVyc2lvbk1hbmFnZS5hZGQoJ3BsdWdpbi1jYWxsLXBsdXMnLCBfX1ZFUlNJT05fXyk7XG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbC1wbHVzIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSUNhbGxQbHVzSW5pdE9wdHMpOiBSQ0NhbGxQbHVzQ2xpZW50IHtcbiAgICAvLyDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlSW5pdE9wdHMob3B0aW9ucyk7XG4gICAgaWYgKCF2YWxpZGF0ZVJlcy5pc0xlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtDYWxsUGx1c0xpYiBpbnN0YWxsZXIgc3RldXBdJHt2YWxpZGF0ZVJlcy5tc2d9YCk7XG4gICAgfVxuXG4gICAgLy8g5Yib5bu6IGVuZ2luZSBsb2dnZXJcbiAgICBjb25zdCBlbmdpbmVMb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignQ2FsbFBsdXNMaWInLCAnUlRDJyk7XG4gICAgLy8g6K6+572uIOi+k+WHuue6p+WIq1xuICAgIGNvbnN0IG91dHB1dExldmVsID0gaXNVbmRlZmluZWQob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCkgPyBMb2dMLldBUk4gOiBvcHRpb25zLmxvZ091dHB1dExldmVsO1xuICAgIGVuZ2luZUxvZ2dlci5zZXRPdXRwdXRMZXZlbChvdXRwdXRMZXZlbCEpO1xuICAgIGVuZ2luZUxvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTkRFWF9JTlNUQUxMX0NBTExfUExVU19QTFVHSU5fTywgYENhbGxQbHVzIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsUGx1c0NsaWVudChjb250ZXh0LCBlbmdpbmVMb2dnZXIsIHJ1bnRpbWUsIG9wdGlvbnMpO1xuICB9LFxufTtcblxuZXhwb3J0IHtcbiAgaW5zdGFsbGVyLFxuICAvKiBjbGFzcyAqL1xuICBSQ0NhbGxQbHVzQ2xpZW50LFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNBdWRpb0NvbmZpZ0J1aWxkZXIsXG4gIFJDVmlkZW9Db25maWdCdWlsZGVyLFxufTtcbi8qKlxuICog5a+85Ye65p6a5Li+5ZKM5o6l5Y+j5a6a5LmJXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29yZS9hcGkvaW50ZXJmYWNlJztcbiJdLCJuYW1lcyI6WyJSQ0NhbGxQbHVzQ29kZSIsIlJDQ2FsbFBsdXNMb2dnZXJUYWciLCJSQ0NhbGxQbHVzU2Vzc2lvbiIsIl9zZXNzaW9uIiwiX2NhbGxFbmdpbmUiLCJfbG9nZ2VyIiwiX19wdWJsaWNGaWVsZCIsInVzZXIiLCJ1c2VySWQiLCJ1c2VyU3RhdGUiLCJjYW1lcmFFbmFibGUiLCJtaWNyb3Bob25lRW5hYmxlIiwidHJhY2VJZCIsImNvZGUiLCJjbGllbnRTdGFydFRpbWUiLCJkYXRhIiwiUkNDYWxsUGx1c1R5cGUiLCJSQ0NhbGxQbHVzVHlwZTIiLCJSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlMiIsIlJDQ2FsbFBsdXNDYWxsU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IiwiUkNDYWxsUGx1c1JlYXNvbiIsIlJDQXVkaW9Db25maWdCdWlsZGVyIiwibWljcm9waG9uZUlkIiwibWluIiwibWF4IiwiaXNOdW1iZXIiLCJzYW1wbGVSYXRlIiwiUkNWaWRlb0NvbmZpZ0J1aWxkZXIiLCJSQ0NhbGxQbHVzUmVzb2x1dGlvbiIsIlJDQ2FsbFBsdXNGcmFtZVJhdGUiLCJmcHMiLCJyZXNvbHV0aW9uIiwiY2FtZXJhSWQiLCJ0cmFuMkNhbGxMb2ciLCJjYWxsTG9nTGlzdCIsImNhbGxJZCIsImNhbGxUeXBlIiwiY2FsbERpciIsIm1lZGlhVHlwZSIsImNhbGxpbmdVc2VySWQiLCJjYWxsVXNlcklkcyIsImNhbGxTdGF0dXMiLCJzZXNzaW9uU3RhdHVzIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsImR1cmF0aW9uIiwic2VjcmV0Q2hhdCIsInN5bmNUaW1lIiwic3lzU3RhdHVzIiwiY3J0VGltZSIsInBhcnNlU3RhdHVzRGF0YSIsInJpbmdpbmdEYXRhIiwiaGFuZ3VwRGF0YSIsImFjY2VwdERhdGEiLCJvdGhlckludml0ZWREYXRhIiwiaXRlbSIsInZhbGlkYXRlVmlkZW9Ob2RlTmFtZSIsImVsZW1lbnQiLCJ2YWxpZGF0ZVN5c1N0YXRlIiwiY3J0U3RhdGUiLCJuZXdTdGF0ZSIsImlzSW5WYWxpZCIsImludmFsaWRTdGF0ZXMiLCJ2YWxpZGF0ZVVzZXJTdGF0ZSIsImdldEhhbmd1cFN5c3RlbVN0YXRlIiwiaXNDYWxsZWUiLCJzeXN0ZW1TdGF0ZSIsImlzU3VwcG9ydE1lZGlhU2VydmVyIiwibmF2aUluZm8iLCJ2b2lwQ2FsbEluZm8iLCJzdHJhdGVneSIsInZhbGlkYXRlQml0cmF0ZSIsIm1pbkJpdHJhdGUiLCJtYXhCaXRyYXRlIiwiUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWciLCJSQ0NhbGxQTHVzU3RhdGlzdGljcyIsIl9jb250ZXh0IiwidGFnIiwic2Vzc2lvbiIsImNsaWVudENhbGxJZCIsImludml0ZVNvdXJjZSIsImV4dHJhIiwibm93VGltZSIsImNvbW1vbkRhdGEiLCJEaWFsb2dBY3Rpb24iLCJEaWFsb2dUeXBlIiwiU2VjcmV0Q2FsbFR5cGUiLCJTZWNyZXRDYWxsVHlwZTIiLCJDYWxsVGltZXJFdmVudFR5cGUiLCJSQ0NhbGxJbm5lclNlc3Npb24iLCJFdmVudEVtaXR0ZXIiLCJfY2FsbElkIiwiX3N0YXRlIiwiX2NhbGxUeXBlIiwiX21lZGlhVHlwZSIsIl9zdGFydENhbGxlcklkIiwiX2NhbGxlcklkIiwiX2NhbGxVc2VycyIsImVuYWJsZSIsInVzZXJzIiwiY2hhbmdlZFVzZXJzIiwibmV3VXNlclN0YXRlIiwibmV3U3RhdGVUaW1lIiwibmV3U3lzU3RhdGUiLCJoYXNVc2VyIiwiaSIsIm9sZFN0YXRlVGltZSIsIm9sZFN5c3RlbVN0YXRlIiwib2xkVXNlclN0YXRlIiwiaXNJbnZhbGlkU3lzU3RhdGUiLCJpc0ludmFsaWRVc2VyU3RhdGUiLCJpc0ludmFsaWRPbnBob25lRW5kIiwiZXJyIiwic3RhdGUiLCJ0eXBlIiwidGltZXJJZCIsImlzTG9jYWxDbGllbnRIYW5ndXAiLCJDYWxsU2VydmVyQWN0aW9uIiwidGltZXJTZXRUaW1lb3V0IiwiZnVuYyIsInRpbWVvdXQiLCJzbGVlcCIsIm1pbGxpc2Vjb25kIiwicmVzb2x2ZSIsIm5lZWRSZXRyeUNvZGUiLCJFcnJvckNvZGUiLCJSQ1JUQ0NvZGUiLCJyZXRyeUFzeW5jRm4iLCJhc3luY0ZuIiwiZm5BcmdzIiwiY3VycmVudFJldHJ5VGltZSIsIm1heER1cmF0aW9uIiwiaW50ZXJ2YWxzIiwiaW5kZXgiLCJvbkVycm9yIiwicmVzIiwiaXR2IiwiQ2FsbEhvb2tzVHlwZSIsIlB1Ykludml0ZUNhbGxNaXNzUmVhc29uIiwiUHViSW52aXRlQ2FsbE1pc3NSZWZlciIsIlNpZ25hbFRyYW5zcG9ydGVyIiwiX3J1bnRpbWUiLCJfaW5pdE9wdHMiLCJfdGltZUNvcnJlY3Rpb25lciIsImdldFVVSUQyMiIsImxpc3RlbmVyIiwibXNnIiwidG9Vc2VycyIsInRhcmdldFR5cGUiLCJ0YXJnZXRJZCIsIm5pY2tOYW1lIiwib2xkUm9vbUlkIiwiY2FsbElkcyIsIm9wdHMiLCJSQ0Nvbm5lY3Rpb25TdGF0dXMiLCJrZXkiLCJvcHRpb25zIiwidmFsdWUiLCJyZXN1bHQiLCJzZXJ2ZXJLZXkiLCJzZXJ2ZXJWYWwiLCJwYXJzZWREYXRhIiwiaW5mbyIsImRldmljZUlkIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJpc0RpcmVjdGx5IiwiY3VycmVudFVJZCIsImN1cnJlbnRVc2VyIiwiZGlhbG9nVHlwZSIsImFjdGlvbiIsImV4dHJhS2V5VmFsIiwiY2FsbFNlc3Npb25Vc2VycyIsInRvRGV2aWNlSWQiLCJjYWxsRGlhbG9nRW50aXR5cyIsInN0cmluZzEwdG82NCIsIm51bWJlciIsImNoYXJzIiwicmFkaXgiLCJxdXRpZW50IiwiYXJyIiwibW9kIiwiZ2V0VVVJRCIsImMiLCJyIiwidXVpZCIsIkNBTExfREJfTkFNRSIsIkRCX1ZFUlNJT04iLCJsb2dnZXIiLCJfUkNDYWxsSW5kZXhEQiIsInJlcSIsImV2Iiwib2JqTmFtZSIsIl9hIiwidmFsIiwicmVqZWN0IiwiUkNDYWxsSW5kZXhEQiIsIkFibm9ybWFsQ2FsbCIsIm9ialN0b3JlIiwidXNlckFibm9ybWFsQ2FsbElkcyIsImlkIiwiQ2FsbFNlcnZlckV2ZW50VHlwZSIsIlJDQ2FsbFBsdXNJbm5lckNvZGUiLCJUaW1lQ29ycmVjdGlvbmVyIiwiX3NpbmdsZUNhbGxEdXJhdGlvbkV2Iiwic2VydmVyU3RhcnRUaW1lIiwiY3VycmVudFJUVCIsImNsaWVudEZpcnN0RnJhbWVUaW1lIiwiRm9yd2FyZFR5cGUiLCJSQ0NhbGxQbHVzSW52aXRlU291cmNlIiwiUkNDYWxsRGlyZWN0aW9uIiwiQ0FMTF9USU1FX09VVCIsIl9SQ0NhbGxFbmdpbmUiLCJfcmVwb3J0QXBwRXZlbnRNb2R1bGUiLCJjdXJyZW50VXNlcklkIiwiYnVzeWxpbmVVc2VycyIsImludml0ZXJUaW1lcklkIiwic2VsZlN0YXRlIiwiaW52aXRlZXNTdGF0ZSIsImJ1c3lVc2Vyc1N0YXRlIiwiYnVzeVVzZXJJZCIsImludml0ZWRVc2Vyc1N0YXRlIiwiYnVzeWxpbmVVc2Vyc1N0YXRlIiwidHJhbnNhY3Rpb25JZCIsInJlcU1lZGlhVHlwZSIsImNhbGxMb2ciLCJyZXNEYXRhIiwibGlzdCIsInVzZXJTZXNzaW9uU3RhdHVzIiwiY2FsbERpcmVjdGlvbiIsInNlc3Npb25Vc2VycyIsImlubmVyU2Vzc2lvbiIsIm5ld1VzZXJzIiwiaXNJZGxlIiwibm93IiwiZGVsYXlUaW1lIiwic3RyZWFtUmVhZHlUaW1lIiwiY3VycmVudFVzZXJTeXN0ZW1TdGF0ZSIsImhvbGRDYWxsSWQiLCJzdGF0ZVRpbWUiLCJpbnZpdGVVc2VySWQiLCJpbnZpdGVlVGltZXJJZCIsImNhbGxQbHVzU2Vzc2lvbiIsIm90aGVyc1N0YXRlIiwic3RhdHVzVGltZSIsIm90aGVySW52aXRlZE1lbWJlciIsIl9iIiwiX2MiLCJpbnZpdGVkTWVtYmVyIiwidXNlcnNTdGF0ZSIsImNhbGxTZXNzaW9uYVN0YXR1cyIsInNlc3Npb25TdGF0ZSIsInVuTmVlZFVwU3RhdGUiLCJzdGFydENhbGxlcklkIiwiX2QiLCJzZWxmRW5kIiwic3RhdGVzIiwiaXNNYWluU2Vzc2lvbiIsImN1cnJlbnRVc2VyU2F0ZSIsImV2ZW50VGltZSIsImV2ZW50QXJncyIsImV2ZW50VHlwZSIsImZyb21Vc2VySWQiLCJmaXJzdEZyYW1lVGltZSIsInByb21vdGVySWQiLCJyZWFzb24iLCJjdXJyZW50Q2FsbElkIiwib2xkVHJhbnNJZCIsIm9sZEFjdGlvbiIsIk9sZE1lZGlhVHlwZSIsImNoYW5nZU1lZGlhVHlwZVJlc3VsdCIsIl9lIiwiaXNTZWxmSGFuZ3VwIiwiY2xvc2VkU2Vzc2lvbiIsImNydFVzZXJEYXRhIiwiaGFuZ3VwUmVhc29uIiwiaXNOZWVkVXAiLCJpbnZpdGVyVXNlcklkIiwiUkNDYWxsRW5naW5lIiwiUlRDUmVzb3VyY2VUYWciLCJfUlRDTW9kdWxlIiwiZGVmYXVsdFZpZGVvVHJhY2siLCJ0cmFjayIsImRlZmF1bHRBdWRpb1RyYWNrIiwidmlkZW9Db25maWciLCJhdWRpb0NvbmZpZyIsImlzQm9vbGVhbiIsImxvY2FsVHJhY2siLCJyb29tIiwicm9vbVVzZXJzSWQiLCJlcnJvciIsInB1YlBhcmFtcyIsImN1cnJlbnRSb29tSWQiLCJyZWNlbnRUcmFja3MiLCJsb2NhbFRyYWNrcyIsIm5lZWREZXN0cm95VHJhY2siLCJuZXdUcmFjayIsInRyYWNrcyIsIlJUQ01vZGUiLCJzdWJUaW55IiwiYnlTZXJ2ZXIiLCJ1c2VySWRzIiwidmlkZW9UcmFjayIsImF1ZGlvVHJhY2siLCJhdWRpb0xldmVsUmVwb3J0TGlzdCIsInJvb21JZCIsImtpY2tFeHRyYSIsIlJDS2lja1JlYXNvbiIsIm5lZWRTdWJUcmFja3MiLCJpc1RpbnkiLCJyZXBvcnQiLCJzZW5kZXJzIiwicmVjZWl2ZXJzIiwia2luZCIsInBhY2tldHNMb3N0UmF0ZSIsInJ0dCIsInRyYWNrSWQiLCJiaXRyYXRlIiwiaGVscGVyIiwibG9jYWxWaWRlb1RyYWNrIiwibG9jYWxBdWRpb1RyYWNrIiwiUkNMb2NhbFRyYWNrIiwidmlkZW9FbGVtZW50Iiwic3ViUGFyYW1zIiwidW5zdWJUcmFja3MiLCJ2aWRlb1ZpZXciLCJSVENNb2R1bGUiLCJSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIiwiZXZlbnROYW1lIiwiYXR0cnMiLCJoYW5kbGUiLCJpbnZpdGVlVXNlckxpc3QiLCJyZWNvcmQiLCJjYWxsRmlyc3RGcmFtZVRpbWUiLCJhdWRpb0xldmVsIiwiQ2FsbFNlcnZlckVycm9yQ29kZSIsIlJDQ2FsbFBsdXNDbGllbnQiLCJuZXdTZXNzaW9uIiwibWFpblNlc3Npb24iLCJub3RFbXB0eUFycmF5Iiwibm90RW1wdHlTdHJpbmciLCJpc1VuZGVmaW5lZCIsImNmZyIsImZyYW1lUmF0ZSIsImVycm9yTXNnIiwiZ2V0TWVkaWFUcmFja3NDb2RlIiwiZ2V0U2Vzc2lvbkNvZGUiLCJidXN5VXNlcnMiLCJob2xkU2Vzc2lvbiIsImhhbmd1cE1haW5TZXNzaW9uQ29kZSIsIm1haW5TZXNzaW9uQ2FsbElkIiwiaGFuZ3VwU2Vzc2lvbiIsInVzZXJJbmZvIiwib2xkTWVkaWFUeXBlIiwidG9Vc2VySWRzIiwiaXNBZ3JlZSIsInN0YXJ0VGltZXN0YW1wIiwiY291bnQiLCJ1bm11dGVDb2RlIiwiZGV2aWNlIiwidmFsaWRhdGVJbml0T3B0cyIsImlzT2JqZWN0IiwiaW5zdGFsbGVyIiwicnVudGltZSIsIlZlcnNpb25NYW5hZ2UiLCJjb250ZXh0IiwidmFsaWRhdGVSZXMiLCJlbmdpbmVMb2dnZXIiLCJvdXRwdXRMZXZlbCIsIkxvZ0wiXSwibWFwcGluZ3MiOiI2Z0JBR08sTUFBTUEsRUFBaUIsQ0FJNUIsUUFBUyxFQUlULFlBQWEsTUFJYixjQUFlLE1BSWYsWUFBYSxNQUliLGtCQUFtQixNQUluQixlQUFnQixNQUloQix3QkFBeUIsTUFJekIsa0JBQW1CLE1BSW5CLGdCQUFpQixNQUlqQix1QkFBd0IsTUFJeEIsZ0JBQWlCLE1BSWpCLHFDQUFzQyxNQUl0QyxvQkFBcUIsTUFJckIsY0FBZSxNQUlmLGtCQUFtQixNQUluQix3QkFBeUIsTUFJekIsdUJBQXdCLE1BSXhCLGtCQUFtQixNQUluQixtQkFBb0IsS0FDdEIsRUNoRlksSUFBQUMsR0FBQUEsSUFDVkEsRUFBQSxtQ0FBcUMscUNBSXJDQSxFQUFBLHVDQUF5Qyx5Q0FJekNBLEVBQUEsd0NBQTBDLDBDQUkxQ0EsRUFBQSwrQ0FBaUQsaURBQ2pEQSxFQUFBLGdEQUFrRCxrREFJbERBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHlDQUEyQywyQ0FDM0NBLEVBQUEseUNBQTJDLDJDQUMzQ0EsRUFBQSxzQ0FBd0Msd0NBSXhDQSxFQUFBLHFDQUF1Qyx1Q0FDdkNBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxzQ0FBd0Msd0NBQ3hDQSxFQUFBLDBDQUE0Qyw0Q0FJNUNBLEVBQUEsNEJBQThCLDhCQUM5QkEsRUFBQSw0QkFBOEIsOEJBSTlCQSxFQUFBLCtCQUFpQyxpQ0FDakNBLEVBQUEsK0JBQWlDLGlDQUlqQ0EsRUFBQSxvQ0FBc0Msc0NBSXRDQSxFQUFBLG9DQUFzQyxzQ0FJdENBLEVBQUEsMkJBQTZCLDZCQUk3QkEsRUFBQSwyQkFBNkIsNkJB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
1
+ (function(g,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],l):(g=typeof globalThis<"u"?globalThis:g||self,l(g.CallPlus={},g.RCEngine,g.RCRTC))})(this,function(g,l,N){"use strict";var ke=Object.defineProperty;var Fe=(g,l,N)=>l in g?ke(g,l,{enumerable:!0,configurable:!0,writable:!0,value:N}):g[l]=N;var I=(g,l,N)=>(Fe(g,typeof l!="symbol"?l+"":l,N),N);const a={SUCCESS:0,PARAM_ERROR:80001,SESSION_EXIST:80002,NOT_IN_CALL:80003,MEDIATYPE_INVALID:80004,NOT_VIDEO_CALL:80005,RTC_SERVICE_UNAVAILABLE:80006,USER_LIST_INVAILD:80007,CALL_ID_INVALID:80008,TRANSACTION_ID_INVALID:80009,USER_ID_INVALID:80010,SINGLE_CALL_NOT_SUPPORT_MULTI_PERSON:80011,SIGNAL_DISCONNECTED:80012,CAMERA_CLOSED:80100,MICROPHONE_CLOSED:80101,MEDIA_RESOURCE_INVALIED:80102,NOT_INSTALL_RTC_PLUGIN:80103,PLAY_MEDIA_FAILED:80104,VIDEO_VIEW_NOT_SET:80105};var n=(t=>(t.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O="L-index_install_call_plus_plugin-O",t.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O="L-callplus_client_set_event_listener-O",t.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O="L-callplus_client_call_event_listener-O",t.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O="L-callplus_client_set_status_report_listener-O",t.L_CALLPLUS_CLIENT_CALL_STATUS_REPORT_LISTENER_O="L-callplus_client_call_status_report_listener-O",t.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T="L-callplus_client_set_video_config-T",t.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R="L-callplus_client_set_video_config-R",t.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O="L-callplus_video_config_set_frame_rate-O",t.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O="L-callplus_video_config_set_resolution-O",t.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O="L-callplus_video_config_set_bitrate-O",t.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T="L-callplus_client_set_audio_config-T",t.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R="L-callplus_client_set_audio_config-R",t.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O="L-callplus_audio_config_set_bitrate-O",t.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O="L-callplus_audio_config_set_sample_rate-O",t.L_CALLPLUS_CLIENT_PREVIEW_T="L-callplus_client_preview-T",t.L_CALLPLUS_CLIENT_PREVIEW_R="L-callplus_client_preview-R",t.L_CALLPLUS_CLIENT_START_CALL_T="L-callplus_client_start_call-T",t.L_CALLPLUS_CLIENT_START_CALL_R="L-callplus_client_start_call-R",t.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T="L-callplus_client_join_multi_call-T",t.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R="L-callplus_client_join_multi_call-R",t.L_CALLPLUS_CLIENT_ACCEPT_T="L-callplus_client_accept-T",t.L_CALLPLUS_CLIENT_ACCEPT_R="L-callplus_client_accept-R",t.L_CALLPLUS_CLIENT_HANGUP_T="L-callplus_client_hangup-T",t.L_CALLPLUS_CLIENT_HANGUP_R="L-callplus_client_hangup-R",t.L_CALLPLUS_CLIENT_INVITE_T="L-callplus_client_invite-T",t.L_CALLPLUS_CLIENT_INVITE_R="L-callplus_client_invite-R",t.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T="L-callplus_client_request_change_media_type-T",t.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R="L-callplus_client_request_change_media_type-R",t.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T="L-callplus_client_cancel_change_media_type-T",t.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R="L-callplus_client_cancel_change_media_type-R",t.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T="L-callplus_client_reply_change_media_type-T",t.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R="L-callplus_client_reply_change_media_type-R",t.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_T="L-callplus_client_get_current_call_session-T",t.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_R="L-callplus_client_get_current_call_session-R",t.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_get_available_call_sessions_from_server-T",t.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_get_available_call_sessions_from_server-R",t.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T="L-callplus_client_get_call_records-T",t.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R="L-callplus_client_get_call_records-R",t.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T="L-callplus_client_delete_call_records_by_callId-T",t.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R="L-callplus_client_delete_call_records_by_callId-R",t.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_delete_all_call_records_from_server-T",t.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_delete_all_call_records_from_server-R",t.L_CALLPLUS_CLIENT_START_CAMERA_T="L-callplus_client_start_camera-T",t.L_CALLPLUS_CLIENT_START_CAMERA_R="L-callplus_client_start_camera-R",t.L_CALLPLUS_CLIENT_STOP_CAMERA_T="L-callplus_client_stop_camera-T",t.L_CALLPLUS_CLIENT_STOP_CAMERA_R="L-callplus_client_stop_camera-R",t.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T="L-callplus_client_switch_camera-T",t.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R="L-callplus_client_switch_camera-R",t.L_CALLPLUS_CLIENT_START_MICROPHONE_T="L-callplus_client_start_microphone-T",t.L_CALLPLUS_CLIENT_START_MICROPHONE_R="L-callplus_client_start_microphone-R",t.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T="L-callplus_client_stop_microphone-T",t.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R="L-callplus_client_stop_microphone-R",t.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T="L-callplus_client_set_video_view-T",t.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R="L-callplus_client_set_video_view-R",t.L_RTC_MODULE_SET_VIDEO_VIEW_O="L-rtc_module_set_video_view-O",t.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T="L-callplus_client_remove_video_view-T",t.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R="L-callplus_client_remove_video_view-R",t.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O="L-rtc_module_remove_video_view-O",t.L_CALLPLUS_CLIENT_PLAY_MEDIA_T="L-callplus_client_play_media-T",t.L_CALLPLUS_CLIENT_PLAY_MEDIA_R="L-callplus_client_play_media-R",t.L_RTC_MODULE_PLAY_MEDIA_T="L-rtc_module_play_media-T",t.L_RTC_MODULE_PLAY_MEDIA_R="L-rtc_module_play_media-R",t.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T="L-rtc_module_set_all_remote_audio_enbale-T",t.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R="L-rtc_module_set_all_remote_audio_enable-R",t.L_RTC_MODULE_SUBSCRIBE_T="L-rtc_module_subscribe-T",t.L_RTC_MODULE_SUBSCRIBE_R="L-rtc_module_subscribe-R",t.L_RTC_MODULE_UNSUBSCRIBE_T="L-rtc_module_unsubscribe-T",t.L_RTC_MODULE_UNSUBSCRIBE_R="L-rtc_module_unsubscribe-R",t.L_RTC_MODULE_PUBLISH_T="L-rtc_module_publish-T",t.L_RTC_MODULE_PUBLISH_R="L-rtc_module_publish-R",t.L_RTC_MODULE_UNPUBLISH_T="L-rtc_module_unpublish-T",t.L_RTC_MODULE_UNPUBLISH_R="L-rtc_module_unpublish-R",t.L_RTC_MODULE_DESTROY_ALL_TRACKS_O="L-rtc_module_destroy_all_tracks-O",t.L_RTC_MODULE_SESSION_CONNECT_T="L-rtc_module_session_connect-T",t.L_RTC_MODULE_SESSION_CONNECT_P="L-rtc_module_session_connect-P",t.L_RTC_MODULE_SESSION_CONNECT_R="L-rtc_module_session_connect-R",t.L_RTC_MODULE_SESSION_CLOSE_T="L-rtc_module_session_close-T",t.L_RTC_MODULE_SESSION_CLOSE_P="L-rtc_module_session_close-P",t.L_RTC_MODULE_SESSION_CLOSE_R="L-rtc_module_session_close-R",t.L_RTC_MODULE_CREATE_VIDEO_TRACK_T="L-rtc_module_create_video_track-T",t.L_RTC_MODULE_CREATE_VIDEO_TRACK_R="L-rtc_module_create_video_track-R",t.L_RTC_MODULE_CREATE_AUDIO_TRACK_T="L-rtc_module_create_audio_track-T",t.L_RTC_MODULE_CREATE_AUDIO_TRACK_R="L-rtc_module_create_audio_track-R",t.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O="L-rtc_module_receive_track_publish-O",t.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O="L-rtc_module_receive_track_unpublish-O",t.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O="L-rtc_module_receive_track_enable_change-O",t.L_RTC_MODULE_RECEIVE_KICK_OFF_O="L-rtc_module_receive_kick_off-O",t.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O="L-rtc_module_receive_peerconnection_except_close-O",t.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T="L-rtc_module_change_media_type-T",t.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R="L-rtc_module_change_media_type-R",t.L_RTC_MODULE_JOIN_RTC_ROOM_T="L-rtc_module_join_rtc_room-T",t.L_RTC_MODULE_JOIN_RTC_ROOM_R="L-rtc_module_join_rtc_room-R",t.L_RTC_MODULE_QUIT_RTC_ROOM_T="L-rtc_module_quit_rtc_room-T",t.L_RTC_MODULE_QUIT_RTC_ROOM_R="L-rtc_module_quit_rtc_room-R",t.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T="L-signal_transporter_single_call-T",t.L_SIGNAL_TRANSPORTER_GROUP_CALL_T="L-signal_transporter_group_call-T",t.L_SIGNAL_TRANSPORTER_INVITE_T="L-signal_transporter_invite-T",t.L_SIGNAL_TRANSPORTER_RING_T="L-signal_transporter_ring-T",t.L_SIGNAL_TRANSPORTER_ACCEPT_T="L-signal_transporter_accept-T",t.L_SIGNAL_TRANSPORTER_ACCEPT_R="L-signal_transporter_accept-R",t.L_SIGNAL_TRANSPORTER_JOIN_CALL_T="L-signal_transporter_join_call-T",t.L_SIGNAL_TRANSPORTER_HANGUP_T="L-signal_transporter_hangup-T",t.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T="L-signal_transporter_call_status_up-T",t.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T="L-signal_transporter_call_event_up-T",t.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T="L-signal_transporter_call_dialog_up-T",t.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T="L-signal_transporter_delete_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T="L-signal_transporter_get_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T="L-signal_transporter_get_call_server_time-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T="L-signal_transporter_get_call_time_info-T",t.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T="L-signal_transporter_get_available_call_list-T",t.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T="L-signal_transporter_clear_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T="L-signal_transporter_get_call_info_by_callId-T",t.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T="L-signal_transporter_user_system_state_up-T",t.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O="L-signal_transporter_receive_call_signal_data-O",t.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O="L-signal_transporter_im_state_change-O",t.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O="L-signal_transporter_receive_invite-O",t.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O="L-signal_transporter_receive_call_status-O",t.L_CALL_ENGINE_UPDATE_USERS_STATE_O="L-call_engine_update_users_state-O",t.L_CALL_ENGINE_IM_STATE_CHANGE_O="L-call_engine_im_state_change-O",t.L_CALL_ENGINE_CALL_TIMEOUT_O="L-call_engine_call_timeout-O",t.L_CALL_ENGINE_START_CALL_TIMER_O="L-call_engine_start_call_timer-O",t.L_CALL_ENGINE_STOP_CALL_TIMER_O="L-call_engine_stop_call_timer-O",t.L_CALL_ENGINE_UP_ON_PHONE_END_T="L-call_engine_up_on_phone_end-T",t.L_CALL_ENGINE_UP_ON_PHONE_END_R="L-call_engine_up_on_phone_end-R",t.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O="L-call_engine_receive_first_frame_time-O",t.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O="L-call_engine_receive_mediatype_change-O",t.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O="L-call_engine_receive_close_session-O",t.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O="L-call_engine_receive_call_record-O",t.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O="L-call_engine_receive_complementary_data-O",t.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T="L-call_engine_create_session_by_server-T",t.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R="L-call_engine_create_session_by_server-R",t.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T="L-call_engine_up_first_frame_time-T",t.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R="L-call_engine_up_first_frame_time-R",t.L_TIME_CORRECT_START_O="L-time_correct_start-O",t.L_TIME_CORRECT_STOP_O="L-time_correct_stop-O",t.L_TIME_CORRECT_RESTART_O="L-time_correct_restart-O",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T="L-time_correct_get_call_client_time_by_server-T",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P="L-time_correct_get_call_client_time_by_server-P",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R="L-time_correct_get_call_client_time_by_server-R",t.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T="L-time_correct_calc_client_start_time-T",t.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R="L-time_correct_calc_client_start_time-R",t.L_TIME_CORRECT_SET_DELTA_TIME_O="L-time_correct_set_delta_time-O",t.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T="L-time_correct_loop_correct_client_time-T",t.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R="L-time_correct_loop_correct_client_time-R",t.L_INNER_SESSION_UPDATE_USER_STATE_O="L-inner_session_update_user_state-O",t.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O="L-inner_session_set_user_device_enable-O",t.L_CALL_PLUS_SESSION_GET_CREATE_TIME_T="L-call_plus_session_get_create_time-T",t.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R="L-call_plus_session_get_create_time-R",t.L_CALL_PLUS_SESSION_GET_DURATION_T="L-call_plus_session_get_duration-T",t.L_CALL_PLUS_SESSION_GET_DURATION_R="L-call_plus_session_get_duration-R",t))(n||{});class K{constructor(s,e,_){I(this,"_startTime",0);I(this,"_duration",0);I(this,"_callId","");this._session=s,this._callEngine=e,this._logger=_,this._callId=this._session.getCallId()}getCallId(){return this._callId}getState(){return this._session.getSessionState()}getCallType(){return this._session.getCallType()}getMediaType(){return this._session.getMediaType()}getUserList(){return this._session.getUserList().map(s=>{const{userId:e,userState:_,cameraEnable:i,microphoneEnable:r}=s;return{userId:e,state:_,cameraEnable:i,microphoneEnable:r}})}getCreatorUserId(){return this._session.getStartCallerId()}getInviterUserId(){return this._session.getCallerId()}async getCreateTimestamp(){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_T,"",s),this._startTime)return{code:a.SUCCESS,startTime:this._startTime};const{code:e,clientStartTime:_}=await this._callEngine.getCallStaringTime({callId:this._callId},s);return e!==a.SUCCESS?(this._logger.error(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R,`errCode: ${e}`,s),{code:e}):(this._logger.info(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R,"success",s),this._startTime=_,{code:a.SUCCESS,startTime:this._startTime})}async getDuration(){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_T,"",s),this._duration)return this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${this._duration}`,s),{code:a.SUCCESS,duration:this._duration};const{code:e,data:_}=await this._callEngine.getCallTimeInfo(this._callId,s);return e!==a.SUCCESS?(this._logger.error(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${_.duration}`,s),this._duration=_.duration,{code:a.SUCCESS,duration:this._duration})}}var D=(t=>(t[t.SINGLE=0]="SINGLE",t[t.MULTI=1]="MULTI",t))(D||{}),d=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ONPHONE=301]="ONPHONE",t[t.ENDED=1e3]="ENDED",t[t.NO_ANSWER=1001]="NO_ANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELLED=1003]="CANCELLED",t[t.DECLINED=1004]="DECLINED",t[t.ERROR=2e3]="ERROR",t))(d||{}),u=(t=>(t[t.AUDIO=0]="AUDIO",t[t.AUDIO_VIDEO=1]="AUDIO_VIDEO",t[t.VIDEO=2]="VIDEO",t))(u||{}),p=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ENDED=1e3]="ENDED",t[t.NOANSWER=1001]="NOANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELED=1003]="CANCELED",t[t.DECLINED=1004]="DECLINED",t[t.ERROR=2e3]="ERROR",t))(p||{}),k=(t=>(t[t.CANCEL_CHANGE_MEDIA_TYPE=0]="CANCEL_CHANGE_MEDIA_TYPE",t[t.REFUSE_CHANGE_MEDIA_TYPE=1]="REFUSE_CHANGE_MEDIA_TYPE",t[t.SERVER_ALLOW_MEDIA_TYPE=2]="SERVER_ALLOW_MEDIA_TYPE",t[t.CHANGE_MEDIA_TYPE_TIMEOUT=3]="CHANGE_MEDIA_TYPE_TIMEOUT",t))(k||{}),A=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ON_PHONE=301]="ON_PHONE",t[t.ON_PHONE_END=302]="ON_PHONE_END",t[t.ON_DEVICE_DISABLE=303]="ON_DEVICE_DISABLE",t[t.ON_DEVICE_ENABLE=304]="ON_DEVICE_ENABLE",t[t.ABNORMAL_END=999]="ABNORMAL_END",t[t.ENDED=1e3]="ENDED",t[t.NO_ANSWER=1001]="NO_ANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELLED=1003]="CANCELLED",t[t.DECLINED=1004]="DECLINED",t[t.OTHER_CLIENT_CALLING=1010]="OTHER_CLIENT_CALLING",t[t.OTHER_CLIENT_ACCEPT=1011]="OTHER_CLIENT_ACCEPT",t[t.JOIN_ROOM_ERR=1105]="JOIN_ROOM_ERR",t[t.PUBLISH_ERR=1106]="PUBLISH_ERR",t[t.SUBSCRIBE_ERR=1107]="SUBSCRIBE_ERR",t[t.ACCEPT_CARRIER=1108]="ACCEPT_CARRIER",t[t.KICKED_BY_SERVER=1109]="KICKED_BY_SERVER",t[t.CONNECTION_ERR=1110]="CONNECTION_ERR",t[t.LOGOUT=1111]="LOGOUT",t[t.OTHER_CLIENT_LOGIN=1112]="OTHER_CLIENT_LOGIN",t[t.OTHER_CLIENT_JOINED=1113]="OTHER_CLIENT_JOINED",t[t.OTHER_CLIENT_IN_ROOM=1114]="OTHER_CLIENT_IN_ROOM",t[t.OTHER_CLIENT_HANGUP=1151]="OTHER_CLIENT_HANGUP",t[t.REMOTE_JOIN_RTC_ERROR=1205]="REMOTE_JOIN_RTC_ERROR",t[t.REMOTE_PUBLISH_ERROR=1206]="REMOTE_PUBLISH_ERROR",t[t.REMOTE_SUBSCRIBE_ERROR=1207]="REMOTE_SUBSCRIBE_ERROR",t[t.REMOTE_KICKED_BY_SERVER=1209]="REMOTE_KICKED_BY_SERVER",t[t.REMOTE_CONNECTION_ERROR=1210]="REMOTE_CONNECTION_ERROR",t[t.REMOTE_LOGOUT=1211]="REMOTE_LOGOUT",t[t.REMOTE_OTHER_CLIENT_LOGIN=1212]="REMOTE_OTHER_CLIENT_LOGIN",t[t.REMOTE_OTHER_JOINED_RTC=1213]="REMOTE_OTHER_JOINED_RTC",t[t.REMOTE_OTHER_CLIENT_IN_RTC=1214]="REMOTE_OTHER_CLIENT_IN_RTC",t))(A||{});class Ee{constructor(s){I(this,"_audioConfig",{});this._logger=s}setDefaultMicrophoneId(s){return this._audioConfig.microphoneId=s,this}setBitrate(s,e){return!l.isNumber(s)||!l.isNumber(e)||e<=0||s<=0||e<s?(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${s}, max and min is a number > 0, max should > min`),this):(this._audioConfig.minBitrate=s,this._audioConfig.maxBitrate=e,this)}setSampleRate(s){return l.isNumber(s)?(this._audioConfig.sampleRate=s,this):(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O,`params error -> sampleRate: ${s}`),this)}build(){return this._audioConfig}}class Le{constructor(s){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});this._logger=s}setFrameRate(s){return N.RCFrameRate[s]?(this._videoConfig.frameRate=s,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O,`params error -> fps: ${s}`),this)}setVideoResolution(s){return N.RCResolution[s]?(this._videoConfig.resolution=s,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O,`params error -> resolution: ${s}`),this)}setDefaultCameraId(s){return this._videoConfig.cameraId=s,this}setBitrate(s,e){return!l.isNumber(s)||!l.isNumber(e)||e<=0||s<=0||e<s?(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${s}, max and min is a number > 0, max should > min`),this):(this._videoConfig.minBitrate=s,this._videoConfig.maxBitrate=e,this)}build(){return this._videoConfig}}const ce=t=>{const{callId:s,callType:e,callDir:_,mediaType:i,callingUserId:r,callUserIds:o,callStatus:E,sessionStatus:L,startTime:c,endTime:T,duration:S,secretChat:C,syncTime:h,sysStatus:f,crtTime:U}=t;return{callId:s,callType:e,callDirection:_,mediaType:i,callerUserId:r,callUserIds:o,sessionState:E,userState:L,startTimestamp:c,endTimestamp:T,duration:S,syncTimestamp:h,systemState:f,createTimestamp:U}},de=t=>{const{callId:s,callStatus:e}=t,_=[],i=[],r=[],o=[];return t.callSessionUsers.forEach(E=>{const{userId:L,sessionStatus:c,sysStatus:T}=E;switch(c){case d.INVITED:o.push({callId:s,userId:L,userState:c});break;case d.RINGING:_.push({callId:s,fromUserId:L});break;case d.CONNECTING:r.push({fromUserId:L});break;case d.CANCELLED:case d.DECLINED:case d.ENDED:case d.IDLE:i.push({callId:s,fromUserId:L,userState:c,systemState:T});break}}),{ringingData:_,hangupData:i,acceptData:r,otherInvitedData:o}},he=t=>t&&t.nodeName&&t.nodeName.toUpperCase()==="VIDEO",Ne=(t,s)=>{let e=!1;const _=[A.INVITED,A.RINGING,A.BUSYLINE_RINGING,A.BUSYLINE_WAIT,A.CONNECTING,A.ONCALL];switch(t){case A.ONCALL:_.includes(s)&&(e=!0);break}return e},Ae=(t,s)=>{let e=!1;const _=[d.INVITED,d.RINGING,d.BUSYLINE_RINGING,d.BUSYLINE_WAIT,d.CONNECTING,d.ONCALL];switch(t){case d.ONCALL:_.includes(s)&&(e=!0);break}return e},Re=(t,s)=>{let e;switch(t){case d.CALLING:e=A.CANCELLED;break;case d.RINGING:case d.INVITED:e=A.DECLINED;break;case d.CONNECTING:e=s?A.DECLINED:A.CANCELLED;break;case d.ONCALL:e=A.ENDED;break}return e},ee=t=>{const{voipCallInfo:s}=t;if(!s)return!1;const{strategy:e}=JSON.parse(s);return e===1},Te=(t,s)=>(t||t===0)&&(!l.isNumber(t)||t<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> minBitrate: a number of > 0, value: ${t}`}:(s||s===0)&&(!l.isNumber(s)||s<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: a number of > 0, value: ${s}`}:t&&s&&s<t?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: ${s}, minBitrate: ${t}, maxBitrate should > minBitrate`}:{code:a.SUCCESS},Se=t=>{const s=[];for(const e in t){const{videoView:_,isTiny:i}=t[e];s.push({userId:e,videoView:_.nodeName,isTiny:i})}return s};var F=(t=>(t.L_QS_START_CALL_S="Call-start-S",t.L_QS_ACCEPT_CALL_S="Call-accept-S",t.L_QS_HANGUP_CALL_S="Call-hangup-S",t.L_QS_RECEIVE_CALL_S="Call-recv-S",t.L_QS_ABNORMAL_HANGUP_S="Call-interrupt-S",t))(F||{});class Oe{constructor(s,e){this._logger=s,this._context=e}reportStatisticsData(s,e,_,i,r,o,E){const L=+new Date,{mediaType:c,callType:T,callId:S}=i?{mediaType:i.getMediaType(),callType:i.getCallType(),callId:i.getCallId()}:E,C={cr:"unknown",net:"unknown",cod:e,mtp:c,ctp:T,cid:S,time:L,uid:this._context.getCurrentId()};r&&Object.assign(C,{ccid:r});let h=null;switch(s){case F.L_QS_RECEIVE_CALL_S:h={...C,rf:o};break;case F.L_QS_ABNORMAL_HANGUP_S:h={...C};break;default:h={...C,dur:L-_}}this._logger.info("L-call-plus-statistic",JSON.stringify(h),s),this._logger.__statistics(s,JSON.stringify(h))}}var v=(t=>(t.REQUEST="request",t.ACCEPT="accept",t.REFUSE="refuse",t.CANCEL="cancel",t.NOTICE="notice",t.TIMEOUT="timeout",t))(v||{}),W=(t=>(t[t.SWITCH_MEDIA_TYPE=1]="SWITCH_MEDIA_TYPE",t))(W||{}),_e=(t=>(t[t.NORMAL=0]="NORMAL",t[t.SECRET=1]="SECRET",t))(_e||{}),te=(t=>(t.INVITER="inviter",t.INVITEE="invitee",t))(te||{});class ie extends l.EventEmitter{constructor(e,_,i,r,o,E,L,c){super();I(this,"_reqMediaType");I(this,"_inviterTimerId");I(this,"_inviteeTimerId");I(this,"_oldDialogData");I(this,"isLocalClientHangup",!1);this._callId=e,this._state=_,this._callType=i,this._mediaType=r,this._startCallerId=o,this._callerId=E,this._callUsers=L,this._logger=c}getCallId(){return this._callId}getSessionState(){return this._state}getCallType(){return this._callType}getMediaType(){return this._mediaType}getStartCallerId(){return this._startCallerId}getCallerId(){return this._callerId}getUserList(){return this._callUsers}getReqMediaType(){return this._reqMediaType}getInviterTimerId(){return this._inviterTimerId}getInviteeTimerId(){return this._inviteeTimerId}getAllTimerIds(){return[this._inviterTimerId,this._inviteeTimerId]}setUserDeviceEnable(e,_,i,r){this._logger.info(n.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O,`userId: ${e}, mediaType: ${_}, enable: ${i}`,r);const o=this._callUsers.find(E=>e===E.userId);_===u.AUDIO?o.microphoneEnable=i:o.cameraEnable=i}updateUserList(e,_){const i=[];return e.forEach(r=>{const{userState:o,stateTime:E,systemState:L}=r;if([d.CALLING,d.INVITED,d.BUSYLINE_WAIT].includes(o))this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`push user: ${JSON.stringify(r)}`,_),this._callUsers.push(r),i.push(r);else{let T=!1;for(let S=0;S<this._callUsers.length;S++){const{userId:C,stateTime:h,systemState:f,userState:U}=this._callUsers[S];if(C===r.userId){T=!0;const m=Ne(f,L),y=Ae(U,o),R=L===A.ON_PHONE_END&&f!==A.ON_PHONE&&o!==d.IDLE;if(E&&h&&E<h||m&&y){try{this._logger.warn(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`timeout user state: old:${JSON.stringify({userId:C,oldStateTime:h,oldSystemState:f,oldUserState:U})}; new:${JSON.stringify(r)}`,_)}catch(M){this._logger.error(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList err: ${M.message}`,_)}break}else{this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> cover ${JSON.stringify(r)}`,_),this._callUsers[S]=r,!R&&i.push(r);break}}}T||(this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> nouser push ${JSON.stringify(r)}`,_),this._callUsers.push(r),i.push(r))}}),i}setOldDialogData(e){this._oldDialogData=e}updateSessionState(e){this._state=e}updateCallType(e){this._callType=e}updateMediaType(e){this._mediaType=e}updateReqMediaType(e){this._reqMediaType=e}updateTimerId(e,_){e==="inviter"?this._inviterTimerId=_:this._inviteeTimerId=_}getOldDialogData(){return this._oldDialogData}setIsLocalClientHangup(e){this.isLocalClientHangup=e}getIsLocalClientHangup(){return this.isLocalClientHangup}}var O=(t=>(t.START_SINGLE_CALL="startSingleCall",t.START_GROUP_CALL="startGroupCall",t.INVITE_CALL="inviteCall",t.PUB_INVITE_CALL="pubInviteCall",t.RINGING_CALL="ringCall",t.ACCEPT_CALL="acceptCall",t.JOIN_CALL="joinCall",t.HANGUP_CALL="hangupCall",t.STATUS_UP_CALL="statusUpCall",t.STATUS_DOWN_CALL="statusDownCall",t.EVENT_UP_CALL="eventUpCall",t.EVENT_DOWN_CALL="eventDownCall",t.DIALOG_UP_CALL="dialogUpCall",t.DIALOG_DOWN_CALL="dialogDownCall",t.GET_CALL_USER_SESSION_LIST="getCallUSerSessionList",t.SYNC_CALL_LOG="syncCallLog",t.PUB_CALL_LOG="pubCallLog",t.DEL_CALL_LOG="deleteCallLog",t.QRY_CALL_STATE="queryUserHasCall",t.QRY_SRV_TIMESTAMP="getCallSrvTimeStamp",t.GET_CALL_STATE_LIST="getUserCallStateList",t.CLEAR_CALL_LOG="cleanCallLog",t.GET_CALL_SESSION="getCallSession",t.GET_CALL_TIME_INFO="getCallTimeInfo",t.END_ABNORMAL_CALL="endUserAbnormalCalls",t.SYS_STATUS_UP="sysStatusUp",t.UP_CALL_LOG_READED="upCallLogReaded",t.PUB_CALL_LOG_READED="pubCallLogReaded",t.PUB_NACK_SEQ_ID="pubNACKSeqId",t.GET_USER_CALL_SESSION_ID_LIST="getUserCallSessionIdList",t))(O||{});const se=(t,s)=>setTimeout(t,s),ue=t=>new Promise(s=>{setTimeout(s,t)}),ge=[l.ErrorCode.RC_NET_CHANNEL_INVALID,l.ErrorCode.RC_NET_UNAVAILABLE,l.ErrorCode.RC_MSG_RESP_TIMEOUT,N.RCRTCCode.SIGNAL_DISCONNECTED,N.RCRTCCode.REQUEST_FAILED],j=async({asyncFn:t,fnArgs:s,currentRetryTime:e=Date.now(),maxDuration:_=60*1e3,intervals:i=[2*1e3,4*1e3,8*1e3,16*1e3,32*1e3,64*1e3],index:r=0,onError:o})=>{const E=await t(...s),L=2*1e3;return E.code===a.SUCCESS||!ge.includes(E.code)||Date.now()+L-e>_?E:(o&&o(E.code),await ue(L),j({asyncFn:t,fnArgs:s,currentRetryTime:e,maxDuration:_,intervals:i,index:r,onError:o}))};var x=(t=>(t.onBeforePublish="onBeforePublish",t.onPublishRes="onPublishRes",t.onPubInviteCall="onPubInviteCall",t.onPubInviteCallPullKv="onPubInviteCallPullKv",t.onPubInviteCallMiss="onPubInviteCallMiss",t))(x||{}),X=(t=>(t.NOT_CURRENT_DEVICEID="not current device id",t.SECRET_CALL="secret call",t.NOT_INVITEE="not an invitee",t))(X||{}),Y=(t=>(t.PUB_INVITE="pubinvitecall",t.PULL_KV_INVITE="pullkv_invitecall",t.PUSH="system_pubsh",t))(Y||{});class Ue extends l.EventEmitter{constructor(e,_,i,r,o){super();I(this,"_listener");I(this,"_needRetryActions",[O.START_SINGLE_CALL,O.START_GROUP_CALL,O.ACCEPT_CALL,O.JOIN_CALL,O.EVENT_UP_CALL]);I(this,"_sessionId","");this._context=e,this._runtime=_,this._initOpts=i,this._timeCorrectioner=r,this._logger=o,this._context.onCallInfo=this._onRecvCallSignal.bind(this),this._context.onconnectionstatechange=this._onIMConnectionStateChange.bind(this),this._sessionId=l.getUUID22()}getSessionId(){return this._sessionId}registerListener(e){this._listener=e}async startCall(e,_){const{clientCallId:i,callType:r,toUsers:o,mediaType:E,secretChat:L,targetType:c,targetId:T,nickName:S,oldRoomId:C}=e;return r===D.SINGLE?this.startSingleCall({clientCallId:i,toUserId:o[0].userId,mediaType:E,secretChat:L,targetType:c,targetId:T,oldRoomId:C,toOrgId:o[0].orgId||""},_):this.startGroupCall({clientCallId:i,toUsers:o,mediaType:E,targetType:c,targetId:T,nickName:S,oldRoomId:C},_)}async startSingleCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(this._context.getCurrentId(),O.START_SINGLE_CALL,e)}async startGroupCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GROUP_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(this._context.getCurrentId(),O.START_GROUP_CALL,e)}async inviteCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_INVITE_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.INVITE_CALL,e)}async ringingCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_RING_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.RINGING_CALL,e)}async acceptCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_ACCEPT_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.ACCEPT_CALL,e)}async joinCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_JOIN_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.JOIN_CALL,e)}async hangupCall(e,_){this._logger.info(n.L_SIGNAL_TRANSPORTER_HANGUP_T,`params: ${JSON.stringify(e)}`,_);const{code:i}=await this._sendCallSignal(e.callId,O.HANGUP_CALL,e);return i===a.NOT_IN_CALL?{code:a.SUCCESS}:{code:i}}async statusUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T,`call status up params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.STATUS_UP_CALL,e)}async eventUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.EVENT_UP_CALL,e)}async dialogUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.DIALOG_UP_CALL,e)}async deleteCallRecord(e,_,i){return this._logger.info(n.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T,`callIds: ${JSON.stringify(_)}`,i),this._sendCallSignal(e,O.DEL_CALL_LOG,{callIds:_})}async syncCallLog(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.userId,O.SYNC_CALL_LOG,e)}async queryUserHasCall(){const e=this._context.getCurrentId();return this._sendCallSignal(e,O.QRY_CALL_STATE,null)}async getCallServerTimestamp(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T,`userId: ${_}`,e),this._sendCallSignal(_,O.QRY_SRV_TIMESTAMP,null)}async getCallTimeInfo(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T,`callId: ${e}`,_),this._sendCallSignal(e,O.GET_CALL_TIME_INFO,{callId:e})}async getUserCallStateList(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T,`userId: ${_}`,e),this._sendCallSignal(_,O.GET_CALL_STATE_LIST,null)}async clearCallRecord(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T,`userId: ${_}`,e),this._sendCallSignal(_,O.CLEAR_CALL_LOG,null)}async getCallSession(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T,`callId: ${e.callId}`,_),this._sendCallSignal(e.callId,O.GET_CALL_SESSION,e)}async sysStatusUp(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T,`opts: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.SYS_STATUS_UP,e)}async upCallLogReaded(e){const _=this._context.getCurrentId();return this._sendCallSignal(_,O.UP_CALL_LOG_READED,e)}_onIMConnectionStateChange(e){const _=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O,`state: ${e}`,_),this._listener.onIMStateChange(e),e===l.RCConnectionStatus.CONNECTED?this._timeCorrectioner.start(_):this._timeCorrectioner.stop(_)}async _sendCallSignal(e,_,i){const r=i?JSON.stringify({...i,sessionId:this._sessionId}):"";let o;this._needRetryActions.includes(_)?o=await j({asyncFn:this._context.setCallInfo.bind(this._context),fnArgs:[e,_,r]}):o=await this._context.setCallInfo(e,_,r);const{code:E,data:L}=o;if(E!==l.ErrorCode.SUCCESS)return{code:E};const{key:c,value:T}=L,S=JSON.parse(T).data;return{code:a.SUCCESS,data:S}}_onRecvCallSignal(e){const _=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O,`data: ${e}`,_),JSON.parse(e).list.forEach(r=>{const{key:o}=r,E=JSON.parse(r.value);switch(o){case O.PUB_INVITE_CALL:this._onPubInviteCall(E,!0,_);break;case O.STATUS_DOWN_CALL:this._onStatusDownCall(E,_);break;case O.EVENT_DOWN_CALL:this._onEventDownCall(E,_);break;case O.DIALOG_DOWN_CALL:this._onDialogDownCall(E,_);break;case O.PUB_CALL_LOG:this._onPubCallLog(E,_);break;case O.PUB_CALL_LOG_READED:break;case O.PUB_NACK_SEQ_ID:break;default:this._onConpensationData(E,_);break}})}_isValidData(e){return!!(l.isNull(e)||l.isString(e)&&((e==null?void 0:e.length)===0||e===this._sessionId))}_onPubInviteCall(e,_=!0,i){try{const r=this._context.getCurrentId(),o=e.callSessionUsers.find(L=>L.userId===r),E=this._context.getConnectionStatus();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`currentUser: ${JSON.stringify(o)}, currentUserId: ${r}, state: ${E}`,i)}catch(r){this._logger.error(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`error: ${r.message}`,i)}if(!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,i);const r={extra:JSON.stringify(e),reason:X.NOT_CURRENT_DEVICEID,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE};_?this.emit(x.onPubInviteCallMiss,Object.assign(e,r)):this.emit(x.onPubInviteCallMiss,Object.assign(e,r));return}this._listener.onInvite(e,_,i),_?this.emit(x.onPubInviteCall,Object.assign(e,{extra:JSON.stringify(e)})):this.emit(x.onPubInviteCallPullKv,Object.assign(e,{extra:JSON.stringify(e)}))}_onStatusDownCall(e,_){if(e.callSessionUsers=e.callSessionUsers.filter(i=>!!i.changed),this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,"",_),!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,_),this._listener.onOtherClientStatusDown(e,_);return}this._listener.onStatusDown(e,_,this._sessionId)}_onEventDownCall(e,_){this._listener.onEventDown(e,_)}_onDialogDownCall(e,_){const{dialogType:i,action:r,extraKeyVal:o}=e;switch(i){case W.SWITCH_MEDIA_TYPE:this._listener.onSwitchMediaType(e,_);break}}_onPubCallLog(e,_){this._logger.info(n.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O,`call record: ${JSON.stringify(e)}`,_),this._listener.onRecvCallEndLog(e,_)}_onConpensationData(e,_){this._logger.info(n.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O,"",_);const{callId:i,callType:r,mediaType:o,secretChat:E,duration:L,callStatus:c,callingUserId:T,callSessionUsers:S,toDeviceId:C,callDialogEntitys:h}=e;S.some(U=>U.sessionStatus===d.INVITED&&U.userId===this._context.getCurrentId())?this._onPubInviteCall({callId:i,toDeviceId:C,callType:r,mediaType:o,inviteUserId:T,callingUserId:T,callSessionUsers:S,secretChat:E},!0,_):this._onStatusDownCall({callId:i,toDeviceId:C,callStatus:c,duration:L,callSessionUsers:S},_),h.length>0&&h.forEach(U=>this._onDialogDownCall(U,_),this)}}const me=t=>{const s="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),e=s.length+1;let _=+t;const i=[];do{const r=_%e;_=(_-r)/e,i.unshift(s[r])}while(_);return i.join("")},fe=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const s=Math.random()*16|0;return(t==="x"?s:s&3|8).toString(16)}),pe=()=>{let t=fe();return t=`${t.replace(/-/g,"")}0`,t=parseInt(t,16),t=me(t),t.length>22&&(t=t.slice(0,22)),t},Me="RC_CALLPLUS",De=1;let w;const V=class V{constructor(){}static init(s,e){w=s,this.isSupport()||w.info("[RCCallIndexDB]","IndexDB is not support in the current environment");const _=window.indexedDB.open(Me,De);_.onerror=i=>{w.warn("[RCCallIndexDB]",`open indexDB req failed -> ${i.target.error}`)},_.onsuccess=i=>{this._db=i.target.result,this._db&&(this._db.onclose=r=>{w.warn("[RCCallIndexDB]",`The db ${this._db.name} has unexpectedly closed. ${r}`),this.unInit()},this._db.onerror=r=>{w.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening error. ${r}`),this.unInit()},this._db.onabort=r=>{w.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening aborted. ${r}`),this.unInit()}),V._instance=new V,e.onSuccess()},_.onupgradeneeded=i=>{this._db=i.target.result,V.createObjStore("CallBW_AbnormalCall",{keyPath:"userId"})}}static unInit(){this._db=null,this._instance=null}static getInstance(){return this._instance}static isSupport(){return!(typeof window>"u"||!window||!window.indexedDB)}static createObjStore(s,e){var _;(_=V._db)!=null&&_.objectStoreNames.contains(s)?w.debug("[RCCallIndexDB]",`createObjStore ${s} already exists`):V._db.createObjectStore(s,e)}addValue(s,e){return new Promise((_,i)=>{if(!V._db){_(!1);return}const o=V._db.transaction([s],"readwrite").objectStore(s).add(e);o.onsuccess=()=>{_(!0)},o.onerror=()=>{w.debug("[RCCallIndexDB]","addValue failed"),_(!1)}})}readByKey(s,e){return new Promise((_,i)=>{if(!V._db){_(null);return}const o=V._db.transaction([s]).objectStore(s).get(e);o.onsuccess=()=>{_(o.result)},o.onerror=E=>{w.warn("[RCCallIndexDB]",`readByKey onerror -> ${E}`),_(null)}})}updateByKey(s,e,_){return new Promise((i,r)=>{if(!V._db){i(!1);return}const E=V._db.transaction([s],"readwrite").objectStore(s).put(_);E.onsuccess=()=>{i(!0)},E.onerror=L=>{i(!1),w.warn("[RCCallIndexDB]",`updateByKey onerror -> ${L}`)}})}removeByKey(s,e){return new Promise((_,i)=>{if(!V._db){_(!1);return}const o=V._db.transaction([s],"readwrite").objectStore(s).delete(e);o.onsuccess=()=>{_(!0)},o.onerror=E=>{_(!1),w.warn("[RCCallIndexDB]",`removeByKey onerror -> ${E}`)}})}};I(V,"_db",null),I(V,"_instance",null);let q=V;class ye{constructor(s,e){I(this,"_localStore");I(this,"_indexDBStore");I(this,"_storeKey","CallBW_AbnormalCall");I(this,"_isSupportIndexDB");if(this._runtime=s,this._logger=e,this._isSupportIndexDB=q.isSupport(),this._isSupportIndexDB){q.init(this._logger,{onSuccess:()=>{this._indexDBStore=q.getInstance()}});return}this._localStore=s.localStorage}addAbnormallCallId(s,e){(this._isSupportIndexDB?this._addByIndexDB:this._addByLocalStore).call(this,s,e)}removeAbnormalCallIds(s,e){(this._isSupportIndexDB?this._removeByIndexDB:this._removeByLocalStore).call(this,s,e)}getAbnormalCallIds(s){return(this._isSupportIndexDB?this._getByIndexDB:this._getByLocalStore).call(this,s)}_addByLocalStore(s,e){try{const _=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let i=_[s];i?i.push(e):i=[e],_[s]=i,this._localStore.setItem(this._storeKey,JSON.stringify(_))}catch(_){this._logger.warn("[AbnormalCall]",`_addByLocalStore err: ${_.message}`)}}_removeByLocalStore(s,e){try{const _=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let i=_[s];i&&(i=i.filter(r=>!e.includes(r)),i.length>0?_[s]=i:delete _[s],this._localStore.setItem(this._storeKey,JSON.stringify(_)))}catch(_){this._logger.warn("[AbnormalCall]",`_removeByLocalStore err: ${_.message}`)}}_getByLocalStore(s){let e=null;try{const i=JSON.parse(this._localStore.getItem(this._storeKey)||"{}")[s];i&&(e=i)}catch(_){this._logger.warn("[AbnormalCall]",`_getByLocalStore err: ${_.message}`)}return Promise.resolve(e)}async _addByIndexDB(s,e){try{const _=await this._indexDBStore.readByKey(this._storeKey,s);_?(_.callIds.push(e),this._indexDBStore.updateByKey(this._storeKey,s,{userId:s,callIds:_.callIds})):this._indexDBStore.addValue(this._storeKey,{userId:s,callIds:[e]})}catch(_){this._logger.warn("[AbnormalCall]",`_addByIndexDB err: ${_.message}`)}}async _removeByIndexDB(s,e){try{const _=await this._indexDBStore.readByKey(this._storeKey,s);_&&(_.callIds=_.callIds.filter(i=>!e.includes(i)),_.callIds.length>0?this._indexDBStore.updateByKey(this._storeKey,s,{userId:s,callIds:_.callIds}):this._indexDBStore.removeByKey(this._storeKey,s))}catch(_){this._logger.warn("[AbnormalCall]",`_removeByIndexDB err: ${_.message}`)}}async _getByIndexDB(s){let e=null;try{e=await this._indexDBStore.readByKey(this._storeKey,s)}catch(_){this._logger.warn("[AbnormalCall]",`_getByIndexDB err: ${_.message}`)}return e?e.callIds:null}}var re=(t=>(t[t.PROMPT=0]="PROMPT",t[t.CALL_DURATION=10]="CALL_DURATION",t[t.FIRST_FRAME=20]="FIRST_FRAME",t))(re||{}),b=(t=>(t[t.SUCCESS=0]="SUCCESS",t[t.INVALID_RESPONSE_TIME=80170]="INVALID_RESPONSE_TIME",t[t.NONOPTIMAL_RES_TIME=80171]="NONOPTIMAL_RES_TIME",t))(b||{});class Pe{constructor(s,e,_){I(this,"_RTT",0);I(this,"_validMinRTT",200);I(this,"_validMaxRTT",1e3);I(this,"_deltaTime",0);I(this,"_timerId",null);I(this,"_interval",2*1e3);I(this,"_maxRetryTimes",8);I(this,"_startTimes",0);I(this,"_retryTimesInCall",0);I(this,"_maxRetryTimesInCall",3);this._callEngine=s,this._logger=e,this._singleCallDurationEv=_}async getCallClientTimeByServer(s,e){this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T,`callId: ${s}`,e),(!this._RTT||this._RTT>this._validMinRTT)&&await this._getDeltaTime(e),this._RTT>this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.INVALID_RESPONSE_TIME}`,e);const{code:_,data:i}=await this._callEngine.getCallTimeInfo(s,e);if(_!==a.SUCCESS)return this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${_}`,e),{code:_};const{startTime:r}=i,o=Math.floor(r-this._deltaTime);let L=(Date.now()+this._deltaTime-r)/1e3;return L<0&&(this._logger.warn(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P,`invalid duration: ${L}`,e),L=0),L=Math.floor(L),this._RTT>this._validMinRTT&&this._RTT<=this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.NONOPTIMAL_RES_TIME}`,e),this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,serverStartTime:r,clientStartTime:o,duration:L}),e),{code:_,duration:L,clientStartTime:o}}calcClientStartTime(s,e,_){if(this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T,`callId: ${s}, startTime: ${e}`,_),this._RTT>this._validMaxRTT)return this._logger.error(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,_),this._loopCorrectClientTime(s,_),{code:b.INVALID_RESPONSE_TIME};const i=Math.floor(e-this._deltaTime);return this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,startT:e,clientStartTime:i}),_),this._RTT>this._validMinRTT&&(this._retryTimesInCall=0,this._loopCorrectClientTime(s,_)),{code:b.SUCCESS,clientStartTime:i}}start(s){this._timerId||this._startTimes>=this._maxRetryTimes||(this._logger.info(n.L_TIME_CORRECT_START_O,`timerId: ${this._timerId}`),this._startTimes++,this._getDeltaTime(s),this._timerId=se(()=>{this._timerId=null,this.start(s)},this._interval))}stop(s){this._logger.info(n.L_TIME_CORRECT_STOP_O,`timerId: ${this._timerId}`,s),this._timerId&&clearTimeout(this._timerId),this._timerId=null,this._startTimes=0}restart(s){this._logger.info(n.L_TIME_CORRECT_RESTART_O,`legal rtt time, RTT: ${this._RTT}, validMinRTT: ${this._validMinRTT}`,s),!(this._RTT<this._validMinRTT)&&(this.stop(s),this.start(s))}getLocalDelayTime(){return this._deltaTime}getRTT(){return this._RTT}async _getDeltaTime(s){const e=Date.now(),{code:_,data:i}=await this._callEngine.getCallServerTimestamp(s),r=Date.now();if(_!==a.SUCCESS)return{code:_};const o=r-e;return(o<this._RTT||this._RTT===0)&&o<=this._validMaxRTT&&(this._RTT=o),o<this._validMinRTT&&this.stop(s),this._deltaTime=i-e-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime}),s),{code:_,delayTime:this._deltaTime}}async _getDeltaTimeInCall(s,e){const _=Date.now(),{code:i,data:r}=await this._callEngine.getCallTimeInfo(s,e),o=Date.now();if(i!==a.SUCCESS)return{code:i};const E=o-_;E<this._RTT&&(this._RTT=E),this._deltaTime=r.syncTime-_-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({callId:s,rtt:this._RTT,deltaT:this._deltaTime}),e);const L=Math.floor(r.startTime-this._deltaTime),c=Math.floor(r.firstFrametime-this._deltaTime);return E<this._validMinRTT?{code:b.SUCCESS,clientStartTime:L,clientFirstFrameTime:c}:{code:b.INVALID_RESPONSE_TIME,clientStartTime:L,clientFirstFrameTime:c}}async _loopCorrectClientTime(s,e){this.stop(e),this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T,`callId: ${s}`,e);const{code:_,clientStartTime:i,clientFirstFrameTime:r}=await this._getDeltaTimeInCall(s,e);if(_===b.SUCCESS){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${a.SUCCESS}`,e),this._singleCallDurationEv(s,i,r,e);return}if(this._retryTimesInCall>this._maxRetryTimesInCall&&_===b.INVALID_RESPONSE_TIME){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,e),this._singleCallDurationEv(s,i,r,e);return}this._retryTimesInCall>this._maxRetryTimesInCall||(this._retryTimesInCall++,setTimeout(()=>{this._loopCorrectClientTime(s,e)},this._interval))}}var Q=(t=>(t[t.SOON_AFETER=0]="SOON_AFETER",t[t.CURRENT=1]="CURRENT",t))(Q||{}),ne=(t=>(t[t.PUB_INVITE_CALL=0]="PUB_INVITE_CALL",t[t.PULL_KV_INVITE_CALL=1]="PULL_KV_INVITE_CALL",t[t.SYSTEM_PUSH=2]="SYSTEM_PUSH",t))(ne||{}),oe=(t=>(t[t.OUT=-1]="OUT",t[t.GROUP=0]="GROUP",t[t.IN=1]="IN",t))(oe||{});const le=60*1e3,B=class B extends l.EventEmitter{constructor(e,_,i,r,o){super();I(this,"_mainSession",null);I(this,"_holdSessions",[]);I(this,"_signalModule");I(this,"_abnormalModule");I(this,"_isUpFirstFrameTime",!1);I(this,"_callStartMap",{});I(this,"_timeCorrectioner");this._context=e,this._runtime=_,this._initOpts=i,this._logger=r,this._reportAppEventModule=o,this._timeCorrectioner=new Pe(this,r,this._onRecvSinCallDuration.bind(this)),this._signalModule=new Ue(e,_,i,this._timeCorrectioner,this._logger),this._signalModule.registerListener({onInvite:this._onInvite.bind(this),onStatusDown:this._onStatusDown.bind(this),onOtherClientStatusDown:this._onOtherClientStatusDown.bind(this),onEventDown:this._onEventDown.bind(this),onSwitchMediaType:this._onSwitchMediaType.bind(this),onRecvCallEndLog:this._onRecvCallEndLog.bind(this),onIMStateChange:this._onIMStateChange.bind(this)}),this._abnormalModule=new ye(_,r)}async startCall(e,_){const i=this._context.getCurrentId(),{callType:r,mediaType:o,toUsers:E,targetId:L,targetType:c,oldRoomId:T}=e,{code:S,data:C}=await this._signalModule.startCall({clientCallId:e.callId,callType:r,mediaType:o,toUsers:E,secretChat:_e.NORMAL,targetType:c,targetId:L,oldRoomId:T},_);if(S!==a.SUCCESS)return{code:S};const{callId:h,busylineUsers:f}=C;if(this._abnormalModule.addAbnormallCallId(i,h),this._mainSession=new ie(h,p.INVITED,r,o,i,i,[],this._logger),r===D.SINGLE){const R=this._startTimer(C.callId,d.NO_ANSWER,_);this._mainSession.updateTimerId(te.INVITER,R)}const U={userId:i,userState:d.CALLING,systemState:A.CALLING,targetType:c,targetId:L,cameraEnable:!1,microphoneEnable:!1};let m=E.map(({userId:R,targetType:M,targetId:P})=>({userId:R,userState:d.INVITED,systemState:A.INVITED,targetType:M,targetId:P,cameraEnable:!1,microphoneEnable:!1})),y=[];return f&&(y=f.map(R=>{const{targetType:M,targetId:P}=m.find(H=>H.userId===R.userId);return{userId:R.userId,userState:R.sessionStatus,systemState:A.BUSYLINE_RINGING,targetType:M,targetId:P,cameraEnable:!1,microphoneEnable:!1}}),m=m.filter(({userId:R})=>y.every(({userId:M})=>M!==R))),setTimeout(()=>{this.updateUsersState(h,[U,...m,...y],_)}),{code:S,data:C}}async invite(e,_){var L;if(!this._mainSession)return{code:a.NOT_IN_CALL};const{toUsers:i}=e,r=this._mainSession.getCallId(),{code:o,data:E}=await this._signalModule.inviteCall({callId:r,toUsers:i},_);if(o===a.SUCCESS){this._mainSession.getCallType()===D.SINGLE&&(this._mainSession.updateCallType(D.MULTI),this._onCallTypeChange(this._mainSession.getCallId(),D.MULTI,_));let c=i.map(({userId:S,targetType:C,targetId:h})=>({userId:S,userState:d.INVITED,systemState:A.INVITED,targetType:C,targetId:h,cameraEnable:!1,microphoneEnable:!1})),T=[];E.busylineUsers&&(T=(L=E.busylineUsers)==null?void 0:L.map(S=>{const{targetType:C,targetId:h}=c.find(f=>f.userId===S.userId);return{userId:S.userId,userState:S.sessionStatus,systemState:A.BUSYLINE_RINGING,targetType:C,targetId:h,cameraEnable:!1,microphoneEnable:!1}}),c=c.filter(({userId:S})=>T.every(({userId:C})=>C!==S))),this.updateUsersState(r,[...c,...T],_)}return{code:o,data:E}}clearAllTimer(e,_){[this._mainSession,...this._holdSessions].forEach(i=>{i&&i.getCallId()===e&&i.getAllTimerIds().forEach(r=>this._stopTimer.bind(this)(r,_))})}async hangup(e,_){return this._signalModule.hangupCall({callId:e.callId,sysStatus:e.systemState},_)}async accept(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const{code:i}=await this._signalModule.acceptCall({callId:e.callId},_);return this._stopTimer(this._mainSession.getInviteeTimerId(),_),i!==a.SUCCESS?{code:i}:(this._clearMobileOnPhone(e.callId,_),this._mainSession.updateSessionState(p.CONNECTING),{code:i})}async joinCall(e,_){const i=this._context.getCurrentId();this._mainSession&&this._stopTimer(this._mainSession.getInviteeTimerId(),_);const{code:r}=await this._signalModule.joinCall({callId:e.callId},_);return r!==a.SUCCESS?{code:r}:(this._abnormalModule.addAbnormallCallId(i,e.callId),this._mainSession?this._clearMobileOnPhone(e.callId,_):await this._createSessionByServer(e.callId,!0,_),{code:r})}async requestChangeMediaType(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const i={mediaType:e.mediaType};this._mainSession.updateReqMediaType(e.mediaType);const r=pe(),{code:o}=await this._signalModule.dialogUpCall({transactionId:r,callId:this._mainSession.getCallId(),toUserIds:e.toUserIds,dialogType:W.SWITCH_MEDIA_TYPE,action:v.REQUEST,extraKeyVal:i},_);return o!==a.SUCCESS?{code:o}:{code:a.SUCCESS,data:{transactionId:r}}}async responseChangeMediaType(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const i=this._mainSession.getReqMediaType();return e.agree&&(this._mainSession.updateMediaType(i),this._mainSession.updateReqMediaType(null)),this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:W.SWITCH_MEDIA_TYPE,action:e.agree?v.ACCEPT:v.REFUSE},_)}async cancelChangeMediaType(e,_){return this._mainSession?this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:W.SWITCH_MEDIA_TYPE,action:v.CANCEL},_):{code:a.NOT_IN_CALL}}async getCallLogList(e,_){const i=this._context.getCurrentId(),{code:r,data:o}=await this._signalModule.syncCallLog({userId:i,syncTime:e.timestamp,count:e.count},_);if(r!==a.SUCCESS)return{code:r};const E=o.callLogList.map(L=>ce(L));return{code:a.SUCCESS,data:{hasMore:!!(o!=null&&o.hasMore),maxTime:o.maxTime,list:E}}}async deleteCallLog(e,_){const i=this._context.getCurrentId();return this._signalModule.deleteCallRecord(i,e,_)}async getCallServerTimestamp(e){const{code:_,data:i}=await this._signalModule.getCallServerTimestamp(e);return _!==a.SUCCESS?{code:_}:{code:_,data:i.syncTime}}async getCallTimeInfo(e,_){return this._signalModule.getCallTimeInfo(e,_)}async getOpenCallList(e){const _=this._context.getCurrentId(),{code:i,data:r}=await this._signalModule.getUserCallStateList(e);if(i!==a.SUCCESS)return{code:i};const o=r.callStateList.map(E=>{const{callId:L,callType:c,mediaType:T,callingUserId:S,callUserIds:C,callStatus:h,crtTime:f,userSessionStatus:U,targetType:m,targetId:y,startTime:R,syncTime:M}=E,P=S===_?oe.OUT:oe.IN,{clientStartTime:H=R}=this._timeCorrectioner.calcClientStartTime(L,R,e);return{callId:L,callType:c,callDirection:P,mediaType:T,callerUserId:S,callUserIds:C,sessionState:h,userState:U,startTimestamp:R,endTimestamp:0,duration:Math.floor((+new Date-H)/1e3),syncTimestamp:M,systemState:0,createTimestamp:f}});return{code:i,data:o}}async removeAllCallLog(e){const{code:_}=await this._signalModule.clearCallRecord(e);return _!==a.SUCCESS?{code:_}:{code:_}}async getCallSession(e,_){const{code:i,data:r}=await this._signalModule.getCallSession(e,_);if(i!==a.SUCCESS)return{code:i};const{callId:o,callingUserId:E,callType:L,mediaType:c,callStatus:T,callSessionUsers:S,startTime:C,duration:h,syncTime:f}=r,U=S.map(m=>{const{userId:y,sessionStatus:R,sysStatus:M,targetType:P,targetId:H}=m;return{userId:y,userState:R,systemState:M,targetType:P,targetId:H,cameraEnable:!1,microphoneEnable:!1}});return{code:i,data:{callId:o,startCallerId:E,callType:L,mediaType:c,sessionState:T,callSessionUsers:U,startTime:C,duration:h,syncTime:f}}}getHoldSession(e){const _=this._holdSessions.find(i=>i&&i.getCallId()===e);return _?new K(_,this,this._logger):null}getLocalMainSession(){return this._mainSession?new K(this._mainSession,this,this._logger):null}updateMainSessionState(e){var _;(_=this._mainSession)==null||_.updateSessionState(e)}setIsLocalClientHangup(e){var _;(_=this._mainSession)==null||_.setIsLocalClientHangup(e)}updateUsersState(e,_,i){this._logger.info(n.L_CALL_ENGINE_UPDATE_USERS_STATE_O,`updateUsersState -> users: ${JSON.stringify(_)}`,i);const r=[this._mainSession,...this._holdSessions].find(E=>(E==null?void 0:E.getCallId())===e),o=[];if(r){const E=_.map(L=>{const c=r.getUserList().filter(({userId:h})=>h===L.userId)[0]||{},T=L.userState===d.IDLE,{cameraEnable:S=!1,microphoneEnable:C=!1}=T?{cameraEnable:!1,microphoneEnable:!1}:c;return{...L,cameraEnable:S,microphoneEnable:C}});o.push(...r.updateUserList(E,i))}else o.push(..._);o.length>0&&this._onUserStateChange(e,o,i)}setUserDeviceEnable(e,_,i,r){var o;(o=this._mainSession)==null||o.setUserDeviceEnable(e,_,i,r)}async getCallStaringTime(e,_){return this._timeCorrectioner.getCallClientTimeByServer(e.callId,_)}async systemStatusUp(e,_){return this._signalModule.sysStatusUp(e,_)}async upFirstFrameTime(e){if(!this._mainSession||this._mainSession&&this._mainSession.getCallType()!==D.SINGLE||this._isUpFirstFrameTime)return{code:a.SUCCESS};const i=Date.now(),r=this._timeCorrectioner.getLocalDelayTime(),o=Math.floor(i+r);this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T,`now: ${i}; delay: ${r}; streamReadyTime: ${o}`,e),this._isUpFirstFrameTime=!0;const E=this._mainSession.getCallId(),{code:L}=await this._signalModule.eventUpCall({callId:E,eventType:re.FIRST_FRAME,eventArgs:{streamReadyTime:o},eventTime:Date.now()},e);return this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R,`code: ${L}`,e),{code:L}}endCurrentSession(e,_,i){const r=this._context.getCurrentId();if(this._mainSession&&this._mainSession.getCallId()===_){const o=this._mainSession.getUserList().map(L=>{let{userId:c,userState:T,systemState:S,targetType:C,targetId:h}=L;return c===r&&(S=e),{userId:c,sessionStatus:d.ENDED,statusTime:Date.now(),duration:0,changed:1,inviteUserId:this._mainSession.getStartCallerId(),sysStatus:S,targetType:C,targetId:h}}),E={callId:this._mainSession.getCallId(),toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:o};this._onStatusDown(E,i)}}startTimeCorrection(e){this._timeCorrectioner.restart(e)}getDelayTimeInfo(){return{delayTime:this._timeCorrectioner.getLocalDelayTime(),rtt:this._timeCorrectioner.getRTT()}}upgradeMainSession(e){var i;const _=this._holdSessions.findIndex(r=>r.getCallId()===e);this._mainSession=(i=this._holdSessions.splice(_,1))==null?void 0:i[0]}_onIMStateChange(e){const _=this._logger.createTraceId();let i=0;e===l.RCConnectionStatus.DISCONNECTED&&this._mainSession&&this._mainSession.getSessionState()!==p.ONCALL&&(i=se(()=>{var r;this._logger.info(n.L_CALL_ENGINE_IM_STATE_CHANGE_O,"endCurrentSession, IM disconnected for more than 60s",_),this.endCurrentSession(A.CONNECTION_ERR,(r=this._mainSession)==null?void 0:r.getCallId(),_)},le)),e===l.RCConnectionStatus.CONNECTED&&i&&clearTimeout(i)}_handleCallTimeout(e,_,i){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`call timeout callId: ${e}, userState: ${_}`,i);const r=[this._mainSession,...this._holdSessions].find(E=>E&&E.getCallId()===e);if(!r){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`handleCallTimeout without session, callId: ${e}`,i);return}const o=this._context.getCurrentId();this._onStatusDown({callId:e,toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:r.getUserList().map(E=>{const{userId:L,targetType:c,targetId:T,stateTime:S}=E;let C,h;return L===o?(C=_===d.MISSED?A.MISSED:A.NO_ANSWER,h=_===d.MISSED?d.MISSED:d.NO_ANSWER):(C=_===d.MISSED?A.NO_ANSWER:A.MISSED,h=_===d.MISSED?d.NO_ANSWER:d.MISSED),{userId:L,sessionStatus:h,statusTime:S?S+1:Date.now(),duration:0,changed:1,inviteUserId:r.getCallerId(),sysStatus:C,targetType:c,targetId:T}})},i)}_startTimer(e,_,i){const r=se(()=>{this._handleCallTimeout(e,_,i),this._signalModule.statusUpCall({callId:e,sessionStatus:_},i)},le);return this._logger.info(n.L_CALL_ENGINE_START_CALL_TIMER_O,`callId: ${e}, timerId: ${r}`,i),r}_stopTimer(e,_){clearTimeout(e),this._logger.info(n.L_CALL_ENGINE_STOP_CALL_TIMER_O,`timerId: ${e}`,_)}_onInvite(e,_,i){var U,m,y;const r=this._context.getCurrentId(),{callId:o,inviteUserId:E,callType:L,mediaType:c,callSessionUsers:T,secretChat:S,callingUserId:C}=e;if(S===_e.SECRET){this.emit(x.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:X.SECRET_CALL,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE}));return}if(T.some(R=>R.userId===r)){this._abnormalModule.addAbnormallCallId(r,o);const R=new ie(o,p.RINGING,L,c,E,E,[],this._logger);this._signalModule.ringingCall({callId:o},i);const M=this._startTimer(o,d.MISSED,i);R.updateTimerId(te.INVITEE,M),this._mainSession?(this._holdSessions.push(R),this._mainSession.updateSessionState(p.BUSYLINE_WAIT)):this._mainSession=R;const P=new K(R,this,this._logger);this._reportAppEventModule.onReceivedCall(P,i);const H=_?ne.PUB_INVITE_CALL:ne.PULL_KV_INVITE_CALL;this.emit(B.__INNER_INVITE__,P,H);const Z=T.map(({userId:ae,sessionStatus:ve,sysStatus:we,targetType:Be,targetId:$e,statusTime:He})=>({userId:ae,userState:ve,systemState:we,targetType:Be,targetId:$e,stateTime:He,cameraEnable:!1,microphoneEnable:!1}));this.updateUsersState(o,Z,i)}else this.emit(x.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:X.NOT_INVITEE,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE}));const f=T.filter(R=>R.userId!==r&&R.userId!==E&&R.sessionStatus===d.INVITED);if(f.length>0){((U=this._mainSession)==null?void 0:U.getCallType())===D.SINGLE&&((m=this._mainSession)==null?void 0:m.getCallId())===o&&(this._onCallTypeChange(this._mainSession.getCallId(),D.MULTI,i),(y=this._mainSession)==null||y.updateCallType(D.MULTI));const R=[],M=[];f.forEach(P=>{const{userId:H,sessionStatus:Z,sysStatus:ae}=P;R.push({callId:o,userId:H,userState:Z}),M.push({userId:H,userState:Z,systemState:ae,cameraEnable:!1,microphoneEnable:!1})}),this._onOtherMemberInvite(R),this.updateUsersState(o,M,i)}}_onHangup(e,_,i){this._mainSession&&e.forEach(r=>{r.callId===this._mainSession.getCallId()&&(r.userState===d.CANCELLED?this._stopTimer(this._mainSession.getInviteeTimerId(),i):this._stopTimer(this._mainSession.getInviterTimerId(),i))})}_onAccept(e,_){var L,c,T,S;const i=(L=this._mainSession)==null?void 0:L.getSessionState(),r=[p.CONNECTING,p.ONCALL,p.BUSYLINE_WAIT];if(((c=this._mainSession)==null?void 0:c.getCallType())===D.SINGLE&&i&&r.includes(i))return;const o=this._mainSession.getStartCallerId(),E=this._context.getCurrentId();((T=this._mainSession)==null?void 0:T.getCallType())===D.SINGLE&&o===E&&e.filter(h=>h.fromUserId!==E)&&this.emit(B.__INNER_SESSION_CONNECT__,this.getLocalMainSession().getCallId(),_),(S=this._mainSession)==null||S.updateSessionState(p.CONNECTING),this._stopTimer(this._mainSession.getInviterTimerId(),_)}async _onStatusDown(e,_){var f,U;const{callStatus:i,startTime:r,syncTime:o,callId:E}=e;if(E!==((f=this._mainSession)==null?void 0:f.getCallId()))return;if(this._callStartMap[E]=this._callStartMap[E]||{},!this._callStartMap[E].isReceiveCallStartTime&&i===p.ONCALL){this._callStartMap[E].isReceiveCallStartTime=!0;const{code:m,clientStartTime:y}=await this._timeCorrectioner.calcClientStartTime(E,r,_);m===b.SUCCESS&&this._reportAppEventModule.onReceivedCallStartTime({callId:E,callStartTime:y},_)}let L=!1;const c=this._context.getCurrentId(),T=e.callSessionUsers.map(m=>([d.IDLE,d.DECLINED,d.MISSED,d.NO_ANSWER,d.CANCELLED].includes(m.sessionStatus)&&m.userId===c&&(L=!0),{userId:m.userId,userState:m.sessionStatus,systemState:m.sysStatus,stateTime:m.statusTime,cameraEnable:!1,microphoneEnable:!1}));if(T.length>0&&this.updateUsersState(E,T,_),!this._mainSession&&!this._holdSessions.length)return;const{hangupData:S,acceptData:C,otherInvitedData:h}=de(e);S.length>0&&this._onHangup(S,e.callStatus,_),C.length>0&&this._onAccept(C,_),h.length>0&&((U=this._mainSession)==null?void 0:U.getCallType())===D.MULTI&&this._onOtherMemberInvite(h),(e.callStatus===p.ENDED||L)&&this.sessionClose(e,_,!0)}_onOtherClientStatusDown(e,_){var c,T,S;const i=this._context.getCurrentId(),{callId:r,callSessionUsers:o,callStatus:E}=e,L=o.find(({userId:C})=>C===i);if(L&&(this._mainSession||this._holdSessions.length)){const{userId:C,sessionStatus:h,statusTime:f}=L;if(h===d.CONNECTING){const U=[d.ONCALL,d.CONNECTING],m=((c=this._mainSession)==null?void 0:c.getCallId())===r,y=(S=(T=this._mainSession)==null?void 0:T.getUserList().find(M=>M.userId===i))==null?void 0:S.userState;m&&y&&U.includes(y)||(this.updateUsersState(r,[{userId:C,userState:h,systemState:A.OTHER_CLIENT_ACCEPT,stateTime:f,cameraEnable:!1,microphoneEnable:!1}],_),this.sessionClose(e,_,!1))}}}async _onEventDown(e,_){var c;const{callId:i,eventTime:r,eventArgs:o,eventType:E,fromUserId:L}=e;if(E===re.CALL_DURATION&&i===((c=this._mainSession)==null?void 0:c.getCallId())){const{firstFrameTime:T}=o,{code:S,clientStartTime:C}=await this._timeCorrectioner.calcClientStartTime(i,T,_);this._logger.info(n.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O,`clientFirstFrameTime: ${C}`,_),S===b.SUCCESS&&this._reportAppEventModule.onReceivedCallFirstFrameTime(i,C,_)}}_onRecvSinCallDuration(e,_,i,r){var o;((o=this._mainSession)==null?void 0:o.getCallId())===e&&(this._reportAppEventModule.onReceivedCallStartTime({callId:e,callStartTime:_},r),this._reportAppEventModule.onReceivedCallFirstFrameTime(e,i,r))}_onSwitchMediaType(e,_){var U,m,y,R,M;const{callId:i,action:r,extraKeyVal:o,transactionId:E,promoterId:L}=e,{mediaType:c,reason:T}=o,S=(U=this._mainSession)==null?void 0:U.getCallId();if(i!==S){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`not current session callId: ${S}, recvCallId: ${i}`,_);return}const{transactionId:C,action:h,mediaType:f}=((m=this._mainSession)==null?void 0:m.getOldDialogData())||{};if(C===E&&h===r&&f===c){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,"duplicate dialog data",_);return}if(this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`action: ${r}, reason: ${T}`,_),(y=this._mainSession)==null||y.setOldDialogData({transactionId:E,action:r,mediaType:c}),r===v.REQUEST)this._onRequestChangeMediaType({transactionId:E,userId:L,mediaType:c},_);else{let P=null;switch(T){case v.CANCEL:P=k.CANCEL_CHANGE_MEDIA_TYPE;break;case v.ACCEPT:P=k.SERVER_ALLOW_MEDIA_TYPE,(R=this._mainSession)==null||R.updateMediaType(this._mainSession.getReqMediaType()),(M=this._mainSession)==null||M.updateReqMediaType(null);break;case v.REFUSE:P=k.REFUSE_CHANGE_MEDIA_TYPE;break;case v.TIMEOUT:P=k.CHANGE_MEDIA_TYPE_TIMEOUT;break}k[P]&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},P,_)}r===v.NOTICE&&c===u.AUDIO&&!T&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},k.SERVER_ALLOW_MEDIA_TYPE,_)}_onRecvCallEndLog(e,_){const i=ce(e);this._reportAppEventModule.onReceivedCallRecord(i,_)}sessionClose(e,_,i){const{callId:r}=e,o=this._context.getCurrentId();this._abnormalModule.removeAbnormalCallIds(o,[r]);let E=[this._mainSession,...this._holdSessions].find(T=>T&&T.getCallId()===r);if(!E){this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`unexpect session callId -> ${r}`,_);return}this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`callId: ${r}`,_),this._mainSession&&this._mainSession.getCallId()===r&&(this._mainSession.getAllTimerIds().forEach(T=>this._stopTimer.bind(this)(T,_)),E.getCallType()===D.SINGLE&&(this._isUpFirstFrameTime=!1),delete this._callStartMap[r]),this.emit(B.__INNER_SESSION_CLOSE__,r,_);const L=E.getUserList().find(T=>T.userId===o);let c;i&&e.toDeviceId!==this._signalModule.getSessionId()&&(c=E.getIsLocalClientHangup()?L.systemState:A.OTHER_CLIENT_HANGUP),this._reportAppEventModule.onCallEnded(new K(E,this,this._logger),c||L.systemState,_),this._removeSession(r)}_removeSession(e){var _;if(e===((_=this._mainSession)==null?void 0:_.getCallId()))this._mainSession=null;else{const i=this._holdSessions.findIndex(r=>(r==null?void 0:r.getCallId())===e);this._holdSessions.splice(i,1)}}async _createSessionByServer(e,_=!1,i){this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T,`callId: ${e}`,i);const{code:r,data:o}=await this.getCallSession({callId:e},i);if(r!==a.SUCCESS){this._logger.error(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`errcode: ${r}`,i);return}this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`code: ${r}, data: ${JSON.stringify(o)}`,i);const{callType:E,mediaType:L,callSessionUsers:c,startCallerId:T}=o;this._mainSession=new ie(e,p.CONNECTING,E,L,T,T,[],this._logger),_&&this._clearMobileOnPhone(e,i),this.updateUsersState(e,c,i)}async _clearMobileOnPhone(e,_){const i=[this._mainSession,...this._holdSessions].find(r=>(r==null?void 0:r.getCallId())===e);if(i&&i.getCallType()===D.MULTI){this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_T,`callId: ${e}`,_);const{code:r}=await this.systemStatusUp({callId:e,sysStatus:A.ON_PHONE_END,forward:Q.CURRENT},_);r===a.SUCCESS?this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}`,_):this._logger.warn(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}, errCode: ${r}`,_)}}_onUserStateChange(e,_,i){const r=this._context.getCurrentId();_.forEach(o=>{const{userId:E,userState:L,systemState:c}=o;E!==r&&this._reportAppEventModule.onRemoteUserStateChanged({callId:e,userId:E,userState:L,reason:c},i)}),_.forEach(({userId:o,systemState:E})=>{o===r&&E===A.ABNORMAL_END&&this.emit(B.__INNER_SESSION_CLOSE__,e,i)})}_onOtherMemberInvite(e){e.forEach(_=>{var E;const{userId:i,callId:r}=_,o=(E=this.getLocalMainSession())==null?void 0:E.getInviterUserId();this._reportAppEventModule.onRemoteUserInvited([i],o,r)})}_onRequestChangeMediaType(e,_){const{userId:i,transactionId:r,mediaType:o}=e;this._reportAppEventModule.onReceivedChangeMediaTypeRequest(i,r,o,_)}_receiveMediaTypeChangeResult(e,_,i){_===k.SERVER_ALLOW_MEDIA_TYPE&&this.emit(B.__INNER_CHANGE_MEDIA_TYPE__,e.mediaType,i),this._reportAppEventModule.onReceivedChangeMediaTypeResult({...e,code:_},i)}_onCallTypeChange(e,_,i){this._reportAppEventModule.onCallTypeChanged(_,e,i)}};I(B,"__INNER_SESSION_CLOSE__","inner-session-close"),I(B,"__INNER_SESSION_CONNECT__","inner-session-connect"),I(B,"__INNER_CHANGE_MEDIA_TYPE__","inner-change-media-type"),I(B,"__INNER_INVITE__","inner-invite");let J=B;var z=(t=>(t.NORMAL="RongCloudRTC",t.SCREEN="ScreenShare",t))(z||{});const G=class G extends l.EventEmitter{constructor(e,_,i,r,o,E){super();I(this,"_rtcClient");I(this,"_localTracks",[]);I(this,"_room",null);I(this,"_callId","");I(this,"_callMediaType");I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_isPubTiny",!1);I(this,"_videoConfigIsChange",!1);I(this,"_audioConfigIsChange",!1);I(this,"_userViewMap",{});I(this,"_callPlusStatusReportListener",null);I(this,"_remoteAudioEnable",!0);this._context=e,this._runtime=_,this._initOpts=i,this._logger=r,this._callEngine=o,this._reportAppEventModule=E,this._rtcClient=i==null?void 0:i.rtcClient,this._isPubTiny=i.isPubTiny||!1}setCallPlusStatusReportListener(e){this._callPlusStatusReportListener=e}async getCameraVideoTrack(e){const _=this.getLocalVideoTrack(),{code:i,track:r}=_&&!this._videoConfigIsChange?{track:_,code:a.SUCCESS}:await this._createVideoTrack(e);return this._videoConfigIsChange=!1,i!==a.SUCCESS?{code:i}:{code:a.SUCCESS,track:r}}async getMicrophoneAudioTrack(e){const _=this.getLocalAudioTrack(),{code:i,track:r}=_&&!this._audioConfigIsChange?{track:_,code:a.SUCCESS}:await this._createAudioTrack(e);return this._audioConfigIsChange=!1,i!==a.SUCCESS?{code:i}:{code:a.SUCCESS,track:r}}async createCallMediaTracks(e,_){this._callMediaType=e;const{code:i}=await this.getMicrophoneAudioTrack(_);if(i!==a.SUCCESS)return{code:i};if(e===u.AUDIO_VIDEO){const{code:r}=await this.getCameraVideoTrack(_);if(r!==a.SUCCESS)return{code:r}}return{code:a.SUCCESS}}setVideoConfig(e){this._videoConfigIsChange=!0,this._videoConfig=e}setAudioConfig(e){this._audioConfigIsChange=!0,this._audioConfig=e}destroyAllTracks(e){this._logger.info(n.L_RTC_MODULE_DESTROY_ALL_TRACKS_O,"",e),this._localTracks.forEach(_=>{_.destroy()}),this._localTracks.length=0}setAllRemoteAudioEnable(e,_){return this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T,`enable: ${e}`,_),l.isBoolean(e)?(this._remoteAudioEnable=e,this._room?(this._room.getRemoteTracks().filter(r=>r.isAudioTrack()).forEach(r=>{e?r.unmute():r.mute()}),this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,"success",_),{code:a.SUCCESS}):{code:a.SUCCESS}):(this._logger.error(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,`param error, enable: type is boolean, value: ${e}`),{code:a.PARAM_ERROR})}async destroyTrack(e){e.destroy();const _=this._localTracks.findIndex(i=>i.getTrackId()===e.getTrackId());this._localTracks.splice(_,1)}async sessionConnected(e,_){var i;this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_T,`callId: ${e}`,_);try{if(!this._room){const{code:r,room:o}=await this.joinRTCRoom(e,_);if(r!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`errCode -> ${r}`,_);return}this._callId=e,this._regRTCListeners(),this._room=o;const E=((i=this._room)==null?void 0:i.getRemoteUserIds())||[];E.length>0&&this._onOtherMemJoined(E.map(L=>({callId:e,userId:L})),_)}}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`callId -> ${e}, err msg -> ${r.message}`,_);return}try{if(this._localTracks.length>0){this.emit(x.onBeforePublish);const r=this._isPubTiny?this._localTracks.map(E=>E.isVideoTrack()?{track:E,isPubTiny:!0}:E):this._localTracks,{code:o}=await this.publish(r,_);this.emit(x.onPublishRes,o)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CONNECT_P,"sessionConnected local tracks is empty",_)}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`publish Exception callId -> ${e}, err msg -> ${r.message}`,_);return}this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_R,`code: ${a.SUCCESS}`,_)}async sessionClose(e,_){var r;this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_T,`callId: ${e}`,_),this.destroyAllTracks(_);const i=(r=this._room)==null?void 0:r.getRoomId();if(this._room&&e===i){const{code:o}=await this._rtcClient.leaveRoom(this._room);if(this._releaseStoredData(),o!==N.RCRTCCode.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CLOSE_R,`leaveRoom failed, code: ${o}`,_);return}this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom success",_)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom throw exception: not in room",_)}async disableVideoTrack(){const e=this.getLocalVideoTrack();return e?{code:await e.mute(),track:e}:{code:a.CAMERA_CLOSED}}async enableVideoTrack(e){const _=this.getLocalVideoTrack();return _?_.isOwnerMuted()?{code:await _.unmute()}:{code:a.SUCCESS}:{code:a.CAMERA_CLOSED}}async changeVideoDevice(e){const _=[],i=[],{code:r,track:o}=await this._rtcClient.createCameraVideoTrack(z.NORMAL,this._videoConfig);if(r!==N.RCRTCCode.SUCCESS)return{code:r};const{minBitrate:E,maxBitrate:L}=this._videoConfig;(E||L)&&o.setBitrate(L,E);let c;if(this._localTracks&&this._localTracks.forEach(T=>{T.isVideoTrack()?(T.destroy(),c=T):i.push(T)}),this._localTracks=this._localTracks.filter(T=>c&&T.getTrackId()!==c.getTrackId()),_.push(o),i.push(o),this._localTracks=i,this._onLocalTrackReady(_,e),this._room){const{code:T}=await this._room.publish(_);if(T!==N.RCRTCCode.SUCCESS)return{code:T}}return{code:a.SUCCESS,track:o}}async disableAudioTrack(){const e=this.getLocalAudioTrack();return e?{code:await e.mute(),track:e}:{code:a.MICROPHONE_CLOSED}}async changeMediaType(e,_){if(this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T,`mediaType: ${e}`,_),e===u.AUDIO_VIDEO){let i=this.getLocalVideoTrack();if(!i){const{code:E,track:L}=await this._createVideoTrack(_);if(E!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`create video track errCode: ${E}`,_);return}i=L;const{minBitrate:c,maxBitrate:T}=this._videoConfig;(c||T)&&i.setBitrate(T,c)}const r=this._isPubTiny?{track:i,isPubTiny:!0}:i,{code:o}=await this.publish([r],_);if(o!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`publish errCode: ${o}`,_);return}}if(e===u.AUDIO){const i=this.getLocalVideoTrack();if(i){const{code:r}=await this._room.unpublish([i]);r!==N.RCRTCCode.SUCCESS&&this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`unpublish errCode: ${r}`,_),this.destroyTrack(i)}}this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,"success",_)}async joinRTCRoom(e,_){this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_T,`call: ${e}`,_);const{code:i,room:r,tracks:o}=await j({asyncFn:this._rtcClient.joinRTCRoom.bind(this._rtcClient),fnArgs:[e,void 0,void 0,!1,l.RTCMode.CALL]});return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,`callId: ${e}, errCode: ${i}`,_),this._onRTCMethodFail(A.JOIN_ROOM_ERR,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,"success",_),this._room=r,this._onSelfJoined({callId:e,userId:this._context.getCurrentId()},_),o!=null&&o.length&&this._onRemoteTrackPublish(o),this._callId=e,{code:a.SUCCESS,room:r,tracks:o})}async subscribeTracks(e,_){if(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_T,JSON.stringify({params:e.map(r=>{const{track:o,subTiny:E}=r;return{trackId:o.getTrackId(),subTiny:E}})}),_),!this._room)return{code:a.SUCCESS};const{code:i}=await j({asyncFn:this._room.subscribe.bind(this._room),fnArgs:[e],onError:r=>{}});return i!==N.RCRTCCode.SUCCESS?(this._reportAppEventModule.onFetchRemoteMediaError(e,i),this._onRTCMethodFail(A.SUBSCRIBE_ERR,_),this._logger.error(n.L_RTC_MODULE_SUBSCRIBE_R,`errorCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_R,"success",_),{code:a.SUCCESS})}async unsubscribeTracks(e,_){if(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_T,JSON.stringify({trackIds:e.map(r=>r.getTrackId())}),_),!this._room)return{code:a.SUCCESS};const{code:i}=await this._room.unsubscribe(e);return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_UNSUBSCRIBE_R,`errorCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_R,"success",_),{code:a.SUCCESS})}_releaseStoredData(){this._room=null,this._remoteAudioEnable=!0,this._userViewMap={}}getRemoteTracks(){const e={};return this._room&&this._room.getRemoteUserIds().forEach(i=>{e[i]=this._room.getRemoteTracksByUserId(i)}),e}getRemoteTrack(e,_){var i;return(i=this._room)==null?void 0:i.getRemoteTracksByUserId(e).find(r=>_===u.AUDIO?r.isAudioTrack():r.isVideoTrack())}_regRTCListeners(){this._room.registerRoomEventListener({onKickOff:(e,_)=>{this._onKickOff(e,this._room.getRoomId(),_),this._releaseStoredData()},onUserJoin:e=>{const _=e.map(r=>({callId:this._callId,userId:r})),i=this._logger.createTraceId();this._onOtherMemJoined(_,i)},onUserLeave:e=>{e.forEach(_=>{delete this._userViewMap[_]})},onTrackPublish:this._onRemoteTrackPublish.bind(this),onTrackUnpublish:this._onTrackUnpublish.bind(this),onTrackReady:e=>{this._onRemoteTrackReady([e])},onVideoMuteChange:e=>{this._onVideoMuteChagne({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onAudioMuteChange:e=>{this._onAudioMuteChange({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onRTCPeerConnectionCloseByException:this._onRTCPeerConnectionCloseByException.bind(this)}),this._room.registerReportListener({onStateReport:this._onRTCStateReport.bind(this)}),this._room.onAudioLevelChange(e=>{this._reportAppEventModule.onUserAudioLevelChanged(e)})}_onLocalTrackReady(e,_){this._reportAppEventModule.onUserMediaAvailable(e,_)}_onRemoteTrackReady(e){this._reportAppEventModule.onUserMediaAvailable(e),this.emit(G.__INNER_RECEIVE_FIRST_FRAME__)}_onKickOff(e,_,i,r){this._logger.info(n.L_RTC_MODULE_RECEIVE_KICK_OFF_O,`roonId: ${_}, byServer: ${e}, state: ${i}, kickExtra: ${JSON.stringify(r)}`);let o=A.CONNECTION_ERR;if(e)if(r)o=r.kickReasonCode;else switch(i){case N.RCKickReason.SERVER_KICK:o=A.KICKED_BY_SERVER;break;case N.RCKickReason.OTHER_KICK:o=A.OTHER_CLIENT_JOINED;break;case N.RCKickReason.IM_DISCONNECTED:o=A.CONNECTION_ERR;break;case N.RCKickReason.IM_LOGOUT:o=A.LOGOUT;break;case N.RCKickReason.OTHER_CLIENT_IM_CONNECTED:o=A.OTHER_CLIENT_LOGIN;break}this.emit(G.__INNER_ON_KICKOFF__,o,_)}_onRTCPeerConnectionCloseByException(){const e=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O,"",e),this.emit(G.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,e)}async _onSelfJoined(e,_){this.emit(G.__INNER_ON_SELF_JOINED__,e.callId,_)}_onRemoteTrackPublish(e){const _=this._logger.createTraceId();this._onDeviceEnableChange(e,_),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(r=>r.getTrackId())}),_);const i=[];e.forEach(r=>{var E;const o=r.getUserId();if(r.isAudioTrack())i.push({track:r,subTiny:!1}),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,r);else if((E=this._userViewMap[o])!=null&&E.videoView){this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,r);const{isTiny:L}=this._userViewMap[o];i.push({track:r,subTiny:L})}}),i.length&&this.subscribeTracks(i,_)}async _onTrackUnpublish(e){const _=this._logger.createTraceId();this._onDeviceEnableChange(e,_),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(i=>i.getTrackId())}),_),await this.unsubscribeTracks(e,_)}_onAudioMuteChange(e){const _=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),_);const i=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([i],_),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,i)}_onVideoMuteChagne(e){const _=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),_);const i=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([i],_),this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,i)}_onRTCStateReport(e){const{senders:_,receivers:i}=e;_.forEach(r=>{var c;const{kind:o,packetsLostRate:E,rtt:L}=r;this._callMediaType===u.AUDIO_VIDEO&&o==="audio"||(c=this._callPlusStatusReportListener)==null||c.onSendPacketLoss(E||0,L||0)}),i.forEach(r=>{var C;const{trackId:o,kind:E,packetsLostRate:L,bitrate:c}=r;if(this._callMediaType===u.AUDIO_VIDEO&&E==="audio")return;const{userId:T}=N.helper.parseTrackId(o),S={};S[T]={packetLostRate:L,bitRate:c},(C=this._callPlusStatusReportListener)==null||C.onReceivePacketLoss(S)})}_onRTCMethodFail(e,_){this.emit(G.__INNER_RTC_PROCESS_FAILED__,e,_)}_onOtherMemJoined(e,_){this.emit(G.__INNER_ON_OTHER_JOINED__,e,_)}_onDeviceEnableChange(e,_){this.emit(G.__INNER_ON_DEVICE_ENABLE_CHANGE__,e,_)}async _createAudioTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isAudioTrack()))return this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:_,track:i}=await this._rtcClient.createMicrophoneAudioTrack(z.NORMAL,this._audioConfig);if(_!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,`errCode: ${_}`,e),{code:_};this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._audioConfig;return(r||o)&&i.setBitrate(o,r),this._localTracks.push(i),this._onLocalTrackReady([i],e),{code:a.SUCCESS,track:i}}async _createVideoTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isVideoTrack()&&!L.isDestroyed()))return this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:_,track:i}=await this._rtcClient.createCameraVideoTrack(z.NORMAL,this._videoConfig);if(_!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,`errCode: ${_}`,e),{code:_};this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._videoConfig;return(r||o)&&i.setBitrate(o,r),this._localTracks.push(i),this._onLocalTrackReady([i],e),{code:a.SUCCESS,track:i}}getLocalVideoTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(_=>_.isVideoTrack())),e}getLocalAudioTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(_=>_.isAudioTrack())),e}async publish(e,_){this._logger.info(n.L_RTC_MODULE_PUBLISH_T,`tracksIds: ${e.map(r=>r instanceof N.RCLocalTrack?r.getTrackId():r.track.getTrackId())}`,_);const{code:i}=await j({asyncFn:this._room.publish.bind(this._room),fnArgs:[e],onError:r=>{}});return i!==N.RCRTCCode.SUCCESS?(this._onRTCMethodFail(A.PUBLISH_ERR,_),this._logger.error(n.L_RTC_MODULE_PUBLISH_R,`errCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_PUBLISH_R,`code: ${a.SUCCESS}`,_),{code:a.SUCCESS})}publishVideoTrack(){const e=this.getLocalVideoTrack(),_=this._isPubTiny?{track:e,isPubTiny:!0}:e;return this._room.publish([_])}setVideoView(e,_){const i=[];e.forEach(r=>{const{userId:o,videoElement:E,isTiny:L=!1}=r;if(this._userViewMap[o]={videoView:E,isTiny:L},o===this._context.getCurrentId()||!this._room)return;const T=(this.getRemoteTracks()[o]||[]).map(S=>({track:S,subTiny:L})).filter(({track:S})=>!S.isSubscribed());i.push(...T)}),this._logger.info(n.L_RTC_MODULE_SET_VIDEO_VIEW_O,JSON.stringify({userViewMap:Se(this._userViewMap),needSubTrackIds:i.map(({track:r})=>r.getTrackId())}),_),i.length&&this.subscribeTracks(i,_)}removeVideoView(e,_){const i=[];e.forEach(r=>{const o=this.getRemoteTracks()[r];if(o&&o.length){const E=o.filter(L=>L.isVideoTrack());E.length&&i.push(E[0])}delete this._userViewMap[r]}),this._logger.info(n.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O,JSON.stringify({userViewMap:Se(this._userViewMap),unsubTracks:i.map(r=>r.getTrackId())}),_),i.length&&this.unsubscribeTracks(i,_)}getUserViewMap(){return this._userViewMap}async playMedia(e,_,i,r){this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_T,`userId: ${e}, mediaType: ${_}, videoView: ${i==null?void 0:i.nodeName}`,r);let o=null;if(e===this._context.getCurrentId()?o=_===u.AUDIO?this.getLocalAudioTrack():this.getLocalVideoTrack():o=this.getRemoteTracks()[e].filter(E=>_===u.AUDIO?E.isAudioTrack():E.isVideoTrack())[0],!o)return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`error code: ${a.MEDIA_RESOURCE_INVALIED}`,r),{code:a.MEDIA_RESOURCE_INVALIED};try{const{code:E}=o.isAudioTrack()?await o.play():await o.play(i);return o.isAudioTrack()&&!this._remoteAudioEnable&&o.mute(),E!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${E}`,r),{code:E}):(this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_R,"success",r),{code:a.SUCCESS})}catch(E){return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${a.PLAY_MEDIA_FAILED}, message: ${E.message},`,r),{code:a.PLAY_MEDIA_FAILED}}}};I(G,"__INNER_RTC_PROCESS_FAILED__","inner-rtc-process-failed"),I(G,"__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__","inner-rtc-peerconnection-abnormal-close"),I(G,"__INNER_ON_SELF_JOINED__","inner-on-self-joined"),I(G,"__INNER_ON_OTHER_JOINED__","inner-on-other-joined"),I(G,"__INNER_RECEIVE_FIRST_FRAME__","inner-receive-first-frame"),I(G,"__INNER_ON_KICKOFF__","inner-kickoff-frame"),I(G,"__INNER_ON_DEVICE_ENABLE_CHANGE__","inner-on-device-enable-change");let $=G;class Ve{constructor(s){I(this,"_listener");this._logger=s}registerEventListener(s){this._listener=s}_callAppListener(s,...e){var i;const _=(i=this._listener)==null?void 0:i[s];if(_)try{_(...e)}catch(r){this._logger.error(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({name:r.name,message:r.message}))}}onReceivedCall(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCall",callId:s.getCallId()}),e),this._callAppListener("onReceivedCall",s)}onRemoteUserInvited(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserInvited",inviteeUserList:s,inviterUserId:e,callId:_})),this._callAppListener("onRemoteUserInvited",s,e,_)}onCallConnected(s){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallConnected",callId:s.getCallId()})),this._callAppListener("onCallConnected",s)}onCallTypeChanged(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallTypeChanged",callId:e,callType:s}),_),this._callAppListener("onCallTypeChanged",s,e)}onRemoteUserStateChanged(s,e){const{callId:_,userId:i,userState:r,reason:o}=s;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserStateChanged",callId:_,userId:i,userState:r,reason:o}),e),this._callAppListener("onRemoteUserStateChanged",_,i,r,o)}onCallEnded(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallEnded",callId:s.getCallId(),closeReason:e}),_),this._callAppListener("onCallEnded",s,e)}onRemoteCameraStateChanged(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteCameraStateChanged",callId:s,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const _=e==null?void 0:e.getUserId();this._callAppListener("onRemoteCameraStateChanged",s,_,e==null?void 0:e.isOwnerMuted())}onRemoteMicrophoneStateChanged(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteMicrophoneStateChanged",callId:s,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const _=e==null?void 0:e.getUserId();this._callAppListener("onRemoteMicrophoneStateChanged",s,_,e==null?void 0:e.isOwnerMuted())}onReceivedCallRecord(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallRecord",record:s}),e),this._callAppListener("onReceivedCallRecord",s)}onReceivedChangeMediaTypeRequest(s,e,_,i){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeRequest",userId:s,transactionId:e}),i),this._callAppListener("onReceivedChangeMediaTypeRequest",s,e,_)}onReceivedChangeMediaTypeResult(s,e){const{userId:_,transactionId:i,mediaType:r,code:o}=s;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeResult",userId:_,mediaType:r}),e),this._callAppListener("onReceivedChangeMediaTypeResult",{userId:_,transactionId:i,mediaType:r,code:o})}onReceivedCallStartTime(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallStartTime",info:s}),e),this._callAppListener("onReceivedCallStartTime",s)}onReceivedCallFirstFrameTime(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallFirstFrameTime",callId:s,callFirstFrameTime:e}),_),this._callAppListener("onReceivedCallFirstFrameTime",s,e)}onUserMediaAvailable(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onUserMediaAvailable",trackIds:s.map(_=>_.getTrackId())}),e),s.forEach(_=>{const i=_.getUserId(),r=_.isAudioTrack()?u.AUDIO:u.VIDEO;this._callAppListener("onUserMediaAvailable",i,r)})}onFetchRemoteMediaError(s,e){s.forEach(({track:_})=>{const i=_.getUserId();this._callAppListener("onFetchRemoteMediaError",i,e)})}onUserAudioLevelChanged(s){s.forEach(({track:e,audioLevel:_})=>{const i=e.getUserId();this._callAppListener("onUserAudioLevelChanged",i,_)})}}var Ie=(t=>(t[t.UNKNOW_ERR=41e3]="UNKNOW_ERR",t[t.DB_ERR=41001]="DB_ERR",t[t.JSON_ERR=41002]="JSON_ERR",t[t.INVALID_JSON_ERR=41003]="INVALID_JSON_ERR",t[t.MISSING_PARAMS=41004]="MISSING_PARAMS",t[t.PARAMS_REQUIRED=41005]="PARAMS_REQUIRED",t[t.DATA_FORMAT_ERR=41006]="DATA_FORMAT_ERR",t[t.METHOD_NOT_IMPLEMENTED=41007]="METHOD_NOT_IMPLEMENTED",t[t.CALL_NOT_EXIST=41010]="CALL_NOT_EXIST",t[t.SINGAL_EXCEED_TWO_INVITEE=41011]="SINGAL_EXCEED_TWO_INVITEE",t[t.GROUP_EXCEEDS_QUORUM=41012]="GROUP_EXCEEDS_QUORUM",t[t.OPERATION_EXPIRED=41013]="OPERATION_EXPIRED",t[t.DEVICE_IS_CALLING=41014]="DEVICE_IS_CALLING",t[t.REPORT_STREAM_READY_TIME_IS_INVALID=41018]="REPORT_STREAM_READY_TIME_IS_INVALID",t[t.NOT_CALL_YOURSELF=41019]="NOT_CALL_YOURSELF",t[t.SESSION_STATUS_NOT_EXIST=41020]="SESSION_STATUS_NOT_EXIST",t[t.HANGUP_NOT_ALLOW=41021]="HANGUP_NOT_ALLOW",t[t.ACCEPT_NOT_ALLOW=41022]="ACCEPT_NOT_ALLOW",t[t.OPERATION_NOT_ALLOW=41025]="OPERATION_NOT_ALLOW",t[t.TRANSACTION_ID_ERR=41100]="TRANSACTION_ID_ERR",t[t.UP_VIDEO_CANCELED=41050]="UP_VIDEO_CANCELED",t[t.CURRENT_CALL_IS_AUDIO=41051]="CURRENT_CALL_IS_AUDIO",t[t.CURRENT_CALL_IS_VIDEO=41052]="CURRENT_CALL_IS_VIDEO",t))(Ie||{});class Ce{constructor(s,e,_,i){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_callPlusStatistics");I(this,"_clientCallId","");I(this,"_isLaunchHangup",!1);I(this,"_needHangupCallId",null);I(this,"_callEngine");I(this,"_rtcModule");I(this,"_reportAppEventModule");this._context=s,this._logger=e,this._runtime=_,this._initOpts=i,this._reportAppEventModule=new Ve(e),this._callPlusStatistics=new Oe(this._logger,this._context),this._callEngine=new J(this._context,this._runtime,this._initOpts,this._logger,this._reportAppEventModule),this._rtcModule=new $(this._context,this._runtime,this._initOpts,this._logger,this._callEngine,this._reportAppEventModule),this._rtcModule.on($.__INNER_RTC_PROCESS_FAILED__,this._rtcProcessFailHandle.bind(this)),this._rtcModule.on($.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,this._peerConnectionAbnormalClose.bind(this)),this._rtcModule.on($.__INNER_ON_SELF_JOINED__,this._selfJoinedHandle.bind(this)),this._rtcModule.on($.__INNER_ON_OTHER_JOINED__,this._otherJoinedHandle.bind(this)),this._rtcModule.on($.__INNER_RECEIVE_FIRST_FRAME__,this._receiveFirstFrameHandle.bind(this)),this._rtcModule.on($.__INNER_ON_KICKOFF__,this._kickoffHandle.bind(this)),this._rtcModule.on($.__INNER_ON_DEVICE_ENABLE_CHANGE__,this._receiveDeviceEnableChangeHandle.bind(this)),this._callEngine.on(J.__INNER_SESSION_CONNECT__,this._rtcModule.sessionConnected.bind(this._rtcModule)),this._callEngine.on(J.__INNER_SESSION_CLOSE__,this._sessionCloseHandle.bind(this)),this._callEngine.on(J.__INNER_CHANGE_MEDIA_TYPE__,this._rtcModule.changeMediaType.bind(this._rtcModule)),this._callEngine.on(J.__INNER_INVITE__,(r,o)=>{this._callPlusStatistics.reportStatisticsData(F.L_QS_RECEIVE_CALL_S,a.SUCCESS,+new Date,r,"",o)})}_rtcProcessFailHandle(s,e){const _=this._callEngine.getLocalMainSession();if(_){const i=_.getCallId();this._callEngine.systemStatusUp({callId:i,sysStatus:s,forward:Q.CURRENT},e),this._callPlusStatistics.reportStatisticsData(F.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,_),this.__innerHangup({callId:i,systemState:s},e)}}_peerConnectionAbnormalClose(s){const e=this._callEngine.getLocalMainSession();e&&(this._callEngine.systemStatusUp({callId:e.getCallId(),sysStatus:A.CONNECTION_ERR,forward:Q.CURRENT},s),this._callEngine.endCurrentSession(A.CONNECTION_ERR,e.getCallId(),s))}async _selfJoinedHandle(s,e){const _=this._context.getCurrentId(),i=this._callEngine.getLocalMainSession();this._reportAppEventModule.onCallConnected(i);const r=this._rtcModule.getLocalVideoTrack(),o=this._rtcModule.getLocalAudioTrack(),E=r?!r.isOwnerMuted():!1,L=o?!o.isOwnerMuted():!1;this._callEngine.setUserDeviceEnable(_,u.VIDEO,E,e),this._callEngine.setUserDeviceEnable(_,u.AUDIO,L,e);const c=[{userId:_,userState:d.ONCALL,systemState:A.ONCALL,cameraEnable:E,microphoneEnable:L}];this._callEngine.updateUsersState(s,c,e),this._callEngine.startTimeCorrection(e)}_otherJoinedHandle(s,e){var r;let _="";const i=s.map(o=>(_=o.callId,{userId:o.userId,userState:d.ONCALL,systemState:A.ONCALL,cameraEnable:!1,microphoneEnable:!1}));this._callEngine.updateUsersState(_,i,e),((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL)}_receiveFirstFrameHandle(s){var e;((e=this._callEngine.getLocalMainSession())==null?void 0:e.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL),this._callEngine.upFirstFrameTime(s)}_kickoffHandle(s,e,_){if(s===A.CONNECTION_ERR){this._callEngine.endCurrentSession(s,e,_);return}const i=this._callEngine.getLocalMainSession();if(i){const r=i.getCallId();this._callPlusStatistics.reportStatisticsData(F.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,i,this._clientCallId),this._callEngine.systemStatusUp({callId:r,sysStatus:s,forward:Q.CURRENT},_),this._callEngine.endCurrentSession(s,e,_)}}_receiveDeviceEnableChangeHandle(s,e){s.forEach(_=>{const i=_.getUserId(),r=_.isAudioTrack()?u.AUDIO:u.VIDEO;this._callEngine.setUserDeviceEnable(i,r,!_.isOwnerMuted(),e)})}_sessionCloseHandle(s,e){this._isLaunchHangup||(this._clientCallId=""),this._isLaunchHangup=!1,this._rtcModule.sessionClose(s,e)}setCallPlusEventListener(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O,s?Object.keys(s).join(","):null),this._reportAppEventModule.registerEventListener(s)}setStatusReportListener(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O,s?Object.keys(s).join(","):null),this._rtcModule.setCallPlusStatusReportListener(s)}setVideoView(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T,JSON.stringify({list:s.map(_=>{const{userId:i,videoElement:r,isTiny:o}=_;return{userId:i,elementName:r==null?void 0:r.nodeName,isTiny:o}})}),e),!l.notEmptyArray(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, list: not empty array, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};for(let _=0;_<s.length;_++){const i=s[_],{userId:r,videoElement:o}=i;if(!l.notEmptyString(r))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, userId: not empty string, value: ${r}`,e),{code:a.PARAM_ERROR};if(!he(o))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, videoElement: need a video element, value: ${o instanceof HTMLElement?o.nodeName:o}`,e),{code:a.PARAM_ERROR}}return this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,"succes",e),this._rtcModule.setVideoView(s,e),{code:a.SUCCESS}}removeVideoView(s){const e=this._logger.createTraceId();return this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T,JSON.stringify({userIds:s}),e),l.notEmptyArray(s)&&s.every(_=>l.notEmptyString(_))?(this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,"succes",e),this._rtcModule.removeVideoView(s,e),{code:a.SUCCESS}):(this._logger.error(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR})}async playMedia(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_T,JSON.stringify({userId:s,mediaType:e}),_),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, userId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};if(l.isUndefined(u[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, mediaType is illegal, value: ${e}`,_),{code:a.PARAM_ERROR};if(e===u.AUDIO&&s===this._context.getCurrentId())return this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,"success",_),{code:a.SUCCESS};const{videoView:i}=this._rtcModule.getUserViewMap()[s]||{};return e!==u.AUDIO&&!i?(this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`errCode: ${a.VIDEO_VIEW_NOT_SET}, video view not set`,_),{code:a.VIDEO_VIEW_NOT_SET}):this._rtcModule.playMedia(s,e,i,_)}createVideoConfigBuilder(){return new Le(this._logger)}setVideoConfig(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T,JSON.stringify(s));const{frameRate:e,resolution:_,maxBitrate:i,minBitrate:r}=s;if(!N.RCFrameRate[e])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, frameRate is illegal, value: ${e}`),{code:a.PARAM_ERROR};if(!N.RCResolution[_])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, resolution is illegal, value: ${_}`),{code:a.PARAM_ERROR};const{code:o,errorMsg:E}=Te(r,i);return o!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,E),this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,"success"),this._videoConfig={...s},this._rtcModule.setVideoConfig(this._videoConfig),{code:a.SUCCESS}}createAudioConfigBuilder(){return new Ee(this._logger)}setAudioConfig(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T,JSON.stringify(s));const{sampleRate:e,minBitrate:_,maxBitrate:i}=s;if(e&&!l.isNumber(e))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,`param error, sampleRate: type is number, value: ${e}`),{code:a.PARAM_ERROR};const{code:r,errorMsg:o}=Te(_,i);return r!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,o),this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,"success"),this._audioConfig={...s},this._rtcModule.setAudioConfig(this._audioConfig),{code:a.SUCCESS}}async startCall(s,e=D.SINGLE,_=u.AUDIO_VIDEO){this._clientCallId=l.getUUID();const i=+new Date,r=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_T,`userIds: ${s.join(",")}, callType: ${e}, mediaType: ${_}`,r),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,r),{code:a.SIGNAL_DISCONNECTED};const o=this._context.getNaviInfo();if(!o||!ee(o))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,r),{code:a.RTC_SERVICE_UNAVAILABLE};if(!(l.notEmptyArray(s)&&s.every(C=>l.notEmptyString(C))))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,r),{code:a.PARAM_ERROR};if(l.isUndefined(D[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, callType is illegal, value: ${e}`,r),{code:a.PARAM_ERROR};if(l.isUndefined(u[_]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, mediaType is illegal, value: ${_}`,r),{code:a.PARAM_ERROR};if(s.length>1&&e===D.SINGLE)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, You can only call one person in a single call, userIds: ${s.join(",")}`,r),{code:a.PARAM_ERROR};if(this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SESSION_EXIST}, session exist`,r),{code:a.SESSION_EXIST};const{code:E}=await this._rtcModule.createCallMediaTracks(_,r);if(E!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`create meida tracks error code: ${E}`,r),{code:E};const{code:L,data:c}=await this._callEngine.startCall({toUsers:s.map(C=>({userId:C})),callType:e,mediaType:_,callId:this._clientCallId},r);if(this._callPlusStatistics.reportStatisticsData(F.L_QS_START_CALL_S,L,i,null,this._clientCallId,null,{mediaType:_,callType:e,callId:(c==null?void 0:c.callId)||""}),L!==a.SUCCESS)return this._rtcModule.destroyAllTracks(r),this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`signal error code: ${L}`,r),{code:L};const{callId:T,clientCallId:S}=c;return this._needHangupCallId===S?(this._callEngine.clearAllTimer(T,r),this._callEngine.hangup({callId:T},r),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,`the ${T} call has been hangup`,r),{code:a.SUCCESS}):(e===D.MULTI&&await this._rtcModule.sessionConnected(T,r),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,JSON.stringify({data:c,code:L}),r),{code:a.SUCCESS,callId:T})}async joinMultiCall(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T,`callId: ${s}`,e),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SIGNAL_DISCONNECTED}`,e),{code:a.SIGNAL_DISCONNECTED};const _=this._context.getNaviInfo();if(!_||!ee(_))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.RTC_SERVICE_UNAVAILABLE}`,e),{code:a.RTC_SERVICE_UNAVAILABLE};if(!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`params err, callId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};const{code:i,data:r}=await this._callEngine.getCallSession({callId:s},e);if(i!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`get call data error, code: ${i}`,e),{code:i};const{mediaType:o}=r,E=this._callEngine.getLocalMainSession();if(E&&E.getCallId()!==s)return{code:a.SESSION_EXIST};const{code:L}=await this._rtcModule.createCallMediaTracks(o,e);if(L!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`create meida tracks error code: ${L}`,e),{code:L};const{code:c}=await this._callEngine.joinCall({callId:s,mediaType:o},e);return c!==a.SUCCESS?(this._rtcModule.destroyAllTracks(e),this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`signal error code: ${c}`,e),{code:c}):(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SUCCESS}`,e),await this._rtcModule.sessionConnected(s,e),{code:a.SUCCESS})}async invite(s){var o;const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_T,`callId: ${s.join(",")}`,e),!(l.notEmptyArray(s)&&s.every(E=>l.notEmptyString(E))))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};const{code:_,data:i}=await this._callEngine.invite({toUsers:s.map(E=>({userId:E}))},e);if(_!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`signal error code: ${_}`,e),{code:_};const r=[];return(o=i.busylineUsers)!=null&&o.length&&r.push(...i.busylineUsers.map(E=>({userId:E.userId,state:E.sessionStatus}))),this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_R,`success busyUsers: ${JSON.stringify(r)}`,e),{code:a.SUCCESS,busyUsers:r}}async accept(s){const e=+new Date,_=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_T,`callId: ${s}`,_),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,_),{code:a.SIGNAL_DISCONNECTED};const i=this._context.getNaviInfo();if(!i||!ee(i))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,_),{code:a.RTC_SERVICE_UNAVAILABLE};if(!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`params err, callId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};const r=this._callEngine.getLocalMainSession(),o=this._callEngine.getHoldSession(s);if(!r&&!o)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode : ${a.NOT_IN_CALL}, session not exist`,_),{code:a.NOT_IN_CALL};if(s===(o==null?void 0:o.getCallId())){const{code:S}=await this.hangup(r.getCallId());if(S!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`hangup mainSession error code: ${S}`,_),{code:S};this._callEngine.upgradeMainSession(s)}const L=r.getMediaType(),{code:c}=await this._rtcModule.createCallMediaTracks(L,_);if(c!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`create meida tracks error code: ${c}`,_),{code:c};const{code:T}=await this._callEngine.accept({callId:s},_);return this._callPlusStatistics.reportStatisticsData(F.L_QS_ACCEPT_CALL_S,T,e,r),T!==a.SUCCESS?(this._rtcModule.destroyAllTracks(_),this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`signal error code: ${T}`,_),{code:T}):(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_R,"success",_),this._rtcModule.sessionConnected(s,_),{code:a.SUCCESS})}async __innerHangup(s,e){var r;const{callId:_}=s;this._callEngine.setIsLocalClientHangup(!0),this._callEngine.clearAllTimer(_,e);const{code:i}=await this._callEngine.hangup(s,e);return i===Ie.CALL_NOT_EXIST?{code:a.SUCCESS}:(i===a.SUCCESS&&_===((r=this._callEngine.getLocalMainSession())==null?void 0:r.getCallId())&&await this._rtcModule.sessionClose(_,e),{code:i})}async hangup(s){const e=+new Date,_=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_T,`callId: ${s}`,_);const i=this._callEngine.getLocalMainSession();if(!i)return{code:a.NOT_IN_CALL};if(s&&!l.isString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId: type is string, value: ${s}`,_),{code:a.PARAM_ERROR};const r=i.getCallId();if(s&&s!==r&&!this._callEngine.getHoldSession(s))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId is invalid, value: ${s}`,_),{code:a.CALL_ID_INVALID};this._isLaunchHangup=!0,this._needHangupCallId=s||r;const E=this._callEngine.getHoldSession(this._needHangupCallId)||i,L=this._context.getCurrentId(),c=i.getUserList().filter(h=>h.userId===L)[0].state,T=[i.getCreatorUserId(),i.getInviterUserId()].includes(L),S=Re(c,T),{code:C}=await this.__innerHangup({callId:this._needHangupCallId,systemState:S},_);return this._callPlusStatistics.reportStatisticsData(F.L_QS_HANGUP_CALL_S,C,e,E,this._clientCallId),C!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`signal error code : ${C}`,_),{code:C}):(this._needHangupCallId=null,this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_R,"success",_),{code:a.SUCCESS})}async requestChangeMediaType(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T,`mediaType: ${s}`,e),l.isUndefined(u[s]))return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`params err, mediaType is illegal, value: ${s}`,e),{code:a.PARAM_ERROR};const _=this.getCurrentCallSession(),i=_==null?void 0:_.getMediaType();if(s===i)return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code: ${a.MEDIATYPE_INVALID}`,e),{code:a.MEDIATYPE_INVALID};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const r=_==null?void 0:_.getUserList().filter(L=>L.userId!==this._context.getCurrentId()).map(L=>L.userId),{code:o,data:E}=await this._callEngine.requestChangeMediaType({mediaType:s,toUserIds:r||[]},e);return o!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`signal error code: ${o}`,e),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`success transactionId: ${E.transactionId}`,e),{code:a.SUCCESS,transactionId:E.transactionId})}async cancelChangeMediaType(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T,`transactionId: ${s}`,e),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const{code:_}=await this._callEngine.cancelChangeMediaType({transactionId:s},e);return _!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`signal error code: ${_}`,e),{code:_}):(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,"success",e),{code:a.SUCCESS})}async replyChangeMediaType(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T,`transactionId: ${s}`,_),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};if(!l.isBoolean(e))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, isAgree: type is boolean, value: ${e}`,_),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,_),{code:a.NOT_IN_CALL};const{code:i}=await this._callEngine.responseChangeMediaType({transactionId:s,agree:e},_);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`signal error: ${i}`,_),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,"success",_),{code:a.SUCCESS})}getCurrentCallSession(){return this._callEngine.getLocalMainSession()}async getAvailableCallRecordsFromServer(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T,"",s);const{code:e,data:_}=await this._callEngine.getOpenCallList(s);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`success, data: ${JSON.stringify(_)}`,s),{code:a.SUCCESS,records:_})}async getCallRecords(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T,`startTimestamp: ${s}, count: ${e}`,_),!(l.isNumber(s)&&s>=0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, startTimestamp: is a number >= 0, value: ${s}`,_),{code:a.PARAM_ERROR};if(!(l.isNumber(e)&&e>0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, count: is a number >= 0, value: ${e}`,_),{code:a.PARAM_ERROR};const{code:i,data:r}=await this._callEngine.getCallLogList({timestamp:s,count:e},_);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`signal error code: ${i}`,_),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,"success",_),{code:a.SUCCESS,result:r})}async deleteCallRecordsFromServer(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T,`callIds: ${s.join(",")}`,e),!(l.notEmptyArray(s)&&s.every(i=>l.notEmptyString(i))))return this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`params err, callIds: not empty array, callId: not empty string, callIds: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};const{code:_}=await this._callEngine.deleteCallLog(s,e);return _!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`signal error code: ${_}`,e),{code:_}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,"success",e),{code:a.SUCCESS})}async deleteAllCallRecordsFromServer(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T,"",s);const{code:e}=await this._callEngine.removeAllCallLog(s);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,"success",s),{code:a.SUCCESS})}async startCamera(){var r;const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_T,"",s);const{code:e,track:_}=await this._rtcModule.getCameraVideoTrack(s);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`create video track error code: ${e}`,s),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.VIDEO,!0,s),!(_!=null&&_.isPublished())&&((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())===p.ONCALL){const{code:o}=await this._rtcModule.publishVideoTrack();return o!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`publish error code: ${o}`,s),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",s),{code:a.SUCCESS})}const{code:i}=await this._rtcModule.enableVideoTrack(s);return i!==N.RCRTCCode.SUCCESS&&i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`signal error code: ${i}`,s),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",s),{code:a.SUCCESS})}async stopCamera(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_T,"",s);const{code:e,track:_}=await this._rtcModule.disableVideoTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,`error code: ${e}`,s),{code:e}):(this._rtcModule.destroyTrack(_),this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.VIDEO,!1,s),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,"success",s),{code:a.SUCCESS})}async switchCamera(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T,`cameraId: ${s}`,e),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`param error, cameraId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};const _=this._callEngine.getLocalMainSession();if(!_)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_IN_CALL}`,e),{code:a.NOT_IN_CALL};if(_.getMediaType()===u.AUDIO)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_VIDEO_CALL}`,e),{code:a.NOT_VIDEO_CALL};this._videoConfig.cameraId=s,this._rtcModule.setVideoConfig(this._videoConfig);const{code:i}=await this._rtcModule.changeVideoDevice(e);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`call client changeVideoDevice error code: ${i}`,e),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,"success",e),{code:a.SUCCESS})}async startMicrophone(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_T,"",s);const{code:e,track:_}=await this._rtcModule.getMicrophoneAudioTrack(s);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`create microphone audio track error code: ${e}`,s),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.AUDIO,!0,s),!_.isOwnerMuted())return this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",s),{code:a.SUCCESS};const i=await _.unmute();return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`signal error code: ${e}`,s),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",s),{code:a.SUCCESS})}async stopMicrophone(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T,"",s);const{code:e,track:_}=await this._rtcModule.disableAudioTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,`signal error code: ${e}`,s),{code:e}):(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.AUDIO,!1,s),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,"success",s),{code:a.SUCCESS})}isMicrophoneEnabled(){const s=this._rtcModule.getLocalAudioTrack();return!!s&&!s.isOwnerMuted()}async setAllRemoteAudioEnable(s){const e=this._logger.createTraceId();return this._rtcModule.setAllRemoteAudioEnable(s,e)}getVersion(){return"1.1.1"}async getCameras(){return await N.device.getCameras()}async getMicrophones(){return await N.device.getMicrophones()}}const Ge=t=>t?l.isObject(t)?Object.keys(t).includes("rtcClient")?l.isObject(t.rtcClient)?{isLegal:!0}:{isLegal:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:{isLegal:!1,code:a.NOT_INSTALL_RTC_PLUGIN}:{isLegal:!1,msg:"Initialization options must be an object"}:{isLegal:!1,msg:"Initialization missing parameter -> options"},be={tag:"RCCallPlus",verify(t){return l.VersionManage.add("plugin-call-plus","1.1.1"),l.VersionManage.validEngine("5.8.2")?!0:(console.error(`The current engine version '${l.VersionManage.getInfo().engine}' error, plugin-call-plus required engine version at least '5.8.2'.`),!1)},setup(t,s,e){const _=Ge(e);if(!_.isLegal)throw new Error(`[CallPlusLib installer steup]${_.msg}`);const i=t.createLogger("CallPlusLib","RTC"),r=l.isUndefined(e.logOutputLevel)?l.LogL.WARN:e.logOutputLevel;return i.setOutputLevel(r),i.warn(n.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O,"CallPlus Version: 1.1.1, Commit: f2e9aab8b7f19afd4f772d1665c3afc9fb979871"),new Ce(t,i,s,e)}};Object.defineProperty(g,"RCCallPlusFrameRate",{enumerable:!0,get:()=>N.RCFrameRate}),Object.defineProperty(g,"RCCallPlusResolution",{enumerable:!0,get:()=>N.RCResolution}),g.RCAudioConfigBuilder=Ee,g.RCCallPlusCallState=p,g.RCCallPlusClient=Ce,g.RCCallPlusCode=a,g.RCCallPlusMediaType=u,g.RCCallPlusMediaTypeChangeResult=k,g.RCCallPlusReason=A,g.RCCallPlusSession=K,g.RCCallPlusSessionUserState=d,g.RCCallPlusType=D,g.RCVideoConfigBuilder=Le,g.installer=be,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yYW5kb20udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9pbmRleERCLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9BYm5vcm1hbENhbGwudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXZlbnRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvVGltZUNvcnJlY3Rpb25lci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0ZvcndhcmRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsRGlyZWN0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvUkNDYWxsRW5naW5lLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUlRDUmVzb3VyY2VUYWcudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JUQ01vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahCBzZXNzaW9uXG4gICAqL1xuICBTRVNTSU9OX0VYSVNUOiA4MDAwMixcbiAgLyoqXG4gICAqIOacquWKoOWFpemAmuivnVxuICAgKi9cbiAgTk9UX0lOX0NBTEw6IDgwMDAzLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L6KKr56aB5q2iXG4gICAqL1xuICBNRURJQVRZUEVfSU5WQUxJRDogODAwMDQsXG4gIC8qKlxuICAgKiDlvZPliY3kuI3mmK/op4bpopHpgJror51cbiAgICovXG4gIE5PVF9WSURFT19DQUxMOiA4MDAwNSxcbiAgLyoqXG4gICAqIOW8gOmAmueahOmfs+inhumikeacjeWKoeayoeacieWPiuaXtueUn+aViOaIlumfs+inhumikeacjeWKoeW3suWFs+mXrVxuICAgKi9cbiAgUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEU6IDgwMDA2LFxuICAvKipcbiAgICog6LCD55So5Ye95pWw5pe277yM5Lyg5YWl55qE55So5oi35YiX6KGo5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0xJU1RfSU5WQUlMRDogODAwMDcsXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTpgJror50gSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBDQUxMX0lEX0lOVkFMSUQ6IDgwMDA4LFxuICAvKipcbiAgICog5LqL5YqhIElkIOS4uuepuumUmeivr1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfSU5WQUxJRDogODAwMDksXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTnlKjmiLcgSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0lEX0lOVkFMSUQ6IDgwMDEwLFxuICAvKipcbiAgICog5Y+R6LW35Y2V5Lq65ZG85Y+r5pe277yM5Lq65ZGY5YiX6KGo5Lit5Y+q6IO95pyJ5LiA5Liq5Lq6XG4gICAqL1xuICBTSU5HTEVfQ0FMTF9OT1RfU1VQUE9SVF9NVUxUSV9QRVJTT046IDgwMDExLFxuICAvKipcbiAgICogaW0g5pyq6L+e5o6lXG4gICAqL1xuICBTSUdOQUxfRElTQ09OTkVDVEVEOiA4MDAxMixcbiAgLyoqXG4gICAqIOaRhOWDj+WktOacquaJk+W8gFxuICAgKi9cbiAgQ0FNRVJBX0NMT1NFRDogODAxMDAsXG4gIC8qKlxuICAgKiDpuqblhYvpo47mnKrmiZPlvIBcbiAgICovXG4gIE1JQ1JPUEhPTkVfQ0xPU0VEOiA4MDEwMSxcbiAgLyoqXG4gICAqIOaXoOWqkuS9k+i1hOa6kFxuICAgKi9cbiAgTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQ6IDgwMTAyLFxuICAvKipcbiAgICog5pyqIGluc3RhbGwgUlRDIOaPkuS7tlxuICAgKi9cbiAgTk9UX0lOU1RBTExfUlRDX1BMVUdJTjogODAxMDMsXG4gIC8qKlxuICAgKiDmkq3mlL7lvILluLhcbiAgICovXG4gIFBMQVlfTUVESUFfRkFJTEVEOiA4MDEwNCxcbiAgLyoqXG4gICAqIOaSreaUvuinhumikemcgOimgSB2aWRlbyDlhYPntKBcbiAgICovXG4gIFZJREVPX1ZJRVdfTk9UX1NFVDogODAxMDUsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUkNDYWxsUGx1c0xvZ2dlclRhZyB7XG4gIExfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08gPSAnTC1pbmRleF9pbnN0YWxsX2NhbGxfcGx1c19wbHVnaW4tTycsXG4gIC8qKlxuICAgKiDkuJrliqHlsYLkuovku7bms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9ldmVudF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOS4muWKoeWxguS6i+S7tuiwg+eUqFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfZXZlbnRfbGlzdGVuZXItTycsXG4gIC8qKlxuICAgKiDpgJror53otKjph4/mlbDmja7nm5HlkKzms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9TVEFUVVNfUkVQT1JUX0xJU1RFTkVSX08gPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3N0YXR1c19yZXBvcnRfbGlzdGVuZXItTycsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfU1RBVFVTX1JFUE9SVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfc3RhdHVzX3JlcG9ydF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOiuvue9ruaRhOWDj+WktOinhumikemFjee9rumhuVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF92aWRlb19jb25maWctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zZXRfdmlkZW9fY29uZmlnLVInLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9mcmFtZV9yYXRlLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfUkVTT0xVVElPTl9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9yZXNvbHV0aW9uLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfQklUUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9iaXRyYXRlLU8nLFxuICAvKipcbiAgICog6K6+572u6bqm5YWL6aOO6Z+z6aKR6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X2F1ZGlvX2NvbmZpZy1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9hdWRpb19jb25maWctUicsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9CSVRSQVRFX08gPSAnTC1jYWxscGx1c19hdWRpb19jb25maWdfc2V0X2JpdHJhdGUtTycsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9TQU1QTEVfUkFURV9PID0gJ0wtY2FsbHBsdXNfYXVkaW9fY29uZmlnX3NldF9zYW1wbGVfcmF0ZS1PJyxcbiAgLyoqXG4gICAqIOmihOiniFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfUFJFVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3ByZXZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BSRVZJRVdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9wcmV2aWV3LVInLFxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfY2FsbC1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbGwtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror53ku7vliqFcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2pvaW5fbXVsdGlfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnee7k+aenFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IgPSAnTC1jYWxscGx1c19jbGllbnRfam9pbl9tdWx0aV9jYWxsLVInLFxuICAvKipcbiAgICog5o6l5ZCs6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9hY2NlcHQtVCcsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror53nu5PmnpxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2FjY2VwdC1SJyxcbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1QgPSAnTC1jYWxscGx1c19jbGllbnRfaGFuZ3VwLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9oYW5ndXAtUicsXG4gIC8qKlxuICAgKiDpgoDor7dcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2ludml0ZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfaW52aXRlLVInLFxuICAvKipcbiAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2i6K+35rGCXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1jYWxscGx1c19jbGllbnRfcmVxdWVzdF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcXVlc3RfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbmNlbF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfY2FuY2VsX2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i5bqU562UXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6L+b6KGM5Lit55qE6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ1VSUkVOVF9DQUxMX1NFU1NJT05fVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY3VycmVudF9jYWxsX3Nlc3Npb24tVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DVVJSRU5UX0NBTExfU0VTU0lPTl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9jdXJyZW50X2NhbGxfc2Vzc2lvbi1SJyxcbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKiBBdmFpbGFibGVDYWxsU2Vzc2lvbnNGcm9tU2VydmVyXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9hdmFpbGFibGVfY2FsbF9zZXNzaW9uc19mcm9tX3NlcnZlci1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfYXZhaWxhYmxlX2NhbGxfc2Vzc2lvbnNfZnJvbV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53orrDlvZVcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY2FsbF9yZWNvcmRzLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IgPSAnTC1jYWxscGx1c19jbGllbnRfZ2V0X2NhbGxfcmVjb3Jkcy1SJyxcbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg5riF55CG6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVInLFxuICAvKipcbiAgICog5riF55CG5omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVInLFxuICAvKipcbiAgICog5omT5byA5pGE5YOP5aS0XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdGFydF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zd2l0Y2hfY2FtZXJhLVInLFxuICAvKipcbiAgICog5omT5byA6bqm5YWL6aOOXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X21pY3JvcGhvbmUtUicsXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0b3BfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc3RvcF9taWNyb3Bob25lLVInLFxuICAvKipcbiAgICog6K6+572uIHZpZGVvIHZpZXdcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctUicsXG4gIExfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PID0gJ0wtcnRjX21vZHVsZV9zZXRfdmlkZW9fdmlldy1PJyxcbiAgLyoqXG4gICAqIOWIoOmZpCB2aWRlbyB2aWV3XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVInLFxuICBMX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTyA9ICdMLXJ0Y19tb2R1bGVfcmVtb3ZlX3ZpZGVvX3ZpZXctTycsXG4gIC8qKlxuICAgKiDmkq3mlL7lqpLkvZNcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9wbGF5X21lZGlhLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IgPSAnTC1jYWxscGx1c19jbGllbnRfcGxheV9tZWRpYS1SJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfVCA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1UJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1SJyxcbiAgLyoqXG4gICAqIOmdmemfs+i/nOerr+mfs+mikVxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9UID0gJ0wtcnRjX21vZHVsZV9zZXRfYWxsX3JlbW90ZV9hdWRpb19lbmJhbGUtVCcsXG4gIExfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiA9ICdMLXJ0Y19tb2R1bGVfc2V0X2FsbF9yZW1vdGVfYXVkaW9fZW5hYmxlLVInLFxuICAvKipcbiAgICog6K6i6ZiFXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QgPSAnTC1ydGNfbW9kdWxlX3N1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SID0gJ0wtcnRjX21vZHVsZV9zdWJzY3JpYmUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojorqLpmIVcbiAgICovXG4gIExfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9UID0gJ0wtcnRjX21vZHVsZV91bnN1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IgPSAnTC1ydGNfbW9kdWxlX3Vuc3Vic2NyaWJlLVInLFxuICAvKipcbiAgICog5Li75Yqo5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9UID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVQnLFxuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVInLFxuICAvKipcbiAgICog5Y+W5raI5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfVU5QVUJMSVNIX1QgPSAnTC1ydGNfbW9kdWxlX3VucHVibGlzaC1UJyxcbiAgTF9SVENfTU9EVUxFX1VOUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV91bnB1Ymxpc2gtUicsXG4gIC8qKlxuICAgKiDplIDmr4HmiYDmnInpn7Pop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTyA9ICdMLXJ0Y19tb2R1bGVfZGVzdHJveV9hbGxfdHJhY2tzLU8nLFxuICAvKipcbiAgICogc2Vzc2lvbiDlu7rnq4vlkI4gUlRDIOaooeWdl+eahOWkhOeQhlxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9UID0gJ0wtcnRjX21vZHVsZV9zZXNzaW9uX2Nvbm5lY3QtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCA9ICdMLXJ0Y19tb2R1bGVfc2Vzc2lvbl9jb25uZWN0LVAnLFxuICBMX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY29ubmVjdC1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g57uT5p2f5ZCOIFJUQyDmqKHlnZfnmoTlpITnkIZcbiAgICovXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1AgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUicsXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX3ZpZGVvX3RyYWNrLVQnLFxuICBMX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IgPSAnTC1ydGNfbW9kdWxlX2NyZWF0ZV92aWRlb190cmFjay1SJyxcbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikei1hOa6kFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19UID0gJ0wtcnRjX21vZHVsZV9jcmVhdGVfYXVkaW9fdHJhY2stVCcsXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX2F1ZGlvX3RyYWNrLVInLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfcHVibGlzaC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOi1hOa6kOWPlua2iOWPkeW4g1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfdW5wdWJsaXNoLU8nLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfZW5hYmxlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOiiq+i4ouWHuuaIv+mXtFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTyA9ICdMLXJ0Y19tb2R1bGVfcmVjZWl2ZV9raWNrX29mZi1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBwZWVyY29ubmVjdGlvbiDlvILluLjlhbPpl61cbiAgICovXG4gIExfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PID0gJ0wtcnRjX21vZHVsZV9yZWNlaXZlX3BlZXJjb25uZWN0aW9uX2V4Y2VwdF9jbG9zZS1PJyxcbiAgLyoqXG4gICAqIOWIh+aNouWqkuS9k+exu+Wei1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1ydGNfbW9kdWxlX2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiA9ICdMLXJ0Y19tb2R1bGVfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tUicsXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tUicsXG5cbiAgLy8gc2lnbmFsIOaooeWdl+aXpeW/l+agh+etvlxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3NpbmdsZV9jYWxsLVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ3JvdXBfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOmCgOivt1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW52aXRlLVQnLFxuICAvKipcbiAgICog5ZON6ZODXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmluZy1UJyxcbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfYWNjZXB0LVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9BQ0NFUFRfUiA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9hY2NlcHQtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2pvaW5fY2FsbC1UJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaGFuZ3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2NhbGxfc3RhdHVzX3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2FsbF9ldmVudF91cC1UJyxcbiAgLyoqXG4gICAqIOmAmuivneWvueivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9jYWxsX2RpYWxvZ191cC1UJyxcbiAgLyoqXG4gICAqIOWIoOmZpOmAmuivneiusOW9lVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfREVMRVRFX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZGVsZXRlX2NhbGxfcmVjb3JkLVQnLFxuICAvKipcbiAgICog6I635Y+W6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9SRUNPUkRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9TRVJWRVJfVElNRV9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX3NlcnZlcl90aW1lLVQnLFxuICAvKipcbiAgICog6I635Y+W5oyH5a6a6YCa6K+d55qE5pe26Ze05L+h5oGvXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9USU1FX0lORk9fVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF90aW1lX2luZm8tVCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfmnKrnu5PmnZ/nmoTpgJror53liJfooajkv6Hmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9BVkFJTEFCTEVfQ0FMTF9MSVNUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ2V0X2F2YWlsYWJsZV9jYWxsX2xpc3QtVCcsXG4gIC8qKlxuICAgKiDmuIXpmaTpgJror53orrDlvZVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2xlYXJfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlumAmuivneS/oeaBr1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfSU5GT19CWV9DQUxMSURfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9pbmZvX2J5X2NhbGxJZC1UJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfVVNFUl9TWVNURU1fU1RBVEVfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl91c2VyX3N5c3RlbV9zdGF0ZV91cC1UJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIHNpZ25hbCDmtojmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TSUdOQUxfREFUQV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfY2FsbF9zaWduYWxfZGF0YS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOWMllxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW1fc3RhdGVfY2hhbmdlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d6YKA6K+3XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfaW52aXRlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9jYWxsX3N0YXR1cy1PJyxcbiAgLyoqXG4gICAqIGNhbGwgZW5naW5lIOabtOaWsOS6uuWRmOeKtuaAgVxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTyA9ICdMLWNhbGxfZW5naW5lX3VwZGF0ZV91c2Vyc19zdGF0ZS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOabtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9JTV9TVEFURV9DSEFOR0VfTyA9ICdMLWNhbGxfZW5naW5lX2ltX3N0YXRlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq+OAgeaUtuWIsOmCgOivt+i2heaXtlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DQUxMX1RJTUVPVVRfTyA9ICdMLWNhbGxfZW5naW5lX2NhbGxfdGltZW91dC1PJyxcbiAgLyoqXG4gICAqIOW8gOWQr+mAmuivneWumuaXtuWZqFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9TVEFSVF9DQUxMX1RJTUVSX08gPSAnTC1jYWxsX2VuZ2luZV9zdGFydF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5riF6Zmk6YCa6K+d5a6a5pe25ZmoXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PID0gJ0wtY2FsbF9lbmdpbmVfc3RvcF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5LiK5oqlIG9uUGhvbmVFbmRcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtVCcsXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtUicsXG4gIC8qKlxuICAgKiDmlLbliLDpppbluKfml7bpl7TkuIvlj5FcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2ZpcnN0X2ZyYW1lX3RpbWUtTycsXG4gIC8qKlxuICAgKiDmlLbliLDlqpLkvZPnsbvlnovliIfmjaLkuovku7ZcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX21lZGlhdHlwZV9jaGFuZ2UtTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53nu5PmnZ9cbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2Nsb3NlX3Nlc3Npb24tTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53ml6Xlv5dcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jYWxsX3JlY29yZC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOihpeWBv+aVsOaNrlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jb21wbGVtZW50YXJ5X2RhdGEtTycsXG4gIC8qKlxuICAgKiDliJvlu7ogc2Vzc2lvblxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfVCA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1UJyxcbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOS4iuaKpemmluW4p+aXtumXtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9maXJzdF9mcmFtZV90aW1lLVQnLFxuICBMX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfUiA9ICdMLWNhbGxfZW5naW5lX3VwX2ZpcnN0X2ZyYW1lX3RpbWUtUicsXG4gIC8qKlxuICAgKiDlvIDlkK/ml7bpl7TmoKHmraNcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUQVJUX08gPSAnTC10aW1lX2NvcnJlY3Rfc3RhcnQtTycsXG4gIC8qKlxuICAgKiDlgZzmraLmoKHml7ZcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUT1BfTyA9ICdMLXRpbWVfY29ycmVjdF9zdG9wLU8nLFxuICAvKipcbiAgICog6YeN5paw5byA5ZCv5qCh5pe2XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9SRVNUQVJUX08gPSAnTC10aW1lX2NvcnJlY3RfcmVzdGFydC1PJyxcbiAgLyoqXG4gICAqIOS7juacjeWKoeerr+iOt+WPlumAmuivneaXtumVv+OAgemAmuivneW8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1QgPSAnTC10aW1lX2NvcnJlY3RfZ2V0X2NhbGxfY2xpZW50X3RpbWVfYnlfc2VydmVyLVQnLFxuICBMX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCA9ICdMLXRpbWVfY29ycmVjdF9nZXRfY2FsbF9jbGllbnRfdGltZV9ieV9zZXJ2ZXItUCcsXG4gIExfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SID0gJ0wtdGltZV9jb3JyZWN0X2dldF9jYWxsX2NsaWVudF90aW1lX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9UID0gJ0wtdGltZV9jb3JyZWN0X2NhbGNfY2xpZW50X3N0YXJ0X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiA9ICdMLXRpbWVfY29ycmVjdF9jYWxjX2NsaWVudF9zdGFydF90aW1lLVInLFxuICAvKipcbiAgICog5a2Y5YKo5a6i5oi356uv5ZKM5pyN5Yqh56uv5pe26Ze05YGP5beuXG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PID0gJ0wtdGltZV9jb3JyZWN0X3NldF9kZWx0YV90aW1lLU8nLFxuICAvKipcbiAgICog5b6q546v5LiJ5qyh5qCh5q2j57uZ5a6i5oi356uv55qE5pe26Ze0XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfVCA9ICdMLXRpbWVfY29ycmVjdF9sb29wX2NvcnJlY3RfY2xpZW50X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SID0gJ0wtdGltZV9jb3JyZWN0X2xvb3BfY29ycmVjdF9jbGllbnRfdGltZS1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g5YaF6YOo5pu05paw5Lq65ZGY54q25oCBXG4gICAqL1xuICBMX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTyA9ICdMLWlubmVyX3Nlc3Npb25fdXBkYXRlX3VzZXJfc3RhdGUtTycsXG4gIC8qKlxuICAgKiDorr7nva4gc2Vzc2lvbiDkurrlkZjorr7lpIfnirbmgIFcbiAgICovXG4gIExfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08gPSAnTC1pbm5lcl9zZXNzaW9uX3NldF91c2VyX2RldmljZV9lbmFibGUtTycsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1QgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtVCcsXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICovXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1QgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tVCcsXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1IgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tUicsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNUeXBlLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbm5lclNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbElubmVyU2Vzc2lvbic7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuLyoqXG4gKiDlr7nlpJYgc2Vzc2lvbiDlrp7kvovvvIzku4XmnInojrflj5bmlrnms5XvvIzml6Dms5Xkv67mlLlcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNTZXNzaW9uIHtcbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfZHVyYXRpb246IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9jYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9jYWxsSWQgPSB0aGlzLl9zZXNzaW9uLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBDYWxsSWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIGdldFN0YXRlKCk6IFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsVHlwZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneWqkuS9k+exu+Wei1xuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53kurrlkZjliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyTGlzdCgpOiB7IHVzZXJJZDogc3RyaW5nLCBzdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgY2FtZXJhRW5hYmxlLCBtaWNyb3Bob25lRW5hYmxlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHN0YXRlOiB1c2VyU3RhdGUsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5Y+R6LW36ICFIHVzZXJJZFxuICAgKi9cbiAgZ2V0Q3JlYXRvclVzZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53pgoDor7fogIUgdXNlcklkXG4gICAqIOWRvOWFpeacieWAvO+8jOWRvOWHuuaXtu+8jOWAvOS4uuacrOWcsOeUqOaItyBVc2VySWRcbiAgICovXG4gIGdldEludml0ZXJVc2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsZXJJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivnei1t+Wni+aXtumXtFxuICAgKi9cbiAgYXN5bmMgZ2V0Q3JlYXRlVGltZXN0YW1wKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgc3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfVCwgJycsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTdGFyaW5nVGltZSh7IGNhbGxJZDogdGhpcy5fY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9DUkVBVEVfVElNRV9SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBjbGllbnRTdGFydFRpbWUhO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICog6YCa6K+d5pyq57uT5p2f5YmN77yM5YC85Li6IDBcbiAgICovXG4gIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fZHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke3RoaXMuX2R1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgZHVyYXRpb246IHRoaXMuX2R1cmF0aW9uIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyh0aGlzLl9jYWxsSWQsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke2RhdGEhLmR1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2R1cmF0aW9uID0gZGF0YSEuZHVyYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkdXJhdGlvbjogdGhpcy5fZHVyYXRpb24sXG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlkbzlj6vnsbvlnotcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsUGx1c1R5cGUge1xuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqL1xuICBTSU5HTEUsXG4gIC8qKlxuICAgKiDlpJrkurrlkbzlj6tcbiAgICovXG4gIE1VTFRJXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiBJRExFXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOebtOaOpeaMguaWrVxuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOetieW+heaOpeWQrOWFtuS7lumAmuivnVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOato+WcqOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog5q2j5Zyo57O757uf6YCa6K+d5LitXG4gICAqL1xuICBPTlBIT05FID0gMzAxLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/otoXml7bmnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDpgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDpgJror53mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOW8guW4uFxuICAgKi9cbiAgRVJST1IgPSAyMDAwXG59XG4iLCIvKipcbiAqIOWRvOWPq+WqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgLyoqXG4gICAqIOmfs+mikVxuICAgKi9cbiAgQVVESU8sXG4gIC8qKlxuICAgKiDpn7Pop4bpopFcbiAgICovXG4gIEFVRElPX1ZJREVPLFxuICAvKipcbiAgICog6KeG6aKRXG4gICAqL1xuICBWSURFTyxcbn1cbiIsIi8qKlxuICog6YCa6K+d54q25oCBXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAvKipcbiAgICog5Yid5aeL54q25oCBXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOato+WcqOWRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW/mee6v+WTjemTg1xuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW/mee6v+etieW+hVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PQU5TV0VSID0gMTAwMSxcbiAgLyoqXG4gICAqIOW3seerr+acquaOpeWQrFxuICAgKi9cbiAgTUlTU0VEID0gMTAwMixcbiAgLyoqXG4gICAqIOW3seerr+WPlua2iOmAmuivnVxuICAgKi9cbiAgQ0FOQ0VMRUQgPSAxMDAzLFxuICAvKipcbiAgICog6L+c56uv5ouS57udXG4gICAqL1xuICBERUNMSU5FRCA9IDEwMDQsXG5cbiAgRVJST1IgPSAyMDAwXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IHtcbiAgLyoqXG4gICAqIOivt+axguaWueWPlua2iOWqkuS9k+exu+Wei+WPmOabtFxuICAgKi9cbiAgQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFID0gMCxcbiAgLyoqXG4gICAqIOW6lOetlOaWueaLkue7neWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFID0gMSxcbiAgLyoqXG4gICAqIOacjeWKoeS7suijgeWFgeiuuOWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgU0VSVkVSX0FMTE9XX01FRElBX1RZUEUgPSAyLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i6LaF5pe2XG4gICAqL1xuICBDSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUID0gMyxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNSZWFzb24ge1xuICBJRExFID0gMCxcbiAgQ0FMTElORyA9IDEwMCxcbiAgSU5WSVRFRCA9IDEwMSxcbiAgUklOR0lORyA9IDEwMixcbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgT05DQUxMID0gMzAwLFxuICBPTl9QSE9ORSA9IDMwMSxcbiAgT05fUEhPTkVfRU5EID0gMzAyLFxuICAvKipcbiAgICog6L6T5YWl6K6+5aSH5LiN5Y+v55SoXG4gICAqL1xuICBPTl9ERVZJQ0VfRElTQUJMRSA9IDMwMyxcbiAgLyoqXG4gICAqIOi+k+WFpeiuvuWkh+WPr+eUqFxuICAgKi9cbiAgT05fREVWSUNFX0VOQUJMRSA9IDMwNCxcbiAgLyoqXG4gICAqIOacrOerr+W8guW4uOemu+W8gFxuICAgKi9cbiAgQUJOT1JNQUxfRU5EID0gOTk5LFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDlt7Hnq6/pgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDov5znq6/mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+WRvOWHuijlvZPliY3nq6/ooqvouKIpXG4gICAqL1xuICBPVEhFUl9DTElFTlRfQ0FMTElORyA9IDEwMTAsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/lt7LmjqXlkKxcbiAgICovXG4gIE9USEVSX0NMSUVOVF9BQ0NFUFQgPSAxMDExLFxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKVcbiAgICovXG4gIEpPSU5fUk9PTV9FUlIgPSAxMTA1LFxuICAvKipcbiAgICog5Y+R5biD6LWE5rqQ5aSx6LSlXG4gICAqL1xuICBQVUJMSVNIX0VSUiA9IDExMDYsXG4gIC8qKlxuICAgKiDorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlIgPSAxMTA3LFxuICAvKipcbiAgICog5o6l5ZCs57O757uf6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FSUklFUiA9IDExMDgsXG4gIC8qKlxuICAgKiDooqvnpoHmraLpgJror51cbiAgICovXG4gIEtJQ0tFRF9CWV9TRVJWRVIgPSAxMTA5LFxuICAvKipcbiAgICogUlRDIFBpbmcg5aSx6LSl6KKr6Lii5Ye65oi/6Ze0XG4gICAqL1xuICBDT05ORUNUSU9OX0VSUiA9IDExMTAsXG4gIC8qKlxuICAgKiDnlKjmiLfpgIDlh7rnmbvlvZXooqvouKLlh7rmiL/pl7RcbiAgICovXG4gIExPR09VVCA9IDExMTEsXG4gIC8qKlxuICAgKiDnlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIE9USEVSX0NMSUVOVF9MT0dJTiA9IDExMTIsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/liqDlhaXmlrDpgJror51cbiAgICovXG4gIE9USEVSX0NMSUVOVF9KT0lORUQgPSAxMTEzLFxuICAvKipcbiAgICog5YW25LuW56uv5bey5Zyo5YW25LuW6YCa6K+d5Lit77yI5bex56uvIEExIOWFtuS7luerr+ato+WcqOmAmuivneS4re+8jEEyIOWkmuerr+WPiOWKoOWFpeaIv+mXtOiiq+aLkue7neWQjumAmuivnee7k+adnyBBMiDnmoTnirbmgIHvvIlcbiAgICovXG4gIE9USEVSX0NMSUVOVF9JTl9ST09NID0gMTExNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+W3suaMguaWrVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0hBTkdVUCA9IDExNTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfliqDlhaXmiL/pl7TlpLHotKVcbiAgICovXG4gIFJFTU9URV9KT0lOX1JUQ19FUlJPUiA9IDEyMDUsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflj5HluIPotYTmupDlpLHotKVcbiAgICovXG4gIFJFTU9URV9QVUJMSVNIX0VSUk9SID0gMTIwNixcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDEyMDcsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflt7Looqso5bCB56aBKeemgeatoumAmuivnVxuICAgKi9cbiAgUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIgPSAxMjA5LFxuICAvKipcbiAgICog6L+c56uv55So5oi3VURQ6L+e5o6l5pat5byAXG4gICAqL1xuICBSRU1PVEVfQ09OTkVDVElPTl9FUlJPUiA9IDEyMTAsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfpgIDlh7pJTeeZu+W9lVxuICAgKi9cbiAgUkVNT1RFX0xPR09VVCA9IDEyMTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfTE9HSU4gPSAxMjEyLFxuICAvKipcbiAgICog6L+c56uv55So5oi36KKr5YW25LuW56uv5Yqg5YWl5oi/6Ze0IGpvaW5Sb29tIOi4ouWHulxuICAgKi9cbiAgUkVNT1RFX09USEVSX0pPSU5FRF9SVEMgPSAxMjEzLFxuICAvKipcbiAgICog6L+c56uv55So5oi355qE5YW25LuW56uv5bey57uP5Zyo5oi/6Ze05Lit77yM5LiN5YWB6K64IGpvaW5Sb29tIOi/m+ihjOmfs+inhumikemAmuivnVxuICAgKi9cbiAgUkVNT1RFX09USEVSX0NMSUVOVF9JTl9SVEMgPSAxMjE0XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNOdW1iZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJQXVkaW9Db25maWcgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIOaMh+Wumum7mOiupOm6puWFi+mjjlxuICAgKiBtaWNyb3Bob25lSWQg5Y+W5YC85Y+v5Y+C6ICDIGh0dHBzOi8vZG9jLnJvbmdjbG91ZC5jbi9ydGMvV2ViLzUuWC9kZXZpY2UjJUU4JThFJUI3JUU1JThGJTk2JUU5JUJBJUE2JUU1JTg1JThCJUU5JUEzJThFJUU4JUFFJUJFJUU1JUE0JTg3JUU1JTg4JTk3JUU4JUExJUE4XG4gICAqL1xuICBzZXREZWZhdWx0TWljcm9waG9uZUlkKG1pY3JvcGhvbmVJZDogc3RyaW5nKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1pY3JvcGhvbmVJZCA9IG1pY3JvcGhvbmVJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mnIDlsI/jgIHmnIDlpKfnoIHnjodcbiAgICog5Y2V5L2NIGticHNcbiAgICog5LiN6K6+572u5pe277yM5Y+W5Yqo5oCB56CB546H6K6h566X57uT5p6cXG4gICAqIEBwYXJhbSBtaW4g5pyA5bCP56CB546HXG4gICAqIEBwYXJhbSBtYXgg5pyA5aSn56CB546HXG4gICAqL1xuICBzZXRCaXRyYXRlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IFJDQXVkaW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbikgfHwgIWlzTnVtYmVyKG1heCkgfHwgbWF4IDw9IDAgfHwgbWluIDw9IDAgfHwgbWF4IDwgbWluKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0FVRElPX0NPTkZJR19TRVRfQklUUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IG1heDogJHttYXh9LG1pbjogJHttaW59LCBtYXggYW5kIG1pbiBpcyBhIG51bWJlciA+IDAsIG1heCBzaG91bGQgPiBtaW5gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hdWRpb0NvbmZpZy5taW5CaXRyYXRlID0gbWluO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1heEJpdHJhdGUgPSBtYXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6Z+z6aKR6YeH5qC3546H77yM5LiN5bu66K6u6Ieq6KGM5L+u5pS5XG4gICAqIEBwYXJhbSBzYW1wbGVSYXRlIOmHh+agt+eOh1xuICAgKi9cbiAgc2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlOiBudW1iZXIpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19BVURJT19DT05GSUdfU0VUX1NBTVBMRV9SQVRFX08sIGBwYXJhbXMgZXJyb3IgLT4gc2FtcGxlUmF0ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOaehOW7uumFjee9riAqL1xuICBidWlsZCgpOiBJQXVkaW9Db25maWcge1xuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ZyYW1lUmF0ZSwgUkNDYWxsUGx1c1Jlc29sdXRpb24sIElWaWRlb0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruW4p+eOhyAqL1xuICBzZXRGcmFtZVJhdGUoZnBzOiBSQ0NhbGxQbHVzRnJhbWVSYXRlKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIGlmICghUkNDYWxsUGx1c0ZyYW1lUmF0ZVtmcHNdKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IGZwczogJHtmcHN9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcuZnJhbWVSYXRlID0gZnBzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruWIhui+qOeOhyAqL1xuICBzZXRWaWRlb1Jlc29sdXRpb24ocmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24pOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFSQ0NhbGxQbHVzUmVzb2x1dGlvbltyZXNvbHV0aW9uXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX1JFU09MVVRJT05fTywgYHBhcmFtcyBlcnJvciAtPiByZXNvbHV0aW9uOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6buY6K6kIGNhbWVyYUlkXG4gICAqIGNhbWVyYUlkIOWPluWAvOWPr+WPguiAgyBodHRwczovL2RvYy5yb25nY2xvdWQuY24vcnRjL1dlYi81LlgvZGV2aWNlIyVFOCU4RSVCNyVFNSU4RiU5NiVFNiU5MSU4NCVFNSU4MyU4RiVFNSVBNCVCNCVFOCVBRSVCRSVFNSVBNCU4NyVFNSU4OCU5NyVFOCVBMSVBOFxuICAgKiDkvZznlKjkuo7pooTop4jlip/og73jgIHlkbzlj6vlj5bmtYHnrYlcbiAgICovXG4gIHNldERlZmF1bHRDYW1lcmFJZChjYW1lcmFJZDogc3RyaW5nKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnLmNhbWVyYUlkID0gY2FtZXJhSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5pyA5bCP44CB5pyA5aSn56CB546HXG4gICAqIOWNleS9jSBrYnBzXG4gICAqIOS4jeiuvue9ruaXtu+8jOWPluWKqOaAgeeggeeOh+iuoeeul+e7k+aenFxuICAgKiBAcGFyYW0gbWluIOacgOWwj+eggeeOh1xuICAgKiBAcGFyYW0gbWF4IOacgOWkp+eggeeOh1xuICAgKi9cbiAgc2V0Qml0cmF0ZShtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihtaW4pIHx8ICFpc051bWJlcihtYXgpIHx8IG1heCA8PSAwIHx8IG1pbiA8PSAwIHx8IG1heCA8IG1pbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX0JJVFJBVEVfTywgYHBhcmFtcyBlcnJvciAtPiBtYXg6ICR7bWF4fSxtaW46ICR7bWlufSwgbWF4IGFuZCBtaW4gaXMgYSBudW1iZXIgPiAwLCBtYXggc2hvdWxkID4gbWluYCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcubWluQml0cmF0ZSA9IG1pbjtcbiAgICB0aGlzLl92aWRlb0NvbmZpZy5tYXhCaXRyYXRlID0gbWF4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g5p6E5bu66YWN572uXG4gIGJ1aWxkKCk6IElWaWRlb0NvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZGVvQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmF2aUluZm8sIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUsIFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0SW5mbywgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCBJSGFuZ3VwSW5mbywgSU90aGVyTWVtSW5mbywgSVJpbmdpbmdJbmZvLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgSVN0YXR1c0Rvd25Db250LCBJU3luY0NhbGxMb2dSZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbi8qKlxuICogY2FsbCBzZXJ2ZXIgbG9nIOi9rOaNolxuICovXG5leHBvcnQgY29uc3QgdHJhbjJDYWxsTG9nID0gKGNhbGxMb2dMaXN0OiBJU3luY0NhbGxMb2dSZXMpOiBJUkNDYWxsUGx1c0NhbGxSZWNvcmQgPT4ge1xuICBjb25zdCB7XG4gICAgY2FsbElkLFxuICAgIGNhbGxUeXBlLFxuICAgIGNhbGxEaXIsXG4gICAgbWVkaWFUeXBlLFxuICAgIGNhbGxpbmdVc2VySWQsXG4gICAgY2FsbFVzZXJJZHMsXG4gICAgY2FsbFN0YXR1cyxcbiAgICBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHNlY3JldENoYXQsXG4gICAgc3luY1RpbWUsXG4gICAgc3lzU3RhdHVzLFxuICAgIGNydFRpbWUsXG4gIH0gPSBjYWxsTG9nTGlzdDtcbiAgcmV0dXJuIHtcbiAgICBjYWxsSWQsXG4gICAgY2FsbFR5cGUsXG4gICAgY2FsbERpcmVjdGlvbjogY2FsbERpcixcbiAgICBtZWRpYVR5cGUsXG4gICAgLy8gaXNTZWNyZXRDaGF0OiBCb29sZWFuKHNlY3JldENoYXQpLFxuICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICBjYWxsVXNlcklkcyxcbiAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZXN0YW1wOiBzdGFydFRpbWUsXG4gICAgZW5kVGltZXN0YW1wOiBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VTdGF0dXMge1xuICByaW5naW5nRGF0YTogSVJpbmdpbmdJbmZvW107XG4gIGhhbmd1cERhdGE6IElIYW5ndXBJbmZvW107XG4gIGFjY2VwdERhdGE6IElBY2NlcHRJbmZvW107XG4gIG90aGVySW52aXRlZERhdGE6IElPdGhlck1lbUluZm9bXTtcbn1cblxuLyoqXG4gKiBwYXJzZVN0YXR1c1xuICovXG5leHBvcnQgY29uc3QgcGFyc2VTdGF0dXNEYXRhID0gKGRhdGE6IElTdGF0dXNEb3duQ29udCk6IElQYXJzZVN0YXR1cyA9PiB7XG4gIGNvbnN0IHsgY2FsbElkLCBjYWxsU3RhdHVzIH0gPSBkYXRhO1xuICBjb25zdCByaW5naW5nRGF0YTogSVJpbmdpbmdJbmZvW10gPSBbXTtcbiAgY29uc3QgaGFuZ3VwRGF0YTogSUhhbmd1cEluZm9bXSA9IFtdO1xuICBjb25zdCBhY2NlcHREYXRhOiBJQWNjZXB0SW5mb1tdID0gW107XG4gIGNvbnN0IG90aGVySW52aXRlZERhdGE6IElPdGhlck1lbUluZm9bXSA9IFtdO1xuICBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMgfSA9IGl0ZW07XG4gICAgc3dpdGNoIChzZXNzaW9uU3RhdHVzKSB7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQ6XG4gICAgICAgIG90aGVySW52aXRlZERhdGEucHVzaCh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORzpcbiAgICAgICAgLy8g6YCa55+l5ZON6ZODXG4gICAgICAgIHJpbmdpbmdEYXRhLnB1c2goeyBjYWxsSWQsIGZyb21Vc2VySWQ6IHVzZXJJZCB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkc6XG4gICAgICAgIC8vIOmAmuefpeWvueaWueW3suaOpeWQrFxuICAgICAgICBhY2NlcHREYXRhLnB1c2goeyBmcm9tVXNlcklkOiB1c2VySWQgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQ6XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkRFQ0xJTkVEOlxuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5FTkRFRDpcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTpcbiAgICAgICAgaGFuZ3VwRGF0YS5wdXNoKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgZnJvbVVzZXJJZDogdXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcmluZ2luZ0RhdGEsXG4gICAgaGFuZ3VwRGF0YSxcbiAgICBhY2NlcHREYXRhLFxuICAgIG90aGVySW52aXRlZERhdGEsXG4gIH07XG59O1xuXG4vKipcbiAqIOWug+ajgOafpeWFg+e0oOaYr+WQpuaYr+inhumikeiKgueCuVxuICogQHBhcmFtIHthbnl9IGVsZW1lbnQgLSDmgqjopoHmo4Dmn6XnmoTlhYPntKDmmK/lkKbkuLrop4bpopHlhYPntKDjgIJcbiAqIEByZXR1cm5zIOS4gOS4quW4g+WwlOWAvOOAglxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVWaWRlb05vZGVOYW1lID0gKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVOYW1lICYmIGVsZW1lbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1ZJREVPJztcblxuLyoqXG4gKiDmoLnmja7nlKjmiLflvZPliY3nmoQgc3lzdGVtU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHN5c3RlbVN0YXRlLOadpeWIpOaWreaWsCBzeXN0ZW1TdGF0ZSDmmK/lkKbml6DmlYhcbiAqIOS+i++8muW9k+WJjeeUqOaIt+W3suWcqCBjYWxsIOS4re+8jOWPiOaUtuWIsOatpOeUqOaIt+eahCDlk43pk4PjgIHov57mjqXkuK0g562JXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN5c1N0YXRlID0gKGNydFN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1JlYXNvbikgPT4ge1xuICBsZXQgaXNJblZhbGlkID0gZmFsc2U7XG4gIGNvbnN0IGludmFsaWRTdGF0ZXMgPSBbXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5JTlZJVEVELFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9XQUlULFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgXTtcbiAgc3dpdGNoIChjcnRTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEw6XG4gICAgICBpZiAoaW52YWxpZFN0YXRlcy5pbmNsdWRlcyhuZXdTdGF0ZSkpIHtcbiAgICAgICAgaXNJblZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaXNJblZhbGlkO1xufTtcblxuLyoqXG4gICAqIOagueaNrueUqOaIt+W9k+WJjeeahCB1c2VyU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHVzZXJTdGF0ZSzmnaXliKTmlq3mlrAgdXNlclN0YXRlIOaYr+WQpuaXoOaViFxuICAgKiDml6DmlYjnmoTnlKjmiLfnirbmgIFcbiAgICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVVc2VyU3RhdGUgPSAoY3J0U3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUpID0+IHtcbiAgbGV0IGlzSW5WYWxpZCA9IGZhbHNlO1xuICBjb25zdCBpbnZhbGlkU3RhdGVzID0gW1xuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gIF07XG4gIHN3aXRjaCAoY3J0U3RhdGUpIHtcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTDpcbiAgICAgIGlmIChpbnZhbGlkU3RhdGVzLmluY2x1ZGVzKG5ld1N0YXRlKSkge1xuICAgICAgICBpc0luVmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBpc0luVmFsaWQ7XG59O1xuXG4vKipcbiAqIOiOt+WPluaMguaWreaXtueahOS6uuWRmOezu+e7n+eKtuaAgVxuICogQHBhcmFtIHVzZXJTdGF0ZSDkurrlkZjnirbmgIFcbiAqIEBwYXJhbSBpc0NhbGxlZSDmmK/lkKbmmK/ooqvlj6tcbiAqIEByZXR1cm5zIOS6uuWRmOezu+e7n+eKtuaAgVxuICovXG5leHBvcnQgY29uc3QgZ2V0SGFuZ3VwU3lzdGVtU3RhdGUgPSAodXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgaXNDYWxsZWU6IGJvb2xlYW4pID0+IHtcbiAgbGV0IHN5c3RlbVN0YXRlO1xuICBzd2l0Y2ggKHVzZXJTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORzpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLlJJTkdJTkc6XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkRFQ0xJTkVEO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HOlxuICAgICAgc3lzdGVtU3RhdGUgPSBpc0NhbGxlZSA/IFJDQ2FsbFBsdXNSZWFzb24uREVDTElORUQgOiBSQ0NhbGxQbHVzUmVhc29uLkNBTkNFTExFRDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkVOREVEO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHN5c3RlbVN0YXRlO1xufTtcblxuLyoqXG4gKiDliKTmlq3mmK/lkKblvIDlp4vpn7Pop4bpopHmnI3liqFcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3VwcG9ydE1lZGlhU2VydmVyID0gKG5hdmlJbmZvOiBJTmF2aUluZm8pID0+IHtcbiAgY29uc3QgeyB2b2lwQ2FsbEluZm8gfSA9IG5hdmlJbmZvO1xuICBpZiAoIXZvaXBDYWxsSW5mbykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RyYXRlZ3kgfSA9IEpTT04ucGFyc2Uodm9pcENhbGxJbmZvKTtcbiAgaWYgKHN0cmF0ZWd5ICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVCaXRyYXRlID0gKG1pbkJpdHJhdGU/OiBudW1iZXIsIG1heEJpdHJhdGU/OiBudW1iZXIpID0+IHtcbiAgaWYgKG1pbkJpdHJhdGUgfHwgbWluQml0cmF0ZSA9PT0gMCkge1xuICAgIGlmICghaXNOdW1iZXIobWluQml0cmF0ZSkgfHwgbWluQml0cmF0ZSA8PSAwKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWluQml0cmF0ZTogYSBudW1iZXIgb2YgPiAwLCB2YWx1ZTogJHttaW5CaXRyYXRlfWAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAobWF4Qml0cmF0ZSB8fCBtYXhCaXRyYXRlID09PSAwKSB7XG4gICAgaWYgKCFpc051bWJlcihtYXhCaXRyYXRlKSB8fCBtYXhCaXRyYXRlIDw9IDApIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLCBlcnJvck1zZzogYHBhcmFtcyBlcnJvciAtPiBtYXhCaXRyYXRlOiBhIG51bWJlciBvZiA+IDAsIHZhbHVlOiAke21heEJpdHJhdGV9YCB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaW5CaXRyYXRlICYmIG1heEJpdHJhdGUgJiYgbWF4Qml0cmF0ZSA8IG1pbkJpdHJhdGUpIHtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogJHttYXhCaXRyYXRlfSwgbWluQml0cmF0ZTogJHttaW5CaXRyYXRlfSwgbWF4Qml0cmF0ZSBzaG91bGQgPiBtaW5CaXRyYXRlYCB9O1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJWaWRlb1ZpZXdJbmZvID0gKHVzZXJWaWV3TWFwOiB7IFt1c2VySWQ6IHN0cmluZ106IHsgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCBpc1Rpbnk6IGJvb2xlYW4gfSB9KSA9PiB7XG4gIGNvbnN0IHVzZXJWaWV3TWFwSW5mbyA9IFtdO1xuICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB1c2VyVmlld01hcCkge1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3LCBpc1RpbnkgfSA9IHVzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgdXNlclZpZXdNYXBJbmZvLnB1c2goe1xuICAgICAgdXNlcklkLFxuICAgICAgdmlkZW9WaWV3OiB2aWRlb1ZpZXcubm9kZU5hbWUsXG4gICAgICBpc1RpbnksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVzZXJWaWV3TWFwSW5mbztcbn07XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB7XG4gIC8qKlxuICAgKiDlj5HotbfpgJror51cbiAgICovXG4gIExfUVNfU1RBUlRfQ0FMTF9TID0gJ0NhbGwtc3RhcnQtUycsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror51cbiAgICovXG4gIExfUVNfQUNDRVBUX0NBTExfUyA9ICdDYWxsLWFjY2VwdC1TJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9RU19IQU5HVVBfQ0FMTF9TID0gJ0NhbGwtaGFuZ3VwLVMnLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+dXG4gICAqL1xuICBMX1FTX1JFQ0VJVkVfQ0FMTF9TID0gJ0NhbGwtcmVjdi1TJyxcbiAgLyoqXG4gICAqIOW8guW4uOaMguaWrVxuICAgKi9cbiAgTF9RU19BQk5PUk1BTF9IQU5HVVBfUyA9ICdDYWxsLWludGVycnVwdC1TJ1xufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIFBsdWdpbkNvbnRleHQgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzSW52aXRlU291cmNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNTZXNzaW9uLCBSQ0NhbGxQbHVzVHlwZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNDYWxsUEx1c1N0YXRpc3RpY3Mge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICkge1xuICB9XG5cbiAgcHVibGljIHJlcG9ydFN0YXRpc3RpY3NEYXRhKFxuICAgIHRhZzogUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcsXG4gICAgY29kZTogbnVtYmVyLFxuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uIHwgbnVsbCxcbiAgICBjbGllbnRDYWxsSWQ/OiBzdHJpbmcsXG4gICAgaW52aXRlU291cmNlPzogUkNDYWxsUGx1c0ludml0ZVNvdXJjZSB8IG51bGwsXG4gICAgZXh0cmE/OiB7XG4gICAgICBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgICBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUsXG4gICAgICBjYWxsSWQ6IHN0cmluZyxcbiAgICB9LFxuICApIHtcbiAgICBjb25zdCBub3dUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgeyBtZWRpYVR5cGUsIGNhbGxUeXBlLCBjYWxsSWQgfSA9IHNlc3Npb24gPyB7IG1lZGlhVHlwZTogc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSwgY2FsbFR5cGU6IHNlc3Npb24uZ2V0Q2FsbFR5cGUoKSwgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpIH0gOiBleHRyYSE7XG4gICAgY29uc3QgY29tbW9uRGF0YSA9IHtcbiAgICAgIGNyOiAndW5rbm93bicsXG4gICAgICBuZXQ6ICd1bmtub3duJyxcbiAgICAgIGNvZDogY29kZSxcbiAgICAgIG10cDogbWVkaWFUeXBlLFxuICAgICAgY3RwOiBjYWxsVHlwZSxcbiAgICAgIGNpZDogY2FsbElkLFxuICAgICAgdGltZTogbm93VGltZSxcbiAgICAgIHVpZDogdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSxcbiAgICB9O1xuXG4gICAgY2xpZW50Q2FsbElkICYmIE9iamVjdC5hc3NpZ24oY29tbW9uRGF0YSwgeyBjY2lkOiBjbGllbnRDYWxsSWQgfSk7XG5cbiAgICBsZXQgZGF0YSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDlkbzlj6tcbiAgICAgICAqL1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX1JFQ0VJVkVfQ0FMTF9TOlxuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIC4uLmNvbW1vbkRhdGEsXG4gICAgICAgICAgcmY6IGludml0ZVNvdXJjZSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvKipcbiAgICAgICAqIOW8guW4uOaMguaWrVxuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfQUJOT1JNQUxfSEFOR1VQX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvKipcbiAgICAgICAgICog5Y+R6LW344CB5o6l5ZCs44CB5oyC5pat6YCa6K+dXG4gICAgICAgICAqL1xuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIC4uLmNvbW1vbkRhdGEsXG4gICAgICAgICAgZHVyOiBub3dUaW1lIC0gc3RhcnRUaW1lLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdMLWNhbGwtcGx1cy1zdGF0aXN0aWMnLCBKU09OLnN0cmluZ2lmeShkYXRhKSwgdGFnKTtcblxuICAgIHRoaXMuX2xvZ2dlci5fX3N0YXRpc3RpY3ModGFnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gIH1cbn1cbiIsIi8qKlxuICog5a+56K+d5Yqo5L2cXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ0FjdGlvbiB7XG4gIC8qKlxuICAgKiDor7fmsYJcbiAgICovXG4gIFJFUVVFU1QgPSAncmVxdWVzdCcsXG4gIC8qKlxuICAgKiDmjqXlj5dcbiAgICovXG4gIEFDQ0VQVCA9ICdhY2NlcHQnLFxuICAvKipcbiAgICog5ouS57udXG4gICAqL1xuICBSRUZVU0UgPSAncmVmdXNlJyxcbiAgLyoqXG4gICAqIOivt+axguWPlua2iFxuICAgKi9cbiAgQ0FOQ0VMID0gJ2NhbmNlbCcsXG4gIC8qKlxuICAgKiDpgJrnn6VcbiAgICovXG4gIE5PVElDRSA9ICdub3RpY2UnLFxuICAvKipcbiAgICog6LaF5pe2XG4gICAqL1xuICBUSU1FT1VUID0gJ3RpbWVvdXQnXG59XG4iLCIvKipcbiAqIOWvueivneexu+Wei1xuICovXG5leHBvcnQgZW51bSBEaWFsb2dUeXBlIHtcbiAgU1dJVENIX01FRElBX1RZUEUgPSAxXG59XG4iLCIvKipcbiAqIOmAmuivnemineWkluexu+Wei++8iOenu+WKqOerr+eJueacie+8iVxuICovXG5leHBvcnQgZW51bSBTZWNyZXRDYWxsVHlwZSB7XG4gIC8qKlxuICAgKiDmma7pgJrpgJror51cbiAgICovXG4gIE5PUk1BTCxcbiAgLyoqXG4gICAqIOWvhuiBilxuICAgKi9cbiAgU0VDUkVUXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgRGlhbG9nQWN0aW9uIH0gZnJvbSAnLi4vZW51bXMvRGlhbG9nQWN0aW9uJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDYWxsU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBJU2Vzc2lvblVzZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgdmFsaWRhdGVTeXNTdGF0ZSwgdmFsaWRhdGVVc2VyU3RhdGUgfSBmcm9tICcuLi91dGlscy9oZWxwZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c1JlYXNvbic7XG5cbmV4cG9ydCBlbnVtIENhbGxUaW1lckV2ZW50VHlwZSB7XG4gIElOVklURVIgPSAnaW52aXRlcicsXG4gIElOVklURUUgPSAnaW52aXRlZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJT2xkRGlhbG9nRGF0YXtcbiAgdHJhbnNhY3Rpb25JZD86IHN0cmluZztcbiAgYWN0aW9uOiBEaWFsb2dBY3Rpb247XG4gIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZTtcbn1cblxuLyoqXG4gKiBTREsg5YaF6YOo5L2/55SoIFNlc3Npb24g5a6e5L6LXG4gKi9cbmV4cG9ydCBjbGFzcyBSQ0NhbGxJbm5lclNlc3Npb24gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICog6K+35rGC5pu05paw55qEIG1lZGlhVHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVxTWVkaWFUeXBlITogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGxcblxuICAvKipcbiAgICog6YKA6K+36ICF6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVyVGltZXJJZCE6IG51bWJlclxuXG4gIC8qKlxuICAgKiDooqvpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZWVUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBfY2FsbFVzZXJzOiBJU2Vzc2lvblVzZXJbXSA9IFtdXG5cbiAgLyoqXG4gICAqIOaXpyBkaWFsb2cg5pWw5o2u77yM55So5LqO5a+55q+UXG4gICAqL1xuICBwcml2YXRlIF9vbGREaWFsb2dEYXRhITogSU9sZERpYWxvZ0RhdGFcblxuICAvKipcbiAgICog6K6w5b2V5piv5ZCm5pys5Zyw5pyJ5oyC5patXG4gICAqL1xuICBwcml2YXRlIGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDmnoTpgKDlmahcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIENhbGwgSURcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOeKtuaAgVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXRlOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneexu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAvKipcbiAgICAgKiDpgJror53lqpLkvZPnsbvlnotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgLyoqXG4gICAgICogc2Vzc2lvbiDlkbzlj6vlj5HotbfogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGFydENhbGxlcklkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog5pys5qyhIHNlc3Npb24g55qE6YKA6K+36ICFXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDlvZPliY0gc2Vzc2lvbiDkurrlkZjkv6Hmga/liJfooahcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIENhbGxJRFxuICAgKi9cbiAgcHVibGljIGdldENhbGxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsSWQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvblN0YXRlKCk6IFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53nsbvlnotcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsVHlwZSgpOiBSQ0NhbGxQbHVzVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWqkuS9k+exu+Wei1xuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIOWPkei1t+iAhVxuICAgKi9cbiAgcHVibGljIGdldFN0YXJ0Q2FsbGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRDYWxsZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnKzmrKEgc2Vzc2lvbiDpgoDor7fogIVcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5Ygc2Vzc2lvbiB1c2VyIGxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyTGlzdCgpOiBJU2Vzc2lvblVzZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxVc2VycztcbiAgfVxuXG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVxTWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxTWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIGludml0ZXJUaW1lcklkXG4gICAqL1xuICBwdWJsaWMgZ2V0SW52aXRlclRpbWVySWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW52aXRlclRpbWVySWQ7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlZVRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVlVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVlVGltZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxUaW1lcklkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFt0aGlzLl9pbnZpdGVyVGltZXJJZCwgdGhpcy5faW52aXRlZVRpbWVySWRdO1xuICB9XG5cbiAgcHVibGljIHNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08sIGB1c2VySWQ6ICR7dXNlcklkfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX0sIGVuYWJsZTogJHtlbmFibGV9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgdXNlclN0YXRlID0gdGhpcy5fY2FsbFVzZXJzLmZpbmQoKGl0ZW0pID0+IHVzZXJJZCA9PT0gaXRlbS51c2VySWQpO1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIHVzZXJTdGF0ZSEubWljcm9waG9uZUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXNlclN0YXRlIS5jYW1lcmFFbmFibGUgPSBlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOS6uuWRmOWIl+ihqCwg5bm26L+U5Zue5pu05paw55qE5Lq65ZGY5YiX6KGoXG4gICAqIOagueaNruS6uuWRmOeKtuaAgeWOu+a3u+WKoOOAgeWIoOmZpOOAgeabtOaWsFxuICAgKiDmoLnmja7nirbmgIHml7bpl7TvvIzliKTmlq3mmK/lkKbmm7TmlrDvvIzml6Dml7bpl7TmiLPnmoTkuLrmnKzlnLDnirbmgIHosIPmlbTvvIznm7TmjqXmm7TmlrBcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVVc2VyTGlzdCh1c2VyczogSVNlc3Npb25Vc2VyW10sIHRyYWNlSWQ6IHN0cmluZyk6IElTZXNzaW9uVXNlcltdIHtcbiAgICBjb25zdCBjaGFuZ2VkVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW107XG4gICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB1c2VyU3RhdGU6IG5ld1VzZXJTdGF0ZSxcbiAgICAgICAgc3RhdGVUaW1lOiBuZXdTdGF0ZVRpbWUsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBuZXdTeXNTdGF0ZSxcbiAgICAgIH0gPSB1c2VyO1xuICAgICAgY29uc3QgbmVlZEFkZFN0YXRlcyA9IFtSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQUxMSU5HLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVELCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9XQUlUXTtcbiAgICAgIGlmIChuZWVkQWRkU3RhdGVzLmluY2x1ZGVzKG5ld1VzZXJTdGF0ZSkpIHtcbiAgICAgICAgLy8g55u05o6l5re75Yqg5pWw5o2uXG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGBwdXNoIHVzZXI6ICR7SlNPTi5zdHJpbmdpZnkodXNlcil9YCwgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuX2NhbGxVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgICBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOabtOaWsOaVsOaNrlxuICAgICAgICBsZXQgaGFzVXNlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NhbGxVc2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHVzZXJJZCwgc3RhdGVUaW1lOiBvbGRTdGF0ZVRpbWUsIHN5c3RlbVN0YXRlOiBvbGRTeXN0ZW1TdGF0ZSwgdXNlclN0YXRlOiBvbGRVc2VyU3RhdGUsXG4gICAgICAgICAgfSA9IHRoaXMuX2NhbGxVc2Vyc1tpXTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSB1c2VyLnVzZXJJZCkge1xuICAgICAgICAgICAgaGFzVXNlciA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRTeXNTdGF0ZSA9IHZhbGlkYXRlU3lzU3RhdGUob2xkU3lzdGVtU3RhdGUsIG5ld1N5c1N0YXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFVzZXJTdGF0ZSA9IHZhbGlkYXRlVXNlclN0YXRlKG9sZFVzZXJTdGF0ZSwgbmV3VXNlclN0YXRlKTtcblxuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkT25waG9uZUVuZCA9IG5ld1N5c1N0YXRlID09PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FX0VORCAmJiBvbGRTeXN0ZW1TdGF0ZSAhPT0gUkNDYWxsUGx1c1JlYXNvbi5PTl9QSE9ORSAmJiBuZXdVc2VyU3RhdGUgIT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog5peg5pWI55qE54q25oCB77yaXG4gICAgICAgICAgICAgKiDmlrDkuIvlj5HnirbmgIHnmoTml7bpl7TlsI/kuo7lvZPliY3nirbmgIHnmoTml7bpl7Qg5LiUIHN5c3RlbVN0YXRlIOWSjCB1c2VyU3RhdGUg5Z2H5piv5peg5pWI55qEXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICgobmV3U3RhdGVUaW1lICYmIG9sZFN0YXRlVGltZSAmJiBuZXdTdGF0ZVRpbWUgPCBvbGRTdGF0ZVRpbWUpIHx8IChpc0ludmFsaWRTeXNTdGF0ZSAmJiBpc0ludmFsaWRVc2VyU3RhdGUpKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHRpbWVvdXQgdXNlciBzdGF0ZTogb2xkOiR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgdXNlcklkLCBvbGRTdGF0ZVRpbWUsIG9sZFN5c3RlbVN0YXRlLCBvbGRVc2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgfSl9OyBuZXc6JHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIOebtOaOpeimhuebluabtOaWsFxuICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gY292ZXIgJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJzW2ldID0gdXNlcjtcbiAgICAgICAgICAgICAgIWlzSW52YWxpZE9ucGhvbmVFbmQgJiYgY2hhbmdlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDml6DmraTnlKjmiLfnm7TmjqXmt7vliqBcbiAgICAgICAgaWYgKCFoYXNVc2VyKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IC0+IG5vdXNlciBwdXNoICR7SlNPTi5zdHJpbmdpZnkodXNlcil9YCwgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgY2hhbmdlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZFVzZXJzO1xuICB9XG5cbiAgcHVibGljIHNldE9sZERpYWxvZ0RhdGEoZGF0YTogSU9sZERpYWxvZ0RhdGEpIHtcbiAgICB0aGlzLl9vbGREaWFsb2dEYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgLyoqXG4gICAqIOabtOaWsCBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6YCa6K+d57G75Z6L77yI5Y2H6ZmN57qn6K6+572u77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2FsbFR5cGUoY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlKSB7XG4gICAgdGhpcy5fY2FsbFR5cGUgPSBjYWxsVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDlqpLkvZPnsbvlnovvvIjljYfpmY3nuqfvvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKSB7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOivt+axgueahOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJlcU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfCBudWxsKSB7XG4gICAgdGhpcy5fcmVxTWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsCBpbnZ0ZXIgdGltZXIgaWRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUaW1lcklkKHR5cGU6IENhbGxUaW1lckV2ZW50VHlwZSwgdGltZXJJZDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGUgPT09IENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVSKSB7XG4gICAgICB0aGlzLl9pbnZpdGVyVGltZXJJZCA9IHRpbWVySWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ludml0ZWVUaW1lcklkID0gdGltZXJJZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WXG4gICAqL1xuICBwdWJsaWMgZ2V0T2xkRGlhbG9nRGF0YSgpOiBJT2xkRGlhbG9nRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX29sZERpYWxvZ0RhdGE7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5piv5ZCm5piv5bex56uv5oyC5patXG4gICAqL1xuICBwdWJsaWMgc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0xvY2FsQ2xpZW50SGFuZ3VwID0gaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXA7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJBY3Rpb24ge1xuICAvKipcbiAgICog5byA5aeL5Y2V5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9TSU5HTEVfQ0FMTCA9ICdzdGFydFNpbmdsZUNhbGwnLFxuICAvKipcbiAgICog5byA5aeL5aSa5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9HUk9VUF9DQUxMID0gJ3N0YXJ0R3JvdXBDYWxsJyxcbiAgLyoqXG4gICAqIOmCgOivt+WlveWPi+WKoOWFpemAmuivnVxuICAgKi9cbiAgSU5WSVRFX0NBTEwgPSAnaW52aXRlQ2FsbCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgoDor7fpgJror53mlbDmja5cbiAgICovXG4gIFBVQl9JTlZJVEVfQ0FMTCA9ICdwdWJJbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneWTjemTg1xuICAgKi9cbiAgUklOR0lOR19DQUxMID0gJ3JpbmdDYWxsJyxcbiAgLyoqXG4gICAqIOaOpeWPl+mAmuivnVxuICAgKi9cbiAgQUNDRVBUX0NBTEwgPSAnYWNjZXB0Q2FsbCcsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIEpPSU5fQ0FMTCA9ICdqb2luQ2FsbCcsXG4gIC8qKlxuICAgKiDmjILmlq3pgJror51cbiAgICovXG4gIEhBTkdVUF9DQUxMID0gJ2hhbmd1cENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBTVEFUVVNfVVBfQ0FMTCA9ICdzdGF0dXNVcENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiL5Y+RXG4gICAqL1xuICBTVEFUVVNfRE9XTl9DQUxMID0gJ3N0YXR1c0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgRVZFTlRfVVBfQ0FMTCA9ICdldmVudFVwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53kuovku7bkuIvlj5FcbiAgICovXG4gIEVWRU5UX0RPV05fQ0FMTCA9ICdldmVudERvd25DYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4iuihjFxuICAgKi9cbiAgRElBTE9HX1VQX0NBTEwgPSAnZGlhbG9nVXBDYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4i+ihjFxuICAgKi9cbiAgRElBTE9HX0RPV05fQ0FMTCA9ICdkaWFsb2dEb3duQ2FsbCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfkvJror53mlbDmja7liJfooahcbiAgICovXG4gIEdFVF9DQUxMX1VTRVJfU0VTU0lPTl9MSVNUID0gJ2dldENhbGxVU2VyU2Vzc2lvbkxpc3QnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5ZCM5q2lXG4gICAqL1xuICBTWU5DX0NBTExfTE9HID0gJ3N5bmNDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOaXpeW/l+iusOW9leS4i+WPkVxuICAgKi9cbiAgUFVCX0NBTExfTE9HID0gJ3B1YkNhbGxMb2cnLFxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqL1xuICBERUxfQ0FMTF9MT0cgPSAnZGVsZXRlQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmn6Xor6LlvZPliY3nlKjmiLflt7LmnInnmoQgY2FsbCDnirbmgIFcbiAgICovXG4gIFFSWV9DQUxMX1NUQVRFID0gJ3F1ZXJ5VXNlckhhc0NhbGwnLFxuICAvKipcbiAgICog5p+l6K+iIGNhbGxTZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBRUllfU1JWX1RJTUVTVEFNUCA9ICdnZXRDYWxsU3J2VGltZVN0YW1wJyxcbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeUqOaIt+i/m+ihjOeahCBjYWxsIOWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfU1RBVEVfTElTVCA9ICdnZXRVc2VyQ2FsbFN0YXRlTGlzdCcsXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfpgJror53orrDlvZVcbiAgICovXG4gIENMRUFSX0NBTExfTE9HID0gJ2NsZWFuQ2FsbExvZycsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDkvJror53kv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1NFU1NJT04gPSAnZ2V0Q2FsbFNlc3Npb24nLFxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBHRVRfQ0FMTF9USU1FX0lORk8gPSAnZ2V0Q2FsbFRpbWVJbmZvJyxcbiAgLyoqXG4gICAqIOe7k+adn+W9k+WJjeeUqOaIt+W8guW4uOeahGNhbGxTZXNzaW9uKOWMheWQq+WQhOS4qumYtuautSnvvIzkuLvopoHnlKjkuo7lupTnlKjlvILluLjpgIDlh7rlho3lkK/liqjjgIHlkITnp43pgJror53lvILluLjlvZPkuK3jgILphYzmg4XosIPnlKhcbiAgICovXG4gIEVORF9BQk5PUk1BTF9DQUxMID0gJ2VuZFVzZXJBYm5vcm1hbENhbGxzJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgU1lTX1NUQVRVU19VUCA9ICdzeXNTdGF0dXNVcCcsXG4gIC8qKlxuICAgKiDkuIrmiqXpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFVQX0NBTExfTE9HX1JFQURFRCA9ICd1cENhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R6YCa6K+d6K6w5b2V5bey6K+754q25oCBXG4gICAqL1xuICBQVUJfQ0FMTF9MT0dfUkVBREVEID0gJ3B1YkNhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R5LiL6KGM5L+h5Luk5pWw5o2u5bqP5Y+3SWQg77yI5byx572R6KGl5YG/5pa55rOV77yM56e75Yqo56uv5bey5a6e546w77yMUEMg5pyq5a6e546w77yJXG4gICAqL1xuICBQVUJfTkFDS19TRVFfSUQgPSAncHViTkFDS1NlcUlkJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+WPguS4jueahOacque7k+adn+eahGNhbGxTZXNzaW9u55qEQ2FsbElk5YiX6KGo77yMZ3JvdXDkuJPnlKjvvIzlj6/lnKhncm91cGNhbGznu5PmnZ/ml7bvvIzooaXlgb/lkITnq6/nmoTlv6vmjbflhaXlj6PmmK/lkKbmtojlpLHnmoTliKTmlq1cbiAgICovXG4gIEdFVF9VU0VSX0NBTExfU0VTU0lPTl9JRF9MSVNUID0gJ2dldFVzZXJDYWxsU2Vzc2lvbklkTGlzdCdcbn1cbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHRpbWVySW50ZXJ2YWwgPSAoZnVuOiBGdW5jdGlvbiwgaXR2OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0SW50ZXJ2YWwoZnVuLCBpdHYpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1pbGxpc2Vjb25kOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmQpO1xufSk7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ1JUQ0NvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckVycm9yQ29kZSB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5cbmV4cG9ydCB0eXBlIFRSZXRyeUVycm9yQ29kZSA9IENhbGxTZXJ2ZXJFcnJvckNvZGUgfCBSQ1JUQ0NvZGUgfCBudW1iZXIgfCBFcnJvckNvZGVcbmV4cG9ydCBpbnRlcmZhY2UgcmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5Xml7bplb9cbiAgICovXG4gIG1heER1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqUXG4gICAqL1xuICBpbnRlcnZhbHM/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICAgKi9cbiAgaW5kZXg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDph43or5XlpLHotKXnmoTlm57osINcbiAgICovXG4gIG9uRXJyb3I/OiAoY29kZTogVFJldHJ5RXJyb3JDb2RlKSA9PiB2b2lkXG59XG5cbmNvbnN0IG5lZWRSZXRyeUNvZGU6IFRSZXRyeUVycm9yQ29kZVtdID0gW1xuICAvKipcbiAgICogSU0g5bqV5bGC6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBFcnJvckNvZGUuUkNfTkVUX0NIQU5ORUxfSU5WQUxJRCxcbiAgRXJyb3JDb2RlLlJDX05FVF9VTkFWQUlMQUJMRSxcbiAgRXJyb3JDb2RlLlJDX01TR19SRVNQX1RJTUVPVVQsXG4gIC8qKlxuICAgKiBSVEMg6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBSQ1JUQ0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCxcbiAgUkNSVENDb2RlLlJFUVVFU1RfRkFJTEVELFxuXG5dO1xuXG4vKipcbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuYXN5bmNGbiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuZm5BcmdzIOWHveaVsOeahOWPguaVsFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5jdXJyZW50UmV0cnlUaW1lIOW9k+WJjemHjeivleaXtumXtOaIs1xuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5tYXhEdXJhdGlvbiDmnIDlpKfph43or5Xml7bplb9cbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuaW50ZXJ2YWxzIOair+W6pumHjeivlemXtOmalFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5pbmRleCDmoq/luqbph43or5Xpl7TpmpTmlbDnu4TkuIvmoIdcbiAqL1xuZXhwb3J0IGNvbnN0IHJldHJ5QXN5bmNGbiA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IERhdGUubm93KCksXG4gIG1heER1cmF0aW9uID0gNjAgKiAxMDAwLFxuICBpbnRlcnZhbHMgPSBbMiAqIDEwMDAsIDQgKiAxMDAwLCA4ICogMTAwMCwgMTYgKiAxMDAwLCAzMiAqIDEwMDAsIDY0ICogMTAwMF0sXG4gIGluZGV4ID0gMCxcbiAgb25FcnJvcixcbn06IHJldHJ5T3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIC8vIGNvbnN0IGl0diA9IGludGVydmFsc1tpbmRleF0gfHwgaW50ZXJ2YWxzW2ludGVydmFscy5sZW5ndGggLSAxXVxuICAvLyBpbmRleCsrXG4gIC8vIGl0diDlhpnmrbsgMjAwMCBtcyAs5ZCO57ut6ZyA6KaB5YaN5pS+5byA5qKv5bqm6YeN6K+VXG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpXG4gICAgfHwgKChEYXRlLm5vdygpICsgaXR2IC0gY3VycmVudFJldHJ5VGltZSkgPiBtYXhEdXJhdGlvbik7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXN5bmNGbih7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heER1cmF0aW9uLFxuICAgICAgaW50ZXJ2YWxzLFxuICAgICAgaW5kZXgsXG4gICAgICBvbkVycm9yLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIHJldHJ5QnlUaW1lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAgICovXG4gIGFzeW5jRm46IEZ1bmN0aW9uO1xuICAvKipcbiAgICog5Ye95pWw55qE5Y+C5pWwXG4gICAqL1xuICBmbkFyZ3M6IGFueVtdO1xuICAvKipcbiAgICog5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gICAqL1xuICBjdXJyZW50UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwLCDpu5jorqQgMiDmrKFcbiAgICovXG4gIG1heFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IHJldHJ5QXNueWNGbkJ5VGltZSA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IDAsXG4gIG1heFJldHJ5VGltZSA9IDIsXG4gIG9uRXJyb3IsXG59OiByZXRyeUJ5VGltZU9wdGlvbnMpOiBQcm9taXNlPFI+ID0+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgYXN5bmNGbiguLi5mbkFyZ3MpO1xuICBjb25zdCBpdHYgPSAyICogMTAwMDtcbiAgY3VycmVudFJldHJ5VGltZSsrO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpIHx8IGN1cnJlbnRSZXRyeVRpbWUgPiBtYXhSZXRyeVRpbWU7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXNueWNGbkJ5VGltZSh7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heFJldHJ5VGltZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgeyBJUHViSW52aXRlQ29uIH0gZnJvbSAnLi9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuXG5leHBvcnQgZW51bSBDYWxsSG9va3NUeXBlIHtcbiAgb25CZWZvcmVQdWJsaXNoID0gJ29uQmVmb3JlUHVibGlzaCcsXG4gIG9uUHVibGlzaFJlcyA9ICdvblB1Ymxpc2hSZXMnLFxuICBvblB1Ykludml0ZUNhbGwgPSAnb25QdWJJbnZpdGVDYWxsJyxcbiAgb25QdWJJbnZpdGVDYWxsUHVsbEt2ID0gJ29uUHViSW52aXRlQ2FsbFB1bGxLdicsXG4gIG9uUHViSW52aXRlQ2FsbE1pc3MgPSAnb25QdWJJbnZpdGVDYWxsTWlzcydcbn1cblxuZXhwb3J0IGVudW0gUHViSW52aXRlQ2FsbE1pc3NSZWFzb24ge1xuICBOT1RfQ1VSUkVOVF9ERVZJQ0VJRCA9ICdub3QgY3VycmVudCBkZXZpY2UgaWQnLFxuICBTRUNSRVRfQ0FMTCA9ICdzZWNyZXQgY2FsbCcsXG4gIE5PVF9JTlZJVEVFID0gJ25vdCBhbiBpbnZpdGVlJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIHtcbiAgUFVCX0lOVklURSA9ICdwdWJpbnZpdGVjYWxsJyxcbiAgUFVMTF9LVl9JTlZJVEUgPSAncHVsbGt2X2ludml0ZWNhbGwnLFxuICBQVVNIID0gJ3N5c3RlbV9wdWJzaCdcbn1cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZ31cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxNaXNzSW5mbyA9IElQdWJJbnZpdGVDb24gJiB7IGV4dHJhOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCByZWZlcjogUHViSW52aXRlQ2FsbE1pc3NSZWZlcn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgZ2V0VVVJRDIyLCBJUnVudGltZSwgaXNOdWxsLCBpc1N0cmluZywgbG9nZ2VyLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyQWN0aW9uJztcbmltcG9ydCB7XG4gIElBY2NlcHRDYWxsQ29uLFxuICBJQmFzZVNpbmdhbENvbixcbiAgSUNsZWFyQ2FsbExvZ1JlcyxcbiAgSUNvbnBlbnNhdGlvbkRhdGEsXG4gIElEaWFsb2dEb3duQ2FsbENvbixcbiAgSURpYWxvZ1VwQ2FsbENvbixcbiAgSUV2ZW50RG93bkNhbGxDb24sXG4gIElFdmVudFVwQ2FsbENvbixcbiAgSUdldENhbGxTZXNzaW9uU2VydmVyUmVzLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0VXNlckNhbGxTdGF0ZUxpc3RSZXMsXG4gIElIYW5ndXBDYWxsQ29uLFxuICBJSW52aXRlQ2FsbENvbixcbiAgSUludml0ZUNhbGxSZXMsXG4gIElKb2luQ2FsbENvbixcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElRcnlVc2VySGFzQ2FsbFJlcyxcbiAgSVJpbmdpbmdDYWxsQ29uLFxuICBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lcixcbiAgSVN0YXJ0Q2FsbENvbixcbiAgSVN0YXJ0Q2FsbFJlcyxcbiAgSVN0YXJ0R3JvdXBDb24sXG4gIElTdGFydFNpbmdsZUNvbixcbiAgSVN0YXR1c0Rvd25Db250LFxuICBJU3RhdHVzVXBDb24sXG4gIElTeW5jQ2FsbExvZ0NvbixcbiAgSVN5bmNDYWxsTG9nUmVzTGlzdCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgRGlhbG9nVHlwZSB9IGZyb20gJy4uL2VudW1zL0RpYWxvZ1R5cGUnO1xuaW1wb3J0IHsgSVJDQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IFRpbWVDb3JyZWN0aW9uZXIgfSBmcm9tICcuL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgcmV0cnlBc3luY0ZuIH0gZnJvbSAnLi4vdXRpbHMvcmV0cnknO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGNsYXNzIFNpZ25hbFRyYW5zcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIOebkeWQrOWvueixoVxuICAgKi9cbiAgX2xpc3RlbmVyITogSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXJcblxuICAvKipcbiAgICog6ZyA6KaB6YeN6K+V55qEIGFjdGlvblxuICAgKi9cbiAgX25lZWRSZXRyeUFjdGlvbnM6IENhbGxTZXJ2ZXJBY3Rpb25bXSA9IFtcbiAgICBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX1NJTkdMRV9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfR1JPVVBfQ0FMTCxcbiAgICBDYWxsU2VydmVyQWN0aW9uLkFDQ0VQVF9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uSk9JTl9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uRVZFTlRfVVBfQ0FMTCxcbiAgXVxuXG4gIF9zZXNzaW9uSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRPcHRzOiBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGltZUNvcnJlY3Rpb25lcjogVGltZUNvcnJlY3Rpb25lcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbnRleHQub25DYWxsSW5mbyA9IHRoaXMuX29uUmVjdkNhbGxTaWduYWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jb250ZXh0Lm9uY29ubmVjdGlvbnN0YXRlY2hhbmdlID0gdGhpcy5fb25JTUNvbm5lY3Rpb25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IGdldFVVSUQyMigpO1xuICB9XG5cbiAgZ2V0U2Vzc2lvbklkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcjogSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q2FsbChtc2c6IElTdGFydENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY2xpZW50Q2FsbElkLCBjYWxsVHlwZSwgdG9Vc2VycywgbWVkaWFUeXBlLCBzZWNyZXRDaGF0LCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgbmlja05hbWUsIG9sZFJvb21JZCxcbiAgICB9ID0gbXNnO1xuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFydFNpbmdsZUNhbGwoe1xuICAgICAgICBjbGllbnRDYWxsSWQsXG4gICAgICAgIHRvVXNlcklkOiB0b1VzZXJzWzBdLnVzZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZWNyZXRDaGF0LFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgb2xkUm9vbUlkLFxuICAgICAgICB0b09yZ0lkOiB0b1VzZXJzWzBdLm9yZ0lkIHx8ICcnLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0R3JvdXBDYWxsKHtcbiAgICAgIGNsaWVudENhbGxJZCxcbiAgICAgIHRvVXNlcnMsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBuaWNrTmFtZSxcbiAgICAgIG9sZFJvb21JZCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFNpbmdsZUNhbGwobXNnOiBJU3RhcnRTaW5nbGVDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGFydFNpbmdsZUNvbiwgSVN0YXJ0Q2FsbFJlcz4odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9TSU5HTEVfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydEdyb3VwQ2FsbChtc2c6IElTdGFydEdyb3VwQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3RhcnRDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR1JPVVBfQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGFydEdyb3VwQ29uLCBJU3RhcnRDYWxsUmVzPih0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX0dST1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW52aXRlQ2FsbChtc2c6IElJbnZpdGVDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJSW52aXRlQ2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0lOVklURV9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElJbnZpdGVDYWxsQ29uLCBJSW52aXRlQ2FsbFJlcz4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5JTlZJVEVfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByaW5naW5nQ2FsbChtc2c6IElSaW5naW5nQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUklOR19ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElSaW5naW5nQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlJJTkdJTkdfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhY2NlcHRDYWxsKG1zZzogSUFjY2VwdENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0FDQ0VQVF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElBY2NlcHRDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgam9pbkNhbGwobXNnOiBJSm9pbkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElKb2luQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkpPSU5fQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5ndXBDYWxsKG1zZzogSUhhbmd1cENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0hBTkdVUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJSGFuZ3VwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkhBTkdVUF9DQUxMLCBtc2cpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCkge1xuICAgICAgLy8g5a2Y5Zyo5Y2V5ZG8IEEg5oyC5pat5ZCO55u05o6l6Lii5Ye6IELvvIxDYWxsU2VydmVyIOW3suenu+mZpCBjYWxsLCBCIOWQjuWIsCBDYWxsU2VydmVyIOeahCBoYW5ndXAg5Lya6L2s5Li6IENhbGxTZXJ2ZXJFcnJvckNvZGUuQ0FMTF9OT1RfRVhJU1TvvIzmlYXlv73nlaVcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXR1c1VwQ2FsbChtc2c6IElTdGF0dXNVcENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9TVEFUVVNfVVBfVCwgYGNhbGwgc3RhdHVzIHVwIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3RhdHVzVXBDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5TVEFUVVNfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBldmVudFVwQ2FsbChtc2c6IElFdmVudFVwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9FVkVOVF9VUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElFdmVudFVwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGlhbG9nVXBDYWxsKG1zZzogSURpYWxvZ1VwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJRGlhbG9nVXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uRElBTE9HX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FsbFJlY29yZCh1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9ERUxFVEVfQ0FMTF9SRUNPUkRfVCwgYGNhbGxJZHM6ICR7SlNPTi5zdHJpbmdpZnkoY2FsbElkcyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPHtjYWxsSWRzOiBzdHJpbmdbXX0sIHVuZGVmaW5lZD4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkRFTF9DQUxMX0xPRywge1xuICAgICAgY2FsbElkcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeW5jQ2FsbExvZyhtc2c6IElTeW5jQ2FsbExvZ0NvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN5bmNDYWxsTG9nUmVzTGlzdH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1JFQ09SRF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTeW5jQ2FsbExvZ0NvbiwgSVN5bmNDYWxsTG9nUmVzTGlzdD4obXNnLnVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5TWU5DX0NBTExfTE9HLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHF1ZXJ5VXNlckhhc0NhbGwoKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVFyeVVzZXJIYXNDYWxsUmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElRcnlVc2VySGFzQ2FsbFJlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlFSWV9DQUxMX1NUQVRFLCBudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IHsgc3luY1RpbWU6IG51bWJlcn19PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1NFUlZFUl9USU1FX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCB7IHN5bmNUaW1lOiBudW1iZXJ9Pih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uUVJZX1NSVl9USU1FU1RBTVAsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxUaW1lSW5mbyhjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxUaW1lSW5mb1Jlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1RJTUVfSU5GT19ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8eyBjYWxsSWQ6IHN0cmluZ30sIElHZXRDYWxsVGltZUluZm9SZXM+KGNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9USU1FX0lORk8sIHsgY2FsbElkIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFVzZXJDYWxsU3RhdGVMaXN0KHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0FWQUlMQUJMRV9DQUxMX0xJU1RfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1NUQVRFX0xJU1QsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFyQ2FsbFJlY29yZCh0cmFjZUlkOiBzdHJpbmcpOlByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElDbGVhckNhbGxMb2dSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCBJQ2xlYXJDYWxsTG9nUmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uQ0xFQVJfQ0FMTF9MT0csIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXNzaW9uKG9wdHM6IElCYXNlU2luZ2FsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9JTkZPX0JZX0NBTExJRF9ULCBgY2FsbElkOiAke29wdHMuY2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQmFzZVNpbmdhbENvbiwgSUdldENhbGxTZXNzaW9uU2VydmVyUmVzPihvcHRzLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9TRVNTSU9OLCBvcHRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeXNTdGF0dXNVcChvcHRzOiBJU3lzU3RhdHVzVXBPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9VU0VSX1NZU1RFTV9TVEFURV9VUF9ULCBgb3B0czogJHtKU09OLnN0cmluZ2lmeShvcHRzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN5c1N0YXR1c1VwT3B0cywgdW5kZWZpbmVkPihvcHRzLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5TWVNfU1RBVFVTX1VQLCBvcHRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cENhbGxMb2dSZWFkZWQob3B0czogSUJhc2VTaW5nYWxDb24pOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUJhc2VTaW5nYWxDb24sIHVuZGVmaW5lZD4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlVQX0NBTExfTE9HX1JFQURFRCwgb3B0cyk7XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gIHByaXZhdGUgX29uSU1Db25uZWN0aW9uU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08sIGBzdGF0ZTogJHtzdGF0ZX1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uSU1TdGF0ZUNoYW5nZShzdGF0ZSk7XG4gICAgLyoqXG4gICAgICog6L+e5o6l5oiQ5Yqf5ZCO5ZCv5Yqo5pe26Ze05qCh5q2j5ZmoXG4gICAgICovXG4gICAgaWYgKHN0YXRlID09PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnN0YXJ0KHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnN0b3AodHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwg5L+h5Luk5Y+R6YCBXG4gICAqIEBwYXJhbSB0YXJnZXRJZCDojrflj5YgY2FsbCBsb2cgKHN5bmNDYWxsTG9nKSDml7bkvKAgdXNlcklkLCDlhbbku5YgYWN0aW9uIOS8oCBjYWxsSWRcbiAgICogQHBhcmFtIGtleSBjYWxsIHNlcnZlciDlrprkuYkgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIGFjdGlvbiDmkLrluKblj4LmlbDvvIzml6Dlj4LmlbDkvKDnqbrlrZfnrKbkuLJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRDYWxsU2lnbmFsIDxULCBSPih0YXJnZXRJZDogc3RyaW5nLCBrZXk6IENhbGxTZXJ2ZXJBY3Rpb24sIG9wdGlvbnM6IFQpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBSfT4ge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucyA/IEpTT04uc3RyaW5naWZ5KHsgLi4ub3B0aW9ucywgLi4ueyBzZXNzaW9uSWQ6IHRoaXMuX3Nlc3Npb25JZCB9IH0pIDogJyc7XG5cbiAgICBsZXQgcmVzdWx0OiB7ZGF0YT86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCBjb2RlOiBFcnJvckNvZGV9O1xuICAgIGlmICh0aGlzLl9uZWVkUmV0cnlBY3Rpb25zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8e2RhdGE/OiB7IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfSB8IHVuZGVmaW5lZCwgY29kZTogRXJyb3JDb2RlfT4oe1xuICAgICAgICBhc3luY0ZuOiB0aGlzLl9jb250ZXh0LnNldENhbGxJbmZvLmJpbmQodGhpcy5fY29udGV4dCksXG4gICAgICAgIGZuQXJnczogW3RhcmdldElkLCBrZXksIHZhbHVlXSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9jb250ZXh0LnNldENhbGxJbmZvKHRhcmdldElkLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSByZXN1bHQ7XG4gICAgaWYgKGNvZGUgIT09IEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIGNvbnN0IHsga2V5OiBzZXJ2ZXJLZXksIHZhbHVlOiBzZXJ2ZXJWYWwgfSA9IGRhdGEhO1xuICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKHNlcnZlclZhbCkuZGF0YSBhcyBSO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgZGF0YTogcGFyc2VkRGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwg5L+h5Luk5o6l5pS2XG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZDYWxsU2lnbmFsKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9DQUxMX1NJR05BTF9EQVRBX08sIGBkYXRhOiAke2RhdGF9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBkYXRhTGlzdCA9IEpTT04ucGFyc2UoZGF0YSkubGlzdCBhcyB7W2tleTogc3RyaW5nXTogc3RyaW5nIH1bXTtcbiAgICBkYXRhTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IGtleSB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKGl0ZW0udmFsdWUpO1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9JTlZJVEVfQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vblB1Ykludml0ZUNhbGwoaW5mbyBhcyBJUHViSW52aXRlQ29uLCB0cnVlLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlNUQVRVU19ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25TdGF0dXNEb3duQ2FsbChpbmZvIGFzIElTdGF0dXNEb3duQ29udCwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25FdmVudERvd25DYWxsKGluZm8gYXMgSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uRElBTE9HX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vbkRpYWxvZ0Rvd25DYWxsKGluZm8gYXMgSURpYWxvZ0Rvd25DYWxsQ29uLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9DQUxMX0xPRzpcbiAgICAgICAgICB0aGlzLl9vblB1YkNhbGxMb2coaW5mbyBhcyBJUHViQ2FsbExvZywgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfQ0FMTF9MT0dfUkVBREVEOlxuICAgICAgICAgIC8vIHBhc3Mg5pqC5pyq55So5YiwXG4gICAgICAgICAgLy8gdGhpcy5fb25QdWJDYWxsTG9nUmVhZGVkKGluZm8gYXMgSVB1YkNhbGxMb2dSZWFkZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX05BQ0tfU0VRX0lEOlxuICAgICAgICAgIC8vIFRPRE8gY2FsbCDlvLHnvZHooaXlgb/mlrnmoYjmtonlj4rmlrnms5XvvIxQQyDmnKrlgZrvvIzmraTlpITpmLLmraLotbDliLAgZGVmYXVsdFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuX29uQ29ucGVuc2F0aW9uRGF0YShpbmZvIGFzIElDb25wZW5zYXRpb25EYXRhLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gZGV2aWNlSWQg5Yik5pat5pWw5o2u5piv5ZCm5bqU6K+l5LiL5Y+RXG4gICAqIGRldmljZUlkIOS4uuepuuWtl+espuS4suaIliBudWxsIOebtOaOpeS4i+WPkVxuICAgKiBkZXZpY2VJZCDmnInlhbfkvZPnmoTlgLzvvIzmoLnmja4gZGV2aWNlSWQg5Yik5pat5piv5ZCm5piv5bex56uv55qEIGRldmljZUlkXG4gICAqL1xuICBwcml2YXRlIF9pc1ZhbGlkRGF0YShkZXZpY2VJZDogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc051bGwoZGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKGRldmljZUlkKSAmJiAoZGV2aWNlSWQ/Lmxlbmd0aCA9PT0gMCB8fCBkZXZpY2VJZCA9PT0gdGhpcy5fc2Vzc2lvbklkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgoDor7dcbiAgICogQHBhcmFtIGlzRGlyZWN0bHkg5piv5ZCm5Li655u05Y+R5L+h5LukXG4gICAqL1xuICBwcml2YXRlIF9vblB1Ykludml0ZUNhbGwoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseSA9IHRydWUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50VUlkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gZGF0YS5jYWxsU2Vzc2lvblVzZXJzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VUlkKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBjdXJyZW50VXNlcjogJHtKU09OLnN0cmluZ2lmeShjdXJyZW50VXNlcil9LCBjdXJyZW50VXNlcklkOiAke2N1cnJlbnRVSWR9LCBzdGF0ZTogJHtzdGF0ZX1gLCB0cmFjZUlkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBlcnJvcjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzVmFsaWREYXRhKGRhdGEudG9EZXZpY2VJZCB8fCAnJykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYG5vdCBjdXJyZW50IGRldmljZUlkIC0+IGRldmljZUluZm86ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0b0RldmljZUlkOiBkYXRhLnRvRGV2aWNlSWQsXG4gICAgICAgIGNsaWVudERldmljZUlkOiB0aGlzLl9zZXNzaW9uSWQsXG4gICAgICB9KX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIEEg5ZKMIEIg576k6YCa6K+d5Lit77yMQSDlho3pgoDor7cgQ++8jEIg5ZKMIEInIOmDveS8muS8muaUtuWIsCBwdWJJbnZpdGVDYWxsLCBCJyDmlLbliLDnmoQgcHViSW52aXRlQ2FsbCDnmoQgdG9EZXZpY2VJZCDkuI3kuLroh6rlt7HvvIzml6DpnIDlpITnkIZcblxuICAgICAgLy8gaG9va3Mg5Zue6LCD5aSE55CGXG4gICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIHJlYXNvbjogUHViSW52aXRlQ2FsbE1pc3NSZWFzb24uTk9UX0NVUlJFTlRfREVWSUNFSUQsXG4gICAgICAgIHJlZmVyOiBpc0RpcmVjdGx5ID8gUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUJfSU5WSVRFIDogUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUxMX0tWX0lOVklURSxcbiAgICAgIH07XG4gICAgICBpZiAoaXNEaXJlY3RseSkge1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIGluZm8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwgaW5mbykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uSW52aXRlKGRhdGEsIGlzRGlyZWN0bHksIHRyYWNlSWQpO1xuICAgIGlmIChpc0RpcmVjdGx5KSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGwsIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxQdWxsS3YsIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDnirbmgIHlj5jmm7TvvJrlk43pk4PjgIHlv5nnoozjgIHpgJror53nrYnlvoXjgIHlr7nmlrnmnKrmjqXlkKzjgIHlt7HmlrnmnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX29uU3RhdHVzRG93bkNhbGwoZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmlbDmja7kuK3ov4fmu6TmjonmnKrlj5jmm7TnmoQgdXNlclNlc3Npb25cbiAgICBkYXRhLmNhbGxTZXNzaW9uVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZmlsdGVyKChpdGVtKSA9PiBCb29sZWFuKGl0ZW0uY2hhbmdlZCkpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08sICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5faXNWYWxpZERhdGEoZGF0YS50b0RldmljZUlkIHx8ICcnKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08sIGBub3QgY3VycmVudCBkZXZpY2VJZCAtPiBkZXZpY2VJbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdG9EZXZpY2VJZDogZGF0YS50b0RldmljZUlkLFxuICAgICAgICBjbGllbnREZXZpY2VJZDogdGhpcy5fc2Vzc2lvbklkLFxuICAgICAgfSl9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDkuI3mmK/nu5nlvZPliY3orr7lpIfkuIvlj5HnmoTnirbmgIHlpITnkIZcbiAgICAgIHRoaXMuX2xpc3RlbmVyLm9uT3RoZXJDbGllbnRTdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5lci5vblN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCwgdGhpcy5fc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53kuovku7blj5jmm7TvvJrmiZPlvIB85YWz6ZetIOaRhOWDj+WktFxuICAgKi9cbiAgcHJpdmF0ZSBfb25FdmVudERvd25DYWxsKGRhdGE6IElFdmVudERvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9saXN0ZW5lci5vbkV2ZW50RG93bihkYXRhLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53osIPmlbTkuovku7blj4rnu5PmnpxcbiAgICog5LqL5Lu277ya5aqS5L2T57G75Z6L5YiH5o2iXG4gICAqIOWKqOS9nO+8muivt+axguOAgeaOpeWPl+OAgeaLkue7neOAgeWPlua2iFxuICAgKi9cbiAgcHJpdmF0ZSBfb25EaWFsb2dEb3duQ2FsbChkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgZGlhbG9nVHlwZSwgYWN0aW9uLCBleHRyYUtleVZhbCB9ID0gZGF0YTtcbiAgICBzd2l0Y2ggKGRpYWxvZ1R5cGUpIHtcbiAgICAgIGNhc2UgRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRTpcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIub25Td2l0Y2hNZWRpYVR5cGUoZGF0YSwgdHJhY2VJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WQju+8jOaXpeW/l+S4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25QdWJDYWxsTG9nKGRhdGE6IElQdWJDYWxsTG9nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PLCBgY2FsbCByZWNvcmQ6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9saXN0ZW5lci5vblJlY3ZDYWxsRW5kTG9nKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOihpeWBv+aVsOaNruWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Db25wZW5zYXRpb25EYXRhKGRhdGE6IElDb25wZW5zYXRpb25EYXRhLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DT01QTEVNRU5UQVJZX0RBVEFfTywgJycsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgc2VjcmV0Q2hhdCwgZHVyYXRpb24sIGNhbGxTdGF0dXMsIGNhbGxpbmdVc2VySWQsIGNhbGxTZXNzaW9uVXNlcnMsIHRvRGV2aWNlSWQsIGNhbGxEaWFsb2dFbnRpdHlzLFxuICAgIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgaXNQdWJJbnZpdGVDYWxsRGF0YSA9IGNhbGxTZXNzaW9uVXNlcnMuc29tZSgoaXRlbSkgPT4gaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEICYmIGl0ZW0udXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKTtcblxuICAgIGlmIChpc1B1Ykludml0ZUNhbGxEYXRhKSB7XG4gICAgICB0aGlzLl9vblB1Ykludml0ZUNhbGwoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHRvRGV2aWNlSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGludml0ZVVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFNlc3Npb25Vc2VycyxcbiAgICAgICAgc2VjcmV0Q2hhdCxcbiAgICAgIH0sIHRydWUsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN0YXR1c0Rvd25DYWxsKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB0b0RldmljZUlkLFxuICAgICAgICBjYWxsU3RhdHVzLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgY2FsbFNlc3Npb25Vc2VycyxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGlmIChjYWxsRGlhbG9nRW50aXR5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjYWxsRGlhbG9nRW50aXR5cy5mb3JFYWNoKChkYXRhKSA9PiB0aGlzLl9vbkRpYWxvZ0Rvd25DYWxsKGRhdGEsIHRyYWNlSWQpLCB0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IHN0cmluZzEwdG82NCA9IChudW1iZXI6IG51bWJlcikgPT4ge1xuICBjb25zdCBjaGFycyA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpZ2tsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElHS0xNTk9QUVJTVFVWV1hZWisvJy5zcGxpdCgnJyk7XG4gIGNvbnN0IHJhZGl4ID0gY2hhcnMubGVuZ3RoICsgMTtcbiAgbGV0IHF1dGllbnQgPSArbnVtYmVyO1xuICBjb25zdCBhcnIgPSBbXTtcbiAgZG8ge1xuICAgIGNvbnN0IG1vZCA9IHF1dGllbnQgJSByYWRpeDtcbiAgICBxdXRpZW50ID0gKHF1dGllbnQgLSBtb2QpIC8gcmFkaXg7XG4gICAgYXJyLnVuc2hpZnQoY2hhcnNbbW9kXSk7XG4gIH0gd2hpbGUgKHF1dGllbnQpO1xuICByZXR1cm4gYXJyLmpvaW4oJycpO1xufTtcblxuY29uc3QgZ2V0VVVJRCA9ICgpID0+ICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgKGMpID0+IHtcbiAgY29uc3QgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xuICByZXR1cm4gdi50b1N0cmluZygxNik7XG59KTtcblxuLyog6I635Y+WIDIyIOS9jeeahCBVVUlEICovXG5leHBvcnQgY29uc3QgZ2V0VVVJRDIyID0gKCkgPT4ge1xuICBsZXQgdXVpZDogc3RyaW5nIHwgbnVtYmVyID0gZ2V0VVVJRCgpO1xuICB1dWlkID0gYCR7dXVpZC5yZXBsYWNlKC8tL2csICcnKX0wYDtcbiAgdXVpZCA9IHBhcnNlSW50KHV1aWQsIDE2KTtcbiAgdXVpZCA9IHN0cmluZzEwdG82NCh1dWlkKTtcbiAgaWYgKHV1aWQubGVuZ3RoID4gMjIpIHtcbiAgICB1dWlkID0gdXVpZC5zbGljZSgwLCAyMik7XG4gIH1cbiAgcmV0dXJuIHV1aWQ7XG59O1xuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5cbmNvbnN0IENBTExfREJfTkFNRSA9ICdSQ19DQUxMUExVUyc7XG5cbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXG5pbnRlcmZhY2UgSU9ialN0b3JlUGFyYW1zIHtcbiAgLyoqXG4gICAqIOS4u+mUrlxuICAgKi9cbiAga2V5UGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIOWmguaenOayoeacieWQiOmAgueahOS4u+mUru+8jOWPr+S7peiuvue9ruS4uiB0cnVlIOiHquWKqOeUn+aIkFxuICAgKi9cbiAgYXV0b0luY3JlbWVudD86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElJbmRleERCT3B0cyB7XG4gIG9uU3VjY2VzczogKCkgPT4gdm9pZDtcbiAgb25FcnJvcj86ICgpID0+IHZvaWQ7XG59XG5cbmxldCBsb2dnZXI6IEJhc2ljTG9nZ2VyO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsSW5kZXhEQiB7XG4gIC8qKlxuICAgKiBjYWxsIGluZGV4REIg5bqTXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZGI6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICogUkNDYWxsSW5kZXhEQiDlrp7kvotcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogUkNDYWxsSW5kZXhEQiB8IG51bGwgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBpbml0KF9sb2dnZXI6IEJhc2ljTG9nZ2VyLCBvcHRzOiBJSW5kZXhEQk9wdHMpIHtcbiAgICBsb2dnZXIgPSBfbG9nZ2VyO1xuICAgIGlmICghdGhpcy5pc1N1cHBvcnQoKSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tSQ0NhbGxJbmRleERCXScsICdJbmRleERCIGlzIG5vdCBzdXBwb3J0IGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxID0gd2luZG93LmluZGV4ZWREQi5vcGVuKENBTExfREJfTkFNRSwgREJfVkVSU0lPTik7XG5cbiAgICByZXEub25lcnJvciA9IChldjogYW55KSA9PiB7XG4gICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYG9wZW4gaW5kZXhEQiByZXEgZmFpbGVkIC0+ICR7ZXYudGFyZ2V0LmVycm9yfWApO1xuICAgIH07XG5cbiAgICByZXEub25zdWNjZXNzID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2RiID0gZXYudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICh0aGlzLl9kYikge1xuICAgICAgICB0aGlzLl9kYi5vbmNsb3NlID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgdW5leHBlY3RlZGx5IGNsb3NlZC4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kYi5vbmVycm9yID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgb3BlbmluZyBlcnJvci4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kYi5vbmFib3J0ID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgb3BlbmluZyBhYm9ydGVkLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBSQ0NhbGxJbmRleERCLl9pbnN0YW5jZSA9IG5ldyBSQ0NhbGxJbmRleERCKCk7XG4gICAgICBvcHRzLm9uU3VjY2VzcygpO1xuICAgIH07XG5cbiAgICByZXEub251cGdyYWRlbmVlZGVkID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2RiID0gZXYudGFyZ2V0LnJlc3VsdDtcblxuICAgICAgUkNDYWxsSW5kZXhEQi5jcmVhdGVPYmpTdG9yZSgnQ2FsbEJXX0Fibm9ybWFsQ2FsbCcsIHsga2V5UGF0aDogJ3VzZXJJZCcgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyB1bkluaXQoKSB7XG4gICAgdGhpcy5fZGIgPSBudWxsO1xuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSQ0NhbGxJbmRleERCIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGlzU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhd2luZG93IHx8ICF3aW5kb3cuaW5kZXhlZERCKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVPYmpTdG9yZShvYmpOYW1lOiBzdHJpbmcsIG9wdHM6IElPYmpTdG9yZVBhcmFtcykge1xuICAgIGxldCBvYmpTdG9yZTogSURCT2JqZWN0U3RvcmU7XG4gICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYj8ub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhvYmpOYW1lKSkge1xuICAgICAgb2JqU3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYiEuY3JlYXRlT2JqZWN0U3RvcmUob2JqTmFtZSwgb3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW1JDQ2FsbEluZGV4REJdJywgYGNyZWF0ZU9ialN0b3JlICR7b2JqTmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG9iak5hbWUg6KGo5piOXG4gICAqIEBwYXJhbSB2YWwg6KaB5re75Yqg55qE5pWw5o2uXG4gICAqL1xuICBwdWJsaWMgYWRkVmFsdWUgPFQ+KG9iak5hbWU6IHN0cmluZywgdmFsOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLmFkZCh2YWwpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW1JDQ2FsbEluZGV4REJdJywgJ2FkZFZhbHVlIGZhaWxlZCcpO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Li76ZSu6K+75Y+W5pWw5o2uXG4gICAqIEBwYXJhbSBrZXkg5Li76ZSuXG4gICAqL1xuICBwdWJsaWMgcmVhZEJ5S2V5IDxUPihvYmpOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiKSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0pLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuXG4gICAgICBjb25zdCByZXEgPSBzdG9yZS5nZXQoa2V5KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXEucmVzdWx0KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcS5vbmVycm9yID0gKGV2KSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgcmVhZEJ5S2V5IG9uZXJyb3IgLT4gJHtldn1gKTtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Li76ZSu5pu05paw5pWw5o2uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQnlLZXkgPFQ+KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbDogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JlID0gUkNDYWxsSW5kZXhEQi5fZGIudHJhbnNhY3Rpb24oW29iak5hbWVdLCAncmVhZHdyaXRlJykub2JqZWN0U3RvcmUob2JqTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLnB1dCh2YWwpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoZXYpID0+IHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgdXBkYXRlQnlLZXkgb25lcnJvciAtPiAke2V2fWApO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVCeUtleShvYmpOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcblxuICAgICAgY29uc3QgcmVxID0gc3RvcmUuZGVsZXRlKGtleSk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9IChldikgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGByZW1vdmVCeUtleSBvbmVycm9yIC0+ICR7ZXZ9YCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgSVJ1bnRpbWUsIElTdG9yYWdlIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsSW5kZXhEQiB9IGZyb20gJy4uL3V0aWxzL2luZGV4REInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPYmpTdG9yZSB7W3VzZXJJZDogc3RyaW5nXTogc3RyaW5nW119XG5cbmludGVyZmFjZSBJU3RvcmVWYWwge3VzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXX1cblxuLyoqXG4gKiDlvILluLjnu5PmnZ8gY2FsbCDlpITnkIblrZjlgqjnsbtcbiAqIOWcqOWRvOWHuuaIluWRvOWFpemYtuauteeahCBjYWxsIOi/m+ihjOacrOWcsOWtmOWCqO+8jOato+W4uOe7k+adn+WQjua4hemZpFxuICog5byC5bi457uT5p2f5ZCO77yM5pys5Zyw5Y+W5pyq5riF6Zmk55qEIGNhbGxJZCwg6YCa6L+H5pyN5Yqh5o6l5Y+j5riF6Zmk5byC5bi457uT5p2f55qEIGNhbGwgLOmYsuatouaXoOazleWRvOWHuuaIluWRvOWFpVxuICovXG5leHBvcnQgY2xhc3MgQWJub3JtYWxDYWxsIHtcbiAgcHJpdmF0ZSBfbG9jYWxTdG9yZSE6IElTdG9yYWdlXG5cbiAgcHJpdmF0ZSBfaW5kZXhEQlN0b3JlITogUkNDYWxsSW5kZXhEQlxuXG4gIHByaXZhdGUgX3N0b3JlS2V5OiBzdHJpbmcgPSAnQ2FsbEJXX0Fibm9ybWFsQ2FsbCdcblxuICBwcml2YXRlIF9pc1N1cHBvcnRJbmRleERCOiBib29sZWFuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA9IFJDQ2FsbEluZGV4REIuaXNTdXBwb3J0KCk7XG4gICAgaWYgKHRoaXMuX2lzU3VwcG9ydEluZGV4REIpIHtcbiAgICAgIFJDQ2FsbEluZGV4REIuaW5pdCh0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlID0gUkNDYWxsSW5kZXhEQi5nZXRJbnN0YW5jZSgpITtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sb2NhbFN0b3JlID0gX3J1bnRpbWUubG9jYWxTdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIOa3u+WKoOW8guW4uCBjYWxsSWRcbiAgICovXG4gIHB1YmxpYyBhZGRBYm5vcm1hbGxDYWxsSWQodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgYWRkRnVuYyA9IHRoaXMuX2lzU3VwcG9ydEluZGV4REIgPyB0aGlzLl9hZGRCeUluZGV4REIgOiB0aGlzLl9hZGRCeUxvY2FsU3RvcmU7XG4gICAgYWRkRnVuYy5jYWxsKHRoaXMsIHVzZXJJZCwgY2FsbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTlvILluLggY2FsbElkXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQWJub3JtYWxDYWxsSWRzKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHJlbW92ZUZ1bmMgPSB0aGlzLl9pc1N1cHBvcnRJbmRleERCID8gdGhpcy5fcmVtb3ZlQnlJbmRleERCIDogdGhpcy5fcmVtb3ZlQnlMb2NhbFN0b3JlO1xuICAgIHJlbW92ZUZ1bmMuY2FsbCh0aGlzLCB1c2VySWQsIGNhbGxJZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW8guW4uOe7k+adn+eahCBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgZ2V0QWJub3JtYWxDYWxsSWRzKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBjb25zdCBnZXRGdW5jID0gdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA/IHRoaXMuX2dldEJ5SW5kZXhEQiA6IHRoaXMuX2dldEJ5TG9jYWxTdG9yZTtcbiAgICByZXR1cm4gZ2V0RnVuYy5jYWxsKHRoaXMsIHVzZXJJZCk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRCeUxvY2FsU3RvcmUodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGxldCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIHVzZXJBYm5vcm1hbENhbGxJZHMucHVzaChjYWxsSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcyA9IFtjYWxsSWRdO1xuICAgICAgfVxuICAgICAgb2JqU3RvcmVbdXNlcklkXSA9IHVzZXJBYm5vcm1hbENhbGxJZHM7XG4gICAgICB0aGlzLl9sb2NhbFN0b3JlLnNldEl0ZW0odGhpcy5fc3RvcmVLZXksIEpTT04uc3RyaW5naWZ5KG9ialN0b3JlKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2FkZEJ5TG9jYWxTdG9yZSBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVCeUxvY2FsU3RvcmUodXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGxldCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIHVzZXJBYm5vcm1hbENhbGxJZHMgPSB1c2VyQWJub3JtYWxDYWxsSWRzLmZpbHRlcigoaWQpID0+ICFjYWxsSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBvYmpTdG9yZVt1c2VySWRdID0gdXNlckFibm9ybWFsQ2FsbElkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmUuc2V0SXRlbSh0aGlzLl9zdG9yZUtleSwgSlNPTi5zdHJpbmdpZnkob2JqU3RvcmUpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfcmVtb3ZlQnlMb2NhbFN0b3JlIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPiB7XG4gICAgbGV0IGNhbGxJZHMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvYmpTdG9yZTogSU9ialN0b3JlID0gPElPYmpTdG9yZT5KU09OLnBhcnNlKHRoaXMuX2xvY2FsU3RvcmUuZ2V0SXRlbSh0aGlzLl9zdG9yZUtleSkgfHwgJ3t9Jyk7XG4gICAgICBjb25zdCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIGNhbGxJZHMgPSB1c2VyQWJub3JtYWxDYWxsSWRzO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9nZXRCeUxvY2FsU3RvcmUgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FsbElkcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9hZGRCeUluZGV4REIodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl9pbmRleERCU3RvcmUucmVhZEJ5S2V5PElTdG9yZVZhbD4odGhpcy5fc3RvcmVLZXksIHVzZXJJZCk7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmNhbGxJZHMucHVzaChjYWxsSWQpO1xuICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUudXBkYXRlQnlLZXkodGhpcy5fc3RvcmVLZXksIHVzZXJJZCwge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBjYWxsSWRzOiBkYXRhLmNhbGxJZHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlLmFkZFZhbHVlKHRoaXMuX3N0b3JlS2V5LCB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGNhbGxJZHM6IFtjYWxsSWRdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfYWRkQnlJbmRleERCIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlbW92ZUJ5SW5kZXhEQih1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEuY2FsbElkcyA9IGRhdGEuY2FsbElkcy5maWx0ZXIoKGlkKSA9PiAhY2FsbElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgICBpZiAoZGF0YS5jYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUudXBkYXRlQnlLZXkodGhpcy5fc3RvcmVLZXksIHVzZXJJZCwge1xuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgY2FsbElkczogZGF0YS5jYWxsSWRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS5yZW1vdmVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9yZW1vdmVCeUluZGV4REIgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0QnlJbmRleERCKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBsZXQgZGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLl9pbmRleERCU3RvcmUucmVhZEJ5S2V5PElTdG9yZVZhbD4odGhpcy5fc3RvcmVLZXksIHVzZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2dldEJ5SW5kZXhEQiBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHJldHVybiBkYXRhLmNhbGxJZHM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIOS6i+S7tuexu+Wei1xuICovXG5leHBvcnQgZW51bSBDYWxsU2VydmVyRXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIOaPkOekuueql+WPo1xuICAgKi9cbiAgUFJPTVBUID0gMCxcbiAgLyoqXG4gICAqIENhbGxTZXJ2ZXIg5LiL5Y+R6YCa6K+d5pe26ZW/5Y+Y5pu057G75Z6LXG4gICAqL1xuICBDQUxMX0RVUkFUSU9OID0gMTAsXG4gIC8qKlxuICAgKiDmlLbliLDov5znq6/nrKzkuIDluKfml7bpl7RcbiAgICovXG4gIEZJUlNUX0ZSQU1FID0gMjAsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzSW5uZXJDb2RlIHtcbiAgU1VDQ0VTUyA9IDAsXG4gIC8qKlxuICAgKiDml6DmlYjnmoTlk43lupTml7bpl7TvvIjmjqXlj6Plk43lupTml7bpl7Tov4fplb/vvIlcbiAgICovXG4gIElOVkFMSURfUkVTUE9OU0VfVElNRSA9IDgwMTcwLFxuICAvKipcbiAgICog6Z2e5pyA5LyY5ZON5bqU5pe26Ze0XG4gICAqL1xuICBOT05PUFRJTUFMX1JFU19USU1FID0gODAxNzEsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyB0aW1lclNldFRpbWVvdXQgfSBmcm9tICcuLi91dGlscy90aW1lcnMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbm5lckNvZGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxQbHVzSW5uZXJDb2RlJztcblxuLyoqXG4gKiDmoKHml7bmqKHlnZdcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVDb3JyZWN0aW9uZXIge1xuICAvKipcbiAgICog5o6l5Y+j5ZON5bqU5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIF9SVFQ6IG51bWJlciA9IDBcblxuICAvKipcbiAgICog5Y+v55So55qE5o6l5Y+j5ZON5bqU5pe26Ze05LiL6ZmQ77yI5Y2V5L2NOiBtc++8iVxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRNaW5SVFQ6IG51bWJlciA9IDIwMFxuXG4gIC8qKlxuICAgKiDlj6/nlKjnmoTmjqXlj6Plk43lupTml7bpl7TkuIrpmZDvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF92YWxpZE1heFJUVDogbnVtYmVyID0gMTAwMFxuXG4gIC8qKlxuICAgKiDkuI4gY2FsbFNlcnZlciDnmoTml7bpl7TlgY/lt67ml7bpl7TvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF9kZWx0YVRpbWU6IG51bWJlciA9IDBcblxuICAvKipcbiAgICogdGltZXJJZFxuICAgKi9cbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog6L2u6K6t5pe26Ze06Ze06ZqU77yI5Y2V5L2NOiBtc++8iVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaW50ZXJ2YWw6IG51bWJlciA9IDIgKiAxMDAwXG5cbiAgLyoqXG4gICAqIOacgOWkp+mHjeivleasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4UmV0cnlUaW1lczogbnVtYmVyID0gOFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NpbmdsZUNhbGxEdXJhdGlvbkV2OiAoY2FsbElkOiBzdHJpbmcsIGNsaWVudFN0YXJ0VGltZTogbnVtYmVyLCBjbGllbnRGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpID0+IHZvaWQsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh56uv6I635Y+W6YCa6K+d5pe26ZW/44CB6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbENsaWVudFRpbWVCeVNlcnZlcihjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgaWYgKCF0aGlzLl9SVFQgfHwgdGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2dldERlbHRhVGltZSh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUiwgYGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YXJ0VGltZTogc2VydmVyU3RhcnRUaW1lIH0gPSBkYXRhITtcbiAgICBjb25zdCBjbGllbnRTdGFydFRpbWUgPSBNYXRoLmZsb29yKHNlcnZlclN0YXJ0VGltZSAtIHRoaXMuX2RlbHRhVGltZSk7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBkdXJhdGlvbiA9IChjdXJyZW50VGltZSArIHRoaXMuX2RlbHRhVGltZSAtIHNlcnZlclN0YXJ0VGltZSkgLyAxMDAwO1xuXG4gICAgaWYgKGR1cmF0aW9uIDwgMCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCwgYGludmFsaWQgZHVyYXRpb246ICR7ZHVyYXRpb259YCwgdHJhY2VJZCk7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgLy8g5ZCR5LiL5Y+W5pW0XG4gICAgZHVyYXRpb24gPSBNYXRoLmZsb29yKGR1cmF0aW9uKTtcblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCAmJiB0aGlzLl9SVFQgPD0gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLk5PTk9QVElNQUxfUkVTX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLk5PTk9QVElNQUxfUkVTX1RJTUUsIGR1cmF0aW9uLCBjbGllbnRTdGFydFRpbWUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgICAgc2VydmVyU3RhcnRUaW1lLFxuICAgICAgY2xpZW50U3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGUsIGR1cmF0aW9uLCBjbGllbnRTdGFydFRpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXorqHnrpflrqLmiLfnq6/lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBjYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZDogc3RyaW5nLCBzdGFydFRpbWU6IG51bWJlciwgdHJhY2VJZDogc3RyaW5nKTogeyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLCBjbGllbnRTdGFydFRpbWU/OiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9DQUxDX0NMSUVOVF9TVEFSVF9USU1FX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfSwgc3RhcnRUaW1lOiAke3N0YXJ0VGltZX1gLCB0cmFjZUlkKTtcbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDlho3mrKHph43mlrDojrflj5YgUlRUIOW5tumHjeaWsOiuoeeul+W8gOWni+aXtumXtFxuICAgICAgdGhpcy5fbG9vcENvcnJlY3RDbGllbnRUaW1lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3Ioc3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcnR0OiB0aGlzLl9SVFQsXG4gICAgICBkZWx0YVQ6IHRoaXMuX2RlbHRhVGltZSxcbiAgICAgIHN0YXJ0VDogc3RhcnRUaW1lLFxuICAgICAgY2xpZW50U3RhcnRUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCkge1xuICAgICAgLy8g6YeN572uIGNhbGwg5Lit6YeN6K+V5qyh5pWwXG4gICAgICB0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID0gMDtcbiAgICAgIC8vIOWGjeasoemHjeaWsOiOt+WPliBSVFQg5bm26YeN5paw6K6h566X5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLlNVQ0NFU1MsIGNsaWVudFN0YXJ0VGltZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lcyA9IDA7XG5cbiAgLyoqXG4gICAqIOW8gOWni+WumuaXtumAkuW9kuiOt+WPluS4jiBDYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruWAvFxuICAgKi9cbiAgcHVibGljIHN0YXJ0KHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl90aW1lcklkIHx8IHRoaXMuX3N0YXJ0VGltZXMgPj0gdGhpcy5fbWF4UmV0cnlUaW1lcykge1xuICAgICAgLy8g6Ziy5q2i6YeN5aSN5ZCv5YqoXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TVEFSVF9PLCBgdGltZXJJZDogJHt0aGlzLl90aW1lcklkfWApO1xuXG4gICAgdGhpcy5fc3RhcnRUaW1lcysrO1xuXG4gICAgLy8g6I635Y+WXG4gICAgdGhpcy5fZ2V0RGVsdGFUaW1lKHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl90aW1lcklkID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnQodHJhY2VJZCk7XG4gICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWBnOatouWumuaXtui9ruiurVxuICAgKi9cbiAgcHVibGljIHN0b3AodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TVE9QX08sIGB0aW1lcklkOiAke3RoaXMuX3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gICAgdGhpcy5fdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG4gICAgdGhpcy5fdGltZXJJZCA9IG51bGw7XG4gICAgLy8g6YeN572u5qyh5pWwXG4gICAgdGhpcy5fc3RhcnRUaW1lcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICog6YeN5paw5a6a5pe26L2u6K6tXG4gICAqL1xuICBwdWJsaWMgcmVzdGFydCh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1JFU1RBUlRfTywgYGxlZ2FsIHJ0dCB0aW1lLCBSVFQ6ICR7dGhpcy5fUlRUfSwgdmFsaWRNaW5SVFQ6ICR7dGhpcy5fdmFsaWRNaW5SVFR9YCwgdHJhY2VJZCk7XG4gICAgaWYgKHRoaXMuX1JUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOa4hemZpOW9k+WJjeato+WcqOi/m+ihjOeahFxuICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICAvLyDph43mlrDlkK/liqhcbiAgICB0aGlzLnN0YXJ0KHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsRGVsYXlUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbHRhVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSVFQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fUlRUO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS4jiBDYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruWAvO+8jOmdnumAmuivneS4reeahOiuoeeul1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVsdGFUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGRlbGF5VGltZT86IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogc3luY1RpbWUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJUVCA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAvLyDlsI/kuo4gMTAwMG1zIOS4uuWPr+eUqCBydHRcbiAgICBpZiAoKGN1cnJlbnRSVFQgPCB0aGlzLl9SVFQgfHwgdGhpcy5fUlRUID09PSAwKSAmJiBjdXJyZW50UlRUIDw9IHRoaXMuX3ZhbGlkTWF4UlRUKSB7XG4gICAgICB0aGlzLl9SVFQgPSBjdXJyZW50UlRUO1xuICAgIH1cblxuICAgIC8vIOWPquacieWwj+S6jiAyMDBtcyDlgZzmraLojrflj5ZcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDlsI/kuo7mnIDlsI/lj6/nlKggcnR077yM5YGc5q2i6L2u6K6t6K6h566XXG4gICAgICB0aGlzLnN0b3AodHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsdGFUaW1lID0gKHN5bmNUaW1lISAtIHN0YXJ0VGltZSkgLSB0aGlzLl9SVFQgLyAyO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIHJldHVybiB7IGNvZGUsIGRlbGF5VGltZTogdGhpcy5fZGVsdGFUaW1lIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6I635Y+W5byA5aeL5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXREZWx0YVRpbWVJbkNhbGwoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLCBjbGllbnRTdGFydFRpbWU/OiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsVGltZUluZm8oY2FsbElkLCB0cmFjZUlkKTtcbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJUVCA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAvLyDlsI/kuo4gMTAwMG1zIOS4uuWPr+eUqCBydHRcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX1JUVCkge1xuICAgICAgdGhpcy5fUlRUID0gY3VycmVudFJUVDtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YVRpbWUgPSAoZGF0YSEuc3luY1RpbWUgLSBzdGFydFRpbWUpIC0gdGhpcy5fUlRUIC8gMjtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfU0VUX0RFTFRBX1RJTUVfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkLFxuICAgICAgcnR0OiB0aGlzLl9SVFQsXG4gICAgICBkZWx0YVQ6IHRoaXMuX2RlbHRhVGltZSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBjbGllbnRTdGFydFRpbWUgPSBNYXRoLmZsb29yKGRhdGEhLnN0YXJ0VGltZSAtIHRoaXMuX2RlbHRhVGltZSk7XG4gICAgY29uc3QgY2xpZW50Rmlyc3RGcmFtZVRpbWUgPSBNYXRoLmZsb29yKGRhdGEhLmZpcnN0RnJhbWV0aW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcblxuICAgIC8vIOWPquacieWwj+S6jiAyMDBtcyDlgZzmraLojrflj5ZcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDmnIDkvJjnu5PmnpzvvIzlgZzmraLova7orq3orqHnrpdcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUywgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9O1xuICAgIH1cbiAgICAvLyDpnZ7mnIDkvJjnu5PmnpxcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSwgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmV0cnlUaW1lc0luQ2FsbDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heFJldHJ5VGltZXNJbkNhbGw6IG51bWJlciA9IDNcblxuICAvKipcbiAgICog5aSa5qyh5qCh5q2j5oqb57uZ5Lia5Yqh5bGC55qE6YCa6K+d5byA5aeL5pe26Ze044CB6aaW5bin5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOWFiOWBnOatouacque7k+adn+eahOiuoeeul1xuICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSwgY2xpZW50Rmlyc3RGcmFtZVRpbWUgfSA9IGF3YWl0IHRoaXMuX2dldERlbHRhVGltZUluQ2FsbChjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOe7k+aenOacgOS8mO+8jOaKm+e7meW6lOeUqOWxguW8gOWni+aXtumXtFxuICAgICAgdGhpcy5fc2luZ2xlQ2FsbER1cmF0aW9uRXYoY2FsbElkLCBjbGllbnRTdGFydFRpbWUhLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmV0cnlUaW1lc0luQ2FsbCA+IHRoaXMuX21heFJldHJ5VGltZXNJbkNhbGwgJiYgY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g6Z2e5pyA5LyY57uT5p6c77yM5oqb57uZ5bqU55So5bGC5byA5aeL5pe26Ze077yM5qC55o2u6YeN6K+V5qyh5pWw6L+b6KGM6YeN6K+VOyDph43or5UgMyDmrKHlkI7lho3mipvlh7rkuLvopoHmmK/kuLrkuobojrflj5bmnIDlsI8gUlRUXG4gICAgICB0aGlzLl9zaW5nbGVDYWxsRHVyYXRpb25FdihjYWxsSWQsIGNsaWVudFN0YXJ0VGltZSEsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID4gdGhpcy5fbWF4UmV0cnlUaW1lc0luQ2FsbCkge1xuICAgICAgLy8g5peg5pyA5LyY57uT5p6c77yM5bqU55So5bGC5qC55o2u6Ieq5bex55qE5pe26Ze06LWw6KGoLCDnm7jlvZPkuo4gUlRUIOaMiSAwIOWkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JldHJ5VGltZXNJbkNhbGwrKztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH0sIHRoaXMuX2ludGVydmFsKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gRm9yd2FyZFR5cGUge1xuICAvKipcbiAgICog6YCa6L+H5LiL5LiA5qyh5Lq65ZGY54q25oCBIHVzZXJTdGF0ZSDnmoTkuIvlj5HlkIzmraXluKbkuIvljrtcbiAgICovXG4gIFNPT05fQUZFVEVSID0gMCxcbiAgLyoqXG4gICAqIOeri+WNs+i9rOWPkVxuICAgKi9cbiAgQ1VSUkVOVCA9IDEsXG59XG4iLCJpbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHtcbiAgUFVCX0lOVklURV9DQUxMID0gMCxcbiAgUFVMTF9LVl9JTlZJVEVfQ0FMTCA9IDEsXG4gIFNZU1RFTV9QVVNIID0gMixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3RhdGlzdGljc0RhdGEge1xuICAvKipcbiAgICog5LiK5oql5pe26Ze0XG4gICAqL1xuICB0aW1lOiBudW1iZXIsXG4gIC8qKlxuICAgKiDov5DokKXllYbvvIzkvovlpoIg5Lit5Zu96IGU6YCaXG4gICAqL1xuICBjcjogc3RyaW5nLFxuICAvKipcbiAgICog572R57uc57G75Z6L77yM5L6L5aaCIDRHXG4gICAqL1xuICBuZXQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIHVzZXJJZFxuICAgKi9cbiAgdWlkOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDplJnor6/noIFcbiAgICovXG4gIGNvZDogbnVtYmVyLFxuICAvKipcbiAgICog6LCD55So5omn6KGM5pe26ZW/XG4gICAqL1xuICBkdXI6IG51bWJlclxuICAvKipcbiAgICog5aqS5L2T57G75Z6LXG4gICAqL1xuICBtdHA6IFJDQ2FsbFBsdXNNZWRpYVR5cGVcbiAgLyoqXG4gICAqIOmAmuivneexu+Wei++8jOengeiBiuaIlue+pOiBilxuICAgKi9cbiAgY3RwOiBSQ0NhbGxQbHVzVHlwZVxuICAvKipcbiAgICogY2FsbElkXG4gICAqL1xuICBjaWQ6IHN0cmluZ1xuICAvKipcbiAgICogY2xpZW50IGNhbGxJZFxuICAgKi9cbiAgY2NpZDogc3RyaW5nLFxuICAvKipcbiAgICog6YKA6K+35o6l5pS25p2l5rqQXG4gICAqL1xuICByZjogUkNDYWxsUGx1c0ludml0ZVNvdXJjZVxufVxuIiwiZXhwb3J0IGVudW0gUkNDYWxsRGlyZWN0aW9uIHtcbiAgLyoqXG4gICAqIOWRvOWHulxuICAgKi9cbiAgT1VUID0gLTEsXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICovXG4gIEdST1VQID0gMCxcbiAgLyoqXG4gICAqIOWRvOWFpVxuICAgKi9cbiAgSU4gPSAxXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBJUnVudGltZSwgUGx1Z2luQ29udGV4dCwgUkNDb25uZWN0aW9uU3RhdHVzLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuL2VudW1zL0RpYWxvZ0FjdGlvbic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi9lbnVtcy9EaWFsb2dUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFNlY3JldENhbGxUeXBlIH0gZnJvbSAnLi9lbnVtcy9TZWNyZXRDYWxsVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7XG4gIElBY2NlcHRJbmZvLFxuICBJQWNjZXB0T3B0cyxcbiAgSUNhbGxJZCxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxuICBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMsXG4gIElDYW5jZWxDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJR2V0Q2FsbExvZ0xpc3RPcHRzLFxuICBJR2V0Q2FsbFNlc3Npb25SZXMsXG4gIElIYW5ndXBJbmZvLFxuICBJSW52aXRlT3B0cyxcbiAgSUludml0ZVJlcyxcbiAgSUpvaW5DYWxsT3B0cyxcbiAgSU90aGVyTWVtSW5mbyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElSZXFDaGFuZ2VNZWRpYVR5cGVSZXMsXG4gIElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJU2Vzc2lvblVzZXIsXG4gIElTdGFydENhbGxPcHRzLFxuICBJU3RhcnRDYWxsUmVzdWx0LFxuICBJSGFuZ3VwRm9yQnVzeU9wdHMsXG4gIElDaGFuZ2VNZWRpYVR5cGVJbmZvLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQge1xuICBJQ2FsbFNlc3Npb25Vc2VyLFxuICBJRGlhbG9nRG93bkNhbGxDb24sXG4gIElFdmVudERvd25DYWxsQ29uLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0RGVsYXlUaW1lSW5mb1JlcyxcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElTdGF0dXNEb3duQ29udCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBDYWxsVGltZXJFdmVudFR5cGUsIFJDQ2FsbElubmVyU2Vzc2lvbiB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxJbm5lclNlc3Npb24nO1xuaW1wb3J0IHsgU2lnbmFsVHJhbnNwb3J0ZXIgfSBmcm9tICcuL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgcGFyc2VTdGF0dXNEYXRhLCB0cmFuMkNhbGxMb2cgfSBmcm9tICcuL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBnZXRVVUlEMjIgfSBmcm9tICcuL3V0aWxzL3JhbmRvbSc7XG5pbXBvcnQgeyB0aW1lclNldFRpbWVvdXQgfSBmcm9tICcuL3V0aWxzL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBBYm5vcm1hbENhbGwgfSBmcm9tICcuL21vZHVsZXMvQWJub3JtYWxDYWxsJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJFdmVudFR5cGUgfSBmcm9tICcuL2VudW1zL0NhbGxTZXJ2ZXJFdmVudFR5cGUnO1xuaW1wb3J0IHsgVGltZUNvcnJlY3Rpb25lciB9IGZyb20gJy4vbW9kdWxlcy9UaW1lQ29ycmVjdGlvbmVyJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbFBsdXNTZXNzaW9uJztcbmltcG9ydCB7IEZvcndhcmRUeXBlIH0gZnJvbSAnLi9lbnVtcy9Gb3J3YXJkVHlwZSc7XG5pbXBvcnQge1xuICBDYWxsSG9va3NUeXBlLCBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiwgUHViSW52aXRlQ2FsbE1pc3NSZWZlcixcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUsIFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ludml0ZVNvdXJjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IFJDQ2FsbERpcmVjdGlvbiB9IGZyb20gJy4vZW51bXMvUkNDYWxsRGlyZWN0aW9uJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbm5lckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUnO1xuXG5jb25zdCBDQUxMX1RJTUVfT1VUID0gNjAgKiAxMDAwO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsRW5naW5lIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIF9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fOiBzdHJpbmcgPSAnaW5uZXItc2Vzc2lvbi1jbG9zZSdcblxuICBzdGF0aWMgX19JTk5FUl9TRVNTSU9OX0NPTk5FQ1RfXzogc3RyaW5nID0gJ2lubmVyLXNlc3Npb24tY29ubmVjdCdcblxuICBzdGF0aWMgX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fOiBzdHJpbmcgPSAnaW5uZXItY2hhbmdlLW1lZGlhLXR5cGUnXG5cbiAgc3RhdGljIF9fSU5ORVJfSU5WSVRFX186IHN0cmluZyA9ICdpbm5lci1pbnZpdGUnXG5cbiAgLyoqXG4gICAqIOS4uyBzZXNzaW9uXG4gICAqL1xuICBfbWFpblNlc3Npb246IFJDQ2FsbElubmVyU2Vzc2lvbiB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOWcqOmAmuivneS4reaUtuWIsOeahCDpgoDor7cgc2Vzc2lvblxuICAgKi9cbiAgX2hvbGRTZXNzaW9uczogUkNDYWxsSW5uZXJTZXNzaW9uW10gPSBbXVxuXG4gIC8qKlxuICAgKiDkv6Hku6TmqKHlnZdcbiAgICovXG4gIF9zaWduYWxNb2R1bGU6IFNpZ25hbFRyYW5zcG9ydGVyXG5cbiAgLyoqXG4gICAqIOW8guW4uOe7k+adnyBjYWxsIOWkhOeQhuWZqFxuICAgKi9cbiAgX2Fibm9ybWFsTW9kdWxlOiBBYm5vcm1hbENhbGxcblxuICAvKipcbiAgICog6K6w5b2V5Y2V5ZG85Lit77yM5piv5ZCm5LiK5oql6L+H56ys5LiA5binXG4gICAqIOe9riB0cnVlIOaXtuacuu+8muaUtuWIsOi/nOerr+esrOS4gOW4p++8jOaIkOWKn+S4iuaKpSBTZXJ2ZXJcbiAgICog572uIGZhbHNlIOaXtuacuu+8mumAmuivnee7k+adn1xuICAgKi9cbiAgcHJpdmF0ZSBfaXNVcEZpcnN0RnJhbWVUaW1lOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6YCa6K+d5Li6IE9OQ0FMTCDml7bvvIxTREsg6ZyA57uZ5Lia5Yqh5bGC5LiK5oql6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAqIOS8muaUtuWIsOWkmuasoSBPTkNBTEzvvIzmiYDku6XpnIDopoHmoIfor4bmmK/lkKblt7Lmipvov4fkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX2NhbGxTdGFydE1hcDoge1xuICAgIFtjYWxsSWQ6IHN0cmluZ106IHtcbiAgICAgIGlzUmVjZWl2ZUNhbGxTdGFydFRpbWU6IGJvb2xlYW4sXG4gICAgfVxuICB9ID0ge31cblxuICAvKipcbiAgICog5qCh5pe25ZmoXG4gICAqL1xuICBfdGltZUNvcnJlY3Rpb25lcjogVGltZUNvcnJlY3Rpb25lclxuXG4gIC8qKlxuICAgKiDmnoTpgKDlmahcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydEFwcEV2ZW50TW9kdWxlOiBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIgPSBuZXcgVGltZUNvcnJlY3Rpb25lcih0aGlzLCBfbG9nZ2VyLCB0aGlzLl9vblJlY3ZTaW5DYWxsRHVyYXRpb24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fc2lnbmFsTW9kdWxlID0gbmV3IFNpZ25hbFRyYW5zcG9ydGVyKF9jb250ZXh0LCBfcnVudGltZSwgX2luaXRPcHRzLCB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLCB0aGlzLl9sb2dnZXIpO1xuICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5yZWdpc3Rlckxpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgb25TdGF0dXNEb3duOiB0aGlzLl9vblN0YXR1c0Rvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uT3RoZXJDbGllbnRTdGF0dXNEb3duOiB0aGlzLl9vbk90aGVyQ2xpZW50U3RhdHVzRG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25FdmVudERvd246IHRoaXMuX29uRXZlbnREb3duLmJpbmQodGhpcyksXG4gICAgICBvblN3aXRjaE1lZGlhVHlwZTogdGhpcy5fb25Td2l0Y2hNZWRpYVR5cGUuYmluZCh0aGlzKSxcbiAgICAgIG9uUmVjdkNhbGxFbmRMb2c6IHRoaXMuX29uUmVjdkNhbGxFbmRMb2cuYmluZCh0aGlzKSxcbiAgICAgIG9uSU1TdGF0ZUNoYW5nZTogdGhpcy5fb25JTVN0YXRlQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUgPSBuZXcgQWJub3JtYWxDYWxsKF9ydW50aW1lLCBfbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdGFydENhbGwob3B0czogSVN0YXJ0Q2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN1bHR9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgdG9Vc2VycywgdGFyZ2V0SWQsIHRhcmdldFR5cGUsIG9sZFJvb21JZCxcbiAgICB9ID0gb3B0cztcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5zdGFydENhbGwoe1xuICAgICAgY2xpZW50Q2FsbElkOiBvcHRzLmNhbGxJZCxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIHNlY3JldENoYXQ6IFNlY3JldENhbGxUeXBlLk5PUk1BTCxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG9sZFJvb21JZCxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjYWxsSWQsIGJ1c3lsaW5lVXNlcnMgfSA9IGRhdGEhO1xuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgY2FsbElkKTtcblxuICAgIC8vIOeUn+aIkOS4uyBzZXNzaW9uXG4gICAgdGhpcy5fbWFpblNlc3Npb24gPSBuZXcgUkNDYWxsSW5uZXJTZXNzaW9uKFxuICAgICAgY2FsbElkLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5JTlZJVEVELFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgY3VycmVudFVzZXJJZCxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICk7XG5cbiAgICAvLyDljZXlkbzlkK/liqjlkbzlj6votoXml7borqHml7blmagsIOe+pOWRvOaXoOi2heaXtumAu+i+kVxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICBjb25zdCBpbnZpdGVyVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoZGF0YSEuY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlVGltZXJJZChDYWxsVGltZXJFdmVudFR5cGUuSU5WSVRFUiwgaW52aXRlclRpbWVySWQpO1xuICAgIH1cblxuICAgIC8vIOmAmuefpeW3seaWueS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IHNlbGZTdGF0ZSA9IHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORyxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkNBTExJTkcsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICBsZXQgaW52aXRlZXNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgbGV0IGJ1c3lVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgIGlmIChidXN5bGluZVVzZXJzKSB7XG4gICAgICBidXN5VXNlcnNTdGF0ZSA9IGJ1c3lsaW5lVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWVzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgLy8g6KKr6YKA6K+36ICF5Lit6ZyA6L+H5ruk5Ye65b+Z56KM55So5oi3XG4gICAgICBpbnZpdGVlc1N0YXRlID0gaW52aXRlZXNTdGF0ZS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IGJ1c3lVc2Vyc1N0YXRlIS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBbc2VsZlN0YXRlLCAuLi5pbnZpdGVlc1N0YXRlLCAuLi5idXN5VXNlcnNTdGF0ZSFdLCB0cmFjZUlkKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBjb2RlLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6YKA6K+3XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW52aXRlKG9wdHM6IElJbnZpdGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJSW52aXRlUmVzfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjpgoDor7dcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9Vc2VycyB9ID0gb3B0cztcblxuICAgIGNvbnN0IGNhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmludml0ZUNhbGwoe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9Vc2VycyxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgICAvLyDljZXlkbzkuK3pgoDor7fmiJDlip/vvIzljbPmm7TmlrAgY2FsbCBzZXNzaW9uIOmAmuivneexu+Wei+S4uue+pOWRvFxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVDYWxsVHlwZShSQ0NhbGxQbHVzVHlwZS5NVUxUSSk7XG4gICAgICAgIC8vIOmAmuefpSBjYWxsVHlwZSDlj5jmm7TkuLrnvqTlkbxcbiAgICAgICAgdGhpcy5fb25DYWxsVHlwZUNoYW5nZSh0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSwgUkNDYWxsUGx1c1R5cGUuTVVMVEksIHRyYWNlSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyDpgJrnn6XooqvpgoDor7fkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIGxldCBpbnZpdGVkVXNlcnNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcblxuICAgICAgbGV0IGJ1c3lsaW5lVXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICAgIGlmIChkYXRhIS5idXN5bGluZVVzZXJzKSB7XG4gICAgICAgIGJ1c3lsaW5lVXNlcnNTdGF0ZSA9IGRhdGEhLmJ1c3lsaW5lVXNlcnM/Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWRVc2Vyc1N0YXRlLmZpbmQoKHVzZXIpID0+IHVzZXIudXNlcklkID09PSBpdGVtLnVzZXJJZCkhO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICAgICAgdXNlclN0YXRlOiBpdGVtLnNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpbnZpdGVkVXNlcnNTdGF0ZSA9IGludml0ZWRVc2Vyc1N0YXRlLmZpbHRlcigoeyB1c2VySWQgfSkgPT4gYnVzeWxpbmVVc2Vyc1N0YXRlIS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFsuLi5pbnZpdGVkVXNlcnNTdGF0ZSwgLi4uYnVzeWxpbmVVc2Vyc1N0YXRlXSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVIYW5ndXBcbiAgICovXG4gIHB1YmxpYyBjbGVhckFsbFRpbWVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmuIXpmaTmiYDmnInotoXml7borqHml7blmahcbiAgICBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZm9yRWFjaCgoc2Vzc2lvbikgPT4ge1xuICAgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICAgIHNlc3Npb24uZ2V0QWxsVGltZXJJZHMoKS5mb3JFYWNoKCh0aW1lcklkKSA9PiB0aGlzLl9zdG9wVGltZXIuYmluZCh0aGlzKSh0aW1lcklkLCB0cmFjZUlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqIOmAmuivneivt+axguWPlua2iOOAgemAmuivneaLkue7nVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmd1cChvcHRzOiBJSGFuZ3VwRm9yQnVzeU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmhhbmd1cENhbGwoe1xuICAgICAgY2FsbElkOiBvcHRzLmNhbGxJZCxcbiAgICAgIHN5c1N0YXR1czogb3B0cy5zeXN0ZW1TdGF0ZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXmlLbpgoDor7dcbiAgICog6YCa6K+d5Lit5Y+I5pS25Yiw5paw5p2l55S15ZCO77yM5o6l5ZCs5paw5p2l55S15pe277yM5b+F6aG75YWI5oyC5pat5LmL5YmN55qE6YCa6K+d77yIbWFpblNlc3Npb27vvIlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY2NlcHQob3B0czogSUFjY2VwdE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjmjqXlkKxcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5hY2NlcHRDYWxsKHsgY2FsbElkOiBvcHRzLmNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgIC8vIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HKTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXliqDlhaVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luQ2FsbChvcHRzOiBJSm9pbkNhbGxPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5YWI5pS25YiwIG9uSW52aXRl77yM5rKh5pyJ5o6l6YCa6L+HIGpvaW5DYWxsIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuam9pbkNhbGwoeyBjYWxsSWQ6IG9wdHMuY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgb3B0cy5jYWxsSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgLy8g5aaC5p6c5LiN5a2Y5ZyoIG1haW5TZXNzaW9uIOS7jiBzZXJ2ZXIg6I635Y+W5b2T5YmN5Yqg5YWl55qEIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuX2NyZWF0ZVNlc3Npb25CeVNlcnZlcihvcHRzLmNhbGxJZCwgdHJ1ZSwgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShvcHRzLmNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+WPmOabtOivt+axglxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUob3B0czogSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSZXFDaGFuZ2VNZWRpYVR5cGVSZXN9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFLZXlWYWwgPSB7XG4gICAgICBtZWRpYVR5cGU6IG9wdHMubWVkaWFUeXBlLFxuICAgIH07XG4gICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlUmVxTWVkaWFUeXBlKG9wdHMubWVkaWFUeXBlKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbklkID0gZ2V0VVVJRDIyKCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgdG9Vc2VySWRzOiBvcHRzLnRvVXNlcklkcyxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IERpYWxvZ0FjdGlvbi5SRVFVRVNULFxuICAgICAgZXh0cmFLZXlWYWwsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCBkYXRhOiB7IHRyYW5zYWN0aW9uSWQgfSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+exu+Wei+WPmOabtOivt+axguWTjeW6lFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc3BvbnNlQ2hhbmdlTWVkaWFUeXBlKG9wdHM6IElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVxTWVkaWFUeXBlID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0UmVxTWVkaWFUeXBlKCk7XG4gICAgaWYgKG9wdHMuYWdyZWUpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZU1lZGlhVHlwZShyZXFNZWRpYVR5cGUhKTtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVJlcU1lZGlhVHlwZShudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZDogb3B0cy50cmFuc2FjdGlvbklkLFxuICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IG9wdHMuYWdyZWUgPyBEaWFsb2dBY3Rpb24uQUNDRVBUIDogRGlhbG9nQWN0aW9uLlJFRlVTRSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmtojpgJror53lqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYW5jZWxDaGFuZ2VNZWRpYVR5cGUob3B0czogSUNhbmNlbENoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBvcHRzLnRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogRGlhbG9nQWN0aW9uLkNBTkNFTCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCBsb2cg5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbExvZ0xpc3Qob3B0czogSUdldENhbGxMb2dMaXN0T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJDQ2FsbFBsdXNHZXRDYWxsUmVjb3JkUmVzfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN5bmNDYWxsTG9nKHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHN5bmNUaW1lOiBvcHRzLnRpbWVzdGFtcCxcbiAgICAgIGNvdW50OiBvcHRzLmNvdW50LFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIGNvbnN0IGNhbGxMb2c6IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdID0gZGF0YSEuY2FsbExvZ0xpc3QubWFwKChpdGVtKSA9PiB0cmFuMkNhbGxMb2coaXRlbSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGhhc01vcmU6IEJvb2xlYW4oZGF0YT8uaGFzTW9yZSksXG4gICAgICAgIG1heFRpbWU6IGRhdGEhLm1heFRpbWUsXG4gICAgICAgIGxpc3Q6IGNhbGxMb2csXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d5pel5b+XXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FsbExvZyhjYWxsSWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGVsZXRlQ2FsbFJlY29yZChjdXJyZW50VXNlcklkLCBjYWxsSWRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlLCBkYXRhOiBkYXRhIS5zeW5jVGltZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIOaXtumXtOS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxUaW1lSW5mbyhjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxUaW1lSW5mb1Jlc30+IHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE9wZW5DYWxsTGlzdCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUkNDYWxsUGx1c0NhbGxSZWNvcmRbXSB9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiByZXNEYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0VXNlckNhbGxTdGF0ZUxpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ID0gcmVzRGF0YSEuY2FsbFN0YXRlTGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2FsbElkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsaW5nVXNlcklkLCBjYWxsVXNlcklkcywgY2FsbFN0YXR1cywgY3J0VGltZSwgdXNlclNlc3Npb25TdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLCBzdGFydFRpbWUsIHN5bmNUaW1lLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICBjb25zdCBjYWxsRGlyZWN0aW9uID0gKGNhbGxpbmdVc2VySWQgPT09IGN1cnJlbnRVc2VySWQpID8gUkNDYWxsRGlyZWN0aW9uLk9VVCA6IFJDQ2FsbERpcmVjdGlvbi5JTjtcbiAgICAgIGNvbnN0IHsgY2xpZW50U3RhcnRUaW1lID0gc3RhcnRUaW1lIH0gPSB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkLCBzdGFydFRpbWUsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgY2FsbERpcmVjdGlvbixcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBjYWxsZXJVc2VySWQ6IGNhbGxpbmdVc2VySWQsXG4gICAgICAgIGNhbGxVc2VySWRzLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIHVzZXJTdGF0ZTogdXNlclNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN0YXJ0VGltZXN0YW1wOiBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWVzdGFtcDogMCxcbiAgICAgICAgZHVyYXRpb246IE1hdGguZmxvb3IoKCtuZXcgRGF0ZSgpIC0gY2xpZW50U3RhcnRUaW1lKSAvIDEwMDApLFxuICAgICAgICBzeW5jVGltZXN0YW1wOiBzeW5jVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IDAsXG4gICAgICAgIGNyZWF0ZVRpbWVzdGFtcDogY3J0VGltZSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IGxpc3QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfnmoQgY2FsbCBsb2dcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZW1vdmVBbGxDYWxsTG9nKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuY2xlYXJDYWxsUmVjb3JkKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrov4cgY2FsbElkIOiOt+WPliBzZXNzaW9uIOivpue7huS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXNzaW9uKG9wdHM6IElDYWxsSWQsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsU2Vzc2lvblJlc30+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsU2Vzc2lvbihvcHRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgY2FsbGluZ1VzZXJJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFN0YXR1cywgY2FsbFNlc3Npb25Vc2Vycywgc3RhcnRUaW1lLCBkdXJhdGlvbiwgc3luY1RpbWUsXG4gICAgfSA9IGRhdGEhO1xuICAgIGNvbnN0IHNlc3Npb25Vc2VycyA9IGNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCxcbiAgICAgIH0gPSBpdGVtO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3RhcnRDYWxsZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFR5cGUsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgc2Vzc2lvblN0YXRlOiBjYWxsU3RhdHVzLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uVXNlcnMsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHN5bmNUaW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldEhvbGRTZXNzaW9uKGNhbGxJZDogc3RyaW5nKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICBjb25zdCBpbm5lclNlc3Npb24gPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIHJldHVybiBpbm5lclNlc3Npb24gPyBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3kuLsgc2Vzc2lvblxuICAgKi9cbiAgcHVibGljIGdldExvY2FsTWFpblNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWFpblNlc3Npb24gPyBuZXcgUkNDYWxsUGx1c1Nlc3Npb24odGhpcy5fbWFpblNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruS4uyBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZU1haW5TZXNzaW9uU3RhdGUoc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlU2Vzc2lvblN0YXRlKHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmmK/mnKznq6/mjILmlq1cbiAgICovXG4gIHB1YmxpYyBzZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrnn6XkurrlkZjnirbmgIFcbiAgICogQ2FsbENsaWVudCDkuZ/pnIDopoHmm7TmlrDkurrlkZjnirbmgIHvvIzlrprkuYnkuLrlhazlhbHlh73mlbBcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZDogc3RyaW5nLCB1c2VyczogSVNlc3Npb25Vc2VyW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTywgYHVwZGF0ZVVzZXJzU3RhdGUgLT4gdXNlcnM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcnMpfWAsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pu05pawIHNlc3Npb24g5Lq65ZGY5YiX6KGoXG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChpdGVtKSA9PiBpdGVtPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcblxuICAgIGNvbnN0IGNoYW5nZWRVc2VycyA9IFtdO1xuICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICBjb25zdCBuZXdVc2VycyA9IHVzZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRVc2VyU3RhdGUgPSBzZXNzaW9uLmdldFVzZXJMaXN0KCkuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiB1c2VySWQgPT09IGl0ZW0udXNlcklkKVswXSB8fCB7fTtcbiAgICAgICAgY29uc3QgaXNJZGxlID0gaXRlbS51c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU7XG4gICAgICAgIGNvbnN0IHsgY2FtZXJhRW5hYmxlID0gZmFsc2UsIG1pY3JvcGhvbmVFbmFibGUgPSBmYWxzZSB9ID0gaXNJZGxlID8geyBjYW1lcmFFbmFibGU6IGZhbHNlLCBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSB9IDogb2xkVXNlclN0YXRlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgY2FtZXJhRW5hYmxlLFxuICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgY2hhbmdlZFVzZXJzLnB1c2goLi4uc2Vzc2lvbi51cGRhdGVVc2VyTGlzdChuZXdVc2VycywgdHJhY2VJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICAgIC8vIOmAmuefpeS6i+S7tlxuICAgIGNoYW5nZWRVc2Vycy5sZW5ndGggPiAwICYmIHRoaXMuX29uVXNlclN0YXRlQ2hhbmdlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVc2VyRGV2aWNlRW5hYmxlKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIGVuYWJsZTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWFpblNlc3Npb24/LnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsIGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFN0YXJpbmdUaW1lKG9wdHM6IElDYWxsSWQsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlcn0+IHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRDYWxsQ2xpZW50VGltZUJ5U2VydmVyKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkurrlkZjns7vnu5/nirbmgIHkuIrmiqVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeXN0ZW1TdGF0dXNVcChvcHRzOiBJU3lzU3RhdHVzVXBPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuc3lzU3RhdHVzVXAob3B0cywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG85Lit5pS25Yiw6L+c56uv5rWB5ZCO77yM57uZIENhbGxTZXJ2ZXIg5LiK5oql77yM55So5LqO5aSE55CG6K6h5pe26YC76L6RXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBGaXJzdEZyYW1lVGltZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3Qgbm9OZWVkVXBDb25kaXRpb24gPSAhdGhpcy5fbWFpblNlc3Npb25cbiAgICAgIHx8ICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsVHlwZSgpICE9PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpXG4gICAgICB8fCB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWU7XG4gICAgaWYgKG5vTmVlZFVwQ29uZGl0aW9uKSB7XG4gICAgICAvLyDkuI3lrZggbWFpblNlc3Npb24g5oiWIOmAmui/h+exu+Wei+S4jeS4uuWNleWRvOaXtu+8jOS4jeS4iuaKpe+8jOebtOaOpei/lOWbnuaIkOWKn1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlbGF5VGltZSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKTtcbiAgICBjb25zdCBzdHJlYW1SZWFkeVRpbWUgPSBNYXRoLmZsb29yKG5vdyArIGRlbGF5VGltZSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfVCwgYG5vdzogJHtub3d9OyBkZWxheTogJHtkZWxheVRpbWV9OyBzdHJlYW1SZWFkeVRpbWU6ICR7c3RyZWFtUmVhZHlUaW1lfWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5faXNVcEZpcnN0RnJhbWVUaW1lID0gdHJ1ZTtcblxuICAgIGNvbnN0IGNhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uIS5nZXRDYWxsSWQoKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5ldmVudFVwQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBldmVudFR5cGU6IENhbGxTZXJ2ZXJFdmVudFR5cGUuRklSU1RfRlJBTUUsXG4gICAgICBldmVudEFyZ3M6IHsgc3RyZWFtUmVhZHlUaW1lIH0sXG4gICAgICBldmVudFRpbWU6IERhdGUubm93KCksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOS4iuWxguaooeaLnyBzdGF0dXNEb3duQ2FsbCwg57uT5p2fIHNlc3Npb25cbiAgICog6YCa6K+d5bu656uL5ZCO77yM5Y+q6IO957uT5p2fIG1haW5TZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZW5kQ3VycmVudFNlc3Npb24oY3VycmVudFVzZXJTeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICBjb25zdCBzZXNzaW9uVXNlcnM6IElDYWxsU2Vzc2lvblVzZXJbXSA9IHRoaXMuX21haW5TZXNzaW9uLmdldFVzZXJMaXN0KCkubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdXNlcklkLCB1c2VyU3RhdGUsIHN5c3RlbVN0YXRlLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCxcbiAgICAgICAgfSA9IGl0ZW07XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IGN1cnJlbnRVc2VyU3lzdGVtU3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuRU5ERUQsXG4gICAgICAgICAgc3RhdHVzVGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICBjaGFuZ2VkOiAxLFxuICAgICAgICAgIGludml0ZVVzZXJJZDogdGhpcy5fbWFpblNlc3Npb24hLmdldFN0YXJ0Q2FsbGVySWQoKSxcbiAgICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGE6IElTdGF0dXNEb3duQ29udCA9IHtcbiAgICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgICBjYWxsU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkVOREVELFxuICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvblVzZXJzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX29uU3RhdHVzRG93bihkYXRhLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGCIFJUQyDliqDlhaXmiL/pl7TlkI7ph43mlrDlvIDlp4vmoKHml7ZcbiAgICovXG4gIHB1YmxpYyBzdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIucmVzdGFydCh0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWxheVRpbWVJbmZvKCk6IElHZXREZWxheVRpbWVJbmZvUmVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXlUaW1lOiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldExvY2FsRGVsYXlUaW1lKCksXG4gICAgICBydHQ6IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0UlRUKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBob2xkU2Vzc2lvbiDljYfnuqfkuLogbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyB1cGdyYWRlTWFpblNlc3Npb24oaG9sZENhbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZEluZGV4KChzZXNzaW9uKSA9PiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBob2xkQ2FsbElkKTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpPy5bMF07XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgLyoqXG4gICAqIElNIOeKtuaAgeWPmOabtOWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25JTVN0YXRlQ2hhbmdlKHN0YXRlOiBSQ0Nvbm5lY3Rpb25TdGF0dXMpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICBsZXQgdGltZXJJZDogbnVtYmVyID0gMDtcbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5ESVNDT05ORUNURUQpIHtcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRTZXNzaW9uU3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgICAgLy8g5pat572R562J5b6FIDYwcyDlkI7op6blj5Egb25TZXNzaW9uQ2xvc2VcbiAgICAgICAgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0lNX1NUQVRFX0NIQU5HRV9PLCAnZW5kQ3VycmVudFNlc3Npb24sIElNIGRpc2Nvbm5lY3RlZCBmb3IgbW9yZSB0aGFuIDYwcycsIHRyYWNlSWQpO1xuICAgICAgICAgIHRoaXMuZW5kQ3VycmVudFNlc3Npb24oUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUiwgdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpISwgdHJhY2VJZCk7XG4gICAgICAgIH0sIENBTExfVElNRV9PVVQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRpbWVySWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIblj5HotbfpgoDor7fjgIHmlLbliLDpgoDor7flkI7orqHml7botoXml7ZcbiAgICog5o+Q5YmN5qih5oufIF9vblN0YXR1c0Rvd24sIOS4jeWGjeS+nei1liBDYWxsU2VydmVyIOS4i+WPkeeahCBfb25TdGF0dXNEb3duXG4gICAqIOWkhOeQhue9kee7nOW8guW4uOaDheWGteS4i+S4iuaKpSBDYWxsU2VydmVyIOWksei0pe+8jENhbGxTZXJ2ZXIg5LiN5Lya5LiL5Y+RIF9vblN0YXR1c0Rvd24g5oOF5Ya1XG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVDYWxsVGltZW91dChjYWxsSWQ6IHN0cmluZywgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NBTExfVElNRU9VVF9PLCBgY2FsbCB0aW1lb3V0IGNhbGxJZDogJHtjYWxsSWR9LCB1c2VyU3RhdGU6ICR7dXNlclN0YXRlfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NBTExfVElNRU9VVF9PLCBgaGFuZGxlQ2FsbFRpbWVvdXQgd2l0aG91dCBzZXNzaW9uLCBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuXG4gICAgdGhpcy5fb25TdGF0dXNEb3duKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRvRGV2aWNlSWQ6IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRTZXNzaW9uSWQoKSxcbiAgICAgIGNhbGxTdGF0dXM6IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQsXG4gICAgICBkdXJhdGlvbjogMCxcbiAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKHVzZXIpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXRlVGltZSxcbiAgICAgICAgfSA9IHVzZXI7XG5cbiAgICAgICAgbGV0IHN5c1N0YXR1czogUkNDYWxsUGx1c1JlYXNvbjtcbiAgICAgICAgbGV0IHNlc3Npb25TdGF0dXM6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlO1xuICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgICAgc3lzU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzUmVhc29uLk1JU1NFRCA6IFJDQ2FsbFBsdXNSZWFzb24uTk9fQU5TV0VSO1xuICAgICAgICAgIHNlc3Npb25TdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzeXNTdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNSZWFzb24uTk9fQU5TV0VSIDogUkNDYWxsUGx1c1JlYXNvbi5NSVNTRUQ7XG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSIDogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUaW1lOiBzdGF0ZVRpbWUgPyBzdGF0ZVRpbWUgKyAxIDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICBjaGFuZ2VkOiAxLFxuICAgICAgICAgIGludml0ZVVzZXJJZDogc2Vzc2lvbi5nZXRDYWxsZXJJZCgpLFxuICAgICAgICAgIHN5c1N0YXR1cyxcbiAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5byA5ZCv6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9zdGFydFRpbWVyKGNhbGxJZDogc3RyaW5nLCB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgIGNvbnN0IHRpbWVySWQgPSB0aW1lclNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5faGFuZGxlQ2FsbFRpbWVvdXQoY2FsbElkLCB1c2VyU3RhdGUsIHRyYWNlSWQpO1xuICAgICAgLy8g5LiK5oqlIGNhbGwgc2VydmVyIOi2heaXtlxuICAgICAgdGhpcy5fc2lnbmFsTW9kdWxlLnN0YXR1c1VwQ2FsbCh7IGNhbGxJZCwgc2Vzc2lvblN0YXR1czogdXNlclN0YXRlIH0sIHRyYWNlSWQpO1xuICAgIH0sIENBTExfVElNRV9PVVQpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1NUQVJUX0NBTExfVElNRVJfTywgYGNhbGxJZDogJHtjYWxsSWR9LCB0aW1lcklkOiAke3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRpbWVySWQ7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9zdG9wVGltZXIodGltZXJJZDogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PLCBgdGltZXJJZDogJHt0aW1lcklkfWAsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCDpgJror53pgoDor7dcbiAgICovXG4gIHByaXZhdGUgX29uSW52aXRlKGRhdGE6IElQdWJJbnZpdGVDb24sIGlzRGlyZWN0bHk6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgaW52aXRlVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU2Vzc2lvblVzZXJzLCBzZWNyZXRDaGF0LCBjYWxsaW5nVXNlcklkLFxuICAgIH0gPSBkYXRhO1xuXG4gICAgaWYgKHNlY3JldENoYXQgPT09IFNlY3JldENhbGxUeXBlLlNFQ1JFVCkge1xuICAgICAgLy8g5aaC5p6c5piv5a+G6IGK6YCa6K+d5LiN5aSE55CGXG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLlNFQ1JFVF9DQUxMLFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c6Ieq5bex5piv6KKr6YKA6K+355qE55So5oi3XG4gICAgY29uc3QgaXNJbnZpdGVlID0gY2FsbFNlc3Npb25Vc2Vycy5zb21lKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG4gICAgaWYgKGlzSW52aXRlZSkge1xuICAgICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBjYWxsSWQpO1xuXG4gICAgICAvLyDnlJ/miJAgY2FsbFNlc3Npb25cbiAgICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5SSU5HSU5HLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBpbnZpdGVVc2VySWQsXG4gICAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgICAgW10sXG4gICAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgICk7XG4gICAgICAvLyBjYWxsIHNlcnZlciDlk43pk4PkuIrmiqVcbiAgICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5yaW5naW5nQ2FsbCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgICAgLyoqXG4gICAgICAgKiDlkK/liqjmjqXlkKzotoXml7borqHml7blmahcbiAgICAgICAqL1xuICAgICAgY29uc3QgaW52aXRlZVRpbWVySWQgPSB0aGlzLl9zdGFydFRpbWVyKGNhbGxJZCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VELCB0cmFjZUlkKTtcbiAgICAgIGlubmVyU2Vzc2lvbi51cGRhdGVUaW1lcklkKENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVFLCBpbnZpdGVlVGltZXJJZCk7XG5cbiAgICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24gPSBpbm5lclNlc3Npb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDnlJ/miJDlia8gc2Vzc2lvbnNcbiAgICAgICAgdGhpcy5faG9sZFNlc3Npb25zLnB1c2goaW5uZXJTZXNzaW9uKTtcbiAgICAgICAgLy8g5pu05paw5Li7IHNlc3Npb24g54q25oCB5Li6IEhPTERcbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQlVTWUxJTkVfV0FJVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOaKm+WHuuW3seaWueiiq+mCgOivt1xuICAgICAgY29uc3QgY2FsbFBsdXNTZXNzaW9uID0gbmV3IFJDQ2FsbFBsdXNTZXNzaW9uKGlubmVyU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKTtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsKGNhbGxQbHVzU2Vzc2lvbiwgdHJhY2VJZCk7XG5cbiAgICAgIGNvbnN0IGludml0ZVNvdXJjZSA9IGlzRGlyZWN0bHkgPyBSQ0NhbGxQbHVzSW52aXRlU291cmNlLlBVQl9JTlZJVEVfQ0FMTCA6IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UuUFVMTF9LVl9JTlZJVEVfQ0FMTDtcbiAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgY2FsbFBsdXNTZXNzaW9uLCBpbnZpdGVTb3VyY2UpO1xuXG4gICAgICBjb25zdCBvdGhlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBjYWxsU2Vzc2lvblVzZXJzLm1hcCgoe1xuICAgICAgICB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cywgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXR1c1RpbWUsXG4gICAgICB9KSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIHN0YXRlVGltZTogc3RhdHVzVGltZSxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICAvLyDmipvlh7rkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIG90aGVyc1N0YXRlLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCB7XG4gICAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVhc29uOiBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbi5OT1RfSU5WSVRFRSxcbiAgICAgICAgcmVmZXI6IGlzRGlyZWN0bHkgPyBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVQl9JTlZJVEUgOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVTExfS1ZfSU5WSVRFLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIOi/h+a7pOWHuuWFtuS7lueUqOaIt+WSjOiHquW3sVxuICAgIGNvbnN0IG90aGVySW52aXRlZE1lbWJlciA9IGNhbGxTZXNzaW9uVXNlcnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCAmJiBpdGVtLnVzZXJJZCAhPT0gaW52aXRlVXNlcklkICYmIGl0ZW0uc2Vzc2lvblN0YXR1cyA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCk7XG4gICAgLy8g5oqb5Ye6576k6IGK5Lit6KKr6YKA6K+355qE5YW25LuW5Lq6XG4gICAgaWYgKG90aGVySW52aXRlZE1lbWJlci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDpgJrnn6UgY2FsbFR5cGUg57G75Z6L5Y+Y5pu0XG4gICAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSAmJiB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgICB0aGlzLl9vbkNhbGxUeXBlQ2hhbmdlKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLCBSQ0NhbGxQbHVzVHlwZS5NVUxUSSwgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVDYWxsVHlwZShSQ0NhbGxQbHVzVHlwZS5NVUxUSSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGludml0ZWRNZW1iZXI6IElPdGhlck1lbUluZm9bXSA9IFtdO1xuICAgICAgY29uc3QgdXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICAgIG90aGVySW52aXRlZE1lbWJlci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMgfSA9IGl0ZW07XG4gICAgICAgIGludml0ZWRNZW1iZXIucHVzaCh7IGNhbGxJZCwgdXNlcklkLCB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMgfSk7XG4gICAgICAgIHVzZXJzU3RhdGUucHVzaCh7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9vbk90aGVyTWVtYmVySW52aXRlKGludml0ZWRNZW1iZXIpO1xuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgdXNlcnNTdGF0ZSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCDmjILmlq3vvIjlr7nmlrnpgJror53lj5bmtojjgIHpgJror53mi5Lnu53vvIlcbiAgICovXG4gIHByaXZhdGUgX29uSGFuZ3VwKGRhdGE6IElIYW5ndXBJbmZvW10sIGNhbGxTZXNzaW9uYVN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jYWxsSWQgPT09IHRoaXMuX21haW5TZXNzaW9uIS5nZXRDYWxsSWQoKSkge1xuICAgICAgICAgIGlmIChpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVEKSB7XG4gICAgICAgICAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOaLkuaOpeOAgeW/meeijOOAgeacquaOpeWQrCDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlclRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfb25BY2NlcHQoZGF0YTogSUFjY2VwdEluZm9bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2Vzc2lvblN0YXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFNlc3Npb25TdGF0ZSgpO1xuICAgIGNvbnN0IHVuTmVlZFVwU3RhdGUgPSBbXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQlVTWUxJTkVfV0FJVCxcbiAgICBdO1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFXG4gICAgICAmJiBzZXNzaW9uU3RhdGUgJiYgdW5OZWVkVXBTdGF0ZS5pbmNsdWRlcyhzZXNzaW9uU3RhdGUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRDYWxsZXJJZCA9IHRoaXMuX21haW5TZXNzaW9uIS5nZXRTdGFydENhbGxlcklkKCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvKipcbiAgICAgKiDljZXlkbzmlLbliLDlr7nmlrnmjqXlkKzml7bvvIzpnIDlrozmiJDlj5HluIPotYTmupDkuIDns7vliJfliqjkvZxcbiAgICAgKi9cbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSAmJiBzdGFydENhbGxlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICBjb25zdCBhY2NlcHRVc2VySW5mbyA9IGRhdGEuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmZyb21Vc2VySWQgIT09IGN1cnJlbnRVc2VySWQpO1xuICAgICAgYWNjZXB0VXNlckluZm8gJiYgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLmdldExvY2FsTWFpblNlc3Npb24oKSEuZ2V0Q2FsbElkKCksIHRyYWNlSWQpO1xuICAgIH1cbiAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIFcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyk7XG5cbiAgICAvLyDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICB0aGlzLl9zdG9wVGltZXIodGhpcy5fbWFpblNlc3Npb24hLmdldEludml0ZXJUaW1lcklkKCksIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25TdGF0dXNEb3duKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog6YCa6K+d54q25oCB5Li66L+e5o6l54q25oCB5pe277yM5L+d5a2Y5pyN5Yqh5LiL5Y+R55qE6YCa6K+d5byA5aeL5pe26Ze0XG4gICAgICovXG4gICAgY29uc3Qge1xuICAgICAgY2FsbFN0YXR1cywgc3RhcnRUaW1lLCBzeW5jVGltZSwgY2FsbElkLFxuICAgIH0gPSBkYXRhO1xuICAgIGlmIChjYWxsSWQgIT09IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdID0gdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gfHwge307XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXpgJror53lvIDlp4vorqHml7bkuovku7ZcbiAgICAgKiDmnaHku7bvvJrpgJror53nirbmgIHkuLogT05DQUxMIOS4lOacquS4iuaKpei/h+mAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZVxuICAgICAgJiYgY2FsbFN0YXR1cyA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmlzUmVjZWl2ZUNhbGxTdGFydFRpbWUgPSB0cnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBjbGllbnRTdGFydFRpbWUgfSA9IGF3YWl0IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSEsIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFN0YXJ0VGltZSh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSEsXG4gICAgICAgIH0sIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOiuoeeul+aYr+WQpumAmuivnee7k+adn1xuICAgIGxldCBzZWxmRW5kID0gZmFsc2U7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvLyDkuIrmiqXkurrlkZjnirbmgIHlj5jmm7RcbiAgICBjb25zdCBjaGFuZ2VkVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBpc0xlZnQgPSBbXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEUsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkRFQ0xJTkVELFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUixcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVELFxuICAgICAgXS5pbmNsdWRlcyhpdGVtLnNlc3Npb25TdGF0dXMpO1xuICAgICAgaWYgKGlzTGVmdCAmJiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICBzZWxmRW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBpdGVtLnNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBpdGVtLnN5c1N0YXR1cyxcbiAgICAgICAgc3RhdGVUaW1lOiBpdGVtLnN0YXR1c1RpbWUsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNoYW5nZWRVc2Vycy5sZW5ndGggPiAwICYmIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIGNoYW5nZWRVc2VycywgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDmsqHmnIkgc2Vzc2lvbiDkuI3lpITnkIbkvJror53nirbmgIHlj5jmm7RcbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uICYmICF0aGlzLl9ob2xkU2Vzc2lvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g6K6h566X5Ye65ZON5bqU5Yqo5L2c77yM5bm25oqb5Ye65L+h5oGvXG4gICAgY29uc3Qge1xuICAgICAgaGFuZ3VwRGF0YSwgYWNjZXB0RGF0YSwgb3RoZXJJbnZpdGVkRGF0YSxcbiAgICB9ID0gcGFyc2VTdGF0dXNEYXRhKGRhdGEpO1xuXG4gICAgaGFuZ3VwRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX29uSGFuZ3VwKGhhbmd1cERhdGEsIGRhdGEuY2FsbFN0YXR1cywgdHJhY2VJZCk7XG4gICAgYWNjZXB0RGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX29uQWNjZXB0KGFjY2VwdERhdGEsIHRyYWNlSWQpO1xuXG4gICAgaWYgKG90aGVySW52aXRlZERhdGEubGVuZ3RoID4gMCAmJiB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuX29uT3RoZXJNZW1iZXJJbnZpdGUob3RoZXJJbnZpdGVkRGF0YSk7XG4gICAgfVxuXG4gICAgLy8g5Y+q5pyJ5ZyoIGNhbGxTZXNzaW9uIOeKtuaAgeS4uiBFbmRlZCDml7bpgJrnn6Ugb25TZXNzaW9uQ2xvc2VcbiAgICBpZiAoZGF0YS5jYWxsU3RhdHVzID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkVOREVEIHx8IHNlbGZFbmQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbkNsb3NlKGRhdGEsIHRyYWNlSWQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDlhbbku5bnq6/nmoTnirbmgIHkuIvlj5FcbiAgICovXG4gIHByaXZhdGUgX29uT3RoZXJDbGllbnRTdGF0dXNEb3duKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjYWxsSWQsIGNhbGxTZXNzaW9uVXNlcnMsIGNhbGxTdGF0dXMgfSA9IGRhdGE7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBjYWxsU2Vzc2lvblVzZXJzLmZpbmQoKHsgdXNlcklkIH0pID0+IHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG5cbiAgICBpZiAoY3VycmVudFVzZXIgJiYgKHRoaXMuX21haW5TZXNzaW9uIHx8IHRoaXMuX2hvbGRTZXNzaW9ucy5sZW5ndGgpKSB7XG4gICAgICAvLyDmmK/lt7Hnq6/nirbmgIHlj5jmm7TkuJTlrZjlnKggc2Vzc2lvbiDlho3ljrvpgJrnn6XkurrlkZjnirbmgIHlj5jmm7Tlm57osIPvvIzkuI3lrZjlnKggc2Vzc2lvbiDkuI3pnIDopoHpgJrnn6VcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzdGF0dXNUaW1lIH0gPSBjdXJyZW50VXNlcjtcbiAgICAgIGlmIChzZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlcyA9IFtSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkddO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlpoLmnpzoh6rlt7HmnKrmjqXlkKzkuLvpgJror53vvIzmlLbliLDlpJrnq68gQ29ubmVjdGluZyDnirbmgIHvvIzpnIDmipvlh7ogc2Vzc2lvbkNsb3NlXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBpc01haW5TZXNzaW9uID0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRVc2VyU2F0ZSA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRVc2VyTGlzdCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKT8udXNlclN0YXRlO1xuICAgICAgICBjb25zdCBpc0FjY2VwdE1haW5TZXNzaW9uID0gaXNNYWluU2Vzc2lvbiAmJiBjdXJyZW50VXNlclNhdGUgJiYgc3RhdGVzLmluY2x1ZGVzKGN1cnJlbnRVc2VyU2F0ZSk7XG4gICAgICAgIGlmICghaXNBY2NlcHRNYWluU2Vzc2lvbikge1xuICAgICAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFt7XG4gICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfQUNDRVBULFxuICAgICAgICAgICAgc3RhdGVUaW1lOiBzdGF0dXNUaW1lLFxuICAgICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIH1dLCB0cmFjZUlkKTtcblxuICAgICAgICAgIHRoaXMuc2Vzc2lvbkNsb3NlKGRhdGEsIHRyYWNlSWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDkuovku7bkuIvlj5FcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX29uRXZlbnREb3duKGRhdGE6IElFdmVudERvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIGV2ZW50VGltZSwgZXZlbnRBcmdzLCBldmVudFR5cGUsIGZyb21Vc2VySWQsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gQ2FsbFNlcnZlckV2ZW50VHlwZS5DQUxMX0RVUkFUSU9OICYmIGNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICBjb25zdCB7IGZpcnN0RnJhbWVUaW1lIH0gPSBldmVudEFyZ3MgYXMgeyBmaXJzdEZyYW1lVGltZTogbnVtYmVyIH07XG4gICAgICAvLyDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lOiBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gYXdhaXQgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgZmlyc3RGcmFtZVRpbWUsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfRklSU1RfRlJBTUVfVElNRV9PLCBgY2xpZW50Rmlyc3RGcmFtZVRpbWU6ICR7Y2xpZW50Rmlyc3RGcmFtZVRpbWV9YCwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrnn6XljZXlkbwgZHVyYXRpb24g5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZTaW5DYWxsRHVyYXRpb24oY2FsbElkOiBzdHJpbmcsIGNsaWVudFN0YXJ0VGltZTogbnVtYmVyLCBjbGllbnRGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHsgY2FsbElkLCAuLi57IGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSB9IH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOWqkuS9k+WPmOabtOebuOWFs+S6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Td2l0Y2hNZWRpYVR5cGUoZGF0YTogSURpYWxvZ0Rvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIGFjdGlvbiwgZXh0cmFLZXlWYWwsIHRyYW5zYWN0aW9uSWQsIHByb21vdGVySWQsXG4gICAgfSA9IGRhdGE7XG4gICAgY29uc3QgeyBtZWRpYVR5cGUsIHJlYXNvbiB9ID0gZXh0cmFLZXlWYWw7XG5cbiAgICBjb25zdCBjdXJyZW50Q2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpO1xuICAgIGlmIChjYWxsSWQgIT09IGN1cnJlbnRDYWxsSWQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgYG5vdCBjdXJyZW50IHNlc3Npb24gY2FsbElkOiAke2N1cnJlbnRDYWxsSWR9LCByZWN2Q2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB0cmFuc2FjdGlvbklkOiBvbGRUcmFuc0lkLCBhY3Rpb246IG9sZEFjdGlvbiwgbWVkaWFUeXBlOiBPbGRNZWRpYVR5cGUgfSA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRPbGREaWFsb2dEYXRhKCkgfHwge307XG4gICAgaWYgKG9sZFRyYW5zSWQgPT09IHRyYW5zYWN0aW9uSWQgJiYgb2xkQWN0aW9uID09PSBhY3Rpb24gJiYgT2xkTWVkaWFUeXBlID09PSBtZWRpYVR5cGUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgJ2R1cGxpY2F0ZSBkaWFsb2cgZGF0YScsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgYGFjdGlvbjogJHthY3Rpb259LCByZWFzb246ICR7cmVhc29ufWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbWFpblNlc3Npb24/LnNldE9sZERpYWxvZ0RhdGEoeyB0cmFuc2FjdGlvbklkLCBhY3Rpb24sIG1lZGlhVHlwZSB9KTtcblxuICAgIC8vIOWNh+e6p+a1geeoi+WkhOeQhlxuICAgIGlmIChhY3Rpb24gPT09IERpYWxvZ0FjdGlvbi5SRVFVRVNUKSB7XG4gICAgICB0aGlzLl9vblJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5DQU5DRUw6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLkFDQ0VQVDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlNFUlZFUl9BTExPV19NRURJQV9UWVBFO1xuICAgICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVNZWRpYVR5cGUodGhpcy5fbWFpblNlc3Npb24hLmdldFJlcU1lZGlhVHlwZSgpISk7XG4gICAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZVJlcU1lZGlhVHlwZShudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uUkVGVVNFOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5USU1FT1VUOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuQ0hBTkdFX01FRElBX1RZUEVfVElNRU9VVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdFtjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgYXMgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdF1cbiAgICAgICYmIHRoaXMuX3JlY2VpdmVNZWRpYVR5cGVDaGFuZ2VSZXN1bHQoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgYXMgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgLy8g6ZmN57qn6YCa55+l5aSE55CGXG4gICAgaWYgKGFjdGlvbiA9PT0gRGlhbG9nQWN0aW9uLk5PVElDRSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgIXJlYXNvbikge1xuICAgICAgdGhpcy5fcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEUsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgY2FsbCBsb2cg5pel5b+XXG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZDYWxsRW5kTG9nKGRhdGE6IElQdWJDYWxsTG9nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYWxsTG9nID0gdHJhbjJDYWxsTG9nKGRhdGEpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsUmVjb3JkKGNhbGxMb2csIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn1xuICAgKi9cbiAgcHVibGljIHNlc3Npb25DbG9zZShkYXRhOiB7IGNhbGxJZDogc3RyaW5nLCB0b0RldmljZUlkOiBzdHJpbmd9LCB0cmFjZUlkOiBzdHJpbmcsIGlzU2VsZkhhbmd1cDogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBkYXRhO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuXG4gICAgLy8g5q2j5bi457uT5p2f77yM5riF6Zmk5pys5Zyw5a2Y5YKo55qEIGNhbGxJZFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLnJlbW92ZUFibm9ybWFsQ2FsbElkcyhjdXJyZW50VXNlcklkLCBbY2FsbElkXSk7XG5cbiAgICBsZXQgY2xvc2VkU2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKCFjbG9zZWRTZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08sIGB1bmV4cGVjdCBzZXNzaW9uIGNhbGxJZCAtPiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08sIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgLy8gc2Vzc2lvbiBjbG9zZSDlkI7nu5PmnZ/miYDmnInotoXml7borqHml7blmahcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24gJiYgdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24uZ2V0QWxsVGltZXJJZHMoKS5mb3JFYWNoKCh0aW1lcklkKSA9PiB0aGlzLl9zdG9wVGltZXIuYmluZCh0aGlzKSh0aW1lcklkLCB0cmFjZUlkKSk7XG4gICAgICAvLyDnu5PmnZ8g5LiK5oql56ys5LiA5binXG4gICAgICBpZiAoY2xvc2VkU2Vzc2lvbi5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgICAgdGhpcy5faXNVcEZpcnN0RnJhbWVUaW1lID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5rS+5Y+R6YCa6K+d57uT5p2f77yM5aSE55CG6YCa6K+d57uT5p2f5ZCOIFJUQyDpgIDmiL/pl7TnrYnpgLvovpFcbiAgICAgKi9cbiAgICB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fLCBjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5LiK5oql6YCa6K+d57uT5p2fXG4gICAgICog5aSa56uv5YW25LuW56uv5oyC5pat6YCa6K+d77yM6ZyA5oqK5pys56uv5Lq65ZGY57O757uf54q25oCB6L2s5YyW5Li6IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0hBTkdVUFxuICAgICAqL1xuICAgIGNvbnN0IGNydFVzZXJEYXRhID0gY2xvc2VkU2Vzc2lvbi5nZXRVc2VyTGlzdCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcbiAgICBsZXQgaGFuZ3VwUmVhc29uO1xuICAgIGlmIChpc1NlbGZIYW5ndXAgJiYgZGF0YS50b0RldmljZUlkICE9PSB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0U2Vzc2lvbklkKCkpIHtcbiAgICAgIGhhbmd1cFJlYXNvbiA9IGNsb3NlZFNlc3Npb24uZ2V0SXNMb2NhbENsaWVudEhhbmd1cCgpID8gY3J0VXNlckRhdGEhLnN5c3RlbVN0YXRlIDogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSEFOR1VQO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbEVuZGVkKG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihjbG9zZWRTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpLCBoYW5ndXBSZWFzb24gfHwgY3J0VXNlckRhdGEhLnN5c3RlbVN0YXRlLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX3JlbW92ZVNlc3Npb24oY2FsbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOenu+mZpCBzZXNzaW9uXG4gICAqL1xuICBwcml2YXRlIF9yZW1vdmVTZXNzaW9uKGNhbGxJZDogc3RyaW5nKSB7XG4gICAgaWYgKGNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faG9sZFNlc3Npb25zLmZpbmRJbmRleCgoc2Vzc2lvbikgPT4gc2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgICB0aGlzLl9ob2xkU2Vzc2lvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5LiN5a2Y5ZyoIG1haW5TZXNzaW9uIOaXtu+8jOS7juacjeWKoeerr+iOt+WPluaVsOaNrueUn+aIkCBtYWluU2Vzc2lvbiwg5bm26YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVTZXNzaW9uQnlTZXJ2ZXIoY2FsbElkOiBzdHJpbmcsIGlzTmVlZFVwOmJvb2xlYW4gPSBmYWxzZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuZ2V0Q2FsbFNlc3Npb24oeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IsIGBlcnJjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9SLCBgY29kZTogJHtjb2RlfSwgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxTZXNzaW9uVXNlcnMsIHN0YXJ0Q2FsbGVySWQsXG4gICAgfSA9IGRhdGEhO1xuXG4gICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICBjYWxsSWQsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHN0YXJ0Q2FsbGVySWQsXG4gICAgICBzdGFydENhbGxlcklkLFxuICAgICAgW10sXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgKTtcbiAgICBpZiAoaXNOZWVkVXApIHtcbiAgICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cbiAgICAvLyDkurrlkZjnirbmgIHlj5jmm7TpgJrnn6VcbiAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBjYWxsU2Vzc2lvblVzZXJzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhbzlrrnnp7vliqjnq68gb25QaG9uZSDml6Dms5XmtojpmaTpl67pophcbiAgICogQTEg56e75Yqo56uv5ZKMIEIg5q2j5ZyoIGNhbGwg5Lit77yM5LiUIG9uUGhvbmUg54q25oCB77yMIEExIOadgOi/m+eoi+WQju+8jEIg56uv5bGV56S655qEIG9uUGhvbmUg54q25oCB5peg5rOV5raI5aSxXG4gICAqIEEyIOWkmuerr+WcqOaOpeWQrOWSjOebtOaOpeWKoOWFpSBjYWxsIOaXtu+8jOS4iuaKpSBvblBob25lRW5kIOeKtuaAge+8jOa2iOmZpCBCIOerr+WxleekuueahCBvblBob25lIOeKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY2xlYXJNb2JpbGVPblBob25lKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuc3lzdGVtU3RhdHVzVXAoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHN5c1N0YXR1czogUkNDYWxsUGx1c1JlYXNvbi5PTl9QSE9ORV9FTkQsXG4gICAgICAgIGZvcndhcmQ6IEZvcndhcmRUeXBlLkNVUlJFTlQsXG4gICAgICB9LCB0cmFjZUlkKTtcblxuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SLCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfUiwgYGNhbGxJZDogJHtjYWxsSWR9LCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g5Y6fIGNsaWVudCDkuK3lrprkuYnnmoTkuovku7ZcbiAgcHJpdmF0ZSBfb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHVzZXJTdGF0ZSwgc3lzdGVtU3RhdGUgfSA9IHVzZXI7XG4gICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGUsXG4gICAgICAgIHJlYXNvbjogc3lzdGVtU3RhdGUsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIOaUtuWIsOiHquW3sSBzeXN0ZW1TdGF0ZSDkuLogOTk577yM55u05o6l56a75byA5oi/6Ze0XG4gICAgICog5aSE55CG6KKr5Y+r5o6l5ZCs55qE556s6Ze077yM5Li75Y+r5ZCM5pe25oyC5pat55qE5oOF5Ya177yM5LiN5o6J56a75byA5oi/6Ze06YCa6K+d5LiN5Lya57uT5p2fXG4gICAgICovXG4gICAgdXNlcnMuZm9yRWFjaCgoeyB1c2VySWQsIHN5c3RlbVN0YXRlIH0pID0+IHtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgJiYgc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQUJOT1JNQUxfRU5EKSB7XG4gICAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NMT1NFX18sIGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbk90aGVyTWVtYmVySW52aXRlKGluZm86IElPdGhlck1lbUluZm9bXSkge1xuICAgIGluZm8uZm9yRWFjaCgoaW5mbykgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGNvbnN0IGludml0ZXJVc2VySWQgPSB0aGlzLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0SW52aXRlclVzZXJJZCgpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVVc2VySW52aXRlZChbdXNlcklkXSwgaW52aXRlclVzZXJJZCEsIGNhbGxJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoaW5mbzogSUNoYW5nZU1lZGlhVHlwZUluZm8sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUgfSA9IGluZm87XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlcXVlc3QodXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdChpbmZvOiBJQ2hhbmdlTWVkaWFUeXBlSW5mbywgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEUpIHtcbiAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCBpbmZvLm1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoe1xuICAgICAgLi4uaW5mbyxcbiAgICAgIGNvZGUsXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNhbGxUeXBlQ2hhbmdlKGNhbGxJZDogc3RyaW5nLCBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlLCBjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSVENSZXNvdXJjZVRhZyB7XG4gIC8qKlxuICAgKiDmma7pgJrpn7Pop4bpopHmtYFcbiAgICovXG4gIE5PUk1BTCA9ICdSb25nQ2xvdWRSVEMnLFxuICAvKipcbiAgICog5bGP5bmV5YiG5Lqr5rWBXG4gICAqL1xuICBTQ1JFRU4gPSAnU2NyZWVuU2hhcmUnXG59XG4iLCJpbXBvcnQge1xuICBQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgUlRDTW9kZSwgQmFzaWNMb2dnZXIsIEV2ZW50RW1pdHRlciwgaXNCb29sZWFuLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ1JUQ1Jvb20sXG4gIFJDUlRDQ2xpZW50LFxuICBSQ1JUQ0NvZGUsXG4gIFJDTG9jYWxUcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNMb2NhbEF1ZGlvVHJhY2ssXG4gIElTdWJzY3JpYmVBdHRyLFxuICBSQ1JlbW90ZVZpZGVvVHJhY2ssXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNLaWNrUmVhc29uLFxuICBSQ1RyYWNrLFxuICBSQ0xvY2FsVmlkZW9UcmFjayxcbiAgSVB1Ymxpc2hBdHRycyxcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIGhlbHBlcixcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElBdWRpb0NvbmZpZyxcbiAgSUNhbGxQbHVzSW5pdE9wdHMsXG4gIElTdGF0dXNSZXBvcnRMaXN0ZW5lcixcbiAgSVZpZGVvQ29uZmlnLFxuICBSQ0NhbGxQbHVzQ29kZSxcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1BhY2tldExvc3NTdGF0cyxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUlRDUmVzb3VyY2VUYWcgfSBmcm9tICcuLi9lbnVtcy9SVENSZXNvdXJjZVRhZyc7XG5pbXBvcnQgeyByZXRyeUFzeW5jRm4gfSBmcm9tICcuLi91dGlscy9yZXRyeSc7XG5pbXBvcnQgeyBDYWxsSG9va3NUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbEhvb2tzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c1JlYXNvbic7XG5pbXBvcnQgeyBSQ0NhbGxLaWNrRXh0cmEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSVENNb2R1bGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IElNZWRpYU11dGVDaGFuZ2VJbmZvLCBJTWVtYmVySW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4vUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSc7XG5pbXBvcnQgeyBnZXRVc2VyVmlkZW9WaWV3SW5mbyB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5cbmludGVyZmFjZSBJSm9pblJUQ1Jvb21SZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIHJvb20/OiBSQ1JUQ1Jvb20gfCB1bmRlZmluZWQ7XG4gIHVzZXJJZHM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyYWNrcz86IFJDUmVtb3RlVHJhY2tbXSB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElTdWJSZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIGZhaWxlZExpc3Q/OiAoSVN1YnNjcmliZUF0dHIpW10gfCB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBJUHViUmVzIHtcbiAgY29kZTogUkNSVENDb2RlO1xuICBsaXZlVXJsPzogc3RyaW5nIHwgdW5kZWZpbmVkXG59XG5cbmludGVyZmFjZSBSQ0tpY2tFeHRyYSB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIFJUQ01vZHVsZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBfX0lOTkVSX1JUQ19QUk9DRVNTX0ZBSUxFRF9fOiBzdHJpbmcgPSAnaW5uZXItcnRjLXByb2Nlc3MtZmFpbGVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1JUQ19QRUVSQ09OTkVDVElPTl9BQk5PUk1BTF9DTE9TRV9fOiBzdHJpbmcgPSAnaW5uZXItcnRjLXBlZXJjb25uZWN0aW9uLWFibm9ybWFsLWNsb3NlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX1NFTEZfSk9JTkVEX186IHN0cmluZyA9ICdpbm5lci1vbi1zZWxmLWpvaW5lZCdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXzogc3RyaW5nID0gJ2lubmVyLW9uLW90aGVyLWpvaW5lZCdcblxuICBzdGF0aWMgX19JTk5FUl9SRUNFSVZFX0ZJUlNUX0ZSQU1FX186IHN0cmluZyA9ICdpbm5lci1yZWNlaXZlLWZpcnN0LWZyYW1lJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX0tJQ0tPRkZfXzogc3RyaW5nID0gJ2lubmVyLWtpY2tvZmYtZnJhbWUnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXzogc3RyaW5nID0gJ2lubmVyLW9uLWRldmljZS1lbmFibGUtY2hhbmdlJ1xuXG4gIC8qKlxuICAgKiBSQ1JUQyDlrp7kvotcbiAgICovXG4gIHB1YmxpYyBfcnRjQ2xpZW50OiBSQ1JUQ0NsaWVudFxuXG4gIC8qKlxuICAgKiDlt7HmlrnnmoTpn7Pop4bpopEgdHJhY2tzXG4gICAqL1xuICBwcml2YXRlIF9sb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXVxuXG4gIC8qKlxuICAgKiBSQ1JUQ1Jvb20g5a6e5L6LXG4gICAqL1xuICBwdWJsaWMgX3Jvb206IFJDUlRDUm9vbSB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbElkOiBzdHJpbmcgPSAnJ1xuXG4gIHByaXZhdGUgX2NhbGxNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlXG5cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWc6IElWaWRlb0NvbmZpZyA9IHtcbiAgICByZXNvbHV0aW9uOiBSQ0NhbGxQbHVzUmVzb2x1dGlvbi5XNjQwX0g0ODAsXG4gICAgZnJhbWVSYXRlOiBSQ0NhbGxQbHVzRnJhbWVSYXRlLkZQU18xNSxcbiAgfVxuXG4gIHByaXZhdGUgX2F1ZGlvQ29uZmlnOiBJQXVkaW9Db25maWcgPSB7fVxuXG4gIHByaXZhdGUgX2lzUHViVGlueTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOinhumikemFjee9ruaYr+WQpuWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWdJc0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOmfs+mikemFjee9ruaYr+WQpuWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWdJc0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOWtmOWCqOiuvue9rueahOS6uuWRmOWSjOinhuWbvlxuICAgKi9cbiAgcHJpdmF0ZSBfdXNlclZpZXdNYXA6IHsgW3VzZXJJZDogc3RyaW5nXTogeyB2aWRlb1ZpZXc6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueTogYm9vbGVhbiB9IH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfcmVtb3RlQXVkaW9FbmFibGU6IGJvb2xlYW4gPSB0cnVlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcnRjQ2xpZW50ID0gX2luaXRPcHRzPy5ydGNDbGllbnQ7XG4gICAgdGhpcy5faXNQdWJUaW55ID0gX2luaXRPcHRzLmlzUHViVGlueSB8fCBmYWxzZTtcbiAgfVxuXG4gIHNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmkYTlg4/lpLTotYTmupBcbiAgICog5YaF5a2Y5Lit5pyJ5pe277yM6L+U5Zue5YaF5a2Y5Lit55qE6KeG6L2oXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IGRlZmF1bHRWaWRlb1RyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSAoZGVmYXVsdFZpZGVvVHJhY2sgJiYgIXRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UpID8geyB0cmFjazogZGVmYXVsdFZpZGVvVHJhY2ssIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfSA6IGF3YWl0IHRoaXMuX2NyZWF0ZVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSA9IGZhbHNlO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bpuqblhYvpo47otYTmupBcbiAgICog5YaF5a2Y5Lit5pyJ5pe277yM6L+U5Zue5YaF5a2Y5Lit55qE6Z+z6L2oXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCBkZWZhdWx0QXVkaW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gKGRlZmF1bHRBdWRpb1RyYWNrICYmICF0aGlzLl9hdWRpb0NvbmZpZ0lzQ2hhbmdlKSA/IHsgdHJhY2s6IGRlZmF1bHRBdWRpb1RyYWNrLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH0gOiBhd2FpdCB0aGlzLl9jcmVhdGVBdWRpb1RyYWNrKHRyYWNlSWQpO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UgPSBmYWxzZTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7pgJror53nsbvlnovliJvlu7rpn7PjgIHop4bpopHotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDpn7PpopHmiJbpn7Pop4bpopFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fY2FsbE1lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgc2V0VmlkZW9Db25maWcodmlkZW9Db25maWc6IElWaWRlb0NvbmZpZykge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnID0gdmlkZW9Db25maWc7XG4gIH1cblxuICBwdWJsaWMgc2V0QXVkaW9Db25maWcoYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZykge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnID0gYXVkaW9Db25maWc7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTywgJycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9ULCBgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghaXNCb29sZWFuKGVuYWJsZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiwgYHBhcmFtIGVycm9yLCBlbmFibGU6IHR5cGUgaXMgYm9vbGVhbiwgdmFsdWU6ICR7ZW5hYmxlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IGVuYWJsZTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGF1ZGlvVHJhY2tzID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2tzKCkuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNBdWRpb1RyYWNrKCkpO1xuICAgIGF1ZGlvVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBpZiAoZW5hYmxlKSB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3lUcmFjayh0cmFjazogUkNMb2NhbFRyYWNrKSB7XG4gICAgdHJhY2suZGVzdHJveSgpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbG9jYWxUcmFja3MuZmluZEluZGV4KChsb2NhbFRyYWNrKSA9PiBsb2NhbFRyYWNrLmdldFRyYWNrSWQoKSA9PT0gdHJhY2suZ2V0VHJhY2tJZCgpKTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlc3Npb24g6L+e5o6lXG4gICAqL1xuICBhc3luYyBzZXNzaW9uQ29ubmVjdGVkKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgLy8gMS4g5Yqg5oi/6Ze0XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHJvb20gfSA9IGF3YWl0IHRoaXMuam9pblJUQ1Jvb20oY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBlcnJDb2RlIC0+ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5rOo5YaMIFJUQyDnm7jlhbPnm5HlkKxcbiAgICAgICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgICAgICB0aGlzLl9yZWdSVENMaXN0ZW5lcnMoKTtcblxuICAgICAgICB0aGlzLl9yb29tID0gcm9vbSE7XG4gICAgICAgIGNvbnN0IHJvb21Vc2Vyc0lkID0gdGhpcy5fcm9vbT8uZ2V0UmVtb3RlVXNlcklkcygpIHx8IFtdO1xuICAgICAgICBpZiAocm9vbVVzZXJzSWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX29uT3RoZXJNZW1Kb2luZWQocm9vbVVzZXJzSWQubWFwKCh1c2VySWQpID0+ICh7IGNhbGxJZCwgdXNlcklkIH0pKSwgdHJhY2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9SLCBgY2FsbElkIC0+ICR7Y2FsbElkfSwgZXJyIG1zZyAtPiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyLiDlj5HluIPmtYFcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25CZWZvcmVQdWJsaXNoKTtcbiAgICAgICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55XG4gICAgICAgICAgPyB0aGlzLl9sb2NhbFRyYWNrcy5tYXAoKHRyYWNrKSA9PiAodHJhY2suaXNWaWRlb1RyYWNrKCkgPyB7IHRyYWNrLCBpc1B1YlRpbnk6IHRydWUgfSA6IHRyYWNrKSlcbiAgICAgICAgICA6IHRoaXMuX2xvY2FsVHJhY2tzO1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMucHVibGlzaChwdWJQYXJhbXMsIHRyYWNlSWQpO1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ymxpc2hSZXMsIGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1AsICdzZXNzaW9uQ29ubmVjdGVkIGxvY2FsIHRyYWNrcyBpcyBlbXB0eScsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBwdWJsaXNoIEV4Y2VwdGlvbiBjYWxsSWQgLT4gJHtjYWxsSWR9LCBlcnIgbXNnIC0+ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgc2Vzc2lvbkNsb3NlKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog6ZSA5q+B5pys56uv6LWE5rqQXG4gICAgICovXG4gICAgdGhpcy5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuXG4gICAgY29uc3QgY3VycmVudFJvb21JZCA9IHRoaXMuX3Jvb20/LmdldFJvb21JZCgpO1xuICAgIGlmICh0aGlzLl9yb29tICYmIGNhbGxJZCA9PT0gY3VycmVudFJvb21JZCkge1xuICAgICAgLy8g6YCA5Ye65oi/6Ze0XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20odGhpcy5fcm9vbSk7XG4gICAgICAvLyDms6jplIDlhoXlrZjmlbDmja5cbiAgICAgIHRoaXMuX3JlbGVhc2VTdG9yZWREYXRhKCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfUiwgYGxlYXZlUm9vbSBmYWlsZWQsIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCAnbGVhdmVSb29tIHN1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCAnbGVhdmVSb29tIHRocm93IGV4Y2VwdGlvbjogbm90IGluIHJvb20nLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog56aB55So6KeG6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBkaXNhYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuQ0FNRVJBX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOinhumikVxuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjay5tdXRlKCk7XG5cbiAgICByZXR1cm4geyBjb2RlLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOinhumikXRyYWNrXG4gICAqIDEuIOWQr+eUqOWJjeW6lOeUqOWxgumcgOWFiOWIm+W7uuinhumikSB0cmFja1xuICAgKi9cbiAgYXN5bmMgZW5hYmxlVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlfT4ge1xuICAgIC8vIOiOt+WPluacrOerr+inhumikSB0cmFja1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQU1FUkFfQ0xPU0VEIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5aaC5p6c6LWE5rqQ5rKh6KKr56aB55So77yM6L+U5Zue5oiQ5YqfXG4gICAgICovXG4gICAgaWYgKCF0cmFjayEuaXNPd25lck11dGVkKCkpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2shLnVubXV0ZSgpO1xuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3liIfmjaLop4bpopHorr7lpIdcbiAgICovXG4gIGFzeW5jIGNoYW5nZVZpZGVvRGV2aWNlKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrIH0+IHtcbiAgICAvLyDmlrDorr7lpIfnmoTovahcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgLy8g5pW055CG5ZCO55qE6L2oXG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX3ZpZGVvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICBsZXQgbmVlZERlc3Ryb3lUcmFjazogUkNMb2NhbFRyYWNrO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzICYmIHRoaXMuX2xvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g6LWE5rqQ6YeK5pS+XG4gICAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICAgICAgbmVlZERlc3Ryb3lUcmFjayA9IHRyYWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDku47mnKzlnLDnvJPlrZjkuK3liKDpmaTplIDmr4HnmoQgdHJhY2tcbiAgICB0aGlzLl9sb2NhbFRyYWNrcyA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigoaXRlbSkgPT4gbmVlZERlc3Ryb3lUcmFjayAmJiAoaXRlbS5nZXRUcmFja0lkKCkgIT09IG5lZWREZXN0cm95VHJhY2suZ2V0VHJhY2tJZCgpKSk7XG5cbiAgICByZWNlbnRUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgLy8g57uZ5pys5Zyw5Yqg5LiK5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgdGhpcy5fbG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOmAmuefpeS4iuWxgiB0cmFja1JlYWR5XG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkocmVjZW50VHJhY2tzLCB0cmFjZUlkKTtcblxuICAgIC8vIOW3suWKoOWFpeaIv+mXtFxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6Z+z6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBkaXNhYmxlQXVkaW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUlDUk9QSE9ORV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvLyDnpoHnlKjpn7PpopFcbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2subXV0ZSgpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovljYfjgIHpmY1cbiAgICovXG4gIGFzeW5jIGNoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QsIGBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgIC8qKlxuICAgICAqIOWNh+e6pyDpn7PpopEgLT4g6Z+z6KeG6aKRXG4gICAgICogMS4g5Lia5Yqh5bGC6ZyA6KaB5YWI6YCa6L+HIGNyZWF0ZUxvY2FsVHJhY2tzIOWIm+W7uuacrOWcsOinhumikSB0cmFja1xuICAgICAqIDIuIFNESyDlj6rlpITnkIblj5HluIPop4bpopEgdHJhY2tcbiAgICAgKi9cbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICAvLyAxLiDojrflj5bnvJPlrZjkuK3nmoTop4bpopEgdHJhY2tcbiAgICAgIGxldCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2s6IG5ld1RyYWNrIH0gPSBhd2FpdCB0aGlzLl9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgY3JlYXRlIHZpZGVvIHRyYWNrIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2sgPSBuZXdUcmFjaztcbiAgICAgICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl92aWRlb0NvbmZpZztcbiAgICAgICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcbiAgICAgIH1cbiAgICAgIC8vIDIuIOWPkeW4g+a1gVxuICAgICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55ID8geyB0cmFjazogdHJhY2shLCBpc1B1YlRpbnk6IHRydWUgfSA6IHRyYWNrITtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5wdWJsaXNoKFtwdWJQYXJhbXNdLCB0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcHVibGlzaCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpmY3nuqcg6Z+z6KeG6aKRIC0+IOmfs+mikVxuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIC8vIDEuIOiOt+WPluacrOWcsOinhumikSB0cmFja1xuICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuXG4gICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbSEudW5wdWJsaXNoKFt0cmFja10pO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHVucHVibGlzaCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDph4rmlL7op4bpopEgdHJhY2tcbiAgICAgICAgdGhpcy5kZXN0cm95VHJhY2sodHJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWKoOWFpSBSVEMg5oi/6Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgam9pblJUQ1Jvb20oY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHJvb20/OiBSQ1JUQ1Jvb20sIHRyYWNrcz86IFJDUmVtb3RlVHJhY2tbXSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9ULCBgY2FsbDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlLCByb29tLCB0cmFja3MgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SUpvaW5SVENSb29tUmVzPih7XG4gICAgICBhc3luY0ZuOiB0aGlzLl9ydGNDbGllbnQuam9pblJUQ1Jvb20uYmluZCh0aGlzLl9ydGNDbGllbnQpLFxuICAgICAgZm5BcmdzOiBbY2FsbElkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UsIFJUQ01vZGUuQ0FMTF0sXG4gICAgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9SLCBgY2FsbElkOiAke2NhbGxJZH0sIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX29uUlRDTWV0aG9kRmFpbChSQ0NhbGxQbHVzUmVhc29uLkpPSU5fUk9PTV9FUlIsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yb29tID0gcm9vbSE7XG4gICAgdGhpcy5fb25TZWxmSm9pbmVkKHsgY2FsbElkLCB1c2VySWQ6IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgfSwgdHJhY2VJZCk7XG4gICAgdHJhY2tzPy5sZW5ndGggJiYgdGhpcy5fb25SZW1vdGVUcmFja1B1Ymxpc2godHJhY2tzKTtcblxuICAgIHRoaXMuX2NhbGxJZCA9IGNhbGxJZDtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCByb29tLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMg6K6i6ZiFXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3Vic2NyaWJlVHJhY2tzKHRyYWNrczogKElTdWJzY3JpYmVBdHRyKVtdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcGFyYW1zOiB0cmFja3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHJhY2ssIHN1YlRpbnkgfSA9IGl0ZW07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJhY2tJZDogdHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIHN1YlRpbnksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SVN1YlJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcm9vbSEuc3Vic2NyaWJlLmJpbmQodGhpcy5fcm9vbSksXG4gICAgICBmbkFyZ3M6IFt0cmFja3NdLFxuICAgICAgb25FcnJvcjogKGNvZGUpID0+IHt9LFxuICAgIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25GZXRjaFJlbW90ZU1lZGlhRXJyb3IodHJhY2tzLCBjb2RlKTtcblxuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uU1VCU0NSSUJFX0VSUiwgdHJhY2VJZCk7XG5cbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfUiwgYGVycm9yQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMg5Y+W5raI6K6i6ZiFXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5zdWJzY3JpYmVUcmFja3ModHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20hLnVuc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfUiwgYGVycm9yQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVsZWFzZVN0b3JlZERhdGEoKSB7XG4gICAgdGhpcy5fcm9vbSA9IG51bGw7XG4gICAgdGhpcy5fcmVtb3RlQXVkaW9FbmFibGUgPSB0cnVlO1xuICAgIHRoaXMuX3VzZXJWaWV3TWFwID0ge307XG4gIH1cblxuICBnZXRSZW1vdGVUcmFja3MoKTogeyBbdXNlcklkOiBzdHJpbmddOiBSQ1JlbW90ZVRyYWNrW119IHtcbiAgICBjb25zdCB0cmFja3M6IHsgW3VzZXJJZDogc3RyaW5nXTogUkNSZW1vdGVUcmFja1tdfSA9IHt9O1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHRyYWNrcztcbiAgICB9XG5cbiAgICBjb25zdCB1c2VySWRzID0gdGhpcy5fcm9vbS5nZXRSZW1vdGVVc2VySWRzKCk7XG4gICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQ6IHN0cmluZykgPT4ge1xuICAgICAgdHJhY2tzW3VzZXJJZF0gPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCh1c2VySWQpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFja3M7XG4gIH1cblxuICBnZXRSZW1vdGVUcmFjayh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb20/LmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKHVzZXJJZCkuZmluZCgodHJhY2spID0+ICgobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPKSA/IHRyYWNrLmlzQXVkaW9UcmFjaygpIDogdHJhY2suaXNWaWRlb1RyYWNrKCkpKTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgLyoqXG4gICAqIFJUQyDkuovku7bnm5HlkKzms6jlhoxcbiAgICovXG4gIHByaXZhdGUgX3JlZ1JUQ0xpc3RlbmVycygpIHtcbiAgICAvLyDms6jlhozmiL/pl7Tkuovku7bnm5HlkKxcbiAgICB0aGlzLl9yb29tIS5yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKHtcbiAgICAgIC8qKlxuICAgICAgICog5pys56uv6KKr6Lii5Ye65oi/6Ze05pe26Kem5Y+RXG4gICAgICAgKiBAZGVzY3JpcHRpb24g6KKr6Lii5Ye65oi/6Ze05Y+v6IO95piv55Sx5LqO5pyN5Yqh56uv6LaF5Ye65LiA5a6a5pe26Ze05pyq6IO95pS25YiwIHJ0Y1Bpbmcg5raI5oGv77yM5omA5Lul6K6k5Li65bex5pa556a757q/44CCXG4gICAgICAgKiDlj6bkuIDnp43lj6/og73mmK/lt7HmlrkgcnRjUGluZyDlpLHotKXmrKHmlbDotoXlh7rkuIrpmZDvvIzmlYXogIzkuLvliqjmlq3nur9cbiAgICAgICAqIEBwYXJhbSBieVNlcnZlclxuICAgICAgICog5b2T5YC85Li6IGZhbHNlIOaXtu+8jOivtOaYjuacrOerryBydGNQaW5nIOi2heaXtlxuICAgICAgICog5b2T5YC85Li6IHRydWUg5pe277yM6K+05piO5pys56uv5pS25Yiw6KKr6Lii5Ye65oi/6Ze06YCa55+lXG4gICAgICAgKi9cbiAgICAgIG9uS2lja09mZjogKGJ5U2VydmVyOiBib29sZWFuLCBzdGF0ZT86IFJDS2lja1JlYXNvbiB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICB0aGlzLl9vbktpY2tPZmYoYnlTZXJ2ZXIsIHRoaXMuX3Jvb20hLmdldFJvb21JZCgpLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuX3JlbGVhc2VTdG9yZWREYXRhKCk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv55So5oi35Yqg5YWlXG4gICAgICBvblVzZXJKb2luOiAodXNlcklkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICBjb25zdCBpbmZvID0gdXNlcklkLm1hcCgoaWQpID0+ICh7IGNhbGxJZDogdGhpcy5fY2FsbElkLCB1c2VySWQ6IGlkIH0pKTtcbiAgICAgICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgICAgIHRoaXMuX29uT3RoZXJNZW1Kb2luZWQoaW5mbywgdHJhY2VJZCk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv55So5oi356a75byAXG4gICAgICBvblVzZXJMZWF2ZTogKHVzZXJJZHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWPkeW4g1xuICAgICAgb25UcmFja1B1Ymxpc2g6IHRoaXMuX29uUmVtb3RlVHJhY2tQdWJsaXNoLmJpbmQodGhpcyksXG4gICAgICAvLyDov5znq6/otYTmupDlj5bmtojlj5HluINcbiAgICAgIG9uVHJhY2tVbnB1Ymxpc2g6IHRoaXMuX29uVHJhY2tVbnB1Ymxpc2guYmluZCh0aGlzKSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWHhuWkh+Wwsee7qlxuICAgICAgb25UcmFja1JlYWR5OiAodHJhY2s6IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25SZW1vdGVUcmFja1JlYWR5KFt0cmFja10pO1xuICAgICAgfSxcbiAgICAgIC8vIOWPkeW4g+iAheemgeeUqOOAgeWQr+eUqOinhumikVxuICAgICAgb25WaWRlb011dGVDaGFuZ2U6ICh2aWRlb1RyYWNrOiBSQ1JlbW90ZVZpZGVvVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25WaWRlb011dGVDaGFnbmUoe1xuICAgICAgICAgIGZyb21Vc2VySWQ6IHZpZGVvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgbXV0ZWQ6IHZpZGVvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgdHJhY2tJZDogdmlkZW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vIOWPkeW4g+iAheemgeeUqOOAgeWQr+eUqOmfs+mikVxuICAgICAgb25BdWRpb011dGVDaGFuZ2U6IChhdWRpb1RyYWNrOiBSQ1JlbW90ZUF1ZGlvVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25BdWRpb011dGVDaGFuZ2Uoe1xuICAgICAgICAgIGZyb21Vc2VySWQ6IGF1ZGlvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgbXV0ZWQ6IGF1ZGlvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgdHJhY2tJZDogYXVkaW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uOiB0aGlzLl9vblJUQ1BlZXJDb25uZWN0aW9uQ2xvc2VCeUV4Y2VwdGlvbi5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIC8vIOazqOWGjOi0qOmHj+aVsOaNruaKpeWRiuebkeWQrFxuICAgIHRoaXMuX3Jvb20hLnJlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoe1xuICAgICAgb25TdGF0ZVJlcG9ydDogdGhpcy5fb25SVENTdGF0ZVJlcG9ydC5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIC8vIOazqOWGjOmfs+mHj+S4iuaKpeS6i+S7tlxuICAgIHRoaXMuX3Jvb20hLm9uQXVkaW9MZXZlbENoYW5nZSgoYXVkaW9MZXZlbFJlcG9ydExpc3QpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkKGF1ZGlvTGV2ZWxSZXBvcnRMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTG9jYWxUcmFja1JlYWR5KHRyYWNrczogUkNMb2NhbFRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlbW90ZVRyYWNrUmVhZHkodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3MpO1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SRUNFSVZFX0ZJUlNUX0ZSQU1FX18pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25LaWNrT2ZmKGJ5U2VydmVyOiBib29sZWFuLCByb29tSWQ6IHN0cmluZywgc3RhdGU/OiBSQ0tpY2tSZWFzb24sIGtpY2tFeHRyYT86IFJDQ2FsbEtpY2tFeHRyYSkge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTywgYHJvb25JZDogJHtyb29tSWR9LCBieVNlcnZlcjogJHtieVNlcnZlcn0sIHN0YXRlOiAke3N0YXRlfSwga2lja0V4dHJhOiAke0pTT04uc3RyaW5naWZ5KGtpY2tFeHRyYSl9YCk7XG4gICAgbGV0IHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uID0gUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUjtcbiAgICBpZiAoYnlTZXJ2ZXIpIHtcbiAgICAgIGlmIChraWNrRXh0cmEpIHtcbiAgICAgICAgc3lzdGVtU3RhdGUgPSBraWNrRXh0cmEua2lja1JlYXNvbkNvZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uU0VSVkVSX0tJQ0s6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uS0lDS0VEX0JZX1NFUlZFUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLk9USEVSX0tJQ0s6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLklNX0RJU0NPTk5FQ1RFRDpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLklNX0xPR09VVDpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5MT0dPVVQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5PVEhFUl9DTElFTlRfSU1fQ09OTkVDVEVEOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9MT0dJTjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX0tJQ0tPRkZfXywgc3lzdGVtU3RhdGUsIHJvb21JZCk7XG4gIH1cblxuICAvKipcbiAgICogUlRDIFBlZXIg5byC5bi45YWz6ZetXG4gICAqIOenu+WKqOerr+acquWkhOeQhuatpOWbnuiwg++8jOWumuS5iSBzeXNTdGF0dXMg5Li6IENPTk5FQ1RJT05fRVJSXG4gICAqL1xuICBwcml2YXRlIF9vblJUQ1BlZXJDb25uZWN0aW9uQ2xvc2VCeUV4Y2VwdGlvbigpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PLCAnJywgdHJhY2VJZCk7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JUQ19QRUVSQ09OTkVDVElPTl9BQk5PUk1BTF9DTE9TRV9fLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX29uU2VsZkpvaW5lZChpbmZvOiBJTWVtYmVySW5mbywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX1NFTEZfSk9JTkVEX18sIGluZm8uY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVtb3RlVHJhY2tQdWJsaXNoKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX1BVQkxJU0hfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgbmVlZFN1YlRyYWNrczogSVN1YnNjcmliZUF0dHJbXSA9IFtdO1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmfs+mikeaXtu+8jOebtOaOpeiuoumYhVxuICAgICAgICovXG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkpIHtcbiAgICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKHsgdHJhY2ssIHN1YlRpbnk6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF0/LnZpZGVvVmlldykge1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrKTtcbiAgICAgICAgY29uc3QgeyBpc1RpbnkgfSA9IHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgICAgIG5lZWRTdWJUcmFja3MucHVzaCh7IHRyYWNrLCBzdWJUaW55OiBpc1RpbnkgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmVlZFN1YlRyYWNrcy5sZW5ndGggJiYgdGhpcy5zdWJzY3JpYmVUcmFja3MobmVlZFN1YlRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9vblRyYWNrVW5wdWJsaXNoKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX1VOUFVCTElTSF9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBhd2FpdCB0aGlzLnVuc3Vic2NyaWJlVHJhY2tzKHRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkF1ZGlvTXV0ZUNoYW5nZShpbmZvOiBJTWVkaWFNdXRlQ2hhbmdlSW5mbykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfRU5BQkxFX0NIQU5HRV9PLCBKU09OLnN0cmluZ2lmeSh7IGluZm8gfSksIHRyYWNlSWQpO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2soaW5mby50cmFja0lkKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2shKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVmlkZW9NdXRlQ2hhZ25lKGluZm86IElNZWRpYU11dGVDaGFuZ2VJbmZvKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08sIEpTT04uc3RyaW5naWZ5KHsgaW5mbyB9KSwgdHJhY2VJZCk7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFjayhpbmZvLnRyYWNrSWQpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrISk7XG4gIH1cblxuICBwcml2YXRlIF9vblJUQ1N0YXRlUmVwb3J0KHJlcG9ydDogSVJDUlRDU3RhdGVSZXBvcnQpIHtcbiAgICBjb25zdCB7IHNlbmRlcnMsIHJlY2VpdmVycyB9ID0gcmVwb3J0O1xuICAgIHNlbmRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyBraW5kLCBwYWNrZXRzTG9zdFJhdGUsIHJ0dCB9ID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLl9jYWxsTWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPICYmIGtpbmQgPT09ICdhdWRpbycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcj8ub25TZW5kUGFja2V0TG9zcyhwYWNrZXRzTG9zdFJhdGUgfHwgMCwgcnR0IHx8IDApO1xuICAgIH0pO1xuICAgIHJlY2VpdmVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHRyYWNrSWQsIGtpbmQsIHBhY2tldHNMb3N0UmF0ZSwgYml0cmF0ZSxcbiAgICAgIH0gPSBpdGVtO1xuICAgICAgaWYgKHRoaXMuX2NhbGxNZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8gJiYga2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHVzZXJJZCB9ID0gaGVscGVyLnBhcnNlVHJhY2tJZCh0cmFja0lkKTtcbiAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgW3VzZXJJZDogc3RyaW5nXTogUkNDYWxsUGx1c1BhY2tldExvc3NTdGF0cztcbiAgICAgIH0gPSB7fTtcbiAgICAgIGRhdGFbdXNlcklkXSA9IHtcbiAgICAgICAgcGFja2V0TG9zdFJhdGU6IHBhY2tldHNMb3N0UmF0ZSEsXG4gICAgICAgIGJpdFJhdGU6IGJpdHJhdGUsXG4gICAgICB9O1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcj8ub25SZWNlaXZlUGFja2V0TG9zcyhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogUlRDIOaOpeaUtuacgOe7iOWksei0peWQjumcgOimgeiwg+eUqCBoYW5ndXAg5oyC5pat55qE5oOF5Ya1XG4gKi9cbiAgcHJpdmF0ZSBfb25SVENNZXRob2RGYWlsKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX18sIHN5c3RlbVN0YXRlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uT3RoZXJNZW1Kb2luZWQoaW5mbzogSU1lbWJlckluZm9bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX09USEVSX0pPSU5FRF9fLCBpbmZvLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uRGV2aWNlRW5hYmxlQ2hhbmdlKHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXywgdHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rmnKzlnLDpn7PpopEgdHJhY2ssIOWIm+W7uuaIkOWKn+WQjuS/neWtmOacrOWcsOW5tuWbnuiwg+mAmuefpVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlQXVkaW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbEF1ZGlvVHJhY2t9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcz8uc29tZSgoaXRlbSkgPT4gaXRlbS5pc0F1ZGlvVHJhY2soKSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX2F1ZGlvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fYXVkaW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIC8vIOacrOasoee8k+WtmFxuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICAvLyDpgJrnn6XkuIrlsYJcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rmnKzlnLDop4bpopEgdHJhY2ssIOWIm+W7uuaIkOWKn+WQjuS/neWtmOacrOWcsOW5tuWbnuiwg+mAmuefpVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFZpZGVvVHJhY2t9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcz8uc29tZSgoaXRlbSkgPT4gaXRlbS5pc1ZpZGVvVHJhY2soKSAmJiAhaXRlbS5pc0Rlc3Ryb3llZCgpKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soUlRDUmVzb3VyY2VUYWcuTk9STUFMLCB0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICAvLyDmnKzmrKHnvJPlrZhcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgLy8g6YCa55+l5LiK5bGCXG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw57yT5a2Y6KeG6aKRIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxWaWRlb1RyYWNrKCk6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2FsVmlkZW9UcmFjazogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcykge1xuICAgICAgW2xvY2FsVmlkZW9UcmFja10gPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw57yT5a2Y6Z+z6aKRIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxBdWRpb1RyYWNrKCk6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2FsQXVkaW9UcmFjazogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcykge1xuICAgICAgW2xvY2FsQXVkaW9UcmFja10gPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICog5Y+R5biD5pys5Zyw6LWE5rqQ55qE6YC76L6RXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaCh0cmFja3M6IChSQ0xvY2FsVHJhY2sgfCBJUHVibGlzaEF0dHJzKVtdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfVCwgYHRyYWNrc0lkczogJHt0cmFja3MubWFwKChpdGVtKSA9PiAoKGl0ZW0gaW5zdGFuY2VvZiBSQ0xvY2FsVHJhY2spID8gaXRlbS5nZXRUcmFja0lkKCkgOiBpdGVtLnRyYWNrLmdldFRyYWNrSWQoKSkpfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElQdWJSZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3Jvb20hLnB1Ymxpc2guYmluZCh0aGlzLl9yb29tKSxcbiAgICAgIGZuQXJnczogW3RyYWNrc10sXG4gICAgICBvbkVycm9yOiAoY29kZSkgPT4ge30sXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX29uUlRDTWV0aG9kRmFpbChSQ0NhbGxQbHVzUmVhc29uLlBVQkxJU0hfRVJSLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoVmlkZW9UcmFjaygpIHtcbiAgICBjb25zdCBkZWZhdWx0VmlkZW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55ID8geyB0cmFjazogZGVmYXVsdFZpZGVvVHJhY2shLCBpc1B1YlRpbnk6IHRydWUgfSA6IGRlZmF1bHRWaWRlb1RyYWNrITtcbiAgICByZXR1cm4gdGhpcy5fcm9vbSEucHVibGlzaChbcHViUGFyYW1zXSk7XG4gIH1cblxuICBzZXRWaWRlb1ZpZXcobGlzdDoge3VzZXJJZDogc3RyaW5nLCB2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueT86IGJvb2xlYW59W10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5lZWRTdWJUcmFja3M6IElTdWJzY3JpYmVBdHRyW10gPSBbXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQsIGlzVGlueSA9IGZhbHNlIH0gPSBpdGVtO1xuICAgICAgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXSA9IHtcbiAgICAgICAgdmlkZW9WaWV3OiB2aWRlb0VsZW1lbnQsXG4gICAgICAgIGlzVGlueSxcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIOiuvue9ruacrOerr+inhuWbvuaXtu+8jOWPquWtmOWCqOaVsOaNru+8jOaXoOmcgOiuoumYhVxuICAgICAgICovXG4gICAgICBpZiAodXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICog6K6+572u6L+c56uv6KeG5Zu+5pe277yM5aaC5p6c5bey57uP5Yqg5YWl5oi/6Ze077yM5YiZ6I635Y+W6L+c56uv6LWE5rqQ55u05o6l6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZW1vdGVUcmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpO1xuICAgICAgY29uc3Qgc3ViUGFyYW1zID0gKHJlbW90ZVRyYWNrcyFbdXNlcklkXSB8fCBbXSkubWFwKCh0cmFjaykgPT4gKHtcbiAgICAgICAgdHJhY2ssXG4gICAgICAgIHN1YlRpbnk6IGlzVGlueSxcbiAgICAgIH0pKS5maWx0ZXIoKHsgdHJhY2sgfSkgPT4gIXRyYWNrLmlzU3Vic2NyaWJlZCgpKTtcbiAgICAgIG5lZWRTdWJUcmFja3MucHVzaCguLi5zdWJQYXJhbXMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX1ZJREVPX1ZJRVdfTywgSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIHVzZXJWaWV3TWFwOiBnZXRVc2VyVmlkZW9WaWV3SW5mbyh0aGlzLl91c2VyVmlld01hcCksXG4gICAgICAgIG5lZWRTdWJUcmFja0lkczogbmVlZFN1YlRyYWNrcy5tYXAoKHsgdHJhY2sgfSkgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICAgIH0sXG4gICAgKSwgdHJhY2VJZCk7XG5cbiAgICBuZWVkU3ViVHJhY2tzLmxlbmd0aCAmJiB0aGlzLnN1YnNjcmliZVRyYWNrcyhuZWVkU3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTop4blm77ml7bvvIzlj5bmtojorqLpmIXotYTmupBcbiAgICovXG4gIHJlbW92ZVZpZGVvVmlldyh1c2VySWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdW5zdWJUcmFja3M6IFJDUmVtb3RlVHJhY2tbXSA9IFtdO1xuICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHRyYWNrcyA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKClbdXNlcklkXTtcbiAgICAgIGlmICh0cmFja3MgJiYgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB2aWRlb1RyYWNrID0gdHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzVmlkZW9UcmFjaygpKTtcbiAgICAgICAgdmlkZW9UcmFjay5sZW5ndGggJiYgdW5zdWJUcmFja3MucHVzaCh2aWRlb1RyYWNrWzBdKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTywgSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIHVzZXJWaWV3TWFwOiBnZXRVc2VyVmlkZW9WaWV3SW5mbyh0aGlzLl91c2VyVmlld01hcCksXG4gICAgICAgIHVuc3ViVHJhY2tzOiB1bnN1YlRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgICAgfSxcbiAgICApLCB0cmFjZUlkKTtcblxuICAgIGlmICh1bnN1YlRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVUcmFja3ModW5zdWJUcmFja3MsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blrZjlgqjnmoTkurrlkZjlkowgdmlkZW8g5YWD57Sg5pWw5o2uXG4gICAqL1xuICBnZXRVc2VyVmlld01hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlclZpZXdNYXA7XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5aqS5L2T6LWE5rqQXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1QsIGB1c2VySWQ6ICR7dXNlcklkfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX0sIHZpZGVvVmlldzogJHt2aWRlb1ZpZXc/Lm5vZGVOYW1lfWAsIHRyYWNlSWQpO1xuICAgIGxldCB0cmFjazogUkNUcmFjayB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIOWMuuWIhuacrOerr+WSjOi/nOerr1xuICAgICAqL1xuICAgIGlmICh1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgIHRyYWNrID0gKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykgPyB0aGlzLmdldExvY2FsQXVkaW9UcmFjaygpISA6IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCkhO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgIHRyYWNrID0gdGhpcy5nZXRSZW1vdGVUcmFja3MoKVt1c2VySWRdLmZpbHRlcigodHJhY2spID0+IChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gPyB0cmFjay5pc0F1ZGlvVHJhY2soKSA6IHRyYWNrLmlzVmlkZW9UcmFjaygpKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgYGVycm9yIGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NRURJQV9SRVNPVVJDRV9JTlZBTElFRCB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gYXdhaXQgdHJhY2sucGxheSgpIDogYXdhaXQgdHJhY2sucGxheSh2aWRlb1ZpZXcpO1xuICAgICAgLyoqXG4gICAgICAgKiDlpITnkIbpgJror53liY3orr7nva7kuobpnZnpn7PmiYDmnInov5znq6/pn7PpopHmtYFcbiAgICAgICAqL1xuICAgICAgdHJhY2suaXNBdWRpb1RyYWNrKCkgJiYgIXRoaXMuX3JlbW90ZUF1ZGlvRW5hYmxlICYmIHRyYWNrLm11dGUoKTtcblxuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5QTEFZX01FRElBX0ZBSUxFRH0sIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX0sYCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QTEFZX01FRElBX0ZBSUxFRCB9O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJU3Vic2NyaWJlQXR0cixcbiAgUkNMb2NhbEF1ZGlvVHJhY2ssXG4gIFJDUlRDQ29kZSxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ1RyYWNrLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7XG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzQ2FsbFJlY29yZCxcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1JlYXNvbixcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBSQ0NhbGxQbHVzVHlwZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCc7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXIhOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDnirbmgIHmnLrkuovku7bms6jlhoxcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICog5Zue6LCD5bqU55So5bGC5LqL5Lu2XG4gICogQHBhcmFtIGV2ZW50TmFtZVxuICAqIEBwYXJhbSBhdHRyc1xuICAqIEByZXR1cm5zXG4gICovXG4gIHByaXZhdGUgX2NhbGxBcHBMaXN0ZW5lcihldmVudE5hbWU6IGtleW9mIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsIC4uLmF0dHJzOiBhbnlbXSkge1xuICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuX2xpc3RlbmVyPy5bZXZlbnROYW1lXSBhcyBGdW5jdGlvbjtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaGFuZGxlKC4uLmF0dHJzKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGwoc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbCcsXG4gICAgICBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGwnLCBzZXNzaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZVVzZXJJbnZpdGVkKGludml0ZWVVc2VyTGlzdDogc3RyaW5nW10sIGludml0ZXJVc2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VySW52aXRlZCcsXG4gICAgICBpbnZpdGVlVXNlckxpc3QsXG4gICAgICBpbnZpdGVyVXNlcklkLFxuICAgICAgY2FsbElkLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlVXNlckludml0ZWQnLCBpbnZpdGVlVXNlckxpc3QsIGludml0ZXJVc2VySWQhLCBjYWxsSWQpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbENvbm5lY3RlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxDb25uZWN0ZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbENvbm5lY3RlZCcsIHNlc3Npb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxUeXBlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxUeXBlQ2hhbmdlZCcsIGNhbGxUeXBlLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWinumHj+S4iuaKpei/nOerr+S6uuWRmOeKtuaAgeWPmOWMllxuICAgKi9cbiAgcHVibGljIG9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZChkYXRhOiB7XG4gICAgY2FsbElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgICByZWFzb24/OiBSQ0NhbGxQbHVzUmVhc29uLFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIHVzZXJJZCwgdXNlclN0YXRlLCByZWFzb24sXG4gICAgfSA9IGRhdGE7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyU3RhdGUsXG4gICAgICByZWFzb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkJywgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZSwgcmVhc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNhbGxFbmRlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbiwgcmVhc29uOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25DYWxsRW5kZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgY2xvc2VSZWFzb246IHJlYXNvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxFbmRlZCcsIHNlc3Npb24sIHJlYXNvbik7XG4gIH1cblxuICBwdWJsaWMgb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRyYWNrSWQ6IHRyYWNrPy5nZXRUcmFja0lkKCksXG4gICAgICBlbmFibGU6IHRyYWNrPy5pc093bmVyTXV0ZWQoKSxcbiAgICB9KSk7XG4gICAgY29uc3QgdXNlcklkID0gdHJhY2s/LmdldFVzZXJJZCgpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQnLCBjYWxsSWQsIHVzZXJJZCwgdHJhY2s/LmlzT3duZXJNdXRlZCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB0cmFja0lkOiB0cmFjaz8uZ2V0VHJhY2tJZCgpLFxuICAgICAgZW5hYmxlOiB0cmFjaz8uaXNPd25lck11dGVkKCksXG4gICAgfSkpO1xuICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrPy5nZXRVc2VySWQoKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsIGNhbGxJZCwgdXNlcklkLCB0cmFjaz8uaXNPd25lck11dGVkKCkpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsUmVjb3JkKHJlY29yZDogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxSZWNvcmQnLFxuICAgICAgcmVjb3JkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDYWxsUmVjb3JkJywgcmVjb3JkKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQ6IHN0cmluZywgdHJhbnNhY3Rpb25JZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCcsXG4gICAgICB1c2VySWQsXG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0JywgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoaW5mbzoge1xuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIHRyYW5zYWN0aW9uSWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgY29kZSxcbiAgICB9ID0gaW5mbztcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsXG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsIHtcbiAgICAgIHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlLCBjb2RlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKGluZm86IHsgY2FsbElkOiBzdHJpbmcsIGNhbGxTdGFydFRpbWU6IG51bWJlciB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxTdGFydFRpbWUnLFxuICAgICAgaW5mbyxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbFN0YXJ0VGltZScsIGluZm8pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkOiBzdHJpbmcsIGNhbGxGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsRmlyc3RGcmFtZVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsIGNhbGxJZCwgY2FsbEZpcnN0RnJhbWVUaW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3M6IFJDVHJhY2tbXSwgdHJhY2VJZD86IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblVzZXJNZWRpYUF2YWlsYWJsZScsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlck1lZGlhQXZhaWxhYmxlJywgdXNlcklkLCBtZWRpYVR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uRmV0Y2hSZW1vdGVNZWRpYUVycm9yKHRyYWNrczogSVN1YnNjcmliZUF0dHJbXSwgY29kZTogUkNSVENDb2RlKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHsgdHJhY2sgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uRmV0Y2hSZW1vdGVNZWRpYUVycm9yJywgdXNlcklkLCBjb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJBdWRpb0xldmVsQ2hhbmdlZChhdWRpb0xldmVsUmVwb3J0TGlzdDoge1xuICAgIHRyYWNrOiBSQ0xvY2FsQXVkaW9UcmFjayB8IFJDUmVtb3RlQXVkaW9UcmFjaztcbiAgICBhdWRpb0xldmVsOiBudW1iZXI7XG4gIH1bXSkge1xuICAgIGF1ZGlvTGV2ZWxSZXBvcnRMaXN0LmZvckVhY2goKHsgdHJhY2ssIGF1ZGlvTGV2ZWwgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkJywgdXNlcklkLCBhdWRpb0xldmVsKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmnKrnn6XplJnor69cbiAgICovXG4gIFVOS05PV19FUlIgPSA0MTAwMCxcbiAgLyoqXG4gICAqIOaVsOaNruW6k+mUmeivr1xuICAgKi9cbiAgREJfRVJSID0gNDEwMDEsXG4gIC8qKlxuICAgKiBqc29uIOmUmeivr1xuICAgKi9cbiAgSlNPTl9FUlIgPSA0MTAwMixcbiAgLyoqXG4gICAqIGpzb24g5qC85byP6ZSZ6K+vXG4gICAqL1xuICBJTlZBTElEX0pTT05fRVJSID0gNDEwMDMsXG4gIC8qKlxuICAgKiDlj4LmlbDkuKLlpLFcbiAgICovXG4gIE1JU1NJTkdfUEFSQU1TID0gNDEwMDQsXG4gIC8qKlxuICAgKiDlj4LmlbDkuI3og73kuLrnqbpcbiAgICovXG4gIFBBUkFNU19SRVFVSVJFRCA9IDQxMDA1LFxuICAvKipcbiAgICog5pWw5o2u5qC85byP6ZSZ6K+vXG4gICAqL1xuICBEQVRBX0ZPUk1BVF9FUlIgPSA0MTAwNixcbiAgLyoqXG4gICAqIOaWueazleacquWunueOsFxuICAgKi9cbiAgTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IDQxMDA3LFxuICAvKipcbiAgICogY2FsbCDkuI3lrZjlnKjmiJblt7Lnu5PmnZ9cbiAgICovXG4gIENBTExfTk9UX0VYSVNUID0gNDEwMTAsXG4gIC8qKlxuICAgKiDljZXlkbwg6KKr6YKA6K+36ICF5LiN6IO96LaF6L+H5Lik5Lq6XG4gICAqL1xuICBTSU5HQUxfRVhDRUVEX1RXT19JTlZJVEVFID0gNDEwMTEsXG4gIC8qKlxuICAgKiDnvqTnu4Tlkbzlj6votoXov4fop4TlrprkurrmlbDvvIjmnIDlpJogMzIg5Lq677yJXG4gICAqL1xuICBHUk9VUF9FWENFRURTX1FVT1JVTSA9IDQxMDEyLFxuICAvKipcbiAgICog5pON5L2c5bey6L+H5pyfXG4gICAqL1xuICBPUEVSQVRJT05fRVhQSVJFRCA9IDQxMDEzLFxuICAvKipcbiAgICog5b2T5YmN6K6+5aSH5q2j5Zyo5ZG85Y+r5LitXG4gICAqL1xuICBERVZJQ0VfSVNfQ0FMTElORyA9IDQxMDE0LFxuICAvKipcbiAgICog5LiK5oql55qEIHN0cmVhbVJlYWR5VGltZSDml6DmlYhcbiAgICovXG4gIFJFUE9SVF9TVFJFQU1fUkVBRFlfVElNRV9JU19JTlZBTElEID0gNDEwMTgsXG4gIC8qKlxuICAgKiDkuI3og73lkbzoh6rlt7FcbiAgICovXG4gIE5PVF9DQUxMX1lPVVJTRUxGID0gNDEwMTksXG4gIC8qKlxuICAgKiDkvJror53nirbmgIHkuI3lrZjlnKhcbiAgICovXG4gIFNFU1NJT05fU1RBVFVTX05PVF9FWElTVCA9IDQxMDIwLFxuICAvKipcbiAgICogaGFuZ3VwIOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgSEFOR1VQX05PVF9BTExPVyA9IDQxMDIxLFxuICAvKipcbiAgICogYWNjZXB0IOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgQUNDRVBUX05PVF9BTExPVyA9IDQxMDIyLFxuICAvKipcbiAgICog5pON5L2c5Zyo5b2T5YmN5pa55rOV5LiN5YWB6K646LCD55SoXG4gICAqL1xuICBPUEVSQVRJT05fTk9UX0FMTE9XID0gNDEwMjUsXG4gIC8qKlxuICAgKiDkuJrliqFJZOS4jeato+ehruaIluiAheS4muWKoeW3sue7k+adn1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfRVJSID0gNDExMDAsXG4gIC8qKlxuICAgKiDpn7PpopHljYfnuqfop4bpopHlt7Looqvlj5HotbfogIXlj5bmtohcbiAgICovXG4gIFVQX1ZJREVPX0NBTkNFTEVEID0gNDEwNTAsXG4gIC8qKlxuICAgKiDlvZPliY3pgJror53lt7Lnu4/mmK/pn7PpopHpgJror53vvIzml6DpnIDpmY3nuqdcbiAgICovXG4gIENVUlJFTlRfQ0FMTF9JU19BVURJTyA9IDQxMDUxLFxuICAvKipcbiAgICog5b2T5YmN6YCa6K+d5bey57uP5piv6KeG6aKR6YCa6K+d77yM5peg6ZyA5Y2H57qnXG4gICAqL1xuICAgQ1VSUkVOVF9DQUxMX0lTX1ZJREVPID0gNDEwNTIsXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgZ2V0VVVJRCwgSVJ1bnRpbWUsIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgbm90RW1wdHlBcnJheSwgbm90RW1wdHlTdHJpbmcsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZW1vdGVUcmFjaywgUkNSVENDb2RlLCBkZXZpY2UgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElDYWxsUGx1c0luaXRPcHRzLFxuICBJU3RhdHVzUmVwb3J0TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyxcbiAgUkNDYWxsUGx1c0NhbGxVc2VyLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNDYWxsUGx1c1R5cGUsXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBJQXVkaW9Db25maWcsXG4gIElWaWRlb0NvbmZpZyxcbiAgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7XG4gIGdldEhhbmd1cFN5c3RlbVN0YXRlLCBpc1N1cHBvcnRNZWRpYVNlcnZlciwgdmFsaWRhdGVCaXRyYXRlLCB2YWxpZGF0ZVZpZGVvTm9kZU5hbWUsXG59IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgUkNDYWxsUEx1c1N0YXRpc3RpY3MgZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQTHVzU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnJztcbmltcG9ydCB7XG4gIElIYW5ndXBGb3JCdXN5T3B0cywgSU1lbWJlckluZm8sXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUlRDTW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SVENNb2R1bGUnO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9Gb3J3YXJkVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJFcnJvckNvZGUgfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyRXJyb3JDb2RlJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNDbGllbnQge1xuICAvKipcbiAgICog5pGE5YOP5aS06YeH6ZuG6YWN572uXG4gICAqL1xuICBwcml2YXRlIF92aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnID0ge1xuICAgIHJlc29sdXRpb246IFJDQ2FsbFBsdXNSZXNvbHV0aW9uLlc2NDBfSDQ4MCxcbiAgICBmcmFtZVJhdGU6IFJDQ2FsbFBsdXNGcmFtZVJhdGUuRlBTXzE1LFxuICB9XG5cbiAgLyoqXG4gICAqIOm6puWFi+mjjumHh+mbhumFjee9rlxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZyA9IHt9XG5cbiAgLyoqXG4gICAqIOe7n+iuoeWfi+eCueexu1xuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFBsdXNTdGF0aXN0aWNzOiBSQ0NhbGxQTHVzU3RhdGlzdGljc1xuXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBwcml2YXRlIF9jbGllbnRDYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIOaYr+WQpuS4uuS4u+WKqOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNMYXVuY2hIYW5ndXAgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDlkbzlj6vov4fnqIvkuK3mjILmlq1cbiAgICovXG4gIHByaXZhdGUgX25lZWRIYW5ndXBDYWxsSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lO1xuXG4gIHByaXZhdGUgX3J0Y01vZHVsZTogUlRDTW9kdWxlO1xuXG4gIC8qKlxuICAgKiDkuIrmiqXlupTnlKjlsYLkuovku7bmqKHlnZdcbiAgICovXG4gIF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlID0gbmV3IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUoX2xvZ2dlcik7XG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzID0gbmV3IFJDQ2FsbFBMdXNTdGF0aXN0aWNzKHRoaXMuX2xvZ2dlciwgdGhpcy5fY29udGV4dCk7XG4gICAgLy8g5Yid5aeL5YyW54q25oCB5py65a6e5L6LXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5faW5pdE9wdHMsIHRoaXMuX2xvZ2dlciwgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlID0gbmV3IFJUQ01vZHVsZSh0aGlzLl9jb250ZXh0LCB0aGlzLl9ydW50aW1lLCB0aGlzLl9pbml0T3B0cywgdGhpcy5fbG9nZ2VyLCB0aGlzLl9jYWxsRW5naW5lLCB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZSk7XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX18sIHRoaXMuX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXywgdGhpcy5fcGVlckNvbm5lY3Rpb25BYm5vcm1hbENsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fLCB0aGlzLl9zZWxmSm9pbmVkSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXywgdGhpcy5fb3RoZXJKb2luZWRIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXywgdGhpcy5fcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX09OX0tJQ0tPRkZfXywgdGhpcy5fa2lja29mZkhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXywgdGhpcy5fcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZS5iaW5kKHRoaXMpKTtcblxuICAgIC8qKlxuICAgICAqIOmAmuivneW7uueri+WQju+8jFJUQyDmqKHlnZfpnIDlj5HluIPotYTmupBcbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZC5iaW5kKHRoaXMuX3J0Y01vZHVsZSkpO1xuICAgIC8qKlxuICAgICAqIOmAmuivneaMguaWreWQju+8jFJUQyDmqKHlnZfpnIDpgIDlh7rmiL/pl7TjgIHlpITnkIblhoXlrZjmlbDmja5cbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgdGhpcy5fc2Vzc2lvbkNsb3NlSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIC8qKlxuICAgICAqIOWkhOeQhiBSVEMg5qih5Z2X5aqS5L2T5Y2H6ZmN57qn6YC76L6RXG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlTWVkaWFUeXBlLmJpbmQodGhpcy5fcnRjTW9kdWxlKSk7XG4gICAgLyoqXG4gICAgICog5pS25Yiw6YCa6K+d6YKA6K+35ZCO77yM6ZyA5LiK5oql5Z+L54K5XG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgKG5ld1Nlc3Npb24sIGludml0ZVNvdXJjZSkgPT4ge1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1MsIFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsICtuZXcgRGF0ZSgpLCBuZXdTZXNzaW9uLCAnJywgaW52aXRlU291cmNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliqDmiL/pl7TjgIHlj5HluIPjgIHorqLpmIXlpLHotKXml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgY29uc3QgY2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUywgUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgK25ldyBEYXRlKCksIG1haW5TZXNzaW9uKTtcbiAgICAgIHRoaXMuX19pbm5lckhhbmd1cCh7IGNhbGxJZCwgc3lzdGVtU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJ0YyBwZWVyQ29ubmVjdGlvbiDlvILluLjmlq3lvIDml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3BlZXJDb25uZWN0aW9uQWJub3JtYWxDbG9zZSh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgLy8g5LiK5oql54q25oCB6K6p5a+55pa555+l6YGT6Ieq5bex56a75byA55qE5Y6f5ZugXG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkOiBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmVuZEN1cnJlbnRTZXNzaW9uKFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIsIG1haW5TZXNzaW9uLmdldENhbGxJZCgpLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pys56uv5Yqg5YWlIFJUQyDmiL/pl7TvvIzpnIDmm7TmlrDmnKzkurogT05DQUxMIOeKtuaAge+8jOmHjeaWsOagoeaXtlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VsZkpvaW5lZEhhbmRsZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsQ29ubmVjdGVkKHNlc3Npb24hKTtcblxuICAgIC8qKlxuICAgICAqIOabtOaWsOiHquW3seeahOeKtuaAgVxuICAgICAqL1xuICAgIGNvbnN0IHZpZGVvVHJhY2sgPSB0aGlzLl9ydGNNb2R1bGUuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgYXVkaW9UcmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBjb25zdCBjYW1lcmFFbmFibGUgPSB2aWRlb1RyYWNrID8gIXZpZGVvVHJhY2suaXNPd25lck11dGVkKCkgOiBmYWxzZTtcbiAgICBjb25zdCBtaWNyb3Bob25lRW5hYmxlID0gYXVkaW9UcmFjayA/ICFhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpIDogZmFsc2U7XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBjYW1lcmFFbmFibGUsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIG1pY3JvcGhvbmVFbmFibGUsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qgc2VsZlN0YXRlID0gW1xuICAgICAge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBzZWxmU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g6YeN5paw5byA5aeL5qCh5pe26YC76L6RXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+S6uuWRmOWKoOWFpeaIv+mXtO+8jOabtOaWsOi/nOerr+S6uuWRmOeKtuaAgeWSjOmAmuivneeKtuaAgeS4uiBPTkNBTExcbiAgICovXG4gIHByaXZhdGUgX290aGVySm9pbmVkSGFuZGxlKGluZm86IElNZW1iZXJJbmZvW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOabtOaWsOWKoOWFpeaIv+mXtOS6uuWRmOeKtuaAgVxuICAgIGxldCBjYWxsSWQgPSAnJztcbiAgICBjb25zdCB1c2Vyc1N0YXRlID0gaW5mby5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNhbGxJZCA9IGl0ZW0uY2FsbElkO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIHVzZXJzU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pyJ5Lq65Y+q5Yqg5oi/6Ze077yM5LiN5Y+R5rWB77yM5pWF5q2k5aSE5Lmf5pu05paw5Li6IENPTk5FQ1RFRFxuICAgIGlmICh0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlTWFpblNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmmluW4p+S4iuaKpee7meS4muWKoeWxglxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS51cGRhdGVNYWluU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKTtcbiAgICB9XG5cbiAgICAvLyDnu5kgQ2FsbFNlcnZlciDkuIrmiqXmtYHliLDovr5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwRmlyc3RGcmFtZVRpbWUodHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KKr6Lii5Ye65oi/6Ze05pe277yM6ZyA57uT5p2f6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9raWNrb2ZmSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCByb29tSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog5pys56uv572R57uc5pyJ6Zeu6aKY77yMcGluZyDlpLHotKXml7ZcbiAgICAgKi9cbiAgICBpZiAoc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiiq+acjeWKoeerr+i4ouWHuuaXtueahOWkhOeQhlxuICAgICAqL1xuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uKSB7XG4gICAgICBjb25zdCBjYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FCTk9STUFMX0hBTkdVUF9TLCBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCArbmV3IERhdGUoKSwgbWFpblNlc3Npb24sIHRoaXMuX2NsaWVudENhbGxJZCk7XG5cbiAgICAgIC8vIOS4iuaKpeeKtuaAgeebtOaOpeiuqeWvueaWueefpemBk+iHquW3seemu+W8gOeahOWOn+WboFxuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBzeXN0ZW1TdGF0ZSxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvLyDnm7TmjqXnu5PmnZ/lt7HmlrnpgJror51cbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOmfs+inhumikeeKtuaAgeWPmOWMlu+8jOmcgOabtOaWsCBzZXNzaW9uIOS4reS6uuWRmOeahOiuvuWkh+eKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsICF0cmFjay5pc093bmVyTXV0ZWQoKSwgdHJhY2VJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5pe277yM6ZyA5riF56m65YaF5a2Y77yM56a75byA5oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uQ2xvc2VIYW5kbGUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8qKlxuICAgICAqIOS7heWcqOiiq+WKqOaMguaWreaXtua4heepuuWIm+W7uueahOWuouaIt+erryBjYWxsSWTvvIxcbiAgICAgKiDkuI3lvbHlk43kuLvliqjlkbzlj6vlkI7mjILmlq3ml7bkuIrmiqUg5a6i5oi356uvIGNhbGxJZFxuICAgICAqL1xuICAgIGlmICghdGhpcy5faXNMYXVuY2hIYW5ndXApIHtcbiAgICAgIHRoaXMuX2NsaWVudENhbGxJZCA9ICcnO1xuICAgIH1cbiAgICB0aGlzLl9pc0xhdW5jaEhhbmd1cCA9IGZhbHNlO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozlupTnlKjlsYLkuovku7ZcbiAgICog5YyF5ZCr4oCc5pS25Yiw5ZG85Y+r44CB6YCa6K+d57uT5p2f44CB6YCa6K+d5Lq65ZGY54q25oCB5Y+Y5pu044CB6YCa6K+d57G75Z6L5Y+Y5pu04oCd562J5LqL5Lu2XG4gICAqIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIg5a+56LGh6K+35Y+C6ICDIGFwaURvY1xuICAgKi9cbiAgc2V0Q2FsbFBsdXNFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfRVZFTlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUucmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozpn7Pop4bpopHkuIrkuIvooYzkuKLljIXmlbDmja7nm5HlkKxcbiAgICog5q+P56eS5LiK5oql5LiA5qyhXG4gICAqIEBwYXJhbSBsaXN0ZW5lciDnsbvlnovkuLogSVN0YXR1c1JlcG9ydExpc3RlbmVy77yM6K+m57uG5a6a5LmJ5Y+v5Y+C6ICDIGFwaURvY1xuICAgKiBAcGFyYW0gbGlzdGVuZXIub25TZW5kUGFja2V0TG9zcyAg5Y+R6YCB5Lii5YyF546H5L+h5oGv5Zue6LCDXG4gICAqIEBwYXJhbSBsaXN0ZW5lci5vblJlY2VpdmVQYWNrZXRMb3NzIOaOpeaUtuS4ouWMheeOh+S/oeaBr+Wbnuiwg1xuICAgKi9cbiAgc2V0U3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1NUQVRVU19SRVBPUlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruimgeingueci+S6uuWRmCjljIXmi6zoh6rlt7Hlkozlr7nmlrkp55qE5aqS5L2T5pKt5pS+5ZmoXG4gICAqIEBwYXJhbSBsaXN0IOS4uuS4gOS4quWIl+ihqO+8jOWPr+S8oOWFpeWkmuS6uueahOWqkuS9k+aSreaUvuWZqFxuICAgKiBAcGFyYW0gaXRlbS51c2VySWQg55So5oi3IGlkXG4gICAqIEBwYXJhbSBpdGVtLnZpZGVvRWxlbWVudCDkuIDkuKogdmlkZW8g5YWD57Sg77yM55So5LqO5pKt5pS+6KeG6aKR77yM6ZyA6KaB5oyC6L295Zyo5Lia5Yqh5bGC6aG16Z2i5LiKXG4gICAqIEBwYXJhbSBpdGVtLmlzVGlueSDmmK/lkKbop4LnnIvliKvkurrnmoTlsI/mtYHvvIzlsI/nqpflj6Pml7blj6/ku6XphY3nva7kuLogdHJ1Ze+8jOWPr+iKguecgeW4puWuve+8jHVzZXJJZCDkuLrov5znq6/nlKjmiLfml7bmnInmlYhcbiAgICogQHJldHVybnMgY29kZSDov5Tlm57mmK/lkKborr7nva7miJDlip9cbiAgICovXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbGlzdDogbGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55IH0gPSBpdGVtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBlbGVtZW50TmFtZTogdmlkZW9FbGVtZW50Py5ub2RlTmFtZSxcbiAgICAgICAgICBpc1RpbnksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmo4DmtYtcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5QXJyYXkobGlzdCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCBsaXN0OiBub3QgZW1wdHkgYXJyYXksIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGxpc3QpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBsaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQgfSA9IGl0ZW07XG4gICAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbGlkYXRlVmlkZW9Ob2RlTmFtZSh2aWRlb0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB2aWRlb0VsZW1lbnQ6IG5lZWQgYSB2aWRlbyBlbGVtZW50LCB2YWx1ZTogJHt2aWRlb0VsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHZpZGVvRWxlbWVudC5ub2RlTmFtZSA6IHZpZGVvRWxlbWVudH1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsICdzdWNjZXMnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9WaWV3KGxpc3QsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTmn5DkuKrkurrnmoTlqpLkvZPmkq3mlL7lmahcbiAgICog5LiN6KeC55yL5p+Q5Liq5Lq655qE6KeG6aKR5pe277yM5Lia5Yqh5bGC5Y+v5Lul55u05o6l56e76Zmk5a+55bqU55qEIHZpZGVvIOagh+etvu+8jFxuICAgKiDosIMgcmVtb3ZlVmlkZW9WaWV3IOaWueazle+8jFNESyDlhoXpg6jkvJrlgZzmraLmjqXmlLblr7nmlrnnmoTlqpLkvZPkvKDovpNcbiAgICogQHBhcmFtIHVzZXJJZHMg55So5oi3IGlkIOWIl+ihqFxuICAgKiBAcmV0dXJucyBjb2RlIOi/lOWbnuaYr+WQpuWIoOmZpOaIkOWKn1xuICAgKi9cbiAgcmVtb3ZlVmlkZW9WaWV3KHVzZXJJZHM6IHN0cmluZ1tdKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWRzLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOajgOa1i1xuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFTU9WRV9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB1c2VySWRzOiBub3QgZW1wdHkgYXJyYXksIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVNT1ZFX1ZJREVPX1ZJRVdfUiwgJ3N1Y2NlcycsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlLnJlbW92ZVZpZGVvVmlldyh1c2VySWRzLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5oyH5a6a5Lq65ZGY55qE6Z+z6KeG6aKR5aqS5L2TXG4gICAqIOaSreaUvuafkOS4quS6uueahOinhumikeWJje+8jOivt+ehruS/neW3sue7j+iwg+eUqCBgc2V0VmlkZW9WaWV3YCDmlrnms5XkuLrlhbborr7nva7op4bpopHop4blm75cbiAgICogQHBhcmFtIHVzZXJJZCDmjIflrpropoHmn6XnnIvmn5DkuKrkurrnmoTlqpLkvZPotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDmjIflrprmkq3mlL7pn7PpopHov5jmmK/op4bpopFcbiAgICogQHJldHVybnMg6L+U5Zue5piv5ZCm5pKt5pS+5oiQ5YqfXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IsIGBwYXJhbXMgZXJyLCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4jeaSreaUvuiHquW3seeahOWjsOmfs1xuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgdXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3kuJrliqHlsYLmmK/lkKborr7nva7ov4flvZPliY3kurrlkZjnmoTop4bpopHop4blm75cbiAgICAgKi9cbiAgICBjb25zdCB7IHZpZGVvVmlldyB9ID0gdGhpcy5fcnRjTW9kdWxlLmdldFVzZXJWaWV3TWFwKClbdXNlcklkXSB8fCB7fTtcbiAgICBpZiAobWVkaWFUeXBlICE9PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPICYmICF2aWRlb1ZpZXcpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuVklERU9fVklFV19OT1RfU0VUfSwgdmlkZW8gdmlldyBub3Qgc2V0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnBsYXlNZWRpYSh1c2VySWQsIG1lZGlhVHlwZSwgdmlkZW9WaWV3LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHphY3nva7mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNWaWRlb0NvbmZpZ0J1aWxkZXIg55So5LqO5p6E6YCg6KeG6aKR6YeH6ZuG5pe255qE6YWN572u6aG577yM5Y+v5Lul6K6+572u5pGE5YOP5aS06K6+5aSHIGlk44CB5bin546H44CB5YiG6L6o546H562J77yMXG4gICAqIOiuvue9ruWujOmcgOiwgyBidWlsZCDmlrnms5XvvIzmnIDnu4jlnKggc2V0VmlkZW9Db25maWcg5ZCO55Sf5pWIXG4gICAqL1xuICBjcmVhdGVWaWRlb0NvbmZpZ0J1aWxkZXIoKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNWaWRlb0NvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7op4bpopHphY3nva5cbiAgICog5LiL5qyh6YeH6ZuG5pe255Sf5pWI77yM5aaC5YiH5o2i5pGE5YOP5aS044CB6YeN5paw5bu656uL6YCa6K+dXG4gICAqL1xuICBzZXRWaWRlb0NvbmZpZyhjZmc6IElWaWRlb0NvbmZpZyk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19ULCBKU09OLnN0cmluZ2lmeShjZmcpKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGZyYW1lUmF0ZSwgcmVzb2x1dGlvbiwgbWF4Qml0cmF0ZSwgbWluQml0cmF0ZSxcbiAgICB9ID0gY2ZnO1xuXG4gICAgaWYgKCFSQ0NhbGxQbHVzRnJhbWVSYXRlW2ZyYW1lUmF0ZV0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCBmcmFtZVJhdGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7ZnJhbWVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNSZXNvbHV0aW9uW3Jlc29sdXRpb25dKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsIGBwYXJhbSBlcnJvciwgcmVzb2x1dGlvbiBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtyZXNvbHV0aW9ufWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rpn7PpopHphY3nva7mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNBdWRpb0NvbmZpZ0J1aWxkZXIg55So5LqO5p6E6YCg6Z+z6aKR6YeH6ZuG5pe255qE6YWN572u6aG577yM5Y+v5Lul6K6+572u6bqm5YWL6aOO6K6+5aSHIGlkXG4gICAqIOiuvue9ruWujOmcgOiwgyBidWlsZCDmlrnms5XvvIzmnIDnu4jlnKggc2V0QXVkaW9Db25maWcg5ZCO55Sf5pWIXG4gICAqL1xuICBjcmVhdGVBdWRpb0NvbmZpZ0J1aWxkZXIoKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNBdWRpb0NvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7pn7PpopHphY3nva5cbiAgICog5LiL5qyh6YeH6ZuG5pe255Sf5pWI77yM5aaC6YeN5paw5bu656uL6YCa6K+dXG4gICAqL1xuICBzZXRBdWRpb0NvbmZpZyhjZmc6IElBdWRpb0NvbmZpZyk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19ULCBKU09OLnN0cmluZ2lmeShjZmcpKTtcbiAgICBjb25zdCB7IHNhbXBsZVJhdGUsIG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IGNmZztcbiAgICBpZiAoc2FtcGxlUmF0ZSAmJiAhaXNOdW1iZXIoc2FtcGxlUmF0ZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCBzYW1wbGVSYXRlOiB0eXBlIGlzIG51bWJlciwgdmFsdWU6ICR7c2FtcGxlUmF0ZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBlcnJvck1zZyB9ID0gdmFsaWRhdGVCaXRyYXRlKG1pbkJpdHJhdGUsIG1heEJpdHJhdGUpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1IsIGVycm9yTXNnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgJ3N1Y2Nlc3MnKTtcblxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0QXVkaW9Db25maWcodGhpcy5fYXVkaW9Db25maWcpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr5Y+r5Lq65ZGYIHVzZXJJZCDliJfooajvvIzljZXkurrlkbzlj6vku4XpnIDlnKjmlbDnu4TkuK3mlL7nva7lr7nmlrnkuIDkurrnmoQgdXNlcklkXG4gICAqIEBwYXJhbSB0eXBlIOWNleS6uuWRvOWPqyBvciDlpJrkurrlkbzlj6tcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDpgJror53lqpLkvZPnsbvlnos6IOmfs+mikSBvciDpn7Pop4bpopFcbiAgICogQHJldHVybnMgY2FsbElkIOWRvOWPq+aIkOWKn+WQju+8jOS6p+eUn+eahOS8muivnSBpZFxuICAgKi9cbiAgYXN5bmMgc3RhcnRDYWxsKHVzZXJJZHM6IHN0cmluZ1tdLCBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUgPSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSA9IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBjYWxsSWQ/OiBzdHJpbmcgfT4ge1xuICAgIHRoaXMuX2NsaWVudENhbGxJZCA9IGdldFVVSUQoKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfVCwgYHVzZXJJZHM6ICR7dXNlcklkcy5qb2luKCcsJyl9LCBjYWxsVHlwZTogJHtjYWxsVHlwZX0sIG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNUeXBlW2NhbGxUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIGNhbGxUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke2NhbGxUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c01lZGlhVHlwZVttZWRpYVR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgbWVkaWFUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y2V6IGKIHVzZXJJZHMg6ZW/5bqm5LiN6IO96LaF6L+HIDFcbiAgICAgKi9cbiAgICBpZiAodXNlcklkcy5sZW5ndGggPiAxICYmIGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIFlvdSBjYW4gb25seSBjYWxsIG9uZSBwZXJzb24gaW4gYSBzaW5nbGUgY2FsbCwgdXNlcklkczogJHt1c2VySWRzLmpvaW4oJywnKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5bey5a2Y5ZyoIHNlc3Npb24g5LiN5YWB6K645YaN5Y+R6LW35ZG85Y+rXG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1R9LCBzZXNzaW9uIGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TRVNTSU9OX0VYSVNUIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0TWVkaWFUcmFja3NDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnN0YXJ0Q2FsbCh7XG4gICAgICB0b1VzZXJzOiB1c2VySWRzLm1hcCgodXNlcklkKSA9PiAoeyB1c2VySWQgfSkpLFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NsaWVudENhbGxJZCxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX1NUQVJUX0NBTExfUywgY29kZSwgc3RhcnRUaW1lLCBudWxsLCB0aGlzLl9jbGllbnRDYWxsSWQsIG51bGwsIHsgbWVkaWFUeXBlLCBjYWxsVHlwZSwgY2FsbElkOiBkYXRhPy5jYWxsSWQgfHwgJycgfSk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWRvOWPq+i/h+eoi+S4reaMguaWrVxuICAgICAqL1xuICAgIGNvbnN0IHsgY2FsbElkLCBjbGllbnRDYWxsSWQgfSA9IGRhdGEhO1xuICAgIGlmICh0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID09PSBjbGllbnRDYWxsSWQpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuY2xlYXJBbGxUaW1lcihjYWxsSWQsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5oYW5ndXAoeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHRoZSAke2NhbGxJZH0gY2FsbCBoYXMgYmVlbiBoYW5ndXBgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLk1VTFRJKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBKU09OLnN0cmluZ2lmeSh7IGRhdGEsIGNvZGUgfSksIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIGNhbGxJZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeWKoOWFpei/m+ihjOS4reeahOe+pOe7hOmAmuivnVxuICAgKiBAcGFyYW0gY2FsbElkIOmAmuivnSBpZFxuICAgKi9cbiAgYXN5bmMgam9pbk11bHRpQ2FsbChjYWxsSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q29ubmVjdGlvblN0YXR1cygpICE9PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGU6IGdldFNlc3Npb25Db2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTZXNzaW9uKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChnZXRTZXNzaW9uQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBnZXQgY2FsbCBkYXRhIGVycm9yLCBjb2RlOiAke2dldFNlc3Npb25Db2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0U2Vzc2lvbkNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG1lZGlhVHlwZSB9ID0gZGF0YSE7XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbiAmJiBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSAhPT0gY2FsbElkKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TRVNTSU9OX0VYSVNUIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0TWVkaWFUcmFja3NDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuam9pbkNhbGwoe1xuICAgICAgY2FsbElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4remCgOivt+S7luS6ulxuICAgKiDljZXkurrpgJror53kuK3pgoDor7fku5bkurrkvJrlvJXlj5HpgJror53nsbvlnovlj5jmm7RcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+35Lq65YiX6KGoXG4gICAqIEByZXR1cm5zIGJ1c3lVc2VycyDov5Tlm57lv5nnur/kurrlkZjliJfooahcbiAgICovXG4gIGFzeW5jIGludml0ZSh1c2VySWRzOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGJ1c3lVc2Vycz86IFJDQ2FsbFBsdXNDYWxsVXNlcltdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9ULCBgY2FsbElkOiAke3VzZXJJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBwYXJhbXMgZXJyLCB1c2VySWRzOiBub3QgZW1wdHkgYXJyYXksIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+mCgOivt1xuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5pbnZpdGUoe1xuICAgICAgdG9Vc2VyczogdXNlcklkcy5tYXAoKHVzZXJJZCkgPT4gKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgfSkpLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBidXN5VXNlcnMgPSBbXTtcbiAgICBpZiAoZGF0YSEuYnVzeWxpbmVVc2Vycz8ubGVuZ3RoKSB7XG4gICAgICBidXN5VXNlcnMucHVzaCguLi5kYXRhIS5idXN5bGluZVVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgdXNlcklkOiB1c2VyLnVzZXJJZCxcbiAgICAgICAgc3RhdGU6IHVzZXIuc2Vzc2lvblN0YXR1cyxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHN1Y2Nlc3MgYnVzeVVzZXJzOiAke0pTT04uc3RyaW5naWZ5KGJ1c3lVc2Vycyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBidXN5VXNlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDpgJror50gaWRcbiAgICovXG4gIGFzeW5jIGFjY2VwdChjYWxsSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q29ubmVjdGlvblN0YXR1cygpICE9PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKblrZjlnKjpgJror51cbiAgICAgKiDpnIDku47lvZPliY3pgJror53ojrflj5YgbWVpZGFUeXBlXG4gICAgICovXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBjb25zdCBob2xkU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24oY2FsbElkKTtcbiAgICBpZiAoIW1haW5TZXNzaW9uICYmICFob2xkU2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWMuuWIhuaOpeWQrCBtYWluU2Vzc2lvbiDlkowgaG9sZFNlc3Npb25cbiAgICAgKiDlpoLmnpzmjqXlkKwgaG9sZFNlc3Npb27vvIzpnIDlhYjmjILmlq0gbWFpblNlc3Npb25cbiAgICAgKi9cbiAgICBjb25zdCBpc0FjY2VwdEhvbGRTZXNzaW9uID0gY2FsbElkID09PSBob2xkU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGlzQWNjZXB0SG9sZFNlc3Npb24pIHtcbiAgICAgIGNvbnN0IHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH0gPSBhd2FpdCB0aGlzLmhhbmd1cChtYWluU2Vzc2lvbiEuZ2V0Q2FsbElkKCkpO1xuICAgICAgaWYgKGhhbmd1cE1haW5TZXNzaW9uQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGhhbmd1cCBtYWluU2Vzc2lvbiBlcnJvciBjb2RlOiAke2hhbmd1cE1haW5TZXNzaW9uQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnVwZ3JhZGVNYWluU2Vzc2lvbihjYWxsSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmfs+inhumikemAmuivne+8jOmcgOaPkOWJjemHh+mbhumfs+inhumikei1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IG1haW5TZXNzaW9uIS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+aOpeWQrFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5hY2NlcHQoeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQ0NFUFRfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIG1haW5TZXNzaW9uISk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19pbm5lckhhbmd1cChvcHRzOiBJSGFuZ3VwRm9yQnVzeU9wdHMsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKHRydWUpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuY2xlYXJBbGxUaW1lcihjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmhhbmd1cChvcHRzLCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlID09PSBDYWxsU2VydmVyRXJyb3JDb2RlLkNBTExfTk9UX0VYSVNUKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY2FsbElkID09PSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg5Li65Y+v6YCJ5Y+C5pWw77yM5LiN5Lyg5pe277yM5oyC5pat5q2j5Zyo6L+b6KGM55qE5Li7IHNlc3Npb27vvIzkvKDlhaXml7blj6/mjIflrprmjILmlq3kuLvpgJror53miJbmmoLmnKrlu7rnq4vov57mjqXnmoTpgJror51cbiAgICog5pqC5pyq5bu656uL6L+e5o6l55qE6YCa6K+d77ya5oyH5bey5Zyo6YCa6K+d5Lit5pe277yM5pS25Yiw5ZG85Y+r5L2G5pqC5pyq5o6l5ZCs55qE6YCa6K+dXG4gICAqL1xuICBhc3luYyBoYW5ndXAoY2FsbElkPzogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmICghbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw57G75Z6L5qCh6aqMXG4gICAgICovXG4gICAgaWYgKGNhbGxJZCAmJiAhaXNTdHJpbmcoY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQ6IHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5TZXNzaW9uQ2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG5cbiAgICAvKipcbiAgICAgKiDmoKHpqozkvKDlhaXnmoQgY2FsbElkIOaYr+WQpuato+ehrlxuICAgICAqL1xuICAgIGlmIChjYWxsSWQgJiYgY2FsbElkICE9PSBtYWluU2Vzc2lvbkNhbGxJZCAmJiAhdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbihjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZCBpcyBpbnZhbGlkLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQUxMX0lEX0lOVkFMSUQgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc0xhdW5jaEhhbmd1cCA9IHRydWU7XG5cbiAgICB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID0gY2FsbElkIHx8IG1haW5TZXNzaW9uQ2FsbElkO1xuICAgIGNvbnN0IGhvbGRTZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbih0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkKTtcbiAgICBjb25zdCBoYW5ndXBTZXNzaW9uID0gaG9sZFNlc3Npb24gfHwgbWFpblNlc3Npb247XG5cbiAgICAvKipcbiAgICAgKiDojrflj5bmjILmlq3ml7bnmoTkurrlkZjns7vnu5/nirbmgIFcbiAgICAgKi9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSBtYWluU2Vzc2lvbi5nZXRVc2VyTGlzdCgpLmZpbHRlcigodXNlckluZm8pID0+IHVzZXJJbmZvLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZClbMF0uc3RhdGU7XG4gICAgY29uc3QgaXNDYWxsZWUgPSBbbWFpblNlc3Npb24uZ2V0Q3JlYXRvclVzZXJJZCgpLCBtYWluU2Vzc2lvbi5nZXRJbnZpdGVyVXNlcklkKCldLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGNvbnN0IHN5c3RlbVN0YXRlID0gZ2V0SGFuZ3VwU3lzdGVtU3RhdGUodXNlclN0YXRlLCBpc0NhbGxlZSk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX19pbm5lckhhbmd1cCh7IGNhbGxJZDogdGhpcy5fbmVlZEhhbmd1cENhbGxJZCwgc3lzdGVtU3RhdGUgfSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXmjILmlq3ln4vngrnmlbDmja5cbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19IQU5HVVBfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIGhhbmd1cFNlc3Npb24hLCB0aGlzLl9jbGllbnRDYWxsSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCBgc2lnbmFsIGVycm9yIGNvZGUgOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5Y+R6LW35aqS5L2T57G75Z6L5Y+Y5pu06K+35rGCXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Zyo5Y+W5raI5oiW5bqU562U5aqS5L2T57G75Z6L5YiH5o2i5pe25Lyg5YWlXG4gICAqL1xuICBhc3luYyByZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYW5zYWN0aW9uSWQ/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9ULCBgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuZ2V0Q3VycmVudENhbGxTZXNzaW9uKCk7XG4gICAgY29uc3Qgb2xkTWVkaWFUeXBlID0gbWFpblNlc3Npb24/LmdldE1lZGlhVHlwZSgpO1xuXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gb2xkTWVkaWFUeXBlKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk1FRElBVFlQRV9JTlZBTElEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUVESUFUWVBFX0lOVkFMSUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+WqkuS9k+exu+Wei+WIh+aNolxuICAgICAqL1xuICAgIGNvbnN0IHRvVXNlcklkcyA9IG1haW5TZXNzaW9uPy5nZXRVc2VyTGlzdCgpLmZpbHRlcigodXNlcikgPT4gdXNlci51c2VySWQgIT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpLm1hcCgodXNlcikgPT4gdXNlci51c2VySWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKHsgbWVkaWFUeXBlLCB0b1VzZXJJZHM6IHRvVXNlcklkcyB8fCBbXSB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHN1Y2Nlc3MgdHJhbnNhY3Rpb25JZDogJHtkYXRhIS50cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhbnNhY3Rpb25JZDogZGF0YSEudHJhbnNhY3Rpb25JZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOWIh+aNouWqkuS9k+exu+Wei+WPmOabtOivt+axglxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzkuLrlj5HotbflqpLkvZPnsbvlnovlj5jmm7Tor7fmsYLov5Tlm57nmoQgdHJhbnNhY3Rpb25JZFxuICAgKi9cbiAgYXN5bmMgY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKHRyYW5zYWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1QsIGB0cmFuc2FjdGlvbklkOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHRyYW5zYWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+W5raI5aqS5L2T57G75Z6L5YiH5o2iXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbmNlbENoYW5nZU1lZGlhVHlwZSh7IHRyYW5zYWN0aW9uSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovlj5jmm7TlupTnrZRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Li6IG9uUmVjZWl2ZWRDaGFuZ2VUb1ZpZGVvIOebkeWQrOaUtuWIsCB0cmFuc2FjdGlvbklkIOWPguaVsOWAvFxuICAgKi9cbiAgYXN5bmMgcmVwbHlDaGFuZ2VNZWRpYVR5cGUodHJhbnNhY3Rpb25JZDogc3RyaW5nLCBpc0FncmVlOiBib29sZWFuKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9ULCBgdHJhbnNhY3Rpb25JZDogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh0cmFuc2FjdGlvbklkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4oaXNBZ3JlZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbSBlcnJvciwgaXNBZ3JlZTogdHlwZSBpcyBib29sZWFuLCB2YWx1ZTogJHtpc0FncmVlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFncmVlOiBpc0FncmVlLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3ov5vooYzkuK3nmoTpgJror51cbiAgICogQHJldHVybnMgUkNDYWxsUGx1c1Nlc3Npb24g5a+56LGh5oiWIG51bGwg5Li65b2T5YmN5q2j5Zyo6L+b6KGM55qE6YCa6K+d5a+56LGhXG4gICAqL1xuICBnZXRDdXJyZW50Q2FsbFNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh5Zmo6I635Y+W5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqIEByZXR1cm5zIHJlY29yZHMg5LiA57uE5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBnZXRBdmFpbGFibGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcmVjb3Jkcz86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRPcGVuQ2FsbExpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHN1Y2Nlc3MsIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICByZWNvcmRzOiBkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YiG6aG15p+l5om+5b2T5YmN55So5oi355qE5YWo6YOo6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBzdGFydFRpbWVzdGFtcCDotbflp4vml7bpl7TmiLPvvIzov5Tlm57lpKfkuo7mraTml7bpl7TmiLPnmoTpgJror53orrDlvZVcbiAgICogQHBhcmFtIGNvdW50IOavj+asoeiOt+WPlueahOaVsOmHj1xuICAgKiBAcmV0dXJucyByZXN1bHQuaGFzTW9yZSDmmK/lkKbmnInmm7TlpJrpgJror53orrDlvZVcbiAgICogQHJldHVybnMgcmVzdWx0Lmxpc3Qg6YCa6K+d6K6w5b2V5YiX6KGo77yM57G75Z6L5Li6IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtd77yM5Y+v6YCa6L+HIGFwaURvYyDmn6XnnIvlhbfkvZPljIXlkKvlrZfmrrVcbiAgICogQHJldHVybnMgcmVzdWx0Lm1heFRpbWUg5YiX6KGo5Lit5pyA5aSn5pe26Ze05oiz77yM5aaC5p6cIGhhc01vcmUg5Li6IHRydWXvvIznu6fnu63ojrflj5bml7bvvIzkvKDlhaXmraTml7bpl7TmiLNcbiAgICovXG4gIGFzeW5jIGdldENhbGxSZWNvcmRzKHN0YXJ0VGltZXN0YW1wOiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByZXN1bHQ/OiBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19ULCBgc3RhcnRUaW1lc3RhbXA6ICR7c3RhcnRUaW1lc3RhbXB9LCBjb3VudDogJHtjb3VudH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghKGlzTnVtYmVyKHN0YXJ0VGltZXN0YW1wKSAmJiBzdGFydFRpbWVzdGFtcCA+PSAwKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgcGFyYW1zIGVycm9yLCBzdGFydFRpbWVzdGFtcDogaXMgYSBudW1iZXIgPj0gMCwgdmFsdWU6ICR7c3RhcnRUaW1lc3RhbXB9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmICghKGlzTnVtYmVyKGNvdW50KSAmJiBjb3VudCA+IDApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBwYXJhbXMgZXJyb3IsIGNvdW50OiBpcyBhIG51bWJlciA+PSAwLCB2YWx1ZTogJHtjb3VudH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxMb2dMaXN0KHtcbiAgICAgIHRpbWVzdGFtcDogc3RhcnRUaW1lc3RhbXAsXG4gICAgICBjb3VudCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHJlc3VsdDogZGF0YSEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOmbhuWQiOaJuemHj+WIoOmZpOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gY2FsbElkcyBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBkZWxldGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoY2FsbElkczogc3RyaW5nW10pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1QsIGBjYWxsSWRzOiAke2NhbGxJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KGNhbGxJZHMpXG4gICAgICAmJiBjYWxsSWRzLmV2ZXJ5KChjYWxsSWQpID0+IG5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZHM6IG5vdCBlbXB0eSBhcnJheSwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCBjYWxsSWRzOiAke0pTT04uc3RyaW5naWZ5KGNhbGxJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZGVsZXRlQ2FsbExvZyhjYWxsSWRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5riF56m65omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVtb3ZlQWxsQ2FsbExvZyh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0FMTF9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/mkYTlg4/lpLRcbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reaJk+W8gOaRhOWDj+WktO+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+aJk+W8gOaRhOWDj+WktOeahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKiBAcmV0dXJucyB0cmFjayDmkYTlg4/lpLTop4bpopHotYTmupBcbiAgICovXG4gIGFzeW5jIHN0YXJ0Q2FtZXJhKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaRhOWDj+WktOi1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYGNyZWF0ZSB2aWRlbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIHRydWUsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0cmFjaz8uaXNQdWJsaXNoZWQoKSAmJiB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnB1Ymxpc2hWaWRlb1RyYWNrKCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBwdWJsaXNoIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKiDmianmlaPlkK/nlKjotYTmupDmtojmga/vvIzlpoLmnpzlpLHotKXvvIzliJkgc3RhcnRDYW1lcmEg6KGM5Li65aSx6LSlXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiB1bm11dGVDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZW5hYmxlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAodW5tdXRlQ29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MgJiYgdW5tdXRlQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHt1bm11dGVDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogdW5tdXRlQ29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgYXN5bmMgc3RvcENhbWVyYSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5kaXNhYmxlVmlkZW9UcmFjaygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1IsIGBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lUcmFjayh0cmFjayEpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBmYWxzZSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIfmjaLmkYTlg4/lpLRcbiAgICog5YiH5o2i5oiQ5Yqf5ZCOIGBJQ2FsbFBsdXNFdmVudExpc3RlbmVyYCDnm5HlkKzlmajnmoQgYG9uVXNlck1lZGlhQXZhaWxhYmxlYCDkuK3kvJrmlLbliLDmlrDliIfmjaLnmoTmkYTlg4/lpLTotYTmupDlj6/mkq3mlL7vvIzmraTml7bosIPnlKggYGNhbGxQbHVzQ2xpZW50LnBsYXlNZWRpYSgpYCDlj6/mmL7npLrmlrDmkYTlg4/lpLTnmoTnlLvpnaJcbiAgICogQHBhcmFtIGNhbWVyYUlkIOa1j+iniOWZqOS4reWPluW+l+eahOaRhOWDj+WktOiuvuWkhyBpZO+8jOWPr+iwgyBwbHVnaW4tcnRjIOeahCBnZXRDYW1lcmFzIOaWueazleWPluW+l1xuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d5YmN5ZKM6YCa6K+d5Lit6YO95Y+v6LCD55SoXG4gICAqL1xuICBhc3luYyBzd2l0Y2hDYW1lcmEoY2FtZXJhSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1QsIGBjYW1lcmFJZDogJHtjYW1lcmFJZH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FtZXJhSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBwYXJhbSBlcnJvciwgY2FtZXJhSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbWVyYUlkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfVklERU9fQ0FMTH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9WSURFT19DQUxMIH07XG4gICAgfVxuXG4gICAgdGhpcy5fdmlkZW9Db25maWcuY2FtZXJhSWQgPSBjYW1lcmFJZDtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGNhbGwgY2xpZW50IGNoYW5nZVZpZGVvRGV2aWNlIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+m6puWFi+mjjlxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5omT5byA6bqm5YWL6aOO77yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5omT5byA6bqm5YWL6aOO55qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqL1xuICBhc3luYyBzdGFydE1pY3JvcGhvbmUoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgY3JlYXRlIG1pY3JvcGhvbmUgYXVkaW8gdHJhY2sgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPLCB0cnVlLCB0cmFjZUlkKTtcblxuICAgIGlmICghdHJhY2shLmlzT3duZXJNdXRlZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB1bm11dGVDb2RlID0gYXdhaXQgdHJhY2shLnVubXV0ZSgpO1xuICAgIGlmICh1bm11dGVDb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHVubXV0ZUNvZGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YWz6Zet6bqm5YWL6aOOXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3lhbPpl63puqblhYvpo47vvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/lhbPpl63puqblhYvpo47nmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICovXG4gIGFzeW5jIHN0b3BNaWNyb3Bob25lKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5kaXNhYmxlQXVkaW9UcmFjaygpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTICYmIGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIGZhbHNlLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOm6puWFi+mjjuaYr+WQpuW8gOWQr1xuICAgKi9cbiAgaXNNaWNyb3Bob25lRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICByZXR1cm4gISF0cmFjayAmJiAhdHJhY2suaXNPd25lck11dGVkKCk7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5omA5pyJ6L+c56uv6Z+z6aKR5rWB5piv5ZCm5Y+v55SoXG4gICAqIEBwYXJhbSBlbmFibGUg5Li6IHRydWUg5pe277yM5ZCv55So5omA5pyJ6L+c56uv6Z+z6aKR5rWB77yb5Li6IGZhbHNlIOaXtu+8jOmdmemfs+aJgOaciei/nOerr+mfs+mikea1gVxuICAgKi9cbiAgYXN5bmMgc2V0QWxsUmVtb3RlQXVkaW9FbmFibGUoZW5hYmxlOiBib29sZWFuKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3J0Y01vZHVsZS5zZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBTREsg54mI5pys5L+h5oGvXG4gICAqIEByZXR1cm5zIFNESyDniYjmnKzlj7dcbiAgICovXG4gIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gX19WRVJTSU9OX187XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5pGE5YOP5aS05YiX6KGoXG4gICAqL1xuICBhc3luYyBnZXRDYW1lcmFzKCkge1xuICAgIGNvbnN0IGNhbWVyYXMgPSBhd2FpdCBkZXZpY2UuZ2V0Q2FtZXJhcygpO1xuICAgIHJldHVybiBjYW1lcmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlum6puWFi+mjjuWIl+ihqFxuICAgKi9cbiAgYXN5bmMgZ2V0TWljcm9waG9uZXMoKSB7XG4gICAgY29uc3QgbWljcm9waG9uZXMgPSBhd2FpdCBkZXZpY2UuZ2V0TWljcm9waG9uZXMoKTtcbiAgICByZXR1cm4gbWljcm9waG9uZXM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1VuZGVmaW5lZCwgTG9nTGV2ZWwsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IElSQ0NhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7IElWYWxpZGF0ZVJlcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lciwgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcblxuLyoqXG4gKiDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlSW5pdE9wdHMgPSAob3B0czogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRlUmVzID0+IHtcbiAgaWYgKCFvcHRzKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIG1pc3NpbmcgcGFyYW1ldGVyIC0+IG9wdGlvbnMnIH07XG4gIH1cbiAgaWYgKCFpc09iamVjdChvcHRzKSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdHMpO1xuICAvLyDlv4XkvKDlj4LmlbDpqozor4FcbiAgaWYgKCFrZXlzLmluY2x1ZGVzKCdydGNDbGllbnQnKSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5TVEFMTF9SVENfUExVR0lOIH07XG4gIH1cbiAgaWYgKCFpc09iamVjdChvcHRzLnJ0Y0NsaWVudCkpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgaXNMZWdhbDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiByZWdpc3RlckNhbGxFdmVudExpc3RlbmVyIOWPguaVsOagoemqjFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcik6IElWYWxpZGF0ZVJlcyA9PiB7XG4gIGlmICghbGlzdGVuZXIpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnbWlzc2luZyBwYXJhbWV0ZXIgLT4gbGlzdGVuZXInIH07XG4gIH1cblxuICAvLyDmoKHpqozmmK/lkKbnvLrlsJHlv4XopoHnm5HlkKzlm57osIPms6jlhoxcbiAgY29uc3QgcmVxdWlyZWRLZXlzID0gWydvbkludml0ZScsICdvblNlc3Npb25DbG9zZScsICdvblJlbW90ZVRyYWNrUmVhZHknXTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhsaXN0ZW5lcik7XG4gIGNvbnN0IG1pc3NpbmdLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICByZXF1aXJlZEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIG1pc3NpbmdLZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuICBpZiAobWlzc2luZ0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogYG1pc3NpbmcgcGFyYW1ldGVyIC0+IFwiJHttaXNzaW5nS2V5cy5qb2luKCcsJyl9XCJgIH07XG4gIH1cblxuICBsZXQgcmVzOiBJVmFsaWRhdGVSZXMgPSB7IGlzTGVnYWw6IHRydWUgfTtcblxuICAvLyDmoKHpqozlv4XopoHnm5HlkKzmmK/lkKbmmK8gZnVuY3Rpb24g57G75Z6LXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWlyZWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcmVxdWlyZWRLZXlzW2ldO1xuICAgIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcls8a2V5b2YgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcj5rZXldKSkge1xuICAgICAgcmVzID0geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiBgJyR7a2V5fScgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSAnZnVuY3Rpb24nYCB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgaXNVbmRlZmluZWQsIExvZ0wsIFBsdWdpbkNvbnRleHQsIFZlcnNpb25NYW5hZ2UsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDbGllbnQgfSBmcm9tICcuL2NvcmUvYXBpL1JDQ2FsbFBsdXNDbGllbnQnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL2NvcmUvbW9kdWxlcy9SQ0NhbGxQbHVzU2Vzc2lvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZUluaXRPcHRzIH0gZnJvbSAnLi9jb3JlL3V0aWxzL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSUNhbGxQbHVzSW5pdE9wdHMgfSBmcm9tICcuL2NvcmUvYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9jb3JlL2FwaS9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9jb3JlL2FwaS9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9jb3JlL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbFBsdXNDbGllbnQsIElDYWxsUGx1c0luaXRPcHRzPiA9IHtcbiAgdGFnOiAnUkNDYWxsUGx1cycsXG4gIHZlcmlmeShydW50aW1lOiBJUnVudGltZSkge1xuICAgIFZlcnNpb25NYW5hZ2UuYWRkKCdwbHVnaW4tY2FsbC1wbHVzJywgX19WRVJTSU9OX18pO1xuICAgIGlmICghVmVyc2lvbk1hbmFnZS52YWxpZEVuZ2luZShfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX18pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBUaGUgY3VycmVudCBlbmdpbmUgdmVyc2lvbiAnJHtWZXJzaW9uTWFuYWdlLmdldEluZm8oKS5lbmdpbmV9JyBlcnJvciwgcGx1Z2luLWNhbGwtcGx1cyByZXF1aXJlZCBlbmdpbmUgdmVyc2lvbiBhdCBsZWFzdCAnJHtfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX199Jy5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgc2V0dXAoY29udGV4dDogUGx1Z2luQ29udGV4dCwgcnVudGltZTogSVJ1bnRpbWUsIG9wdGlvbnM6IElDYWxsUGx1c0luaXRPcHRzKTogUkNDYWxsUGx1c0NsaWVudCB7XG4gICAgLy8g5Yid5aeL5YyW5Y+C5pWw5qCh6aqMXG4gICAgY29uc3QgdmFsaWRhdGVSZXMgPSB2YWxpZGF0ZUluaXRPcHRzKG9wdGlvbnMpO1xuICAgIGlmICghdmFsaWRhdGVSZXMuaXNMZWdhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbQ2FsbFBsdXNMaWIgaW5zdGFsbGVyIHN0ZXVwXSR7dmFsaWRhdGVSZXMubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOWIm+W7uiBlbmdpbmUgbG9nZ2VyXG4gICAgY29uc3QgZW5naW5lTG9nZ2VyID0gY29udGV4dC5jcmVhdGVMb2dnZXIoJ0NhbGxQbHVzTGliJywgJ1JUQycpO1xuICAgIC8vIOiuvue9riDovpPlh7rnuqfliKtcbiAgICBjb25zdCBvdXRwdXRMZXZlbCA9IGlzVW5kZWZpbmVkKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwpID8gTG9nTC5XQVJOIDogb3B0aW9ucy5sb2dPdXRwdXRMZXZlbDtcbiAgICBlbmdpbmVMb2dnZXIuc2V0T3V0cHV0TGV2ZWwob3V0cHV0TGV2ZWwhKTtcbiAgICBlbmdpbmVMb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08sIGBDYWxsUGx1cyBWZXJzaW9uOiAke19fVkVSU0lPTl9ffSwgQ29tbWl0OiAke19fQ09NTUlUX0lEX199YCk7XG5cbiAgICByZXR1cm4gbmV3IFJDQ2FsbFBsdXNDbGllbnQoY29udGV4dCwgZW5naW5lTG9nZ2VyLCBydW50aW1lLCBvcHRpb25zKTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7XG4gIGluc3RhbGxlcixcbiAgLyogY2xhc3MgKi9cbiAgUkNDYWxsUGx1c0NsaWVudCxcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQXVkaW9Db25maWdCdWlsZGVyLFxuICBSQ1ZpZGVvQ29uZmlnQnVpbGRlcixcbn07XG4vKipcbiAqIOWvvOWHuuaemuS4vuWSjOaOpeWPo+WumuS5iVxuICovXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvYXBpL2ludGVyZmFjZSc7XG4iXSwibmFtZXMiOlsiUkNDYWxsUGx1c0NvZGUiLCJSQ0NhbGxQbHVzTG9nZ2VyVGFnIiwiUkNDYWxsUGx1c1Nlc3Npb24iLCJfc2Vzc2lvbiIsIl9jYWxsRW5naW5lIiwiX2xvZ2dlciIsIl9fcHVibGljRmllbGQiLCJ1c2VyIiwidXNlcklkIiwidXNlclN0YXRlIiwiY2FtZXJhRW5hYmxlIiwibWljcm9waG9uZUVuYWJsZSIsInRyYWNlSWQiLCJjb2RlIiwiY2xpZW50U3RhcnRUaW1lIiwiZGF0YSIsIlJDQ2FsbFBsdXNUeXBlIiwiUkNDYWxsUGx1c1R5cGUyIiwiUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlIiwiUkNDYWxsUGx1c01lZGlhVHlwZTIiLCJSQ0NhbGxQbHVzQ2FsbFN0YXRlIiwiUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCIsIlJDQ2FsbFBsdXNSZWFzb24iLCJSQ0F1ZGlvQ29uZmlnQnVpbGRlciIsIm1pY3JvcGhvbmVJZCIsIm1pbiIsIm1heCIsImlzTnVtYmVyIiwic2FtcGxlUmF0ZSIsIlJDVmlkZW9Db25maWdCdWlsZGVyIiwiUkNDYWxsUGx1c1Jlc29sdXRpb24iLCJSQ0NhbGxQbHVzRnJhbWVSYXRlIiwiZnBzIiwicmVzb2x1dGlvbiIsImNhbWVyYUlkIiwidHJhbjJDYWxsTG9nIiwiY2FsbExvZ0xpc3QiLCJjYWxsSWQiLCJjYWxsVHlwZSIsImNhbGxEaXIiLCJtZWRpYVR5cGUiLCJjYWxsaW5nVXNlcklkIiwiY2FsbFVzZXJJZHMiLCJjYWxsU3RhdHVzIiwic2Vzc2lvblN0YXR1cyIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsInNlY3JldENoYXQiLCJzeW5jVGltZSIsInN5c1N0YXR1cyIsImNydFRpbWUiLCJwYXJzZVN0YXR1c0RhdGEiLCJyaW5naW5nRGF0YSIsImhhbmd1cERhdGEiLCJhY2NlcHREYXRhIiwib3RoZXJJbnZpdGVkRGF0YSIsIml0ZW0iLCJ2YWxpZGF0ZVZpZGVvTm9kZU5hbWUiLCJlbGVtZW50IiwidmFsaWRhdGVTeXNTdGF0ZSIsImNydFN0YXRlIiwibmV3U3RhdGUiLCJpc0luVmFsaWQiLCJpbnZhbGlkU3RhdGVzIiwidmFsaWRhdGVVc2VyU3RhdGUiLCJnZXRIYW5ndXBTeXN0ZW1TdGF0ZSIsImlzQ2FsbGVlIiwic3lzdGVtU3RhdGUiLCJpc1N1cHBvcnRNZWRpYVNlcnZlciIsIm5hdmlJbmZvIiwidm9pcENhbGxJbmZvIiwic3RyYXRlZ3kiLCJ2YWxpZGF0ZUJpdHJhdGUiLCJtaW5CaXRyYXRlIiwibWF4Qml0cmF0ZSIsImdldFVzZXJWaWRlb1ZpZXdJbmZvIiwidXNlclZpZXdNYXAiLCJ1c2VyVmlld01hcEluZm8iLCJ2aWRlb1ZpZXciLCJpc1RpbnkiLCJSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyIsIlJDQ2FsbFBMdXNTdGF0aXN0aWNzIiwiX2NvbnRleHQiLCJ0YWciLCJzZXNzaW9uIiwiY2xpZW50Q2FsbElkIiwiaW52aXRlU291cmNlIiwiZXh0cmEiLCJub3dUaW1lIiwiY29tbW9uRGF0YSIsIkRpYWxvZ0FjdGlvbiIsIkRpYWxvZ1R5cGUiLCJTZWNyZXRDYWxsVHlwZSIsIlNlY3JldENhbGxUeXBlMiIsIkNhbGxUaW1lckV2ZW50VHlwZSIsIlJDQ2FsbElubmVyU2Vzc2lvbiIsIkV2ZW50RW1pdHRlciIsIl9jYWxsSWQiLCJfc3RhdGUiLCJfY2FsbFR5cGUiLCJfbWVkaWFUeXBlIiwiX3N0YXJ0Q2FsbGVySWQiLCJfY2FsbGVySWQiLCJfY2FsbFVzZXJzIiwiZW5hYmxlIiwidXNlcnMiLCJjaGFuZ2VkVXNlcnMiLCJuZXdVc2VyU3RhdGUiLCJuZXdTdGF0ZVRpbWUiLCJuZXdTeXNTdGF0ZSIsImhhc1VzZXIiLCJpIiwib2xkU3RhdGVUaW1lIiwib2xkU3lzdGVtU3RhdGUiLCJvbGRVc2VyU3RhdGUiLCJpc0ludmFsaWRTeXNTdGF0ZSIsImlzSW52YWxpZFVzZXJTdGF0ZSIsImlzSW52YWxpZE9ucGhvbmVFbmQiLCJlcnIiLCJzdGF0ZSIsInR5cGUiLCJ0aW1lcklkIiwiaXNMb2NhbENsaWVudEhhbmd1cCIsIkNhbGxTZXJ2ZXJBY3Rpb24iLCJ0aW1lclNldFRpbWVvdXQiLCJmdW5jIiwidGltZW91dCIsInNsZWVwIiwibWlsbGlzZWNvbmQiLCJyZXNvbHZlIiwibmVlZFJldHJ5Q29kZSIsIkVycm9yQ29kZSIsIlJDUlRDQ29kZSIsInJldHJ5QXN5bmNGbiIsImFzeW5jRm4iLCJmbkFyZ3MiLCJjdXJyZW50UmV0cnlUaW1lIiwibWF4RHVyYXRpb24iLCJpbnRlcnZhbHMiLCJpbmRleCIsIm9uRXJyb3IiLCJyZXMiLCJpdHYiLCJDYWxsSG9va3NUeXBlIiwiUHViSW52aXRlQ2FsbE1pc3NSZWFzb24iLCJQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIiwiU2lnbmFsVHJhbnNwb3J0ZXIiLCJfcnVudGltZSIsIl9pbml0T3B0cyIsIl90aW1lQ29ycmVjdGlvbmVyIiwiZ2V0VVVJRDIyIiwibGlzdGVuZXIiLCJtc2ciLCJ0b1VzZXJzIiwidGFyZ2V0VHlwZSIsInRhcmdldElkIiwibmlja05hbWUiLCJvbGRSb29tSWQiLCJjYWxsSWRzIiwib3B0cyIsIlJDQ29ubmVjdGlvblN0YXR1cyIsImtleSIsIm9wdGlvbnMiLCJ2YWx1ZSIsInJlc3VsdCIsInNlcnZlcktleSIsInNlcnZlclZhbCIsInBhcnNlZERhdGEiLCJpbmZvIiwiZGV2aWNlSWQiLCJpc051bGwiLCJpc1N0cmluZyIsImlzRGlyZWN0bHkiLCJjdXJyZW50VUlkIiwiY3VycmVudFVzZXIiLCJkaWFsb2dUeXBlIiwiYWN0aW9uIiwiZXh0cmFLZXlWYWwiLCJjYWxsU2Vzc2lvblVzZXJzIiwidG9EZXZpY2VJZCIsImNhbGxEaWFsb2dFbnRpdHlzIiwic3RyaW5nMTB0bzY0IiwibnVtYmVyIiwiY2hhcnMiLCJyYWRpeCIsInF1dGllbnQiLCJhcnIiLCJtb2QiLCJnZXRVVUlEIiwiYyIsInIiLCJ1dWlkIiwiQ0FMTF9EQl9OQU1FIiwiREJfVkVSU0lPTiIsImxvZ2dlciIsIl9SQ0NhbGxJbmRleERCIiwicmVxIiwiZXYiLCJvYmpOYW1lIiwiX2EiLCJ2YWwiLCJyZWplY3QiLCJSQ0NhbGxJbmRleERCIiwiQWJub3JtYWxDYWxsIiwib2JqU3RvcmUiLCJ1c2VyQWJub3JtYWxDYWxsSWRzIiwiaWQiLCJDYWxsU2VydmVyRXZlbnRUeXBlIiwiUkNDYWxsUGx1c0lubmVyQ29kZSIsIlRpbWVDb3JyZWN0aW9uZXIiLCJfc2luZ2xlQ2FsbER1cmF0aW9uRXYiLCJzZXJ2ZXJTdGFydFRpbWUiLCJjdXJyZW50UlRUIiwiY2xpZW50Rmlyc3RGcmFtZVRpbWUiLCJGb3J3YXJkVHlwZSIsIlJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UiLCJSQ0NhbGxEaXJlY3Rpb24iLCJDQUxMX1RJTUVfT1VUIiwiX1JDQ2FsbEVuZ2luZSIsIl9yZXBvcnRBcHBFdmVudE1vZHVsZSIsImN1cnJlbnRVc2VySWQiLCJidXN5bGluZVVzZXJzIiwiaW52aXRlclRpbWVySWQiLCJzZWxmU3RhdGUiLCJpbnZpdGVlc1N0YXRlIiwiYnVzeVVzZXJzU3RhdGUiLCJidXN5VXNlcklkIiwiaW52aXRlZFVzZXJzU3RhdGUiLCJidXN5bGluZVVzZXJzU3RhdGUiLCJ0cmFuc2FjdGlvbklkIiwicmVxTWVkaWFUeXBlIiwiY2FsbExvZyIsInJlc0RhdGEiLCJsaXN0IiwidXNlclNlc3Npb25TdGF0dXMiLCJjYWxsRGlyZWN0aW9uIiwic2Vzc2lvblVzZXJzIiwiaW5uZXJTZXNzaW9uIiwibmV3VXNlcnMiLCJpc0lkbGUiLCJub3ciLCJkZWxheVRpbWUiLCJzdHJlYW1SZWFkeVRpbWUiLCJjdXJyZW50VXNlclN5c3RlbVN0YXRlIiwiaG9sZENhbGxJZCIsInN0YXRlVGltZSIsImludml0ZVVzZXJJZCIsImludml0ZWVUaW1lcklkIiwiY2FsbFBsdXNTZXNzaW9uIiwib3RoZXJzU3RhdGUiLCJzdGF0dXNUaW1lIiwib3RoZXJJbnZpdGVkTWVtYmVyIiwiX2IiLCJfYyIsImludml0ZWRNZW1iZXIiLCJ1c2Vyc1N0YXRlIiwiY2FsbFNlc3Npb25hU3RhdHVzIiwic2Vzc2lvblN0YXRlIiwidW5OZWVkVXBTdGF0ZSIsInN0YXJ0Q2FsbGVySWQiLCJfZCIsInNlbGZFbmQiLCJzdGF0ZXMiLCJpc01haW5TZXNzaW9uIiwiY3VycmVudFVzZXJTYXRlIiwiZXZlbnRUaW1lIiwiZXZlbnRBcmdzIiwiZXZlbnRUeXBlIiwiZnJvbVVzZXJJZCIsImZpcnN0RnJhbWVUaW1lIiwicHJvbW90ZXJJZCIsInJlYXNvbiIsImN1cnJlbnRDYWxsSWQiLCJvbGRUcmFuc0lkIiwib2xkQWN0aW9uIiwiT2xkTWVkaWFUeXBlIiwiY2hhbmdlTWVkaWFUeXBlUmVzdWx0IiwiX2UiLCJpc1NlbGZIYW5ndXAiLCJjbG9zZWRTZXNzaW9uIiwiY3J0VXNlckRhdGEiLCJoYW5ndXBSZWFzb24iLCJpc05lZWRVcCIsImludml0ZXJVc2VySWQiLCJSQ0NhbGxFbmdpbmUiLCJSVENSZXNvdXJjZVRhZyIsIl9SVENNb2R1bGUiLCJkZWZhdWx0VmlkZW9UcmFjayIsInRyYWNrIiwiZGVmYXVsdEF1ZGlvVHJhY2siLCJ2aWRlb0NvbmZpZyIsImF1ZGlvQ29uZmlnIiwiaXNCb29sZWFuIiwibG9jYWxUcmFjayIsInJvb20iLCJyb29tVXNlcnNJZCIsImVycm9yIiwicHViUGFyYW1zIiwiY3VycmVudFJvb21JZCIsInJlY2VudFRyYWNrcyIsImxvY2FsVHJhY2tzIiwibmVlZERlc3Ryb3lUcmFjayIsIm5ld1RyYWNrIiwidHJhY2tzIiwiUlRDTW9kZSIsInN1YlRpbnkiLCJieVNlcnZlciIsInVzZXJJZHMiLCJ2aWRlb1RyYWNrIiwiYXVkaW9UcmFjayIsImF1ZGlvTGV2ZWxSZXBvcnRMaXN0Iiwicm9vbUlkIiwia2lja0V4dHJhIiwiUkNLaWNrUmVhc29uIiwibmVlZFN1YlRyYWNrcyIsInJlcG9ydCIsInNlbmRlcnMiLCJyZWNlaXZlcnMiLCJraW5kIiwicGFja2V0c0xvc3RSYXRlIiwicnR0IiwidHJhY2tJZCIsImJpdHJhdGUiLCJoZWxwZXIiLCJsb2NhbFZpZGVvVHJhY2siLCJsb2NhbEF1ZGlvVHJhY2siLCJSQ0xvY2FsVHJhY2siLCJ2aWRlb0VsZW1lbnQiLCJzdWJQYXJhbXMiLCJ1bnN1YlRyYWNrcyIsIlJUQ01vZHVsZSIsIlJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUiLCJldmVudE5hbWUiLCJhdHRycyIsImhhbmRsZSIsImludml0ZWVVc2VyTGlzdCIsInJlY29yZCIsImNhbGxGaXJzdEZyYW1lVGltZSIsImF1ZGlvTGV2ZWwiLCJDYWxsU2VydmVyRXJyb3JDb2RlIiwiUkNDYWxsUGx1c0NsaWVudCIsIm5ld1Nlc3Npb24iLCJtYWluU2Vzc2lvbiIsIm5vdEVtcHR5QXJyYXkiLCJub3RFbXB0eVN0cmluZyIsImlzVW5kZWZpbmVkIiwiY2ZnIiwiZnJhbWVSYXRlIiwiZXJyb3JNc2ciLCJnZXRNZWRpYVRyYWNrc0NvZGUiLCJnZXRTZXNzaW9uQ29kZSIsImJ1c3lVc2VycyIsImhvbGRTZXNzaW9uIiwiaGFuZ3VwTWFpblNlc3Npb25Db2RlIiwibWFpblNlc3Npb25DYWxsSWQiLCJoYW5ndXBTZXNzaW9uIiwidXNlckluZm8iLCJvbGRNZWRpYVR5cGUiLCJ0b1VzZXJJZHMiLCJpc0FncmVlIiwic3RhcnRUaW1lc3RhbXAiLCJjb3VudCIsInVubXV0ZUNvZGUiLCJkZXZpY2UiLCJ2YWxpZGF0ZUluaXRPcHRzIiwiaXNPYmplY3QiLCJpbnN0YWxsZXIiLCJydW50aW1lIiwiVmVyc2lvbk1hbmFnZSIsImNvbnRleHQiLCJ2YWxpZGF0ZVJlcyIsImVuZ2luZUxvZ2dlciIsIm91dHB1dExldmVsIiwiTG9nTCJdLCJtYXBwaW5ncyI6IjZnQkFHTyxNQUFNQSxFQUFpQixDQUk1QixRQUFTLEVBSVQsWUFBYSxNQUliLGNBQWUsTUFJZixZQUFhLE1BSWIsa0JBQW1CLE1BSW5CLGVBQWdCLE1BSWhCLHdCQUF5QixNQUl6QixrQkFBbUIsTUFJbkIsZ0JBQWlCLE1BSWpCLHVCQUF3QixNQUl4QixnQkFBaUIsTUFJakIscUNBQXNDLE1BSXRDLG9CQUFxQixNQUlyQixjQUFlLE1BSWYsa0JBQW1CLE1BSW5CLHdCQUF5QixNQUl6Qix1QkFBd0IsTUFJeEIsa0JBQW1CLE1BSW5CLG1CQUFvQixLQUN0QixFQ2hGWSxJQUFBQyxHQUFBQSxJQUNWQSxFQUFBLG1DQUFxQyxxQ0FJckNBLEVBQUEsdUNBQXlDLHlDQUl6Q0EsRUFBQSx3Q0FBMEMsMENBSTFDQSxFQUFBLCtDQUFpRCxpREFDakRBLEVBQUEsZ0RBQWtELGtEQUlsREEsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHFDQUF1Qyx1Q0FDdkNBLEVBQUEseUNBQTJDLDJDQUMzQ0EsRUFBQSx5Q0FBMkMsMkNBQzNDQSxFQUFBLHNDQUF3Qyx3Q0FJeENBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHNDQUF3Qyx3Q0FDeENBLEVBQUEsMENBQTRDLDRDQUk1Q0EsRUFBQSw0QkFBOEIsOEJBQzlCQSxFQUFBLDRCQUE4Qiw4QkFJOUJBLEVBQUEsK0JBQWlDLGlDQUNqQ0EsRUFBQSwrQkFBaUMsaUNBSWpDQSxFQUFBLG9DQUFzQyxzQ0FJdENBLEVBQUEsb0NBQXNDLHNDQUl0Q0EsRUFBQSwyQkFBNkIsNkJBSTdCQSxFQUFBLDJCQUE2Qiw2QkFJN0JBLEVBQUEsMkJBQTZCLDZCQUM3QkEsRUFBQSwyQkFBNkIsNkJBSTdCQSxF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