mailgun.js 4.1.5 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +128 -27
  3. package/dist/lib/domains.d.ts +4 -1
  4. package/dist/lib/domainsTags.d.ts +34 -0
  5. package/dist/lib/interfaces/DomainTags.d.ts +228 -0
  6. package/dist/mailgun.node.js +2 -2
  7. package/dist/mailgun.node.js.LICENSE.txt +1 -1
  8. package/dist/mailgun.web.js +2 -2
  9. package/dist/mailgun.web.js.LICENSE.txt +1 -1
  10. package/docs/.nojekyll +1 -0
  11. package/docs/assets/highlight.css +127 -0
  12. package/docs/assets/icons.css +1043 -0
  13. package/docs/assets/{images/icons.png → icons.png} +0 -0
  14. package/docs/assets/{images/icons@2x.png → icons@2x.png} +0 -0
  15. package/docs/assets/main.js +52 -0
  16. package/docs/assets/search.js +1 -0
  17. package/docs/assets/style.css +1413 -0
  18. package/docs/assets/{images/widgets.png → widgets.png} +0 -0
  19. package/docs/assets/{images/widgets@2x.png → widgets@2x.png} +0 -0
  20. package/docs/classes/client.default.html +1 -0
  21. package/docs/classes/domains.Domain.html +1 -0
  22. package/docs/classes/domains.default.html +1 -0
  23. package/docs/classes/domainsCredentials.default.html +1 -0
  24. package/docs/classes/domainsTemplates.DomainTemplateItem.html +1 -0
  25. package/docs/classes/domainsTemplates.default.html +1 -0
  26. package/docs/classes/error.default.html +6 -0
  27. package/docs/classes/events.default.html +1 -0
  28. package/docs/classes/ip_pools.default.html +1 -0
  29. package/docs/classes/ips.default.html +1 -0
  30. package/docs/classes/lists.default.html +1 -0
  31. package/docs/classes/mailListMembers.default.html +1 -0
  32. package/docs/classes/messages.default.html +1 -0
  33. package/docs/classes/multipleValidation.default.html +1 -0
  34. package/docs/classes/request.default.html +1 -0
  35. package/docs/classes/routes.default.html +1 -0
  36. package/docs/classes/stats.default.html +1 -0
  37. package/docs/classes/suppressions.default.html +1 -0
  38. package/docs/classes/validate.default.html +1 -0
  39. package/docs/classes/webhooks.default.html +1 -0
  40. package/docs/enums/interfaces_DomainTemplates.Pages.html +1 -0
  41. package/docs/enums/interfaces_DomainTemplates.YesNo.html +1 -0
  42. package/docs/index.html +1140 -1308
  43. package/docs/interfaces/interfaces_APIErrorOptions.default.html +1 -0
  44. package/docs/interfaces/interfaces_ApiResponse.default.html +1 -0
  45. package/docs/interfaces/interfaces_DomainCredentials.CreatedUpdatedDomainCredentialsResponse.html +1 -0
  46. package/docs/interfaces/interfaces_DomainCredentials.DeletedDomainCredentialsResponse.html +1 -0
  47. package/docs/interfaces/interfaces_DomainCredentials.DomainCredentials.html +1 -0
  48. package/docs/interfaces/interfaces_DomainCredentials.DomainCredentialsItem.html +1 -0
  49. package/docs/interfaces/interfaces_DomainCredentials.DomainCredentialsList.html +1 -0
  50. package/docs/interfaces/interfaces_DomainCredentials.DomainCredentialsQuery.html +1 -0
  51. package/docs/interfaces/interfaces_DomainCredentials.DomainCredentialsResponseData.html +1 -0
  52. package/docs/interfaces/interfaces_DomainCredentials.DomainCredentialsResult.html +1 -0
  53. package/docs/interfaces/interfaces_DomainCredentials.IDomainCredentials.html +1 -0
  54. package/docs/interfaces/interfaces_DomainCredentials.UpdateDomainCredentialsData.html +1 -0
  55. package/docs/interfaces/interfaces_DomainTemplates.CreateDomainTemplateAPIResponse.html +1 -0
  56. package/docs/interfaces/interfaces_DomainTemplates.CreateDomainTemplateVersionAPIResponse.html +1 -0
  57. package/docs/interfaces/interfaces_DomainTemplates.CreateDomainTemplateVersionResult.html +1 -0
  58. package/docs/interfaces/interfaces_DomainTemplates.DomainTemplate.html +1 -0
  59. package/docs/interfaces/interfaces_DomainTemplates.DomainTemplateData.html +1 -0
  60. package/docs/interfaces/interfaces_DomainTemplates.DomainTemplateUpdateData.html +1 -0
  61. package/docs/interfaces/interfaces_DomainTemplates.DomainTemplateUpdateVersionData.html +1 -0
  62. package/docs/interfaces/interfaces_DomainTemplates.DomainTemplateVersionData.html +1 -0
  63. package/docs/interfaces/interfaces_DomainTemplates.DomainTemplatesQuery.html +1 -0
  64. package/docs/interfaces/interfaces_DomainTemplates.GetDomainTemplateAPIResponse.html +1 -0
  65. package/docs/interfaces/interfaces_DomainTemplates.IDomainTemplatesClient.html +1 -0
  66. package/docs/interfaces/interfaces_DomainTemplates.ListDomainTemplateVersionsAPIResponse.html +1 -0
  67. package/docs/interfaces/interfaces_DomainTemplates.ListDomainTemplateVersionsResult.html +1 -0
  68. package/docs/interfaces/interfaces_DomainTemplates.ListDomainTemplatesAPIResponse.html +1 -0
  69. package/docs/interfaces/interfaces_DomainTemplates.ListDomainTemplatesResult.html +1 -0
  70. package/docs/interfaces/interfaces_DomainTemplates.MutateDomainTemplateVersionAPIResponse.html +1 -0
  71. package/docs/interfaces/interfaces_DomainTemplates.MutateDomainTemplateVersionResult.html +1 -0
  72. package/docs/interfaces/interfaces_DomainTemplates.NotificationAPIResponse.html +1 -0
  73. package/docs/interfaces/interfaces_DomainTemplates.NotificationResult.html +1 -0
  74. package/docs/interfaces/interfaces_DomainTemplates.ShortTemplateVersion.html +1 -0
  75. package/docs/interfaces/interfaces_DomainTemplates.TemplateQuery.html +1 -0
  76. package/docs/interfaces/interfaces_DomainTemplates.TemplateVersion.html +1 -0
  77. package/docs/interfaces/interfaces_DomainTemplates.UpdateOrDeleteDomainTemplateAPIResponse.html +1 -0
  78. package/docs/interfaces/interfaces_DomainTemplates.UpdateOrDeleteDomainTemplateResult.html +1 -0
  79. package/docs/interfaces/interfaces_DomainTracking.ClickTrackingInfo.html +1 -0
  80. package/docs/interfaces/interfaces_DomainTracking.DomainTrackingData.html +1 -0
  81. package/docs/interfaces/interfaces_DomainTracking.DomainTrackingResponse.html +1 -0
  82. package/docs/interfaces/interfaces_DomainTracking.OpenTrackingInfo.html +1 -0
  83. package/docs/interfaces/interfaces_DomainTracking.UnsubscribeTrackingInfo.html +1 -0
  84. package/docs/interfaces/interfaces_DomainTracking.UpdateDomainTrackingResponse.html +1 -0
  85. package/docs/interfaces/interfaces_DomainTracking.UpdatedOpenTracking.html +1 -0
  86. package/docs/interfaces/interfaces_Domains.ConnectionSettings.html +1 -0
  87. package/docs/interfaces/interfaces_Domains.ConnectionSettingsResponse.html +1 -0
  88. package/docs/interfaces/interfaces_Domains.DKIMAuthorityInfo.html +1 -0
  89. package/docs/interfaces/interfaces_Domains.DKIMSelectorInfo.html +1 -0
  90. package/docs/interfaces/interfaces_Domains.DNSRecord.html +1 -0
  91. package/docs/interfaces/interfaces_Domains.DestroyedDomainResponse.html +1 -0
  92. package/docs/interfaces/interfaces_Domains.DomainData.html +1 -0
  93. package/docs/interfaces/interfaces_Domains.DomainInfo.html +1 -0
  94. package/docs/interfaces/interfaces_Domains.DomainListResponseData.html +1 -0
  95. package/docs/interfaces/interfaces_Domains.DomainResponseData.html +1 -0
  96. package/docs/interfaces/interfaces_Domains.DomainShortData.html +1 -0
  97. package/docs/interfaces/interfaces_Domains.DomainsListItem.html +1 -0
  98. package/docs/interfaces/interfaces_Domains.DomainsQuery.html +1 -0
  99. package/docs/interfaces/interfaces_Domains.MessageResponse.html +1 -0
  100. package/docs/interfaces/interfaces_Domains.ReplacementForPool.html +1 -0
  101. package/docs/interfaces/interfaces_Domains.UpdatedConnectionSettings.html +1 -0
  102. package/docs/interfaces/interfaces_Domains.UpdatedConnectionSettingsRes.html +1 -0
  103. package/docs/interfaces/interfaces_Domains.UpdatedDKIMAuthority.html +1 -0
  104. package/docs/interfaces/interfaces_Domains.UpdatedDKIMAuthorityResponse.html +1 -0
  105. package/docs/interfaces/interfaces_Domains.UpdatedDKIMSelectorResponse.html +1 -0
  106. package/docs/interfaces/interfaces_Domains.UpdatedWebPrefix.html +1 -0
  107. package/docs/interfaces/interfaces_Domains.UpdatedWebPrefixResponse.html +1 -0
  108. package/docs/interfaces/interfaces_Domains.WebPrefixInfo.html +1 -0
  109. package/docs/interfaces/interfaces_Events.DomainEvent.html +1 -0
  110. package/docs/interfaces/interfaces_Events.EventsList.html +1 -0
  111. package/docs/interfaces/interfaces_Events.EventsPage.html +1 -0
  112. package/docs/interfaces/interfaces_Events.EventsResponse.html +1 -0
  113. package/docs/interfaces/interfaces_Events.PagesList.html +1 -0
  114. package/docs/interfaces/interfaces_Events.PagesListAccumulator.html +1 -0
  115. package/docs/interfaces/interfaces_Events.ParsedPage.html +1 -0
  116. package/docs/interfaces/interfaces_Events.ParsedPagesList.html +1 -0
  117. package/docs/interfaces/interfaces_IFormData.IFormDataOptions.html +1 -0
  118. package/docs/interfaces/interfaces_IFormData.InputFormData.html +1 -0
  119. package/docs/interfaces/interfaces_IpPools.IpPool.html +1 -0
  120. package/docs/interfaces/interfaces_IpPools.IpPoolListResponse.html +1 -0
  121. package/docs/interfaces/interfaces_IpPools.IpPoolUpdateData.html +1 -0
  122. package/docs/interfaces/interfaces_Ips.IpData.html +1 -0
  123. package/docs/interfaces/interfaces_Ips.IpsListResponseBody.html +1 -0
  124. package/docs/interfaces/interfaces_MultipleValidation.CanceledMultipleValidationJob.html +1 -0
  125. package/docs/interfaces/interfaces_MultipleValidation.CreatedMultipleValidationJob.html +1 -0
  126. package/docs/interfaces/interfaces_MultipleValidation.IMultipleValidationClient.html +1 -0
  127. package/docs/interfaces/interfaces_MultipleValidation.MultipleValidationJob.html +1 -0
  128. package/docs/interfaces/interfaces_MultipleValidation.MultipleValidationJobsListResponse.html +1 -0
  129. package/docs/interfaces/interfaces_MultipleValidation.MultipleValidationJobsListResult.html +1 -0
  130. package/docs/interfaces/interfaces_MultipleValidation.PagesList.html +1 -0
  131. package/docs/interfaces/interfaces_Options.default.html +1 -0
  132. package/docs/interfaces/interfaces_RequestOptions.default.html +1 -0
  133. package/docs/interfaces/interfaces_StatsOptions.Stat.html +1 -0
  134. package/docs/interfaces/interfaces_StatsOptions.StatsOptions.html +1 -0
  135. package/docs/interfaces/interfaces_StatsOptions.StatsQuery.html +1 -0
  136. package/docs/interfaces/interfaces_Supressions.BounceData.html +1 -0
  137. package/docs/interfaces/interfaces_Supressions.ComplaintData.html +1 -0
  138. package/docs/interfaces/interfaces_Supressions.UnsubscribeData.html +1 -0
  139. package/docs/interfaces/interfaces_Supressions.WhiteListData.html +1 -0
  140. package/docs/interfaces/interfaces_Validate.ValidationResponse.html +1 -0
  141. package/docs/interfaces/interfaces_Validate.ValidationResult.html +1 -0
  142. package/docs/interfaces/interfaces_Webhooks.APIWebhook.html +1 -0
  143. package/docs/interfaces/interfaces_Webhooks.ValidationResponse.html +1 -0
  144. package/docs/interfaces/interfaces_Webhooks.WebhookList.html +1 -0
  145. package/docs/interfaces/interfaces_Webhooks.WebhookResponse.html +1 -0
  146. package/docs/interfaces/interfaces_Webhooks.WebhookResponseBody.html +1 -0
  147. package/docs/interfaces/interfaces_Webhooks.WebhooksQuery.html +1 -0
  148. package/docs/interfaces/interfaces_lists.CreateUpdateList.html +1 -0
  149. package/docs/interfaces/interfaces_lists.DestroyedList.html +1 -0
  150. package/docs/interfaces/interfaces_lists.ListsQuery.html +1 -0
  151. package/docs/interfaces/interfaces_lists.MailingList.html +1 -0
  152. package/docs/interfaces/interfaces_mailListMembers.CreateUpdateMailListMembers.html +1 -0
  153. package/docs/interfaces/interfaces_mailListMembers.CreateUpdateMailListMembersReq.html +1 -0
  154. package/docs/interfaces/interfaces_mailListMembers.DeletedMember.html +1 -0
  155. package/docs/interfaces/interfaces_mailListMembers.IMailListsMembers.html +1 -0
  156. package/docs/interfaces/interfaces_mailListMembers.MailListMember.html +1 -0
  157. package/docs/interfaces/interfaces_mailListMembers.MailListMembersQuery.html +1 -0
  158. package/docs/interfaces/interfaces_mailListMembers.MultipleMembersData.html +1 -0
  159. package/docs/interfaces/interfaces_mailListMembers.MultipleMembersReqData.html +1 -0
  160. package/docs/interfaces/interfaces_mailListMembers.NewMultipleMembersResponse.html +1 -0
  161. package/docs/interfaces/interfaces_routes.CreateUpdateRouteData.html +1 -0
  162. package/docs/interfaces/interfaces_routes.DestroyRouteResponse.html +1 -0
  163. package/docs/interfaces/interfaces_routes.Route.html +1 -0
  164. package/docs/interfaces/interfaces_routes.RoutesListQuery.html +1 -0
  165. package/docs/interfaces/interfaces_routes.UpdateRouteResponse.html +1 -0
  166. package/docs/modules/client.html +1 -0
  167. package/docs/modules/domains.html +1 -0
  168. package/docs/modules/domainsCredentials.html +1 -0
  169. package/docs/modules/domainsTemplates.html +1 -0
  170. package/docs/modules/error.html +1 -0
  171. package/docs/modules/events.html +1 -0
  172. package/docs/modules/interfaces_APIErrorOptions.html +1 -0
  173. package/docs/modules/interfaces_ApiResponse.html +1 -0
  174. package/docs/modules/interfaces_DomainCredentials.html +1 -0
  175. package/docs/modules/interfaces_DomainTemplates.html +1 -0
  176. package/docs/modules/interfaces_DomainTracking.html +1 -0
  177. package/docs/modules/interfaces_Domains.html +1 -0
  178. package/docs/modules/interfaces_Events.html +1 -0
  179. package/docs/modules/interfaces_IFormData.html +1 -0
  180. package/docs/modules/interfaces_IpPools.html +1 -0
  181. package/docs/modules/interfaces_Ips.html +1 -0
  182. package/docs/modules/interfaces_MultipleValidation.html +1 -0
  183. package/docs/modules/interfaces_Options.html +1 -0
  184. package/docs/modules/interfaces_RequestOptions.html +1 -0
  185. package/docs/modules/interfaces_StatsOptions.html +1 -0
  186. package/docs/modules/interfaces_Supressions.html +1 -0
  187. package/docs/modules/interfaces_Validate.html +1 -0
  188. package/docs/modules/interfaces_Webhooks.html +1 -0
  189. package/docs/modules/interfaces_lists.html +1 -0
  190. package/docs/modules/interfaces_mailListMembers.html +1 -0
  191. package/docs/modules/interfaces_routes.html +1 -0
  192. package/docs/modules/ip_pools.html +1 -0
  193. package/docs/modules/ips.html +1 -0
  194. package/docs/modules/lists.html +1 -0
  195. package/docs/modules/mailListMembers.html +1 -0
  196. package/docs/modules/messages.html +1 -0
  197. package/docs/modules/multipleValidation.html +1 -0
  198. package/docs/modules/request.html +1 -0
  199. package/docs/modules/routes.html +1 -0
  200. package/docs/modules/stats.html +1 -0
  201. package/docs/modules/suppressions.html +1 -0
  202. package/docs/modules/validate.html +1 -0
  203. package/docs/modules/webhooks.html +1 -0
  204. package/docs/modules.html +1 -0
  205. package/lib/client.ts +8 -1
  206. package/lib/domains.ts +7 -2
  207. package/lib/domainsTags.ts +165 -0
  208. package/lib/interfaces/DomainTags.ts +262 -0
  209. package/package.json +3 -3
  210. package/test/domains.test.ts +8 -1
  211. package/test/domainsTags.test.ts +345 -0
  212. package/tsconfig.json +2 -2
  213. package/docs/assets/css/main.css +0 -1
  214. package/docs/assets/js/main.js +0 -51
  215. package/docs/assets/js/search.json +0 -1
  216. package/docs/classes/_index_.mailgun.html +0 -294
  217. package/docs/classes/_lib_client_.client.html +0 -405
  218. package/docs/classes/_lib_domains_.domain.html +0 -422
  219. package/docs/classes/_lib_domains_.domainclient.html +0 -620
  220. package/docs/classes/_lib_error_.apierror.html +0 -362
  221. package/docs/classes/_lib_events_.eventclient.html +0 -465
  222. package/docs/classes/_lib_messages_.messagesclient.html +0 -327
  223. package/docs/classes/_lib_parse_.parseclient.html +0 -295
  224. package/docs/classes/_lib_request_.request.html +0 -698
  225. package/docs/classes/_lib_routes_.routesclient.html +0 -403
  226. package/docs/classes/_lib_stats_.stats.html +0 -301
  227. package/docs/classes/_lib_stats_.statsclient.html +0 -357
  228. package/docs/classes/_lib_suppressions_.bounce.html +0 -327
  229. package/docs/classes/_lib_suppressions_.complaint.html +0 -299
  230. package/docs/classes/_lib_suppressions_.suppressionclient.html +0 -599
  231. package/docs/classes/_lib_suppressions_.unsubscribe.html +0 -313
  232. package/docs/classes/_lib_validate_.validateclient.html +0 -292
  233. package/docs/classes/_lib_webhooks_.webhook.html +0 -281
  234. package/docs/classes/_lib_webhooks_.webhookclient.html +0 -539
  235. package/docs/globals.html +0 -199
  236. package/docs/interfaces/_lib_domains_.domaindata.html +0 -352
  237. package/docs/interfaces/_lib_interfaces_apierroroptions_.apierroroptions.html +0 -284
  238. package/docs/interfaces/_lib_interfaces_options_.options.html +0 -267
  239. package/docs/interfaces/_lib_interfaces_requestoptions_.requestoptions.html +0 -285
  240. package/docs/interfaces/_lib_interfaces_statsoptions_.statsoptions.html +0 -262
  241. package/docs/interfaces/_lib_interfaces_supressions_.bouncedata.html +0 -268
  242. package/docs/interfaces/_lib_interfaces_supressions_.complaintdata.html +0 -240
  243. package/docs/interfaces/_lib_interfaces_supressions_.unsubscribedata.html +0 -254
  244. package/docs/modules/_index_.html +0 -186
  245. package/docs/modules/_lib_client_.html +0 -208
  246. package/docs/modules/_lib_domains_.html +0 -199
  247. package/docs/modules/_lib_error_.html +0 -186
  248. package/docs/modules/_lib_events_.html +0 -250
  249. package/docs/modules/_lib_interfaces_apierroroptions_.html +0 -186
  250. package/docs/modules/_lib_interfaces_options_.html +0 -186
  251. package/docs/modules/_lib_interfaces_requestoptions_.html +0 -186
  252. package/docs/modules/_lib_interfaces_statsoptions_.html +0 -186
  253. package/docs/modules/_lib_interfaces_supressions_.html +0 -194
  254. package/docs/modules/_lib_messages_.html +0 -186
  255. package/docs/modules/_lib_parse_.html +0 -186
  256. package/docs/modules/_lib_request_.html +0 -259
  257. package/docs/modules/_lib_routes_.html +0 -186
  258. package/docs/modules/_lib_stats_.html +0 -190
  259. package/docs/modules/_lib_suppressions_.html +0 -262
  260. package/docs/modules/_lib_validate_.html +0 -186
  261. package/docs/modules/_lib_webhooks_.html +0 -190
  262. package/docs/modules/_webpack_config_.html +0 -227
  263. package/docs/modules/_webpack_release_config_.html +0 -227
@@ -1,3 +1,3 @@
1
1
  /*! For license information please see mailgun.node.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mailgun=t():e.mailgun=t()}(this,(function(){return(()=>{var e={271:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=r(185);class AbortSignal extends o.EventTarget{constructor(){throw super(),new TypeError("AbortSignal cannot be constructed directly")}get aborted(){const e=n.get(this);if("boolean"!=typeof e)throw new TypeError("Expected 'this' to be an 'AbortSignal' object, but got "+(null===this?"null":typeof this));return e}}o.defineEventAttribute(AbortSignal.prototype,"abort");const n=new WeakMap;Object.defineProperties(AbortSignal.prototype,{aborted:{enumerable:!0}}),"function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag&&Object.defineProperty(AbortSignal.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortSignal"});class AbortController{constructor(){s.set(this,function(){const e=Object.create(AbortSignal.prototype);return o.EventTarget.call(e),n.set(e,!1),e}())}get signal(){return i(this)}abort(){var e;e=i(this),!1===n.get(e)&&(n.set(e,!0),e.dispatchEvent({type:"abort"}))}}const s=new WeakMap;function i(e){const t=s.get(e);if(null==t)throw new TypeError("Expected 'this' to be an 'AbortController' object, but got "+(null===e?"null":typeof e));return t}Object.defineProperties(AbortController.prototype,{signal:{enumerable:!0},abort:{enumerable:!0}}),"function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag&&Object.defineProperty(AbortController.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortController"}),t.AbortController=AbortController,t.AbortSignal=AbortSignal,t.default=AbortController,e.exports=AbortController,e.exports.AbortController=e.exports.default=AbortController,e.exports.AbortSignal=AbortSignal},48:function(e,t,r){"use strict";var o=(this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}})(r(475)),n=function(){function e(e){this.formData=e}return e.prototype.client=function(e){return new o.default(e,this.formData)},e}();e.exports=n},475:function(e,t,r){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},o.apply(this,arguments)},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=n(r(438)),i=n(r(373)),a=n(r(22)),u=n(r(747)),l=n(r(778)),c=n(r(750)),d=n(r(197)),f=n(r(277)),p=n(r(839)),h=n(r(345)),b=n(r(602)),y=n(r(126)),m=n(r(135)),_=n(r(60)),g=n(r(587)),v=n(r(955)),w=function(e,t){var r=o({},e);if(r.url||(r.url="https://api.mailgun.net"),!r.username)throw new Error('Parameter "username" is required');if(!r.key)throw new Error('Parameter "key" is required');this.request=new s.default(r,t);var n=new m.default(this.request),w=new _.default(this.request),S=new v.default(this.request),R=new g.default(this.request);this.domains=new i.default(this.request,w,S),this.webhooks=new c.default(this.request),this.events=new a.default(this.request),this.stats=new u.default(this.request),this.suppressions=new l.default(this.request),this.messages=new d.default(this.request),this.routes=new f.default(this.request),this.ips=new h.default(this.request),this.ip_pools=new b.default(this.request),this.lists=new y.default(this.request,n),this.validate=new p.default(this.request,R)};t.default=w},373:function(e,t,r){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},o.apply(this,arguments)},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Domain=void 0;var s=n(r(78)),i=n(r(142)),a=function(e,t,r){this.name=e.name,this.require_tls=e.require_tls,this.skip_verification=e.skip_verification,this.state=e.state,this.wildcard=e.wildcard,this.spam_action=e.spam_action,this.created_at=e.created_at,this.smtp_password=e.smtp_password,this.smtp_login=e.smtp_login,this.type=e.type,this.receiving_dns_records=t||null,this.sending_dns_records=r||null};t.Domain=a;var u=function(){function e(e,t,r){this.request=e,this.domainCredentials=t,this.domainTemplates=r}return e.prototype._parseMessage=function(e){return e.body},e.prototype._parseDomainList=function(e){return e.body.items.map((function(e){return new a(e)}))},e.prototype._parseDomain=function(e){return new a(e.body.domain,e.body.receiving_dns_records,e.body.sending_dns_records)},e.prototype._parseTrackingSettings=function(e){return e.body.tracking},e.prototype._parseTrackingUpdate=function(e){return e.body},e.prototype.list=function(e){var t=this;return this.request.get("/v3/domains",e).then((function(e){return t._parseDomainList(e)}))},e.prototype.get=function(e){var t=this;return this.request.get("/v3/domains/"+e).then((function(e){return t._parseDomain(e)}))},e.prototype.create=function(e){var t=this,r=o({},e);return"force_dkim_authority"in r&&"boolean"==typeof r.force_dkim_authority&&(r.force_dkim_authority="true"===r.toString()?"true":"false"),this.request.postWithFD("/v3/domains",r).then((function(e){return t._parseDomain(e)}))},e.prototype.destroy=function(e){var t=this;return this.request.delete("/v3/domains/"+e).then((function(e){return t._parseMessage(e)}))},e.prototype.getConnection=function(e){return this.request.get("/v3/domains/"+e+"/connection").then((function(e){return e})).then((function(e){return e.body.connection}))},e.prototype.updateConnection=function(e,t){return this.request.put("/v3/domains/"+e+"/connection",t).then((function(e){return e})).then((function(e){return e.body}))},e.prototype.getTracking=function(e){return this.request.get((0,s.default)("/v3/domains",e,"tracking")).then(this._parseTrackingSettings)},e.prototype.updateTracking=function(e,t,r){var o=this;if("boolean"==typeof(null==r?void 0:r.active))throw new i.default({status:400,statusText:"",body:{message:'Property "active" must contain string value.'}});return this.request.putWithFD((0,s.default)("/v3/domains",e,"tracking",t),r).then((function(e){return o._parseTrackingUpdate(e)}))},e.prototype.getIps=function(e){return this.request.get((0,s.default)("/v3/domains",e,"ips")).then((function(e){var t;return null===(t=null==e?void 0:e.body)||void 0===t?void 0:t.items}))},e.prototype.assignIp=function(e,t){return this.request.postWithFD((0,s.default)("/v3/domains",e,"ips"),{ip:t})},e.prototype.deleteIp=function(e,t){return this.request.delete((0,s.default)("/v3/domains",e,"ips",t))},e.prototype.linkIpPool=function(e,t){return this.request.postWithFD((0,s.default)("/v3/domains",e,"ips"),{pool_id:t})},e.prototype.unlinkIpPoll=function(e,t){var r="";if(t.pool_id&&t.ip)throw new i.default({status:400,statusText:"",body:{message:"Please specify either pool_id or ip (not both)"}});return t.pool_id?r="?pool_id="+t.pool_id:t.ip&&(r="?ip="+t.ip),this.request.delete((0,s.default)("/v3/domains",e,"ips","ip_pool",r))},e.prototype.updateDKIMAuthority=function(e,t){return this.request.put("/v3/domains/"+e+"/dkim_authority",{},{query:"self="+t.self}).then((function(e){return e})).then((function(e){return e.body}))},e.prototype.updateDKIMSelector=function(e,t){return this.request.put("/v3/domains/"+e+"/dkim_selector",{},{query:"dkim_selector="+t.dkimSelector}).then((function(e){return e}))},e.prototype.updateWebPrefix=function(e,t){return this.request.put("/v3/domains/"+e+"/web_prefix",{},{query:"web_prefix="+t.webPrefix}).then((function(e){return e}))},e}();t.default=u},60:function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var n=o(r(78)),s=function(){function e(e){this.request=e,this.baseRoute="/v3/domains/"}return e.prototype._parseDomainCredentialsList=function(e){return{items:e.body.items,totalCount:e.body.total_count}},e.prototype._parseMessageResponse=function(e){return{status:e.status,message:e.body.message}},e.prototype._parseDeletedResponse=function(e){return{status:e.status,message:e.body.message,spec:e.body.spec}},e.prototype.list=function(e,t){var r=this;return this.request.get((0,n.default)(this.baseRoute,e,"/credentials"),t).then((function(e){return r._parseDomainCredentialsList(e)}))},e.prototype.create=function(e,t){var r=this;return this.request.postWithFD(""+this.baseRoute+e+"/credentials",t).then((function(e){return r._parseMessageResponse(e)}))},e.prototype.update=function(e,t,r){var o=this;return this.request.putWithFD(""+this.baseRoute+e+"/credentials/"+t,r).then((function(e){return o._parseMessageResponse(e)}))},e.prototype.destroy=function(e,t){var r=this;return this.request.delete(""+this.baseRoute+e+"/credentials/"+t).then((function(e){return r._parseDeletedResponse(e)}))},e}();t.default=s},955:function(e,t,r){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},o.apply(this,arguments)},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomainTemplateItem=void 0;var s=n(r(78)),i=function(e){this.name=e.name,this.description=e.description,this.createdAt=e.createdAt?new Date(e.createdAt):"",this.createdBy=e.createdBy,this.id=e.id,e.version&&(this.version=e.version,e.version.createdAt&&(this.version.createdAt=new Date(e.version.createdAt))),e.versions&&e.versions.length&&(this.versions=e.versions.map((function(e){var t=o({},e);return t.createdAt=new Date(e.createdAt),t})))};t.DomainTemplateItem=i;var a=function(){function e(e){this.request=e,this.baseRoute="/v3/"}return e.prototype.parseCreationResponse=function(e){return new i(e.body.template)},e.prototype.parseCreationVersionResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body&&e.body.template&&(t.template=new i(e.body.template)),t},e.prototype.parseMutationResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body&&e.body.template&&(t.templateName=e.body.template.name),t},e.prototype.parseNotificationResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,t},e.prototype.parseMutateTemplateVersionResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body.template&&(t.templateName=e.body.template.name,t.templateVersion={tag:e.body.template.version.tag}),t},e.prototype.parseList=function(e){var t={};return t.items=e.body.items.map((function(e){return new i(e)})),t.pages=e.body.paging,t},e.prototype.parseListTemplateVersions=function(e){var t={};return t.template=new i(e.body.template),t.pages=e.body.paging,t},e.prototype.list=function(e,t){var r=this;return this.request.get((0,s.default)(this.baseRoute,e,"/templates"),t).then((function(e){return r.parseList(e)}))},e.prototype.get=function(e,t,r){return this.request.get((0,s.default)(this.baseRoute,e,"/templates/",t),r).then((function(e){return new i(e.body.template)}))},e.prototype.create=function(e,t){var r=this;return this.request.postWithFD((0,s.default)(this.baseRoute,e,"/templates"),t).then((function(e){return r.parseCreationResponse(e)}))},e.prototype.update=function(e,t,r){var o=this;return this.request.putWithFD((0,s.default)(this.baseRoute,e,"/templates/",t),r).then((function(e){return o.parseMutationResponse(e)}))},e.prototype.destroy=function(e,t){var r=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates/",t)).then((function(e){return r.parseMutationResponse(e)}))},e.prototype.destroyAll=function(e){var t=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates")).then((function(e){return t.parseNotificationResponse(e)}))},e.prototype.createVersion=function(e,t,r){var o=this;return this.request.postWithFD((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions"),r).then((function(e){return o.parseCreationVersionResponse(e)}))},e.prototype.getVersion=function(e,t,r){return this.request.get((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r)).then((function(e){return new i(e.body.template)}))},e.prototype.updateVersion=function(e,t,r,o){var n=this;return this.request.putWithFD((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r),o).then((function(e){return n.parseMutateTemplateVersionResponse(e)}))},e.prototype.destroyVersion=function(e,t,r){var o=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r)).then((function(e){return o.parseMutateTemplateVersionResponse(e)}))},e.prototype.listVersions=function(e,t,r){var o=this;return this.request.get((0,s.default)(this.baseRoute,e,"/templates",t,"/versions"),r).then((function(e){return o.parseListTemplateVersions(e)}))},e}();t.default=a},142:function(e,t){"use strict";var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},r(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function o(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)});Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){function t(t){var r=t.status,o=t.statusText,n=t.message,s=t.body,i=void 0===s?{}:s,a=this,u=i.message,l=i.error;return(a=e.call(this)||this).stack="",a.status=r,a.message=n||l||o,a.details=u,a}return o(t,e),t}(Error);t.default=n},22:function(e,t,r){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},o.apply(this,arguments)},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=n(r(78)),i=function(){function e(e){this.request=e}return e.prototype._parsePageNumber=function(e){return e.split("/").pop()},e.prototype._parsePage=function(e,t){return{id:e,number:this._parsePageNumber(t),url:t}},e.prototype._parsePageLinks=function(e){var t=this;return Object.entries(e.body.paging).reduce((function(e,r){var o=r[0],n=r[1];return e[o]=t._parsePage(o,n),e}),{})},e.prototype._parseEventList=function(e){return{items:e.body.items,pages:this._parsePageLinks(e)}},e.prototype.get=function(e,t){var r,n=this,i=o({},t);return i&&i.page?(r=(0,s.default)("/v3",e,"events",i.page),delete i.page):r=(0,s.default)("/v3",e,"events"),this.request.get(r,i).then((function(e){return n._parseEventList(e)}))},e}();t.default=i},602:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){var t=this;return this.request.get("/v1/ip_pools",e).then((function(e){return t.parseIpPoolsResponse(e)}))},e.prototype.create=function(e){return this.request.postWithFD("/v1/ip_pools",e).then((function(e){return null==e?void 0:e.body}))},e.prototype.update=function(e,t){return this.request.patchWithFD("/v1/ip_pools/"+e,t).then((function(e){return null==e?void 0:e.body}))},e.prototype.delete=function(e,t){return this.request.delete("/v1/ip_pools/"+e,t).then((function(e){return null==e?void 0:e.body}))},e.prototype.parseIpPoolsResponse=function(e){return e.body.ip_pools},e}();t.default=r},345:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){var t=this;return this.request.get("/v3/ips",e).then((function(e){return t.parseIpsResponse(e)}))},e.prototype.get=function(e){var t=this;return this.request.get("/v3/ips/"+e).then((function(e){return t.parseIpsResponse(e)}))},e.prototype.parseIpsResponse=function(e){return e.body},e}();t.default=r},126:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this.request=e,this.baseRoute="/v3/lists",this.members=t}return e.prototype.list=function(e){return this.request.get(this.baseRoute+"/pages",e).then((function(e){return e.body.items}))},e.prototype.get=function(e){return this.request.get(this.baseRoute+"/"+e).then((function(e){return e.body.list}))},e.prototype.create=function(e){return this.request.postWithFD(this.baseRoute,e).then((function(e){return e.body.list}))},e.prototype.update=function(e,t){return this.request.putWithFD(this.baseRoute+"/"+e,t).then((function(e){return e.body.list}))},e.prototype.destroy=function(e){return this.request.delete(this.baseRoute+"/"+e).then((function(e){return e.body}))},e}();t.default=r},135:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e){this.request=e,this.baseRoute="/v3/lists"}return e.prototype.checkAndUpdateData=function(e){var t=r({},e);return"object"==typeof e.vars&&(t.vars=JSON.stringify(t.vars)),"boolean"==typeof e.subscribed&&(t.subscribed=e.subscribed?"yes":"no"),t},e.prototype.listMembers=function(e,t){return this.request.get(this.baseRoute+"/"+e+"/members/pages",t).then((function(e){return e.body.items}))},e.prototype.getMember=function(e,t){return this.request.get(this.baseRoute+"/"+e+"/members/"+t).then((function(e){return e.body.member}))},e.prototype.createMember=function(e,t){var r=this.checkAndUpdateData(t);return this.request.postWithFD(this.baseRoute+"/"+e+"/members",r).then((function(e){return e.body.member}))},e.prototype.createMembers=function(e,t){var r={members:Array.isArray(t.members)?JSON.stringify(t.members):t.members,upsert:t.upsert};return this.request.postWithFD(this.baseRoute+"/"+e+"/members.json",r).then((function(e){return e.body}))},e.prototype.updateMember=function(e,t,r){var o=this.checkAndUpdateData(r);return this.request.putWithFD(this.baseRoute+"/"+e+"/members/"+t,o).then((function(e){return e.body.member}))},e.prototype.destroyMember=function(e,t){return this.request.delete(this.baseRoute+"/"+e+"/members/"+t).then((function(e){return e.body}))},e}();t.default=o},197:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype._parseResponse=function(e){return e.body?e.body:e},e.prototype.create=function(e,t){return t.message?this.request.postWithFD("/v3/"+e+"/messages.mime",t).then(this._parseResponse):this.request.postWithFD("/v3/"+e+"/messages",t).then(this._parseResponse)},e}();t.default=r},587:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(){return this.request.get("/v4/address/validate/bulk").then((function(e){return e.body}))},e.prototype.get=function(e){return this.request.get("/v4/address/validate/bulk/"+e).then((function(e){return e.body}))},e.prototype.create=function(e,t){return this.request.postWithFD("/v4/address/validate/bulk/"+e,t).then((function(e){return e.body}))},e.prototype.destroy=function(e){return this.request.delete("/v4/address/validate/bulk/"+e).then((function(e){return e}))},e}();t.default=r},438:function(e,t,r){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},o.apply(this,arguments)},n=this&&this.__awaiter||function(e,t,r,o){return new(r||(r=Promise))((function(n,s){function i(e){try{u(o.next(e))}catch(e){s(e)}}function a(e){try{u(o.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}u((o=o.apply(e,t||[])).next())}))},s=this&&this.__generator||function(e,t){var r,o,n,s,i={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,o&&(n=2&s[0]?o.return:s[0]?o.throw||((n=o.return)&&n.call(o),0):o.next)&&!(n=n.call(o,s[1])).done)return n;switch(o=0,n&&(s=[2&s[0],n.value]),s[0]){case 0:case 1:n=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,o=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(n=i.trys,(n=n.length>0&&n[n.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!n||s[1]>n[0]&&s[1]<n[3])){i.label=s[1];break}if(6===s[0]&&i.label<n[1]){i.label=n[1],n=s;break}if(n&&i.label<n[2]){i.label=n[2],i.ops.push(s);break}n[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],o=0}finally{r=n=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var a=i(r(501)),u=i(r(78)),l=i(r(556)),c=i(r(142)),d=function(e){return"object"==typeof e&&"function"==typeof e.pipe};function f(e){return void 0!==e.getHeaders}var p=function(){function e(e,t){this.username=e.username,this.key=e.key,this.url=e.url,this.timeout=e.timeout,this.headers=e.headers||{},this.FormDataConstructor=t}return e.prototype.request=function(e,t,r){return n(this,void 0,void 0,(function(){var n,i,f,p,h,b,y,m;return s(this,(function(s){switch(s.label){case 0:return n=o({},r),i=a.default.encode(this.username+":"+this.key),f=o(o({Authorization:"Basic "+i},this.headers),null==n?void 0:n.headers),null==n||delete n.headers,f["Content-Type"]||delete f["Content-Type"],p=o({},n),(null==n?void 0:n.query)&&Object.getOwnPropertyNames(null==n?void 0:n.query).length>0&&(p.searchParams=n.query,delete p.query),[4,(0,l.default)((0,u.default)(this.url,t),o({method:e.toLocaleUpperCase(),headers:f,throwHttpErrors:!1,timeout:this.timeout},p))];case 1:return(null==(h=s.sent())?void 0:h.ok)?[3,6]:(null==h?void 0:h.body)&&d(h.body)?[4,(_=h.body,g=[],new Promise((function(e,t){_.on("data",(function(e){return g.push(e)})),_.on("error",t),_.on("end",(function(){return e(Buffer.concat(g).toString("utf8"))}))})))]:[3,3];case 2:return y=s.sent(),[3,5];case 3:return[4,null==h?void 0:h.json()];case 4:y=s.sent(),s.label=5;case 5:throw b=y,new c.default({status:null==h?void 0:h.status,statusText:null==h?void 0:h.statusText,body:{message:b}});case 6:return m={},[4,null==h?void 0:h.json()];case 7:return m.body=s.sent(),m.status=null==h?void 0:h.status,[2,m]}var _,g}))}))},e.prototype.query=function(e,t,r,n){return this.request(e,t,o({query:r},n))},e.prototype.command=function(e,t,r,n){return this.request(e,t,o({headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r},n))},e.prototype.get=function(e,t,r){return this.query("get",e,t,r)},e.prototype.head=function(e,t,r){return this.query("head",e,t,r)},e.prototype.options=function(e,t,r){return this.query("options",e,t,r)},e.prototype.post=function(e,t,r){return this.command("post",e,t,r)},e.prototype.postWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("post",e,r,{headers:{"Content-Type":null}})},e.prototype.putWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("put",e,r,{headers:{"Content-Type":null}})},e.prototype.patchWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("patch",e,r,{headers:{"Content-Type":null}})},e.prototype.createFormData=function(e){var t=this;return Object.keys(e).filter((function(t){return e[t]})).reduce((function(r,o){return["attachment","inline","file"].includes(o)?(t.addFilesToFD(o,e[o],r),r):"message"===o?(t.addMimeDataToFD(o,e[o],r),r):(t.addCommonPropertyToFD(o,e[o],r),r)}),new this.FormDataConstructor)},e.prototype.addMimeDataToFD=function(e,t,r){f(r)?Buffer.isBuffer(t)&&r.append(e,t,{filename:"MimeMessage"}):r.append(e,t,"MimeMessage")},e.prototype.addFilesToFD=function(e,t,r){var n=function(e,t,r){var n=d(t)?t:t.data,s=function(e){if("object"!=typeof e||d(e))return{};var t=e.filename,r=e.contentType,n=e.knownLength;return o(o(o({},t?{filename:t}:{filename:"file"}),r&&{contentType:r}),n&&{knownLength:n})}(t);f(r)?r.append(e,n,s):r.append(e,n,s.filename)};Array.isArray(t)?t.forEach((function(t){n(e,t,r)})):n(e,t,r)},e.prototype.addCommonPropertyToFD=function(e,t,r){Array.isArray(t)?t.forEach((function(t){r.append(e,t)})):null!=t&&r.append(e,t)},e.prototype.put=function(e,t,r){return this.command("put",e,t,r)},e.prototype.patch=function(e,t,r){return this.command("patch",e,t,r)},e.prototype.delete=function(e,t,r){return this.command("delete",e,t,r)},e}();t.default=p},277:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){return this.request.get("/v3/routes",e).then((function(e){return e.body.items}))},e.prototype.get=function(e){return this.request.get("/v3/routes/"+e).then((function(e){return e.body.route}))},e.prototype.create=function(e){return this.request.postWithFD("/v3/routes",e).then((function(e){return e.body.route}))},e.prototype.update=function(e,t){return this.request.putWithFD("/v3/routes/"+e,t).then((function(e){return e.body}))},e.prototype.destroy=function(e){return this.request.delete("/v3/routes/"+e).then((function(e){return e.body}))},e}();t.default=r},747:function(e,t,r){"use strict";var o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},o.apply(this,arguments)},n=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var o,n=0,s=t.length;n<s;n++)!o&&n in t||(o||(o=Array.prototype.slice.call(t,0,n)),o[n]=t[n]);return e.concat(o||Array.prototype.slice.call(t))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var i=s(r(78)),a=function(e){this.start=new Date(e.start),this.end=new Date(e.end),this.resolution=e.resolution,this.stats=e.stats.map((function(e){var t=o({},e);return t.time=new Date(e.time),t}))},u=function(){function e(e){this.request=e}return e.prototype.prepareSearchParams=function(e){var t=[];return"object"==typeof e&&Object.keys(e).length&&(t=Object.entries(e).reduce((function(e,t){var r=t[0],o=t[1];if(Array.isArray(o)&&o.length){var s=o.map((function(e){return[r,e]}));return n(n([],e,!0),s,!0)}return e.push([r,o]),e}),[])),t},e.prototype._parseStats=function(e){return new a(e.body)},e.prototype.getDomain=function(e,t){var r=this.prepareSearchParams(t);return this.request.get((0,i.default)("/v3",e,"stats/total"),r).then(this._parseStats)},e.prototype.getAccount=function(e){var t=this.prepareSearchParams(e);return this.request.get("/v3/stats/total",t).then(this._parseStats)},e}();t.default=u},778:function(e,t,r){"use strict";var o=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var o,n=0,s=t.length;n<s;n++)!o&&n in t||(o||(o=Array.prototype.slice.call(t,0,n)),o[n]=t[n]);return e.concat(o||Array.prototype.slice.call(t))},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=n(r(310)),i=n(r(78)),a={headers:{"Content-Type":"application/json"}},u=function(e){this.type="bounces",this.address=e.address,this.code=+e.code,this.error=e.error,this.created_at=new Date(e.created_at)},l=function(e){this.type="complaints",this.address=e.address,this.created_at=new Date(e.created_at)},c=function(e){this.type="unsubscribes",this.address=e.address,this.tags=e.tags,this.created_at=new Date(e.created_at)},d=function(e){this.type="whitelists",this.value=e.value,this.reason=e.reason,this.createdAt=new Date(e.createdAt)},f=function(){function e(e){this.request=e,this.models={bounces:u,complaints:l,unsubscribes:c,whitelists:d}}return e.prototype._parsePage=function(e,t){var r=s.default.parse(t,!0).query;return{id:e,page:r.page,address:r.address,url:t}},e.prototype._parsePageLinks=function(e){var t=this;return Object.entries(e.body.paging).reduce((function(e,r){var o=r[0],n=r[1];return e[o]=t._parsePage(o,n),e}),{})},e.prototype._parseList=function(e,t){var r={};return r.items=e.body.items.map((function(e){return new t(e)})),r.pages=this._parsePageLinks(e),r},e.prototype._parseItem=function(e,t){return new t(e.body)},e.prototype.createWhiteList=function(e,t){return this.request.postWithFD((0,i.default)("v3",e,"whitelists"),t,a).then((function(e){return e.body}))},e.prototype.list=function(e,t,r){var o=this,n=this.models[t];return this.request.get((0,i.default)("v3",e,t),r).then((function(e){return o._parseList(e,n)}))},e.prototype.get=function(e,t,r){var o=this,n=this.models[t];return this.request.get((0,i.default)("v3",e,t,encodeURIComponent(r))).then((function(e){return o._parseItem(e,n)}))},e.prototype.create=function(e,t,r){var n;return"whitelists"===t?this.createWhiteList(e,r):(n=Array.isArray(r)?o([],r,!0):[r],this.request.post((0,i.default)("v3",e,t),JSON.stringify(n),a).then((function(e){return e.body})))},e.prototype.destroy=function(e,t,r){return this.request.delete((0,i.default)("v3",e,t,encodeURIComponent(r))).then((function(e){return e.body}))},e}();t.default=f,e.exports=f},839:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this.request=e,this.multipleValidation=t}return e.prototype.get=function(e){return this.request.get("/v4/address/validate",{address:e}).then((function(e){return e})).then((function(e){return e.body}))},e}();t.default=r},750:function(e,t,r){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var n=o(r(78)),s=function(e,t){this.id=e,this.url=t},i=function(){function e(e){this.request=e}return e.prototype._parseWebhookList=function(e){return e.body.webhooks},e.prototype._parseWebhookWithID=function(e){return function(t){var r,o=null===(r=null==t?void 0:t.body)||void 0===r?void 0:r.webhook,n=null==o?void 0:o.url;return n||(n=(null==o?void 0:o.urls)&&o.urls.length?o.urls[0]:null),new s(e,n)}},e.prototype._parseWebhookTest=function(e){return{code:e.body.code,message:e.body.message}},e.prototype.list=function(e,t){return this.request.get((0,n.default)("/v3/domains",e,"webhooks"),t).then(this._parseWebhookList)},e.prototype.get=function(e,t){return this.request.get((0,n.default)("/v3/domains",e,"webhooks",t)).then(this._parseWebhookWithID(t))},e.prototype.create=function(e,t,r,o){return void 0===o&&(o=!1),o?this.request.putWithFD((0,n.default)("/v3/domains",e,"webhooks",t,"test"),{url:r}).then(this._parseWebhookTest):this.request.postWithFD((0,n.default)("/v3/domains",e,"webhooks"),{id:t,url:r}).then(this._parseWebhookWithID(t))},e.prototype.update=function(e,t,r){return this.request.putWithFD((0,n.default)("/v3/domains",e,"webhooks",t),{url:r}).then(this._parseWebhookWithID(t))},e.prototype.destroy=function(e,t){return this.request.delete((0,n.default)("/v3/domains",e,"webhooks",t)).then(this._parseWebhookWithID(t))},e}();t.default=i},501:function(e,t,r){var o;e=r.nmd(e),function(n){var s=t,i=(e&&e.exports,"object"==typeof global&&global);i.global!==i&&i.window;var a=function(e){this.message=e};(a.prototype=new Error).name="InvalidCharacterError";var u=function(e){throw new a(e)},l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=/[\t\n\f\r ]/g,d={encode:function(e){e=String(e),/[^\0-\xFF]/.test(e)&&u("The string to be encoded contains characters outside of the Latin1 range.");for(var t,r,o,n,s=e.length%3,i="",a=-1,c=e.length-s;++a<c;)t=e.charCodeAt(a)<<16,r=e.charCodeAt(++a)<<8,o=e.charCodeAt(++a),i+=l.charAt((n=t+r+o)>>18&63)+l.charAt(n>>12&63)+l.charAt(n>>6&63)+l.charAt(63&n);return 2==s?(t=e.charCodeAt(a)<<8,r=e.charCodeAt(++a),i+=l.charAt((n=t+r)>>10)+l.charAt(n>>4&63)+l.charAt(n<<2&63)+"="):1==s&&(n=e.charCodeAt(a),i+=l.charAt(n>>2)+l.charAt(n<<4&63)+"=="),i},decode:function(e){var t=(e=String(e).replace(c,"")).length;t%4==0&&(t=(e=e.replace(/==?$/,"")).length),(t%4==1||/[^+a-zA-Z0-9/]/.test(e))&&u("Invalid character: the string to be decoded is not correctly encoded.");for(var r,o,n=0,s="",i=-1;++i<t;)o=l.indexOf(e.charAt(i)),r=n%4?64*r+o:o,n++%4&&(s+=String.fromCharCode(255&r>>(-2*n&6)));return s},version:"1.0.0"};void 0===(o=function(){return d}.call(t,r,t,e))||(e.exports=o)}()},175:e=>{"use strict";e.exports=function(e){if(!/^data:/i.test(e))throw new TypeError('`uri` does not appear to be a Data URI (must begin with "data:")');const t=(e=e.replace(/\r?\n/g,"")).indexOf(",");if(-1===t||t<=4)throw new TypeError("malformed data: URI");const r=e.substring(5,t).split(";");let o="",n=!1;const s=r[0]||"text/plain";let i=s;for(let e=1;e<r.length;e++)"base64"===r[e]?n=!0:(i+=`;${r[e]}`,0===r[e].indexOf("charset=")&&(o=r[e].substring(8)));r[0]||o.length||(i+=";charset=US-ASCII",o="US-ASCII");const a=n?"base64":"ascii",u=unescape(e.substring(t+1)),l=Buffer.from(u,a);return l.type=s,l.typeFull=i,l.charset=o,l}},185:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=new WeakMap,o=new WeakMap;function n(e){const t=r.get(e);return console.assert(null!=t,"'this' is expected an Event object, but got",e),t}function s(e){null==e.passiveListener?e.event.cancelable&&(e.canceled=!0,"function"==typeof e.event.preventDefault&&e.event.preventDefault()):"undefined"!=typeof console&&"function"==typeof console.error&&console.error("Unable to preventDefault inside passive event listener invocation.",e.passiveListener)}function i(e,t){r.set(this,{eventTarget:e,event:t,eventPhase:2,currentTarget:e,canceled:!1,stopped:!1,immediateStopped:!1,passiveListener:null,timeStamp:t.timeStamp||Date.now()}),Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});const o=Object.keys(t);for(let e=0;e<o.length;++e){const t=o[e];t in this||Object.defineProperty(this,t,a(t))}}function a(e){return{get(){return n(this).event[e]},set(t){n(this).event[e]=t},configurable:!0,enumerable:!0}}function u(e){return{value(){const t=n(this).event;return t[e].apply(t,arguments)},configurable:!0,enumerable:!0}}function l(e){if(null==e||e===Object.prototype)return i;let t=o.get(e);return null==t&&(t=function(e,t){const r=Object.keys(t);if(0===r.length)return e;function o(t,r){e.call(this,t,r)}o.prototype=Object.create(e.prototype,{constructor:{value:o,configurable:!0,writable:!0}});for(let n=0;n<r.length;++n){const s=r[n];if(!(s in e.prototype)){const e="function"==typeof Object.getOwnPropertyDescriptor(t,s).value;Object.defineProperty(o.prototype,s,e?u(s):a(s))}}return o}(l(Object.getPrototypeOf(e)),e),o.set(e,t)),t}function c(e){return n(e).immediateStopped}function d(e,t){n(e).passiveListener=t}i.prototype={get type(){return n(this).event.type},get target(){return n(this).eventTarget},get currentTarget(){return n(this).currentTarget},composedPath(){const e=n(this).currentTarget;return null==e?[]:[e]},get NONE(){return 0},get CAPTURING_PHASE(){return 1},get AT_TARGET(){return 2},get BUBBLING_PHASE(){return 3},get eventPhase(){return n(this).eventPhase},stopPropagation(){const e=n(this);e.stopped=!0,"function"==typeof e.event.stopPropagation&&e.event.stopPropagation()},stopImmediatePropagation(){const e=n(this);e.stopped=!0,e.immediateStopped=!0,"function"==typeof e.event.stopImmediatePropagation&&e.event.stopImmediatePropagation()},get bubbles(){return Boolean(n(this).event.bubbles)},get cancelable(){return Boolean(n(this).event.cancelable)},preventDefault(){s(n(this))},get defaultPrevented(){return n(this).canceled},get composed(){return Boolean(n(this).event.composed)},get timeStamp(){return n(this).timeStamp},get srcElement(){return n(this).eventTarget},get cancelBubble(){return n(this).stopped},set cancelBubble(e){if(!e)return;const t=n(this);t.stopped=!0,"boolean"==typeof t.event.cancelBubble&&(t.event.cancelBubble=!0)},get returnValue(){return!n(this).canceled},set returnValue(e){e||s(n(this))},initEvent(){}},Object.defineProperty(i.prototype,"constructor",{value:i,configurable:!0,writable:!0}),"undefined"!=typeof window&&void 0!==window.Event&&(Object.setPrototypeOf(i.prototype,window.Event.prototype),o.set(window.Event.prototype,i));const f=new WeakMap;function p(e){return null!==e&&"object"==typeof e}function h(e){const t=f.get(e);if(null==t)throw new TypeError("'this' is expected an EventTarget object, but got another value.");return t}function b(e,t){Object.defineProperty(e,`on${t}`,function(e){return{get(){let t=h(this).get(e);for(;null!=t;){if(3===t.listenerType)return t.listener;t=t.next}return null},set(t){"function"==typeof t||p(t)||(t=null);const r=h(this);let o=null,n=r.get(e);for(;null!=n;)3===n.listenerType?null!==o?o.next=n.next:null!==n.next?r.set(e,n.next):r.delete(e):o=n,n=n.next;if(null!==t){const n={listener:t,listenerType:3,passive:!1,once:!1,next:null};null===o?r.set(e,n):o.next=n}},configurable:!0,enumerable:!0}}(t))}function y(e){function t(){m.call(this)}t.prototype=Object.create(m.prototype,{constructor:{value:t,configurable:!0,writable:!0}});for(let r=0;r<e.length;++r)b(t.prototype,e[r]);return t}function m(){if(!(this instanceof m)){if(1===arguments.length&&Array.isArray(arguments[0]))return y(arguments[0]);if(arguments.length>0){const e=new Array(arguments.length);for(let t=0;t<arguments.length;++t)e[t]=arguments[t];return y(e)}throw new TypeError("Cannot call a class as a function")}f.set(this,new Map)}m.prototype={addEventListener(e,t,r){if(null==t)return;if("function"!=typeof t&&!p(t))throw new TypeError("'listener' should be a function or an object.");const o=h(this),n=p(r),s=(n?Boolean(r.capture):Boolean(r))?1:2,i={listener:t,listenerType:s,passive:n&&Boolean(r.passive),once:n&&Boolean(r.once),next:null};let a=o.get(e);if(void 0===a)return void o.set(e,i);let u=null;for(;null!=a;){if(a.listener===t&&a.listenerType===s)return;u=a,a=a.next}u.next=i},removeEventListener(e,t,r){if(null==t)return;const o=h(this),n=(p(r)?Boolean(r.capture):Boolean(r))?1:2;let s=null,i=o.get(e);for(;null!=i;){if(i.listener===t&&i.listenerType===n)return void(null!==s?s.next=i.next:null!==i.next?o.set(e,i.next):o.delete(e));s=i,i=i.next}},dispatchEvent(e){if(null==e||"string"!=typeof e.type)throw new TypeError('"event.type" should be a string.');const t=h(this),r=e.type;let o=t.get(r);if(null==o)return!0;const s=function(e,t){return new(l(Object.getPrototypeOf(t)))(e,t)}(this,e);let i=null;for(;null!=o;){if(o.once?null!==i?i.next=o.next:null!==o.next?t.set(r,o.next):t.delete(r):i=o,d(s,o.passive?o.listener:null),"function"==typeof o.listener)try{o.listener.call(this,s)}catch(e){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(e)}else 3!==o.listenerType&&"function"==typeof o.listener.handleEvent&&o.listener.handleEvent(s);if(c(s))break;o=o.next}return d(s,null),function(e,t){n(e).eventPhase=t}(s,0),function(e,t){n(e).currentTarget=t}(s,null),!s.defaultPrevented}},Object.defineProperty(m.prototype,"constructor",{value:m,configurable:!0,writable:!0}),"undefined"!=typeof window&&void 0!==window.EventTarget&&Object.setPrototypeOf(m.prototype,window.EventTarget.prototype),t.defineEventAttribute=b,t.EventTarget=m,t.default=m,e.exports=m,e.exports.EventTarget=e.exports.default=m,e.exports.defineEventAttribute=b},30:(e,t,r)=>{const{Readable:o}=r(781),n=new WeakMap;class Blob{constructor(e=[],t={}){let r=0;const o=e.map((e=>{let t;return t=e instanceof Buffer?e:ArrayBuffer.isView(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof ArrayBuffer?Buffer.from(e):e instanceof Blob?e:Buffer.from("string"==typeof e?e:String(e)),r+=t.length||t.size||0,t})),s=void 0===t.type?"":String(t.type).toLowerCase();n.set(this,{type:/[^\u0020-\u007E]/.test(s)?"":s,size:r,parts:o})}get size(){return n.get(this).size}get type(){return n.get(this).type}async text(){return Buffer.from(await this.arrayBuffer()).toString()}async arrayBuffer(){const e=new Uint8Array(this.size);let t=0;for await(const r of this.stream())e.set(r,t),t+=r.length;return e.buffer}stream(){return o.from(async function*(e){for(const t of e)"stream"in t?yield*t.stream():yield t}(n.get(this).parts))}slice(e=0,t=this.size,r=""){const{size:o}=this;let s=e<0?Math.max(o+e,0):Math.min(e,o),i=t<0?Math.max(o+t,0):Math.min(t,o);const a=Math.max(i-s,0),u=n.get(this).parts.values(),l=[];let c=0;for(const e of u){const t=ArrayBuffer.isView(e)?e.byteLength:e.size;if(s&&t<=s)s-=t,i-=t;else{const r=e.slice(s,Math.min(t,i));if(l.push(r),c+=ArrayBuffer.isView(r)?r.byteLength:r.size,s=0,c>=a)break}}const d=new Blob([],{type:String(r).toLowerCase()});return Object.assign(n.get(d),{size:a,parts:l}),d}get[Symbol.toStringTag](){return"Blob"}static[Symbol.hasInstance](e){return e&&"object"==typeof e&&"function"==typeof e.stream&&0===e.stream.length&&"function"==typeof e.constructor&&/^(Blob|File)$/.test(e[Symbol.toStringTag])}}Object.defineProperties(Blob.prototype,{size:{enumerable:!0},type:{enumerable:!0},slice:{enumerable:!0}}),e.exports=Blob},556:(e,t,r)=>{"use strict";const o=r(594),n=r(271);if(global.fetch||(global.fetch=(e,t)=>o(e,{highWaterMark:1e7,...t})),global.Headers||(global.Headers=o.Headers),global.Request||(global.Request=o.Request),global.Response||(global.Response=o.Response),global.AbortController||(global.AbortController=n),!global.ReadableStream)try{global.ReadableStream=r(902)}catch(e){}e.exports=r(721)},721:function(e){var t;t=function(){"use strict";const e={},t=e=>"undefined"!=typeof self&&self&&e in self?self:"undefined"!=typeof window&&window&&e in window?window:"undefined"!=typeof global&&global&&e in global?global:"undefined"!=typeof globalThis&&globalThis?globalThis:void 0,r=["Headers","Request","Response","ReadableStream","fetch","AbortController","FormData"];for(const o of r)Object.defineProperty(e,o,{get(){const e=t(o),r=e&&e[o];return"function"==typeof r?r.bind(e):r}});const o=e=>null!==e&&"object"==typeof e,n="function"==typeof e.AbortController,s="function"==typeof e.ReadableStream,i="function"==typeof e.FormData,a=(t,r)=>{const o=new e.Headers(t||{}),n=r instanceof e.Headers,s=new e.Headers(r||{});for(const[e,t]of s)n&&"undefined"===t||void 0===t?o.delete(e):o.set(e,t);return o},u=(...e)=>{let t={},r={};for(const n of e){if(Array.isArray(n))Array.isArray(t)||(t=[]),t=[...t,...n];else if(o(n)){for(let[e,r]of Object.entries(n))o(r)&&e in t&&(r=u(t[e],r)),t={...t,[e]:r};o(n.headers)&&(r=a(r,n.headers))}t.headers=r}return t},l=["get","post","put","patch","head","delete"],c={json:"application/json",text:"text/*",formData:"multipart/form-data",arrayBuffer:"*/*",blob:"*/*"},d=[413,429,503],f=Symbol("stop");class HTTPError extends Error{constructor(e){super(e.statusText||String(0===e.status||e.status?e.status:"Unknown response error")),this.name="HTTPError",this.response=e}}class TimeoutError extends Error{constructor(e){super("Request timed out"),this.name="TimeoutError",this.request=e}}const p=e=>new Promise((t=>setTimeout(t,e))),h=e=>l.includes(e)?e.toUpperCase():e,b={limit:2,methods:["get","put","head","delete","options","trace"],statusCodes:[408,413,429,500,502,503,504],afterStatusCodes:d},y=(e={})=>{if("number"==typeof e)return{...b,limit:e};if(e.methods&&!Array.isArray(e.methods))throw new Error("retry.methods must be an array");if(e.statusCodes&&!Array.isArray(e.statusCodes))throw new Error("retry.statusCodes must be an array");return{...b,...e,afterStatusCodes:d}},m=2147483647;class Ky{constructor(t,r={}){if(this._retryCount=0,this._input=t,this._options={credentials:this._input.credentials||"same-origin",...r,headers:a(this._input.headers,r.headers),hooks:u({beforeRequest:[],beforeRetry:[],afterResponse:[]},r.hooks),method:h(r.method||this._input.method),prefixUrl:String(r.prefixUrl||""),retry:y(r.retry),throwHttpErrors:!1!==r.throwHttpErrors,timeout:void 0===r.timeout?1e4:r.timeout,fetch:r.fetch||e.fetch},"string"!=typeof this._input&&!(this._input instanceof URL||this._input instanceof e.Request))throw new TypeError("`input` must be a string, URL, or Request");if(this._options.prefixUrl&&"string"==typeof this._input){if(this._input.startsWith("/"))throw new Error("`input` must not begin with a slash when using `prefixUrl`");this._options.prefixUrl.endsWith("/")||(this._options.prefixUrl+="/"),this._input=this._options.prefixUrl+this._input}if(n&&(this.abortController=new e.AbortController,this._options.signal&&this._options.signal.addEventListener("abort",(()=>{this.abortController.abort()})),this._options.signal=this.abortController.signal),this.request=new e.Request(this._input,this._options),this._options.searchParams){const t="?"+new URLSearchParams(this._options.searchParams).toString(),r=this.request.url.replace(/(?:\?.*?)?(?=#|$)/,t);!(i&&this._options.body instanceof e.FormData||this._options.body instanceof URLSearchParams)||this._options.headers&&this._options.headers["content-type"]||this.request.headers.delete("content-type"),this.request=new e.Request(new e.Request(r,this.request),this._options)}void 0!==this._options.json&&(this._options.body=JSON.stringify(this._options.json),this.request.headers.set("content-type","application/json"),this.request=new e.Request(this.request,{body:this._options.body}));const o=async()=>{if(this._options.timeout>m)throw new RangeError("The `timeout` option cannot be greater than 2147483647");await p(1);let t=await this._fetch();for(const r of this._options.hooks.afterResponse){const o=await r(this.request,this._options,this._decorateResponse(t.clone()));o instanceof e.Response&&(t=o)}if(this._decorateResponse(t),!t.ok&&this._options.throwHttpErrors)throw new HTTPError(t);if(this._options.onDownloadProgress){if("function"!=typeof this._options.onDownloadProgress)throw new TypeError("The `onDownloadProgress` option must be a function");if(!s)throw new Error("Streams are not supported in your environment. `ReadableStream` is missing.");return this._stream(t.clone(),this._options.onDownloadProgress)}return t},l=this._options.retry.methods.includes(this.request.method.toLowerCase())?this._retry(o):o();for(const[e,t]of Object.entries(c))l[e]=async()=>{this.request.headers.set("accept",this.request.headers.get("accept")||t);const o=(await l).clone();if("json"===e){if(204===o.status)return"";if(r.parseJson)return r.parseJson(await o.text())}return o[e]()};return l}_calculateRetryDelay(e){if(this._retryCount++,this._retryCount<this._options.retry.limit&&!(e instanceof TimeoutError)){if(e instanceof HTTPError){if(!this._options.retry.statusCodes.includes(e.response.status))return 0;const t=e.response.headers.get("Retry-After");if(t&&this._options.retry.afterStatusCodes.includes(e.response.status)){let e=Number(t);return Number.isNaN(e)?e=Date.parse(t)-Date.now():e*=1e3,void 0!==this._options.retry.maxRetryAfter&&e>this._options.retry.maxRetryAfter?0:e}if(413===e.response.status)return 0}return.3*2**(this._retryCount-1)*1e3}return 0}_decorateResponse(e){return this._options.parseJson&&(e.json=async()=>this._options.parseJson(await e.text())),e}async _retry(e){try{return await e()}catch(t){const r=Math.min(this._calculateRetryDelay(t),m);if(0!==r&&this._retryCount>0){await p(r);for(const e of this._options.hooks.beforeRetry)if(await e({request:this.request,options:this._options,error:t,retryCount:this._retryCount})===f)return;return this._retry(e)}if(this._options.throwHttpErrors)throw t}}async _fetch(){for(const e of this._options.hooks.beforeRequest){const t=await e(this.request,this._options);if(t instanceof Request){this.request=t;break}if(t instanceof Response)return t}return!1===this._options.timeout?this._options.fetch(this.request.clone()):(e=this.request.clone(),t=this.abortController,r=this._options,new Promise(((o,n)=>{const s=setTimeout((()=>{t&&t.abort(),n(new TimeoutError(e))}),r.timeout);r.fetch(e).then(o).catch(n).then((()=>{clearTimeout(s)}))})));var e,t,r}_stream(t,r){const o=Number(t.headers.get("content-length"))||0;let n=0;return new e.Response(new e.ReadableStream({start(e){const s=t.body.getReader();r&&r({percent:0,transferredBytes:0,totalBytes:o},new Uint8Array),async function t(){const{done:i,value:a}=await s.read();i?e.close():(r&&(n+=a.byteLength,r({percent:0===o?0:n/o,transferredBytes:n,totalBytes:o},a)),e.enqueue(a),t())}()}}))}}const _=(...e)=>{for(const t of e)if((!o(t)||Array.isArray(t))&&void 0!==t)throw new TypeError("The `options` argument must be an object");return u({},...e)},g=e=>{const t=(t,r)=>new Ky(t,_(e,r));for(const r of l)t[r]=(t,o)=>new Ky(t,_(e,o,{method:r}));return t.HTTPError=HTTPError,t.TimeoutError=TimeoutError,t.create=e=>g(_(e)),t.extend=t=>g(_(e,t)),t.stop=f,t};return g()},e.exports=t()},78:e=>{function t(e){return e.replace(/[\/]+/g,"/").replace(/\/\?/g,"?").replace(/\/\#/g,"#").replace(/\:\//g,"://")}e.exports=function(){var e=[].slice.call(arguments,0).join("/");return t(e)}},113:e=>{"use strict";e.exports=require("crypto")},685:e=>{"use strict";e.exports=require("http")},687:e=>{"use strict";e.exports=require("https")},781:e=>{"use strict";e.exports=require("stream")},310:e=>{"use strict";e.exports=require("url")},837:e=>{"use strict";e.exports=require("util")},796:e=>{"use strict";e.exports=require("zlib")},594:(e,t,r)=>{"use strict";t=e.exports=W;const o=r(685),n=r(687),s=r(796),i=r(781),a=r(175),u=r(837),l=r(30),c=r(113),d=r(310);class FetchBaseError extends Error{constructor(e,t){super(e),Error.captureStackTrace(this,this.constructor),this.type=t}get name(){return this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}}class FetchError extends FetchBaseError{constructor(e,t,r){super(e,t),r&&(this.code=this.errno=r.code,this.erroredSysCall=r.syscall)}}const f=Symbol.toStringTag,p=e=>"object"==typeof e&&"function"==typeof e.append&&"function"==typeof e.delete&&"function"==typeof e.get&&"function"==typeof e.getAll&&"function"==typeof e.has&&"function"==typeof e.set&&"function"==typeof e.sort&&"URLSearchParams"===e[f],h=e=>"object"==typeof e&&"function"==typeof e.arrayBuffer&&"string"==typeof e.type&&"function"==typeof e.stream&&"function"==typeof e.constructor&&/^(Blob|File)$/.test(e[f]);function b(e){return"object"==typeof e&&"function"==typeof e.append&&"function"==typeof e.set&&"function"==typeof e.get&&"function"==typeof e.getAll&&"function"==typeof e.delete&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries&&"function"==typeof e.constructor&&"FormData"===e[f]}const y="\r\n",m="-".repeat(2),_=Buffer.byteLength(y),g=e=>`${m}${e}${m}${y.repeat(2)}`;function v(e,t,r){let o="";return o+=`${m}${e}\r\n`,o+=`Content-Disposition: form-data; name="${t}"`,h(r)&&(o+=`; filename="${r.name}"\r\n`,o+=`Content-Type: ${r.type||"application/octet-stream"}`),`${o}${y.repeat(2)}`}const w=Symbol("Body internals");class Body{constructor(e,{size:t=0}={}){let r=null;null===e?e=null:p(e)?e=Buffer.from(e.toString()):h(e)||Buffer.isBuffer(e)||(u.types.isAnyArrayBuffer(e)?e=Buffer.from(e):ArrayBuffer.isView(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof i||(b(e)?(r=`NodeFetchFormDataBoundary${c.randomBytes(8).toString("hex")}`,e=i.Readable.from(async function*(e,t){for(const[r,o]of e)yield v(t,r,o),h(o)?yield*o.stream():yield o,yield y;yield g(t)}(e,r))):e=Buffer.from(String(e)))),this[w]={body:e,boundary:r,disturbed:!1,error:null},this.size=t,e instanceof i&&e.on("error",(e=>{const t=e instanceof FetchBaseError?e:new FetchError(`Invalid response body while trying to fetch ${this.url}: ${e.message}`,"system",e);this[w].error=t}))}get body(){return this[w].body}get bodyUsed(){return this[w].disturbed}async arrayBuffer(){const{buffer:e,byteOffset:t,byteLength:r}=await S(this);return e.slice(t,t+r)}async blob(){const e=this.headers&&this.headers.get("content-type")||this[w].body&&this[w].body.type||"",t=await this.buffer();return new l([t],{type:e})}async json(){const e=await S(this);return JSON.parse(e.toString())}async text(){return(await S(this)).toString()}buffer(){return S(this)}}async function S(e){if(e[w].disturbed)throw new TypeError(`body used already for: ${e.url}`);if(e[w].disturbed=!0,e[w].error)throw e[w].error;let{body:t}=e;if(null===t)return Buffer.alloc(0);if(h(t)&&(t=t.stream()),Buffer.isBuffer(t))return t;if(!(t instanceof i))return Buffer.alloc(0);const r=[];let o=0;try{for await(const n of t){if(e.size>0&&o+n.length>e.size){const r=new FetchError(`content size at ${e.url} over limit: ${e.size}`,"max-size");throw t.destroy(r),r}o+=n.length,r.push(n)}}catch(t){throw t instanceof FetchBaseError?t:new FetchError(`Invalid response body while trying to fetch ${e.url}: ${t.message}`,"system",t)}if(!0!==t.readableEnded&&!0!==t._readableState.ended)throw new FetchError(`Premature close of server response while trying to fetch ${e.url}`);try{return r.every((e=>"string"==typeof e))?Buffer.from(r.join("")):Buffer.concat(r,o)}catch(t){throw new FetchError(`Could not create Buffer from response body for ${e.url}: ${t.message}`,"system",t)}}Object.defineProperties(Body.prototype,{body:{enumerable:!0},bodyUsed:{enumerable:!0},arrayBuffer:{enumerable:!0},blob:{enumerable:!0},json:{enumerable:!0},text:{enumerable:!0}});const R=(e,t)=>{let r,o,{body:n}=e;if(e.bodyUsed)throw new Error("cannot clone body after it is used");return n instanceof i&&"function"!=typeof n.getBoundary&&(r=new i.PassThrough({highWaterMark:t}),o=new i.PassThrough({highWaterMark:t}),n.pipe(r),n.pipe(o),e[w].body=r,n=o),n},T=(e,t)=>null===e?null:"string"==typeof e?"text/plain;charset=UTF-8":p(e)?"application/x-www-form-urlencoded;charset=UTF-8":h(e)?e.type||null:Buffer.isBuffer(e)||u.types.isAnyArrayBuffer(e)||ArrayBuffer.isView(e)?null:e&&"function"==typeof e.getBoundary?`multipart/form-data;boundary=${e.getBoundary()}`:b(e)?`multipart/form-data; boundary=${t[w].boundary}`:e instanceof i?null:"text/plain;charset=UTF-8",q=e=>{const{body:t}=e;return null===t?0:h(t)?t.size:Buffer.isBuffer(t)?t.length:t&&"function"==typeof t.getLengthSync?t.hasKnownLength&&t.hasKnownLength()?t.getLengthSync():null:b(t)?function(e,t){let r=0;for(const[o,n]of e)r+=Buffer.byteLength(v(t,o,n)),h(n)?r+=n.size:r+=Buffer.byteLength(String(n)),r+=_;return r+=Buffer.byteLength(g(t)),r}(e[w].boundary):null},P="function"==typeof o.validateHeaderName?o.validateHeaderName:e=>{if(!/^[\^`\-\w!#$%&'*+.|~]+$/.test(e)){const t=new TypeError(`Header name must be a valid HTTP token [${e}]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_HTTP_TOKEN"}),t}},C="function"==typeof o.validateHeaderValue?o.validateHeaderValue:(e,t)=>{if(/[^\t\u0020-\u007E\u0080-\u00FF]/.test(t)){const t=new TypeError(`Invalid character in header content ["${e}"]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_CHAR"}),t}};class Headers extends URLSearchParams{constructor(e){let t=[];if(e instanceof Headers){const r=e.raw();for(const[e,o]of Object.entries(r))t.push(...o.map((t=>[e,t])))}else if(null==e);else{if("object"!=typeof e||u.types.isBoxedPrimitive(e))throw new TypeError("Failed to construct 'Headers': The provided value is not of type '(sequence<sequence<ByteString>> or record<ByteString, ByteString>)");{const r=e[Symbol.iterator];if(null==r)t.push(...Object.entries(e));else{if("function"!=typeof r)throw new TypeError("Header pairs must be iterable");t=[...e].map((e=>{if("object"!=typeof e||u.types.isBoxedPrimitive(e))throw new TypeError("Each header pair must be an iterable object");return[...e]})).map((e=>{if(2!==e.length)throw new TypeError("Each header pair must be a name/value tuple");return[...e]}))}}}return t=t.length>0?t.map((([e,t])=>(P(e),C(e,String(t)),[String(e).toLowerCase(),String(t)]))):void 0,super(t),new Proxy(this,{get(e,t,r){switch(t){case"append":case"set":return(e,o)=>(P(e),C(e,String(o)),URLSearchParams.prototype[t].call(r,String(e).toLowerCase(),String(o)));case"delete":case"has":case"getAll":return e=>(P(e),URLSearchParams.prototype[t].call(r,String(e).toLowerCase()));case"keys":return()=>(e.sort(),new Set(URLSearchParams.prototype.keys.call(e)).keys());default:return Reflect.get(e,t,r)}}})}get[Symbol.toStringTag](){return this.constructor.name}toString(){return Object.prototype.toString.call(this)}get(e){const t=this.getAll(e);if(0===t.length)return null;let r=t.join(", ");return/^content-encoding$/i.test(e)&&(r=r.toLowerCase()),r}forEach(e){for(const t of this.keys())e(this.get(t),t)}*values(){for(const e of this.keys())yield this.get(e)}*entries(){for(const e of this.keys())yield[e,this.get(e)]}[Symbol.iterator](){return this.entries()}raw(){return[...this.keys()].reduce(((e,t)=>(e[t]=this.getAll(t),e)),{})}[Symbol.for("nodejs.util.inspect.custom")](){return[...this.keys()].reduce(((e,t)=>{const r=this.getAll(t);return e[t]="host"===t?r[0]:r.length>1?r:r[0],e}),{})}}Object.defineProperties(Headers.prototype,["get","entries","forEach","values"].reduce(((e,t)=>(e[t]={enumerable:!0},e)),{}));const E=new Set([301,302,303,307,308]),A=e=>E.has(e),O=Symbol("Response internals");class Response extends Body{constructor(e=null,t={}){super(e,t);const r=t.status||200,o=new Headers(t.headers);if(null!==e&&!o.has("Content-Type")){const t=T(e);t&&o.append("Content-Type",t)}this[O]={url:t.url,status:r,statusText:t.statusText||"",headers:o,counter:t.counter,highWaterMark:t.highWaterMark}}get url(){return this[O].url||""}get status(){return this[O].status}get ok(){return this[O].status>=200&&this[O].status<300}get redirected(){return this[O].counter>0}get statusText(){return this[O].statusText}get headers(){return this[O].headers}get highWaterMark(){return this[O].highWaterMark}clone(){return new Response(R(this,this.highWaterMark),{url:this.url,status:this.status,statusText:this.statusText,headers:this.headers,ok:this.ok,redirected:this.redirected,size:this.size})}static redirect(e,t=302){if(!A(t))throw new RangeError('Failed to execute "redirect" on "response": Invalid status code');return new Response(null,{headers:{location:new URL(e).toString()},status:t})}get[Symbol.toStringTag](){return"Response"}}Object.defineProperties(Response.prototype,{url:{enumerable:!0},status:{enumerable:!0},ok:{enumerable:!0},redirected:{enumerable:!0},statusText:{enumerable:!0},headers:{enumerable:!0},clone:{enumerable:!0}});const j=Symbol("Request internals"),k=e=>"object"==typeof e&&"object"==typeof e[j];class Request extends Body{constructor(e,t={}){let r;k(e)?r=new URL(e.url):(r=new URL(e),e={});let o=t.method||e.method||"GET";if(o=o.toUpperCase(),(null!=t.body||k(e))&&null!==e.body&&("GET"===o||"HEAD"===o))throw new TypeError("Request with GET/HEAD method cannot have body");const n=t.body?t.body:k(e)&&null!==e.body?R(e):null;super(n,{size:t.size||e.size||0});const s=new Headers(t.headers||e.headers||{});if(null!==n&&!s.has("Content-Type")){const e=T(n,this);e&&s.append("Content-Type",e)}let i=k(e)?e.signal:null;if("signal"in t&&(i=t.signal),null!==i&&("object"!=typeof(a=i)||"AbortSignal"!==a[f]))throw new TypeError("Expected signal to be an instanceof AbortSignal");var a;this[j]={method:o,redirect:t.redirect||e.redirect||"follow",headers:s,parsedURL:r,signal:i},this.follow=void 0===t.follow?void 0===e.follow?20:e.follow:t.follow,this.compress=void 0===t.compress?void 0===e.compress||e.compress:t.compress,this.counter=t.counter||e.counter||0,this.agent=t.agent||e.agent,this.highWaterMark=t.highWaterMark||e.highWaterMark||16384,this.insecureHTTPParser=t.insecureHTTPParser||e.insecureHTTPParser||!1}get method(){return this[j].method}get url(){return d.format(this[j].parsedURL)}get headers(){return this[j].headers}get redirect(){return this[j].redirect}get signal(){return this[j].signal}clone(){return new Request(this)}get[Symbol.toStringTag](){return"Request"}}Object.defineProperties(Request.prototype,{method:{enumerable:!0},url:{enumerable:!0},headers:{enumerable:!0},redirect:{enumerable:!0},clone:{enumerable:!0},signal:{enumerable:!0}});class AbortError extends FetchBaseError{constructor(e,t="aborted"){super(e,t)}}const B=new Set(["data:","http:","https:"]);async function W(e,t){return new Promise(((r,u)=>{const l=new Request(e,t),c=(e=>{const{parsedURL:t}=e[j],r=new Headers(e[j].headers);r.has("Accept")||r.set("Accept","*/*");let o=null;if(null===e.body&&/^(post|put)$/i.test(e.method)&&(o="0"),null!==e.body){const t=q(e);"number"!=typeof t||Number.isNaN(t)||(o=String(t))}o&&r.set("Content-Length",o),r.has("User-Agent")||r.set("User-Agent","node-fetch"),e.compress&&!r.has("Accept-Encoding")&&r.set("Accept-Encoding","gzip,deflate,br");let{agent:n}=e;"function"==typeof n&&(n=n(t)),r.has("Connection")||n||r.set("Connection","close");const s=(e=>{if(e.search)return e.search;const t=e.href.length-1,r=e.hash||("#"===e.href[t]?"#":"");return"?"===e.href[t-r.length]?"?":""})(t);return{path:t.pathname+s,pathname:t.pathname,hostname:t.hostname,protocol:t.protocol,port:t.port,hash:t.hash,search:t.search,query:t.query,href:t.href,method:e.method,headers:r[Symbol.for("nodejs.util.inspect.custom")](),insecureHTTPParser:e.insecureHTTPParser,agent:n}})(l);if(!B.has(c.protocol))throw new TypeError(`node-fetch cannot load ${e}. URL scheme "${c.protocol.replace(/:$/,"")}" is not supported.`);if("data:"===c.protocol){const e=a(l.url),t=new Response(e,{headers:{"Content-Type":e.typeFull}});return void r(t)}const d=("https:"===c.protocol?n:o).request,{signal:f}=l;let p=null;const b=()=>{const e=new AbortError("The operation was aborted.");u(e),l.body&&l.body instanceof i.Readable&&l.body.destroy(e),p&&p.body&&p.body.emit("error",e)};if(f&&f.aborted)return void b();const y=()=>{b(),_()},m=d(c);f&&f.addEventListener("abort",y);const _=()=>{m.abort(),f&&f.removeEventListener("abort",y)};m.on("error",(e=>{u(new FetchError(`request to ${l.url} failed, reason: ${e.message}`,"system",e)),_()})),m.on("response",(e=>{m.setTimeout(0);const o=function(e=[]){return new Headers(e.reduce(((e,t,r,o)=>(r%2==0&&e.push(o.slice(r,r+2)),e)),[]).filter((([e,t])=>{try{return P(e),C(e,String(t)),!0}catch{return!1}})))}(e.rawHeaders);if(A(e.statusCode)){const n=o.get("Location"),s=null===n?null:new URL(n,l.url);switch(l.redirect){case"error":return u(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${l.url}`,"no-redirect")),void _();case"manual":if(null!==s)try{o.set("Location",s)}catch(e){u(e)}break;case"follow":{if(null===s)break;if(l.counter>=l.follow)return u(new FetchError(`maximum redirect reached at: ${l.url}`,"max-redirect")),void _();const o={headers:new Headers(l.headers),follow:l.follow,counter:l.counter+1,agent:l.agent,compress:l.compress,method:l.method,body:l.body,signal:l.signal,size:l.size};return 303!==e.statusCode&&l.body&&t.body instanceof i.Readable?(u(new FetchError("Cannot follow redirect with body being a readable stream","unsupported-redirect")),void _()):(303!==e.statusCode&&(301!==e.statusCode&&302!==e.statusCode||"POST"!==l.method)||(o.method="GET",o.body=void 0,o.headers.delete("content-length")),r(W(new Request(s,o))),void _())}}}e.once("end",(()=>{f&&f.removeEventListener("abort",y)}));let n=i.pipeline(e,new i.PassThrough,(e=>{u(e)}));process.version<"v12.10"&&e.on("aborted",y);const a={url:l.url,status:e.statusCode,statusText:e.statusMessage,headers:o,size:l.size,counter:l.counter,highWaterMark:l.highWaterMark},c=o.get("Content-Encoding");if(!l.compress||"HEAD"===l.method||null===c||204===e.statusCode||304===e.statusCode)return p=new Response(n,a),void r(p);const d={flush:s.Z_SYNC_FLUSH,finishFlush:s.Z_SYNC_FLUSH};if("gzip"===c||"x-gzip"===c)return n=i.pipeline(n,s.createGunzip(d),(e=>{u(e)})),p=new Response(n,a),void r(p);if("deflate"!==c&&"x-deflate"!==c){if("br"===c)return n=i.pipeline(n,s.createBrotliDecompress(),(e=>{u(e)})),p=new Response(n,a),void r(p);p=new Response(n,a),r(p)}else{i.pipeline(e,new i.PassThrough,(e=>{u(e)})).once("data",(e=>{n=8==(15&e[0])?i.pipeline(n,s.createInflate(),(e=>{u(e)})):i.pipeline(n,s.createInflateRaw(),(e=>{u(e)})),p=new Response(n,a),r(p)}))}})),((e,{body:t})=>{null===t?e.end():h(t)?t.stream().pipe(e):Buffer.isBuffer(t)?(e.write(t),e.end()):t.pipe(e)})(m,l)}))}t.AbortError=AbortError,t.FetchError=FetchError,t.Headers=Headers,t.Request=Request,t.Response=Response,t.default=W,t.isRedirect=A},902:(e,t,r)=>{"use strict";r.r(t),r.d(t,{ByteLengthQueuingStrategy:()=>ByteLengthQueuingStrategy,CountQueuingStrategy:()=>CountQueuingStrategy,ReadableByteStreamController:()=>ReadableByteStreamController,ReadableStream:()=>ReadableStream,ReadableStreamBYOBReader:()=>ReadableStreamBYOBReader,ReadableStreamBYOBRequest:()=>ReadableStreamBYOBRequest,ReadableStreamDefaultController:()=>ReadableStreamDefaultController,ReadableStreamDefaultReader:()=>ReadableStreamDefaultReader,TransformStream:()=>TransformStream,TransformStreamDefaultController:()=>TransformStreamDefaultController,WritableStream:()=>WritableStream,WritableStreamDefaultController:()=>WritableStreamDefaultController,WritableStreamDefaultWriter:()=>WritableStreamDefaultWriter});const o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol:e=>`Symbol(${e})`;function n(){}const s="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0;function i(e){return"object"==typeof e&&null!==e||"function"==typeof e}const a=n,u=Promise,l=Promise.prototype.then,c=Promise.resolve.bind(u),d=Promise.reject.bind(u);function f(e){return new u(e)}function p(e){return c(e)}function h(e){return d(e)}function b(e,t,r){return l.call(e,t,r)}function y(e,t,r){b(b(e,t,r),void 0,a)}function m(e,t){y(e,t)}function _(e,t){y(e,void 0,t)}function g(e,t,r){return b(e,t,r)}function v(e){b(e,void 0,a)}const w=(()=>{const e=s&&s.queueMicrotask;if("function"==typeof e)return e;const t=p(void 0);return e=>b(t,e)})();function S(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function R(e,t,r){try{return p(S(e,t,r))}catch(e){return h(e)}}class SimpleQueue{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0}get length(){return this._size}push(e){const t=this._back;let r=t;16383===t._elements.length&&(r={_elements:[],_next:void 0}),t._elements.push(e),r!==t&&(this._back=r,t._next=r),++this._size}shift(){const e=this._front;let t=e;const r=this._cursor;let o=r+1;const n=e._elements,s=n[r];return 16384===o&&(t=e._next,o=0),--this._size,this._cursor=o,e!==t&&(this._front=t),n[r]=void 0,s}forEach(e){let t=this._cursor,r=this._front,o=r._elements;for(;!(t===o.length&&void 0===r._next||t===o.length&&(r=r._next,o=r._elements,t=0,0===o.length));)e(o[t]),++t}peek(){const e=this._front,t=this._cursor;return e._elements[t]}}function T(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?E(e):"closed"===t._state?function(e){E(e),j(e)}(e):A(e,t._storedError)}function q(e,t){return pr(e._ownerReadableStream,t)}function P(e){"readable"===e._ownerReadableStream._state?O(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){A(e,t)}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),e._ownerReadableStream._reader=void 0,e._ownerReadableStream=void 0}function C(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function E(e){e._closedPromise=f(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r}))}function A(e,t){E(e),O(e,t)}function O(e,t){void 0!==e._closedPromise_reject&&(v(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}function j(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}const k=o("[[AbortSteps]]"),B=o("[[ErrorSteps]]"),W=o("[[CancelSteps]]"),D=o("[[PullSteps]]"),x=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)},F=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function L(e,t){if(void 0!==e&&("object"!=typeof(r=e)&&"function"!=typeof r))throw new TypeError(`${t} is not an object.`);var r}function M(e,t){if("function"!=typeof e)throw new TypeError(`${t} is not a function.`)}function z(e,t){if(!function(e){return"object"==typeof e&&null!==e||"function"==typeof e}(e))throw new TypeError(`${t} is not an object.`)}function I(e,t,r){if(void 0===e)throw new TypeError(`Parameter ${t} is required in '${r}'.`)}function $(e,t,r){if(void 0===e)throw new TypeError(`${t} is required in '${r}'.`)}function H(e){return Number(e)}function U(e){return 0===e?0:e}function N(e,t){const r=Number.MAX_SAFE_INTEGER;let o=Number(e);if(o=U(o),!x(o))throw new TypeError(`${t} is not a finite number`);if(o=function(e){return U(F(e))}(o),o<0||o>r)throw new TypeError(`${t} is outside the accepted range of 0 to ${r}, inclusive`);return x(o)&&0!==o?o:0}function Q(e,t){if(!dr(e))throw new TypeError(`${t} is not a ReadableStream.`)}function V(e){return new ReadableStreamDefaultReader(e)}function Y(e,t){e._reader._readRequests.push(t)}function G(e,t,r){const o=e._reader._readRequests.shift();r?o._closeSteps():o._chunkSteps(t)}function J(e){return e._reader._readRequests.length}function K(e){const t=e._reader;return void 0!==t&&!!Z(t)}class ReadableStreamDefaultReader{constructor(e){if(I(e,1,"ReadableStreamDefaultReader"),Q(e,"First parameter"),fr(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");T(this,e),this._readRequests=new SimpleQueue}get closed(){return Z(this)?this._closedPromise:h(ee("closed"))}cancel(e){return Z(this)?void 0===this._ownerReadableStream?h(C("cancel")):q(this,e):h(ee("cancel"))}read(){if(!Z(this))return h(ee("read"));if(void 0===this._ownerReadableStream)return h(C("read from"));let e,t;const r=f(((r,o)=>{e=r,t=o}));return X(this,{_chunkSteps:t=>e({value:t,done:!1}),_closeSteps:()=>e({value:void 0,done:!0}),_errorSteps:e=>t(e)}),r}releaseLock(){if(!Z(this))throw ee("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");P(this)}}}function Z(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readRequests")&&e instanceof ReadableStreamDefaultReader)}function X(e,t){const r=e._ownerReadableStream;r._disturbed=!0,"closed"===r._state?t._closeSteps():"errored"===r._state?t._errorSteps(r._storedError):r._readableStreamController[D](t)}function ee(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}Object.defineProperties(ReadableStreamDefaultReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(ReadableStreamDefaultReader.prototype,o.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});const te=Object.getPrototypeOf(Object.getPrototypeOf((async function*(){})).prototype);class ReadableStreamAsyncIteratorImpl{constructor(e,t){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=e,this._preventCancel=t}next(){const e=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?g(this._ongoingPromise,e,e):e(),this._ongoingPromise}return(e){const t=()=>this._returnSteps(e);return this._ongoingPromise?g(this._ongoingPromise,t,t):t()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});const e=this._reader;if(void 0===e._ownerReadableStream)return h(C("iterate"));let t,r;const o=f(((e,o)=>{t=e,r=o}));return X(e,{_chunkSteps:e=>{this._ongoingPromise=void 0,w((()=>t({value:e,done:!1})))},_closeSteps:()=>{this._ongoingPromise=void 0,this._isFinished=!0,P(e),t({value:void 0,done:!0})},_errorSteps:t=>{this._ongoingPromise=void 0,this._isFinished=!0,P(e),r(t)}}),o}_returnSteps(e){if(this._isFinished)return Promise.resolve({value:e,done:!0});this._isFinished=!0;const t=this._reader;if(void 0===t._ownerReadableStream)return h(C("finish iterating"));if(!this._preventCancel){const r=q(t,e);return P(t),g(r,(()=>({value:e,done:!0})))}return P(t),p({value:e,done:!0})}}const re={next(){return oe(this)?this._asyncIteratorImpl.next():h(ne("next"))},return(e){return oe(this)?this._asyncIteratorImpl.return(e):h(ne("return"))}};function oe(e){if(!i(e))return!1;if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return!1;try{return e._asyncIteratorImpl instanceof ReadableStreamAsyncIteratorImpl}catch(e){return!1}}function ne(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}void 0!==te&&Object.setPrototypeOf(re,te);const se=Number.isNaN||function(e){return e!=e};function ie(e){return e.slice()}function ae(e,t,r,o,n){new Uint8Array(e).set(new Uint8Array(r,o,n),t)}function ue(e,t,r){if(e.slice)return e.slice(t,r);const o=r-t,n=new ArrayBuffer(o);return ae(n,0,e,t,o),n}function le(e){const t=ue(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}function ce(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function de(e,t,r){if("number"!=typeof(o=r)||se(o)||o<0||r===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");var o;e._queue.push({value:t,size:r}),e._queueTotalSize+=r}function fe(e){e._queue=new SimpleQueue,e._queueTotalSize=0}class ReadableStreamBYOBRequest{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!he(this))throw xe("view");return this._view}respond(e){if(!he(this))throw xe("respond");if(I(e,1,"respond"),e=N(e,"First parameter"),void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,Be(this._associatedReadableByteStreamController,e)}respondWithNewView(e){if(!he(this))throw xe("respondWithNewView");if(I(e,1,"respondWithNewView"),!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");e.buffer,We(this._associatedReadableByteStreamController,e)}}Object.defineProperties(ReadableStreamBYOBRequest.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(ReadableStreamBYOBRequest.prototype,o.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class ReadableByteStreamController{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!pe(this))throw Fe("byobRequest");return je(this)}get desiredSize(){if(!pe(this))throw Fe("desiredSize");return ke(this)}close(){if(!pe(this))throw Fe("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");const e=this._controlledReadableByteStream._state;if("readable"!==e)throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);Ee(this)}enqueue(e){if(!pe(this))throw Fe("enqueue");if(I(e,1,"enqueue"),!ArrayBuffer.isView(e))throw new TypeError("chunk must be an array buffer view");if(0===e.byteLength)throw new TypeError("chunk must have non-zero byteLength");if(0===e.buffer.byteLength)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");const t=this._controlledReadableByteStream._state;if("readable"!==t)throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);Ae(this,e)}error(e){if(!pe(this))throw Fe("error");Oe(this,e)}[W](e){ye(this),fe(this);const t=this._cancelAlgorithm(e);return Ce(this),t}[D](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0){const t=this._queue.shift();this._queueTotalSize-=t.byteLength,Se(this);const r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);return void e._chunkSteps(r)}const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r)}catch(t){return void e._errorSteps(t)}const o={buffer:t,bufferByteLength:r,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(o)}Y(t,e),be(this)}}function pe(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")&&e instanceof ReadableByteStreamController)}function he(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")&&e instanceof ReadableStreamBYOBRequest)}function be(e){const t=function(e){const t=e._controlledReadableByteStream;if("readable"!==t._state)return!1;if(e._closeRequested)return!1;if(!e._started)return!1;if(K(t)&&J(t)>0)return!0;if(Ie(t)&&ze(t)>0)return!0;if(ke(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;y(e._pullAlgorithm(),(()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,be(e))}),(t=>{Oe(e,t)}))}function ye(e){Re(e),e._pendingPullIntos=new SimpleQueue}function me(e,t){let r=!1;"closed"===e._state&&(r=!0);const o=_e(t);"default"===t.readerType?G(e,o,r):function(e,t,r){const o=e._reader._readIntoRequests.shift();r?o._closeSteps(t):o._chunkSteps(t)}(e,o,r)}function _e(e){const t=e.bytesFilled,r=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,t/r)}function ge(e,t,r,o){e._queue.push({buffer:t,byteOffset:r,byteLength:o}),e._queueTotalSize+=o}function ve(e,t){const r=t.elementSize,o=t.bytesFilled-t.bytesFilled%r,n=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),s=t.bytesFilled+n,i=s-s%r;let a=n,u=!1;i>o&&(a=i-t.bytesFilled,u=!0);const l=e._queue;for(;a>0;){const r=l.peek(),o=Math.min(a,r.byteLength),n=t.byteOffset+t.bytesFilled;ae(t.buffer,n,r.buffer,r.byteOffset,o),r.byteLength===o?l.shift():(r.byteOffset+=o,r.byteLength-=o),e._queueTotalSize-=o,we(e,o,t),a-=o}return u}function we(e,t,r){r.bytesFilled+=t}function Se(e){0===e._queueTotalSize&&e._closeRequested?(Ce(e),hr(e._controlledReadableByteStream)):be(e)}function Re(e){null!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null)}function Te(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos.peek();ve(e,t)&&(Pe(e),me(e._controlledReadableByteStream,t))}}function qe(e,t){const r=e._pendingPullIntos.peek();Re(e);"closed"===e._controlledReadableByteStream._state?function(e,t){const r=e._controlledReadableByteStream;if(Ie(r))for(;ze(r)>0;)me(r,Pe(e))}(e):function(e,t,r){if(we(0,t,r),r.bytesFilled<r.elementSize)return;Pe(e);const o=r.bytesFilled%r.elementSize;if(o>0){const t=r.byteOffset+r.bytesFilled,n=ue(r.buffer,t-o,t);ge(e,n,0,n.byteLength)}r.bytesFilled-=o,me(e._controlledReadableByteStream,r),Te(e)}(e,t,r),be(e)}function Pe(e){return e._pendingPullIntos.shift()}function Ce(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function Ee(e){const t=e._controlledReadableByteStream;if(!e._closeRequested&&"readable"===t._state)if(e._queueTotalSize>0)e._closeRequested=!0;else{if(e._pendingPullIntos.length>0){if(e._pendingPullIntos.peek().bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw Oe(e,t),t}}Ce(e),hr(t)}}function Ae(e,t){const r=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==r._state)return;const o=t.buffer,n=t.byteOffset,s=t.byteLength,i=o;if(e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek();t.buffer,0,t.buffer=t.buffer}if(Re(e),K(r))if(0===J(r))ge(e,i,n,s);else{G(r,new Uint8Array(i,n,s),!1)}else Ie(r)?(ge(e,i,n,s),Te(e)):ge(e,i,n,s);be(e)}function Oe(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(ye(e),fe(e),Ce(e),br(r,t))}function je(e){if(null===e._byobRequest&&e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek(),r=new Uint8Array(t.buffer,t.byteOffset+t.bytesFilled,t.byteLength-t.bytesFilled),o=Object.create(ReadableStreamBYOBRequest.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r}(o,e,r),e._byobRequest=o}return e._byobRequest}function ke(e){const t=e._controlledReadableByteStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Be(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else{if(0===t)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range")}r.buffer=r.buffer,qe(e,t)}function We(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t.byteLength)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(0===t.byteLength)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.bufferByteLength!==t.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(r.bytesFilled+t.byteLength>r.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");r.buffer=t.buffer,qe(e,t.byteLength)}function De(e,t,r,o,n,s,i){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,t._byobRequest=null,t._queue=t._queueTotalSize=void 0,fe(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=s,t._pullAlgorithm=o,t._cancelAlgorithm=n,t._autoAllocateChunkSize=i,t._pendingPullIntos=new SimpleQueue,e._readableStreamController=t;y(p(r()),(()=>{t._started=!0,be(t)}),(e=>{Oe(t,e)}))}function xe(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function Fe(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function Le(e){return new ReadableStreamBYOBReader(e)}function Me(e,t){e._reader._readIntoRequests.push(t)}function ze(e){return e._reader._readIntoRequests.length}function Ie(e){const t=e._reader;return void 0!==t&&!!$e(t)}Object.defineProperties(ReadableByteStreamController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(ReadableByteStreamController.prototype,o.toStringTag,{value:"ReadableByteStreamController",configurable:!0});class ReadableStreamBYOBReader{constructor(e){if(I(e,1,"ReadableStreamBYOBReader"),Q(e,"First parameter"),fr(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!pe(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");T(this,e),this._readIntoRequests=new SimpleQueue}get closed(){return $e(this)?this._closedPromise:h(Ue("closed"))}cancel(e){return $e(this)?void 0===this._ownerReadableStream?h(C("cancel")):q(this,e):h(Ue("cancel"))}read(e){if(!$e(this))return h(Ue("read"));if(!ArrayBuffer.isView(e))return h(new TypeError("view must be an array buffer view"));if(0===e.byteLength)return h(new TypeError("view must have non-zero byteLength"));if(0===e.buffer.byteLength)return h(new TypeError("view's buffer must have non-zero byteLength"));if(e.buffer,void 0===this._ownerReadableStream)return h(C("read from"));let t,r;const o=f(((e,o)=>{t=e,r=o}));return He(this,e,{_chunkSteps:e=>t({value:e,done:!1}),_closeSteps:e=>t({value:e,done:!0}),_errorSteps:e=>r(e)}),o}releaseLock(){if(!$e(this))throw Ue("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readIntoRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");P(this)}}}function $e(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")&&e instanceof ReadableStreamBYOBReader)}function He(e,t,r){const o=e._ownerReadableStream;o._disturbed=!0,"errored"===o._state?r._errorSteps(o._storedError):function(e,t,r){const o=e._controlledReadableByteStream;let n=1;t.constructor!==DataView&&(n=t.constructor.BYTES_PER_ELEMENT);const s=t.constructor,i=t.buffer,a={buffer:i,bufferByteLength:i.byteLength,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:n,viewConstructor:s,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(a),void Me(o,r);if("closed"!==o._state){if(e._queueTotalSize>0){if(ve(e,a)){const t=_e(a);return Se(e),void r._chunkSteps(t)}if(e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return Oe(e,t),void r._errorSteps(t)}}e._pendingPullIntos.push(a),Me(o,r),be(e)}else{const e=new s(a.buffer,a.byteOffset,0);r._closeSteps(e)}}(o._readableStreamController,t,r)}function Ue(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function Ne(e,t){const{highWaterMark:r}=e;if(void 0===r)return t;if(se(r)||r<0)throw new RangeError("Invalid highWaterMark");return r}function Qe(e){const{size:t}=e;return t||(()=>1)}function Ve(e,t){L(e,t);const r=null==e?void 0:e.highWaterMark,o=null==e?void 0:e.size;return{highWaterMark:void 0===r?void 0:H(r),size:void 0===o?void 0:Ye(o,`${t} has member 'size' that`)}}function Ye(e,t){return M(e,t),t=>H(e(t))}function Ge(e,t,r){return M(e,r),r=>R(e,t,[r])}function Je(e,t,r){return M(e,r),()=>R(e,t,[])}function Ke(e,t,r){return M(e,r),r=>S(e,t,[r])}function Ze(e,t,r){return M(e,r),(r,o)=>R(e,t,[r,o])}function Xe(e,t){if(!ot(e))throw new TypeError(`${t} is not a WritableStream.`)}Object.defineProperties(ReadableStreamBYOBReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(ReadableStreamBYOBReader.prototype,o.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});const et="function"==typeof AbortController;class WritableStream{constructor(e={},t={}){void 0===e?e=null:z(e,"First parameter");const r=Ve(t,"Second parameter"),o=function(e,t){L(e,t);const r=null==e?void 0:e.abort,o=null==e?void 0:e.close,n=null==e?void 0:e.start,s=null==e?void 0:e.type,i=null==e?void 0:e.write;return{abort:void 0===r?void 0:Ge(r,e,`${t} has member 'abort' that`),close:void 0===o?void 0:Je(o,e,`${t} has member 'close' that`),start:void 0===n?void 0:Ke(n,e,`${t} has member 'start' that`),write:void 0===i?void 0:Ze(i,e,`${t} has member 'write' that`),type:s}}(e,"First parameter");rt(this);if(void 0!==o.type)throw new RangeError("Invalid type is specified");const n=Qe(r);!function(e,t,r,o){const n=Object.create(WritableStreamDefaultController.prototype);let s=()=>{},i=()=>p(void 0),a=()=>p(void 0),u=()=>p(void 0);void 0!==t.start&&(s=()=>t.start(n));void 0!==t.write&&(i=e=>t.write(e,n));void 0!==t.close&&(a=()=>t.close());void 0!==t.abort&&(u=e=>t.abort(e));wt(e,n,s,i,a,u,r,o)}(this,o,Ne(r,1),n)}get locked(){if(!ot(this))throw Et("locked");return nt(this)}abort(e){return ot(this)?nt(this)?h(new TypeError("Cannot abort a stream that already has a writer")):st(this,e):h(Et("abort"))}close(){return ot(this)?nt(this)?h(new TypeError("Cannot close a stream that already has a writer")):ct(this)?h(new TypeError("Cannot close an already-closing stream")):it(this):h(Et("close"))}getWriter(){if(!ot(this))throw Et("getWriter");return tt(this)}}function tt(e){return new WritableStreamDefaultWriter(e)}function rt(e){e._state="writable",e._storedError=void 0,e._writer=void 0,e._writableStreamController=void 0,e._writeRequests=new SimpleQueue,e._inFlightWriteRequest=void 0,e._closeRequest=void 0,e._inFlightCloseRequest=void 0,e._pendingAbortRequest=void 0,e._backpressure=!1}function ot(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")&&e instanceof WritableStream)}function nt(e){return void 0!==e._writer}function st(e,t){var r;if("closed"===e._state||"errored"===e._state)return p(void 0);e._writableStreamController._abortReason=t,null===(r=e._writableStreamController._abortController)||void 0===r||r.abort();const o=e._state;if("closed"===o||"errored"===o)return p(void 0);if(void 0!==e._pendingAbortRequest)return e._pendingAbortRequest._promise;let n=!1;"erroring"===o&&(n=!0,t=void 0);const s=f(((r,o)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:o,_reason:t,_wasAlreadyErroring:n}}));return e._pendingAbortRequest._promise=s,n||ut(e,t),s}function it(e){const t=e._state;if("closed"===t||"errored"===t)return h(new TypeError(`The stream (in ${t} state) is not in the writable state and cannot be closed`));const r=f(((t,r)=>{const o={_resolve:t,_reject:r};e._closeRequest=o})),o=e._writer;var n;return void 0!==o&&e._backpressure&&"writable"===t&&zt(o),de(n=e._writableStreamController,gt,0),Tt(n),r}function at(e,t){"writable"!==e._state?lt(e):ut(e,t)}function ut(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const o=e._writer;void 0!==o&&yt(o,t),!function(e){if(void 0===e._inFlightWriteRequest&&void 0===e._inFlightCloseRequest)return!1;return!0}(e)&&r._started&&lt(e)}function lt(e){e._state="errored",e._writableStreamController[B]();const t=e._storedError;if(e._writeRequests.forEach((e=>{e._reject(t)})),e._writeRequests=new SimpleQueue,void 0===e._pendingAbortRequest)return void dt(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,r._wasAlreadyErroring)return r._reject(t),void dt(e);y(e._writableStreamController[k](r._reason),(()=>{r._resolve(),dt(e)}),(t=>{r._reject(t),dt(e)}))}function ct(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function dt(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&Wt(t,e._storedError)}function ft(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(t?function(e){xt(e)}(r):zt(r)),e._backpressure=t}Object.defineProperties(WritableStream.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(WritableStream.prototype,o.toStringTag,{value:"WritableStream",configurable:!0});class WritableStreamDefaultWriter{constructor(e){if(I(e,1,"WritableStreamDefaultWriter"),Xe(e,"First parameter"),nt(e))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=e,e._writer=this;const t=e._state;if("writable"===t)!ct(e)&&e._backpressure?xt(this):Lt(this),kt(this);else if("erroring"===t)Ft(this,e._storedError),kt(this);else if("closed"===t)Lt(this),kt(r=this),Dt(r);else{const t=e._storedError;Ft(this,t),Bt(this,t)}var r}get closed(){return pt(this)?this._closedPromise:h(Ot("closed"))}get desiredSize(){if(!pt(this))throw Ot("desiredSize");if(void 0===this._ownerWritableStream)throw jt("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return Rt(t._writableStreamController)}(this)}get ready(){return pt(this)?this._readyPromise:h(Ot("ready"))}abort(e){return pt(this)?void 0===this._ownerWritableStream?h(jt("abort")):function(e,t){return st(e._ownerWritableStream,t)}(this,e):h(Ot("abort"))}close(){if(!pt(this))return h(Ot("close"));const e=this._ownerWritableStream;return void 0===e?h(jt("close")):ct(e)?h(new TypeError("Cannot close an already-closing stream")):ht(this)}releaseLock(){if(!pt(this))throw Ot("releaseLock");void 0!==this._ownerWritableStream&&mt(this)}write(e){return pt(this)?void 0===this._ownerWritableStream?h(jt("write to")):_t(this,e):h(Ot("write"))}}function pt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")&&e instanceof WritableStreamDefaultWriter)}function ht(e){return it(e._ownerWritableStream)}function bt(e,t){"pending"===e._closedPromiseState?Wt(e,t):function(e,t){Bt(e,t)}(e,t)}function yt(e,t){"pending"===e._readyPromiseState?Mt(e,t):function(e,t){Ft(e,t)}(e,t)}function mt(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");yt(e,r),bt(e,r),t._writer=void 0,e._ownerWritableStream=void 0}function _t(e,t){const r=e._ownerWritableStream,o=r._writableStreamController,n=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return qt(e,t),1}}(o,t);if(r!==e._ownerWritableStream)return h(jt("write to"));const s=r._state;if("errored"===s)return h(r._storedError);if(ct(r)||"closed"===s)return h(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===s)return h(r._storedError);const i=function(e){return f(((t,r)=>{const o={_resolve:t,_reject:r};e._writeRequests.push(o)}))}(r);return function(e,t,r){try{de(e,t,r)}catch(t){return void qt(e,t)}const o=e._controlledWritableStream;if(!ct(o)&&"writable"===o._state){ft(o,Pt(e))}Tt(e)}(o,t,n),i}Object.defineProperties(WritableStreamDefaultWriter.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(WritableStreamDefaultWriter.prototype,o.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});const gt={};class WritableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!vt(this))throw At("abortReason");return this._abortReason}get signal(){if(!vt(this))throw At("signal");if(void 0===this._abortController)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(e){if(!vt(this))throw At("error");"writable"===this._controlledWritableStream._state&&Ct(this,e)}[k](e){const t=this._abortAlgorithm(e);return St(this),t}[B](){fe(this)}}function vt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")&&e instanceof WritableStreamDefaultController)}function wt(e,t,r,o,n,s,i,a){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,fe(t),t._abortReason=void 0,t._abortController=function(){if(et)return new AbortController}(),t._started=!1,t._strategySizeAlgorithm=a,t._strategyHWM=i,t._writeAlgorithm=o,t._closeAlgorithm=n,t._abortAlgorithm=s;const u=Pt(t);ft(e,u);y(p(r()),(()=>{t._started=!0,Tt(t)}),(r=>{t._started=!0,at(e,r)}))}function St(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Rt(e){return e._strategyHWM-e._queueTotalSize}function Tt(e){const t=e._controlledWritableStream;if(!e._started)return;if(void 0!==t._inFlightWriteRequest)return;if("erroring"===t._state)return void lt(t);if(0===e._queue.length)return;const r=e._queue.peek().value;r===gt?function(e){const t=e._controlledWritableStream;(function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0})(t),ce(e);const r=e._closeAlgorithm();St(e),y(r,(()=>{!function(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,"erroring"===e._state&&(e._storedError=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";const t=e._writer;void 0!==t&&Dt(t)}(t)}),(e=>{!function(e,t){e._inFlightCloseRequest._reject(t),e._inFlightCloseRequest=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._reject(t),e._pendingAbortRequest=void 0),at(e,t)}(t,e)}))}(e):function(e,t){const r=e._controlledWritableStream;!function(e){e._inFlightWriteRequest=e._writeRequests.shift()}(r);y(e._writeAlgorithm(t),(()=>{!function(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0}(r);const t=r._state;if(ce(e),!ct(r)&&"writable"===t){const t=Pt(e);ft(r,t)}Tt(e)}),(t=>{"writable"===r._state&&St(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,at(e,t)}(r,t)}))}(e,r)}function qt(e,t){"writable"===e._controlledWritableStream._state&&Ct(e,t)}function Pt(e){return Rt(e)<=0}function Ct(e,t){const r=e._controlledWritableStream;St(e),ut(r,t)}function Et(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function At(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function Ot(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function jt(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function kt(e){e._closedPromise=f(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending"}))}function Bt(e,t){kt(e),Wt(e,t)}function Wt(e,t){void 0!==e._closedPromise_reject&&(v(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected")}function Dt(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved")}function xt(e){e._readyPromise=f(((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r})),e._readyPromiseState="pending"}function Ft(e,t){xt(e),Mt(e,t)}function Lt(e){xt(e),zt(e)}function Mt(e,t){void 0!==e._readyPromise_reject&&(v(e._readyPromise),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected")}function zt(e){void 0!==e._readyPromise_resolve&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled")}Object.defineProperties(WritableStreamDefaultController.prototype,{error:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(WritableStreamDefaultController.prototype,o.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});const It="undefined"!=typeof DOMException?DOMException:void 0;const $t=function(e){if("function"!=typeof e&&"object"!=typeof e)return!1;try{return new e,!0}catch(e){return!1}}(It)?It:function(){const e=function(e,t){this.message=e||"",this.name=t||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}();function Ht(e,t,r,o,s,i){const a=V(e),u=tt(t);e._disturbed=!0;let l=!1,c=p(void 0);return f(((d,g)=>{let w;if(void 0!==i){if(w=()=>{const r=new $t("Aborted","AbortError"),n=[];o||n.push((()=>"writable"===t._state?st(t,r):p(void 0))),s||n.push((()=>"readable"===e._state?pr(e,r):p(void 0))),E((()=>Promise.all(n.map((e=>e())))),!0,r)},i.aborted)return void w();i.addEventListener("abort",w)}var S,R,T;if(C(e,a._closedPromise,(e=>{o?A(!0,e):E((()=>st(t,e)),!0,e)})),C(t,u._closedPromise,(t=>{s?A(!0,t):E((()=>pr(e,t)),!0,t)})),S=e,R=a._closedPromise,T=()=>{r?A():E((()=>function(e){const t=e._ownerWritableStream,r=t._state;return ct(t)||"closed"===r?p(void 0):"errored"===r?h(t._storedError):ht(e)}(u)))},"closed"===S._state?T():m(R,T),ct(t)||"closed"===t._state){const t=new TypeError("the destination writable stream closed before all data could be piped to it");s?A(!0,t):E((()=>pr(e,t)),!0,t)}function q(){const e=c;return b(c,(()=>e!==c?q():void 0))}function C(e,t,r){"errored"===e._state?r(e._storedError):_(t,r)}function E(e,r,o){function n(){y(e(),(()=>O(r,o)),(e=>O(!0,e)))}l||(l=!0,"writable"!==t._state||ct(t)?n():m(q(),n))}function A(e,r){l||(l=!0,"writable"!==t._state||ct(t)?O(e,r):m(q(),(()=>O(e,r))))}function O(e,t){mt(u),P(a),void 0!==i&&i.removeEventListener("abort",w),e?g(t):d(void 0)}v(f(((e,t)=>{!function r(o){o?e():b(l?p(!0):b(u._readyPromise,(()=>f(((e,t)=>{X(a,{_chunkSteps:t=>{c=b(_t(u,t),void 0,n),e(!1)},_closeSteps:()=>e(!0),_errorSteps:t})})))),r,t)}(!1)})))}))}class ReadableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!Ut(this))throw er("desiredSize");return Kt(this)}close(){if(!Ut(this))throw er("close");if(!Zt(this))throw new TypeError("The stream is not in a state that permits close");Yt(this)}enqueue(e){if(!Ut(this))throw er("enqueue");if(!Zt(this))throw new TypeError("The stream is not in a state that permits enqueue");return Gt(this,e)}error(e){if(!Ut(this))throw er("error");Jt(this,e)}[W](e){fe(this);const t=this._cancelAlgorithm(e);return Vt(this),t}[D](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=ce(this);this._closeRequested&&0===this._queue.length?(Vt(this),hr(t)):Nt(this),e._chunkSteps(r)}else Y(t,e),Nt(this)}}function Ut(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")&&e instanceof ReadableStreamDefaultController)}function Nt(e){if(!Qt(e))return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;y(e._pullAlgorithm(),(()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,Nt(e))}),(t=>{Jt(e,t)}))}function Qt(e){const t=e._controlledReadableStream;if(!Zt(e))return!1;if(!e._started)return!1;if(fr(t)&&J(t)>0)return!0;return Kt(e)>0}function Vt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Yt(e){if(!Zt(e))return;const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(Vt(e),hr(t))}function Gt(e,t){if(!Zt(e))return;const r=e._controlledReadableStream;if(fr(r)&&J(r)>0)G(r,t,!1);else{let r;try{r=e._strategySizeAlgorithm(t)}catch(t){throw Jt(e,t),t}try{de(e,t,r)}catch(t){throw Jt(e,t),t}}Nt(e)}function Jt(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(fe(e),Vt(e),br(r,t))}function Kt(e){const t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Zt(e){const t=e._controlledReadableStream._state;return!e._closeRequested&&"readable"===t}function Xt(e,t,r,o,n,s,i){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,fe(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=i,t._strategyHWM=s,t._pullAlgorithm=o,t._cancelAlgorithm=n,e._readableStreamController=t;y(p(r()),(()=>{t._started=!0,Nt(t)}),(e=>{Jt(t,e)}))}function er(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function tr(e,t){return pe(e._readableStreamController)?function(e){let t,r,o,n,s,i=V(e),a=!1,u=!1,l=!1;const c=f((e=>{s=e}));function d(e){_(e._closedPromise,(t=>{e===i&&(Oe(o._readableStreamController,t),Oe(n._readableStreamController,t),u&&l||s(void 0))}))}function h(){$e(i)&&(P(i),i=V(e),d(i));X(i,{_chunkSteps:t=>{w((()=>{a=!1;const r=t;let i=t;if(!u&&!l)try{i=le(t)}catch(t){return Oe(o._readableStreamController,t),Oe(n._readableStreamController,t),void s(pr(e,t))}u||Ae(o._readableStreamController,r),l||Ae(n._readableStreamController,i)}))},_closeSteps:()=>{a=!1,u||Ee(o._readableStreamController),l||Ee(n._readableStreamController),o._readableStreamController._pendingPullIntos.length>0&&Be(o._readableStreamController,0),n._readableStreamController._pendingPullIntos.length>0&&Be(n._readableStreamController,0),u&&l||s(void 0)},_errorSteps:()=>{a=!1}})}function b(t,r){Z(i)&&(P(i),i=Le(e),d(i));const c=r?n:o,f=r?o:n;He(i,t,{_chunkSteps:t=>{w((()=>{a=!1;const o=r?l:u;if(r?u:l)o||We(c._readableStreamController,t);else{let r;try{r=le(t)}catch(t){return Oe(c._readableStreamController,t),Oe(f._readableStreamController,t),void s(pr(e,t))}o||We(c._readableStreamController,t),Ae(f._readableStreamController,r)}}))},_closeSteps:e=>{a=!1;const t=r?l:u,o=r?u:l;t||Ee(c._readableStreamController),o||Ee(f._readableStreamController),void 0!==e&&(t||We(c._readableStreamController,e),!o&&f._readableStreamController._pendingPullIntos.length>0&&Be(f._readableStreamController,0)),t&&o||s(void 0)},_errorSteps:()=>{a=!1}})}function y(){if(a)return p(void 0);a=!0;const e=je(o._readableStreamController);return null===e?h():b(e._view,!1),p(void 0)}function m(){if(a)return p(void 0);a=!0;const e=je(n._readableStreamController);return null===e?h():b(e._view,!0),p(void 0)}function g(o){if(u=!0,t=o,l){const o=ie([t,r]),n=pr(e,o);s(n)}return c}function v(o){if(l=!0,r=o,u){const o=ie([t,r]),n=pr(e,o);s(n)}return c}function S(){}return o=lr(S,y,g),n=lr(S,m,v),d(i),[o,n]}(e):function(e,t){const r=V(e);let o,n,s,i,a,u=!1,l=!1,c=!1;const d=f((e=>{a=e}));function h(){if(u)return p(void 0);u=!0;return X(r,{_chunkSteps:e=>{w((()=>{u=!1;const t=e,r=e;l||Gt(s._readableStreamController,t),c||Gt(i._readableStreamController,r)}))},_closeSteps:()=>{u=!1,l||Yt(s._readableStreamController),c||Yt(i._readableStreamController),l&&c||a(void 0)},_errorSteps:()=>{u=!1}}),p(void 0)}function b(t){if(l=!0,o=t,c){const t=ie([o,n]),r=pr(e,t);a(r)}return d}function y(t){if(c=!0,n=t,l){const t=ie([o,n]),r=pr(e,t);a(r)}return d}function m(){}return s=ur(m,h,b),i=ur(m,h,y),_(r._closedPromise,(e=>{Jt(s._readableStreamController,e),Jt(i._readableStreamController,e),l&&c||a(void 0)})),[s,i]}(e)}function rr(e,t,r){return M(e,r),r=>R(e,t,[r])}function or(e,t,r){return M(e,r),r=>R(e,t,[r])}function nr(e,t,r){return M(e,r),r=>S(e,t,[r])}function sr(e,t){if("bytes"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function ir(e,t){if("byob"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function ar(e,t){L(e,t);const r=null==e?void 0:e.preventAbort,o=null==e?void 0:e.preventCancel,n=null==e?void 0:e.preventClose,s=null==e?void 0:e.signal;return void 0!==s&&function(e,t){if(!function(e){if("object"!=typeof e||null===e)return!1;try{return"boolean"==typeof e.aborted}catch(e){return!1}}(e))throw new TypeError(`${t} is not an AbortSignal.`)}(s,`${t} has member 'signal' that`),{preventAbort:Boolean(r),preventCancel:Boolean(o),preventClose:Boolean(n),signal:s}}Object.defineProperties(ReadableStreamDefaultController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(ReadableStreamDefaultController.prototype,o.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});class ReadableStream{constructor(e={},t={}){void 0===e?e=null:z(e,"First parameter");const r=Ve(t,"Second parameter"),o=function(e,t){L(e,t);const r=e,o=null==r?void 0:r.autoAllocateChunkSize,n=null==r?void 0:r.cancel,s=null==r?void 0:r.pull,i=null==r?void 0:r.start,a=null==r?void 0:r.type;return{autoAllocateChunkSize:void 0===o?void 0:N(o,`${t} has member 'autoAllocateChunkSize' that`),cancel:void 0===n?void 0:rr(n,r,`${t} has member 'cancel' that`),pull:void 0===s?void 0:or(s,r,`${t} has member 'pull' that`),start:void 0===i?void 0:nr(i,r,`${t} has member 'start' that`),type:void 0===a?void 0:sr(a,`${t} has member 'type' that`)}}(e,"First parameter");if(cr(this),"bytes"===o.type){if(void 0!==r.size)throw new RangeError("The strategy for a byte stream cannot have a size function");!function(e,t,r){const o=Object.create(ReadableByteStreamController.prototype);let n=()=>{},s=()=>p(void 0),i=()=>p(void 0);void 0!==t.start&&(n=()=>t.start(o)),void 0!==t.pull&&(s=()=>t.pull(o)),void 0!==t.cancel&&(i=e=>t.cancel(e));const a=t.autoAllocateChunkSize;if(0===a)throw new TypeError("autoAllocateChunkSize must be greater than 0");De(e,o,n,s,i,r,a)}(this,o,Ne(r,0))}else{const e=Qe(r);!function(e,t,r,o){const n=Object.create(ReadableStreamDefaultController.prototype);let s=()=>{},i=()=>p(void 0),a=()=>p(void 0);void 0!==t.start&&(s=()=>t.start(n)),void 0!==t.pull&&(i=()=>t.pull(n)),void 0!==t.cancel&&(a=e=>t.cancel(e)),Xt(e,n,s,i,a,r,o)}(this,o,Ne(r,1),e)}}get locked(){if(!dr(this))throw yr("locked");return fr(this)}cancel(e){return dr(this)?fr(this)?h(new TypeError("Cannot cancel a stream that already has a reader")):pr(this,e):h(yr("cancel"))}getReader(e){if(!dr(this))throw yr("getReader");return void 0===function(e,t){L(e,t);const r=null==e?void 0:e.mode;return{mode:void 0===r?void 0:ir(r,`${t} has member 'mode' that`)}}(e,"First parameter").mode?V(this):Le(this)}pipeThrough(e,t={}){if(!dr(this))throw yr("pipeThrough");I(e,1,"pipeThrough");const r=function(e,t){L(e,t);const r=null==e?void 0:e.readable;$(r,"readable","ReadableWritablePair"),Q(r,`${t} has member 'readable' that`);const o=null==e?void 0:e.writable;return $(o,"writable","ReadableWritablePair"),Xe(o,`${t} has member 'writable' that`),{readable:r,writable:o}}(e,"First parameter"),o=ar(t,"Second parameter");if(fr(this))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(nt(r.writable))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return v(Ht(this,r.writable,o.preventClose,o.preventAbort,o.preventCancel,o.signal)),r.readable}pipeTo(e,t={}){if(!dr(this))return h(yr("pipeTo"));if(void 0===e)return h("Parameter 1 is required in 'pipeTo'.");if(!ot(e))return h(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let r;try{r=ar(t,"Second parameter")}catch(e){return h(e)}return fr(this)?h(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):nt(e)?h(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):Ht(this,e,r.preventClose,r.preventAbort,r.preventCancel,r.signal)}tee(){if(!dr(this))throw yr("tee");return ie(tr(this))}values(e){if(!dr(this))throw yr("values");return function(e,t){const r=V(e),o=new ReadableStreamAsyncIteratorImpl(r,t),n=Object.create(re);return n._asyncIteratorImpl=o,n}(this,function(e,t){L(e,t);const r=null==e?void 0:e.preventCancel;return{preventCancel:Boolean(r)}}(e,"First parameter").preventCancel)}}function ur(e,t,r,o=1,n=(()=>1)){const s=Object.create(ReadableStream.prototype);cr(s);return Xt(s,Object.create(ReadableStreamDefaultController.prototype),e,t,r,o,n),s}function lr(e,t,r){const o=Object.create(ReadableStream.prototype);cr(o);return De(o,Object.create(ReadableByteStreamController.prototype),e,t,r,0,void 0),o}function cr(e){e._state="readable",e._reader=void 0,e._storedError=void 0,e._disturbed=!1}function dr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")&&e instanceof ReadableStream)}function fr(e){return void 0!==e._reader}function pr(e,t){if(e._disturbed=!0,"closed"===e._state)return p(void 0);if("errored"===e._state)return h(e._storedError);hr(e);const r=e._reader;void 0!==r&&$e(r)&&(r._readIntoRequests.forEach((e=>{e._closeSteps(void 0)})),r._readIntoRequests=new SimpleQueue);return g(e._readableStreamController[W](t),n)}function hr(e){e._state="closed";const t=e._reader;void 0!==t&&(j(t),Z(t)&&(t._readRequests.forEach((e=>{e._closeSteps()})),t._readRequests=new SimpleQueue))}function br(e,t){e._state="errored",e._storedError=t;const r=e._reader;void 0!==r&&(O(r,t),Z(r)?(r._readRequests.forEach((e=>{e._errorSteps(t)})),r._readRequests=new SimpleQueue):(r._readIntoRequests.forEach((e=>{e._errorSteps(t)})),r._readIntoRequests=new SimpleQueue))}function yr(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function mr(e,t){L(e,t);const r=null==e?void 0:e.highWaterMark;return $(r,"highWaterMark","QueuingStrategyInit"),{highWaterMark:H(r)}}Object.defineProperties(ReadableStream.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(ReadableStream.prototype,o.toStringTag,{value:"ReadableStream",configurable:!0}),"symbol"==typeof o.asyncIterator&&Object.defineProperty(ReadableStream.prototype,o.asyncIterator,{value:ReadableStream.prototype.values,writable:!0,configurable:!0});const _r=e=>e.byteLength;Object.defineProperty(_r,"name",{value:"size",configurable:!0});class ByteLengthQueuingStrategy{constructor(e){I(e,1,"ByteLengthQueuingStrategy"),e=mr(e,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!vr(this))throw gr("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!vr(this))throw gr("size");return _r}}function gr(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function vr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")&&e instanceof ByteLengthQueuingStrategy)}Object.defineProperties(ByteLengthQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(ByteLengthQueuingStrategy.prototype,o.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});const wr=()=>1;Object.defineProperty(wr,"name",{value:"size",configurable:!0});class CountQueuingStrategy{constructor(e){I(e,1,"CountQueuingStrategy"),e=mr(e,"First parameter"),this._countQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!Rr(this))throw Sr("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!Rr(this))throw Sr("size");return wr}}function Sr(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function Rr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")&&e instanceof CountQueuingStrategy)}function Tr(e,t,r){return M(e,r),r=>R(e,t,[r])}function qr(e,t,r){return M(e,r),r=>S(e,t,[r])}function Pr(e,t,r){return M(e,r),(r,o)=>R(e,t,[r,o])}Object.defineProperties(CountQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(CountQueuingStrategy.prototype,o.toStringTag,{value:"CountQueuingStrategy",configurable:!0});class TransformStream{constructor(e={},t={},r={}){void 0===e&&(e=null);const o=Ve(t,"Second parameter"),n=Ve(r,"Third parameter"),s=function(e,t){L(e,t);const r=null==e?void 0:e.flush,o=null==e?void 0:e.readableType,n=null==e?void 0:e.start,s=null==e?void 0:e.transform,i=null==e?void 0:e.writableType;return{flush:void 0===r?void 0:Tr(r,e,`${t} has member 'flush' that`),readableType:o,start:void 0===n?void 0:qr(n,e,`${t} has member 'start' that`),transform:void 0===s?void 0:Pr(s,e,`${t} has member 'transform' that`),writableType:i}}(e,"First parameter");if(void 0!==s.readableType)throw new RangeError("Invalid readableType specified");if(void 0!==s.writableType)throw new RangeError("Invalid writableType specified");const i=Ne(n,0),a=Qe(n),u=Ne(o,1),l=Qe(o);let c;!function(e,t,r,o,n,s){function i(){return t}function a(t){return function(e,t){const r=e._transformStreamController;if(e._backpressure){return g(e._backpressureChangePromise,(()=>{const o=e._writable;if("erroring"===o._state)throw o._storedError;return Wr(r,t)}))}return Wr(r,t)}(e,t)}function u(t){return function(e,t){return Er(e,t),p(void 0)}(e,t)}function l(){return function(e){const t=e._readable,r=e._transformStreamController,o=r._flushAlgorithm();return kr(r),g(o,(()=>{if("errored"===t._state)throw t._storedError;Yt(t._readableStreamController)}),(r=>{throw Er(e,r),t._storedError}))}(e)}function c(){return function(e){return Or(e,!1),e._backpressureChangePromise}(e)}function d(t){return Ar(e,t),p(void 0)}e._writable=function(e,t,r,o,n=1,s=(()=>1)){const i=Object.create(WritableStream.prototype);return rt(i),wt(i,Object.create(WritableStreamDefaultController.prototype),e,t,r,o,n,s),i}(i,a,l,u,r,o),e._readable=ur(i,c,d,n,s),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,Or(e,!0),e._transformStreamController=void 0}(this,f((e=>{c=e})),u,l,i,a),function(e,t){const r=Object.create(TransformStreamDefaultController.prototype);let o=e=>{try{return Br(r,e),p(void 0)}catch(e){return h(e)}},n=()=>p(void 0);void 0!==t.transform&&(o=e=>t.transform(e,r));void 0!==t.flush&&(n=()=>t.flush(r));!function(e,t,r,o){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=o}(e,r,o,n)}(this,s),void 0!==s.start?c(s.start(this._transformStreamController)):c(void 0)}get readable(){if(!Cr(this))throw xr("readable");return this._readable}get writable(){if(!Cr(this))throw xr("writable");return this._writable}}function Cr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")&&e instanceof TransformStream)}function Er(e,t){Jt(e._readable._readableStreamController,t),Ar(e,t)}function Ar(e,t){kr(e._transformStreamController),qt(e._writable._writableStreamController,t),e._backpressure&&Or(e,!1)}function Or(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=f((t=>{e._backpressureChangePromise_resolve=t})),e._backpressure=t}Object.defineProperties(TransformStream.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(TransformStream.prototype,o.toStringTag,{value:"TransformStream",configurable:!0});class TransformStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!jr(this))throw Dr("desiredSize");return Kt(this._controlledTransformStream._readable._readableStreamController)}enqueue(e){if(!jr(this))throw Dr("enqueue");Br(this,e)}error(e){if(!jr(this))throw Dr("error");var t;t=e,Er(this._controlledTransformStream,t)}terminate(){if(!jr(this))throw Dr("terminate");!function(e){const t=e._controlledTransformStream;Yt(t._readable._readableStreamController);const r=new TypeError("TransformStream terminated");Ar(t,r)}(this)}}function jr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")&&e instanceof TransformStreamDefaultController)}function kr(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function Br(e,t){const r=e._controlledTransformStream,o=r._readable._readableStreamController;if(!Zt(o))throw new TypeError("Readable side is not in a state that permits enqueue");try{Gt(o,t)}catch(e){throw Ar(r,e),r._readable._storedError}const n=function(e){return!Qt(e)}(o);n!==r._backpressure&&Or(r,!0)}function Wr(e,t){return g(e._transformAlgorithm(t),void 0,(t=>{throw Er(e._controlledTransformStream,t),t}))}function Dr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function xr(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}Object.defineProperties(TransformStreamDefaultController.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof o.toStringTag&&Object.defineProperty(TransformStreamDefaultController.prototype,o.toStringTag,{value:"TransformStreamDefaultController",configurable:!0})}},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var s=t[o]={id:o,loaded:!1,exports:{}};return e[o].call(s.exports,s,s.exports,r),s.loaded=!0,s.exports}return r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r(48)})()}));
3
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2Fib3J0LWNvbnRyb2xsZXIvZGlzdC9hYm9ydC1jb250cm9sbGVyLmpzIiwid2VicGFjazovL21haWxndW4vLi9pbmRleC50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2NsaWVudC50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2RvbWFpbnMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9kb21haW5zQ3JlZGVudGlhbHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9kb21haW5zVGVtcGxhdGVzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvZXJyb3IudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9ldmVudHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9pcC1wb29scy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2lwcy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2xpc3RzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvbWFpbExpc3RNZW1iZXJzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvbWVzc2FnZXMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9tdWx0aXBsZVZhbGlkYXRpb24udHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9yZXF1ZXN0LnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvcm91dGVzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvc3RhdHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9zdXBwcmVzc2lvbnMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi92YWxpZGF0ZS50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3dlYmhvb2tzLnRzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvYmFzZS02NC9iYXNlNjQuanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9kYXRhLXVyaS10by1idWZmZXIvZGlzdC9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9ldmVudC10YXJnZXQtc2hpbS9kaXN0L2V2ZW50LXRhcmdldC1zaGltLmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvZmV0Y2gtYmxvYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2t5LXVuaXZlcnNhbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2t5L3VtZC5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL3VybC1qb2luL2xpYi91cmwtam9pbi5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJodHRwXCIiLCJ3ZWJwYWNrOi8vbWFpbGd1bi9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiaHR0cHNcIiIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJzdHJlYW1cIiIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ1cmxcIiIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ1dGlsXCIiLCJ3ZWJwYWNrOi8vbWFpbGd1bi9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiemxpYlwiIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvbm9kZS1mZXRjaC9kaXN0L2luZGV4LmNqcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL3dlYi1zdHJlYW1zLXBvbHlmaWxsL2Rpc3QvcG9ueWZpbGwuZXMyMDE4Lm1qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL21haWxndW4vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL21haWxndW4vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL21haWxndW4vd2VicGFjay9zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIm1haWxndW5cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wibWFpbGd1blwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIGV2ZW50VGFyZ2V0U2hpbSA9IHJlcXVpcmUoJ2V2ZW50LXRhcmdldC1zaGltJyk7XG5cbi8qKlxuICogVGhlIHNpZ25hbCBjbGFzcy5cbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNhYm9ydHNpZ25hbFxuICovXG5jbGFzcyBBYm9ydFNpZ25hbCBleHRlbmRzIGV2ZW50VGFyZ2V0U2hpbS5FdmVudFRhcmdldCB7XG4gICAgLyoqXG4gICAgICogQWJvcnRTaWduYWwgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWJvcnRTaWduYWwgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGBBYm9ydFNpZ25hbGAncyBgQWJvcnRDb250cm9sbGVyYCBoYXMgc2lnbmFsZWQgdG8gYWJvcnQsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBnZXQgYWJvcnRlZCgpIHtcbiAgICAgICAgY29uc3QgYWJvcnRlZCA9IGFib3J0ZWRGbGFncy5nZXQodGhpcyk7XG4gICAgICAgIGlmICh0eXBlb2YgYWJvcnRlZCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkICd0aGlzJyB0byBiZSBhbiAnQWJvcnRTaWduYWwnIG9iamVjdCwgYnV0IGdvdCAke3RoaXMgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiB0aGlzfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhYm9ydGVkO1xuICAgIH1cbn1cbmV2ZW50VGFyZ2V0U2hpbS5kZWZpbmVFdmVudEF0dHJpYnV0ZShBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFwiYWJvcnRcIik7XG4vKipcbiAqIENyZWF0ZSBhbiBBYm9ydFNpZ25hbCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFib3J0U2lnbmFsKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IE9iamVjdC5jcmVhdGUoQWJvcnRTaWduYWwucHJvdG90eXBlKTtcbiAgICBldmVudFRhcmdldFNoaW0uRXZlbnRUYXJnZXQuY2FsbChzaWduYWwpO1xuICAgIGFib3J0ZWRGbGFncy5zZXQoc2lnbmFsLCBmYWxzZSk7XG4gICAgcmV0dXJuIHNpZ25hbDtcbn1cbi8qKlxuICogQWJvcnQgYSBnaXZlbiBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIGFib3J0U2lnbmFsKHNpZ25hbCkge1xuICAgIGlmIChhYm9ydGVkRmxhZ3MuZ2V0KHNpZ25hbCkgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWJvcnRlZEZsYWdzLnNldChzaWduYWwsIHRydWUpO1xuICAgIHNpZ25hbC5kaXNwYXRjaEV2ZW50KHsgdHlwZTogXCJhYm9ydFwiIH0pO1xufVxuLyoqXG4gKiBBYm9ydGVkIGZsYWcgZm9yIGVhY2ggaW5zdGFuY2VzLlxuICovXG5jb25zdCBhYm9ydGVkRmxhZ3MgPSBuZXcgV2Vha01hcCgpO1xuLy8gUHJvcGVydGllcyBzaG91bGQgYmUgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFib3J0U2lnbmFsLnByb3RvdHlwZSwge1xuICAgIGFib3J0ZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxufSk7XG4vLyBgdG9TdHJpbmcoKWAgc2hvdWxkIHJldHVybiBgXCJbb2JqZWN0IEFib3J0U2lnbmFsXVwiYFxuaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSBcInN5bWJvbFwiKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFib3J0U2lnbmFsLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFwiQWJvcnRTaWduYWxcIixcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgQWJvcnRDb250cm9sbGVyLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2Fib3J0Y29udHJvbGxlclxuICovXG5jbGFzcyBBYm9ydENvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhpcyBjb250cm9sbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzaWduYWxzLnNldCh0aGlzLCBjcmVhdGVBYm9ydFNpZ25hbCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYEFib3J0U2lnbmFsYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGdldCBzaWduYWwoKSB7XG4gICAgICAgIHJldHVybiBnZXRTaWduYWwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFib3J0IGFuZCBzaWduYWwgdG8gYW55IG9ic2VydmVycyB0aGF0IHRoZSBhc3NvY2lhdGVkIGFjdGl2aXR5IGlzIHRvIGJlIGFib3J0ZWQuXG4gICAgICovXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIGFib3J0U2lnbmFsKGdldFNpZ25hbCh0aGlzKSk7XG4gICAgfVxufVxuLyoqXG4gKiBBc3NvY2lhdGVkIHNpZ25hbHMuXG4gKi9cbmNvbnN0IHNpZ25hbHMgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBHZXQgdGhlIGFzc29jaWF0ZWQgc2lnbmFsIG9mIGEgZ2l2ZW4gY29udHJvbGxlci5cbiAqL1xuZnVuY3Rpb24gZ2V0U2lnbmFsKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzaWduYWwgPSBzaWduYWxzLmdldChjb250cm9sbGVyKTtcbiAgICBpZiAoc2lnbmFsID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJ3RoaXMnIHRvIGJlIGFuICdBYm9ydENvbnRyb2xsZXInIG9iamVjdCwgYnV0IGdvdCAke2NvbnRyb2xsZXIgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBjb250cm9sbGVyfWApO1xuICAgIH1cbiAgICByZXR1cm4gc2lnbmFsO1xufVxuLy8gUHJvcGVydGllcyBzaG91bGQgYmUgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFib3J0Q29udHJvbGxlci5wcm90b3R5cGUsIHtcbiAgICBzaWduYWw6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGFib3J0OiB7IGVudW1lcmFibGU6IHRydWUgfSxcbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSBcInN5bWJvbFwiKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFib3J0Q29udHJvbGxlci5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBcIkFib3J0Q29udHJvbGxlclwiLFxuICAgIH0pO1xufVxuXG5leHBvcnRzLkFib3J0Q29udHJvbGxlciA9IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydHMuQWJvcnRTaWduYWwgPSBBYm9ydFNpZ25hbDtcbmV4cG9ydHMuZGVmYXVsdCA9IEFib3J0Q29udHJvbGxlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBBYm9ydENvbnRyb2xsZXJcbm1vZHVsZS5leHBvcnRzLkFib3J0Q29udHJvbGxlciA9IG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEFib3J0Q29udHJvbGxlclxubW9kdWxlLmV4cG9ydHMuQWJvcnRTaWduYWwgPSBBYm9ydFNpZ25hbFxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWJvcnQtY29udHJvbGxlci5qcy5tYXBcbiIsImltcG9ydCBDbGllbnQgZnJvbSAnLi9saWIvY2xpZW50JztcbmltcG9ydCB7IElucHV0Rm9ybURhdGEgfSBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL0lGb3JtRGF0YSc7XG5pbXBvcnQgT3B0aW9ucyBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL09wdGlvbnMnO1xuXG5jbGFzcyBNYWlsZ3VuIHtcbiAgcHJpdmF0ZSBmb3JtRGF0YTogSW5wdXRGb3JtRGF0YVxuXG4gIGNvbnN0cnVjdG9yKEZvcm1EYXRhOiBJbnB1dEZvcm1EYXRhKSB7XG4gICAgdGhpcy5mb3JtRGF0YSA9IEZvcm1EYXRhO1xuICB9XG5cbiAgY2xpZW50KG9wdGlvbnM6IE9wdGlvbnMpIDogQ2xpZW50IHtcbiAgICByZXR1cm4gbmV3IENsaWVudChvcHRpb25zLCB0aGlzLmZvcm1EYXRhKTtcbiAgfVxufVxuXG5leHBvcnQgPSBNYWlsZ3VuO1xuIiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IE9wdGlvbnMgZnJvbSAnLi9pbnRlcmZhY2VzL09wdGlvbnMnO1xuaW1wb3J0IFJlcXVlc3RPcHRpb25zIGZyb20gJy4vaW50ZXJmYWNlcy9SZXF1ZXN0T3B0aW9ucyc7XG5cbmltcG9ydCBEb21haW5DbGllbnQgZnJvbSAnLi9kb21haW5zJztcbmltcG9ydCBFdmVudENsaWVudCBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgU3RhdHNDbGllbnQgZnJvbSAnLi9zdGF0cyc7XG5pbXBvcnQgU3VwcHJlc3Npb25DbGllbnQgZnJvbSAnLi9zdXBwcmVzc2lvbnMnO1xuaW1wb3J0IFdlYmhvb2tDbGllbnQgZnJvbSAnLi93ZWJob29rcyc7XG5pbXBvcnQgTWVzc2FnZXNDbGllbnQgZnJvbSAnLi9tZXNzYWdlcyc7XG5pbXBvcnQgUm91dGVzQ2xpZW50IGZyb20gJy4vcm91dGVzJztcbmltcG9ydCBWYWxpZGF0ZUNsaWVudCBmcm9tICcuL3ZhbGlkYXRlJztcbmltcG9ydCBJcHNDbGllbnQgZnJvbSAnLi9pcHMnO1xuaW1wb3J0IElwUG9vbHNDbGllbnQgZnJvbSAnLi9pcC1wb29scyc7XG5pbXBvcnQgTGlzdHNDbGllbnQgZnJvbSAnLi9saXN0cyc7XG5pbXBvcnQgTWFpbExpc3RzTWVtYmVycyBmcm9tICcuL21haWxMaXN0TWVtYmVycyc7XG5pbXBvcnQgeyBJbnB1dEZvcm1EYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lGb3JtRGF0YSc7XG5pbXBvcnQgRG9tYWluQ3JlZGVudGlhbHNDbGllbnQgZnJvbSAnLi9kb21haW5zQ3JlZGVudGlhbHMnO1xuaW1wb3J0IE11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCBmcm9tICcuL211bHRpcGxlVmFsaWRhdGlvbic7XG5pbXBvcnQgRG9tYWluVGVtcGxhdGVzQ2xpZW50IGZyb20gJy4vZG9tYWluc1RlbXBsYXRlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudCB7XG4gIHByaXZhdGUgcmVxdWVzdDtcblxuICBwdWJsaWMgZG9tYWlucztcbiAgcHVibGljIHdlYmhvb2tzO1xuICBwdWJsaWMgZXZlbnRzO1xuICBwdWJsaWMgc3RhdHM7XG4gIHB1YmxpYyBzdXBwcmVzc2lvbnM7XG4gIHB1YmxpYyBtZXNzYWdlcztcbiAgcHVibGljIHJvdXRlcztcbiAgcHVibGljIHZhbGlkYXRlO1xuICBwdWJsaWMgaXBzO1xuICBwdWJsaWMgaXBfcG9vbHM7XG4gIHB1YmxpYyBsaXN0cztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zLCBmb3JtRGF0YTogSW5wdXRGb3JtRGF0YSkge1xuICAgIGNvbnN0IGNvbmZpZzogUmVxdWVzdE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfSBhcyBSZXF1ZXN0T3B0aW9ucztcblxuICAgIGlmICghY29uZmlnLnVybCkge1xuICAgICAgY29uZmlnLnVybCA9ICdodHRwczovL2FwaS5tYWlsZ3VuLm5ldCc7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcudXNlcm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIFwidXNlcm5hbWVcIiBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXIgXCJrZXlcIiBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLnJlcXVlc3QgPSBuZXcgUmVxdWVzdChjb25maWcsIGZvcm1EYXRhKTtcbiAgICBjb25zdCBtYWlsTGlzdHNNZW1iZXJzID0gbmV3IE1haWxMaXN0c01lbWJlcnModGhpcy5yZXF1ZXN0KTtcbiAgICBjb25zdCBkb21haW5DcmVkZW50aWFsc0NsaWVudCA9IG5ldyBEb21haW5DcmVkZW50aWFsc0NsaWVudCh0aGlzLnJlcXVlc3QpO1xuICAgIGNvbnN0IGRvbWFpblRlbXBsYXRlc0NsaWVudCA9IG5ldyBEb21haW5UZW1wbGF0ZXNDbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICBjb25zdCBtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQgPSBuZXcgTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50KHRoaXMucmVxdWVzdCk7XG5cbiAgICB0aGlzLmRvbWFpbnMgPSBuZXcgRG9tYWluQ2xpZW50KHRoaXMucmVxdWVzdCwgZG9tYWluQ3JlZGVudGlhbHNDbGllbnQsIGRvbWFpblRlbXBsYXRlc0NsaWVudCk7XG4gICAgdGhpcy53ZWJob29rcyA9IG5ldyBXZWJob29rQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRDbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICB0aGlzLnN0YXRzID0gbmV3IFN0YXRzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5zdXBwcmVzc2lvbnMgPSBuZXcgU3VwcHJlc3Npb25DbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICB0aGlzLm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5yb3V0ZXMgPSBuZXcgUm91dGVzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5pcHMgPSBuZXcgSXBzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5pcF9wb29scyA9IG5ldyBJcFBvb2xzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5saXN0cyA9IG5ldyBMaXN0c0NsaWVudCh0aGlzLnJlcXVlc3QsIG1haWxMaXN0c01lbWJlcnMpO1xuICAgIHRoaXMudmFsaWRhdGUgPSBuZXcgVmFsaWRhdGVDbGllbnQodGhpcy5yZXF1ZXN0LCBtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQpO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCB7XG4gIERvbWFpblJlc3BvbnNlRGF0YSxcbiAgRGVzdHJveWVkRG9tYWluUmVzcG9uc2UsXG4gIERvbWFpbnNRdWVyeSxcbiAgRG9tYWluSW5mbyxcbiAgRG9tYWluTGlzdFJlc3BvbnNlRGF0YSxcbiAgRG9tYWluU2hvcnREYXRhLFxuICBETlNSZWNvcmQsXG4gIENvbm5lY3Rpb25TZXR0aW5nc1Jlc3BvbnNlLFxuICBDb25uZWN0aW9uU2V0dGluZ3MsXG4gIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3MsXG4gIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3NSZXMsXG4gIERLSU1BdXRob3JpdHlJbmZvLFxuICBVcGRhdGVkREtJTUF1dGhvcml0eSxcbiAgVXBkYXRlZERLSU1BdXRob3JpdHlSZXNwb25zZSxcbiAgREtJTVNlbGVjdG9ySW5mbyxcbiAgVXBkYXRlZERLSU1TZWxlY3RvclJlc3BvbnNlLFxuICBXZWJQcmVmaXhJbmZvLFxuICBVcGRhdGVkV2ViUHJlZml4UmVzcG9uc2UsXG4gIFJlcGxhY2VtZW50Rm9yUG9vbCxcbiAgTWVzc2FnZVJlc3BvbnNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWlucyc7XG5cbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IEFQSUVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcblxuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIERvbWFpblRyYWNraW5nUmVzcG9uc2UsXG4gIERvbWFpblRyYWNraW5nRGF0YSxcbiAgT3BlblRyYWNraW5nSW5mbyxcbiAgQ2xpY2tUcmFja2luZ0luZm8sXG4gIFVuc3Vic2NyaWJlVHJhY2tpbmdJbmZvLFxuICBVcGRhdGVEb21haW5UcmFja2luZ1Jlc3BvbnNlLFxuICBVcGRhdGVkT3BlblRyYWNraW5nXG59IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UcmFja2luZyc7XG5pbXBvcnQgeyBJRG9tYWluQ3JlZGVudGlhbHMgfSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluQ3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgSURvbWFpblRlbXBsYXRlc0NsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UZW1wbGF0ZXMnO1xuaW1wb3J0IERvbWFpbkNyZWRlbnRpYWxzQ2xpZW50IGZyb20gJy4vZG9tYWluc0NyZWRlbnRpYWxzJztcbmltcG9ydCBEb21haW5UZW1wbGF0ZXNDbGllbnQgZnJvbSAnLi9kb21haW5zVGVtcGxhdGVzJztcblxuZXhwb3J0IGNsYXNzIERvbWFpbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVxdWlyZV90bHM6IGJvb2xlYW47XG4gIHNraXBfdmVyaWZpY2F0aW9uOiBib29sZWFuO1xuICBzdGF0ZTogc3RyaW5nO1xuICB3aWxkY2FyZDogYm9vbGVhbjtcbiAgc3BhbV9hY3Rpb246IHN0cmluZztcbiAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICBzbXRwX3Bhc3N3b3JkOiBzdHJpbmc7XG4gIHNtdHBfbG9naW46IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICByZWNlaXZpbmdfZG5zX3JlY29yZHM6IEROU1JlY29yZFtdIHwgbnVsbDtcbiAgc2VuZGluZ19kbnNfcmVjb3JkczogRE5TUmVjb3JkW10gfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IERvbWFpblNob3J0RGF0YSwgcmVjZWl2aW5nPzogRE5TUmVjb3JkW10gfCBudWxsLCBzZW5kaW5nPzogRE5TUmVjb3JkW10gfCBudWxsKSB7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMucmVxdWlyZV90bHMgPSBkYXRhLnJlcXVpcmVfdGxzO1xuICAgIHRoaXMuc2tpcF92ZXJpZmljYXRpb24gPSBkYXRhLnNraXBfdmVyaWZpY2F0aW9uO1xuICAgIHRoaXMuc3RhdGUgPSBkYXRhLnN0YXRlO1xuICAgIHRoaXMud2lsZGNhcmQgPSBkYXRhLndpbGRjYXJkO1xuICAgIHRoaXMuc3BhbV9hY3Rpb24gPSBkYXRhLnNwYW1fYWN0aW9uO1xuICAgIHRoaXMuY3JlYXRlZF9hdCA9IGRhdGEuY3JlYXRlZF9hdDtcbiAgICB0aGlzLnNtdHBfcGFzc3dvcmQgPSBkYXRhLnNtdHBfcGFzc3dvcmQ7XG4gICAgdGhpcy5zbXRwX2xvZ2luID0gZGF0YS5zbXRwX2xvZ2luO1xuICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcblxuICAgIHRoaXMucmVjZWl2aW5nX2Ruc19yZWNvcmRzID0gcmVjZWl2aW5nIHx8IG51bGw7XG4gICAgdGhpcy5zZW5kaW5nX2Ruc19yZWNvcmRzID0gc2VuZGluZyB8fCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbWFpbkNsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG4gIHB1YmxpYyBkb21haW5DcmVkZW50aWFsczogSURvbWFpbkNyZWRlbnRpYWxzO1xuICBwdWJsaWMgZG9tYWluVGVtcGxhdGVzOiBJRG9tYWluVGVtcGxhdGVzQ2xpZW50XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBkb21haW5DcmVkZW50aWFsc0NsaWVudDogRG9tYWluQ3JlZGVudGlhbHNDbGllbnQsXG4gICAgZG9tYWluVGVtcGxhdGVzQ2xpZW50OiBEb21haW5UZW1wbGF0ZXNDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmRvbWFpbkNyZWRlbnRpYWxzID0gZG9tYWluQ3JlZGVudGlhbHNDbGllbnQ7XG4gICAgdGhpcy5kb21haW5UZW1wbGF0ZXMgPSBkb21haW5UZW1wbGF0ZXNDbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZU1lc3NhZ2UocmVzcG9uc2U6IERlc3Ryb3llZERvbWFpblJlc3BvbnNlKSA6IE1lc3NhZ2VSZXNwb25zZSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZURvbWFpbkxpc3QocmVzcG9uc2U6IERvbWFpbkxpc3RSZXNwb25zZURhdGEpOiBEb21haW5bXSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHkuaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gbmV3IERvbWFpbihpdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRG9tYWluKHJlc3BvbnNlOiBEb21haW5SZXNwb25zZURhdGEpOiBEb21haW4ge1xuICAgIHJldHVybiBuZXcgRG9tYWluKFxuICAgICAgcmVzcG9uc2UuYm9keS5kb21haW4sXG4gICAgICByZXNwb25zZS5ib2R5LnJlY2VpdmluZ19kbnNfcmVjb3JkcyxcbiAgICAgIHJlc3BvbnNlLmJvZHkuc2VuZGluZ19kbnNfcmVjb3Jkc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVRyYWNraW5nU2V0dGluZ3MocmVzcG9uc2U6IERvbWFpblRyYWNraW5nUmVzcG9uc2UpIDogRG9tYWluVHJhY2tpbmdEYXRhIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keS50cmFja2luZztcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVHJhY2tpbmdVcGRhdGUocmVzcG9uc2U6IFVwZGF0ZURvbWFpblRyYWNraW5nUmVzcG9uc2UpIDpVcGRhdGVkT3BlblRyYWNraW5nIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgfVxuXG4gIGxpc3QocXVlcnk/OiBEb21haW5zUXVlcnkpOiBQcm9taXNlPERvbWFpbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92My9kb21haW5zJywgcXVlcnkpXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRG9tYWluTGlzdChyZXMgYXMgRG9tYWluTGlzdFJlc3BvbnNlRGF0YSkpO1xuICB9XG5cbiAgZ2V0KGRvbWFpbjogc3RyaW5nKSA6IFByb21pc2U8RG9tYWluPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYC92My9kb21haW5zLyR7ZG9tYWlufWApXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRG9tYWluKHJlcyBhcyBEb21haW5SZXNwb25zZURhdGEpKTtcbiAgfVxuXG4gIGNyZWF0ZShkYXRhOiBEb21haW5JbmZvKSA6IFByb21pc2U8RG9tYWluPiB7XG4gICAgY29uc3QgcG9zdE9iaiA9IHsgLi4uZGF0YSB9O1xuICAgIGlmICgnZm9yY2VfZGtpbV9hdXRob3JpdHknIGluIHBvc3RPYmogJiYgdHlwZW9mIHBvc3RPYmouZm9yY2VfZGtpbV9hdXRob3JpdHkgPT09ICdib29sZWFuJykge1xuICAgICAgcG9zdE9iai5mb3JjZV9ka2ltX2F1dGhvcml0eSA9IHBvc3RPYmoudG9TdHJpbmcoKSA9PT0gJ3RydWUnID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoJy92My9kb21haW5zJywgcG9zdE9iailcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW4ocmVzIGFzIERvbWFpblJlc3BvbnNlRGF0YSkpO1xuICB9XG5cbiAgZGVzdHJveShkb21haW46IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYC92My9kb21haW5zLyR7ZG9tYWlufWApXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlTWVzc2FnZShyZXMgYXMgRGVzdHJveWVkRG9tYWluUmVzcG9uc2UpKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb25TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vY29ubmVjdGlvbmApXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHJlcyBhcyBDb25uZWN0aW9uU2V0dGluZ3NSZXNwb25zZSlcbiAgICAgIC50aGVuKChyZXM6Q29ubmVjdGlvblNldHRpbmdzUmVzcG9uc2UpID0+IHJlcy5ib2R5LmNvbm5lY3Rpb24gYXMgQ29ubmVjdGlvblNldHRpbmdzKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbm5lY3Rpb24oZG9tYWluOiBzdHJpbmcsIGRhdGE6IENvbm5lY3Rpb25TZXR0aW5ncyk6IFByb21pc2U8VXBkYXRlZENvbm5lY3Rpb25TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vY29ubmVjdGlvbmAsIGRhdGEpXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHJlcyBhcyBVcGRhdGVkQ29ubmVjdGlvblNldHRpbmdzUmVzKVxuICAgICAgLnRoZW4oKHJlczpVcGRhdGVkQ29ubmVjdGlvblNldHRpbmdzUmVzKSA9PiByZXMuYm9keSBhcyBVcGRhdGVkQ29ubmVjdGlvblNldHRpbmdzKTtcbiAgfVxuXG4gIC8vIFRyYWNraW5nXG5cbiAgZ2V0VHJhY2tpbmcoZG9tYWluOiBzdHJpbmcpIDogUHJvbWlzZTxEb21haW5UcmFja2luZ0RhdGE+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3RyYWNraW5nJykpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVRyYWNraW5nU2V0dGluZ3MpO1xuICB9XG5cbiAgdXBkYXRlVHJhY2tpbmcoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGRhdGE6IE9wZW5UcmFja2luZ0luZm8gfCBDbGlja1RyYWNraW5nSW5mbyB8IFVuc3Vic2NyaWJlVHJhY2tpbmdJbmZvXG4gICk6IFByb21pc2U8VXBkYXRlZE9wZW5UcmFja2luZz4ge1xuICAgIGlmICh0eXBlb2YgZGF0YT8uYWN0aXZlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBBUElFcnJvcih7IHN0YXR1czogNDAwLCBzdGF0dXNUZXh0OiAnJywgYm9keTogeyBtZXNzYWdlOiAnUHJvcGVydHkgXCJhY3RpdmVcIiBtdXN0IGNvbnRhaW4gc3RyaW5nIHZhbHVlLicgfSB9IGFzIEFQSUVycm9yT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAndHJhY2tpbmcnLCB0eXBlKSwgZGF0YSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VUcmFja2luZ1VwZGF0ZShyZXMgYXMgVXBkYXRlRG9tYWluVHJhY2tpbmdSZXNwb25zZSkpO1xuICB9XG5cbiAgLy8gSVBzXG5cbiAgZ2V0SXBzKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJykpXG4gICAgICAudGhlbigocmVzcG9uc2U6IEFQSVJlc3BvbnNlKSA9PiByZXNwb25zZT8uYm9keT8uaXRlbXMpO1xuICB9XG5cbiAgYXNzaWduSXAoZG9tYWluOiBzdHJpbmcsIGlwOiBzdHJpbmcpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJyksIHsgaXAgfSk7XG4gIH1cblxuICBkZWxldGVJcChkb21haW46IHN0cmluZywgaXA6IHN0cmluZyk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ2lwcycsIGlwKSk7XG4gIH1cblxuICBsaW5rSXBQb29sKGRvbWFpbjogc3RyaW5nLCBwb29sX2lkOiBzdHJpbmcpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJyksIHsgcG9vbF9pZCB9KTtcbiAgfVxuXG4gIHVubGlua0lwUG9sbChkb21haW46IHN0cmluZywgcmVwbGFjZW1lbnQ6IFJlcGxhY2VtZW50Rm9yUG9vbCk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICBsZXQgc2VhcmNoUGFyYW1zID0gJyc7XG4gICAgaWYgKHJlcGxhY2VtZW50LnBvb2xfaWQgJiYgcmVwbGFjZW1lbnQuaXApIHtcbiAgICAgIHRocm93IG5ldyBBUElFcnJvcih7IHN0YXR1czogNDAwLCBzdGF0dXNUZXh0OiAnJywgYm9keTogeyBtZXNzYWdlOiAnUGxlYXNlIHNwZWNpZnkgZWl0aGVyIHBvb2xfaWQgb3IgaXAgKG5vdCBib3RoKScgfSB9IGFzIEFQSUVycm9yT3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChyZXBsYWNlbWVudC5wb29sX2lkKSB7XG4gICAgICBzZWFyY2hQYXJhbXMgPSBgP3Bvb2xfaWQ9JHtyZXBsYWNlbWVudC5wb29sX2lkfWA7XG4gICAgfSBlbHNlIGlmIChyZXBsYWNlbWVudC5pcCkge1xuICAgICAgc2VhcmNoUGFyYW1zID0gYD9pcD0ke3JlcGxhY2VtZW50LmlwfWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJywgJ2lwX3Bvb2wnLCBzZWFyY2hQYXJhbXMpKTtcbiAgfVxuXG4gIHVwZGF0ZURLSU1BdXRob3JpdHkoZG9tYWluOiBzdHJpbmcsIGRhdGE6IERLSU1BdXRob3JpdHlJbmZvKTogUHJvbWlzZTxVcGRhdGVkREtJTUF1dGhvcml0eT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vZGtpbV9hdXRob3JpdHlgLCB7fSwgeyBxdWVyeTogYHNlbGY9JHtkYXRhLnNlbGZ9YCB9KVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiByZXMpXG4gICAgICAudGhlbigocmVzIDogVXBkYXRlZERLSU1BdXRob3JpdHlSZXNwb25zZSkgPT4gcmVzLmJvZHkgYXMgVXBkYXRlZERLSU1BdXRob3JpdHkpO1xuICB9XG5cbiAgdXBkYXRlREtJTVNlbGVjdG9yKGRvbWFpbjogc3RyaW5nLCBkYXRhOiBES0lNU2VsZWN0b3JJbmZvKTogUHJvbWlzZTxVcGRhdGVkREtJTVNlbGVjdG9yUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dChgL3YzL2RvbWFpbnMvJHtkb21haW59L2RraW1fc2VsZWN0b3JgLCB7fSwgeyBxdWVyeTogYGRraW1fc2VsZWN0b3I9JHtkYXRhLmRraW1TZWxlY3Rvcn1gIH0pXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHJlcyBhcyBVcGRhdGVkREtJTVNlbGVjdG9yUmVzcG9uc2UpO1xuICB9XG5cbiAgdXBkYXRlV2ViUHJlZml4KGRvbWFpbjogc3RyaW5nLCBkYXRhOiBXZWJQcmVmaXhJbmZvKTogUHJvbWlzZTxVcGRhdGVkV2ViUHJlZml4UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dChgL3YzL2RvbWFpbnMvJHtkb21haW59L3dlYl9wcmVmaXhgLCB7fSwgeyBxdWVyeTogYHdlYl9wcmVmaXg9JHtkYXRhLndlYlByZWZpeH1gIH0pXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHJlcyBhcyBVcGRhdGVkV2ViUHJlZml4UmVzcG9uc2UpO1xuICB9XG59XG4iLCJpbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQgQVBJUmVzcG9uc2UgZnJvbSAnLi9pbnRlcmZhY2VzL0FwaVJlc3BvbnNlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmltcG9ydCB7XG4gIENyZWF0ZWRVcGRhdGVkRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZSxcbiAgRGVsZXRlZERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2UsXG4gIERvbWFpbkNyZWRlbnRpYWxzLFxuICBEb21haW5DcmVkZW50aWFsc0xpc3QsXG4gIERvbWFpbkNyZWRlbnRpYWxzUXVlcnksXG4gIERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2VEYXRhLFxuICBEb21haW5DcmVkZW50aWFsc1Jlc3VsdCxcbiAgSURvbWFpbkNyZWRlbnRpYWxzLFxuICBVcGRhdGVEb21haW5DcmVkZW50aWFsc0RhdGFcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0RvbWFpbkNyZWRlbnRpYWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9tYWluQ3JlZGVudGlhbHNDbGllbnQgaW1wbGVtZW50cyBJRG9tYWluQ3JlZGVudGlhbHMge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvZG9tYWlucy8nO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VEb21haW5DcmVkZW50aWFsc0xpc3QoXG4gICAgcmVzcG9uc2U6IERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2VEYXRhXG4gICk6IERvbWFpbkNyZWRlbnRpYWxzTGlzdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiByZXNwb25zZS5ib2R5Lml0ZW1zLFxuICAgICAgdG90YWxDb3VudDogcmVzcG9uc2UuYm9keS50b3RhbF9jb3VudFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZU1lc3NhZ2VSZXNwb25zZShcbiAgICByZXNwb25zZTogQ3JlYXRlZFVwZGF0ZWREb21haW5DcmVkZW50aWFsc1Jlc3BvbnNlXG4gICk6IERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmJvZHkubWVzc2FnZVxuICAgIH0gYXMgRG9tYWluQ3JlZGVudGlhbHNSZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRGVsZXRlZFJlc3BvbnNlKFxuICAgIHJlc3BvbnNlOkRlbGV0ZWREb21haW5DcmVkZW50aWFsc1Jlc3BvbnNlXG4gICk6IERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmJvZHkubWVzc2FnZSxcbiAgICAgIHNwZWM6IHJlc3BvbnNlLmJvZHkuc3BlY1xuICAgIH0gYXMgRG9tYWluQ3JlZGVudGlhbHNSZXN1bHQ7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbGlzdChkb21haW46IHN0cmluZywgcXVlcnk/OiBEb21haW5DcmVkZW50aWFsc1F1ZXJ5KTogUHJvbWlzZTxEb21haW5DcmVkZW50aWFsc0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvY3JlZGVudGlhbHMnKSwgcXVlcnkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRG9tYWluQ3JlZGVudGlhbHNMaXN0KHJlcyBhcyBEb21haW5DcmVkZW50aWFsc1Jlc3BvbnNlRGF0YSlcbiAgICAgICk7XG4gIH1cblxuICBjcmVhdGUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluQ3JlZGVudGlhbHNcbiAgKTogUHJvbWlzZTxEb21haW5DcmVkZW50aWFsc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0ke2RvbWFpbn0vY3JlZGVudGlhbHNgLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlTWVzc2FnZVJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgdXBkYXRlKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzTG9naW46IHN0cmluZyxcbiAgICBkYXRhOiBVcGRhdGVEb21haW5DcmVkZW50aWFsc0RhdGFcbiAgKTogUHJvbWlzZTxEb21haW5DcmVkZW50aWFsc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKGAke3RoaXMuYmFzZVJvdXRlfSR7ZG9tYWlufS9jcmVkZW50aWFscy8ke2NyZWRlbnRpYWxzTG9naW59YCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXM6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZU1lc3NhZ2VSZXNwb25zZShyZXMpKTtcbiAgfVxuXG4gIGRlc3Ryb3koXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHNMb2dpbjogc3RyaW5nXG4gICk6IFByb21pc2U8RG9tYWluQ3JlZGVudGlhbHNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgJHt0aGlzLmJhc2VSb3V0ZX0ke2RvbWFpbn0vY3JlZGVudGlhbHMvJHtjcmVkZW50aWFsc0xvZ2lufWApXG4gICAgICAudGhlbigocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEZWxldGVkUmVzcG9uc2UocmVzKSk7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuaW1wb3J0IHtcbiAgQ3JlYXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSxcbiAgQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UsXG4gIENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdCxcbiAgRG9tYWluVGVtcGxhdGUsIERvbWFpblRlbXBsYXRlRGF0YSxcbiAgRG9tYWluVGVtcGxhdGVzUXVlcnksXG4gIERvbWFpblRlbXBsYXRlVXBkYXRlRGF0YSxcbiAgRG9tYWluVGVtcGxhdGVVcGRhdGVWZXJzaW9uRGF0YSxcbiAgRG9tYWluVGVtcGxhdGVWZXJzaW9uRGF0YSxcbiAgR2V0RG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSxcbiAgSURvbWFpblRlbXBsYXRlc0NsaWVudCxcbiAgTGlzdERvbWFpblRlbXBsYXRlc0FQSVJlc3BvbnNlLFxuICBMaXN0RG9tYWluVGVtcGxhdGVzUmVzdWx0LFxuICBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc0FQSVJlc3BvbnNlLFxuICBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc1Jlc3VsdCxcbiAgTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UsXG4gIE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdCxcbiAgTm90aWZpY2F0aW9uQVBJUmVzcG9uc2UsXG4gIE5vdGlmaWNhdGlvblJlc3VsdCxcbiAgU2hvcnRUZW1wbGF0ZVZlcnNpb24sXG4gIFRlbXBsYXRlUXVlcnksXG4gIFRlbXBsYXRlVmVyc2lvbixcbiAgVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZUFQSVJlc3BvbnNlLFxuICBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlUmVzdWx0XG59IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UZW1wbGF0ZXMnO1xuXG5leHBvcnQgY2xhc3MgRG9tYWluVGVtcGxhdGVJdGVtIGltcGxlbWVudHMgRG9tYWluVGVtcGxhdGUge1xuICBuYW1lIDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbiA6IHN0cmluZztcbiAgY3JlYXRlZEF0IDogRGF0ZSB8ICcnO1xuICBjcmVhdGVkQnkgOiBzdHJpbmc7XG4gIGlkIDogc3RyaW5nO1xuICB2ZXJzaW9uPzogVGVtcGxhdGVWZXJzaW9uO1xuICB2ZXJzaW9ucz86IFNob3J0VGVtcGxhdGVWZXJzaW9uW107XG5cbiAgY29uc3RydWN0b3IoZG9tYWluVGVtcGxhdGVGcm9tQVBJOiBEb21haW5UZW1wbGF0ZSkge1xuICAgIHRoaXMubmFtZSA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS5uYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkb21haW5UZW1wbGF0ZUZyb21BUEkuZGVzY3JpcHRpb247XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkuY3JlYXRlZEF0ID8gbmV3IERhdGUoZG9tYWluVGVtcGxhdGVGcm9tQVBJLmNyZWF0ZWRBdCkgOiAnJztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS5jcmVhdGVkQnk7XG4gICAgdGhpcy5pZCA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS5pZDtcblxuICAgIGlmIChkb21haW5UZW1wbGF0ZUZyb21BUEkudmVyc2lvbikge1xuICAgICAgdGhpcy52ZXJzaW9uID0gZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb247XG4gICAgICBpZiAoZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb24uY3JlYXRlZEF0KSB7XG4gICAgICAgIHRoaXMudmVyc2lvbi5jcmVhdGVkQXQgPSBuZXcgRGF0ZShkb21haW5UZW1wbGF0ZUZyb21BUEkudmVyc2lvbi5jcmVhdGVkQXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb21haW5UZW1wbGF0ZUZyb21BUEkudmVyc2lvbnMgJiYgZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb25zLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9ucyA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS52ZXJzaW9ucy5tYXAoKHZlcnNpb24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyAuLi52ZXJzaW9uIH07XG4gICAgICAgIHJlc3VsdC5jcmVhdGVkQXQgPSBuZXcgRGF0ZSh2ZXJzaW9uLmNyZWF0ZWRBdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9tYWluVGVtcGxhdGVzQ2xpZW50IGltcGxlbWVudHMgSURvbWFpblRlbXBsYXRlc0NsaWVudCB7XG4gIGJhc2VSb3V0ZTogc3RyaW5nO1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuYmFzZVJvdXRlID0gJy92My8nO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUNyZWF0aW9uUmVzcG9uc2UoZGF0YTogQ3JlYXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSk6IERvbWFpblRlbXBsYXRlSXRlbSB7XG4gICAgcmV0dXJuIG5ldyBEb21haW5UZW1wbGF0ZUl0ZW0oZGF0YS5ib2R5LnRlbXBsYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDcmVhdGlvblZlcnNpb25SZXNwb25zZShcbiAgICBkYXRhOiBDcmVhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25BUElSZXNwb25zZVxuICApOiBDcmVhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0ID0ge30gYXMgQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0O1xuICAgIHJlc3VsdC5zdGF0dXMgPSBkYXRhLnN0YXR1cztcbiAgICByZXN1bHQubWVzc2FnZSA9IGRhdGEuYm9keS5tZXNzYWdlO1xuICAgIGlmIChkYXRhLmJvZHkgJiYgZGF0YS5ib2R5LnRlbXBsYXRlKSB7XG4gICAgICByZXN1bHQudGVtcGxhdGUgPSBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKGRhdGEuYm9keS50ZW1wbGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTXV0YXRpb25SZXNwb25zZShcbiAgICBkYXRhOiBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2VcbiAgKTogVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0OiBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlUmVzdWx0ID0ge30gYXMgVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdDtcbiAgICByZXN1bHQuc3RhdHVzID0gZGF0YS5zdGF0dXM7XG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBkYXRhLmJvZHkubWVzc2FnZTtcbiAgICBpZiAoZGF0YS5ib2R5ICYmIGRhdGEuYm9keS50ZW1wbGF0ZSkge1xuICAgICAgcmVzdWx0LnRlbXBsYXRlTmFtZSA9IGRhdGEuYm9keS50ZW1wbGF0ZS5uYW1lO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU5vdGlmaWNhdGlvblJlc3BvbnNlKGRhdGE6IE5vdGlmaWNhdGlvbkFQSVJlc3BvbnNlKTogTm90aWZpY2F0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQ6IE5vdGlmaWNhdGlvblJlc3VsdCA9IHt9IGFzIE5vdGlmaWNhdGlvblJlc3VsdDtcbiAgICByZXN1bHQuc3RhdHVzID0gZGF0YS5zdGF0dXM7XG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBkYXRhLmJvZHkubWVzc2FnZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU11dGF0ZVRlbXBsYXRlVmVyc2lvblJlc3BvbnNlKFxuICAgIGRhdGE6IE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlXG4gICk6IE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0OiBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQgPSB7fSBhcyBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQ7XG4gICAgcmVzdWx0LnN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICAgIHJlc3VsdC5tZXNzYWdlID0gZGF0YS5ib2R5Lm1lc3NhZ2U7XG4gICAgaWYgKGRhdGEuYm9keS50ZW1wbGF0ZSkge1xuICAgICAgcmVzdWx0LnRlbXBsYXRlTmFtZSA9IGRhdGEuYm9keS50ZW1wbGF0ZS5uYW1lO1xuICAgICAgcmVzdWx0LnRlbXBsYXRlVmVyc2lvbiA9IHsgdGFnOiBkYXRhLmJvZHkudGVtcGxhdGUudmVyc2lvbi50YWcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VMaXN0KHJlc3BvbnNlOiBMaXN0RG9tYWluVGVtcGxhdGVzQVBJUmVzcG9uc2UpOiBMaXN0RG9tYWluVGVtcGxhdGVzUmVzdWx0IHtcbiAgICBjb25zdCBkYXRhID0ge30gYXMgTGlzdERvbWFpblRlbXBsYXRlc1Jlc3VsdDtcblxuICAgIGRhdGEuaXRlbXMgPSByZXNwb25zZS5ib2R5Lml0ZW1zLm1hcCgoZDogRG9tYWluVGVtcGxhdGUpID0+IG5ldyBEb21haW5UZW1wbGF0ZUl0ZW0oZCkpO1xuXG4gICAgZGF0YS5wYWdlcyA9IHJlc3BvbnNlLmJvZHkucGFnaW5nO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTGlzdFRlbXBsYXRlVmVyc2lvbnMoXG4gICAgcmVzcG9uc2U6IExpc3REb21haW5UZW1wbGF0ZVZlcnNpb25zQVBJUmVzcG9uc2VcbiAgKTogTGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNSZXN1bHQge1xuICAgIGNvbnN0IGRhdGEgPSB7fSBhcyBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc1Jlc3VsdDtcblxuICAgIGRhdGEudGVtcGxhdGUgPSBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKHJlc3BvbnNlLmJvZHkudGVtcGxhdGUpO1xuXG4gICAgZGF0YS5wYWdlcyA9IHJlc3BvbnNlLmJvZHkucGFnaW5nO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBsaXN0KGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IERvbWFpblRlbXBsYXRlc1F1ZXJ5KTogUHJvbWlzZTxMaXN0RG9tYWluVGVtcGxhdGVzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZUxpc3QocmVzKVxuICAgICAgKTtcbiAgfVxuXG4gIGdldChkb21haW46IHN0cmluZywgdGVtcGxhdGVOYW1lOiBzdHJpbmcsIHF1ZXJ5PzogVGVtcGxhdGVRdWVyeSk6IFByb21pc2U8RG9tYWluVGVtcGxhdGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcy8nLCB0ZW1wbGF0ZU5hbWUpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBHZXREb21haW5UZW1wbGF0ZUFQSVJlc3BvbnNlKSA9PiBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKHJlcy5ib2R5LnRlbXBsYXRlKVxuICAgICAgKTtcbiAgfVxuXG4gIGNyZWF0ZShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBkYXRhOiBEb21haW5UZW1wbGF0ZURhdGFcbiAgKTogUHJvbWlzZTxEb21haW5UZW1wbGF0ZUl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcycpLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlczogQ3JlYXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZUNyZWF0aW9uUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICB1cGRhdGUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluVGVtcGxhdGVVcGRhdGVEYXRhXG4gICk6IFByb21pc2U8VXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lKSwgZGF0YSlcbiAgICAgIC50aGVuKChyZXM6IFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZU11dGF0aW9uUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICBkZXN0cm95KGRvbWFpbjogc3RyaW5nLCB0ZW1wbGF0ZU5hbWU6IHN0cmluZyk6IFByb21pc2U8VXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lKSlcbiAgICAgIC50aGVuKChyZXM6IFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZU11dGF0aW9uUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICBkZXN0cm95QWxsKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxOb3RpZmljYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzJykpXG4gICAgICAudGhlbigocmVzOiBOb3RpZmljYXRpb25BUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZU5vdGlmaWNhdGlvblJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgY3JlYXRlVmVyc2lvbihcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICBkYXRhOiBEb21haW5UZW1wbGF0ZVZlcnNpb25EYXRhXG4gICk6IFByb21pc2U8Q3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lLCAnL3ZlcnNpb25zJyksIGRhdGEpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VDcmVhdGlvblZlcnNpb25SZXNwb25zZShyZXMpXG4gICAgICApO1xuICB9XG5cbiAgZ2V0VmVyc2lvbihkb21haW46IHN0cmluZywgdGVtcGxhdGVOYW1lOiBzdHJpbmcsIHRhZzogc3RyaW5nKTogUHJvbWlzZTxEb21haW5UZW1wbGF0ZUl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSwgJy92ZXJzaW9ucy8nLCB0YWcpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IEdldERvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpID0+IG5ldyBEb21haW5UZW1wbGF0ZUl0ZW0ocmVzLmJvZHkudGVtcGxhdGUpXG4gICAgICApO1xuICB9XG5cbiAgdXBkYXRlVmVyc2lvbihcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBkYXRhOiBEb21haW5UZW1wbGF0ZVVwZGF0ZVZlcnNpb25EYXRhXG4gICk6IFByb21pc2U8TXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcy8nLCB0ZW1wbGF0ZU5hbWUsICcvdmVyc2lvbnMvJywgdGFnKSwgZGF0YSlcbiAgICAgIC50aGVuKFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAocmVzOiBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25BUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZU11dGF0ZVRlbXBsYXRlVmVyc2lvblJlc3BvbnNlKHJlcylcbiAgICAgICk7XG4gIH1cblxuICBkZXN0cm95VmVyc2lvbihcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZ1xuICApOiBQcm9taXNlPE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lLCAnL3ZlcnNpb25zLycsIHRhZykpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgLnRoZW4oKHJlczogTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VNdXRhdGVUZW1wbGF0ZVZlcnNpb25SZXNwb25zZShyZXMpKTtcbiAgfVxuXG4gIGxpc3RWZXJzaW9ucyhcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICBxdWVyeT86IERvbWFpblRlbXBsYXRlc1F1ZXJ5XG4gICk6IFByb21pc2U8TGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzJywgdGVtcGxhdGVOYW1lLCAnL3ZlcnNpb25zJyksIHF1ZXJ5KVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IExpc3REb21haW5UZW1wbGF0ZVZlcnNpb25zQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VMaXN0VGVtcGxhdGVWZXJzaW9ucyhyZXMpXG4gICAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgQVBJRXJyb3JPcHRpb25zIGZyb20gJy4vaW50ZXJmYWNlcy9BUElFcnJvck9wdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBUElFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdHVzOiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0YWNrOiBzdHJpbmc7XG4gIGRldGFpbHM6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgc3RhdHVzLFxuICAgIHN0YXR1c1RleHQsXG4gICAgbWVzc2FnZSxcbiAgICBib2R5ID0ge31cbiAgfTogQVBJRXJyb3JPcHRpb25zKSB7XG4gICAgY29uc3QgeyBtZXNzYWdlOiBib2R5TWVzc2FnZSwgZXJyb3IgfSA9IGJvZHk7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IGVycm9yIHx8IHN0YXR1c1RleHQ7XG4gICAgdGhpcy5kZXRhaWxzID0gYm9keU1lc3NhZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCB7XG4gIEV2ZW50c0xpc3QsIEV2ZW50c1BhZ2UsIEV2ZW50c1Jlc3BvbnNlLCBQYWdlc0xpc3QsIFBhZ2VzTGlzdEFjY3VtdWxhdG9yLCBQYXJzZWRQYWdlc0xpc3Rcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0V2ZW50cyc7XG5cbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50Q2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIF9wYXJzZVBhZ2VOdW1iZXIodXJsOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsLnNwbGl0KCcvJykucG9wKCk7XG4gIH1cblxuICBfcGFyc2VQYWdlKGlkOiBzdHJpbmcsIHVybDogc3RyaW5nKSA6IEV2ZW50c1BhZ2Uge1xuICAgIHJldHVybiB7IGlkLCBudW1iZXI6IHRoaXMuX3BhcnNlUGFnZU51bWJlcih1cmwpLCB1cmwgfTtcbiAgfVxuXG4gIF9wYXJzZVBhZ2VMaW5rcyhyZXNwb25zZTogRXZlbnRzUmVzcG9uc2UpIDogUGFyc2VkUGFnZXNMaXN0IHtcbiAgICBjb25zdCBwYWdlcyA9IE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmJvZHkucGFnaW5nIGFzIFBhZ2VzTGlzdCk7XG4gICAgcmV0dXJuIHBhZ2VzLnJlZHVjZShcbiAgICAgIChhY2M6IFBhZ2VzTGlzdEFjY3VtdWxhdG9yLCBlbnRyaWU6IFt1cmw6IHN0cmluZywgaWQ6IHN0cmluZ10pID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBlbnRyaWVbMF07XG4gICAgICAgIGNvbnN0IHVybCA9IGVudHJpZVsxXTtcbiAgICAgICAgYWNjW2lkXSA9IHRoaXMuX3BhcnNlUGFnZShpZCwgdXJsKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9XG4gICAgKSBhcyB1bmtub3duIGFzIFBhcnNlZFBhZ2VzTGlzdDtcbiAgfVxuXG4gIF9wYXJzZUV2ZW50TGlzdChyZXNwb25zZTogRXZlbnRzUmVzcG9uc2UpIDogRXZlbnRzTGlzdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiByZXNwb25zZS5ib2R5Lml0ZW1zLFxuICAgICAgcGFnZXM6IHRoaXMuX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlKVxuICAgIH07XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcsIHF1ZXJ5PzogeyBwYWdlOiBzdHJpbmcgfSkgOiBQcm9taXNlPEV2ZW50c0xpc3Q+IHtcbiAgICBsZXQgdXJsO1xuICAgIGNvbnN0IHF1ZXJ5Q29weSA9IHsgLi4ucXVlcnkgfTtcbiAgICBpZiAocXVlcnlDb3B5ICYmIHF1ZXJ5Q29weS5wYWdlKSB7XG4gICAgICB1cmwgPSB1cmxqb2luKCcvdjMnLCBkb21haW4sICdldmVudHMnLCBxdWVyeUNvcHkucGFnZSk7XG4gICAgICBkZWxldGUgcXVlcnlDb3B5LnBhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVybCA9IHVybGpvaW4oJy92MycsIGRvbWFpbiwgJ2V2ZW50cycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmwsIHF1ZXJ5Q29weSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogRXZlbnRzUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRXZlbnRMaXN0KHJlc3BvbnNlKSk7XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuaW1wb3J0IHsgSXBQb29sLCBJcFBvb2xMaXN0UmVzcG9uc2UsIElwUG9vbFVwZGF0ZURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvSXBQb29scyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElwUG9vbHNDbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgbGlzdChxdWVyeTogYW55KTogUHJvbWlzZTxJcFBvb2xbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KCcvdjEvaXBfcG9vbHMnLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogSXBQb29sTGlzdFJlc3BvbnNlKSA9PiB0aGlzLnBhcnNlSXBQb29sc1Jlc3BvbnNlKHJlc3BvbnNlKSk7XG4gIH1cblxuICBjcmVhdGUoZGF0YTogeyBuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBpcHM/OiBzdHJpbmdbXSB9KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKCcvdjEvaXBfcG9vbHMnLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiB7IGJvZHk6IHsgbWVzc2FnZTogc3RyaW5nLCBwb29sX2lkOiBzdHJpbmcgfSB9KSA9PiByZXNwb25zZT8uYm9keSk7XG4gIH1cblxuICB1cGRhdGUocG9vbElkOiBzdHJpbmcsIGRhdGE6IElwUG9vbFVwZGF0ZURhdGEpIDogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBhdGNoV2l0aEZEKGAvdjEvaXBfcG9vbHMvJHtwb29sSWR9YCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiBhbnkgfSkgPT4gcmVzcG9uc2U/LmJvZHkpO1xuICB9XG5cbiAgZGVsZXRlKHBvb2xJZDogc3RyaW5nLCBkYXRhOiB7IGlkOiBzdHJpbmcsIHBvb2xfaWQ6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYC92MS9pcF9wb29scy8ke3Bvb2xJZH1gLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiB7IGJvZHk6IGFueSB9KSA9PiByZXNwb25zZT8uYm9keSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSXBQb29sc1Jlc3BvbnNlKHJlc3BvbnNlOiB7IGJvZHk6IGFueSB8IGFueSB9KSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHkuaXBfcG9vbHM7XG4gIH1cbn1cbiIsImltcG9ydCBNZ1JlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7IElwRGF0YSwgSXBzTGlzdFJlc3BvbnNlQm9keSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JcHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJcHNDbGllbnQge1xuICByZXF1ZXN0OiBNZ1JlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogTWdSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIGxpc3QocXVlcnk6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KCcvdjMvaXBzJywgcXVlcnkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IHsgYm9keTogSXBzTGlzdFJlc3BvbnNlQm9keSB9KSA9PiB0aGlzLnBhcnNlSXBzUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgfVxuXG4gIGdldChpcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYC92My9pcHMvJHtpcH1gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiB7IGJvZHk6IElwRGF0YSB9KSA9PiB0aGlzLnBhcnNlSXBzUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJcHNSZXNwb25zZShyZXNwb25zZTogeyBib2R5OiBJcHNMaXN0UmVzcG9uc2VCb2R5IHwgSXBEYXRhIH0pIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgfVxufVxuIiwiaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIExpc3RzUXVlcnksXG4gIENyZWF0ZVVwZGF0ZUxpc3QsXG4gIERlc3Ryb3llZExpc3QsXG4gIE1haWxpbmdMaXN0XG59IGZyb20gJy4vaW50ZXJmYWNlcy9saXN0cyc7XG5pbXBvcnQgeyBJTWFpbExpc3RzTWVtYmVycyB9IGZyb20gJy4vaW50ZXJmYWNlcy9tYWlsTGlzdE1lbWJlcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0c0NsaWVudCB7XG4gIGJhc2VSb3V0ZTogc3RyaW5nO1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuICBtZW1iZXJzOiBJTWFpbExpc3RzTWVtYmVycztcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0LCBtZW1iZXJzOklNYWlsTGlzdHNNZW1iZXJzKSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvbGlzdHMnO1xuICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XG4gIH1cblxuICBsaXN0KHF1ZXJ5PzogTGlzdHNRdWVyeSk6IFByb21pc2U8TWFpbGluZ0xpc3RbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAke3RoaXMuYmFzZVJvdXRlfS9wYWdlc2AsIHF1ZXJ5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lml0ZW1zIGFzIE1haWxpbmdMaXN0W10pO1xuICB9XG5cbiAgZ2V0KG1haWxMaXN0QWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxNYWlsaW5nTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc31gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lmxpc3QgYXMgTWFpbGluZ0xpc3QpO1xuICB9XG5cbiAgY3JlYXRlKGRhdGE6IENyZWF0ZVVwZGF0ZUxpc3QpOiBQcm9taXNlPE1haWxpbmdMaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHRoaXMuYmFzZVJvdXRlLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lmxpc3QgYXMgTWFpbGluZ0xpc3QpO1xuICB9XG5cbiAgdXBkYXRlKG1haWxMaXN0QWRkcmVzczogc3RyaW5nLCBkYXRhOiBDcmVhdGVVcGRhdGVMaXN0KTogUHJvbWlzZTxNYWlsaW5nTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc31gLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lmxpc3QgYXMgTWFpbGluZ0xpc3QpO1xuICB9XG5cbiAgZGVzdHJveShtYWlsTGlzdEFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8RGVzdHJveWVkTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc31gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5IGFzIERlc3Ryb3llZExpc3QpO1xuICB9XG59XG4iLCJpbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHtcbiAgTWFpbExpc3RNZW1iZXJzUXVlcnksXG4gIElNYWlsTGlzdHNNZW1iZXJzLFxuICBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnMsXG4gIE1haWxMaXN0TWVtYmVyLFxuICBNdWx0aXBsZU1lbWJlcnNEYXRhLFxuICBNdWx0aXBsZU1lbWJlcnNSZXFEYXRhLFxuICBEZWxldGVkTWVtYmVyLFxuICBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnNSZXEsXG4gIE5ld011bHRpcGxlTWVtYmVyc1Jlc3BvbnNlXG59IGZyb20gJy4vaW50ZXJmYWNlcy9tYWlsTGlzdE1lbWJlcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWlsTGlzdHNNZW1iZXJzIGltcGxlbWVudHMgSU1haWxMaXN0c01lbWJlcnMge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvbGlzdHMnO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FuZFVwZGF0ZURhdGEoZGF0YTogQ3JlYXRlVXBkYXRlTWFpbExpc3RNZW1iZXJzKSB7XG4gICAgY29uc3QgbmV3RGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhLnZhcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICBuZXdEYXRhLnZhcnMgPSBKU09OLnN0cmluZ2lmeShuZXdEYXRhLnZhcnMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YS5zdWJzY3JpYmVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIG5ld0RhdGEuc3Vic2NyaWJlZCA9IGRhdGEuc3Vic2NyaWJlZCA/ICd5ZXMnIDogJ25vJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RGF0YSBhcyBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnNSZXE7XG4gIH1cblxuICBsaXN0TWVtYmVycyhtYWlsTGlzdEFkZHJlc3M6IHN0cmluZywgcXVlcnk/OiBNYWlsTGlzdE1lbWJlcnNRdWVyeSk6IFByb21pc2U8TWFpbExpc3RNZW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc30vbWVtYmVycy9wYWdlc2AsIHF1ZXJ5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lml0ZW1zIGFzIE1haWxMaXN0TWVtYmVyW10pO1xuICB9XG5cbiAgZ2V0TWVtYmVyKG1haWxMaXN0QWRkcmVzczogc3RyaW5nLCBtYWlsTGlzdE1lbWJlckFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8TWFpbExpc3RNZW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnMvJHttYWlsTGlzdE1lbWJlckFkZHJlc3N9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5tZW1iZXIgYXMgTWFpbExpc3RNZW1iZXIpO1xuICB9XG5cbiAgY3JlYXRlTWVtYmVyKFxuICAgIG1haWxMaXN0QWRkcmVzczogc3RyaW5nLFxuICAgIGRhdGE6IENyZWF0ZVVwZGF0ZU1haWxMaXN0TWVtYmVyc1xuICApOiBQcm9taXNlPE1haWxMaXN0TWVtYmVyPiB7XG4gICAgY29uc3QgcmVxRGF0YSA9IHRoaXMuY2hlY2tBbmRVcGRhdGVEYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnNgLCByZXFEYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lm1lbWJlciBhcyBNYWlsTGlzdE1lbWJlcik7XG4gIH1cblxuICBjcmVhdGVNZW1iZXJzKFxuICAgIG1haWxMaXN0QWRkcmVzczogc3RyaW5nLFxuICAgIGRhdGE6IE11bHRpcGxlTWVtYmVyc0RhdGFcbiAgKTogUHJvbWlzZTxOZXdNdWx0aXBsZU1lbWJlcnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IG5ld0RhdGE6IE11bHRpcGxlTWVtYmVyc1JlcURhdGEgPSB7XG4gICAgICBtZW1iZXJzOiBBcnJheS5pc0FycmF5KGRhdGEubWVtYmVycykgPyBKU09OLnN0cmluZ2lmeShkYXRhLm1lbWJlcnMpIDogZGF0YS5tZW1iZXJzLFxuICAgICAgdXBzZXJ0OiBkYXRhLnVwc2VydFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS9tZW1iZXJzLmpzb25gLCBuZXdEYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5IGFzIE5ld011bHRpcGxlTWVtYmVyc1Jlc3BvbnNlKTtcbiAgfVxuXG4gIHVwZGF0ZU1lbWJlcihcbiAgICBtYWlsTGlzdEFkZHJlc3M6IHN0cmluZyxcbiAgICBtYWlsTGlzdE1lbWJlckFkZHJlc3M6IHN0cmluZyxcbiAgICBkYXRhOiBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnNcbiAgKTogUHJvbWlzZTxNYWlsTGlzdE1lbWJlcj4ge1xuICAgIGNvbnN0IHJlcURhdGEgPSB0aGlzLmNoZWNrQW5kVXBkYXRlRGF0YShkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnMvJHttYWlsTGlzdE1lbWJlckFkZHJlc3N9YCwgcmVxRGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5tZW1iZXIgYXMgTWFpbExpc3RNZW1iZXIpO1xuICB9XG5cbiAgZGVzdHJveU1lbWJlcihtYWlsTGlzdEFkZHJlc3M6IHN0cmluZywgbWFpbExpc3RNZW1iZXJBZGRyZXNzOiBzdHJpbmcpIDogUHJvbWlzZTxEZWxldGVkTWVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS9tZW1iZXJzLyR7bWFpbExpc3RNZW1iZXJBZGRyZXNzfWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkgYXMgRGVsZXRlZE1lbWJlcik7XG4gIH1cbn1cbiIsImltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lc3NhZ2VzQ2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIF9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlOiB7IGJvZHk6IGFueSB9KSB7XG4gICAgaWYgKHJlc3BvbnNlLmJvZHkpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNyZWF0ZShkb21haW46IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgaWYgKGRhdGEubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKGAvdjMvJHtkb21haW59L21lc3NhZ2VzLm1pbWVgLCBkYXRhKVxuICAgICAgICAudGhlbih0aGlzLl9wYXJzZVJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoYC92My8ke2RvbWFpbn0vbWVzc2FnZXNgLCBkYXRhKVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VSZXNwb25zZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENhbmNlbGVkTXVsdGlwbGVWYWxpZGF0aW9uSm9iLFxuICBDcmVhdGVkTXVsdGlwbGVWYWxpZGF0aW9uSm9iLFxuICBJTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50LFxuICBNdWx0aXBsZVZhbGlkYXRpb25Kb2IsXG4gIE11bHRpcGxlVmFsaWRhdGlvbkpvYnNMaXN0UmVzdWx0XG59XG4gIGZyb20gJy4vaW50ZXJmYWNlcy9NdWx0aXBsZVZhbGlkYXRpb24nO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50IGltcGxlbWVudHMgSU11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBsaXN0KCk6IFByb21pc2U8TXVsdGlwbGVWYWxpZGF0aW9uSm9ic0xpc3RSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3Y0L2FkZHJlc3MvdmFsaWRhdGUvYnVsaycpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkgYXMgTXVsdGlwbGVWYWxpZGF0aW9uSm9ic0xpc3RSZXN1bHQpO1xuICB9XG5cbiAgZ2V0KGxpc3RJZDogc3RyaW5nKTogUHJvbWlzZTxNdWx0aXBsZVZhbGlkYXRpb25Kb2I+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgL3Y0L2FkZHJlc3MvdmFsaWRhdGUvYnVsay8ke2xpc3RJZH1gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxuXG4gIGNyZWF0ZShsaXN0SWQ6IHN0cmluZywgZmlsZTogYW55KTogUHJvbWlzZTxDcmVhdGVkTXVsdGlwbGVWYWxpZGF0aW9uSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKGAvdjQvYWRkcmVzcy92YWxpZGF0ZS9idWxrLyR7bGlzdElkfWAsIGZpbGUpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkpO1xuICB9XG5cbiAgZGVzdHJveShsaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8Q2FuY2VsZWRNdWx0aXBsZVZhbGlkYXRpb25Kb2I+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgL3Y0L2FkZHJlc3MvdmFsaWRhdGUvYnVsay8ke2xpc3RJZH1gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZSk7XG4gIH1cbn1cbiIsImltcG9ydCBOb2RlRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJztcbmltcG9ydCBiYXNlNjQgZnJvbSAnYmFzZS02NCc7XG5pbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQga3kgZnJvbSAna3ktdW5pdmVyc2FsJztcbmltcG9ydCBBUElFcnJvciBmcm9tICcuL2Vycm9yJztcbmltcG9ydCBSZXF1ZXN0T3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvUmVxdWVzdE9wdGlvbnMnO1xuaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcbmltcG9ydCB7IElucHV0Rm9ybURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvSUZvcm1EYXRhJztcbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuXG5jb25zdCBpc1N0cmVhbSA9IChhdHRhY2htZW50OiBhbnkpID0+IHR5cGVvZiBhdHRhY2htZW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYXR0YWNobWVudC5waXBlID09PSAnZnVuY3Rpb24nO1xuXG5mdW5jdGlvbiBpc05vZGVGb3JtRGF0YShmb3JtRGF0YUluc3RhbmNlOiBOb2RlRm9ybURhdGEgfCBGb3JtRGF0YSlcbiAgOiBmb3JtRGF0YUluc3RhbmNlIGlzIE5vZGVGb3JtRGF0YSB7XG4gIHJldHVybiAoPE5vZGVGb3JtRGF0YT5mb3JtRGF0YUluc3RhbmNlKS5nZXRIZWFkZXJzICE9PSB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IGdldEF0dGFjaG1lbnRPcHRpb25zID0gKGl0ZW06IGFueSk6IHtcbiAgZmlsZW5hbWU/OiBzdHJpbmcsXG4gIGNvbnRlbnRUeXBlPzogc3RyaW5nLFxuICBrbm93bkxlbmd0aD86IG51bWJlclxufSA9PiB7XG4gIGlmICh0eXBlb2YgaXRlbSAhPT0gJ29iamVjdCcgfHwgaXNTdHJlYW0oaXRlbSkpIHJldHVybiB7fTtcblxuICBjb25zdCB7XG4gICAgZmlsZW5hbWUsXG4gICAgY29udGVudFR5cGUsXG4gICAga25vd25MZW5ndGhcbiAgfSA9IGl0ZW07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oZmlsZW5hbWUgPyB7IGZpbGVuYW1lIH0gOiB7IGZpbGVuYW1lOiAnZmlsZScgfSksXG4gICAgLi4uKGNvbnRlbnRUeXBlICYmIHsgY29udGVudFR5cGUgfSksXG4gICAgLi4uKGtub3duTGVuZ3RoICYmIHsga25vd25MZW5ndGggfSlcbiAgfTtcbn07XG5cbmNvbnN0IHN0cmVhbVRvU3RyaW5nID0gKHN0cmVhbTogYW55KSA9PiB7XG4gIGNvbnN0IGNodW5rczogYW55ID0gW107XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3RyZWFtLm9uKCdkYXRhJywgKGNodW5rOiBhbnkpID0+IGNodW5rcy5wdXNoKGNodW5rKSk7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygndXRmOCcpKSk7XG4gIH0pO1xufTtcblxuY2xhc3MgUmVxdWVzdCB7XG4gIHByaXZhdGUgdXNlcm5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBrZXk6IHN0cmluZztcbiAgcHJpdmF0ZSB1cmw6IHN0cmluZztcbiAgcHJpdmF0ZSB0aW1lb3V0OiBudW1iZXI7XG4gIHByaXZhdGUgaGVhZGVyczogYW55O1xuICBwcml2YXRlIEZvcm1EYXRhQ29uc3RydWN0b3I6IElucHV0Rm9ybURhdGE7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUmVxdWVzdE9wdGlvbnMsIGZvcm1EYXRhOiBJbnB1dEZvcm1EYXRhKSB7XG4gICAgdGhpcy51c2VybmFtZSA9IG9wdGlvbnMudXNlcm5hbWU7XG4gICAgdGhpcy5rZXkgPSBvcHRpb25zLmtleTtcbiAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIGFzIHN0cmluZztcbiAgICB0aGlzLnRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQ7XG4gICAgdGhpcy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9O1xuICAgIHRoaXMuRm9ybURhdGFDb25zdHJ1Y3RvciA9IGZvcm1EYXRhO1xuICB9XG5cbiAgYXN5bmMgcmVxdWVzdChtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcsIGlucHV0T3B0aW9ucz86IGFueSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICBjb25zdCBvcHRpb25zID0geyAuLi5pbnB1dE9wdGlvbnMgfTtcbiAgICBjb25zdCBiYXNpYyA9IGJhc2U2NC5lbmNvZGUoYCR7dGhpcy51c2VybmFtZX06JHt0aGlzLmtleX1gKTtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7YmFzaWN9YCxcbiAgICAgIC4uLnRoaXMuaGVhZGVycyxcbiAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnNcbiAgICB9O1xuXG4gICAgZGVsZXRlIG9wdGlvbnM/LmhlYWRlcnM7XG5cbiAgICBpZiAoIWhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSB7XG4gICAgICAvLyBmb3IgZm9ybS1kYXRhIGl0IHdpbGwgYmUgTnVsbCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSBpdFxuICAgICAgZGVsZXRlIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtcyA9IHsgLi4ub3B0aW9ucyB9O1xuXG4gICAgaWYgKG9wdGlvbnM/LnF1ZXJ5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9wdGlvbnM/LnF1ZXJ5KS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbXMuc2VhcmNoUGFyYW1zID0gb3B0aW9ucy5xdWVyeTtcbiAgICAgIGRlbGV0ZSBwYXJhbXMucXVlcnk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBreShcbiAgICAgIHVybGpvaW4odGhpcy51cmwsIHVybCksXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogbWV0aG9kLnRvTG9jYWxlVXBwZXJDYXNlKCksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICAgICAgLi4ucGFyYW1zXG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmICghcmVzcG9uc2U/Lm9rKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gcmVzcG9uc2U/LmJvZHkgJiYgaXNTdHJlYW0ocmVzcG9uc2UuYm9keSlcbiAgICAgICAgPyBhd2FpdCBzdHJlYW1Ub1N0cmluZyhyZXNwb25zZS5ib2R5KVxuICAgICAgICA6IGF3YWl0IHJlc3BvbnNlPy5qc29uKCk7XG5cbiAgICAgIHRocm93IG5ldyBBUElFcnJvcih7XG4gICAgICAgIHN0YXR1czogcmVzcG9uc2U/LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2U/LnN0YXR1c1RleHQsXG4gICAgICAgIGJvZHk6IHsgbWVzc2FnZSB9XG4gICAgICB9IGFzIEFQSUVycm9yT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0ge1xuICAgICAgYm9keTogYXdhaXQgcmVzcG9uc2U/Lmpzb24oKSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2U/LnN0YXR1c1xuICAgIH07XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcXVlcnkobWV0aG9kOiBzdHJpbmcsIHVybDogc3RyaW5nLCBxdWVyeTogYW55LCBvcHRpb25zPzogYW55KSA6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgY29tbWFuZChtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9ucz86IGFueSkgOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXRob2QsIHVybCwge1xuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICAgIGJvZHk6IGRhdGEsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICBnZXQodXJsOiBzdHJpbmcsIHF1ZXJ5PzogYW55LCBvcHRpb25zPzogYW55KSA6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnZ2V0JywgdXJsLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICBoZWFkKHVybDogc3RyaW5nLCBxdWVyeTogYW55LCBvcHRpb25zOiBhbnkpIDogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCdoZWFkJywgdXJsLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zKHVybDogc3RyaW5nLCBxdWVyeTogYW55LCBvcHRpb25zOiBhbnkpIDogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCdvcHRpb25zJywgdXJsLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICBwb3N0KHVybDogc3RyaW5nLCBkYXRhOiBhbnksIG9wdGlvbnM/OiBhbnkpIDogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3Bvc3QnLCB1cmwsIGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcG9zdFdpdGhGRCh1cmw6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBkYXRhIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IG51bGwgfVxuICAgIH07XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmNyZWF0ZUZvcm1EYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3Bvc3QnLCB1cmwsIGZvcm1EYXRhLCBwYXJhbXMpO1xuICB9XG5cbiAgcHV0V2l0aEZEKHVybDogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGRhdGEgb2JqZWN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge1xuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogbnVsbCB9XG4gICAgfTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuY3JlYXRlRm9ybURhdGEoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZCgncHV0JywgdXJsLCBmb3JtRGF0YSwgcGFyYW1zKTtcbiAgfVxuXG4gIHBhdGNoV2l0aEZEKHVybDogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGRhdGEgb2JqZWN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge1xuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogbnVsbCB9XG4gICAgfTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuY3JlYXRlRm9ybURhdGEoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZCgncGF0Y2gnLCB1cmwsIGZvcm1EYXRhLCBwYXJhbXMpO1xuICB9XG5cbiAgY3JlYXRlRm9ybURhdGEoZGF0YTogYW55KTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEge1xuICAgIGNvbnN0IGZvcm1EYXRhOiBOb2RlRm9ybURhdGEgfCBGb3JtRGF0YSA9IE9iamVjdC5rZXlzKGRhdGEpXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGRhdGFba2V5XTsgfSlcbiAgICAgIC5yZWR1Y2UoKGZvcm1EYXRhQWNjOiBOb2RlRm9ybURhdGEgfCBGb3JtRGF0YSwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVLZXlzID0gWydhdHRhY2htZW50JywgJ2lubGluZScsICdmaWxlJ107XG4gICAgICAgIGlmIChmaWxlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5hZGRGaWxlc1RvRkQoa2V5LCBkYXRhW2tleV0sIGZvcm1EYXRhQWNjKTtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBY2M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnbWVzc2FnZScpIHsgLy8gbWltZSBtZXNzYWdlXG4gICAgICAgICAgdGhpcy5hZGRNaW1lRGF0YVRvRkQoa2V5LCBkYXRhW2tleV0sIGZvcm1EYXRhQWNjKTtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBY2M7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZENvbW1vblByb3BlcnR5VG9GRChrZXksIGRhdGFba2V5XSwgZm9ybURhdGFBY2MpO1xuICAgICAgICByZXR1cm4gZm9ybURhdGFBY2M7XG4gICAgICB9LCBuZXcgdGhpcy5Gb3JtRGF0YUNvbnN0cnVjdG9yKCkpO1xuICAgIHJldHVybiBmb3JtRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTWltZURhdGFUb0ZEKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGRhdGE6IEJ1ZmZlciB8IEJsb2IsXG4gICAgZm9ybURhdGFJbnN0YW5jZTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGFcbiAgKTogdm9pZCB7XG4gICAgaWYgKGlzTm9kZUZvcm1EYXRhKGZvcm1EYXRhSW5zdGFuY2UpKSB7XG4gICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgICAgIGZvcm1EYXRhSW5zdGFuY2UuYXBwZW5kKGtleSwgZGF0YSwgeyBmaWxlbmFtZTogJ01pbWVNZXNzYWdlJyB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGFJbnN0YW5jZS5hcHBlbmQoa2V5LCBkYXRhIGFzIEJsb2IsICdNaW1lTWVzc2FnZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRmlsZXNUb0ZEKFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgZm9ybURhdGFJbnN0YW5jZTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGFcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYXBwZW5kRmlsZVRvRkQgPSAoXG4gICAgICBrZXk6IHN0cmluZyxcbiAgICAgIG9iajogYW55LFxuICAgICAgZm9ybURhdGE6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBpc1N0cmVhbURhdGEgPSBpc1N0cmVhbShvYmopO1xuICAgICAgY29uc3Qgb2JqRGF0YSA9IGlzU3RyZWFtRGF0YSA/IG9iaiA6IG9iai5kYXRhO1xuICAgICAgLy8gZ2V0QXR0YWNobWVudE9wdGlvbnMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG9iaiBwYXJhbWV0ZXIgdG8gcHJldmVudCBsb29zaW5nIGZpbGVuYW1lXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0QXR0YWNobWVudE9wdGlvbnMob2JqKTtcbiAgICAgIGlmIChpc05vZGVGb3JtRGF0YShmb3JtRGF0YSkpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqRGF0YSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9iakRhdGEsIG9wdGlvbnMuZmlsZW5hbWUpO1xuICAgIH07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgYXBwZW5kRmlsZVRvRkQocHJvcGVydHlOYW1lLCBpdGVtLCBmb3JtRGF0YUluc3RhbmNlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRGaWxlVG9GRChwcm9wZXJ0eU5hbWUsIHZhbHVlLCBmb3JtRGF0YUluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZENvbW1vblByb3BlcnR5VG9GRChcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55LFxuICAgIGZvcm1EYXRhQWNjOiBOb2RlRm9ybURhdGEgfCBGb3JtRGF0YVxuICApOiB2b2lkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW06IGFueSkge1xuICAgICAgICBmb3JtRGF0YUFjYy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgZm9ybURhdGFBY2MuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1dCh1cmw6IHN0cmluZywgZGF0YTogYW55LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3B1dCcsIHVybCwgZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBwYXRjaCh1cmw6IHN0cmluZywgZGF0YTogYW55LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3BhdGNoJywgdXJsLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIGRlbGV0ZSh1cmw6IHN0cmluZywgZGF0YT86IGFueSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdkZWxldGUnLCB1cmwsIGRhdGEsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlcXVlc3Q7XG4iLCJpbXBvcnQge1xuICBDcmVhdGVVcGRhdGVSb3V0ZURhdGEsIERlc3Ryb3lSb3V0ZVJlc3BvbnNlLCBSb3V0ZSwgUm91dGVzTGlzdFF1ZXJ5LCBVcGRhdGVSb3V0ZVJlc3BvbnNlXG59IGZyb20gJy4vaW50ZXJmYWNlcy9yb3V0ZXMnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVzQ2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIGxpc3QocXVlcnk6IFJvdXRlc0xpc3RRdWVyeSk6IFByb21pc2U8Um91dGVbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KCcvdjMvcm91dGVzJywgcXVlcnkpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkuaXRlbXMpO1xuICB9XG5cbiAgZ2V0KGlkOiBzdHJpbmcpOiBQcm9taXNlPFJvdXRlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYC92My9yb3V0ZXMvJHtpZH1gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5LnJvdXRlKTtcbiAgfVxuXG4gIGNyZWF0ZShkYXRhOiBDcmVhdGVVcGRhdGVSb3V0ZURhdGEpOiBQcm9taXNlPFJvdXRlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKCcvdjMvcm91dGVzJywgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5yb3V0ZSk7XG4gIH1cblxuICB1cGRhdGUoaWQ6IHN0cmluZywgZGF0YTogQ3JlYXRlVXBkYXRlUm91dGVEYXRhKTogUHJvbWlzZTxVcGRhdGVSb3V0ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQoYC92My9yb3V0ZXMvJHtpZH1gLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxuXG4gIGRlc3Ryb3koaWQ6IHN0cmluZyk6IFByb21pc2U8RGVzdHJveVJvdXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgL3YzL3JvdXRlcy8ke2lkfWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkpO1xuICB9XG59XG4iLCJpbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHsgU3RhdHNRdWVyeSwgU3RhdHNPcHRpb25zLCBTdGF0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL1N0YXRzT3B0aW9ucyc7XG5cbmNsYXNzIFN0YXRzIHtcbiAgc3RhcnQ6IERhdGU7XG4gIGVuZDogRGF0ZTtcbiAgcmVzb2x1dGlvbjogc3RyaW5nO1xuICBzdGF0czogU3RhdFtdO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFN0YXRzT3B0aW9ucykge1xuICAgIHRoaXMuc3RhcnQgPSBuZXcgRGF0ZShkYXRhLnN0YXJ0KTtcbiAgICB0aGlzLmVuZCA9IG5ldyBEYXRlKGRhdGEuZW5kKTtcbiAgICB0aGlzLnJlc29sdXRpb24gPSBkYXRhLnJlc29sdXRpb247XG4gICAgdGhpcy5zdGF0cyA9IGRhdGEuc3RhdHMubWFwKGZ1bmN0aW9uIChzdGF0OiBTdGF0KSB7XG4gICAgICBjb25zdCByZXMgPSB7IC4uLnN0YXQgfTtcbiAgICAgIHJlcy50aW1lID0gbmV3IERhdGUoc3RhdC50aW1lKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHNDbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlU2VhcmNoUGFyYW1zKHF1ZXJ5OiBTdGF0c1F1ZXJ5KTogQXJyYXk8QXJyYXk8c3RyaW5nPj4ge1xuICAgIGxldCBzZWFyY2hQYXJhbXMgPSBbXTtcbiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoKSB7XG4gICAgICBzZWFyY2hQYXJhbXMgPSBPYmplY3QuZW50cmllcyhxdWVyeSkucmVkdWNlKChhcnJheVdpdGhQYWlycywgY3VycmVudFBhaXIpID0+IHtcbiAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gY3VycmVudFBhaXI7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCByZXBlYXRlZFByb3BlcnR5ID0gdmFsdWUubWFwKChpdGVtKSA9PiBba2V5LCBpdGVtXSk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5hcnJheVdpdGhQYWlycywgLi4ucmVwZWF0ZWRQcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXlXaXRoUGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICByZXR1cm4gYXJyYXlXaXRoUGFpcnM7XG4gICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlYXJjaFBhcmFtcztcbiAgfVxuXG4gIF9wYXJzZVN0YXRzKHJlc3BvbnNlOiB7IGJvZHk6IFN0YXRzT3B0aW9ucyB9KTogU3RhdHMge1xuICAgIHJldHVybiBuZXcgU3RhdHMocmVzcG9uc2UuYm9keSk7XG4gIH1cblxuICBnZXREb21haW4oZG9tYWluOiBzdHJpbmcsIHF1ZXJ5PzogU3RhdHNRdWVyeSk6IFByb21pc2U8U3RhdHM+IHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSB0aGlzLnByZXBhcmVTZWFyY2hQYXJhbXMocXVlcnkpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4oJy92MycsIGRvbWFpbiwgJ3N0YXRzL3RvdGFsJyksIHNlYXJjaFBhcmFtcylcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlU3RhdHMpO1xuICB9XG5cbiAgZ2V0QWNjb3VudChxdWVyeT86IFN0YXRzUXVlcnkpOiBQcm9taXNlPFN0YXRzPiB7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5wcmVwYXJlU2VhcmNoUGFyYW1zKHF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3YzL3N0YXRzL3RvdGFsJywgc2VhcmNoUGFyYW1zKVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VTdGF0cyk7XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IHVybGpvaW4gZnJvbSAndXJsLWpvaW4nO1xuXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHtcbiAgQm91bmNlRGF0YSxcbiAgQ29tcGxhaW50RGF0YSxcbiAgVW5zdWJzY3JpYmVEYXRhLFxuICBXaGl0ZUxpc3REYXRhXG59IGZyb20gJy4vaW50ZXJmYWNlcy9TdXByZXNzaW9ucyc7XG5cbmNvbnN0IGNyZWF0ZU9wdGlvbnMgPSB7XG4gIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XG59O1xuXG5jbGFzcyBCb3VuY2Uge1xuICB0eXBlOiBzdHJpbmc7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgY29kZTogbnVtYmVyO1xuICBlcnJvcjogc3RyaW5nO1xuICBjcmVhdGVkX2F0OiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEJvdW5jZURhdGEpIHtcbiAgICB0aGlzLnR5cGUgPSAnYm91bmNlcyc7XG4gICAgdGhpcy5hZGRyZXNzID0gZGF0YS5hZGRyZXNzO1xuICAgIHRoaXMuY29kZSA9ICtkYXRhLmNvZGU7XG4gICAgdGhpcy5lcnJvciA9IGRhdGEuZXJyb3I7XG4gICAgdGhpcy5jcmVhdGVkX2F0ID0gbmV3IERhdGUoZGF0YS5jcmVhdGVkX2F0KTtcbiAgfVxufVxuXG5jbGFzcyBDb21wbGFpbnQge1xuICB0eXBlOiBzdHJpbmc7XG4gIGFkZHJlc3M6IGFueTtcbiAgY3JlYXRlZF9hdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBDb21wbGFpbnREYXRhKSB7XG4gICAgdGhpcy50eXBlID0gJ2NvbXBsYWludHMnO1xuICAgIHRoaXMuYWRkcmVzcyA9IGRhdGEuYWRkcmVzcztcbiAgICB0aGlzLmNyZWF0ZWRfYXQgPSBuZXcgRGF0ZShkYXRhLmNyZWF0ZWRfYXQpO1xuICB9XG59XG5cbmNsYXNzIFVuc3Vic2NyaWJlIHtcbiAgdHlwZTogc3RyaW5nO1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIHRhZ3M6IGFueTtcbiAgY3JlYXRlZF9hdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBVbnN1YnNjcmliZURhdGEpIHtcbiAgICB0aGlzLnR5cGUgPSAndW5zdWJzY3JpYmVzJztcbiAgICB0aGlzLmFkZHJlc3MgPSBkYXRhLmFkZHJlc3M7XG4gICAgdGhpcy50YWdzID0gZGF0YS50YWdzO1xuICAgIHRoaXMuY3JlYXRlZF9hdCA9IG5ldyBEYXRlKGRhdGEuY3JlYXRlZF9hdCk7XG4gIH1cbn1cblxuY2xhc3MgV2hpdGVMaXN0IHtcbiAgdHlwZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICByZWFzb246IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFdoaXRlTGlzdERhdGEpIHtcbiAgICB0aGlzLnR5cGUgPSAnd2hpdGVsaXN0cyc7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWU7XG4gICAgdGhpcy5yZWFzb24gPSBkYXRhLnJlYXNvbjtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IG5ldyBEYXRlKGRhdGEuY3JlYXRlZEF0KTtcbiAgfVxufVxuXG50eXBlIFRNb2RlbCA9IHR5cGVvZiBCb3VuY2UgfCB0eXBlb2YgQ29tcGxhaW50IHwgdHlwZW9mIFVuc3Vic2NyaWJlIHwgdHlwZW9mIFdoaXRlTGlzdDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3VwcHJlc3Npb25DbGllbnQge1xuICByZXF1ZXN0OiBhbnk7XG4gIG1vZGVsczoge1xuICAgIGJvdW5jZXM6IHR5cGVvZiBCb3VuY2U7XG4gICAgY29tcGxhaW50czogdHlwZW9mIENvbXBsYWludDtcbiAgICB1bnN1YnNjcmliZXM6IHR5cGVvZiBVbnN1YnNjcmliZTtcbiAgICB3aGl0ZWxpc3RzOiB0eXBlb2YgV2hpdGVMaXN0O1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMubW9kZWxzID0ge1xuICAgICAgYm91bmNlczogQm91bmNlLFxuICAgICAgY29tcGxhaW50czogQ29tcGxhaW50LFxuICAgICAgdW5zdWJzY3JpYmVzOiBVbnN1YnNjcmliZSxcbiAgICAgIHdoaXRlbGlzdHM6IFdoaXRlTGlzdCxcbiAgICB9O1xuICB9XG5cbiAgX3BhcnNlUGFnZShpZDogc3RyaW5nLCBwYWdlVXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSB1cmwucGFyc2UocGFnZVVybCwgdHJ1ZSk7XG4gICAgY29uc3QgeyBxdWVyeSB9ID0gcGFyc2VkVXJsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgcGFnZTogcXVlcnkucGFnZSxcbiAgICAgIGFkZHJlc3M6IHF1ZXJ5LmFkZHJlc3MsXG4gICAgICB1cmw6IHBhZ2VVcmxcbiAgICB9O1xuICB9XG5cbiAgX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlOiB7IGJvZHk6IHsgcGFnaW5nOiBhbnkgfSB9KSB7XG4gICAgY29uc3QgcGFnZXMgPSBPYmplY3QuZW50cmllcyhyZXNwb25zZS5ib2R5LnBhZ2luZyk7XG4gICAgcmV0dXJuIHBhZ2VzLnJlZHVjZShcbiAgICAgIChhY2M6IGFueSwgW2lkLCBwYWdlVXJsXTogW3BhZ2VVcmw6IHN0cmluZywgaWQ6IHN0cmluZ10pID0+IHtcbiAgICAgICAgYWNjW2lkXSA9IHRoaXMuX3BhcnNlUGFnZShpZCwgcGFnZVVybCk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fVxuICAgICk7XG4gIH1cblxuICBfcGFyc2VMaXN0KHJlc3BvbnNlOiB7IGJvZHk6IHsgaXRlbXM6IGFueSwgcGFnaW5nOiBhbnkgfSB9LCBNb2RlbDogVE1vZGVsKSB7XG4gICAgY29uc3QgZGF0YSA9IHt9IGFzIGFueTtcblxuICAgIGRhdGEuaXRlbXMgPSByZXNwb25zZS5ib2R5Lml0ZW1zLm1hcCgoZDogYW55KSA9PiBuZXcgTW9kZWwoZCkpO1xuXG4gICAgZGF0YS5wYWdlcyA9IHRoaXMuX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgX3BhcnNlSXRlbShyZXNwb25zZTogeyBib2R5OiBhbnkgfSwgTW9kZWw6IFRNb2RlbCkge1xuICAgIHJldHVybiBuZXcgTW9kZWwocmVzcG9uc2UuYm9keSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdoaXRlTGlzdChkb21haW46IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFxuICAgICAgLnBvc3RXaXRoRkQodXJsam9pbigndjMnLCBkb21haW4sICd3aGl0ZWxpc3RzJyksIGRhdGEsIGNyZWF0ZU9wdGlvbnMpXG4gICAgICAudGhlbigocmVzcG9uc2U6IHsgYm9keTogYW55IH0pID0+IHJlc3BvbnNlLmJvZHkpO1xuICB9XG5cbiAgbGlzdChkb21haW46IHN0cmluZywgdHlwZTogc3RyaW5nLCBxdWVyeTogYW55KSB7XG4gICAgY29uc3QgbW9kZWwgPSAodGhpcy5tb2RlbHMgYXMgYW55KVt0eXBlXTtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3RcbiAgICAgIC5nZXQodXJsam9pbigndjMnLCBkb21haW4sIHR5cGUpLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiB7IGl0ZW1zOiBhbnksIHBhZ2luZzogYW55IH0gfSkgPT4gdGhpcy5fcGFyc2VMaXN0KHJlc3BvbnNlLCBtb2RlbCkpO1xuICB9XG5cbiAgZ2V0KGRvbWFpbjogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGFkZHJlc3M6IHN0cmluZykge1xuICAgIGNvbnN0IG1vZGVsID0gKHRoaXMubW9kZWxzIGFzIGFueSlbdHlwZV07XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0XG4gICAgICAuZ2V0KHVybGpvaW4oJ3YzJywgZG9tYWluLCB0eXBlLCBlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcykpKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiB7IGJvZHk6IGFueSB9KSA9PiB0aGlzLl9wYXJzZUl0ZW0ocmVzcG9uc2UsIG1vZGVsKSk7XG4gIH1cblxuICBjcmVhdGUoZG9tYWluOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgLy8gc3VwcG9ydHMgYWRkaW5nIG11bHRpcGxlIHN1cHByZXNzaW9ucyBieSBkZWZhdWx0XG4gICAgbGV0IHBvc3REYXRhO1xuICAgIGlmICh0eXBlID09PSAnd2hpdGVsaXN0cycpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVdoaXRlTGlzdChkb21haW4sIGRhdGEpO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcG9zdERhdGEgPSBbZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvc3REYXRhID0gWy4uLmRhdGFdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3RcbiAgICAgIC5wb3N0KHVybGpvaW4oJ3YzJywgZG9tYWluLCB0eXBlKSwgSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpLCBjcmVhdGVPcHRpb25zKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiB7IGJvZHk6IGFueSB9KSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxuXG4gIGRlc3Ryb3koZG9tYWluOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgYWRkcmVzczogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFxuICAgICAgLmRlbGV0ZSh1cmxqb2luKCd2MycsIGRvbWFpbiwgdHlwZSwgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiBhbnkgfSkgPT4gcmVzcG9uc2UuYm9keSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdXBwcmVzc2lvbkNsaWVudDtcbiIsImltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IHsgSU11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9NdWx0aXBsZVZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlc3VsdCwgVmFsaWRhdGlvblJlc3BvbnNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL1ZhbGlkYXRlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRlQ2xpZW50IHtcbiAgcHVibGljIG11bHRpcGxlVmFsaWRhdGlvbjtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0LCBtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQ6IElNdWx0aXBsZVZhbGlkYXRpb25DbGllbnQpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMubXVsdGlwbGVWYWxpZGF0aW9uID0gbXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50O1xuICB9XG5cbiAgZ2V0KGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KCcvdjQvYWRkcmVzcy92YWxpZGF0ZScsIHsgYWRkcmVzcyB9KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlIDogQVBJUmVzcG9uc2UpID0+IHJlc3BvbnNlKVxuICAgICAgLnRoZW4oKHJlcyA6IFZhbGlkYXRpb25SZXNwb25zZSkgPT4gcmVzLmJvZHkgYXMgVmFsaWRhdGlvblJlc3VsdCk7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcblxuaW1wb3J0IHtcbiAgVmFsaWRhdGlvblJlc3BvbnNlLFxuICBXZWJob29rTGlzdCxcbiAgV2ViaG9va1Jlc3BvbnNlLFxuICBXZWJob29rc1F1ZXJ5XG59IGZyb20gJy4vaW50ZXJmYWNlcy9XZWJob29rcyc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5jbGFzcyBXZWJob29rIHtcbiAgaWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgdXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViaG9va0NsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBfcGFyc2VXZWJob29rTGlzdChyZXNwb25zZTogeyBib2R5OiB7IHdlYmhvb2tzOiBXZWJob29rTGlzdCB9IH0pOiBXZWJob29rTGlzdCB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHkud2ViaG9va3M7XG4gIH1cblxuICBfcGFyc2VXZWJob29rV2l0aElEKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3BvbnNlOiBXZWJob29rUmVzcG9uc2UpOiBXZWJob29rIHtcbiAgICAgIGNvbnN0IHdlYmhvb2tSZXNwb25zZSA9IHJlc3BvbnNlPy5ib2R5Py53ZWJob29rO1xuICAgICAgbGV0IHVybCA9IHdlYmhvb2tSZXNwb25zZT8udXJsO1xuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgdXJsID0gd2ViaG9va1Jlc3BvbnNlPy51cmxzICYmIHdlYmhvb2tSZXNwb25zZS51cmxzLmxlbmd0aCA/IHdlYmhvb2tSZXNwb25zZS51cmxzWzBdIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgV2ViaG9vayhpZCwgdXJsKTtcbiAgICB9O1xuICB9XG5cbiAgX3BhcnNlV2ViaG9va1Rlc3QocmVzcG9uc2U6IHsgYm9keTogeyBjb2RlOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZyB9IH0pXG4gIDoge2NvZGU6IG51bWJlciwgbWVzc2FnZTpzdHJpbmd9IHtcbiAgICByZXR1cm4geyBjb2RlOiByZXNwb25zZS5ib2R5LmNvZGUsIG1lc3NhZ2U6IHJlc3BvbnNlLmJvZHkubWVzc2FnZSB9IGFzIFZhbGlkYXRpb25SZXNwb25zZTtcbiAgfVxuXG4gIGxpc3QoZG9tYWluOiBzdHJpbmcsIHF1ZXJ5OiBXZWJob29rc1F1ZXJ5KTogUHJvbWlzZTxXZWJob29rTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnd2ViaG9va3MnKSwgcXVlcnkpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVdlYmhvb2tMaXN0KTtcbiAgfVxuXG4gIGdldChkb21haW46IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8V2ViaG9vaz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnd2ViaG9va3MnLCBpZCkpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVdlYmhvb2tXaXRoSUQoaWQpKTtcbiAgfVxuXG4gIGNyZWF0ZShkb21haW46IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHVybDogc3RyaW5nLFxuICAgIHRlc3QgPSBmYWxzZSk6IFByb21pc2U8V2ViaG9vayB8IFZhbGlkYXRpb25SZXNwb25zZT4ge1xuICAgIGlmICh0ZXN0KSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJywgaWQsICd0ZXN0JyksIHsgdXJsIH0pXG4gICAgICAgIC50aGVuKHRoaXMuX3BhcnNlV2ViaG9va1Rlc3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJyksIHsgaWQsIHVybCB9KVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rV2l0aElEKGlkKSk7XG4gIH1cblxuICB1cGRhdGUoZG9tYWluOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHVybDogc3RyaW5nKTogUHJvbWlzZTxXZWJob29rPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICd3ZWJob29rcycsIGlkKSwgeyB1cmwgfSlcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlV2ViaG9va1dpdGhJRChpZCkpO1xuICB9XG5cbiAgZGVzdHJveShkb21haW46IHN0cmluZywgaWQ6IHN0cmluZykgOiBQcm9taXNlPFdlYmhvb2s+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJywgaWQpKVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rV2l0aElEKGlkKSk7XG4gIH1cbn1cbiIsIi8qISBodHRwczovL210aHMuYmUvYmFzZTY0IHYxLjAuMCBieSBAbWF0aGlhcyB8IE1JVCBsaWNlbnNlICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZXMgYGV4cG9ydHNgLlxuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzO1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLlxuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0bW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMgJiYgbW9kdWxlO1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgLCBmcm9tIE5vZGUuanMgb3IgQnJvd3NlcmlmaWVkIGNvZGUsIGFuZCB1c2Vcblx0Ly8gaXQgYXMgYHJvb3RgLlxuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHwgZnJlZUdsb2JhbC53aW5kb3cgPT09IGZyZWVHbG9iYWwpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdHZhciBJbnZhbGlkQ2hhcmFjdGVyRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0fTtcblx0SW52YWxpZENoYXJhY3RlckVycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcjtcblx0SW52YWxpZENoYXJhY3RlckVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0ludmFsaWRDaGFyYWN0ZXJFcnJvcic7XG5cblx0dmFyIGVycm9yID0gZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdC8vIE5vdGU6IHRoZSBlcnJvciBtZXNzYWdlcyB1c2VkIHRocm91Z2hvdXQgdGhpcyBmaWxlIG1hdGNoIHRob3NlIHVzZWQgYnlcblx0XHQvLyB0aGUgbmF0aXZlIGBhdG9iYC9gYnRvYWAgaW1wbGVtZW50YXRpb24gaW4gQ2hyb21pdW0uXG5cdFx0dGhyb3cgbmV3IEludmFsaWRDaGFyYWN0ZXJFcnJvcihtZXNzYWdlKTtcblx0fTtcblxuXHR2YXIgVEFCTEUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cdC8vIGh0dHA6Ly93aGF0d2cub3JnL2h0bWwvY29tbW9uLW1pY3Jvc3ludGF4ZXMuaHRtbCNzcGFjZS1jaGFyYWN0ZXJcblx0dmFyIFJFR0VYX1NQQUNFX0NIQVJBQ1RFUlMgPSAvW1xcdFxcblxcZlxcciBdL2c7XG5cblx0Ly8gYGRlY29kZWAgaXMgZGVzaWduZWQgdG8gYmUgZnVsbHkgY29tcGF0aWJsZSB3aXRoIGBhdG9iYCBhcyBkZXNjcmliZWQgaW4gdGhlXG5cdC8vIEhUTUwgU3RhbmRhcmQuIGh0dHA6Ly93aGF0d2cub3JnL2h0bWwvd2ViYXBwYXBpcy5odG1sI2RvbS13aW5kb3diYXNlNjQtYXRvYlxuXHQvLyBUaGUgb3B0aW1pemVkIGJhc2U2NC1kZWNvZGluZyBhbGdvcml0aG0gdXNlZCBpcyBiYXNlZCBvbiBAYXRr4oCZcyBleGNlbGxlbnRcblx0Ly8gaW1wbGVtZW50YXRpb24uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2F0ay8xMDIwMzk2XG5cdHZhciBkZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRcdGlucHV0ID0gU3RyaW5nKGlucHV0KVxuXHRcdFx0LnJlcGxhY2UoUkVHRVhfU1BBQ0VfQ0hBUkFDVEVSUywgJycpO1xuXHRcdHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cdFx0aWYgKGxlbmd0aCAlIDQgPT0gMCkge1xuXHRcdFx0aW5wdXQgPSBpbnB1dC5yZXBsYWNlKC89PT8kLywgJycpO1xuXHRcdFx0bGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRsZW5ndGggJSA0ID09IDEgfHxcblx0XHRcdC8vIGh0dHA6Ly93aGF0d2cub3JnL0MjYWxwaGFudW1lcmljLWFzY2lpLWNoYXJhY3RlcnNcblx0XHRcdC9bXithLXpBLVowLTkvXS8udGVzdChpbnB1dClcblx0XHQpIHtcblx0XHRcdGVycm9yKFxuXHRcdFx0XHQnSW52YWxpZCBjaGFyYWN0ZXI6IHRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuJ1xuXHRcdFx0KTtcblx0XHR9XG5cdFx0dmFyIGJpdENvdW50ZXIgPSAwO1xuXHRcdHZhciBiaXRTdG9yYWdlO1xuXHRcdHZhciBidWZmZXI7XG5cdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdHZhciBwb3NpdGlvbiA9IC0xO1xuXHRcdHdoaWxlICgrK3Bvc2l0aW9uIDwgbGVuZ3RoKSB7XG5cdFx0XHRidWZmZXIgPSBUQUJMRS5pbmRleE9mKGlucHV0LmNoYXJBdChwb3NpdGlvbikpO1xuXHRcdFx0Yml0U3RvcmFnZSA9IGJpdENvdW50ZXIgJSA0ID8gYml0U3RvcmFnZSAqIDY0ICsgYnVmZmVyIDogYnVmZmVyO1xuXHRcdFx0Ly8gVW5sZXNzIHRoaXMgaXMgdGhlIGZpcnN0IG9mIGEgZ3JvdXAgb2YgNCBjaGFyYWN0ZXJz4oCmXG5cdFx0XHRpZiAoYml0Q291bnRlcisrICUgNCkge1xuXHRcdFx0XHQvLyDigKZjb252ZXJ0IHRoZSBmaXJzdCA4IGJpdHMgdG8gYSBzaW5nbGUgQVNDSUkgY2hhcmFjdGVyLlxuXHRcdFx0XHRvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0XHRcdFx0XHQweEZGICYgYml0U3RvcmFnZSA+PiAoLTIgKiBiaXRDb3VudGVyICYgNilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fTtcblxuXHQvLyBgZW5jb2RlYCBpcyBkZXNpZ25lZCB0byBiZSBmdWxseSBjb21wYXRpYmxlIHdpdGggYGJ0b2FgIGFzIGRlc2NyaWJlZCBpbiB0aGVcblx0Ly8gSFRNTCBTdGFuZGFyZDogaHR0cDovL3doYXR3Zy5vcmcvaHRtbC93ZWJhcHBhcGlzLmh0bWwjZG9tLXdpbmRvd2Jhc2U2NC1idG9hXG5cdHZhciBlbmNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRcdGlucHV0ID0gU3RyaW5nKGlucHV0KTtcblx0XHRpZiAoL1teXFwwLVxceEZGXS8udGVzdChpbnB1dCkpIHtcblx0XHRcdC8vIE5vdGU6IG5vIG5lZWQgdG8gc3BlY2lhbC1jYXNlIGFzdHJhbCBzeW1ib2xzIGhlcmUsIGFzIHN1cnJvZ2F0ZXMgYXJlXG5cdFx0XHQvLyBtYXRjaGVkLCBhbmQgdGhlIGlucHV0IGlzIHN1cHBvc2VkIHRvIG9ubHkgY29udGFpbiBBU0NJSSBhbnl3YXkuXG5cdFx0XHRlcnJvcihcblx0XHRcdFx0J1RoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZCBjb250YWlucyBjaGFyYWN0ZXJzIG91dHNpZGUgb2YgdGhlICcgK1xuXHRcdFx0XHQnTGF0aW4xIHJhbmdlLidcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHZhciBwYWRkaW5nID0gaW5wdXQubGVuZ3RoICUgMztcblx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0dmFyIHBvc2l0aW9uID0gLTE7XG5cdFx0dmFyIGE7XG5cdFx0dmFyIGI7XG5cdFx0dmFyIGM7XG5cdFx0dmFyIGJ1ZmZlcjtcblx0XHQvLyBNYWtlIHN1cmUgYW55IHBhZGRpbmcgaXMgaGFuZGxlZCBvdXRzaWRlIG9mIHRoZSBsb29wLlxuXHRcdHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGggLSBwYWRkaW5nO1xuXG5cdFx0d2hpbGUgKCsrcG9zaXRpb24gPCBsZW5ndGgpIHtcblx0XHRcdC8vIFJlYWQgdGhyZWUgYnl0ZXMsIGkuZS4gMjQgYml0cy5cblx0XHRcdGEgPSBpbnB1dC5jaGFyQ29kZUF0KHBvc2l0aW9uKSA8PCAxNjtcblx0XHRcdGIgPSBpbnB1dC5jaGFyQ29kZUF0KCsrcG9zaXRpb24pIDw8IDg7XG5cdFx0XHRjID0gaW5wdXQuY2hhckNvZGVBdCgrK3Bvc2l0aW9uKTtcblx0XHRcdGJ1ZmZlciA9IGEgKyBiICsgYztcblx0XHRcdC8vIFR1cm4gdGhlIDI0IGJpdHMgaW50byBmb3VyIGNodW5rcyBvZiA2IGJpdHMgZWFjaCwgYW5kIGFwcGVuZCB0aGVcblx0XHRcdC8vIG1hdGNoaW5nIGNoYXJhY3RlciBmb3IgZWFjaCBvZiB0aGVtIHRvIHRoZSBvdXRwdXQuXG5cdFx0XHRvdXRwdXQgKz0gKFxuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDE4ICYgMHgzRikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDEyICYgMHgzRikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDYgJiAweDNGKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgJiAweDNGKVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocGFkZGluZyA9PSAyKSB7XG5cdFx0XHRhID0gaW5wdXQuY2hhckNvZGVBdChwb3NpdGlvbikgPDwgODtcblx0XHRcdGIgPSBpbnB1dC5jaGFyQ29kZUF0KCsrcG9zaXRpb24pO1xuXHRcdFx0YnVmZmVyID0gYSArIGI7XG5cdFx0XHRvdXRwdXQgKz0gKFxuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDEwKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdCgoYnVmZmVyID4+IDQpICYgMHgzRikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoKGJ1ZmZlciA8PCAyKSAmIDB4M0YpICtcblx0XHRcdFx0Jz0nXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAocGFkZGluZyA9PSAxKSB7XG5cdFx0XHRidWZmZXIgPSBpbnB1dC5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcblx0XHRcdG91dHB1dCArPSAoXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gMikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoKGJ1ZmZlciA8PCA0KSAmIDB4M0YpICtcblx0XHRcdFx0Jz09J1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9O1xuXG5cdHZhciBiYXNlNjQgPSB7XG5cdFx0J2VuY29kZSc6IGVuY29kZSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCd2ZXJzaW9uJzogJzEuMC4wJ1xuXHR9O1xuXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGJhc2U2NDtcblx0XHR9KTtcblx0fVx0ZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgIWZyZWVFeHBvcnRzLm5vZGVUeXBlKSB7XG5cdFx0aWYgKGZyZWVNb2R1bGUpIHsgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IGJhc2U2NDtcblx0XHR9IGVsc2UgeyAvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yICh2YXIga2V5IGluIGJhc2U2NCkge1xuXHRcdFx0XHRiYXNlNjQuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IGJhc2U2NFtrZXldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7IC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LmJhc2U2NCA9IGJhc2U2NDtcblx0fVxuXG59KHRoaXMpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBSZXR1cm5zIGEgYEJ1ZmZlcmAgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBVUkkgYHVyaWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaSBEYXRhIFVSSSB0byB0dXJuIGludG8gYSBCdWZmZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0J1ZmZlcn0gQnVmZmVyIGluc3RhbmNlIGZyb20gRGF0YSBVUklcbiAqIEBhcGkgcHVibGljXG4gKi9cbmZ1bmN0aW9uIGRhdGFVcmlUb0J1ZmZlcih1cmkpIHtcbiAgICBpZiAoIS9eZGF0YTovaS50ZXN0KHVyaSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYHVyaWAgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgRGF0YSBVUkkgKG11c3QgYmVnaW4gd2l0aCBcImRhdGE6XCIpJyk7XG4gICAgfVxuICAgIC8vIHN0cmlwIG5ld2xpbmVzXG4gICAgdXJpID0gdXJpLnJlcGxhY2UoL1xccj9cXG4vZywgJycpO1xuICAgIC8vIHNwbGl0IHRoZSBVUkkgdXAgaW50byB0aGUgXCJtZXRhZGF0YVwiIGFuZCB0aGUgXCJkYXRhXCIgcG9ydGlvbnNcbiAgICBjb25zdCBmaXJzdENvbW1hID0gdXJpLmluZGV4T2YoJywnKTtcbiAgICBpZiAoZmlyc3RDb21tYSA9PT0gLTEgfHwgZmlyc3RDb21tYSA8PSA0KSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hbGZvcm1lZCBkYXRhOiBVUkknKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHRoZSBcImRhdGE6XCIgc2NoZW1lIGFuZCBwYXJzZSB0aGUgbWV0YWRhdGFcbiAgICBjb25zdCBtZXRhID0gdXJpLnN1YnN0cmluZyg1LCBmaXJzdENvbW1hKS5zcGxpdCgnOycpO1xuICAgIGxldCBjaGFyc2V0ID0gJyc7XG4gICAgbGV0IGJhc2U2NCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGUgPSBtZXRhWzBdIHx8ICd0ZXh0L3BsYWluJztcbiAgICBsZXQgdHlwZUZ1bGwgPSB0eXBlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbWV0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWV0YVtpXSA9PT0gJ2Jhc2U2NCcpIHtcbiAgICAgICAgICAgIGJhc2U2NCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0eXBlRnVsbCArPSBgOyR7bWV0YVtpXX1gO1xuICAgICAgICAgICAgaWYgKG1ldGFbaV0uaW5kZXhPZignY2hhcnNldD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBtZXRhW2ldLnN1YnN0cmluZyg4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkZWZhdWx0cyB0byBVUy1BU0NJSSBvbmx5IGlmIHR5cGUgaXMgbm90IHByb3ZpZGVkXG4gICAgaWYgKCFtZXRhWzBdICYmICFjaGFyc2V0Lmxlbmd0aCkge1xuICAgICAgICB0eXBlRnVsbCArPSAnO2NoYXJzZXQ9VVMtQVNDSUknO1xuICAgICAgICBjaGFyc2V0ID0gJ1VTLUFTQ0lJJztcbiAgICB9XG4gICAgLy8gZ2V0IHRoZSBlbmNvZGVkIGRhdGEgcG9ydGlvbiBhbmQgZGVjb2RlIFVSSS1lbmNvZGVkIGNoYXJzXG4gICAgY29uc3QgZW5jb2RpbmcgPSBiYXNlNjQgPyAnYmFzZTY0JyA6ICdhc2NpaSc7XG4gICAgY29uc3QgZGF0YSA9IHVuZXNjYXBlKHVyaS5zdWJzdHJpbmcoZmlyc3RDb21tYSArIDEpKTtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShkYXRhLCBlbmNvZGluZyk7XG4gICAgLy8gc2V0IGAudHlwZWAgYW5kIGAudHlwZUZ1bGxgIHByb3BlcnRpZXMgdG8gTUlNRSB0eXBlXG4gICAgYnVmZmVyLnR5cGUgPSB0eXBlO1xuICAgIGJ1ZmZlci50eXBlRnVsbCA9IHR5cGVGdWxsO1xuICAgIC8vIHNldCB0aGUgYC5jaGFyc2V0YCBwcm9wZXJ0eVxuICAgIGJ1ZmZlci5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBkYXRhVXJpVG9CdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIEBhdXRob3IgVG9ydSBOYWdhc2hpbWEgPGh0dHBzOi8vZ2l0aHViLmNvbS9teXN0aWNhdGVhPlxuICogQGNvcHlyaWdodCAyMDE1IFRvcnUgTmFnYXNoaW1hLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGRpcmVjdG9yeSBmb3IgZnVsbCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpdmF0ZURhdGFcbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3t0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZXZlbnRQaGFzZSBUaGUgY3VycmVudCBldmVudCBwaGFzZS5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR8bnVsbH0gY3VycmVudFRhcmdldCBUaGUgY3VycmVudCBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNhbmNlbGVkIFRoZSBmbGFnIHRvIHByZXZlbnQgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3RvcHBlZCBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW1lZGlhdGVTdG9wcGVkIFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24gaW1tZWRpYXRlbHkuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufG51bGx9IHBhc3NpdmVMaXN0ZW5lciBUaGUgbGlzdGVuZXIgaWYgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaXMgcGFzc2l2ZS4gT3RoZXJ3aXNlIHRoaXMgaXMgbnVsbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lU3RhbXAgVGhlIHVuaXggdGltZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBQcml2YXRlIGRhdGEgZm9yIGV2ZW50IHdyYXBwZXJzLlxuICogQHR5cGUge1dlYWtNYXA8RXZlbnQsIFByaXZhdGVEYXRhPn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHByaXZhdGVEYXRhID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDYWNoZSBmb3Igd3JhcHBlciBjbGFzc2VzLlxuICogQHR5cGUge1dlYWtNYXA8T2JqZWN0LCBGdW5jdGlvbj59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB3cmFwcGVycyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogR2V0IHByaXZhdGUgZGF0YS5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCBvYmplY3QgdG8gZ2V0IHByaXZhdGUgZGF0YS5cbiAqIEByZXR1cm5zIHtQcml2YXRlRGF0YX0gVGhlIHByaXZhdGUgZGF0YSBvZiB0aGUgZXZlbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwZChldmVudCkge1xuICAgIGNvbnN0IHJldHYgPSBwcml2YXRlRGF0YS5nZXQoZXZlbnQpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICByZXR2ICE9IG51bGwsXG4gICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50IG9iamVjdCwgYnV0IGdvdFwiLFxuICAgICAgICBldmVudFxuICAgICk7XG4gICAgcmV0dXJuIHJldHZcbn1cblxuLyoqXG4gKiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI3NldC10aGUtY2FuY2VsZWQtZmxhZ1xuICogQHBhcmFtIGRhdGEge1ByaXZhdGVEYXRhfSBwcml2YXRlIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHNldENhbmNlbEZsYWcoZGF0YSkge1xuICAgIGlmIChkYXRhLnBhc3NpdmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlVuYWJsZSB0byBwcmV2ZW50RGVmYXVsdCBpbnNpZGUgcGFzc2l2ZSBldmVudCBsaXN0ZW5lciBpbnZvY2F0aW9uLlwiLFxuICAgICAgICAgICAgICAgIGRhdGEucGFzc2l2ZUxpc3RlbmVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIWRhdGEuZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkYXRhLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQucHJldmVudERlZmF1bHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBkYXRhLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtZXZlbnRcbiAqIEBwcml2YXRlXG4gKi9cbi8qKlxuICogVGhlIGV2ZW50IHdyYXBwZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2YgdGhpcyBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50IHRvIHdyYXAuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIHByaXZhdGVEYXRhLnNldCh0aGlzLCB7XG4gICAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgICBldmVudCxcbiAgICAgICAgZXZlbnRQaGFzZTogMixcbiAgICAgICAgY3VycmVudFRhcmdldDogZXZlbnRUYXJnZXQsXG4gICAgICAgIGNhbmNlbGVkOiBmYWxzZSxcbiAgICAgICAgc3RvcHBlZDogZmFsc2UsXG4gICAgICAgIGltbWVkaWF0ZVN0b3BwZWQ6IGZhbHNlLFxuICAgICAgICBwYXNzaXZlTGlzdGVuZXI6IG51bGwsXG4gICAgICAgIHRpbWVTdGFtcDogZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCksXG4gICAgfSk7XG5cbiAgICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNVbmZvcmdlYWJsZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzVHJ1c3RlZFwiLCB7IHZhbHVlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcykpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudC50eXBlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5jdXJyZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtFdmVudFRhcmdldFtdfSBUaGUgY29tcG9zZWQgcGF0aCBvZiB0aGlzIGV2ZW50LlxuICAgICAqL1xuICAgIGNvbXBvc2VkUGF0aCgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IHBkKHRoaXMpLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY3VycmVudFRhcmdldF1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgTk9ORS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBOT05FKCkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBDQVBUVVJJTkdfUEhBU0UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQ0FQVFVSSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBBVF9UQVJHRVQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQVRfVEFSR0VUKCkge1xuICAgICAgICByZXR1cm4gMlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBCVUJCTElOR19QSEFTRS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBCVUJCTElOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIDNcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGV2ZW50UGhhc2UoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFBoYXNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgZGF0YS5pbW1lZGlhdGVTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGJ1YmJsaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBidWJibGVzKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5idWJibGVzKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBjYW5jZWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjYW5jZWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5jYW5jZWxhYmxlKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhpcyBldmVudC5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgc2V0Q2FuY2VsRmxhZyhwZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmNhbmNlbGVkXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGNvbXBvc2VkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjb21wb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuY29tcG9zZWQpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bml4IHRpbWUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCB0aW1lU3RhbXAoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS50aW1lU3RhbXBcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBzcmNFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gc3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBjYW5jZWxCdWJibGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5zdG9wcGVkXG4gICAgfSxcbiAgICBzZXQgY2FuY2VsQnViYmxlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuY2FuY2VsQnViYmxlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCByZXR1cm5WYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuICFwZCh0aGlzKS5jYW5jZWxlZFxuICAgIH0sXG4gICAgc2V0IHJldHVyblZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHNldENhbmNlbEZsYWcocGQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhpcyBldmVudCBvYmplY3QuIEJ1dCBkbyBub3RoaW5nIHVuZGVyIGV2ZW50IGRpc3BhdGNoaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdIFRoZSBmbGFnIHRvIGJlIHBvc3NpYmxlIHRvIGJ1YmJsZSB1cC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYW5jZWxhYmxlPWZhbHNlXSBUaGUgZmxhZyB0byBiZSBwb3NzaWJsZSB0byBjYW5jZWwuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbml0RXZlbnQoKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfSxcbn07XG5cbi8vIGBjb25zdHJ1Y3RvcmAgaXMgbm90IGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQucHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogRXZlbnQsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxufSk7XG5cbi8vIEVuc3VyZSBgZXZlbnQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRgIGlzIGB0cnVlYC5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnQucHJvdG90eXBlKTtcblxuICAgIC8vIE1ha2UgYXNzb2NpYXRpb24gZm9yIHdyYXBwZXJzLlxuICAgIHdyYXBwZXJzLnNldCh3aW5kb3cuRXZlbnQucHJvdG90eXBlLCBFdmVudCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0IGEgZ2l2ZW4gcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byByZWRpcmVjdCB0aGUgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50W2tleV1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBwZCh0aGlzKS5ldmVudFtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGNhbGwgYSBnaXZlbiBtZXRob2QgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byBjYWxsIHRoZSBtZXRob2QgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVDYWxsRGVzY3JpcHRvcihrZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcGQodGhpcykuZXZlbnQ7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRba2V5XS5hcHBseShldmVudCwgYXJndW1lbnRzKVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBuZXcgd3JhcHBlciBjbGFzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IEJhc2VFdmVudCBUaGUgYmFzZSB3cmFwcGVyIGNsYXNzLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgZGVmaW5lZCB3cmFwcGVyIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lV3JhcHBlcihCYXNlRXZlbnQsIHByb3RvKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3RvKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJhc2VFdmVudFxuICAgIH1cblxuICAgIC8qKiBDdXN0b21FdmVudCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgICAgICBCYXNlRXZlbnQuY2FsbCh0aGlzLCBldmVudFRhcmdldCwgZXZlbnQpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogQ3VzdG9tRXZlbnQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghKGtleSBpbiBCYXNlRXZlbnQucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBpc0Z1bmMgPSB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgaXNGdW5jXG4gICAgICAgICAgICAgICAgICAgID8gZGVmaW5lQ2FsbERlc2NyaXB0b3Ioa2V5KVxuICAgICAgICAgICAgICAgICAgICA6IGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50XG59XG5cbi8qKlxuICogR2V0IHRoZSB3cmFwcGVyIGNsYXNzIG9mIGEgZ2l2ZW4gcHJvdG90eXBlLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGdldCBpdHMgd3JhcHBlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHdyYXBwZXIgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRXcmFwcGVyKHByb3RvKSB7XG4gICAgaWYgKHByb3RvID09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXIgPSB3cmFwcGVycy5nZXQocHJvdG8pO1xuICAgIGlmICh3cmFwcGVyID09IG51bGwpIHtcbiAgICAgICAgd3JhcHBlciA9IGRlZmluZVdyYXBwZXIoZ2V0V3JhcHBlcihPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKSwgcHJvdG8pO1xuICAgICAgICB3cmFwcGVycy5zZXQocHJvdG8sIHdyYXBwZXIpO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlclxufVxuXG4vKipcbiAqIFdyYXAgYSBnaXZlbiBldmVudCB0byBtYW5hZ2VtZW50IGEgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IG9mIHRoaXMgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHRvIHdyYXAuXG4gKiBAcmV0dXJucyB7RXZlbnR9IFRoZSB3cmFwcGVyIGluc3RhbmNlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gd3JhcEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIGNvbnN0IFdyYXBwZXIgPSBnZXRXcmFwcGVyKE9iamVjdC5nZXRQcm90b3R5cGVPZihldmVudCkpO1xuICAgIHJldHVybiBuZXcgV3JhcHBlcihldmVudFRhcmdldCwgZXZlbnQpXG59XG5cbi8qKlxuICogR2V0IHRoZSBpbW1lZGlhdGVTdG9wcGVkIGZsYWcgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbiBpbW1lZGlhdGVseS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3RvcHBlZChldmVudCkge1xuICAgIHJldHVybiBwZChldmVudCkuaW1tZWRpYXRlU3RvcHBlZFxufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCBldmVudCBwaGFzZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBldmVudFBoYXNlIE5ldyBldmVudCBwaGFzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnRQaGFzZShldmVudCwgZXZlbnRQaGFzZSkge1xuICAgIHBkKGV2ZW50KS5ldmVudFBoYXNlID0gZXZlbnRQaGFzZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtFdmVudFRhcmdldHxudWxsfSBjdXJyZW50VGFyZ2V0IE5ldyBjdXJyZW50IHRhcmdldC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0Q3VycmVudFRhcmdldChldmVudCwgY3VycmVudFRhcmdldCkge1xuICAgIHBkKGV2ZW50KS5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbn1cblxuLyoqXG4gKiBTZXQgYSBwYXNzaXZlIGxpc3RlbmVyIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSBwYXNzaXZlTGlzdGVuZXIgTmV3IHBhc3NpdmUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldFBhc3NpdmVMaXN0ZW5lcihldmVudCwgcGFzc2l2ZUxpc3RlbmVyKSB7XG4gICAgcGQoZXZlbnQpLnBhc3NpdmVMaXN0ZW5lciA9IHBhc3NpdmVMaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMaXN0ZW5lck5vZGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiBAcHJvcGVydHkgezF8MnwzfSBsaXN0ZW5lclR5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFzc2l2ZVxuICogQHByb3BlcnR5IHtib29sZWFufSBvbmNlXG4gKiBAcHJvcGVydHkge0xpc3RlbmVyTm9kZXxudWxsfSBuZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBMaXN0ZW5lck5vZGU+Pn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGxpc3RlbmVyc01hcCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8vIExpc3RlbmVyIHR5cGVzXG5jb25zdCBDQVBUVVJFID0gMTtcbmNvbnN0IEJVQkJMRSA9IDI7XG5jb25zdCBBVFRSSUJVVEUgPSAzO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3Qgb3Igbm90LlxuICogQHBhcmFtIHthbnl9IHggVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc09iamVjdCh4KSB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG59XG5cbi8qKlxuICogR2V0IGxpc3RlbmVycy5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgdG8gZ2V0LlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIExpc3RlbmVyTm9kZT59IFRoZSBsaXN0ZW5lcnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcnMoZXZlbnRUYXJnZXQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50VGFyZ2V0KTtcbiAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50VGFyZ2V0IG9iamVjdCwgYnV0IGdvdCBhbm90aGVyIHZhbHVlLlwiXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RlbmVyc1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIGV2ZW50IGF0dHJpYnV0ZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBnZXQgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RlbmVyVHlwZSA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmxpc3RlbmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuXG4gICAgICAgIHNldChsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmICFpc09iamVjdChsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcblxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgcmVtb3Zpbmcgb2xkIHZhbHVlLlxuICAgICAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXJUeXBlID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9sZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIG5ldyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclR5cGU6IEFUVFJJQlVURSxcbiAgICAgICAgICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ld05vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBhbiBldmVudCBhdHRyaWJ1dGUgKGUuZy4gYGV2ZW50VGFyZ2V0Lm9uY2xpY2tgKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFRhcmdldFByb3RvdHlwZSBUaGUgZXZlbnQgdGFyZ2V0IHByb3RvdHlwZSB0byBkZWZpbmUgYW4gZXZlbnQgYXR0cmJpdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGRlZmluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWZpbmVFdmVudEF0dHJpYnV0ZShldmVudFRhcmdldFByb3RvdHlwZSwgZXZlbnROYW1lKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBldmVudFRhcmdldFByb3RvdHlwZSxcbiAgICAgICAgYG9uJHtldmVudE5hbWV9YCxcbiAgICAgICAgZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSlcbiAgICApO1xufVxuXG4vKipcbiAqIERlZmluZSBhIGN1c3RvbSBFdmVudFRhcmdldCB3aXRoIGV2ZW50IGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBldmVudE5hbWVzIEV2ZW50IG5hbWVzIGZvciBldmVudCBhdHRyaWJ1dGVzLlxuICogQHJldHVybnMge0V2ZW50VGFyZ2V0fSBUaGUgY3VzdG9tIEV2ZW50VGFyZ2V0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoZXZlbnROYW1lcykge1xuICAgIC8qKiBDdXN0b21FdmVudFRhcmdldCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50VGFyZ2V0KCkge1xuICAgICAgICBFdmVudFRhcmdldC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICB2YWx1ZTogQ3VzdG9tRXZlbnRUYXJnZXQsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBkZWZpbmVFdmVudEF0dHJpYnV0ZShDdXN0b21FdmVudFRhcmdldC5wcm90b3R5cGUsIGV2ZW50TmFtZXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21FdmVudFRhcmdldFxufVxuXG4vKipcbiAqIEV2ZW50VGFyZ2V0LlxuICpcbiAqIC0gVGhpcyBpcyBjb25zdHJ1Y3RvciBpZiBubyBhcmd1bWVudHMuXG4gKiAtIFRoaXMgaXMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgQ3VzdG9tRXZlbnRUYXJnZXQgY29uc3RydWN0b3IgaWYgdGhlcmUgYXJlIGFyZ3VtZW50cy5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgY2xhc3MgQSBleHRlbmRzIEV2ZW50VGFyZ2V0IHt9XG4gKiAgICAgY2xhc3MgQiBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiKSB7fVxuICogICAgIGNsYXNzIEMgZXh0ZW5kcyBFdmVudFRhcmdldChcIm1lc3NhZ2VcIiwgXCJlcnJvclwiKSB7fVxuICogICAgIGNsYXNzIEQgZXh0ZW5kcyBFdmVudFRhcmdldChbXCJtZXNzYWdlXCIsIFwiZXJyb3JcIl0pIHt9XG4gKi9cbmZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIGxpc3RlbmVyc01hcC5zZXQodGhpcywgbmV3IE1hcCgpKTtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoYXJndW1lbnRzWzBdKVxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQodHlwZXMpXG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIilcbiAgICAvKmVzbGludC1lbmFibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnaXZlbiBsaXN0ZW5lciB0byB0aGlzIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnx7Y2FwdHVyZT86Ym9vbGVhbixwYXNzaXZlPzpib29sZWFuLG9uY2U/OmJvb2xlYW59fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIgJiYgIWlzT2JqZWN0KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidsaXN0ZW5lcicgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBvcHRpb25zSXNPYmogPSBpc09iamVjdChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IG9wdGlvbnNJc09ialxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgICAgIGxpc3RlbmVyVHlwZSxcbiAgICAgICAgICAgIHBhc3NpdmU6IG9wdGlvbnNJc09iaiAmJiBCb29sZWFuKG9wdGlvbnMucGFzc2l2ZSksXG4gICAgICAgICAgICBvbmNlOiBvcHRpb25zSXNPYmogJiYgQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgaXQgYXMgdGhlIGZpcnN0IG5vZGUgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbnVsbC5cbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBuZXdOb2RlKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgY2hlY2tpbmcgZHVwbGljYXRpb24uLlxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyID09PSBsaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlID09PSBsaXN0ZW5lclR5cGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBpZ25vcmUgZHVwbGljYXRpb24uXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgaXQuXG4gICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBldmVudCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58e2NhcHR1cmU/OmJvb2xlYW4scGFzc2l2ZT86Ym9vbGVhbixvbmNlPzpib29sZWFufX0gW29wdGlvbnNdIFRoZSBvcHRpb25zIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBpc09iamVjdChvcHRpb25zKVxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgPT09IGxpc3RlbmVyVHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGdpdmVuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgZmFsc2VgIGlmIGNhbmNlbGVkLlxuICAgICAqL1xuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50ID09IG51bGwgfHwgdHlwZW9mIGV2ZW50LnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZXZlbnQudHlwZVwiIHNob3VsZCBiZSBhIHN0cmluZy4nKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbGlzdGVuZXJzIGFyZW4ndCByZWdpc3RlcmVkLCB0ZXJtaW5hdGUuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gZXZlbnQudHlwZTtcbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSB3ZSBjYW5ub3QgcmV3cml0ZSBzZXZlcmFsIHByb3BlcnRpZXMsIHNvIHdyYXAgb2JqZWN0LlxuICAgICAgICBjb25zdCB3cmFwcGVkRXZlbnQgPSB3cmFwRXZlbnQodGhpcywgZXZlbnQpO1xuXG4gICAgICAgIC8vIFRoaXMgZG9lc24ndCBwcm9jZXNzIGNhcHR1cmluZyBwaGFzZSBhbmQgYnViYmxpbmcgcGhhc2UuXG4gICAgICAgIC8vIFRoaXMgaXNuJ3QgcGFydGljaXBhdGluZyBpbiBhIHRyZWUuXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbGlzdGVuZXIgaWYgaXQncyBvbmNlXG4gICAgICAgICAgICBpZiAobm9kZS5vbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICAgIHNldFBhc3NpdmVMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgbm9kZS5wYXNzaXZlID8gbm9kZS5saXN0ZW5lciA6IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUubGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuY2FsbCh0aGlzLCB3cmFwcGVkRXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgIT09IEFUVFJJQlVURSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuaGFuZGxlRXZlbnQod3JhcHBlZEV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgaWYgYGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbmAgd2FzIGNhbGxlZC5cbiAgICAgICAgICAgIGlmIChpc1N0b3BwZWQod3JhcHBlZEV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UGFzc2l2ZUxpc3RlbmVyKHdyYXBwZWRFdmVudCwgbnVsbCk7XG4gICAgICAgIHNldEV2ZW50UGhhc2Uod3JhcHBlZEV2ZW50LCAwKTtcbiAgICAgICAgc2V0Q3VycmVudFRhcmdldCh3cmFwcGVkRXZlbnQsIG51bGwpO1xuXG4gICAgICAgIHJldHVybiAhd3JhcHBlZEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWRcbiAgICB9LFxufTtcblxuLy8gYGNvbnN0cnVjdG9yYCBpcyBub3QgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudFRhcmdldC5wcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG59KTtcblxuLy8gRW5zdXJlIGBldmVudFRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudFRhcmdldGAgaXMgYHRydWVgLlxuaWYgKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2Ygd2luZG93LkV2ZW50VGFyZ2V0ICE9PSBcInVuZGVmaW5lZFwiXG4pIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlKTtcbn1cblxuZXhwb3J0cy5kZWZpbmVFdmVudEF0dHJpYnV0ZSA9IGRlZmluZUV2ZW50QXR0cmlidXRlO1xuZXhwb3J0cy5FdmVudFRhcmdldCA9IEV2ZW50VGFyZ2V0O1xuZXhwb3J0cy5kZWZhdWx0ID0gRXZlbnRUYXJnZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRUYXJnZXRcbm1vZHVsZS5leHBvcnRzLkV2ZW50VGFyZ2V0ID0gbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gRXZlbnRUYXJnZXRcbm1vZHVsZS5leHBvcnRzLmRlZmluZUV2ZW50QXR0cmlidXRlID0gZGVmaW5lRXZlbnRBdHRyaWJ1dGVcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZW50LXRhcmdldC1zaGltLmpzLm1hcFxuIiwiY29uc3Qge1JlYWRhYmxlfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPEJsb2IsIHt0eXBlOiBzdHJpbmcsIHNpemU6IG51bWJlciwgcGFydHM6IChCbG9iIHwgQnVmZmVyKVtdIH0+fVxuICovXG5jb25zdCB3bSA9IG5ldyBXZWFrTWFwKCk7XG5cbmFzeW5jIGZ1bmN0aW9uICogcmVhZChwYXJ0cykge1xuXHRmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcblx0XHRpZiAoJ3N0cmVhbScgaW4gcGFydCkge1xuXHRcdFx0eWllbGQgKiBwYXJ0LnN0cmVhbSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR5aWVsZCBwYXJ0O1xuXHRcdH1cblx0fVxufVxuXG5jbGFzcyBCbG9iIHtcblx0LyoqXG5cdCAqIFRoZSBCbG9iKCkgY29uc3RydWN0b3IgcmV0dXJucyBhIG5ldyBCbG9iIG9iamVjdC4gVGhlIGNvbnRlbnRcblx0ICogb2YgdGhlIGJsb2IgY29uc2lzdHMgb2YgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHZhbHVlcyBnaXZlblxuXHQgKiBpbiB0aGUgcGFyYW1ldGVyIGFycmF5LlxuXHQgKlxuXHQgKiBAcGFyYW0geyhBcnJheUJ1ZmZlckxpa2UgfCBBcnJheUJ1ZmZlclZpZXcgfCBCbG9iIHwgQnVmZmVyIHwgc3RyaW5nKVtdfSBibG9iUGFydHNcblx0ICogQHBhcmFtIHt7IHR5cGU/OiBzdHJpbmcgfX0gW29wdGlvbnNdXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihibG9iUGFydHMgPSBbXSwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0bGV0IHNpemUgPSAwO1xuXG5cdFx0Y29uc3QgcGFydHMgPSBibG9iUGFydHMubWFwKGVsZW1lbnQgPT4ge1xuXHRcdFx0bGV0IGJ1ZmZlcjtcblx0XHRcdGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnVmZmVyKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IGVsZW1lbnQ7XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhlbGVtZW50KSkge1xuXHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbShlbGVtZW50LmJ1ZmZlciwgZWxlbWVudC5ieXRlT2Zmc2V0LCBlbGVtZW50LmJ5dGVMZW5ndGgpO1xuXHRcdFx0fSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcblx0XHRcdFx0YnVmZmVyID0gQnVmZmVyLmZyb20oZWxlbWVudCk7XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCbG9iKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IGVsZW1lbnQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbSh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBlbGVtZW50IDogU3RyaW5nKGVsZW1lbnQpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vZXhwbGljaXQtbGVuZ3RoLWNoZWNrXG5cdFx0XHRzaXplICs9IGJ1ZmZlci5sZW5ndGggfHwgYnVmZmVyLnNpemUgfHwgMDtcblx0XHRcdHJldHVybiBidWZmZXI7XG5cdFx0fSk7XG5cblx0XHRjb25zdCB0eXBlID0gb3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhvcHRpb25zLnR5cGUpLnRvTG93ZXJDYXNlKCk7XG5cblx0XHR3bS5zZXQodGhpcywge1xuXHRcdFx0dHlwZTogL1teXFx1MDAyMC1cXHUwMDdFXS8udGVzdCh0eXBlKSA/ICcnIDogdHlwZSxcblx0XHRcdHNpemUsXG5cdFx0XHRwYXJ0c1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCbG9iIGludGVyZmFjZSdzIHNpemUgcHJvcGVydHkgcmV0dXJucyB0aGVcblx0ICogc2l6ZSBvZiB0aGUgQmxvYiBpbiBieXRlcy5cblx0ICovXG5cdGdldCBzaXplKCkge1xuXHRcdHJldHVybiB3bS5nZXQodGhpcykuc2l6ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBwcm9wZXJ0eSBvZiBhIEJsb2Igb2JqZWN0IHJldHVybnMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdGdldCB0eXBlKCkge1xuXHRcdHJldHVybiB3bS5nZXQodGhpcykudHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdGV4dCgpIG1ldGhvZCBpbiB0aGUgQmxvYiBpbnRlcmZhY2UgcmV0dXJucyBhIFByb21pc2Vcblx0ICogdGhhdCByZXNvbHZlcyB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mXG5cdCAqIHRoZSBibG9iLCBpbnRlcnByZXRlZCBhcyBVVEYtOC5cblx0ICpcblx0ICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fVxuXHQgKi9cblx0YXN5bmMgdGV4dCgpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmZyb20oYXdhaXQgdGhpcy5hcnJheUJ1ZmZlcigpKS50b1N0cmluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBhcnJheUJ1ZmZlcigpIG1ldGhvZCBpbiB0aGUgQmxvYiBpbnRlcmZhY2UgcmV0dXJucyBhXG5cdCAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvYiBhc1xuXHQgKiBiaW5hcnkgZGF0YSBjb250YWluZWQgaW4gYW4gQXJyYXlCdWZmZXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fVxuXHQgKi9cblx0YXN5bmMgYXJyYXlCdWZmZXIoKSB7XG5cdFx0Y29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuc2l6ZSk7XG5cdFx0bGV0IG9mZnNldCA9IDA7XG5cdFx0Zm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiB0aGlzLnN0cmVhbSgpKSB7XG5cdFx0XHRkYXRhLnNldChjaHVuaywgb2Zmc2V0KTtcblx0XHRcdG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEuYnVmZmVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCbG9iIGludGVyZmFjZSdzIHN0cmVhbSgpIG1ldGhvZCBpcyBkaWZmZXJlbmNlIGZyb20gbmF0aXZlXG5cdCAqIGFuZCB1c2VzIG5vZGUgc3RyZWFtcyBpbnN0ZWFkIG9mIHdoYXR3ZyBzdHJlYW1zLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UmVhZGFibGV9IE5vZGUgcmVhZGFibGUgc3RyZWFtXG5cdCAqL1xuXHRzdHJlYW0oKSB7XG5cdFx0cmV0dXJuIFJlYWRhYmxlLmZyb20ocmVhZCh3bS5nZXQodGhpcykucGFydHMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgQmxvYiBpbnRlcmZhY2UncyBzbGljZSgpIG1ldGhvZCBjcmVhdGVzIGFuZCByZXR1cm5zIGFcblx0ICogbmV3IEJsb2Igb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGRhdGEgZnJvbSBhIHN1YnNldCBvZiB0aGVcblx0ICogYmxvYiBvbiB3aGljaCBpdCdzIGNhbGxlZC5cblx0ICpcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydF1cblx0ICogQHBhcmFtIHtudW1iZXJ9IFtlbmRdXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZV1cblx0ICovXG5cdHNsaWNlKHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5zaXplLCB0eXBlID0gJycpIHtcblx0XHRjb25zdCB7c2l6ZX0gPSB0aGlzO1xuXG5cdFx0bGV0IHJlbGF0aXZlU3RhcnQgPSBzdGFydCA8IDAgPyBNYXRoLm1heChzaXplICsgc3RhcnQsIDApIDogTWF0aC5taW4oc3RhcnQsIHNpemUpO1xuXHRcdGxldCByZWxhdGl2ZUVuZCA9IGVuZCA8IDAgPyBNYXRoLm1heChzaXplICsgZW5kLCAwKSA6IE1hdGgubWluKGVuZCwgc2l6ZSk7XG5cblx0XHRjb25zdCBzcGFuID0gTWF0aC5tYXgocmVsYXRpdmVFbmQgLSByZWxhdGl2ZVN0YXJ0LCAwKTtcblx0XHRjb25zdCBwYXJ0cyA9IHdtLmdldCh0aGlzKS5wYXJ0cy52YWx1ZXMoKTtcblx0XHRjb25zdCBibG9iUGFydHMgPSBbXTtcblx0XHRsZXQgYWRkZWQgPSAwO1xuXG5cdFx0Zm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG5cdFx0XHRjb25zdCBzaXplID0gQXJyYXlCdWZmZXIuaXNWaWV3KHBhcnQpID8gcGFydC5ieXRlTGVuZ3RoIDogcGFydC5zaXplO1xuXHRcdFx0aWYgKHJlbGF0aXZlU3RhcnQgJiYgc2l6ZSA8PSByZWxhdGl2ZVN0YXJ0KSB7XG5cdFx0XHRcdC8vIFNraXAgdGhlIGJlZ2lubmluZyBhbmQgY2hhbmdlIHRoZSByZWxhdGl2ZVxuXHRcdFx0XHQvLyBzdGFydCAmIGVuZCBwb3NpdGlvbiBhcyB3ZSBza2lwIHRoZSB1bndhbnRlZCBwYXJ0c1xuXHRcdFx0XHRyZWxhdGl2ZVN0YXJ0IC09IHNpemU7XG5cdFx0XHRcdHJlbGF0aXZlRW5kIC09IHNpemU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBjaHVuayA9IHBhcnQuc2xpY2UocmVsYXRpdmVTdGFydCwgTWF0aC5taW4oc2l6ZSwgcmVsYXRpdmVFbmQpKTtcblx0XHRcdFx0YmxvYlBhcnRzLnB1c2goY2h1bmspO1xuXHRcdFx0XHRhZGRlZCArPSBBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspID8gY2h1bmsuYnl0ZUxlbmd0aCA6IGNodW5rLnNpemU7XG5cdFx0XHRcdHJlbGF0aXZlU3RhcnQgPSAwOyAvLyBBbGwgbmV4dCBzZXF1ZW50YWwgcGFydHMgc2hvdWxkIHN0YXJ0IGF0IDBcblxuXHRcdFx0XHQvLyBkb24ndCBhZGQgdGhlIG92ZXJmbG93IHRvIG5ldyBibG9iUGFydHNcblx0XHRcdFx0aWYgKGFkZGVkID49IHNwYW4pIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbXSwge3R5cGU6IFN0cmluZyh0eXBlKS50b0xvd2VyQ2FzZSgpfSk7XG5cdFx0T2JqZWN0LmFzc2lnbih3bS5nZXQoYmxvYiksIHtzaXplOiBzcGFuLCBwYXJ0czogYmxvYlBhcnRzfSk7XG5cblx0XHRyZXR1cm4gYmxvYjtcblx0fVxuXG5cdGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0XHRyZXR1cm4gJ0Jsb2InO1xuXHR9XG5cblx0c3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKG9iamVjdCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRvYmplY3QgJiZcblx0XHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0XHR0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0b2JqZWN0LnN0cmVhbS5sZW5ndGggPT09IDAgJiZcblx0XHRcdHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcblx0XHRcdC9eKEJsb2J8RmlsZSkkLy50ZXN0KG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddKVxuXHRcdCk7XG5cdH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmxvYi5wcm90b3R5cGUsIHtcblx0c2l6ZToge2VudW1lcmFibGU6IHRydWV9LFxuXHR0eXBlOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHNsaWNlOiB7ZW51bWVyYWJsZTogdHJ1ZX1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJsb2I7XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBmZXRjaCA9IHJlcXVpcmUoJ25vZGUtZmV0Y2gnKTtcbmNvbnN0IEFib3J0Q29udHJvbGxlciA9IHJlcXVpcmUoJ2Fib3J0LWNvbnRyb2xsZXInKTtcblxuY29uc3QgVEVOX01FR0FCWVRFUyA9IDEwMDAgKiAxMDAwICogMTA7XG5cbmlmICghZ2xvYmFsLmZldGNoKSB7XG5cdGdsb2JhbC5mZXRjaCA9ICh1cmwsIG9wdGlvbnMpID0+IGZldGNoKHVybCwge2hpZ2hXYXRlck1hcms6IFRFTl9NRUdBQllURVMsIC4uLm9wdGlvbnN9KTtcbn1cblxuaWYgKCFnbG9iYWwuSGVhZGVycykge1xuXHRnbG9iYWwuSGVhZGVycyA9IGZldGNoLkhlYWRlcnM7XG59XG5cbmlmICghZ2xvYmFsLlJlcXVlc3QpIHtcblx0Z2xvYmFsLlJlcXVlc3QgPSBmZXRjaC5SZXF1ZXN0O1xufVxuXG5pZiAoIWdsb2JhbC5SZXNwb25zZSkge1xuXHRnbG9iYWwuUmVzcG9uc2UgPSBmZXRjaC5SZXNwb25zZTtcbn1cblxuaWYgKCFnbG9iYWwuQWJvcnRDb250cm9sbGVyKSB7XG5cdGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgPSBBYm9ydENvbnRyb2xsZXI7XG59XG5cbmlmICghZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSB7XG5cdHRyeSB7XG5cdFx0Z2xvYmFsLlJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnd2ViLXN0cmVhbXMtcG9seWZpbGwvcG9ueWZpbGwvZXMyMDE4Jyk7XG5cdH0gY2F0Y2ggKF8pIHt9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgna3kvdW1kJyk7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuXHR0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG5cdChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5reSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuXHQvKiEgTUlUIExpY2Vuc2UgwqkgU2luZHJlIFNvcmh1cyAqL1xuXG5cdGNvbnN0IGdsb2JhbHMgPSB7fTtcblxuXHRjb25zdCBnZXRHbG9iYWwgPSBwcm9wZXJ0eSA9PiB7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0XHRpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgJiYgcHJvcGVydHkgaW4gc2VsZikge1xuXHRcdFx0cmV0dXJuIHNlbGY7XG5cdFx0fVxuXG5cdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0XHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93ICYmIHByb3BlcnR5IGluIHdpbmRvdykge1xuXHRcdFx0cmV0dXJuIHdpbmRvdztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsICYmIHByb3BlcnR5IGluIGdsb2JhbCkge1xuXHRcdFx0cmV0dXJuIGdsb2JhbDtcblx0XHR9XG5cblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcykge1xuXHRcdFx0cmV0dXJuIGdsb2JhbFRoaXM7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0IGdsb2JhbFByb3BlcnRpZXMgPSBbXG5cdFx0J0hlYWRlcnMnLFxuXHRcdCdSZXF1ZXN0Jyxcblx0XHQnUmVzcG9uc2UnLFxuXHRcdCdSZWFkYWJsZVN0cmVhbScsXG5cdFx0J2ZldGNoJyxcblx0XHQnQWJvcnRDb250cm9sbGVyJyxcblx0XHQnRm9ybURhdGEnXG5cdF07XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnbG9iYWxQcm9wZXJ0aWVzKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbHMsIHByb3BlcnR5LCB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE9iamVjdCA9IGdldEdsb2JhbChwcm9wZXJ0eSk7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gZ2xvYmFsT2JqZWN0ICYmIGdsb2JhbE9iamVjdFtwcm9wZXJ0eV07XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5iaW5kKGdsb2JhbE9iamVjdCkgOiB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGNvbnN0IGlzT2JqZWN0ID0gdmFsdWUgPT4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcblx0Y29uc3Qgc3VwcG9ydHNBYm9ydENvbnRyb2xsZXIgPSB0eXBlb2YgZ2xvYmFscy5BYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbic7XG5cdGNvbnN0IHN1cHBvcnRzU3RyZWFtcyA9IHR5cGVvZiBnbG9iYWxzLlJlYWRhYmxlU3RyZWFtID09PSAnZnVuY3Rpb24nO1xuXHRjb25zdCBzdXBwb3J0c0Zvcm1EYXRhID0gdHlwZW9mIGdsb2JhbHMuRm9ybURhdGEgPT09ICdmdW5jdGlvbic7XG5cblx0Y29uc3QgbWVyZ2VIZWFkZXJzID0gKHNvdXJjZTEsIHNvdXJjZTIpID0+IHtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgZ2xvYmFscy5IZWFkZXJzKHNvdXJjZTEgfHwge30pO1xuXHRcdGNvbnN0IGlzSGVhZGVyc0luc3RhbmNlID0gc291cmNlMiBpbnN0YW5jZW9mIGdsb2JhbHMuSGVhZGVycztcblx0XHRjb25zdCBzb3VyY2UgPSBuZXcgZ2xvYmFscy5IZWFkZXJzKHNvdXJjZTIgfHwge30pO1xuXG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc291cmNlKSB7XG5cdFx0XHRpZiAoKGlzSGVhZGVyc0luc3RhbmNlICYmIHZhbHVlID09PSAndW5kZWZpbmVkJykgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXN1bHQuZGVsZXRlKGtleSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHQuc2V0KGtleSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Y29uc3QgZGVlcE1lcmdlID0gKC4uLnNvdXJjZXMpID0+IHtcblx0XHRsZXQgcmV0dXJuVmFsdWUgPSB7fTtcblx0XHRsZXQgaGVhZGVycyA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuXHRcdFx0XHRpZiAoIShBcnJheS5pc0FycmF5KHJldHVyblZhbHVlKSkpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuVmFsdWUgPSBbLi4ucmV0dXJuVmFsdWUsIC4uLnNvdXJjZV07XG5cdFx0XHR9IGVsc2UgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcblx0XHRcdFx0Zm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcblx0XHRcdFx0XHRpZiAoaXNPYmplY3QodmFsdWUpICYmIChrZXkgaW4gcmV0dXJuVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGRlZXBNZXJnZShyZXR1cm5WYWx1ZVtrZXldLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSB7Li4ucmV0dXJuVmFsdWUsIFtrZXldOiB2YWx1ZX07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNPYmplY3Qoc291cmNlLmhlYWRlcnMpKSB7XG5cdFx0XHRcdFx0aGVhZGVycyA9IG1lcmdlSGVhZGVycyhoZWFkZXJzLCBzb3VyY2UuaGVhZGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuVmFsdWUuaGVhZGVycyA9IGhlYWRlcnM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHR9O1xuXG5cdGNvbnN0IHJlcXVlc3RNZXRob2RzID0gW1xuXHRcdCdnZXQnLFxuXHRcdCdwb3N0Jyxcblx0XHQncHV0Jyxcblx0XHQncGF0Y2gnLFxuXHRcdCdoZWFkJyxcblx0XHQnZGVsZXRlJ1xuXHRdO1xuXG5cdGNvbnN0IHJlc3BvbnNlVHlwZXMgPSB7XG5cdFx0anNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxuXHRcdHRleHQ6ICd0ZXh0LyonLFxuXHRcdGZvcm1EYXRhOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG5cdFx0YXJyYXlCdWZmZXI6ICcqLyonLFxuXHRcdGJsb2I6ICcqLyonXG5cdH07XG5cblx0Y29uc3QgcmV0cnlNZXRob2RzID0gW1xuXHRcdCdnZXQnLFxuXHRcdCdwdXQnLFxuXHRcdCdoZWFkJyxcblx0XHQnZGVsZXRlJyxcblx0XHQnb3B0aW9ucycsXG5cdFx0J3RyYWNlJ1xuXHRdO1xuXG5cdGNvbnN0IHJldHJ5U3RhdHVzQ29kZXMgPSBbXG5cdFx0NDA4LFxuXHRcdDQxMyxcblx0XHQ0MjksXG5cdFx0NTAwLFxuXHRcdDUwMixcblx0XHQ1MDMsXG5cdFx0NTA0XG5cdF07XG5cblx0Y29uc3QgcmV0cnlBZnRlclN0YXR1c0NvZGVzID0gW1xuXHRcdDQxMyxcblx0XHQ0MjksXG5cdFx0NTAzXG5cdF07XG5cblx0Y29uc3Qgc3RvcCA9IFN5bWJvbCgnc3RvcCcpO1xuXG5cdGNsYXNzIEhUVFBFcnJvciBleHRlbmRzIEVycm9yIHtcblx0XHRjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuXHRcdFx0Ly8gU2V0IHRoZSBtZXNzYWdlIHRvIHRoZSBzdGF0dXMgdGV4dCwgc3VjaCBhcyBVbmF1dGhvcml6ZWQsXG5cdFx0XHQvLyB3aXRoIHNvbWUgZmFsbGJhY2tzLiBUaGlzIG1lc3NhZ2Ugc2hvdWxkIG5ldmVyIGJlIHVuZGVmaW5lZC5cblx0XHRcdHN1cGVyKFxuXHRcdFx0XHRyZXNwb25zZS5zdGF0dXNUZXh0IHx8XG5cdFx0XHRcdFN0cmluZyhcblx0XHRcdFx0XHQocmVzcG9uc2Uuc3RhdHVzID09PSAwIHx8IHJlc3BvbnNlLnN0YXR1cykgP1xuXHRcdFx0XHRcdFx0cmVzcG9uc2Uuc3RhdHVzIDogJ1Vua25vd24gcmVzcG9uc2UgZXJyb3InXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLm5hbWUgPSAnSFRUUEVycm9yJztcblx0XHRcdHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcblx0XHR9XG5cdH1cblxuXHRjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdFx0Y29uc3RydWN0b3IocmVxdWVzdCkge1xuXHRcdFx0c3VwZXIoJ1JlcXVlc3QgdGltZWQgb3V0Jyk7XG5cdFx0XHR0aGlzLm5hbWUgPSAnVGltZW91dEVycm9yJztcblx0XHRcdHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgZGVsYXkgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcblxuXHQvLyBgUHJvbWlzZS5yYWNlKClgIHdvcmthcm91bmQgKCM5MSlcblx0Y29uc3QgdGltZW91dCA9IChyZXF1ZXN0LCBhYm9ydENvbnRyb2xsZXIsIG9wdGlvbnMpID0+XG5cdFx0bmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgdGltZW91dElEID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmIChhYm9ydENvbnRyb2xsZXIpIHtcblx0XHRcdFx0XHRhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlamVjdChuZXcgVGltZW91dEVycm9yKHJlcXVlc3QpKTtcblx0XHRcdH0sIG9wdGlvbnMudGltZW91dCk7XG5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW4gKi9cblx0XHRcdG9wdGlvbnMuZmV0Y2gocmVxdWVzdClcblx0XHRcdFx0LnRoZW4ocmVzb2x2ZSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdClcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0SUQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdC8qIGVzbGludC1lbmFibGUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlbiAqL1xuXHRcdH0pO1xuXG5cdGNvbnN0IG5vcm1hbGl6ZVJlcXVlc3RNZXRob2QgPSBpbnB1dCA9PiByZXF1ZXN0TWV0aG9kcy5pbmNsdWRlcyhpbnB1dCkgPyBpbnB1dC50b1VwcGVyQ2FzZSgpIDogaW5wdXQ7XG5cblx0Y29uc3QgZGVmYXVsdFJldHJ5T3B0aW9ucyA9IHtcblx0XHRsaW1pdDogMixcblx0XHRtZXRob2RzOiByZXRyeU1ldGhvZHMsXG5cdFx0c3RhdHVzQ29kZXM6IHJldHJ5U3RhdHVzQ29kZXMsXG5cdFx0YWZ0ZXJTdGF0dXNDb2RlczogcmV0cnlBZnRlclN0YXR1c0NvZGVzXG5cdH07XG5cblx0Y29uc3Qgbm9ybWFsaXplUmV0cnlPcHRpb25zID0gKHJldHJ5ID0ge30pID0+IHtcblx0XHRpZiAodHlwZW9mIHJldHJ5ID09PSAnbnVtYmVyJykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Li4uZGVmYXVsdFJldHJ5T3B0aW9ucyxcblx0XHRcdFx0bGltaXQ6IHJldHJ5XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChyZXRyeS5tZXRob2RzICYmICFBcnJheS5pc0FycmF5KHJldHJ5Lm1ldGhvZHMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3JldHJ5Lm1ldGhvZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblxuXHRcdGlmIChyZXRyeS5zdGF0dXNDb2RlcyAmJiAhQXJyYXkuaXNBcnJheShyZXRyeS5zdGF0dXNDb2RlcykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcigncmV0cnkuc3RhdHVzQ29kZXMgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHQuLi5kZWZhdWx0UmV0cnlPcHRpb25zLFxuXHRcdFx0Li4ucmV0cnksXG5cdFx0XHRhZnRlclN0YXR1c0NvZGVzOiByZXRyeUFmdGVyU3RhdHVzQ29kZXNcblx0XHR9O1xuXHR9O1xuXG5cdC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgMzJiaXQgaW50IChzZWUgaXNzdWUgIzExNylcblx0Y29uc3QgbWF4U2FmZVRpbWVvdXQgPSAyMTQ3NDgzNjQ3O1xuXG5cdGNsYXNzIEt5IHtcblx0XHRjb25zdHJ1Y3RvcihpbnB1dCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHR0aGlzLl9yZXRyeUNvdW50ID0gMDtcblx0XHRcdHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0ge1xuXHRcdFx0XHQvLyBUT0RPOiBjcmVkZW50aWFscyBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZSBzcGVjIGNoYW5nZSBpcyBpbXBsZW1lbnRlZCBpbiBhbGwgYnJvd3NlcnMuIENvbnRleHQ6IGh0dHBzOi8vd3d3LmNocm9tZXN0YXR1cy5jb20vZmVhdHVyZS80NTM5NDczMzEyMzUwMjA4XG5cdFx0XHRcdGNyZWRlbnRpYWxzOiB0aGlzLl9pbnB1dC5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nLFxuXHRcdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0XHRoZWFkZXJzOiBtZXJnZUhlYWRlcnModGhpcy5faW5wdXQuaGVhZGVycywgb3B0aW9ucy5oZWFkZXJzKSxcblx0XHRcdFx0aG9va3M6IGRlZXBNZXJnZSh7XG5cdFx0XHRcdFx0YmVmb3JlUmVxdWVzdDogW10sXG5cdFx0XHRcdFx0YmVmb3JlUmV0cnk6IFtdLFxuXHRcdFx0XHRcdGFmdGVyUmVzcG9uc2U6IFtdXG5cdFx0XHRcdH0sIG9wdGlvbnMuaG9va3MpLFxuXHRcdFx0XHRtZXRob2Q6IG5vcm1hbGl6ZVJlcXVlc3RNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5faW5wdXQubWV0aG9kKSxcblx0XHRcdFx0cHJlZml4VXJsOiBTdHJpbmcob3B0aW9ucy5wcmVmaXhVcmwgfHwgJycpLFxuXHRcdFx0XHRyZXRyeTogbm9ybWFsaXplUmV0cnlPcHRpb25zKG9wdGlvbnMucmV0cnkpLFxuXHRcdFx0XHR0aHJvd0h0dHBFcnJvcnM6IG9wdGlvbnMudGhyb3dIdHRwRXJyb3JzICE9PSBmYWxzZSxcblx0XHRcdFx0dGltZW91dDogdHlwZW9mIG9wdGlvbnMudGltZW91dCA9PT0gJ3VuZGVmaW5lZCcgPyAxMDAwMCA6IG9wdGlvbnMudGltZW91dCxcblx0XHRcdFx0ZmV0Y2g6IG9wdGlvbnMuZmV0Y2ggfHwgZ2xvYmFscy5mZXRjaFxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLl9pbnB1dCAhPT0gJ3N0cmluZycgJiYgISh0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIFVSTCB8fCB0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIGdsb2JhbHMuUmVxdWVzdCkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignYGlucHV0YCBtdXN0IGJlIGEgc3RyaW5nLCBVUkwsIG9yIFJlcXVlc3QnKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMucHJlZml4VXJsICYmIHR5cGVvZiB0aGlzLl9pbnB1dCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2lucHV0LnN0YXJ0c1dpdGgoJy8nKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignYGlucHV0YCBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgc2xhc2ggd2hlbiB1c2luZyBgcHJlZml4VXJsYCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0aGlzLl9vcHRpb25zLnByZWZpeFVybC5lbmRzV2l0aCgnLycpKSB7XG5cdFx0XHRcdFx0dGhpcy5fb3B0aW9ucy5wcmVmaXhVcmwgKz0gJy8nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5faW5wdXQgPSB0aGlzLl9vcHRpb25zLnByZWZpeFVybCArIHRoaXMuX2lucHV0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3VwcG9ydHNBYm9ydENvbnRyb2xsZXIpIHtcblx0XHRcdFx0dGhpcy5hYm9ydENvbnRyb2xsZXIgPSBuZXcgZ2xvYmFscy5BYm9ydENvbnRyb2xsZXIoKTtcblx0XHRcdFx0aWYgKHRoaXMuX29wdGlvbnMuc2lnbmFsKSB7XG5cdFx0XHRcdFx0dGhpcy5fb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5zaWduYWwgPSB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWw7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVxdWVzdCA9IG5ldyBnbG9iYWxzLlJlcXVlc3QodGhpcy5faW5wdXQsIHRoaXMuX29wdGlvbnMpO1xuXG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5zZWFyY2hQYXJhbXMpIHtcblx0XHRcdFx0Y29uc3Qgc2VhcmNoUGFyYW1zID0gJz8nICsgbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLl9vcHRpb25zLnNlYXJjaFBhcmFtcykudG9TdHJpbmcoKTtcblx0XHRcdFx0Y29uc3QgdXJsID0gdGhpcy5yZXF1ZXN0LnVybC5yZXBsYWNlKC8oPzpcXD8uKj8pPyg/PSN8JCkvLCBzZWFyY2hQYXJhbXMpO1xuXG5cdFx0XHRcdC8vIFRvIHByb3ZpZGUgY29ycmVjdCBmb3JtIGJvdW5kYXJ5LCBDb250ZW50LVR5cGUgaGVhZGVyIHNob3VsZCBiZSBkZWxldGVkIGVhY2ggdGltZSB3aGVuIG5ldyBSZXF1ZXN0IGluc3RhbnRpYXRlZCBmcm9tIGFub3RoZXIgb25lXG5cdFx0XHRcdGlmICgoKHN1cHBvcnRzRm9ybURhdGEgJiYgdGhpcy5fb3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgZ2xvYmFscy5Gb3JtRGF0YSkgfHwgdGhpcy5fb3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSAmJiAhKHRoaXMuX29wdGlvbnMuaGVhZGVycyAmJiB0aGlzLl9vcHRpb25zLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSkge1xuXHRcdFx0XHRcdHRoaXMucmVxdWVzdC5oZWFkZXJzLmRlbGV0ZSgnY29udGVudC10eXBlJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnJlcXVlc3QgPSBuZXcgZ2xvYmFscy5SZXF1ZXN0KG5ldyBnbG9iYWxzLlJlcXVlc3QodXJsLCB0aGlzLnJlcXVlc3QpLCB0aGlzLl9vcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMuanNvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX29wdGlvbnMuanNvbik7XG5cdFx0XHRcdHRoaXMucmVxdWVzdC5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0ID0gbmV3IGdsb2JhbHMuUmVxdWVzdCh0aGlzLnJlcXVlc3QsIHtib2R5OiB0aGlzLl9vcHRpb25zLmJvZHl9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZm4gPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRpbWVvdXQgPiBtYXhTYWZlVGltZW91dCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgXFxgdGltZW91dFxcYCBvcHRpb24gY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAke21heFNhZmVUaW1lb3V0fWApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgZGVsYXkoMSk7XG5cdFx0XHRcdGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2ZldGNoKCk7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBob29rIG9mIHRoaXMuX29wdGlvbnMuaG9va3MuYWZ0ZXJSZXNwb25zZSkge1xuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG5cdFx0XHRcdFx0Y29uc3QgbW9kaWZpZWRSZXNwb25zZSA9IGF3YWl0IGhvb2soXG5cdFx0XHRcdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRcdFx0XHR0aGlzLl9vcHRpb25zLFxuXHRcdFx0XHRcdFx0dGhpcy5fZGVjb3JhdGVSZXNwb25zZShyZXNwb25zZS5jbG9uZSgpKVxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAobW9kaWZpZWRSZXNwb25zZSBpbnN0YW5jZW9mIGdsb2JhbHMuUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gbW9kaWZpZWRSZXNwb25zZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9kZWNvcmF0ZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuXHRcdFx0XHRpZiAoIXJlc3BvbnNlLm9rICYmIHRoaXMuX29wdGlvbnMudGhyb3dIdHRwRXJyb3JzKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEhUVFBFcnJvcihyZXNwb25zZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiBgb25Eb3dubG9hZFByb2dyZXNzYCBpcyBwYXNzZWQsIGl0IHVzZXMgdGhlIHN0cmVhbSBBUEkgaW50ZXJuYWxseVxuXHRcdFx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5vbkRvd25sb2FkUHJvZ3Jlc3MpIHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHRoaXMuX29wdGlvbnMub25Eb3dubG9hZFByb2dyZXNzICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYG9uRG93bmxvYWRQcm9ncmVzc2Agb3B0aW9uIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghc3VwcG9ydHNTdHJlYW1zKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1N0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4geW91ciBlbnZpcm9ubWVudC4gYFJlYWRhYmxlU3RyZWFtYCBpcyBtaXNzaW5nLicpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9zdHJlYW0ocmVzcG9uc2UuY2xvbmUoKSwgdGhpcy5fb3B0aW9ucy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgaXNSZXRyaWFibGVNZXRob2QgPSB0aGlzLl9vcHRpb25zLnJldHJ5Lm1ldGhvZHMuaW5jbHVkZXModGhpcy5yZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpKTtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGlzUmV0cmlhYmxlTWV0aG9kID8gdGhpcy5fcmV0cnkoZm4pIDogZm4oKTtcblxuXHRcdFx0Zm9yIChjb25zdCBbdHlwZSwgbWltZVR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlVHlwZXMpKSB7XG5cdFx0XHRcdHJlc3VsdFt0eXBlXSA9IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3QuaGVhZGVycy5zZXQoJ2FjY2VwdCcsIHRoaXMucmVxdWVzdC5oZWFkZXJzLmdldCgnYWNjZXB0JykgfHwgbWltZVR5cGUpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgcmVzdWx0KS5jbG9uZSgpO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGUgPT09ICdqc29uJykge1xuXHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAnJztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMucGFyc2VKc29uKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvcHRpb25zLnBhcnNlSnNvbihhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXNwb25zZVt0eXBlXSgpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdF9jYWxjdWxhdGVSZXRyeURlbGF5KGVycm9yKSB7XG5cdFx0XHR0aGlzLl9yZXRyeUNvdW50Kys7XG5cblx0XHRcdGlmICh0aGlzLl9yZXRyeUNvdW50IDwgdGhpcy5fb3B0aW9ucy5yZXRyeS5saW1pdCAmJiAhKGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSkge1xuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBIVFRQRXJyb3IpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX29wdGlvbnMucmV0cnkuc3RhdHVzQ29kZXMuaW5jbHVkZXMoZXJyb3IucmVzcG9uc2Uuc3RhdHVzKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgcmV0cnlBZnRlciA9IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpO1xuXHRcdFx0XHRcdGlmIChyZXRyeUFmdGVyICYmIHRoaXMuX29wdGlvbnMucmV0cnkuYWZ0ZXJTdGF0dXNDb2Rlcy5pbmNsdWRlcyhlcnJvci5yZXNwb25zZS5zdGF0dXMpKSB7XG5cdFx0XHRcdFx0XHRsZXQgYWZ0ZXIgPSBOdW1iZXIocmV0cnlBZnRlcik7XG5cdFx0XHRcdFx0XHRpZiAoTnVtYmVyLmlzTmFOKGFmdGVyKSkge1xuXHRcdFx0XHRcdFx0XHRhZnRlciA9IERhdGUucGFyc2UocmV0cnlBZnRlcikgLSBEYXRlLm5vdygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YWZ0ZXIgKj0gMTAwMDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiB0aGlzLl9vcHRpb25zLnJldHJ5Lm1heFJldHJ5QWZ0ZXIgIT09ICd1bmRlZmluZWQnICYmIGFmdGVyID4gdGhpcy5fb3B0aW9ucy5yZXRyeS5tYXhSZXRyeUFmdGVyKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gYWZ0ZXI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDEzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBCQUNLT0ZGX0ZBQ1RPUiA9IDAuMztcblx0XHRcdFx0cmV0dXJuIEJBQ0tPRkZfRkFDVE9SICogKDIgKiogKHRoaXMuX3JldHJ5Q291bnQgLSAxKSkgKiAxMDAwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRfZGVjb3JhdGVSZXNwb25zZShyZXNwb25zZSkge1xuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMucGFyc2VKc29uKSB7XG5cdFx0XHRcdHJlc3BvbnNlLmpzb24gPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX29wdGlvbnMucGFyc2VKc29uKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXNwb25zZTtcblx0XHR9XG5cblx0XHRhc3luYyBfcmV0cnkoZm4pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJldHVybiBhd2FpdCBmbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgbXMgPSBNYXRoLm1pbih0aGlzLl9jYWxjdWxhdGVSZXRyeURlbGF5KGVycm9yKSwgbWF4U2FmZVRpbWVvdXQpO1xuXHRcdFx0XHRpZiAobXMgIT09IDAgJiYgdGhpcy5fcmV0cnlDb3VudCA+IDApIHtcblx0XHRcdFx0XHRhd2FpdCBkZWxheShtcyk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5fb3B0aW9ucy5ob29rcy5iZWZvcmVSZXRyeSkge1xuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3Bcblx0XHRcdFx0XHRcdGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rKHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiB0aGlzLl9vcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRlcnJvcixcblx0XHRcdFx0XHRcdFx0cmV0cnlDb3VudDogdGhpcy5fcmV0cnlDb3VudFxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdC8vIElmIGBzdG9wYCBpcyByZXR1cm5lZCBmcm9tIHRoZSBob29rLCB0aGUgcmV0cnkgcHJvY2VzcyBpcyBzdG9wcGVkXG5cdFx0XHRcdFx0XHRpZiAoaG9va1Jlc3VsdCA9PT0gc3RvcCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3JldHJ5KGZuKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRocm93SHR0cEVycm9ycykge1xuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YXN5bmMgX2ZldGNoKCkge1xuXHRcdFx0Zm9yIChjb25zdCBob29rIG9mIHRoaXMuX29wdGlvbnMuaG9va3MuYmVmb3JlUmVxdWVzdCkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBob29rKHRoaXMucmVxdWVzdCwgdGhpcy5fb3B0aW9ucyk7XG5cblx0XHRcdFx0aWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3QgPSByZXN1bHQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRpbWVvdXQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9vcHRpb25zLmZldGNoKHRoaXMucmVxdWVzdC5jbG9uZSgpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRpbWVvdXQodGhpcy5yZXF1ZXN0LmNsb25lKCksIHRoaXMuYWJvcnRDb250cm9sbGVyLCB0aGlzLl9vcHRpb25zKTtcblx0XHR9XG5cblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdF9zdHJlYW0ocmVzcG9uc2UsIG9uRG93bmxvYWRQcm9ncmVzcykge1xuXHRcdFx0Y29uc3QgdG90YWxCeXRlcyA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSkgfHwgMDtcblx0XHRcdGxldCB0cmFuc2ZlcnJlZEJ5dGVzID0gMDtcblxuXHRcdFx0cmV0dXJuIG5ldyBnbG9iYWxzLlJlc3BvbnNlKFxuXHRcdFx0XHRuZXcgZ2xvYmFscy5SZWFkYWJsZVN0cmVhbSh7XG5cdFx0XHRcdFx0c3RhcnQoY29udHJvbGxlcikge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcblxuXHRcdFx0XHRcdFx0aWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuXHRcdFx0XHRcdFx0XHRvbkRvd25sb2FkUHJvZ3Jlc3Moe3BlcmNlbnQ6IDAsIHRyYW5zZmVycmVkQnl0ZXM6IDAsIHRvdGFsQnl0ZXN9LCBuZXcgVWludDhBcnJheSgpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YXN5bmMgZnVuY3Rpb24gcmVhZCgpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG5cdFx0XHRcdFx0XHRcdGlmIChkb25lKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvbkRvd25sb2FkUHJvZ3Jlc3MpIHtcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2ZlcnJlZEJ5dGVzICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcGVyY2VudCA9IHRvdGFsQnl0ZXMgPT09IDAgPyAwIDogdHJhbnNmZXJyZWRCeXRlcyAvIHRvdGFsQnl0ZXM7XG5cdFx0XHRcdFx0XHRcdFx0b25Eb3dubG9hZFByb2dyZXNzKHtwZXJjZW50LCB0cmFuc2ZlcnJlZEJ5dGVzLCB0b3RhbEJ5dGVzfSwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5lbnF1ZXVlKHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0cmVhZCgpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZWFkKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCB2YWxpZGF0ZUFuZE1lcmdlID0gKC4uLnNvdXJjZXMpID0+IHtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG5cdFx0XHRpZiAoKCFpc09iamVjdChzb3VyY2UpIHx8IEFycmF5LmlzQXJyYXkoc291cmNlKSkgJiYgdHlwZW9mIHNvdXJjZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGBvcHRpb25zYCBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBkZWVwTWVyZ2Uoe30sIC4uLnNvdXJjZXMpO1xuXHR9O1xuXG5cdGNvbnN0IGNyZWF0ZUluc3RhbmNlID0gZGVmYXVsdHMgPT4ge1xuXHRcdGNvbnN0IGt5ID0gKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgS3koaW5wdXQsIHZhbGlkYXRlQW5kTWVyZ2UoZGVmYXVsdHMsIG9wdGlvbnMpKTtcblxuXHRcdGZvciAoY29uc3QgbWV0aG9kIG9mIHJlcXVlc3RNZXRob2RzKSB7XG5cdFx0XHRreVttZXRob2RdID0gKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgS3koaW5wdXQsIHZhbGlkYXRlQW5kTWVyZ2UoZGVmYXVsdHMsIG9wdGlvbnMsIHttZXRob2R9KSk7XG5cdFx0fVxuXG5cdFx0a3kuSFRUUEVycm9yID0gSFRUUEVycm9yO1xuXHRcdGt5LlRpbWVvdXRFcnJvciA9IFRpbWVvdXRFcnJvcjtcblx0XHRreS5jcmVhdGUgPSBuZXdEZWZhdWx0cyA9PiBjcmVhdGVJbnN0YW5jZSh2YWxpZGF0ZUFuZE1lcmdlKG5ld0RlZmF1bHRzKSk7XG5cdFx0a3kuZXh0ZW5kID0gbmV3RGVmYXVsdHMgPT4gY3JlYXRlSW5zdGFuY2UodmFsaWRhdGVBbmRNZXJnZShkZWZhdWx0cywgbmV3RGVmYXVsdHMpKTtcblx0XHRreS5zdG9wID0gc3RvcDtcblxuXHRcdHJldHVybiBreTtcblx0fTtcblxuXHR2YXIgaW5kZXggPSBjcmVhdGVJbnN0YW5jZSgpO1xuXG5cdHJldHVybiBpbmRleDtcblxufSkpKTtcbiIsImZ1bmN0aW9uIG5vcm1hbGl6ZSAoc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgICAgICAgICAucmVwbGFjZSgvW1xcL10rL2csICcvJylcbiAgICAgICAgICAucmVwbGFjZSgvXFwvXFw/L2csICc/JylcbiAgICAgICAgICAucmVwbGFjZSgvXFwvXFwjL2csICcjJylcbiAgICAgICAgICAucmVwbGFjZSgvXFw6XFwvL2csICc6Ly8nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBqb2luZWQgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCkuam9pbignLycpO1xuICByZXR1cm4gbm9ybWFsaXplKGpvaW5lZCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImh0dHBzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInN0cmVhbVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ6bGliXCIpOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZmV0Y2g7XG5cbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCBkYXRhVXJpVG9CdWZmZXIgPSByZXF1aXJlKCdkYXRhLXVyaS10by1idWZmZXInKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBCbG9iID0gcmVxdWlyZSgnZmV0Y2gtYmxvYicpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCB1cmwgPSByZXF1aXJlKCd1cmwnKTtcblxuY2xhc3MgRmV0Y2hCYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHR5cGUpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHQvLyBIaWRlIGN1c3RvbSBlcnJvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZyb20gZW5kLXVzZXJzXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG5cblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHR9XG5cblx0Z2V0IG5hbWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcblx0fVxuXG5cdGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXHR9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge3sgYWRkcmVzcz86IHN0cmluZywgY29kZTogc3RyaW5nLCBkZXN0Pzogc3RyaW5nLCBlcnJubzogbnVtYmVyLCBpbmZvPzogb2JqZWN0LCBtZXNzYWdlOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIHN5c2NhbGw6IHN0cmluZ319IFN5c3RlbUVycm9yXG4qL1xuXG4vKipcbiAqIEZldGNoRXJyb3IgaW50ZXJmYWNlIGZvciBvcGVyYXRpb25hbCBlcnJvcnNcbiAqL1xuY2xhc3MgRmV0Y2hFcnJvciBleHRlbmRzIEZldGNoQmFzZUVycm9yIHtcblx0LyoqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gbWVzc2FnZSAtICAgICAgRXJyb3IgbWVzc2FnZSBmb3IgaHVtYW5cblx0ICogQHBhcmFtICB7c3RyaW5nfSBbdHlwZV0gLSAgICAgICAgRXJyb3IgdHlwZSBmb3IgbWFjaGluZVxuXHQgKiBAcGFyYW0gIHtTeXN0ZW1FcnJvcn0gW3N5c3RlbUVycm9yXSAtIEZvciBOb2RlLmpzIHN5c3RlbSBlcnJvclxuXHQgKi9cblx0Y29uc3RydWN0b3IobWVzc2FnZSwgdHlwZSwgc3lzdGVtRXJyb3IpIHtcblx0XHRzdXBlcihtZXNzYWdlLCB0eXBlKTtcblx0XHQvLyBXaGVuIGVyci50eXBlIGlzIGBzeXN0ZW1gLCBlcnIuZXJyb3JlZFN5c0NhbGwgY29udGFpbnMgc3lzdGVtIGVycm9yIGFuZCBlcnIuY29kZSBjb250YWlucyBzeXN0ZW0gZXJyb3IgY29kZVxuXHRcdGlmIChzeXN0ZW1FcnJvcikge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW11bHRpLWFzc2lnblxuXHRcdFx0dGhpcy5jb2RlID0gdGhpcy5lcnJubyA9IHN5c3RlbUVycm9yLmNvZGU7XG5cdFx0XHR0aGlzLmVycm9yZWRTeXNDYWxsID0gc3lzdGVtRXJyb3Iuc3lzY2FsbDtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBJcy5qc1xuICpcbiAqIE9iamVjdCB0eXBlIGNoZWNrcy5cbiAqL1xuXG5jb25zdCBOQU1FID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICogcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL2lzc3Vlcy8yOTYjaXNzdWVjb21tZW50LTMwNzU5ODE0M1xuICpcbiAqIEBwYXJhbSAgeyp9IG9ialxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNVUkxTZWFyY2hQYXJhbWV0ZXJzID0gb2JqZWN0ID0+IHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5oYXMgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3Quc29ydCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdG9iamVjdFtOQU1FXSA9PT0gJ1VSTFNlYXJjaFBhcmFtcydcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamVjdGAgaXMgYSBXM0MgYEJsb2JgIG9iamVjdCAod2hpY2ggYEZpbGVgIGluaGVyaXRzIGZyb20pXG4gKlxuICogQHBhcmFtICB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5jb25zdCBpc0Jsb2IgPSBvYmplY3QgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QudHlwZSA9PT0gJ3N0cmluZycgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcblx0XHQvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbTkFNRV0pXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgc3BlYy1jb21wbGlhbnQgYEZvcm1EYXRhYCBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YShvYmplY3QpIHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5zZXQgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcblx0XHRvYmplY3RbTkFNRV0gPT09ICdGb3JtRGF0YSdcblx0KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBpbnN0YW5jZSBvZiBBYm9ydFNpZ25hbC5cbiAqXG4gKiBAcGFyYW0gIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQWJvcnRTaWduYWwgPSBvYmplY3QgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0b2JqZWN0W05BTUVdID09PSAnQWJvcnRTaWduYWwnXG5cdCk7XG59O1xuXG5jb25zdCBjYXJyaWFnZSA9ICdcXHJcXG4nO1xuY29uc3QgZGFzaGVzID0gJy0nLnJlcGVhdCgyKTtcbmNvbnN0IGNhcnJpYWdlTGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoY2FycmlhZ2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZGFyeVxuICovXG5jb25zdCBnZXRGb290ZXIgPSBib3VuZGFyeSA9PiBgJHtkYXNoZXN9JHtib3VuZGFyeX0ke2Rhc2hlc30ke2NhcnJpYWdlLnJlcGVhdCgyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZGFyeVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldEhlYWRlcihib3VuZGFyeSwgbmFtZSwgZmllbGQpIHtcblx0bGV0IGhlYWRlciA9ICcnO1xuXG5cdGhlYWRlciArPSBgJHtkYXNoZXN9JHtib3VuZGFyeX0ke2NhcnJpYWdlfWA7XG5cdGhlYWRlciArPSBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiJHtuYW1lfVwiYDtcblxuXHRpZiAoaXNCbG9iKGZpZWxkKSkge1xuXHRcdGhlYWRlciArPSBgOyBmaWxlbmFtZT1cIiR7ZmllbGQubmFtZX1cIiR7Y2FycmlhZ2V9YDtcblx0XHRoZWFkZXIgKz0gYENvbnRlbnQtVHlwZTogJHtmaWVsZC50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfWA7XG5cdH1cblxuXHRyZXR1cm4gYCR7aGVhZGVyfSR7Y2FycmlhZ2UucmVwZWF0KDIpfWA7XG59XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRCb3VuZGFyeSA9ICgpID0+IGNyeXB0by5yYW5kb21CeXRlcyg4KS50b1N0cmluZygnaGV4Jyk7XG5cbi8qKlxuICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IGJvdW5kYXJ5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uICogZm9ybURhdGFJdGVyYXRvcihmb3JtLCBib3VuZGFyeSkge1xuXHRmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZm9ybSkge1xuXHRcdHlpZWxkIGdldEhlYWRlcihib3VuZGFyeSwgbmFtZSwgdmFsdWUpO1xuXG5cdFx0aWYgKGlzQmxvYih2YWx1ZSkpIHtcblx0XHRcdHlpZWxkICogdmFsdWUuc3RyZWFtKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHlpZWxkIHZhbHVlO1xuXHRcdH1cblxuXHRcdHlpZWxkIGNhcnJpYWdlO1xuXHR9XG5cblx0eWllbGQgZ2V0Rm9vdGVyKGJvdW5kYXJ5KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9ybURhdGFMZW5ndGgoZm9ybSwgYm91bmRhcnkpIHtcblx0bGV0IGxlbmd0aCA9IDA7XG5cblx0Zm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGZvcm0pIHtcblx0XHRsZW5ndGggKz0gQnVmZmVyLmJ5dGVMZW5ndGgoZ2V0SGVhZGVyKGJvdW5kYXJ5LCBuYW1lLCB2YWx1ZSkpO1xuXG5cdFx0aWYgKGlzQmxvYih2YWx1ZSkpIHtcblx0XHRcdGxlbmd0aCArPSB2YWx1ZS5zaXplO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZW5ndGggKz0gQnVmZmVyLmJ5dGVMZW5ndGgoU3RyaW5nKHZhbHVlKSk7XG5cdFx0fVxuXG5cdFx0bGVuZ3RoICs9IGNhcnJpYWdlTGVuZ3RoO1xuXHR9XG5cblx0bGVuZ3RoICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKGdldEZvb3Rlcihib3VuZGFyeSkpO1xuXG5cdHJldHVybiBsZW5ndGg7XG59XG5cbmNvbnN0IElOVEVSTkFMUyA9IFN5bWJvbCgnQm9keSBpbnRlcm5hbHMnKTtcblxuLyoqXG4gKiBCb2R5IG1peGluXG4gKlxuICogUmVmOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keVxuICpcbiAqIEBwYXJhbSAgIFN0cmVhbSAgYm9keSAgUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0gICBPYmplY3QgIG9wdHMgIFJlc3BvbnNlIG9wdGlvbnNcbiAqIEByZXR1cm4gIFZvaWRcbiAqL1xuY2xhc3MgQm9keSB7XG5cdGNvbnN0cnVjdG9yKGJvZHksIHtcblx0XHRzaXplID0gMFxuXHR9ID0ge30pIHtcblx0XHRsZXQgYm91bmRhcnkgPSBudWxsO1xuXG5cdFx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHRcdC8vIEJvZHkgaXMgdW5kZWZpbmVkIG9yIG51bGxcblx0XHRcdGJvZHkgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAoaXNVUkxTZWFyY2hQYXJhbWV0ZXJzKGJvZHkpKSB7XG5cdFx0Ly8gQm9keSBpcyBhIFVSTFNlYXJjaFBhcmFtc1xuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkudG9TdHJpbmcoKSk7XG5cdFx0fSBlbHNlIGlmIChpc0Jsb2IoYm9keSkpIDsgZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSA7IGVsc2UgaWYgKHV0aWwudHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihib2R5KSkge1xuXHRcdFx0Ly8gQm9keSBpcyBBcnJheUJ1ZmZlclxuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkpO1xuXHRcdH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGJvZHkpKSB7XG5cdFx0XHQvLyBCb2R5IGlzIEFycmF5QnVmZmVyVmlld1xuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyLCBib2R5LmJ5dGVPZmZzZXQsIGJvZHkuYnl0ZUxlbmd0aCk7XG5cdFx0fSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSA7IGVsc2UgaWYgKGlzRm9ybURhdGEoYm9keSkpIHtcblx0XHRcdC8vIEJvZHkgaXMgYW4gaW5zdGFuY2Ugb2YgZm9ybWRhdGEtbm9kZVxuXHRcdFx0Ym91bmRhcnkgPSBgTm9kZUZldGNoRm9ybURhdGFCb3VuZGFyeSR7Z2V0Qm91bmRhcnkoKX1gO1xuXHRcdFx0Ym9keSA9IFN0cmVhbS5SZWFkYWJsZS5mcm9tKGZvcm1EYXRhSXRlcmF0b3IoYm9keSwgYm91bmRhcnkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm9uZSBvZiB0aGUgYWJvdmVcblx0XHRcdC8vIGNvZXJjZSB0byBzdHJpbmcgdGhlbiBidWZmZXJcblx0XHRcdGJvZHkgPSBCdWZmZXIuZnJvbShTdHJpbmcoYm9keSkpO1xuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTXSA9IHtcblx0XHRcdGJvZHksXG5cdFx0XHRib3VuZGFyeSxcblx0XHRcdGRpc3R1cmJlZDogZmFsc2UsXG5cdFx0XHRlcnJvcjogbnVsbFxuXHRcdH07XG5cdFx0dGhpcy5zaXplID0gc2l6ZTtcblxuXHRcdGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSB7XG5cdFx0XHRib2R5Lm9uKCdlcnJvcicsIGVyciA9PiB7XG5cdFx0XHRcdGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRmV0Y2hCYXNlRXJyb3IgP1xuXHRcdFx0XHRcdGVyciA6XG5cdFx0XHRcdFx0bmV3IEZldGNoRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgYm9keSB3aGlsZSB0cnlpbmcgdG8gZmV0Y2ggJHt0aGlzLnVybH06ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycik7XG5cdFx0XHRcdHRoaXNbSU5URVJOQUxTXS5lcnJvciA9IGVycm9yO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGJvZHkoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTXS5ib2R5O1xuXHR9XG5cblx0Z2V0IGJvZHlVc2VkKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMU10uZGlzdHVyYmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY29kZSByZXNwb25zZSBhcyBBcnJheUJ1ZmZlclxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyBhcnJheUJ1ZmZlcigpIHtcblx0XHRjb25zdCB7YnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RofSA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBidWZmZXIuc2xpY2UoYnl0ZU9mZnNldCwgYnl0ZU9mZnNldCArIGJ5dGVMZW5ndGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiByYXcgcmVzcG9uc2UgYXMgQmxvYlxuXHQgKlxuXHQgKiBAcmV0dXJuIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIGJsb2IoKSB7XG5cdFx0Y29uc3QgY3QgPSAodGhpcy5oZWFkZXJzICYmIHRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB8fCAodGhpc1tJTlRFUk5BTFNdLmJvZHkgJiYgdGhpc1tJTlRFUk5BTFNdLmJvZHkudHlwZSkgfHwgJyc7XG5cdFx0Y29uc3QgYnVmID0gYXdhaXQgdGhpcy5idWZmZXIoKTtcblxuXHRcdHJldHVybiBuZXcgQmxvYihbYnVmXSwge1xuXHRcdFx0dHlwZTogY3Rcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMganNvblxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyBqc29uKCkge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBKU09OLnBhcnNlKGJ1ZmZlci50b1N0cmluZygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMgdGV4dFxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyB0ZXh0KCkge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBidWZmZXIudG9TdHJpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMgYnVmZmVyIChub24tc3BlYyBhcGkpXG5cdCAqXG5cdCAqIEByZXR1cm4gIFByb21pc2Vcblx0ICovXG5cdGJ1ZmZlcigpIHtcblx0XHRyZXR1cm4gY29uc3VtZUJvZHkodGhpcyk7XG5cdH1cbn1cblxuLy8gSW4gYnJvd3NlcnMsIGFsbCBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQm9keS5wcm90b3R5cGUsIHtcblx0Ym9keToge2VudW1lcmFibGU6IHRydWV9LFxuXHRib2R5VXNlZDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRhcnJheUJ1ZmZlcjoge2VudW1lcmFibGU6IHRydWV9LFxuXHRibG9iOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGpzb246IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0dGV4dDoge2VudW1lcmFibGU6IHRydWV9XG59KTtcblxuLyoqXG4gKiBDb25zdW1lIGFuZCBjb252ZXJ0IGFuIGVudGlyZSBCb2R5IHRvIGEgQnVmZmVyLlxuICpcbiAqIFJlZjogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keS1jb25zdW1lLWJvZHlcbiAqXG4gKiBAcmV0dXJuIFByb21pc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uc3VtZUJvZHkoZGF0YSkge1xuXHRpZiAoZGF0YVtJTlRFUk5BTFNdLmRpc3R1cmJlZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYGJvZHkgdXNlZCBhbHJlYWR5IGZvcjogJHtkYXRhLnVybH1gKTtcblx0fVxuXG5cdGRhdGFbSU5URVJOQUxTXS5kaXN0dXJiZWQgPSB0cnVlO1xuXG5cdGlmIChkYXRhW0lOVEVSTkFMU10uZXJyb3IpIHtcblx0XHR0aHJvdyBkYXRhW0lOVEVSTkFMU10uZXJyb3I7XG5cdH1cblxuXHRsZXQge2JvZHl9ID0gZGF0YTtcblxuXHQvLyBCb2R5IGlzIG51bGxcblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBibG9iXG5cdGlmIChpc0Jsb2IoYm9keSkpIHtcblx0XHRib2R5ID0gYm9keS5zdHJlYW0oKTtcblx0fVxuXG5cdC8vIEJvZHkgaXMgYnVmZmVyXG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHRyZXR1cm4gYm9keTtcblx0fVxuXG5cdC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cblx0aWYgKCEoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBzdHJlYW1cblx0Ly8gZ2V0IHJlYWR5IHRvIGFjdHVhbGx5IGNvbnN1bWUgdGhlIGJvZHlcblx0Y29uc3QgYWNjdW0gPSBbXTtcblx0bGV0IGFjY3VtQnl0ZXMgPSAwO1xuXG5cdHRyeSB7XG5cdFx0Zm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBib2R5KSB7XG5cdFx0XHRpZiAoZGF0YS5zaXplID4gMCAmJiBhY2N1bUJ5dGVzICsgY2h1bmsubGVuZ3RoID4gZGF0YS5zaXplKSB7XG5cdFx0XHRcdGNvbnN0IGVyciA9IG5ldyBGZXRjaEVycm9yKGBjb250ZW50IHNpemUgYXQgJHtkYXRhLnVybH0gb3ZlciBsaW1pdDogJHtkYXRhLnNpemV9YCwgJ21heC1zaXplJyk7XG5cdFx0XHRcdGJvZHkuZGVzdHJveShlcnIpO1xuXHRcdFx0XHR0aHJvdyBlcnI7XG5cdFx0XHR9XG5cblx0XHRcdGFjY3VtQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuXHRcdFx0YWNjdW0ucHVzaChjaHVuayk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIEZldGNoQmFzZUVycm9yKSB7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXIgZXJyb3JzLCBzdWNoIGFzIGluY29ycmVjdCBjb250ZW50LWVuY29kaW5nXG5cdFx0XHR0aHJvdyBuZXcgRmV0Y2hFcnJvcihgSW52YWxpZCByZXNwb25zZSBib2R5IHdoaWxlIHRyeWluZyB0byBmZXRjaCAke2RhdGEudXJsfTogJHtlcnJvci5tZXNzYWdlfWAsICdzeXN0ZW0nLCBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGJvZHkucmVhZGFibGVFbmRlZCA9PT0gdHJ1ZSB8fCBib2R5Ll9yZWFkYWJsZVN0YXRlLmVuZGVkID09PSB0cnVlKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhY2N1bS5ldmVyeShjID0+IHR5cGVvZiBjID09PSAnc3RyaW5nJykpIHtcblx0XHRcdFx0cmV0dXJuIEJ1ZmZlci5mcm9tKGFjY3VtLmpvaW4oJycpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIEJ1ZmZlci5jb25jYXQoYWNjdW0sIGFjY3VtQnl0ZXMpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRmV0Y2hFcnJvcihgQ291bGQgbm90IGNyZWF0ZSBCdWZmZXIgZnJvbSByZXNwb25zZSBib2R5IGZvciAke2RhdGEudXJsfTogJHtlcnJvci5tZXNzYWdlfWAsICdzeXN0ZW0nLCBlcnJvcik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBGZXRjaEVycm9yKGBQcmVtYXR1cmUgY2xvc2Ugb2Ygc2VydmVyIHJlc3BvbnNlIHdoaWxlIHRyeWluZyB0byBmZXRjaCAke2RhdGEudXJsfWApO1xuXHR9XG59XG5cbi8qKlxuICogQ2xvbmUgYm9keSBnaXZlbiBSZXMvUmVxIGluc3RhbmNlXG4gKlxuICogQHBhcmFtICAgTWl4ZWQgICBpbnN0YW5jZSAgICAgICBSZXNwb25zZSBvciBSZXF1ZXN0IGluc3RhbmNlXG4gKiBAcGFyYW0gICBTdHJpbmcgIGhpZ2hXYXRlck1hcmsgIGhpZ2hXYXRlck1hcmsgZm9yIGJvdGggUGFzc1Rocm91Z2ggYm9keSBzdHJlYW1zXG4gKiBAcmV0dXJuICBNaXhlZFxuICovXG5jb25zdCBjbG9uZSA9IChpbnN0YW5jZSwgaGlnaFdhdGVyTWFyaykgPT4ge1xuXHRsZXQgcDE7XG5cdGxldCBwMjtcblx0bGV0IHtib2R5fSA9IGluc3RhbmNlO1xuXG5cdC8vIERvbid0IGFsbG93IGNsb25pbmcgYSB1c2VkIGJvZHlcblx0aWYgKGluc3RhbmNlLmJvZHlVc2VkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY2xvbmUgYm9keSBhZnRlciBpdCBpcyB1c2VkJyk7XG5cdH1cblxuXHQvLyBDaGVjayB0aGF0IGJvZHkgaXMgYSBzdHJlYW0gYW5kIG5vdCBmb3JtLWRhdGEgb2JqZWN0XG5cdC8vIG5vdGU6IHdlIGNhbid0IGNsb25lIHRoZSBmb3JtLWRhdGEgb2JqZWN0IHdpdGhvdXQgaGF2aW5nIGl0IGFzIGEgZGVwZW5kZW5jeVxuXHRpZiAoKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0pICYmICh0eXBlb2YgYm9keS5nZXRCb3VuZGFyeSAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHQvLyBUZWUgaW5zdGFuY2UgYm9keVxuXHRcdHAxID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7aGlnaFdhdGVyTWFya30pO1xuXHRcdHAyID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7aGlnaFdhdGVyTWFya30pO1xuXHRcdGJvZHkucGlwZShwMSk7XG5cdFx0Ym9keS5waXBlKHAyKTtcblx0XHQvLyBTZXQgaW5zdGFuY2UgYm9keSB0byB0ZWVkIGJvZHkgYW5kIHJldHVybiB0aGUgb3RoZXIgdGVlZCBib2R5XG5cdFx0aW5zdGFuY2VbSU5URVJOQUxTXS5ib2R5ID0gcDE7XG5cdFx0Ym9keSA9IHAyO1xuXHR9XG5cblx0cmV0dXJuIGJvZHk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcGVyYXRpb24gXCJleHRyYWN0IGEgYENvbnRlbnQtVHlwZWAgdmFsdWUgZnJvbSB8b2JqZWN0fFwiIGFzXG4gKiBzcGVjaWZpZWQgaW4gdGhlIHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5aW5pdC1leHRyYWN0XG4gKlxuICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgaW5zdGFuY2UuYm9keSBpcyBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSB7YW55fSBib2R5IEFueSBvcHRpb25zLmJvZHkgaW5wdXRcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICovXG5jb25zdCBleHRyYWN0Q29udGVudFR5cGUgPSAoYm9keSwgcmVxdWVzdCkgPT4ge1xuXHQvLyBCb2R5IGlzIG51bGwgb3IgdW5kZWZpbmVkXG5cdGlmIChib2R5ID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBCb2R5IGlzIHN0cmluZ1xuXHRpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBhIFVSTFNlYXJjaFBhcmFtc1xuXHRpZiAoaXNVUkxTZWFyY2hQYXJhbWV0ZXJzKGJvZHkpKSB7XG5cdFx0cmV0dXJuICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XG5cdH1cblxuXHQvLyBCb2R5IGlzIGJsb2Jcblx0aWYgKGlzQmxvYihib2R5KSkge1xuXHRcdHJldHVybiBib2R5LnR5cGUgfHwgbnVsbDtcblx0fVxuXG5cdC8vIEJvZHkgaXMgYSBCdWZmZXIgKEJ1ZmZlciwgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KVxuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpIHx8IHV0aWwudHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihib2R5KSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYm9keSkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIERldGVjdCBmb3JtIGRhdGEgaW5wdXQgZnJvbSBmb3JtLWRhdGEgbW9kdWxlXG5cdGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmdldEJvdW5kYXJ5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIGBtdWx0aXBhcnQvZm9ybS1kYXRhO2JvdW5kYXJ5PSR7Ym9keS5nZXRCb3VuZGFyeSgpfWA7XG5cdH1cblxuXHRpZiAoaXNGb3JtRGF0YShib2R5KSkge1xuXHRcdHJldHVybiBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtyZXF1ZXN0W0lOVEVSTkFMU10uYm91bmRhcnl9YDtcblx0fVxuXG5cdC8vIEJvZHkgaXMgc3RyZWFtIC0gY2FuJ3QgcmVhbGx5IGRvIG11Y2ggYWJvdXQgdGhpc1xuXHRpZiAoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gQm9keSBjb25zdHJ1Y3RvciBkZWZhdWx0cyBvdGhlciB0aGluZ3MgdG8gc3RyaW5nXG5cdHJldHVybiAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Jztcbn07XG5cbi8qKlxuICogVGhlIEZldGNoIFN0YW5kYXJkIHRyZWF0cyB0aGlzIGFzIGlmIFwidG90YWwgYnl0ZXNcIiBpcyBhIHByb3BlcnR5IG9uIHRoZSBib2R5LlxuICogRm9yIHVzLCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZ2V0IGl0IHdpdGggYSBmdW5jdGlvbi5cbiAqXG4gKiByZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktdG90YWwtYnl0ZXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gb2JqLmJvZHkgQm9keSBvYmplY3QgZnJvbSB0aGUgQm9keSBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfVxuICovXG5jb25zdCBnZXRUb3RhbEJ5dGVzID0gcmVxdWVzdCA9PiB7XG5cdGNvbnN0IHtib2R5fSA9IHJlcXVlc3Q7XG5cblx0Ly8gQm9keSBpcyBudWxsIG9yIHVuZGVmaW5lZFxuXHRpZiAoYm9keSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBCbG9iXG5cdGlmIChpc0Jsb2IoYm9keSkpIHtcblx0XHRyZXR1cm4gYm9keS5zaXplO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBCdWZmZXJcblx0aWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuXHRcdHJldHVybiBib2R5Lmxlbmd0aDtcblx0fVxuXG5cdC8vIERldGVjdCBmb3JtIGRhdGEgaW5wdXQgZnJvbSBmb3JtLWRhdGEgbW9kdWxlXG5cdGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmdldExlbmd0aFN5bmMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gYm9keS5oYXNLbm93bkxlbmd0aCAmJiBib2R5Lmhhc0tub3duTGVuZ3RoKCkgPyBib2R5LmdldExlbmd0aFN5bmMoKSA6IG51bGw7XG5cdH1cblxuXHQvLyBCb2R5IGlzIGEgc3BlYy1jb21wbGlhbnQgZm9ybS1kYXRhXG5cdGlmIChpc0Zvcm1EYXRhKGJvZHkpKSB7XG5cdFx0cmV0dXJuIGdldEZvcm1EYXRhTGVuZ3RoKHJlcXVlc3RbSU5URVJOQUxTXS5ib3VuZGFyeSk7XG5cdH1cblxuXHQvLyBCb2R5IGlzIHN0cmVhbVxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogV3JpdGUgYSBCb2R5IHRvIGEgTm9kZS5qcyBXcml0YWJsZVN0cmVhbSAoZS5nLiBodHRwLlJlcXVlc3QpIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmVhbS5Xcml0YWJsZX0gZGVzdCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIG9iai5ib2R5IEJvZHkgb2JqZWN0IGZyb20gdGhlIEJvZHkgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgd3JpdGVUb1N0cmVhbSA9IChkZXN0LCB7Ym9keX0pID0+IHtcblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHQvLyBCb2R5IGlzIG51bGxcblx0XHRkZXN0LmVuZCgpO1xuXHR9IGVsc2UgaWYgKGlzQmxvYihib2R5KSkge1xuXHRcdC8vIEJvZHkgaXMgQmxvYlxuXHRcdGJvZHkuc3RyZWFtKCkucGlwZShkZXN0KTtcblx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHQvLyBCb2R5IGlzIGJ1ZmZlclxuXHRcdGRlc3Qud3JpdGUoYm9keSk7XG5cdFx0ZGVzdC5lbmQoKTtcblx0fSBlbHNlIHtcblx0XHQvLyBCb2R5IGlzIHN0cmVhbVxuXHRcdGJvZHkucGlwZShkZXN0KTtcblx0fVxufTtcblxuLyoqXG4gKiBIZWFkZXJzLmpzXG4gKlxuICogSGVhZGVycyBjbGFzcyBvZmZlcnMgY29udmVuaWVudCBoZWxwZXJzXG4gKi9cblxuY29uc3QgdmFsaWRhdGVIZWFkZXJOYW1lID0gdHlwZW9mIGh0dHAudmFsaWRhdGVIZWFkZXJOYW1lID09PSAnZnVuY3Rpb24nID9cblx0aHR0cC52YWxpZGF0ZUhlYWRlck5hbWUgOlxuXHRuYW1lID0+IHtcblx0XHRpZiAoIS9eW1xcXmBcXC1cXHchIyQlJicqKy58fl0rJC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc3QgZXJyID0gbmV3IFR5cGVFcnJvcihgSGVhZGVyIG5hbWUgbXVzdCBiZSBhIHZhbGlkIEhUVFAgdG9rZW4gWyR7bmFtZX1dYCk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnY29kZScsIHt2YWx1ZTogJ0VSUl9JTlZBTElEX0hUVFBfVE9LRU4nfSk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9O1xuXG5jb25zdCB2YWxpZGF0ZUhlYWRlclZhbHVlID0gdHlwZW9mIGh0dHAudmFsaWRhdGVIZWFkZXJWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/XG5cdGh0dHAudmFsaWRhdGVIZWFkZXJWYWx1ZSA6XG5cdChuYW1lLCB2YWx1ZSkgPT4ge1xuXHRcdGlmICgvW15cXHRcXHUwMDIwLVxcdTAwN0VcXHUwMDgwLVxcdTAwRkZdLy50ZXN0KHZhbHVlKSkge1xuXHRcdFx0Y29uc3QgZXJyID0gbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGNvbnRlbnQgW1wiJHtuYW1lfVwiXWApO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ2NvZGUnLCB7dmFsdWU6ICdFUlJfSU5WQUxJRF9DSEFSJ30pO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7SGVhZGVycyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBJdGVyYWJsZTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiB8IEl0ZXJhYmxlPEl0ZXJhYmxlPHN0cmluZz4+fSBIZWFkZXJzSW5pdFxuICovXG5cbi8qKlxuICogVGhpcyBGZXRjaCBBUEkgaW50ZXJmYWNlIGFsbG93cyB5b3UgdG8gcGVyZm9ybSB2YXJpb3VzIGFjdGlvbnMgb24gSFRUUCByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzLlxuICogVGhlc2UgYWN0aW9ucyBpbmNsdWRlIHJldHJpZXZpbmcsIHNldHRpbmcsIGFkZGluZyB0bywgYW5kIHJlbW92aW5nLlxuICogQSBIZWFkZXJzIG9iamVjdCBoYXMgYW4gYXNzb2NpYXRlZCBoZWFkZXIgbGlzdCwgd2hpY2ggaXMgaW5pdGlhbGx5IGVtcHR5IGFuZCBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgbmFtZSBhbmQgdmFsdWUgcGFpcnMuXG4gKiBZb3UgY2FuIGFkZCB0byB0aGlzIHVzaW5nIG1ldGhvZHMgbGlrZSBhcHBlbmQoKSAoc2VlIEV4YW1wbGVzLilcbiAqIEluIGFsbCBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlLCBoZWFkZXIgbmFtZXMgYXJlIG1hdGNoZWQgYnkgY2FzZS1pbnNlbnNpdGl2ZSBieXRlIHNlcXVlbmNlLlxuICpcbiAqL1xuY2xhc3MgSGVhZGVycyBleHRlbmRzIFVSTFNlYXJjaFBhcmFtcyB7XG5cdC8qKlxuXHQgKiBIZWFkZXJzIGNsYXNzXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge0hlYWRlcnNJbml0fSBbaW5pdF0gLSBSZXNwb25zZSBoZWFkZXJzXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihpbml0KSB7XG5cdFx0Ly8gVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBpbml0IG9iamVjdCBpbiBbbmFtZSwgdmFsdWUocyldW11cblx0XHQvKiogQHR5cGUge3N0cmluZ1tdW119ICovXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xuXHRcdGlmIChpbml0IGluc3RhbmNlb2YgSGVhZGVycykge1xuXHRcdFx0Y29uc3QgcmF3ID0gaW5pdC5yYXcoKTtcblx0XHRcdGZvciAoY29uc3QgW25hbWUsIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMocmF3KSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCguLi52YWx1ZXMubWFwKHZhbHVlID0+IFtuYW1lLCB2YWx1ZV0pKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGluaXQgPT0gbnVsbCkgOyBlbHNlIGlmICh0eXBlb2YgaW5pdCA9PT0gJ29iamVjdCcgJiYgIXV0aWwudHlwZXMuaXNCb3hlZFByaW1pdGl2ZShpbml0KSkge1xuXHRcdFx0Y29uc3QgbWV0aG9kID0gaW5pdFtTeW1ib2wuaXRlcmF0b3JdO1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsIGVxZXFlcVxuXHRcdFx0aWYgKG1ldGhvZCA9PSBudWxsKSB7XG5cdFx0XHRcdC8vIFJlY29yZDxCeXRlU3RyaW5nLCBCeXRlU3RyaW5nPlxuXHRcdFx0XHRyZXN1bHQucHVzaCguLi5PYmplY3QuZW50cmllcyhpbml0KSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlciBwYWlycyBtdXN0IGJlIGl0ZXJhYmxlJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj5cblx0XHRcdFx0Ly8gTm90ZTogcGVyIHNwZWMgd2UgaGF2ZSB0byBmaXJzdCBleGhhdXN0IHRoZSBsaXN0cyB0aGVuIHByb2Nlc3MgdGhlbVxuXHRcdFx0XHRyZXN1bHQgPSBbLi4uaW5pdF1cblx0XHRcdFx0XHQubWFwKHBhaXIgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgcGFpciAhPT0gJ29iamVjdCcgfHwgdXRpbC50eXBlcy5pc0JveGVkUHJpbWl0aXZlKHBhaXIpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRWFjaCBoZWFkZXIgcGFpciBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9iamVjdCcpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gWy4uLnBhaXJdO1xuXHRcdFx0XHRcdH0pLm1hcChwYWlyID0+IHtcblx0XHRcdFx0XHRcdGlmIChwYWlyLmxlbmd0aCAhPT0gMikge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFYWNoIGhlYWRlciBwYWlyIG11c3QgYmUgYSBuYW1lL3ZhbHVlIHR1cGxlJyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBbLi4ucGFpcl07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBjb25zdHJ1Y3QgXFwnSGVhZGVyc1xcJzogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlIFxcJyhzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4gb3IgcmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+KScpO1xuXHRcdH1cblxuXHRcdC8vIFZhbGlkYXRlIGFuZCBsb3dlcmNhc2Vcblx0XHRyZXN1bHQgPVxuXHRcdFx0cmVzdWx0Lmxlbmd0aCA+IDAgP1xuXHRcdFx0XHRyZXN1bHQubWFwKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJOYW1lKG5hbWUpO1xuXHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyVmFsdWUobmFtZSwgU3RyaW5nKHZhbHVlKSk7XG5cdFx0XHRcdFx0cmV0dXJuIFtTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKSwgU3RyaW5nKHZhbHVlKV07XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0dW5kZWZpbmVkO1xuXG5cdFx0c3VwZXIocmVzdWx0KTtcblxuXHRcdC8vIFJldHVybmluZyBhIFByb3h5IHRoYXQgd2lsbCBsb3dlcmNhc2Uga2V5IG5hbWVzLCB2YWxpZGF0ZSBwYXJhbWV0ZXJzIGFuZCBzb3J0IGtleXNcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RydWN0b3ItcmV0dXJuXG5cdFx0cmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG5cdFx0XHRnZXQodGFyZ2V0LCBwLCByZWNlaXZlcikge1xuXHRcdFx0XHRzd2l0Y2ggKHApIHtcblx0XHRcdFx0XHRjYXNlICdhcHBlbmQnOlxuXHRcdFx0XHRcdGNhc2UgJ3NldCc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG5hbWUsIHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyTmFtZShuYW1lKTtcblx0XHRcdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJWYWx1ZShuYW1lLCBTdHJpbmcodmFsdWUpKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbcF0uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRyZWNlaXZlcixcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcodmFsdWUpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Y2FzZSAnZGVsZXRlJzpcblx0XHRcdFx0XHRjYXNlICdoYXMnOlxuXHRcdFx0XHRcdGNhc2UgJ2dldEFsbCc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gbmFtZSA9PiB7XG5cdFx0XHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyTmFtZShuYW1lKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbcF0uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRyZWNlaXZlcixcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGNhc2UgJ2tleXMnOlxuXHRcdFx0XHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0LnNvcnQoKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG5ldyBTZXQoVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5rZXlzLmNhbGwodGFyZ2V0KSkua2V5cygpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8qIGM4IGlnbm9yZSBuZXh0ICovXG5cdFx0fSk7XG5cdH1cblxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcblx0fVxuXG5cdHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdH1cblxuXHRnZXQobmFtZSkge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuXHRcdGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRsZXQgdmFsdWUgPSB2YWx1ZXMuam9pbignLCAnKTtcblx0XHRpZiAoL15jb250ZW50LWVuY29kaW5nJC9pLnRlc3QobmFtZSkpIHtcblx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRmb3JFYWNoKGNhbGxiYWNrKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHRjYWxsYmFjayh0aGlzLmdldChuYW1lKSwgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0KiB2YWx1ZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHR5aWVsZCB0aGlzLmdldChuYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHR5cGUgeygpID0+IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT59XG5cdCAqL1xuXHQqIGVudHJpZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHR5aWVsZCBbbmFtZSwgdGhpcy5nZXQobmFtZSldO1xuXHRcdH1cblx0fVxuXG5cdFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOb2RlLWZldGNoIG5vbi1zcGVjIG1ldGhvZFxuXHQgKiByZXR1cm5pbmcgYWxsIGhlYWRlcnMgYW5kIHRoZWlyIHZhbHVlcyBhcyBhcnJheVxuXHQgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fVxuXHQgKi9cblx0cmF3KCkge1xuXHRcdHJldHVybiBbLi4udGhpcy5rZXlzKCldLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcblx0XHRcdHJlc3VsdFtrZXldID0gdGhpcy5nZXRBbGwoa2V5KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSwge30pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZvciBiZXR0ZXIgY29uc29sZS5sb2coaGVhZGVycykgYW5kIGFsc28gdG8gY29udmVydCBIZWFkZXJzIGludG8gTm9kZS5qcyBSZXF1ZXN0IGNvbXBhdGlibGUgZm9ybWF0XG5cdCAqL1xuXHRbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0oKSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLmtleXMoKV0ucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5nZXRBbGwoa2V5KTtcblx0XHRcdC8vIEh0dHAucmVxdWVzdCgpIG9ubHkgc3VwcG9ydHMgc3RyaW5nIGFzIEhvc3QgaGVhZGVyLlxuXHRcdFx0Ly8gVGhpcyBoYWNrIG1ha2VzIHNwZWNpZnlpbmcgY3VzdG9tIEhvc3QgaGVhZGVyIHBvc3NpYmxlLlxuXHRcdFx0aWYgKGtleSA9PT0gJ2hvc3QnKSB7XG5cdFx0XHRcdHJlc3VsdFtrZXldID0gdmFsdWVzWzBdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSB2YWx1ZXMubGVuZ3RoID4gMSA/IHZhbHVlcyA6IHZhbHVlc1swXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LCB7fSk7XG5cdH1cbn1cblxuLyoqXG4gKiBSZS1zaGFwaW5nIG9iamVjdCBmb3IgV2ViIElETCB0ZXN0c1xuICogT25seSBuZWVkIHRvIGRvIGl0IGZvciBvdmVycmlkZGVuIG1ldGhvZHNcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG5cdEhlYWRlcnMucHJvdG90eXBlLFxuXHRbJ2dldCcsICdlbnRyaWVzJywgJ2ZvckVhY2gnLCAndmFsdWVzJ10ucmVkdWNlKChyZXN1bHQsIHByb3BlcnR5KSA9PiB7XG5cdFx0cmVzdWx0W3Byb3BlcnR5XSA9IHtlbnVtZXJhYmxlOiB0cnVlfTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCB7fSlcbik7XG5cbi8qKlxuICogQ3JlYXRlIGEgSGVhZGVycyBvYmplY3QgZnJvbSBhbiBodHRwLkluY29taW5nTWVzc2FnZS5yYXdIZWFkZXJzLCBpZ25vcmluZyB0aG9zZSB0aGF0IGRvXG4gKiBub3QgY29uZm9ybSB0byBIVFRQIGdyYW1tYXIgcHJvZHVjdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydCgnaHR0cCcpLkluY29taW5nTWVzc2FnZVsncmF3SGVhZGVycyddfSBoZWFkZXJzXG4gKi9cbmZ1bmN0aW9uIGZyb21SYXdIZWFkZXJzKGhlYWRlcnMgPSBbXSkge1xuXHRyZXR1cm4gbmV3IEhlYWRlcnMoXG5cdFx0aGVhZGVyc1xuXHRcdFx0Ly8gU3BsaXQgaW50byBwYWlyc1xuXHRcdFx0LnJlZHVjZSgocmVzdWx0LCB2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG5cdFx0XHRcdGlmIChpbmRleCAlIDIgPT09IDApIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChhcnJheS5zbGljZShpbmRleCwgaW5kZXggKyAyKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSwgW10pXG5cdFx0XHQuZmlsdGVyKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJOYW1lKG5hbWUpO1xuXHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyVmFsdWUobmFtZSwgU3RyaW5nKHZhbHVlKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHQpO1xufVxuXG5jb25zdCByZWRpcmVjdFN0YXR1cyA9IG5ldyBTZXQoWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XSk7XG5cbi8qKlxuICogUmVkaXJlY3QgY29kZSBtYXRjaGluZ1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIC0gU3RhdHVzIGNvZGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUmVkaXJlY3QgPSBjb2RlID0+IHtcblx0cmV0dXJuIHJlZGlyZWN0U3RhdHVzLmhhcyhjb2RlKTtcbn07XG5cbi8qKlxuICogUmVzcG9uc2UuanNcbiAqXG4gKiBSZXNwb25zZSBjbGFzcyBwcm92aWRlcyBjb250ZW50IGRlY29kaW5nXG4gKi9cblxuY29uc3QgSU5URVJOQUxTJDEgPSBTeW1ib2woJ1Jlc3BvbnNlIGludGVybmFscycpO1xuXG4vKipcbiAqIFJlc3BvbnNlIGNsYXNzXG4gKlxuICogQHBhcmFtICAgU3RyZWFtICBib2R5ICBSZWFkYWJsZSBzdHJlYW1cbiAqIEBwYXJhbSAgIE9iamVjdCAgb3B0cyAgUmVzcG9uc2Ugb3B0aW9uc1xuICogQHJldHVybiAgVm9pZFxuICovXG5jbGFzcyBSZXNwb25zZSBleHRlbmRzIEJvZHkge1xuXHRjb25zdHJ1Y3Rvcihib2R5ID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0c3VwZXIoYm9keSwgb3B0aW9ucyk7XG5cblx0XHRjb25zdCBzdGF0dXMgPSBvcHRpb25zLnN0YXR1cyB8fCAyMDA7XG5cdFx0Y29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG5cblx0XHRpZiAoYm9keSAhPT0gbnVsbCAmJiAhaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpKSB7XG5cdFx0XHRjb25zdCBjb250ZW50VHlwZSA9IGV4dHJhY3RDb250ZW50VHlwZShib2R5KTtcblx0XHRcdGlmIChjb250ZW50VHlwZSkge1xuXHRcdFx0XHRoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgY29udGVudFR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTJDFdID0ge1xuXHRcdFx0dXJsOiBvcHRpb25zLnVybCxcblx0XHRcdHN0YXR1cyxcblx0XHRcdHN0YXR1c1RleHQ6IG9wdGlvbnMuc3RhdHVzVGV4dCB8fCAnJyxcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRjb3VudGVyOiBvcHRpb25zLmNvdW50ZXIsXG5cdFx0XHRoaWdoV2F0ZXJNYXJrOiBvcHRpb25zLmhpZ2hXYXRlck1hcmtcblx0XHR9O1xuXHR9XG5cblx0Z2V0IHVybCgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0udXJsIHx8ICcnO1xuXHR9XG5cblx0Z2V0IHN0YXR1cygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0uc3RhdHVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIHByb3BlcnR5IHJlcHJlc2VudGluZyBpZiB0aGUgcmVxdWVzdCBlbmRlZCBub3JtYWxseVxuXHQgKi9cblx0Z2V0IG9rKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXMgPj0gMjAwICYmIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1cyA8IDMwMDtcblx0fVxuXG5cdGdldCByZWRpcmVjdGVkKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5jb3VudGVyID4gMDtcblx0fVxuXG5cdGdldCBzdGF0dXNUZXh0KCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXNUZXh0O1xuXHR9XG5cblx0Z2V0IGhlYWRlcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLmhlYWRlcnM7XG5cdH1cblxuXHRnZXQgaGlnaFdhdGVyTWFyaygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0uaGlnaFdhdGVyTWFyaztcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9uZSB0aGlzIHJlc3BvbnNlXG5cdCAqXG5cdCAqIEByZXR1cm4gIFJlc3BvbnNlXG5cdCAqL1xuXHRjbG9uZSgpIHtcblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNlKGNsb25lKHRoaXMsIHRoaXMuaGlnaFdhdGVyTWFyayksIHtcblx0XHRcdHVybDogdGhpcy51cmwsXG5cdFx0XHRzdGF0dXM6IHRoaXMuc3RhdHVzLFxuXHRcdFx0c3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0b2s6IHRoaXMub2ssXG5cdFx0XHRyZWRpcmVjdGVkOiB0aGlzLnJlZGlyZWN0ZWQsXG5cdFx0XHRzaXplOiB0aGlzLnNpemVcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsICAgIFRoZSBVUkwgdGhhdCB0aGUgbmV3IHJlc3BvbnNlIGlzIHRvIG9yaWdpbmF0ZSBmcm9tLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzIEFuIG9wdGlvbmFsIHN0YXR1cyBjb2RlIGZvciB0aGUgcmVzcG9uc2UgKGUuZy4sIDMwMi4pXG5cdCAqIEByZXR1cm5zIHtSZXNwb25zZX0gICAgQSBSZXNwb25zZSBvYmplY3QuXG5cdCAqL1xuXHRzdGF0aWMgcmVkaXJlY3QodXJsLCBzdGF0dXMgPSAzMDIpIHtcblx0XHRpZiAoIWlzUmVkaXJlY3Qoc3RhdHVzKSkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFwicmVkaXJlY3RcIiBvbiBcInJlc3BvbnNlXCI6IEludmFsaWQgc3RhdHVzIGNvZGUnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0bG9jYXRpb246IG5ldyBVUkwodXJsKS50b1N0cmluZygpXG5cdFx0XHR9LFxuXHRcdFx0c3RhdHVzXG5cdFx0fSk7XG5cdH1cblxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG5cdFx0cmV0dXJuICdSZXNwb25zZSc7XG5cdH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG5cdHVybDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRzdGF0dXM6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0b2s6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0cmVkaXJlY3RlZDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRzdGF0dXNUZXh0OiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGhlYWRlcnM6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0Y2xvbmU6IHtlbnVtZXJhYmxlOiB0cnVlfVxufSk7XG5cbmNvbnN0IGdldFNlYXJjaCA9IHBhcnNlZFVSTCA9PiB7XG5cdGlmIChwYXJzZWRVUkwuc2VhcmNoKSB7XG5cdFx0cmV0dXJuIHBhcnNlZFVSTC5zZWFyY2g7XG5cdH1cblxuXHRjb25zdCBsYXN0T2Zmc2V0ID0gcGFyc2VkVVJMLmhyZWYubGVuZ3RoIC0gMTtcblx0Y29uc3QgaGFzaCA9IHBhcnNlZFVSTC5oYXNoIHx8IChwYXJzZWRVUkwuaHJlZltsYXN0T2Zmc2V0XSA9PT0gJyMnID8gJyMnIDogJycpO1xuXHRyZXR1cm4gcGFyc2VkVVJMLmhyZWZbbGFzdE9mZnNldCAtIGhhc2gubGVuZ3RoXSA9PT0gJz8nID8gJz8nIDogJyc7XG59O1xuXG5jb25zdCBJTlRFUk5BTFMkMiA9IFN5bWJvbCgnUmVxdWVzdCBpbnRlcm5hbHMnKTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBpbnN0YW5jZSBvZiBSZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSAgeyp9IG9ialxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNSZXF1ZXN0ID0gb2JqZWN0ID0+IHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3RbSU5URVJOQUxTJDJdID09PSAnb2JqZWN0J1xuXHQpO1xufTtcblxuLyoqXG4gKiBSZXF1ZXN0IGNsYXNzXG4gKlxuICogQHBhcmFtICAgTWl4ZWQgICBpbnB1dCAgVXJsIG9yIFJlcXVlc3QgaW5zdGFuY2VcbiAqIEBwYXJhbSAgIE9iamVjdCAgaW5pdCAgIEN1c3RvbSBvcHRpb25zXG4gKiBAcmV0dXJuICBWb2lkXG4gKi9cbmNsYXNzIFJlcXVlc3QgZXh0ZW5kcyBCb2R5IHtcblx0Y29uc3RydWN0b3IoaW5wdXQsIGluaXQgPSB7fSkge1xuXHRcdGxldCBwYXJzZWRVUkw7XG5cblx0XHQvLyBOb3JtYWxpemUgaW5wdXQgYW5kIGZvcmNlIFVSTCB0byBiZSBlbmNvZGVkIGFzIFVURi04IChodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL2lzc3Vlcy8yNDUpXG5cdFx0aWYgKGlzUmVxdWVzdChpbnB1dCkpIHtcblx0XHRcdHBhcnNlZFVSTCA9IG5ldyBVUkwoaW5wdXQudXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyc2VkVVJMID0gbmV3IFVSTChpbnB1dCk7XG5cdFx0XHRpbnB1dCA9IHt9O1xuXHRcdH1cblxuXHRcdGxldCBtZXRob2QgPSBpbml0Lm1ldGhvZCB8fCBpbnB1dC5tZXRob2QgfHwgJ0dFVCc7XG5cdFx0bWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCwgZXFlcWVxXG5cdFx0aWYgKCgoaW5pdC5ib2R5ICE9IG51bGwgfHwgaXNSZXF1ZXN0KGlucHV0KSkgJiYgaW5wdXQuYm9keSAhPT0gbnVsbCkgJiZcblx0XHRcdChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5Jyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5wdXRCb2R5ID0gaW5pdC5ib2R5ID9cblx0XHRcdGluaXQuYm9keSA6XG5cdFx0XHQoaXNSZXF1ZXN0KGlucHV0KSAmJiBpbnB1dC5ib2R5ICE9PSBudWxsID9cblx0XHRcdFx0Y2xvbmUoaW5wdXQpIDpcblx0XHRcdFx0bnVsbCk7XG5cblx0XHRzdXBlcihpbnB1dEJvZHksIHtcblx0XHRcdHNpemU6IGluaXQuc2l6ZSB8fCBpbnB1dC5zaXplIHx8IDBcblx0XHR9KTtcblxuXHRcdGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMgfHwgaW5wdXQuaGVhZGVycyB8fCB7fSk7XG5cblx0XHRpZiAoaW5wdXRCb2R5ICE9PSBudWxsICYmICFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gZXh0cmFjdENvbnRlbnRUeXBlKGlucHV0Qm9keSwgdGhpcyk7XG5cdFx0XHRpZiAoY29udGVudFR5cGUpIHtcblx0XHRcdFx0aGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc2lnbmFsID0gaXNSZXF1ZXN0KGlucHV0KSA/XG5cdFx0XHRpbnB1dC5zaWduYWwgOlxuXHRcdFx0bnVsbDtcblx0XHRpZiAoJ3NpZ25hbCcgaW4gaW5pdCkge1xuXHRcdFx0c2lnbmFsID0gaW5pdC5zaWduYWw7XG5cdFx0fVxuXG5cdFx0aWYgKHNpZ25hbCAhPT0gbnVsbCAmJiAhaXNBYm9ydFNpZ25hbChzaWduYWwpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBzaWduYWwgdG8gYmUgYW4gaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCcpO1xuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTJDJdID0ge1xuXHRcdFx0bWV0aG9kLFxuXHRcdFx0cmVkaXJlY3Q6IGluaXQucmVkaXJlY3QgfHwgaW5wdXQucmVkaXJlY3QgfHwgJ2ZvbGxvdycsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0cGFyc2VkVVJMLFxuXHRcdFx0c2lnbmFsXG5cdFx0fTtcblxuXHRcdC8vIE5vZGUtZmV0Y2gtb25seSBvcHRpb25zXG5cdFx0dGhpcy5mb2xsb3cgPSBpbml0LmZvbGxvdyA9PT0gdW5kZWZpbmVkID8gKGlucHV0LmZvbGxvdyA9PT0gdW5kZWZpbmVkID8gMjAgOiBpbnB1dC5mb2xsb3cpIDogaW5pdC5mb2xsb3c7XG5cdFx0dGhpcy5jb21wcmVzcyA9IGluaXQuY29tcHJlc3MgPT09IHVuZGVmaW5lZCA/IChpbnB1dC5jb21wcmVzcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGlucHV0LmNvbXByZXNzKSA6IGluaXQuY29tcHJlc3M7XG5cdFx0dGhpcy5jb3VudGVyID0gaW5pdC5jb3VudGVyIHx8IGlucHV0LmNvdW50ZXIgfHwgMDtcblx0XHR0aGlzLmFnZW50ID0gaW5pdC5hZ2VudCB8fCBpbnB1dC5hZ2VudDtcblx0XHR0aGlzLmhpZ2hXYXRlck1hcmsgPSBpbml0LmhpZ2hXYXRlck1hcmsgfHwgaW5wdXQuaGlnaFdhdGVyTWFyayB8fCAxNjM4NDtcblx0XHR0aGlzLmluc2VjdXJlSFRUUFBhcnNlciA9IGluaXQuaW5zZWN1cmVIVFRQUGFyc2VyIHx8IGlucHV0Lmluc2VjdXJlSFRUUFBhcnNlciB8fCBmYWxzZTtcblx0fVxuXG5cdGdldCBtZXRob2QoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLm1ldGhvZDtcblx0fVxuXG5cdGdldCB1cmwoKSB7XG5cdFx0cmV0dXJuIHVybC5mb3JtYXQodGhpc1tJTlRFUk5BTFMkMl0ucGFyc2VkVVJMKTtcblx0fVxuXG5cdGdldCBoZWFkZXJzKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQyXS5oZWFkZXJzO1xuXHR9XG5cblx0Z2V0IHJlZGlyZWN0KCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQyXS5yZWRpcmVjdDtcblx0fVxuXG5cdGdldCBzaWduYWwoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLnNpZ25hbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9uZSB0aGlzIHJlcXVlc3Rcblx0ICpcblx0ICogQHJldHVybiAgUmVxdWVzdFxuXHQgKi9cblx0Y2xvbmUoKSB7XG5cdFx0cmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMpO1xuXHR9XG5cblx0Z2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuXHRcdHJldHVybiAnUmVxdWVzdCc7XG5cdH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVxdWVzdC5wcm90b3R5cGUsIHtcblx0bWV0aG9kOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHVybDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRoZWFkZXJzOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHJlZGlyZWN0OiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGNsb25lOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHNpZ25hbDoge2VudW1lcmFibGU6IHRydWV9XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgUmVxdWVzdCB0byBOb2RlLmpzIGh0dHAgcmVxdWVzdCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSAgIFJlcXVlc3QgIEEgUmVxdWVzdCBpbnN0YW5jZVxuICogQHJldHVybiAgT2JqZWN0ICAgVGhlIG9wdGlvbnMgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byBodHRwLnJlcXVlc3RcbiAqL1xuY29uc3QgZ2V0Tm9kZVJlcXVlc3RPcHRpb25zID0gcmVxdWVzdCA9PiB7XG5cdGNvbnN0IHtwYXJzZWRVUkx9ID0gcmVxdWVzdFtJTlRFUk5BTFMkMl07XG5cdGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXF1ZXN0W0lOVEVSTkFMUyQyXS5oZWFkZXJzKTtcblxuXHQvLyBGZXRjaCBzdGVwIDEuM1xuXHRpZiAoIWhlYWRlcnMuaGFzKCdBY2NlcHQnKSkge1xuXHRcdGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnKi8qJyk7XG5cdH1cblxuXHQvLyBIVFRQLW5ldHdvcmstb3ItY2FjaGUgZmV0Y2ggc3RlcHMgMi40LTIuN1xuXHRsZXQgY29udGVudExlbmd0aFZhbHVlID0gbnVsbDtcblx0aWYgKHJlcXVlc3QuYm9keSA9PT0gbnVsbCAmJiAvXihwb3N0fHB1dCkkL2kudGVzdChyZXF1ZXN0Lm1ldGhvZCkpIHtcblx0XHRjb250ZW50TGVuZ3RoVmFsdWUgPSAnMCc7XG5cdH1cblxuXHRpZiAocmVxdWVzdC5ib2R5ICE9PSBudWxsKSB7XG5cdFx0Y29uc3QgdG90YWxCeXRlcyA9IGdldFRvdGFsQnl0ZXMocmVxdWVzdCk7XG5cdFx0Ly8gU2V0IENvbnRlbnQtTGVuZ3RoIGlmIHRvdGFsQnl0ZXMgaXMgYSBudW1iZXIgKHRoYXQgaXMgbm90IE5hTilcblx0XHRpZiAodHlwZW9mIHRvdGFsQnl0ZXMgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odG90YWxCeXRlcykpIHtcblx0XHRcdGNvbnRlbnRMZW5ndGhWYWx1ZSA9IFN0cmluZyh0b3RhbEJ5dGVzKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoY29udGVudExlbmd0aFZhbHVlKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0NvbnRlbnQtTGVuZ3RoJywgY29udGVudExlbmd0aFZhbHVlKTtcblx0fVxuXG5cdC8vIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBzdGVwIDIuMTFcblx0aWYgKCFoZWFkZXJzLmhhcygnVXNlci1BZ2VudCcpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCAnbm9kZS1mZXRjaCcpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIHN0ZXAgMi4xNVxuXHRpZiAocmVxdWVzdC5jb21wcmVzcyAmJiAhaGVhZGVycy5oYXMoJ0FjY2VwdC1FbmNvZGluZycpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0FjY2VwdC1FbmNvZGluZycsICdnemlwLGRlZmxhdGUsYnInKTtcblx0fVxuXG5cdGxldCB7YWdlbnR9ID0gcmVxdWVzdDtcblx0aWYgKHR5cGVvZiBhZ2VudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGFnZW50ID0gYWdlbnQocGFyc2VkVVJMKTtcblx0fVxuXG5cdGlmICghaGVhZGVycy5oYXMoJ0Nvbm5lY3Rpb24nKSAmJiAhYWdlbnQpIHtcblx0XHRoZWFkZXJzLnNldCgnQ29ubmVjdGlvbicsICdjbG9zZScpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrIGZldGNoIHN0ZXAgNC4yXG5cdC8vIGNodW5rZWQgZW5jb2RpbmcgaXMgaGFuZGxlZCBieSBOb2RlLmpzXG5cblx0Y29uc3Qgc2VhcmNoID0gZ2V0U2VhcmNoKHBhcnNlZFVSTCk7XG5cblx0Ly8gTWFudWFsbHkgc3ByZWFkIHRoZSBVUkwgb2JqZWN0IGluc3RlYWQgb2Ygc3ByZWFkIHN5bnRheFxuXHRjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcblx0XHRwYXRoOiBwYXJzZWRVUkwucGF0aG5hbWUgKyBzZWFyY2gsXG5cdFx0cGF0aG5hbWU6IHBhcnNlZFVSTC5wYXRobmFtZSxcblx0XHRob3N0bmFtZTogcGFyc2VkVVJMLmhvc3RuYW1lLFxuXHRcdHByb3RvY29sOiBwYXJzZWRVUkwucHJvdG9jb2wsXG5cdFx0cG9ydDogcGFyc2VkVVJMLnBvcnQsXG5cdFx0aGFzaDogcGFyc2VkVVJMLmhhc2gsXG5cdFx0c2VhcmNoOiBwYXJzZWRVUkwuc2VhcmNoLFxuXHRcdHF1ZXJ5OiBwYXJzZWRVUkwucXVlcnksXG5cdFx0aHJlZjogcGFyc2VkVVJMLmhyZWYsXG5cdFx0bWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcblx0XHRoZWFkZXJzOiBoZWFkZXJzW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldKCksXG5cdFx0aW5zZWN1cmVIVFRQUGFyc2VyOiByZXF1ZXN0Lmluc2VjdXJlSFRUUFBhcnNlcixcblx0XHRhZ2VudFxuXHR9O1xuXG5cdHJldHVybiByZXF1ZXN0T3B0aW9ucztcbn07XG5cbi8qKlxuICogQWJvcnRFcnJvciBpbnRlcmZhY2UgZm9yIGNhbmNlbGxlZCByZXF1ZXN0c1xuICovXG5jbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRmV0Y2hCYXNlRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlLCB0eXBlID0gJ2Fib3J0ZWQnKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgdHlwZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBJbmRleC5qc1xuICpcbiAqIGEgcmVxdWVzdCBBUEkgY29tcGF0aWJsZSB3aXRoIHdpbmRvdy5mZXRjaFxuICpcbiAqIEFsbCBzcGVjIGFsZ29yaXRobSBzdGVwIG51bWJlcnMgYXJlIGJhc2VkIG9uIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnL2NvbW1pdC1zbmFwc2hvdHMvYWU3MTY4MjJjYjNhNjE4NDMyMjZjZDA5MGVlZmM2NTg5NDQ2YzFkMi8uXG4gKi9cblxuY29uc3Qgc3VwcG9ydGVkU2NoZW1hcyA9IG5ldyBTZXQoWydkYXRhOicsICdodHRwOicsICdodHRwczonXSk7XG5cbi8qKlxuICogRmV0Y2ggZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0gICB7c3RyaW5nIHwgVVJMIHwgaW1wb3J0KCcuL3JlcXVlc3QnKS5kZWZhdWx0fSB1cmwgLSBBYnNvbHV0ZSB1cmwgb3IgUmVxdWVzdCBpbnN0YW5jZVxuICogQHBhcmFtICAgeyp9IFtvcHRpb25zX10gLSBGZXRjaCBvcHRpb25zXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxpbXBvcnQoJy4vcmVzcG9uc2UnKS5kZWZhdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2godXJsLCBvcHRpb25zXykge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdC8vIEJ1aWxkIHJlcXVlc3Qgb2JqZWN0XG5cdFx0Y29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwgb3B0aW9uc18pO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXROb2RlUmVxdWVzdE9wdGlvbnMocmVxdWVzdCk7XG5cdFx0aWYgKCFzdXBwb3J0ZWRTY2hlbWFzLmhhcyhvcHRpb25zLnByb3RvY29sKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgbm9kZS1mZXRjaCBjYW5ub3QgbG9hZCAke3VybH0uIFVSTCBzY2hlbWUgXCIke29wdGlvbnMucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJyl9XCIgaXMgbm90IHN1cHBvcnRlZC5gKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5wcm90b2NvbCA9PT0gJ2RhdGE6Jykge1xuXHRcdFx0Y29uc3QgZGF0YSA9IGRhdGFVcmlUb0J1ZmZlcihyZXF1ZXN0LnVybCk7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZShkYXRhLCB7aGVhZGVyczogeydDb250ZW50LVR5cGUnOiBkYXRhLnR5cGVGdWxsfX0pO1xuXHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gV3JhcCBodHRwLnJlcXVlc3QgaW50byBmZXRjaFxuXHRcdGNvbnN0IHNlbmQgPSAob3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBodHRwcyA6IGh0dHApLnJlcXVlc3Q7XG5cdFx0Y29uc3Qge3NpZ25hbH0gPSByZXF1ZXN0O1xuXHRcdGxldCByZXNwb25zZSA9IG51bGw7XG5cblx0XHRjb25zdCBhYm9ydCA9ICgpID0+IHtcblx0XHRcdGNvbnN0IGVycm9yID0gbmV3IEFib3J0RXJyb3IoJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJyk7XG5cdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0aWYgKHJlcXVlc3QuYm9keSAmJiByZXF1ZXN0LmJvZHkgaW5zdGFuY2VvZiBTdHJlYW0uUmVhZGFibGUpIHtcblx0XHRcdFx0cmVxdWVzdC5ib2R5LmRlc3Ryb3koZXJyb3IpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5ib2R5KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2UuYm9keS5lbWl0KCdlcnJvcicsIGVycm9yKTtcblx0XHR9O1xuXG5cdFx0aWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkge1xuXHRcdFx0YWJvcnQoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhYm9ydEFuZEZpbmFsaXplID0gKCkgPT4ge1xuXHRcdFx0YWJvcnQoKTtcblx0XHRcdGZpbmFsaXplKCk7XG5cdFx0fTtcblxuXHRcdC8vIFNlbmQgcmVxdWVzdFxuXHRcdGNvbnN0IHJlcXVlc3RfID0gc2VuZChvcHRpb25zKTtcblxuXHRcdGlmIChzaWduYWwpIHtcblx0XHRcdHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QW5kRmluYWxpemUpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpbmFsaXplID0gKCkgPT4ge1xuXHRcdFx0cmVxdWVzdF8uYWJvcnQoKTtcblx0XHRcdGlmIChzaWduYWwpIHtcblx0XHRcdFx0c2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJlcXVlc3RfLm9uKCdlcnJvcicsIGVyciA9PiB7XG5cdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYHJlcXVlc3QgdG8gJHtyZXF1ZXN0LnVybH0gZmFpbGVkLCByZWFzb246ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycikpO1xuXHRcdFx0ZmluYWxpemUoKTtcblx0XHR9KTtcblxuXHRcdHJlcXVlc3RfLm9uKCdyZXNwb25zZScsIHJlc3BvbnNlXyA9PiB7XG5cdFx0XHRyZXF1ZXN0Xy5zZXRUaW1lb3V0KDApO1xuXHRcdFx0Y29uc3QgaGVhZGVycyA9IGZyb21SYXdIZWFkZXJzKHJlc3BvbnNlXy5yYXdIZWFkZXJzKTtcblxuXHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDVcblx0XHRcdGlmIChpc1JlZGlyZWN0KHJlc3BvbnNlXy5zdGF0dXNDb2RlKSkge1xuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS4yXG5cdFx0XHRcdGNvbnN0IGxvY2F0aW9uID0gaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk7XG5cblx0XHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDUuM1xuXHRcdFx0XHRjb25zdCBsb2NhdGlvblVSTCA9IGxvY2F0aW9uID09PSBudWxsID8gbnVsbCA6IG5ldyBVUkwobG9jYXRpb24sIHJlcXVlc3QudXJsKTtcblxuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS41XG5cdFx0XHRcdHN3aXRjaCAocmVxdWVzdC5yZWRpcmVjdCkge1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9yJzpcblx0XHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgdXJpIHJlcXVlc3RlZCByZXNwb25kcyB3aXRoIGEgcmVkaXJlY3QsIHJlZGlyZWN0IG1vZGUgaXMgc2V0IHRvIGVycm9yOiAke3JlcXVlc3QudXJsfWAsICduby1yZWRpcmVjdCcpKTtcblx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0Y2FzZSAnbWFudWFsJzpcblx0XHRcdFx0XHRcdC8vIE5vZGUtZmV0Y2gtc3BlY2lmaWMgc3RlcDogbWFrZSBtYW51YWwgcmVkaXJlY3QgYSBiaXQgZWFzaWVyIHRvIHVzZSBieSBzZXR0aW5nIHRoZSBMb2NhdGlvbiBoZWFkZXIgdmFsdWUgdG8gdGhlIHJlc29sdmVkIFVSTC5cblx0XHRcdFx0XHRcdGlmIChsb2NhdGlvblVSTCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgY29ycnVwdGVkIGhlYWRlclxuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGhlYWRlcnMuc2V0KCdMb2NhdGlvbicsIGxvY2F0aW9uVVJMKTtcblx0XHRcdFx0XHRcdFx0XHQvKiBjOCBpZ25vcmUgbmV4dCAzICovXG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmb2xsb3cnOiB7XG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMlxuXHRcdFx0XHRcdFx0aWYgKGxvY2F0aW9uVVJMID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgNVxuXHRcdFx0XHRcdFx0aWYgKHJlcXVlc3QuY291bnRlciA+PSByZXF1ZXN0LmZvbGxvdykge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYG1heGltdW0gcmVkaXJlY3QgcmVhY2hlZCBhdDogJHtyZXF1ZXN0LnVybH1gLCAnbWF4LXJlZGlyZWN0JykpO1xuXHRcdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCA2IChjb3VudGVyIGluY3JlbWVudClcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBSZXF1ZXN0IG9iamVjdC5cblx0XHRcdFx0XHRcdGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRoZWFkZXJzOiBuZXcgSGVhZGVycyhyZXF1ZXN0LmhlYWRlcnMpLFxuXHRcdFx0XHRcdFx0XHRmb2xsb3c6IHJlcXVlc3QuZm9sbG93LFxuXHRcdFx0XHRcdFx0XHRjb3VudGVyOiByZXF1ZXN0LmNvdW50ZXIgKyAxLFxuXHRcdFx0XHRcdFx0XHRhZ2VudDogcmVxdWVzdC5hZ2VudCxcblx0XHRcdFx0XHRcdFx0Y29tcHJlc3M6IHJlcXVlc3QuY29tcHJlc3MsXG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHJlcXVlc3QuYm9keSxcblx0XHRcdFx0XHRcdFx0c2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcblx0XHRcdFx0XHRcdFx0c2l6ZTogcmVxdWVzdC5zaXplXG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgOVxuXHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlXy5zdGF0dXNDb2RlICE9PSAzMDMgJiYgcmVxdWVzdC5ib2R5ICYmIG9wdGlvbnNfLmJvZHkgaW5zdGFuY2VvZiBTdHJlYW0uUmVhZGFibGUpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKCdDYW5ub3QgZm9sbG93IHJlZGlyZWN0IHdpdGggYm9keSBiZWluZyBhIHJlYWRhYmxlIHN0cmVhbScsICd1bnN1cHBvcnRlZC1yZWRpcmVjdCcpKTtcblx0XHRcdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMTFcblx0XHRcdFx0XHRcdGlmIChyZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzAzIHx8ICgocmVzcG9uc2VfLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzAyKSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnKSkge1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0T3B0aW9ucy5tZXRob2QgPSAnR0VUJztcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE9wdGlvbnMuYm9keSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ2NvbnRlbnQtbGVuZ3RoJyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCAxNVxuXHRcdFx0XHRcdFx0cmVzb2x2ZShmZXRjaChuZXcgUmVxdWVzdChsb2NhdGlvblVSTCwgcmVxdWVzdE9wdGlvbnMpKSk7XG5cdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBEbyBub3RoaW5nXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUHJlcGFyZSByZXNwb25zZVxuXHRcdFx0cmVzcG9uc2VfLm9uY2UoJ2VuZCcsICgpID0+IHtcblx0XHRcdFx0aWYgKHNpZ25hbCkge1xuXHRcdFx0XHRcdHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QW5kRmluYWxpemUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bGV0IGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUocmVzcG9uc2VfLCBuZXcgU3RyZWFtLlBhc3NUaHJvdWdoKCksIGVycm9yID0+IHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH0pO1xuXHRcdFx0Ly8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzI5Mzc2XG5cdFx0XHRpZiAocHJvY2Vzcy52ZXJzaW9uIDwgJ3YxMi4xMCcpIHtcblx0XHRcdFx0cmVzcG9uc2VfLm9uKCdhYm9ydGVkJywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlc3BvbnNlT3B0aW9ucyA9IHtcblx0XHRcdFx0dXJsOiByZXF1ZXN0LnVybCxcblx0XHRcdFx0c3RhdHVzOiByZXNwb25zZV8uc3RhdHVzQ29kZSxcblx0XHRcdFx0c3RhdHVzVGV4dDogcmVzcG9uc2VfLnN0YXR1c01lc3NhZ2UsXG5cdFx0XHRcdGhlYWRlcnMsXG5cdFx0XHRcdHNpemU6IHJlcXVlc3Quc2l6ZSxcblx0XHRcdFx0Y291bnRlcjogcmVxdWVzdC5jb3VudGVyLFxuXHRcdFx0XHRoaWdoV2F0ZXJNYXJrOiByZXF1ZXN0LmhpZ2hXYXRlck1hcmtcblx0XHRcdH07XG5cblx0XHRcdC8vIEhUVFAtbmV0d29yayBmZXRjaCBzdGVwIDEyLjEuMS4zXG5cdFx0XHRjb25zdCBjb2RpbmdzID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtRW5jb2RpbmcnKTtcblxuXHRcdFx0Ly8gSFRUUC1uZXR3b3JrIGZldGNoIHN0ZXAgMTIuMS4xLjQ6IGhhbmRsZSBjb250ZW50IGNvZGluZ3NcblxuXHRcdFx0Ly8gaW4gZm9sbG93aW5nIHNjZW5hcmlvcyB3ZSBpZ25vcmUgY29tcHJlc3Npb24gc3VwcG9ydFxuXHRcdFx0Ly8gMS4gY29tcHJlc3Npb24gc3VwcG9ydCBpcyBkaXNhYmxlZFxuXHRcdFx0Ly8gMi4gSEVBRCByZXF1ZXN0XG5cdFx0XHQvLyAzLiBubyBDb250ZW50LUVuY29kaW5nIGhlYWRlclxuXHRcdFx0Ly8gNC4gbm8gY29udGVudCByZXNwb25zZSAoMjA0KVxuXHRcdFx0Ly8gNS4gY29udGVudCBub3QgbW9kaWZpZWQgcmVzcG9uc2UgKDMwNClcblx0XHRcdGlmICghcmVxdWVzdC5jb21wcmVzcyB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0hFQUQnIHx8IGNvZGluZ3MgPT09IG51bGwgfHwgcmVzcG9uc2VfLnN0YXR1c0NvZGUgPT09IDIwNCB8fCByZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzA0KSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBOb2RlIHY2K1xuXHRcdFx0Ly8gQmUgbGVzcyBzdHJpY3Qgd2hlbiBkZWNvZGluZyBjb21wcmVzc2VkIHJlc3BvbnNlcywgc2luY2Ugc29tZXRpbWVzXG5cdFx0XHQvLyBzZXJ2ZXJzIHNlbmQgc2xpZ2h0bHkgaW52YWxpZCByZXNwb25zZXMgdGhhdCBhcmUgc3RpbGwgYWNjZXB0ZWRcblx0XHRcdC8vIGJ5IGNvbW1vbiBicm93c2Vycy5cblx0XHRcdC8vIEFsd2F5cyB1c2luZyBaX1NZTkNfRkxVU0ggaXMgd2hhdCBjVVJMIGRvZXMuXG5cdFx0XHRjb25zdCB6bGliT3B0aW9ucyA9IHtcblx0XHRcdFx0Zmx1c2g6IHpsaWIuWl9TWU5DX0ZMVVNILFxuXHRcdFx0XHRmaW5pc2hGbHVzaDogemxpYi5aX1NZTkNfRkxVU0hcblx0XHRcdH07XG5cblx0XHRcdC8vIEZvciBnemlwXG5cdFx0XHRpZiAoY29kaW5ncyA9PT0gJ2d6aXAnIHx8IGNvZGluZ3MgPT09ICd4LWd6aXAnKSB7XG5cdFx0XHRcdGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUoYm9keSwgemxpYi5jcmVhdGVHdW56aXAoemxpYk9wdGlvbnMpLCBlcnJvciA9PiB7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBkZWZsYXRlXG5cdFx0XHRpZiAoY29kaW5ncyA9PT0gJ2RlZmxhdGUnIHx8IGNvZGluZ3MgPT09ICd4LWRlZmxhdGUnKSB7XG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgaW5mYW1vdXMgcmF3IGRlZmxhdGUgcmVzcG9uc2UgZnJvbSBvbGQgc2VydmVyc1xuXHRcdFx0XHQvLyBhIGhhY2sgZm9yIG9sZCBJSVMgYW5kIEFwYWNoZSBzZXJ2ZXJzXG5cdFx0XHRcdGNvbnN0IHJhdyA9IFN0cmVhbS5waXBlbGluZShyZXNwb25zZV8sIG5ldyBTdHJlYW0uUGFzc1Rocm91Z2goKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyYXcub25jZSgnZGF0YScsIGNodW5rID0+IHtcblx0XHRcdFx0XHQvLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzUxOTgyOFxuXHRcdFx0XHRcdGlmICgoY2h1bmtbMF0gJiAweDBGKSA9PT0gMHgwOCkge1xuXHRcdFx0XHRcdFx0Ym9keSA9IFN0cmVhbS5waXBlbGluZShib2R5LCB6bGliLmNyZWF0ZUluZmxhdGUoKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUoYm9keSwgemxpYi5jcmVhdGVJbmZsYXRlUmF3KCksIGVycm9yID0+IHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBiclxuXHRcdFx0aWYgKGNvZGluZ3MgPT09ICdicicpIHtcblx0XHRcdFx0Ym9keSA9IFN0cmVhbS5waXBlbGluZShib2R5LCB6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZU9wdGlvbnMpO1xuXHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIHVzZSByZXNwb25zZSBhcy1pc1xuXHRcdFx0cmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2VPcHRpb25zKTtcblx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdH0pO1xuXG5cdFx0d3JpdGVUb1N0cmVhbShyZXF1ZXN0XywgcmVxdWVzdCk7XG5cdH0pO1xufVxuXG5leHBvcnRzLkFib3J0RXJyb3IgPSBBYm9ydEVycm9yO1xuZXhwb3J0cy5GZXRjaEVycm9yID0gRmV0Y2hFcnJvcjtcbmV4cG9ydHMuSGVhZGVycyA9IEhlYWRlcnM7XG5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuZXhwb3J0cy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuZXhwb3J0cy5kZWZhdWx0ID0gZmV0Y2g7XG5leHBvcnRzLmlzUmVkaXJlY3QgPSBpc1JlZGlyZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguY2pzLm1hcFxuIiwiLyoqXG4gKiB3ZWItc3RyZWFtcy1wb2x5ZmlsbCB2My4xLjFcbiAqL1xuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LnN5bWJvbFwiIC8+XG5jb25zdCBTeW1ib2xQb2x5ZmlsbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcgP1xuICAgIFN5bWJvbCA6XG4gICAgZGVzY3JpcHRpb24gPT4gYFN5bWJvbCgke2Rlc2NyaXB0aW9ufSlgO1xuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJkb21cIiAvPlxuZnVuY3Rpb24gbm9vcCgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZ2V0R2xvYmFscygpIHtcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuY29uc3QgZ2xvYmFscyA9IGdldEdsb2JhbHMoKTtcblxuZnVuY3Rpb24gdHlwZUlzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKSB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmNvbnN0IHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbiA9IG5vb3A7XG5cbmNvbnN0IG9yaWdpbmFsUHJvbWlzZSA9IFByb21pc2U7XG5jb25zdCBvcmlnaW5hbFByb21pc2VUaGVuID0gUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcbmNvbnN0IG9yaWdpbmFsUHJvbWlzZVJlc29sdmUgPSBQcm9taXNlLnJlc29sdmUuYmluZChvcmlnaW5hbFByb21pc2UpO1xuY29uc3Qgb3JpZ2luYWxQcm9taXNlUmVqZWN0ID0gUHJvbWlzZS5yZWplY3QuYmluZChvcmlnaW5hbFByb21pc2UpO1xuZnVuY3Rpb24gbmV3UHJvbWlzZShleGVjdXRvcikge1xuICAgIHJldHVybiBuZXcgb3JpZ2luYWxQcm9taXNlKGV4ZWN1dG9yKTtcbn1cbmZ1bmN0aW9uIHByb21pc2VSZXNvbHZlZFdpdGgodmFsdWUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxQcm9taXNlUmVzb2x2ZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYXNvbikge1xuICAgIHJldHVybiBvcmlnaW5hbFByb21pc2VSZWplY3QocmVhc29uKTtcbn1cbmZ1bmN0aW9uIFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIC8vIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gY29ycmVjdGx5IGVtdWxhdGUgdGhlIGJlaGF2aW91ciBmcm9tIEphdmFTY3JpcHQsIHNvIHRoaXMgaXMganVzdCBhblxuICAgIC8vIGFwcHJveGltYXRpb24uXG4gICAgcmV0dXJuIG9yaWdpbmFsUHJvbWlzZVRoZW4uY2FsbChwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG59XG5mdW5jdGlvbiB1cG9uUHJvbWlzZShwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIFBlcmZvcm1Qcm9taXNlVGhlbihQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpLCB1bmRlZmluZWQsIHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbik7XG59XG5mdW5jdGlvbiB1cG9uRnVsZmlsbG1lbnQocHJvbWlzZSwgb25GdWxmaWxsZWQpIHtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlLCBvbkZ1bGZpbGxlZCk7XG59XG5mdW5jdGlvbiB1cG9uUmVqZWN0aW9uKHByb21pc2UsIG9uUmVqZWN0ZWQpIHtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlLCB1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtUHJvbWlzZVdpdGgocHJvbWlzZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xufVxuZnVuY3Rpb24gc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShwcm9taXNlKSB7XG4gICAgUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIHVuZGVmaW5lZCwgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKTtcbn1cbmNvbnN0IHF1ZXVlTWljcm90YXNrID0gKCgpID0+IHtcbiAgICBjb25zdCBnbG9iYWxRdWV1ZU1pY3JvdGFzayA9IGdsb2JhbHMgJiYgZ2xvYmFscy5xdWV1ZU1pY3JvdGFzaztcbiAgICBpZiAodHlwZW9mIGdsb2JhbFF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxRdWV1ZU1pY3JvdGFzaztcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIHJldHVybiAoZm4pID0+IFBlcmZvcm1Qcm9taXNlVGhlbihyZXNvbHZlZFByb21pc2UsIGZuKTtcbn0pKCk7XG5mdW5jdGlvbiByZWZsZWN0Q2FsbChGLCBWLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBGICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChGLCBWLCBhcmdzKTtcbn1cbmZ1bmN0aW9uIHByb21pc2VDYWxsKEYsIFYsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChyZWZsZWN0Q2FsbChGLCBWLCBhcmdzKSk7XG4gICAgfVxuICAgIGNhdGNoICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2YWx1ZSk7XG4gICAgfVxufVxuXG4vLyBPcmlnaW5hbCBmcm9tIENocm9taXVtXG4vLyBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLysvMGFlZTQ0MzRhNGRiYTQyYTQyYWJhZWE5YmZiYzBjZDE5NmE2M2JjMS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N0cmVhbXMvU2ltcGxlUXVldWUuanNcbmNvbnN0IFFVRVVFX01BWF9BUlJBWV9TSVpFID0gMTYzODQ7XG4vKipcbiAqIFNpbXBsZSBxdWV1ZSBzdHJ1Y3R1cmUuXG4gKlxuICogQXZvaWRzIHNjYWxhYmlsaXR5IGlzc3VlcyB3aXRoIHVzaW5nIGEgcGFja2VkIGFycmF5IGRpcmVjdGx5IGJ5IHVzaW5nXG4gKiBtdWx0aXBsZSBhcnJheXMgaW4gYSBsaW5rZWQgbGlzdCBhbmQga2VlcGluZyB0aGUgYXJyYXkgc2l6ZSBib3VuZGVkLlxuICovXG5jbGFzcyBTaW1wbGVRdWV1ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICAvLyBfZnJvbnQgYW5kIF9iYWNrIGFyZSBhbHdheXMgZGVmaW5lZC5cbiAgICAgICAgdGhpcy5fZnJvbnQgPSB7XG4gICAgICAgICAgICBfZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgX25leHQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iYWNrID0gdGhpcy5fZnJvbnQ7XG4gICAgICAgIC8vIFRoZSBjdXJzb3IgaXMgdXNlZCB0byBhdm9pZCBjYWxsaW5nIEFycmF5LnNoaWZ0KCkuXG4gICAgICAgIC8vIEl0IGNvbnRhaW5zIHRoZSBpbmRleCBvZiB0aGUgZnJvbnQgZWxlbWVudCBvZiB0aGUgYXJyYXkgaW5zaWRlIHRoZVxuICAgICAgICAvLyBmcm9udC1tb3N0IG5vZGUuIEl0IGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgWzAsIFFVRVVFX01BWF9BUlJBWV9TSVpFKS5cbiAgICAgICAgdGhpcy5fY3Vyc29yID0gMDtcbiAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBub2RlLCBzaXplID09PSBlbGVtZW50cy5sZW5ndGggLSBjdXJzb3IuXG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgLy8gRm9yIGV4Y2VwdGlvbiBzYWZldHksIHRoaXMgbWV0aG9kIGlzIHN0cnVjdHVyZWQgaW4gb3JkZXI6XG4gICAgLy8gMS4gUmVhZCBzdGF0ZVxuICAgIC8vIDIuIENhbGN1bGF0ZSByZXF1aXJlZCBzdGF0ZSBtdXRhdGlvbnNcbiAgICAvLyAzLiBQZXJmb3JtIHN0YXRlIG11dGF0aW9uc1xuICAgIHB1c2goZWxlbWVudCkge1xuICAgICAgICBjb25zdCBvbGRCYWNrID0gdGhpcy5fYmFjaztcbiAgICAgICAgbGV0IG5ld0JhY2sgPSBvbGRCYWNrO1xuICAgICAgICBpZiAob2xkQmFjay5fZWxlbWVudHMubGVuZ3RoID09PSBRVUVVRV9NQVhfQVJSQVlfU0laRSAtIDEpIHtcbiAgICAgICAgICAgIG5ld0JhY2sgPSB7XG4gICAgICAgICAgICAgICAgX2VsZW1lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBfbmV4dDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIHB1c2goKSBpcyB0aGUgbXV0YXRpb24gbW9zdCBsaWtlbHkgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBzbyBpdFxuICAgICAgICAvLyBnb2VzIGZpcnN0LlxuICAgICAgICBvbGRCYWNrLl9lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICBpZiAobmV3QmFjayAhPT0gb2xkQmFjaykge1xuICAgICAgICAgICAgdGhpcy5fYmFjayA9IG5ld0JhY2s7XG4gICAgICAgICAgICBvbGRCYWNrLl9uZXh0ID0gbmV3QmFjaztcbiAgICAgICAgfVxuICAgICAgICArK3RoaXMuX3NpemU7XG4gICAgfVxuICAgIC8vIExpa2UgcHVzaCgpLCBzaGlmdCgpIGZvbGxvd3MgdGhlIHJlYWQgLT4gY2FsY3VsYXRlIC0+IG11dGF0ZSBwYXR0ZXJuIGZvclxuICAgIC8vIGV4Y2VwdGlvbiBzYWZldHkuXG4gICAgc2hpZnQoKSB7IC8vIG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhbiBlbXB0eSBxdWV1ZVxuICAgICAgICBjb25zdCBvbGRGcm9udCA9IHRoaXMuX2Zyb250O1xuICAgICAgICBsZXQgbmV3RnJvbnQgPSBvbGRGcm9udDtcbiAgICAgICAgY29uc3Qgb2xkQ3Vyc29yID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICBsZXQgbmV3Q3Vyc29yID0gb2xkQ3Vyc29yICsgMTtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBvbGRGcm9udC5fZWxlbWVudHM7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tvbGRDdXJzb3JdO1xuICAgICAgICBpZiAobmV3Q3Vyc29yID09PSBRVUVVRV9NQVhfQVJSQVlfU0laRSkge1xuICAgICAgICAgICAgbmV3RnJvbnQgPSBvbGRGcm9udC5fbmV4dDtcbiAgICAgICAgICAgIG5ld0N1cnNvciA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gbXV0YXRpb25zIGJlZm9yZSB0aGlzIHBvaW50LlxuICAgICAgICAtLXRoaXMuX3NpemU7XG4gICAgICAgIHRoaXMuX2N1cnNvciA9IG5ld0N1cnNvcjtcbiAgICAgICAgaWYgKG9sZEZyb250ICE9PSBuZXdGcm9udCkge1xuICAgICAgICAgICAgdGhpcy5fZnJvbnQgPSBuZXdGcm9udDtcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJtaXQgc2hpZnRlZCBlbGVtZW50IHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgICAgICBlbGVtZW50c1tvbGRDdXJzb3JdID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgLy8gVGhlIHRyaWNreSB0aGluZyBhYm91dCBmb3JFYWNoKCkgaXMgdGhhdCBpdCBjYW4gYmUgY2FsbGVkXG4gICAgLy8gcmUtZW50cmFudGx5LiBUaGUgcXVldWUgbWF5IGJlIG11dGF0ZWQgaW5zaWRlIHRoZSBjYWxsYmFjay4gSXQgaXMgZWFzeSB0b1xuICAgIC8vIHNlZSB0aGF0IHB1c2goKSB3aXRoaW4gdGhlIGNhbGxiYWNrIGhhcyBubyBuZWdhdGl2ZSBlZmZlY3RzIHNpbmNlIHRoZSBlbmRcbiAgICAvLyBvZiB0aGUgcXVldWUgaXMgY2hlY2tlZCBmb3Igb24gZXZlcnkgaXRlcmF0aW9uLiBJZiBzaGlmdCgpIGlzIGNhbGxlZFxuICAgIC8vIHJlcGVhdGVkbHkgd2l0aGluIHRoZSBjYWxsYmFjayB0aGVuIHRoZSBuZXh0IGl0ZXJhdGlvbiBtYXkgcmV0dXJuIGFuXG4gICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuIEluIHRoaXMgY2FzZSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWRcbiAgICAvLyB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMgdW50aWwgd2UgZWl0aGVyIFwiY2F0Y2ggdXBcIiB3aXRoIGVsZW1lbnRzIHRoYXQgc3RpbGxcbiAgICAvLyBleGlzdCBvciByZWFjaCB0aGUgYmFjayBvZiB0aGUgcXVldWUuXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgICBsZXQgaSA9IHRoaXMuX2N1cnNvcjtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gbm9kZS5fZWxlbWVudHM7XG4gICAgICAgIHdoaWxlIChpICE9PSBlbGVtZW50cy5sZW5ndGggfHwgbm9kZS5fbmV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuX25leHQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMgPSBub2RlLl9lbGVtZW50cztcbiAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVsZW1lbnRzW2ldKTtcbiAgICAgICAgICAgICsraTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBpZiBzaGlmdCgpIHdhcyBjYWxsZWQgbm93LFxuICAgIC8vIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBxdWV1ZS5cbiAgICBwZWVrKCkgeyAvLyBtdXN0IG5vdCBiZSBjYWxsZWQgb24gYW4gZW1wdHkgcXVldWVcbiAgICAgICAgY29uc3QgZnJvbnQgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgY29uc3QgY3Vyc29yID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICByZXR1cm4gZnJvbnQuX2VsZW1lbnRzW2N1cnNvcl07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHJlYWRlciwgc3RyZWFtKSB7XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5fcmVhZGVyID0gcmVhZGVyO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHJlYWRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHJlYWRlciwgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxufVxuLy8gQSBjbGllbnQgb2YgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIGFuZCBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgbWF5IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgdG8gYnlwYXNzIHN0YXRlXG4vLyBjaGVjay5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbChyZWFkZXIsIHJlYXNvbikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbTtcbiAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpIHtcbiAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyZWFkZXIsIG5ldyBUeXBlRXJyb3IoYFJlYWRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzYCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCBuZXcgVHlwZUVycm9yKGBSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtJ3MgY2xvc2VkbmVzc2ApKTtcbiAgICB9XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID0gdW5kZWZpbmVkO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIHJlYWRlcnMuXG5mdW5jdGlvbiByZWFkZXJMb2NrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQ2Fubm90ICcgKyBuYW1lICsgJyBhIHN0cmVhbSB1c2luZyBhIHJlbGVhc2VkIHJlYWRlcicpO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpIHtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpO1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQocmVhZGVyKSB7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHJlYWRlcik7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcik7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyZWFkZXIsIHJlYXNvbikge1xuICAgIGlmIChyZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHJlYWRlci5fY2xvc2VkUHJvbWlzZSk7XG4gICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZChyZWFkZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQocmVhZGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcikge1xuICAgIGlmIChyZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCBBYm9ydFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbQWJvcnRTdGVwc11dJyk7XG5jb25zdCBFcnJvclN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbRXJyb3JTdGVwc11dJyk7XG5jb25zdCBDYW5jZWxTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0NhbmNlbFN0ZXBzXV0nKTtcbmNvbnN0IFB1bGxTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW1B1bGxTdGVwc11dJyk7XG5cbi8vLyA8cmVmZXJlbmNlIGxpYj1cImVzMjAxNS5jb3JlXCIgLz5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0Zpbml0ZSNQb2x5ZmlsbFxuY29uc3QgTnVtYmVySXNGaW5pdGUgPSBOdW1iZXIuaXNGaW5pdGUgfHwgZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInICYmIGlzRmluaXRlKHgpO1xufTtcblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC90cnVuYyNQb2x5ZmlsbFxuY29uc3QgTWF0aFRydW5jID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2IDwgMCA/IE1hdGguY2VpbCh2KSA6IE1hdGguZmxvb3Iodik7XG59O1xuXG4vLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtZGljdGlvbmFyaWVzXG5mdW5jdGlvbiBpc0RpY3Rpb25hcnkoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBhc3NlcnREaWN0aW9uYXJ5KG9iaiwgY29udGV4dCkge1xuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCAmJiAhaXNEaWN0aW9uYXJ5KG9iaikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYW4gb2JqZWN0LmApO1xuICAgIH1cbn1cbi8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC1jYWxsYmFjay1mdW5jdGlvbnNcbmZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uKHgsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIHggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYSBmdW5jdGlvbi5gKTtcbiAgICB9XG59XG4vLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtb2JqZWN0XG5mdW5jdGlvbiBpc09iamVjdCh4KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCkgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBhc3NlcnRPYmplY3QoeCwgY29udGV4dCkge1xuICAgIGlmICghaXNPYmplY3QoeCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYW4gb2JqZWN0LmApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoeCwgcG9zaXRpb24sIGNvbnRleHQpIHtcbiAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFBhcmFtZXRlciAke3Bvc2l0aW9ufSBpcyByZXF1aXJlZCBpbiAnJHtjb250ZXh0fScuYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0UmVxdWlyZWRGaWVsZCh4LCBmaWVsZCwgY29udGV4dCkge1xuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtmaWVsZH0gaXMgcmVxdWlyZWQgaW4gJyR7Y29udGV4dH0nLmApO1xuICAgIH1cbn1cbi8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC11bnJlc3RyaWN0ZWQtZG91YmxlXG5mdW5jdGlvbiBjb252ZXJ0VW5yZXN0cmljdGVkRG91YmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG59XG5mdW5jdGlvbiBjZW5zb3JOZWdhdGl2ZVplcm8oeCkge1xuICAgIHJldHVybiB4ID09PSAwID8gMCA6IHg7XG59XG5mdW5jdGlvbiBpbnRlZ2VyUGFydCh4KSB7XG4gICAgcmV0dXJuIGNlbnNvck5lZ2F0aXZlWmVybyhNYXRoVHJ1bmMoeCkpO1xufVxuLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jaWRsLXVuc2lnbmVkLWxvbmctbG9uZ1xuZnVuY3Rpb24gY29udmVydFVuc2lnbmVkTG9uZ0xvbmdXaXRoRW5mb3JjZVJhbmdlKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgbG93ZXJCb3VuZCA9IDA7XG4gICAgY29uc3QgdXBwZXJCb3VuZCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIGxldCB4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICB4ID0gY2Vuc29yTmVnYXRpdmVaZXJvKHgpO1xuICAgIGlmICghTnVtYmVySXNGaW5pdGUoeCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyYCk7XG4gICAgfVxuICAgIHggPSBpbnRlZ2VyUGFydCh4KTtcbiAgICBpZiAoeCA8IGxvd2VyQm91bmQgfHwgeCA+IHVwcGVyQm91bmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBvdXRzaWRlIHRoZSBhY2NlcHRlZCByYW5nZSBvZiAke2xvd2VyQm91bmR9IHRvICR7dXBwZXJCb3VuZH0sIGluY2x1c2l2ZWApO1xuICAgIH1cbiAgICBpZiAoIU51bWJlcklzRmluaXRlKHgpIHx8IHggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vIFRPRE8gVXNlIEJpZ0ludCBpZiBzdXBwb3J0ZWQ/XG4gICAgLy8gbGV0IHhCaWdJbnQgPSBCaWdJbnQoaW50ZWdlclBhcnQoeCkpO1xuICAgIC8vIHhCaWdJbnQgPSBCaWdJbnQuYXNVaW50Tig2NCwgeEJpZ0ludCk7XG4gICAgLy8gcmV0dXJuIE51bWJlcih4QmlnSW50KTtcbiAgICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVhZGFibGVTdHJlYW0oeCwgY29udGV4dCkge1xuICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhIFJlYWRhYmxlU3RyZWFtLmApO1xuICAgIH1cbn1cblxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pIHtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pO1xufVxuLy8gUmVhZGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0sIHJlYWRSZXF1ZXN0KSB7XG4gICAgc3RyZWFtLl9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5wdXNoKHJlYWRSZXF1ZXN0KTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBjb25zdCByZWFkUmVxdWVzdCA9IHJlYWRlci5fcmVhZFJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgICAgcmVhZFJlcXVlc3QuX2Nsb3NlU3RlcHMoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlYWRSZXF1ZXN0Ll9jaHVua1N0ZXBzKGNodW5rKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pIHtcbiAgICByZXR1cm4gc3RyZWFtLl9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5sZW5ndGg7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSB7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIEEgZGVmYXVsdCByZWFkZXIgdmVuZGVkIGJ5IGEge0BsaW5rIFJlYWRhYmxlU3RyZWFtfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoc3RyZWFtLCAxLCAnUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyJyk7XG4gICAgICAgIGFzc2VydFJlYWRhYmxlU3RyZWFtKHN0cmVhbSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHJlYWRpbmcgYnkgYW5vdGhlciByZWFkZXInKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgIHRoaXMuX3JlYWRSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIHN0cmVhbSBiZWNvbWVzIGNsb3NlZCxcbiAgICAgKiBvciByZWplY3RlZCBpZiB0aGUgc3RyZWFtIGV2ZXIgZXJyb3JzIG9yIHRoZSByZWFkZXIncyBsb2NrIGlzIHJlbGVhc2VkIGJlZm9yZSB0aGUgc3RyZWFtIGZpbmlzaGVzIGNsb3NpbmcuXG4gICAgICovXG4gICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlYWRlciBpcyBhY3RpdmUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMge0BsaW5rIFJlYWRhYmxlU3RyZWFtLmNhbmNlbCB8IHN0cmVhbS5jYW5jZWwocmVhc29uKX0uXG4gICAgICovXG4gICAgY2FuY2VsKHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2FuY2VsJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgbmV4dCBjaHVuayBmcm9tIHRoZSBzdHJlYW0ncyBpbnRlcm5hbCBxdWV1ZSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogSWYgcmVhZGluZyBhIGNodW5rIGNhdXNlcyB0aGUgcXVldWUgdG8gYmVjb21lIGVtcHR5LCBtb3JlIGRhdGEgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgdW5kZXJseWluZyBzb3VyY2UuXG4gICAgICovXG4gICAgcmVhZCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigncmVhZCBmcm9tJykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlUHJvbWlzZTtcbiAgICAgICAgbGV0IHJlamVjdFByb21pc2U7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlamVjdFByb21pc2UgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZWFkUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSksXG4gICAgICAgICAgICBfY2xvc2VTdGVwczogKCkgPT4gcmVzb2x2ZVByb21pc2UoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pLFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6IGUgPT4gcmVqZWN0UHJvbWlzZShlKVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHRoaXMsIHJlYWRSZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSByZWFkZXIncyBsb2NrIG9uIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbS4gQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZWFkZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS5cbiAgICAgKiBJZiB0aGUgYXNzb2NpYXRlZCBzdHJlYW0gaXMgZXJyb3JlZCB3aGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmVhZGVyIHdpbGwgYXBwZWFyIGVycm9yZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICogZnJvbSBub3cgb247IG90aGVyd2lzZSwgdGhlIHJlYWRlciB3aWxsIGFwcGVhciBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBBIHJlYWRlcidzIGxvY2sgY2Fubm90IGJlIHJlbGVhc2VkIHdoaWxlIGl0IHN0aWxsIGhhcyBhIHBlbmRpbmcgcmVhZCByZXF1ZXN0LCBpLmUuLCBpZiBhIHByb21pc2UgcmV0dXJuZWQgYnlcbiAgICAgKiB0aGUgcmVhZGVyJ3Mge0BsaW5rIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5yZWFkIHwgcmVhZCgpfSBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBzZXR0bGVkLiBBdHRlbXB0aW5nIHRvXG4gICAgICogZG8gc28gd2lsbCB0aHJvdyBhIGBUeXBlRXJyb3JgIGFuZCBsZWF2ZSB0aGUgcmVhZGVyIGxvY2tlZCB0byB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIHJlbGVhc2VMb2NrKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlYWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UodGhpcyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZSwge1xuICAgIGNhbmNlbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVhZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVsZWFzZUxvY2s6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGNsb3NlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSByZWFkZXJzLlxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19yZWFkUmVxdWVzdHMnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIsIHJlYWRSZXF1ZXN0KSB7XG4gICAgY29uc3Qgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmVhZFJlcXVlc3QuX2Nsb3NlU3RlcHMoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJlYWRSZXF1ZXN0Ll9lcnJvclN0ZXBzKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXJbUHVsbFN0ZXBzXShyZWFkUmVxdWVzdCk7XG4gICAgfVxufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJgKTtcbn1cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE4LmFzeW5jaXRlcmFibGVcIiAvPlxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICovXG5jb25zdCBBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbiogKCkgeyB9KS5wcm90b3R5cGUpO1xuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTguYXN5bmNpdGVyYWJsZVwiIC8+XG5jbGFzcyBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkZXIsIHByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgdGhpcy5fb25nb2luZ1Byb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2lzRmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gcmVhZGVyO1xuICAgICAgICB0aGlzLl9wcmV2ZW50Q2FuY2VsID0gcHJldmVudENhbmNlbDtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgbmV4dFN0ZXBzID0gKCkgPT4gdGhpcy5fbmV4dFN0ZXBzKCk7XG4gICAgICAgIHRoaXMuX29uZ29pbmdQcm9taXNlID0gdGhpcy5fb25nb2luZ1Byb21pc2UgP1xuICAgICAgICAgICAgdHJhbnNmb3JtUHJvbWlzZVdpdGgodGhpcy5fb25nb2luZ1Byb21pc2UsIG5leHRTdGVwcywgbmV4dFN0ZXBzKSA6XG4gICAgICAgICAgICBuZXh0U3RlcHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uZ29pbmdQcm9taXNlO1xuICAgIH1cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmV0dXJuU3RlcHMgPSAoKSA9PiB0aGlzLl9yZXR1cm5TdGVwcyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbmdvaW5nUHJvbWlzZSA/XG4gICAgICAgICAgICB0cmFuc2Zvcm1Qcm9taXNlV2l0aCh0aGlzLl9vbmdvaW5nUHJvbWlzZSwgcmV0dXJuU3RlcHMsIHJldHVyblN0ZXBzKSA6XG4gICAgICAgICAgICByZXR1cm5TdGVwcygpO1xuICAgIH1cbiAgICBfbmV4dFN0ZXBzKCkge1xuICAgICAgICBpZiAodGhpcy5faXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGVyID0gdGhpcy5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2l0ZXJhdGUnKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVQcm9taXNlO1xuICAgICAgICBsZXQgcmVqZWN0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlYWRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbmdvaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlbGF5ZWQgYnkgb25lIG1pY3JvdGFzaywgb3RoZXJ3aXNlIHdlIHN0b3AgcHVsbGluZyB0b28gZWFybHkgd2hpY2ggYnJlYWtzIGEgdGVzdC5cbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBJcyB0aGlzIGEgYnVnIGluIHRoZSBzcGVjaWZpY2F0aW9uLCBvciBpbiB0aGUgdGVzdD9cbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9jbG9zZVN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25nb2luZ1Byb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfZXJyb3JTdGVwczogcmVhc29uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbmdvaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICAgICAgcmVqZWN0UHJvbWlzZShyZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwgcmVhZFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgX3JldHVyblN0ZXBzKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWUsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHRoaXMuX3JlYWRlcjtcbiAgICAgICAgaWYgKHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdmaW5pc2ggaXRlcmF0aW5nJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fcHJldmVudENhbmNlbCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHJlYWRlciwgdmFsdWUpO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKHJlc3VsdCwgKCkgPT4gKHsgdmFsdWUsIGRvbmU6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UocmVhZGVyKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoeyB2YWx1ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICB9XG59XG5jb25zdCBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSB7XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24oJ25leHQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jSXRlcmF0b3JJbXBsLm5leHQoKTtcbiAgICB9LFxuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbigncmV0dXJuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hc3luY0l0ZXJhdG9ySW1wbC5yZXR1cm4odmFsdWUpO1xuICAgIH1cbn07XG5pZiAoQXN5bmNJdGVyYXRvclByb3RvdHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG5mdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgcHJldmVudENhbmNlbCkge1xuICAgIGNvbnN0IHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICBjb25zdCBpbXBsID0gbmV3IFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGwocmVhZGVyLCBwcmV2ZW50Q2FuY2VsKTtcbiAgICBjb25zdCBpdGVyYXRvciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICBpdGVyYXRvci5fYXN5bmNJdGVyYXRvckltcGwgPSBpbXBsO1xuICAgIHJldHVybiBpdGVyYXRvcjtcbn1cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYXN5bmNJdGVyYXRvckltcGwnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBTdXNwaWNpb3VzVHlwZU9mR3VhcmRcbiAgICAgICAgcmV0dXJuIHguX2FzeW5jSXRlcmF0b3JJbXBsIGluc3RhbmNlb2ZcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGw7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdGVhbUFzeW5jSXRlcmF0b3JgKTtcbn1cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTnVtYmVyL2lzTmFOI1BvbHlmaWxsXG5jb25zdCBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoeCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4geCAhPT0geDtcbn07XG5cbmZ1bmN0aW9uIENyZWF0ZUFycmF5RnJvbUxpc3QoZWxlbWVudHMpIHtcbiAgICAvLyBXZSB1c2UgYXJyYXlzIHRvIHJlcHJlc2VudCBsaXN0cywgc28gdGhpcyBpcyBiYXNpY2FsbHkgYSBuby1vcC5cbiAgICAvLyBEbyBhIHNsaWNlIHRob3VnaCBqdXN0IGluIGNhc2Ugd2UgaGFwcGVuIHRvIGRlcGVuZCBvbiB0aGUgdW5pcXVlLW5lc3MuXG4gICAgcmV0dXJuIGVsZW1lbnRzLnNsaWNlKCk7XG59XG5mdW5jdGlvbiBDb3B5RGF0YUJsb2NrQnl0ZXMoZGVzdCwgZGVzdE9mZnNldCwgc3JjLCBzcmNPZmZzZXQsIG4pIHtcbiAgICBuZXcgVWludDhBcnJheShkZXN0KS5zZXQobmV3IFVpbnQ4QXJyYXkoc3JjLCBzcmNPZmZzZXQsIG4pLCBkZXN0T2Zmc2V0KTtcbn1cbi8vIE5vdCBpbXBsZW1lbnRlZCBjb3JyZWN0bHlcbmZ1bmN0aW9uIFRyYW5zZmVyQXJyYXlCdWZmZXIoTykge1xuICAgIHJldHVybiBPO1xufVxuLy8gTm90IGltcGxlbWVudGVkIGNvcnJlY3RseVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gSXNEZXRhY2hlZEJ1ZmZlcihPKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gQXJyYXlCdWZmZXJTbGljZShidWZmZXIsIGJlZ2luLCBlbmQpIHtcbiAgICAvLyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgaXMgbm90IGF2YWlsYWJsZSBvbiBJRTEwXG4gICAgLy8gaHR0cHM6Ly93d3cuY2FuaXVzZS5jb20vbWRuLWphdmFzY3JpcHRfYnVpbHRpbnNfYXJyYXlidWZmZXJfc2xpY2VcbiAgICBpZiAoYnVmZmVyLnNsaWNlKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoYmVnaW4sIGVuZCk7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IGVuZCAtIGJlZ2luO1xuICAgIGNvbnN0IHNsaWNlID0gbmV3IEFycmF5QnVmZmVyKGxlbmd0aCk7XG4gICAgQ29weURhdGFCbG9ja0J5dGVzKHNsaWNlLCAwLCBidWZmZXIsIGJlZ2luLCBsZW5ndGgpO1xuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gSXNOb25OZWdhdGl2ZU51bWJlcih2KSB7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChOdW1iZXJJc05hTih2KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gQ2xvbmVBc1VpbnQ4QXJyYXkoTykge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEFycmF5QnVmZmVyU2xpY2UoTy5idWZmZXIsIE8uYnl0ZU9mZnNldCwgTy5ieXRlT2Zmc2V0ICsgTy5ieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gRGVxdWV1ZVZhbHVlKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IHBhaXIgPSBjb250YWluZXIuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSAtPSBwYWlyLnNpemU7XG4gICAgaWYgKGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPCAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gcGFpci52YWx1ZTtcbn1cbmZ1bmN0aW9uIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRhaW5lciwgdmFsdWUsIHNpemUpIHtcbiAgICBpZiAoIUlzTm9uTmVnYXRpdmVOdW1iZXIoc2l6ZSkgfHwgc2l6ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1NpemUgbXVzdCBiZSBhIGZpbml0ZSwgbm9uLU5hTiwgbm9uLW5lZ2F0aXZlIG51bWJlci4nKTtcbiAgICB9XG4gICAgY29udGFpbmVyLl9xdWV1ZS5wdXNoKHsgdmFsdWUsIHNpemUgfSk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSArPSBzaXplO1xufVxuZnVuY3Rpb24gUGVla1F1ZXVlVmFsdWUoY29udGFpbmVyKSB7XG4gICAgY29uc3QgcGFpciA9IGNvbnRhaW5lci5fcXVldWUucGVlaygpO1xuICAgIHJldHVybiBwYWlyLnZhbHVlO1xufVxuZnVuY3Rpb24gUmVzZXRRdWV1ZShjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuX3F1ZXVlID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA9IDA7XG59XG5cbi8qKlxuICogQSBwdWxsLWludG8gcmVxdWVzdCBpbiBhIHtAbGluayBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZpZXcgZm9yIHdyaXRpbmcgaW4gdG8sIG9yIGBudWxsYCBpZiB0aGUgQllPQiByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gcmVzcG9uZGVkIHRvLlxuICAgICAqL1xuICAgIGdldCB2aWV3KCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKCd2aWV3Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXc7XG4gICAgfVxuICAgIHJlc3BvbmQoYnl0ZXNXcml0dGVuKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Jlc3BvbmQnKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KGJ5dGVzV3JpdHRlbiwgMSwgJ3Jlc3BvbmQnKTtcbiAgICAgICAgYnl0ZXNXcml0dGVuID0gY29udmVydFVuc2lnbmVkTG9uZ0xvbmdXaXRoRW5mb3JjZVJhbmdlKGJ5dGVzV3JpdHRlbiwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih0aGlzLl92aWV3LmJ1ZmZlcikpIDtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbik7XG4gICAgfVxuICAgIHJlc3BvbmRXaXRoTmV3Vmlldyh2aWV3KSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Jlc3BvbmRXaXRoTmV3VmlldycpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQodmlldywgMSwgJ3Jlc3BvbmRXaXRoTmV3VmlldycpO1xuICAgICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyh2aWV3KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IGNhbiBvbmx5IHJlc3BvbmQgd2l0aCBhcnJheSBidWZmZXIgdmlld3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih2aWV3LmJ1ZmZlcikpIDtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3Vmlldyh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciwgdmlldyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUsIHtcbiAgICByZXNwb25kOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICByZXNwb25kV2l0aE5ld1ZpZXc6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHZpZXc6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QnLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8qKlxuICogQWxsb3dzIGNvbnRyb2wgb2YgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW0gfCByZWFkYWJsZSBieXRlIHN0cmVhbX0ncyBzdGF0ZSBhbmQgaW50ZXJuYWwgcXVldWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEJZT0IgcHVsbCByZXF1ZXN0LCBvciBgbnVsbGAgaWYgdGhlcmUgaXNuJ3Qgb25lLlxuICAgICAqL1xuICAgIGdldCBieW9iUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignYnlvYlJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIHNpemUgdG8gZmlsbCB0aGUgY29udHJvbGxlZCBzdHJlYW0ncyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXNcbiAgICAgKiBvdmVyLWZ1bGwuIEFuIHVuZGVybHlpbmcgYnl0ZSBzb3VyY2Ugb3VnaHQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gYW5kIGhvdyB0byBhcHBseSBiYWNrcHJlc3N1cmUuXG4gICAgICovXG4gICAgZ2V0IGRlc2lyZWRTaXplKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdkZXNpcmVkU2l6ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29udHJvbGxlZCByZWFkYWJsZSBzdHJlYW0uIENvbnN1bWVycyB3aWxsIHN0aWxsIGJlIGFibGUgdG8gcmVhZCBhbnkgcHJldmlvdXNseS1lbnF1ZXVlZCBjaHVua3MgZnJvbVxuICAgICAqIHRoZSBzdHJlYW0sIGJ1dCBvbmNlIHRob3NlIGFyZSByZWFkLCB0aGUgc3RyZWFtIHdpbGwgYmVjb21lIGNsb3NlZC5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQ7IGRvIG5vdCBjbG9zZSBpdCBhZ2FpbiEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBzdHJlYW0gKGluICR7c3RhdGV9IHN0YXRlKSBpcyBub3QgaW4gdGhlIHJlYWRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkYCk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlKHRoaXMpO1xuICAgIH1cbiAgICBlbnF1ZXVlKGNodW5rKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2VucXVldWUnKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KGNodW5rLCAxLCAnZW5xdWV1ZScpO1xuICAgICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyhjaHVuaykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NodW5rIG11c3QgYmUgYW4gYXJyYXkgYnVmZmVyIHZpZXcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2h1bmsuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2h1bmsgbXVzdCBoYXZlIG5vbi16ZXJvIGJ5dGVMZW5ndGgnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2h1bmsuYnVmZmVyLmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGNodW5rJ3MgYnVmZmVyIG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgc3RyZWFtIChpbiAke3N0YXRlfSBzdGF0ZSkgaXMgbm90IGluIHRoZSByZWFkYWJsZSBzdGF0ZSBhbmQgY2Fubm90IGJlIGVucXVldWVkIHRvYCk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUodGhpcywgY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFcnJvcnMgdGhlIGNvbnRyb2xsZWQgcmVhZGFibGUgc3RyZWFtLCBtYWtpbmcgYWxsIGZ1dHVyZSBpbnRlcmFjdGlvbnMgd2l0aCBpdCBmYWlsIHdpdGggdGhlIGdpdmVuIGVycm9yIGBlYC5cbiAgICAgKi9cbiAgICBlcnJvcihlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKHRoaXMsIGUpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgW0NhbmNlbFN0ZXBzXShyZWFzb24pIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyh0aGlzKTtcbiAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbUHVsbFN0ZXBzXShyZWFkUmVxdWVzdCkge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAodGhpcy5fcXVldWVUb3RhbFNpemUgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZVRvdGFsU2l6ZSAtPSBlbnRyeS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4odGhpcyk7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW50cnkuYnVmZmVyLCBlbnRyeS5ieXRlT2Zmc2V0LCBlbnRyeS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIHJlYWRSZXF1ZXN0Ll9jaHVua1N0ZXBzKHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHRoaXMuX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICAgICAgaWYgKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYnVmZmVyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChidWZmZXJFKSB7XG4gICAgICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2Vycm9yU3RlcHMoYnVmZmVyRSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHVsbEludG9EZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgICBidWZmZXJCeXRlTGVuZ3RoOiBhdXRvQWxsb2NhdGVDaHVua1NpemUsXG4gICAgICAgICAgICAgICAgYnl0ZU9mZnNldDogMCxcbiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiBhdXRvQWxsb2NhdGVDaHVua1NpemUsXG4gICAgICAgICAgICAgICAgYnl0ZXNGaWxsZWQ6IDAsXG4gICAgICAgICAgICAgICAgZWxlbWVudFNpemU6IDEsXG4gICAgICAgICAgICAgICAgdmlld0NvbnN0cnVjdG9yOiBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgIHJlYWRlclR5cGU6ICdkZWZhdWx0J1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdQdWxsSW50b3MucHVzaChwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtLCByZWFkUmVxdWVzdCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgY2xvc2U6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVucXVldWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVycm9yOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBieW9iUmVxdWVzdDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZGVzaXJlZFNpemU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLlxuZnVuY3Rpb24gSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyO1xufVxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzaG91bGRQdWxsID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpO1xuICAgIGlmICghc2hvdWxkUHVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9wdWxsaW5nKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udHJvbGxlci5fcHVsbGluZyA9IHRydWU7XG4gICAgLy8gVE9ETzogVGVzdCBjb250cm9sbGVyIGFyZ3VtZW50XG4gICAgY29uc3QgcHVsbFByb21pc2UgPSBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHVsbFByb21pc2UsICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoY29udHJvbGxlci5fcHVsbEFnYWluKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgfSwgZSA9PiB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcikge1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcihzdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcikge1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBmaWxsZWRWaWV3ID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICBpZiAocHVsbEludG9EZXNjcmlwdG9yLnJlYWRlclR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGZpbGxlZFZpZXcsIGRvbmUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgZmlsbGVkVmlldywgZG9uZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgY29uc3QgYnl0ZXNGaWxsZWQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQ7XG4gICAgY29uc3QgZWxlbWVudFNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgcmV0dXJuIG5ldyBwdWxsSW50b0Rlc2NyaXB0b3Iudmlld0NvbnN0cnVjdG9yKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0LCBieXRlc0ZpbGxlZCAvIGVsZW1lbnRTaXplKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgIGNvbnRyb2xsZXIuX3F1ZXVlLnB1c2goeyBidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGggfSk7XG4gICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgKz0gYnl0ZUxlbmd0aDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikge1xuICAgIGNvbnN0IGVsZW1lbnRTaXplID0gcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplO1xuICAgIGNvbnN0IGN1cnJlbnRBbGlnbmVkQnl0ZXMgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBlbGVtZW50U2l6ZTtcbiAgICBjb25zdCBtYXhCeXRlc1RvQ29weSA9IE1hdGgubWluKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZUxlbmd0aCAtIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCk7XG4gICAgY29uc3QgbWF4Qnl0ZXNGaWxsZWQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKyBtYXhCeXRlc1RvQ29weTtcbiAgICBjb25zdCBtYXhBbGlnbmVkQnl0ZXMgPSBtYXhCeXRlc0ZpbGxlZCAtIG1heEJ5dGVzRmlsbGVkICUgZWxlbWVudFNpemU7XG4gICAgbGV0IHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPSBtYXhCeXRlc1RvQ29weTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICBpZiAobWF4QWxpZ25lZEJ5dGVzID4gY3VycmVudEFsaWduZWRCeXRlcykge1xuICAgICAgICB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nID0gbWF4QWxpZ25lZEJ5dGVzIC0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICByZWFkeSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXVlID0gY29udHJvbGxlci5fcXVldWU7XG4gICAgd2hpbGUgKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPiAwKSB7XG4gICAgICAgIGNvbnN0IGhlYWRPZlF1ZXVlID0gcXVldWUucGVlaygpO1xuICAgICAgICBjb25zdCBieXRlc1RvQ29weSA9IE1hdGgubWluKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcsIGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCBkZXN0U3RhcnQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCArIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgQ29weURhdGFCbG9ja0J5dGVzKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIGRlc3RTdGFydCwgaGVhZE9mUXVldWUuYnVmZmVyLCBoZWFkT2ZRdWV1ZS5ieXRlT2Zmc2V0LCBieXRlc1RvQ29weSk7XG4gICAgICAgIGlmIChoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoID09PSBieXRlc1RvQ29weSkge1xuICAgICAgICAgICAgcXVldWUuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRPZlF1ZXVlLmJ5dGVPZmZzZXQgKz0gYnl0ZXNUb0NvcHk7XG4gICAgICAgICAgICBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoIC09IGJ5dGVzVG9Db3B5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplIC09IGJ5dGVzVG9Db3B5O1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNUb0NvcHksIHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgLT0gYnl0ZXNUb0NvcHk7XG4gICAgfVxuICAgIHJldHVybiByZWFkeTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLCBzaXplLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKz0gc2l6ZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDAgJiYgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcikge1xuICAgIGlmIChjb250cm9sbGVyLl9ieW9iUmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0Ll9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9ieW9iUmVxdWVzdC5fdmlldyA9IG51bGw7XG4gICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSBudWxsO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclByb2Nlc3NQdWxsSW50b0Rlc2NyaXB0b3JzVXNpbmdRdWV1ZShjb250cm9sbGVyKSB7XG4gICAgd2hpbGUgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdWxsSW50b0Rlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICAgICAgaWYgKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhjb250cm9sbGVyLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGxldCBlbGVtZW50U2l6ZSA9IDE7XG4gICAgaWYgKHZpZXcuY29uc3RydWN0b3IgIT09IERhdGFWaWV3KSB7XG4gICAgICAgIGVsZW1lbnRTaXplID0gdmlldy5jb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICB9XG4gICAgY29uc3QgY3RvciA9IHZpZXcuY29uc3RydWN0b3I7XG4gICAgLy8gdHJ5IHtcbiAgICBjb25zdCBidWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKTtcbiAgICAvLyB9IGNhdGNoIChlKSB7XG4gICAgLy8gICByZWFkSW50b1JlcXVlc3QuX2Vycm9yU3RlcHMoZSk7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIGNvbnN0IHB1bGxJbnRvRGVzY3JpcHRvciA9IHtcbiAgICAgICAgYnVmZmVyLFxuICAgICAgICBidWZmZXJCeXRlTGVuZ3RoOiBidWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgYnl0ZU9mZnNldDogdmlldy5ieXRlT2Zmc2V0LFxuICAgICAgICBieXRlTGVuZ3RoOiB2aWV3LmJ5dGVMZW5ndGgsXG4gICAgICAgIGJ5dGVzRmlsbGVkOiAwLFxuICAgICAgICBlbGVtZW50U2l6ZSxcbiAgICAgICAgdmlld0NvbnN0cnVjdG9yOiBjdG9yLFxuICAgICAgICByZWFkZXJUeXBlOiAnYnlvYidcbiAgICB9O1xuICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIC8vIE5vIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKCkgY2FsbCBzaW5jZTpcbiAgICAgICAgLy8gLSBObyBjaGFuZ2UgaGFwcGVucyBvbiBkZXNpcmVkU2l6ZVxuICAgICAgICAvLyAtIFRoZSBzb3VyY2UgaGFzIGFscmVhZHkgYmVlbiBub3RpZmllZCBvZiB0aGF0IHRoZXJlJ3MgYXQgbGVhc3QgMSBwZW5kaW5nIHJlYWQodmlldylcbiAgICAgICAgUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtLCByZWFkSW50b1JlcXVlc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBjb25zdCBlbXB0eVZpZXcgPSBuZXcgY3RvcihwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCwgMCk7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fY2xvc2VTdGVwcyhlbXB0eVZpZXcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgaWYgKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGxlZFZpZXcgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4oY29udHJvbGxlcik7XG4gICAgICAgICAgICByZWFkSW50b1JlcXVlc3QuX2NodW5rU3RlcHMoZmlsbGVkVmlldyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgICAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9lcnJvclN0ZXBzKGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucHVzaChwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgcmVhZEludG9SZXF1ZXN0KTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0JZT0JSZWFkZXIoc3RyZWFtKSkge1xuICAgICAgICB3aGlsZSAoUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwdWxsSW50b0Rlc2NyaXB0b3IgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcik7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKHN0cmVhbSwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICBpZiAocHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkIDwgcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHJlbWFpbmRlclNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgaWYgKHJlbWFpbmRlclNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICBjb25zdCByZW1haW5kZXIgPSBBcnJheUJ1ZmZlclNsaWNlKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIGVuZCAtIHJlbWFpbmRlclNpemUsIGVuZCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHJlbWFpbmRlciwgMCwgcmVtYWluZGVyLmJ5dGVMZW5ndGgpO1xuICAgIH1cbiAgICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLT0gcmVtYWluZGVyU2l6ZTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclByb2Nlc3NQdWxsSW50b0Rlc2NyaXB0b3JzVXNpbmdRdWV1ZShjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKSB7XG4gICAgY29uc3QgZmlyc3REZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBmaXJzdERlc2NyaXB0b3IpO1xuICAgIH1cbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3Muc2hpZnQoKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghY29udHJvbGxlci5fc3RhcnRlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZGVzaXJlZFNpemUgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcik7XG4gICAgaWYgKGRlc2lyZWRTaXplID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9jYW5jZWxBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG59XG4vLyBBIGNsaWVudCBvZiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICBpZiAoY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgfHwgc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlyc3RQZW5kaW5nUHVsbEludG8gPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICAgICAgaWYgKGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ5dGVzRmlsbGVkID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBUeXBlRXJyb3IoJ0luc3VmZmljaWVudCBieXRlcyB0byBmaWxsIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBidWZmZXInKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkIHx8IHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBjaHVuay5idWZmZXI7XG4gICAgY29uc3QgYnl0ZU9mZnNldCA9IGNodW5rLmJ5dGVPZmZzZXQ7XG4gICAgY29uc3QgYnl0ZUxlbmd0aCA9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgY29uc3QgdHJhbnNmZXJyZWRCdWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKGJ1ZmZlcik7XG4gICAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdFBlbmRpbmdQdWxsSW50byA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcihmaXJzdFBlbmRpbmdQdWxsSW50by5idWZmZXIpKSA7XG4gICAgICAgIGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3RQZW5kaW5nUHVsbEludG8uYnVmZmVyKTtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICBpZiAoUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyKHN0cmVhbSkpIHtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPT09IDApIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVycmVkVmlldyA9IG5ldyBVaW50OEFycmF5KHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgdHJhbnNmZXJyZWRWaWV3LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkpIHtcbiAgICAgICAgLy8gVE9ETzogSWRlYWxseSBpbiB0aGlzIGJyYW5jaCBkZXRhY2hpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IGlmIHRoZSBidWZmZXIgaXMgbm90IGNvbnN1bWVkIGZ1bGx5LlxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyhjb250cm9sbGVyKTtcbiAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPT09IG51bGwgJiYgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciwgZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQsIGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTtcbiAgICAgICAgY29uc3QgYnlvYlJlcXVlc3QgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlKTtcbiAgICAgICAgU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KGJ5b2JSZXF1ZXN0LCBjb250cm9sbGVyLCB2aWV3KTtcbiAgICAgICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSBieW9iUmVxdWVzdDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0O1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbikge1xuICAgIGNvbnN0IGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBpZiAoYnl0ZXNXcml0dGVuICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdieXRlc1dyaXR0ZW4gbXVzdCBiZSAwIHdoZW4gY2FsbGluZyByZXNwb25kKCkgb24gYSBjbG9zZWQgc3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChieXRlc1dyaXR0ZW4gPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J5dGVzV3JpdHRlbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIHdoZW4gY2FsbGluZyByZXNwb25kKCkgb24gYSByZWFkYWJsZSBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgYnl0ZXNXcml0dGVuID4gZmlyc3REZXNjcmlwdG9yLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdieXRlc1dyaXR0ZW4gb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlcik7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbChjb250cm9sbGVyLCBieXRlc1dyaXR0ZW4pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3Vmlldyhjb250cm9sbGVyLCB2aWV3KSB7XG4gICAgY29uc3QgZmlyc3REZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIGlmICh2aWV3LmJ5dGVMZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2aWV3XFwncyBsZW5ndGggbXVzdCBiZSAwIHdoZW4gY2FsbGluZyByZXNwb25kV2l0aE5ld1ZpZXcoKSBvbiBhIGNsb3NlZCBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHZpZXcuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZpZXdcXCdzIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIHdoZW4gY2FsbGluZyByZXNwb25kV2l0aE5ld1ZpZXcoKSBvbiBhIHJlYWRhYmxlIHN0cmVhbScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChmaXJzdERlc2NyaXB0b3IuYnl0ZU9mZnNldCArIGZpcnN0RGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAhPT0gdmlldy5ieXRlT2Zmc2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgcmVnaW9uIHNwZWNpZmllZCBieSB2aWV3IGRvZXMgbm90IG1hdGNoIGJ5b2JSZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGlmIChmaXJzdERlc2NyaXB0b3IuYnVmZmVyQnl0ZUxlbmd0aCAhPT0gdmlldy5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGJ1ZmZlciBvZiB2aWV3IGhhcyBkaWZmZXJlbnQgY2FwYWNpdHkgdGhhbiBieW9iUmVxdWVzdCcpO1xuICAgIH1cbiAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgdmlldy5ieXRlTGVuZ3RoID4gZmlyc3REZXNjcmlwdG9yLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSByZWdpb24gc3BlY2lmaWVkIGJ5IHZpZXcgaXMgbGFyZ2VyIHRoYW4gYnlvYlJlcXVlc3QnKTtcbiAgICB9XG4gICAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIodmlldy5idWZmZXIpO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgdmlldy5ieXRlTGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSkge1xuICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0gPSBzdHJlYW07XG4gICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID0gbnVsbDtcbiAgICAvLyBOZWVkIHRvIHNldCB0aGUgc2xvdHMgc28gdGhhdCB0aGUgYXNzZXJ0IGRvZXNuJ3QgZmlyZS4gSW4gdGhlIHNwZWMgdGhlIHNsb3RzIGFscmVhZHkgZXhpc3QgaW1wbGljaXRseS5cbiAgICBjb250cm9sbGVyLl9xdWV1ZSA9IGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkO1xuICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lIV00gPSBoaWdoV2F0ZXJNYXJrO1xuICAgIGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0gPSBwdWxsQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9hdXRvQWxsb2NhdGVDaHVua1NpemUgPSBhdXRvQWxsb2NhdGVDaHVua1NpemU7XG4gICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICBjb25zdCBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH0sIHIgPT4ge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdCeXRlU291cmNlLCBoaWdoV2F0ZXJNYXJrKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIGxldCBzdGFydEFsZ29yaXRobSA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICBsZXQgcHVsbEFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBsZXQgY2FuY2VsQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ0J5dGVTb3VyY2Uuc3RhcnQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5wdWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHVsbEFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdCeXRlU291cmNlLnB1bGwoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5jYW5jZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYW5jZWxBbGdvcml0aG0gPSByZWFzb24gPT4gdW5kZXJseWluZ0J5dGVTb3VyY2UuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIGNvbnN0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHVuZGVybHlpbmdCeXRlU291cmNlLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICBpZiAoYXV0b0FsbG9jYXRlQ2h1bmtTaXplID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F1dG9BbGxvY2F0ZUNodW5rU2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuICAgIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSk7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QocmVxdWVzdCwgY29udHJvbGxlciwgdmlldykge1xuICAgIHJlcXVlc3QuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICByZXF1ZXN0Ll92aWV3ID0gdmlldztcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LlxuZnVuY3Rpb24gYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdGApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIuXG5mdW5jdGlvbiBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyYCk7XG59XG5cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbS5cbmZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtKTtcbn1cbi8vIFJlYWRhYmxlU3RyZWFtIEFQSSBleHBvc2VkIGZvciBjb250cm9sbGVycy5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgcmVhZEludG9SZXF1ZXN0KSB7XG4gICAgc3RyZWFtLl9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMucHVzaChyZWFkSW50b1JlcXVlc3QpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBjb25zdCByZWFkSW50b1JlcXVlc3QgPSByZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMuc2hpZnQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgICByZWFkSW50b1JlcXVlc3QuX2Nsb3NlU3RlcHMoY2h1bmspO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9jaHVua1N0ZXBzKGNodW5rKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5fcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogQSBCWU9CIHJlYWRlciB2ZW5kZWQgYnkgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW19LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChzdHJlYW0sIDEsICdSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXInKTtcbiAgICAgICAgYXNzZXJ0UmVhZGFibGVTdHJlYW0oc3RyZWFtLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgcmVhZGluZyBieSBhbm90aGVyIHJlYWRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciBmb3IgYSBzdHJlYW0gbm90IGNvbnN0cnVjdGVkIHdpdGggYSBieXRlICcgK1xuICAgICAgICAgICAgICAgICdzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgIHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCB3aGVuIHRoZSBzdHJlYW0gYmVjb21lcyBjbG9zZWQsIG9yIHJlamVjdGVkIGlmIHRoZSBzdHJlYW0gZXZlciBlcnJvcnMgb3JcbiAgICAgKiB0aGUgcmVhZGVyJ3MgbG9jayBpcyByZWxlYXNlZCBiZWZvcmUgdGhlIHN0cmVhbSBmaW5pc2hlcyBjbG9zaW5nLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSByZWFkZXIgaXMgYWN0aXZlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAbGluayBSZWFkYWJsZVN0cmVhbS5jYW5jZWwgfCBzdHJlYW0uY2FuY2VsKHJlYXNvbil9LlxuICAgICAqL1xuICAgIGNhbmNlbChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdjYW5jZWwnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byByZWFkcyBieXRlcyBpbnRvIHZpZXcsIGFuZCByZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBJZiByZWFkaW5nIGEgY2h1bmsgY2F1c2VzIHRoZSBxdWV1ZSB0byBiZWNvbWUgZW1wdHksIG1vcmUgZGF0YSB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvdXJjZS5cbiAgICAgKi9cbiAgICByZWFkKHZpZXcpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ3ZpZXcgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlldy5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCd2aWV3IG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2aWV3LmJ1ZmZlci5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKGB2aWV3J3MgYnVmZmVyIG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoYCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHZpZXcuYnVmZmVyKSkgO1xuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdyZWFkIGZyb20nKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVQcm9taXNlO1xuICAgICAgICBsZXQgcmVqZWN0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlYWRJbnRvUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSksXG4gICAgICAgICAgICBfY2xvc2VTdGVwczogY2h1bmsgPT4gcmVzb2x2ZVByb21pc2UoeyB2YWx1ZTogY2h1bmssIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICBfZXJyb3JTdGVwczogZSA9PiByZWplY3RQcm9taXNlKGUpXG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQodGhpcywgdmlldywgcmVhZEludG9SZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSByZWFkZXIncyBsb2NrIG9uIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbS4gQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZWFkZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS5cbiAgICAgKiBJZiB0aGUgYXNzb2NpYXRlZCBzdHJlYW0gaXMgZXJyb3JlZCB3aGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmVhZGVyIHdpbGwgYXBwZWFyIGVycm9yZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICogZnJvbSBub3cgb247IG90aGVyd2lzZSwgdGhlIHJlYWRlciB3aWxsIGFwcGVhciBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBBIHJlYWRlcidzIGxvY2sgY2Fubm90IGJlIHJlbGVhc2VkIHdoaWxlIGl0IHN0aWxsIGhhcyBhIHBlbmRpbmcgcmVhZCByZXF1ZXN0LCBpLmUuLCBpZiBhIHByb21pc2UgcmV0dXJuZWQgYnlcbiAgICAgKiB0aGUgcmVhZGVyJ3Mge0BsaW5rIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5yZWFkIHwgcmVhZCgpfSBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBzZXR0bGVkLiBBdHRlbXB0aW5nIHRvXG4gICAgICogZG8gc28gd2lsbCB0aHJvdyBhIGBUeXBlRXJyb3JgIGFuZCBsZWF2ZSB0aGUgcmVhZGVyIGxvY2tlZCB0byB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIHJlbGVhc2VMb2NrKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUsIHtcbiAgICBjYW5jZWw6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlYWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlbGVhc2VMb2NrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBjbG9zZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgcmVhZGVycy5cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZEludG9SZXF1ZXN0cycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXI7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXJSZWFkKHJlYWRlciwgdmlldywgcmVhZEludG9SZXF1ZXN0KSB7XG4gICAgY29uc3Qgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fZXJyb3JTdGVwcyhzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmlldywgcmVhZEludG9SZXF1ZXN0KTtcbiAgICB9XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLlxuZnVuY3Rpb24gYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcmApO1xufVxuXG5mdW5jdGlvbiBFeHRyYWN0SGlnaFdhdGVyTWFyayhzdHJhdGVneSwgZGVmYXVsdEhXTSkge1xuICAgIGNvbnN0IHsgaGlnaFdhdGVyTWFyayB9ID0gc3RyYXRlZ3k7XG4gICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdEhXTTtcbiAgICB9XG4gICAgaWYgKE51bWJlcklzTmFOKGhpZ2hXYXRlck1hcmspIHx8IGhpZ2hXYXRlck1hcmsgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIGhpZ2hXYXRlck1hcmsnKTtcbiAgICB9XG4gICAgcmV0dXJuIGhpZ2hXYXRlck1hcms7XG59XG5mdW5jdGlvbiBFeHRyYWN0U2l6ZUFsZ29yaXRobShzdHJhdGVneSkge1xuICAgIGNvbnN0IHsgc2l6ZSB9ID0gc3RyYXRlZ3k7XG4gICAgaWYgKCFzaXplKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiAxO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cblxuZnVuY3Rpb24gY29udmVydFF1ZXVpbmdTdHJhdGVneShpbml0LCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShpbml0LCBjb250ZXh0KTtcbiAgICBjb25zdCBoaWdoV2F0ZXJNYXJrID0gaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LmhpZ2hXYXRlck1hcms7XG4gICAgY29uc3Qgc2l6ZSA9IGluaXQgPT09IG51bGwgfHwgaW5pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5pdC5zaXplO1xuICAgIHJldHVybiB7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRVbnJlc3RyaWN0ZWREb3VibGUoaGlnaFdhdGVyTWFyayksXG4gICAgICAgIHNpemU6IHNpemUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lTaXplKHNpemUsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3NpemUnIHRoYXRgKVxuICAgIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5U2l6ZShmbiwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gY2h1bmsgPT4gY29udmVydFVucmVzdHJpY3RlZERvdWJsZShmbihjaHVuaykpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VW5kZXJseWluZ1Npbmsob3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KG9yaWdpbmFsLCBjb250ZXh0KTtcbiAgICBjb25zdCBhYm9ydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5hYm9ydDtcbiAgICBjb25zdCBjbG9zZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5jbG9zZTtcbiAgICBjb25zdCBzdGFydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5zdGFydDtcbiAgICBjb25zdCB0eXBlID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnR5cGU7XG4gICAgY29uc3Qgd3JpdGUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwud3JpdGU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWJvcnQ6IGFib3J0ID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Fib3J0Q2FsbGJhY2soYWJvcnQsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdhYm9ydCcgdGhhdGApLFxuICAgICAgICBjbG9zZTogY2xvc2UgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTaW5rQ2xvc2VDYWxsYmFjayhjbG9zZSwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ2Nsb3NlJyB0aGF0YCksXG4gICAgICAgIHN0YXJ0OiBzdGFydCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5kZXJseWluZ1NpbmtTdGFydENhbGxiYWNrKHN0YXJ0LCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc3RhcnQnIHRoYXRgKSxcbiAgICAgICAgd3JpdGU6IHdyaXRlID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU2lua1dyaXRlQ2FsbGJhY2sod3JpdGUsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICd3cml0ZScgdGhhdGApLFxuICAgICAgICB0eXBlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Fib3J0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAocmVhc29uKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtyZWFzb25dKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Nsb3NlQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua1N0YXJ0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcmVmbGVjdENhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTaW5rV3JpdGVDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjaHVuaywgY29udHJvbGxlcikgPT4gcHJvbWlzZUNhbGwoZm4sIG9yaWdpbmFsLCBbY2h1bmssIGNvbnRyb2xsZXJdKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0V3JpdGFibGVTdHJlYW0oeCwgY29udGV4dCkge1xuICAgIGlmICghSXNXcml0YWJsZVN0cmVhbSh4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhIFdyaXRhYmxlU3RyZWFtLmApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5hYm9ydGVkID09PSAnYm9vbGVhbic7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICAvLyBBYm9ydFNpZ25hbC5wcm90b3R5cGUuYWJvcnRlZCB0aHJvd3MgaWYgaXRzIGJyYW5kIGNoZWNrIGZhaWxzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBzdXBwb3J0c0Fib3J0Q29udHJvbGxlciA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbic7XG4vKipcbiAqIENvbnN0cnVjdCBhIG5ldyBBYm9ydENvbnRyb2xsZXIsIGlmIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0uXG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFib3J0Q29udHJvbGxlcigpIHtcbiAgICBpZiAoc3VwcG9ydHNBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHdyaXRhYmxlIHN0cmVhbSByZXByZXNlbnRzIGEgZGVzdGluYXRpb24gZm9yIGRhdGEsIGludG8gd2hpY2ggeW91IGNhbiB3cml0ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFdyaXRhYmxlU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihyYXdVbmRlcmx5aW5nU2luayA9IHt9LCByYXdTdHJhdGVneSA9IHt9KSB7XG4gICAgICAgIGlmIChyYXdVbmRlcmx5aW5nU2luayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByYXdVbmRlcmx5aW5nU2luayA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnRPYmplY3QocmF3VW5kZXJseWluZ1NpbmssICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJhdGVneSA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kocmF3U3RyYXRlZ3ksICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IHVuZGVybHlpbmdTaW5rID0gY29udmVydFVuZGVybHlpbmdTaW5rKHJhd1VuZGVybHlpbmdTaW5rLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbSh0aGlzKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHVuZGVybHlpbmdTaW5rLnR5cGU7XG4gICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGUgaXMgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2l6ZUFsZ29yaXRobSA9IEV4dHJhY3RTaXplQWxnb3JpdGhtKHN0cmF0ZWd5KTtcbiAgICAgICAgY29uc3QgaGlnaFdhdGVyTWFyayA9IEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHN0cmF0ZWd5LCAxKTtcbiAgICAgICAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHRoaXMsIHVuZGVybHlpbmdTaW5rLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgd3JpdGFibGUgc3RyZWFtIGlzIGxvY2tlZCB0byBhIHdyaXRlci5cbiAgICAgKi9cbiAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMignbG9ja2VkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFib3J0cyB0aGUgc3RyZWFtLCBzaWduYWxpbmcgdGhhdCB0aGUgcHJvZHVjZXIgY2FuIG5vIGxvbmdlciBzdWNjZXNzZnVsbHkgd3JpdGUgdG8gdGhlIHN0cmVhbSBhbmQgaXQgaXMgdG8gYmVcbiAgICAgKiBpbW1lZGlhdGVseSBtb3ZlZCB0byBhbiBlcnJvcmVkIHN0YXRlLCB3aXRoIGFueSBxdWV1ZWQtdXAgd3JpdGVzIGRpc2NhcmRlZC4gVGhpcyB3aWxsIGFsc28gZXhlY3V0ZSBhbnkgYWJvcnRcbiAgICAgKiBtZWNoYW5pc20gb2YgdGhlIHVuZGVybHlpbmcgc2luay5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgZnVsZmlsbCBpZiB0aGUgc3RyZWFtIHNodXRzIGRvd24gc3VjY2Vzc2Z1bGx5LCBvciByZWplY3QgaWYgdGhlIHVuZGVybHlpbmcgc2luayBzaWduYWxlZFxuICAgICAqIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIGRvaW5nIHNvLiBBZGRpdGlvbmFsbHksIGl0IHdpbGwgcmVqZWN0IHdpdGggYSBgVHlwZUVycm9yYCAod2l0aG91dCBhdHRlbXB0aW5nIHRvIGNhbmNlbFxuICAgICAqIHRoZSBzdHJlYW0pIGlmIHRoZSBzdHJlYW0gaXMgY3VycmVudGx5IGxvY2tlZC5cbiAgICAgKi9cbiAgICBhYm9ydChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2Fib3J0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgYWJvcnQgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHdyaXRlcicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbS4gVGhlIHVuZGVybHlpbmcgc2luayB3aWxsIGZpbmlzaCBwcm9jZXNzaW5nIGFueSBwcmV2aW91c2x5LXdyaXR0ZW4gY2h1bmtzLCBiZWZvcmUgaW52b2tpbmcgaXRzXG4gICAgICogY2xvc2UgYmVoYXZpb3IuIER1cmluZyB0aGlzIHRpbWUgYW55IGZ1cnRoZXIgYXR0ZW1wdHMgdG8gd3JpdGUgd2lsbCBmYWlsICh3aXRob3V0IGVycm9yaW5nIHRoZSBzdHJlYW0pLlxuICAgICAqXG4gICAgICogVGhlIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgZnVsZmlsbCBpZiBhbGwgcmVtYWluaW5nIGNodW5rcyBhcmUgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gYW5kIHRoZSBzdHJlYW1cbiAgICAgKiBzdWNjZXNzZnVsbHkgY2xvc2VzLCBvciByZWplY3RzIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGR1cmluZyB0aGlzIHByb2Nlc3MuIEFkZGl0aW9uYWxseSwgaXQgd2lsbCByZWplY3Qgd2l0aFxuICAgICAqIGEgYFR5cGVFcnJvcmAgKHdpdGhvdXQgYXR0ZW1wdGluZyB0byBjYW5jZWwgdGhlIHN0cmVhbSkgaWYgdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjbG9zZSBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgd3JpdGVyJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodCh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGFuIGFscmVhZHktY2xvc2luZyBzdHJlYW0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQ2xvc2UodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHwgd3JpdGVyfSBhbmQgbG9ja3MgdGhlIHN0cmVhbSB0byB0aGUgbmV3IHdyaXRlci4gV2hpbGUgdGhlIHN0cmVhbVxuICAgICAqIGlzIGxvY2tlZCwgbm8gb3RoZXIgd3JpdGVyIGNhbiBiZSBhY3F1aXJlZCB1bnRpbCB0aGlzIG9uZSBpcyByZWxlYXNlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgY3JlYXRpbmcgYWJzdHJhY3Rpb25zIHRoYXQgZGVzaXJlIHRoZSBhYmlsaXR5IHRvIHdyaXRlIHRvIGEgc3RyZWFtXG4gICAgICogd2l0aG91dCBpbnRlcnJ1cHRpb24gb3IgaW50ZXJsZWF2aW5nLiBCeSBnZXR0aW5nIGEgd3JpdGVyIGZvciB0aGUgc3RyZWFtLCB5b3UgY2FuIGVuc3VyZSBub2JvZHkgZWxzZSBjYW4gd3JpdGUgYXRcbiAgICAgKiB0aGUgc2FtZSB0aW1lLCB3aGljaCB3b3VsZCBjYXVzZSB0aGUgcmVzdWx0aW5nIHdyaXR0ZW4gZGF0YSB0byBiZSB1bnByZWRpY3RhYmxlIGFuZCBwcm9iYWJseSB1c2VsZXNzLlxuICAgICAqL1xuICAgIGdldFdyaXRlcigpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2dldFdyaXRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBY3F1aXJlV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIGFib3J0OiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBjbG9zZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZ2V0V3JpdGVyOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBsb2NrZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdXcml0YWJsZVN0cmVhbScsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihzdHJlYW0pIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihzdHJlYW0pO1xufVxuLy8gVGhyb3dzIGlmIGFuZCBvbmx5IGlmIHN0YXJ0QWxnb3JpdGhtIHRocm93cy5cbmZ1bmN0aW9uIENyZWF0ZVdyaXRhYmxlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrID0gMSwgc2l6ZUFsZ29yaXRobSA9ICgpID0+IDEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHN0cmVhbSk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuZnVuY3Rpb24gSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHN0cmVhbSkge1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnd3JpdGFibGUnO1xuICAgIC8vIFRoZSBlcnJvciB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYnkgbmV3IG1ldGhvZCBjYWxscyBvbmNlIHRoZSBzdGF0ZSBiZWNvbWVzIGVycm9yZWQuIE9ubHkgc2V0IHdoZW4gW1tzdGF0ZV1dIGlzXG4gICAgLy8gJ2Vycm9yaW5nJyBvciAnZXJyb3JlZCcuIE1heSBiZSBzZXQgdG8gYW4gdW5kZWZpbmVkIHZhbHVlLlxuICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl93cml0ZXIgPSB1bmRlZmluZWQ7XG4gICAgLy8gSW5pdGlhbGl6ZSB0byB1bmRlZmluZWQgZmlyc3QgYmVjYXVzZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNvbnRyb2xsZXIgY2hlY2tzIHRoaXNcbiAgICAvLyB2YXJpYWJsZSB0byB2YWxpZGF0ZSB0aGUgY2FsbGVyLlxuICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoaXMgcXVldWUgaXMgcGxhY2VkIGhlcmUgaW5zdGVhZCBvZiB0aGUgd3JpdGVyIGNsYXNzIGluIG9yZGVyIHRvIGFsbG93IGZvciBwYXNzaW5nIGEgd3JpdGVyIHRvIHRoZSBuZXh0IGRhdGFcbiAgICAvLyBwcm9kdWNlciB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBxdWV1ZWQgd3JpdGVzIHRvIGZpbmlzaC5cbiAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAvLyBXcml0ZSByZXF1ZXN0cyBhcmUgcmVtb3ZlZCBmcm9tIF93cml0ZVJlcXVlc3RzIHdoZW4gd3JpdGUoKSBpcyBjYWxsZWQgb24gdGhlIHVuZGVybHlpbmcgc2luay4gVGhpcyBwcmV2ZW50c1xuICAgIC8vIHRoZW0gZnJvbSBiZWluZyBlcnJvbmVvdXNseSByZWplY3RlZCBvbiBlcnJvci4gSWYgYSB3cml0ZSgpIGNhbGwgaXMgaW4tZmxpZ2h0LCB0aGUgcmVxdWVzdCBpcyBzdG9yZWQgaGVyZS5cbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBwcm9taXNlIHRoYXQgd2FzIHJldHVybmVkIGZyb20gd3JpdGVyLmNsb3NlKCkuIFN0b3JlZCBoZXJlIGJlY2F1c2UgaXQgbWF5IGJlIGZ1bGZpbGxlZCBhZnRlciB0aGUgd3JpdGVyXG4gICAgLy8gaGFzIGJlZW4gZGV0YWNoZWQuXG4gICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgLy8gQ2xvc2UgcmVxdWVzdCBpcyByZW1vdmVkIGZyb20gX2Nsb3NlUmVxdWVzdCB3aGVuIGNsb3NlKCkgaXMgY2FsbGVkIG9uIHRoZSB1bmRlcmx5aW5nIHNpbmsuIFRoaXMgcHJldmVudHMgaXRcbiAgICAvLyBmcm9tIGJlaW5nIGVycm9uZW91c2x5IHJlamVjdGVkIG9uIGVycm9yLiBJZiBhIGNsb3NlKCkgY2FsbCBpcyBpbi1mbGlnaHQsIHRoZSByZXF1ZXN0IGlzIHN0b3JlZCBoZXJlLlxuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIHByb21pc2UgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB3cml0ZXIuYWJvcnQoKS4gVGhpcyBtYXkgYWxzbyBiZSBmdWxmaWxsZWQgYWZ0ZXIgdGhlIHdyaXRlciBoYXMgZGV0YWNoZWQuXG4gICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBiYWNrcHJlc3N1cmUgc2lnbmFsIHNldCBieSB0aGUgY29udHJvbGxlci5cbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXcml0YWJsZVN0cmVhbTtcbn1cbmZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5fd3JpdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtQWJvcnQoc3RyZWFtLCByZWFzb24pIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnIHx8IHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlci5fYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgKF9hID0gc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIuX2Fib3J0Q29udHJvbGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0KCk7XG4gICAgLy8gVHlwZVNjcmlwdCBuYXJyb3dzIHRoZSB0eXBlIG9mIGBzdHJlYW0uX3N0YXRlYCBkb3duIHRvICd3cml0YWJsZScgfCAnZXJyb3JpbmcnLFxuICAgIC8vIGJ1dCBpdCBkb2Vzbid0IGtub3cgdGhhdCBzaWduYWxpbmcgYWJvcnQgcnVucyBhdXRob3IgY29kZSB0aGF0IG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGUgc3RhdGUuXG4gICAgLy8gV2lkZW4gdGhlIHR5cGUgYWdhaW4gYnkgY2FzdGluZyB0byBXcml0YWJsZVN0cmVhbVN0YXRlLlxuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnIHx8IHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2U7XG4gICAgfVxuICAgIGxldCB3YXNBbHJlYWR5RXJyb3JpbmcgPSBmYWxzZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgd2FzQWxyZWFkeUVycm9yaW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gcmVhc29uIHdpbGwgbm90IGJlIHVzZWQsIHNvIGRvbid0IGtlZXAgYSByZWZlcmVuY2UgdG8gaXQuXG4gICAgICAgIHJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfcHJvbWlzZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX3Jlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICBfcmVqZWN0OiByZWplY3QsXG4gICAgICAgICAgICBfcmVhc29uOiByZWFzb24sXG4gICAgICAgICAgICBfd2FzQWxyZWFkeUVycm9yaW5nOiB3YXNBbHJlYWR5RXJyb3JpbmdcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2UgPSBwcm9taXNlO1xuICAgIGlmICghd2FzQWxyZWFkeUVycm9yaW5nKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIHJlYXNvbik7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pIHtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoYFRoZSBzdHJlYW0gKGluICR7c3RhdGV9IHN0YXRlKSBpcyBub3QgaW4gdGhlIHdyaXRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkYCkpO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNsb3NlUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9yZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgX3JlamVjdDogcmVqZWN0XG4gICAgICAgIH07XG4gICAgICAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gY2xvc2VSZXF1ZXN0O1xuICAgIH0pO1xuICAgIGNvbnN0IHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2JhY2twcmVzc3VyZSAmJiBzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xuICAgIH1cbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2Uoc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuLy8gV3JpdGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3cml0ZVJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgIF9yZWplY3Q6IHJlamVjdFxuICAgICAgICB9O1xuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMucHVzaCh3cml0ZVJlcXVlc3QpO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3Jpbmcoc3RyZWFtLCBlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnZXJyb3JpbmcnO1xuICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgY29uc3Qgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbiAgICB9XG4gICAgaWYgKCFXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0KHN0cmVhbSkgJiYgY29udHJvbGxlci5fc3RhcnRlZCkge1xuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pIHtcbiAgICBzdHJlYW0uX3N0YXRlID0gJ2Vycm9yZWQnO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyW0Vycm9yU3RlcHNdKCk7XG4gICAgY29uc3Qgc3RvcmVkRXJyb3IgPSBzdHJlYW0uX3N0b3JlZEVycm9yO1xuICAgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5mb3JFYWNoKHdyaXRlUmVxdWVzdCA9PiB7XG4gICAgICAgIHdyaXRlUmVxdWVzdC5fcmVqZWN0KHN0b3JlZEVycm9yKTtcbiAgICB9KTtcbiAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFib3J0UmVxdWVzdCA9IHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdDtcbiAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFib3J0UmVxdWVzdC5fd2FzQWxyZWFkeUVycm9yaW5nKSB7XG4gICAgICAgIGFib3J0UmVxdWVzdC5fcmVqZWN0KHN0b3JlZEVycm9yKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltBYm9ydFN0ZXBzXShhYm9ydFJlcXVlc3QuX3JlYXNvbik7XG4gICAgdXBvblByb21pc2UocHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBhYm9ydFJlcXVlc3QuX3Jlc29sdmUoKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgIH0sIChyZWFzb24pID0+IHtcbiAgICAgICAgYWJvcnRSZXF1ZXN0Ll9yZWplY3QocmVhc29uKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlKHN0cmVhbSkge1xuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHtcbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0Ll9yZWplY3QoZXJyb3IpO1xuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZShzdHJlYW0pIHtcbiAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0Ll9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7XG4gICAgICAgIC8vIFRoZSBlcnJvciB3YXMgdG9vIGxhdGUgdG8gZG8gYW55dGhpbmcsIHNvIGl0IGlzIGlnbm9yZWQuXG4gICAgICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0Ll9yZXNvbHZlKCk7XG4gICAgICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIGNvbnN0IHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbiAgICB9XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3Ioc3RyZWFtLCBlcnJvcikge1xuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QuX3JlamVjdChlcnJvcik7XG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAvLyBOZXZlciBleGVjdXRlIHNpbmsgYWJvcnQoKSBhZnRlciBzaW5rIGNsb3NlKCkuXG4gICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uKHN0cmVhbSwgZXJyb3IpO1xufVxuLy8gVE9ETyhyaWNlYSk6IEZpeCBhbHBoYWJldGljYWwgb3JkZXIuXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl9jbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtSGFzT3BlcmF0aW9uTWFya2VkSW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSkge1xuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSBzdHJlYW0uX2Nsb3NlUmVxdWVzdDtcbiAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtTWFya0ZpcnN0V3JpdGVSZXF1ZXN0SW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5zaGlmdCgpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl9jbG9zZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdC5fcmVqZWN0KHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjtcbiAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQgJiYgYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICBpZiAoYmFja3ByZXNzdXJlKSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQod3JpdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSBiYWNrcHJlc3N1cmU7XG59XG4vKipcbiAqIEEgZGVmYXVsdCB3cml0ZXIgdmVuZGVkIGJ5IGEge0BsaW5rIFdyaXRhYmxlU3RyZWFtfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoc3RyZWFtLCAxLCAnV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyJyk7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlU3RyZWFtKHN0cmVhbSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHdyaXRpbmcgYnkgYW5vdGhlciB3cml0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBzdHJlYW0uX3dyaXRlciA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICBpZiAoIVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgJiYgc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsIHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZEVycm9yID0gc3RyZWFtLl9zdG9yZWRFcnJvcjtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0aGlzLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsIHN0b3JlZEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIHN0cmVhbSBiZWNvbWVzIGNsb3NlZCwgb3IgcmVqZWN0ZWQgaWYgdGhlIHN0cmVhbSBldmVyIGVycm9ycyBvclxuICAgICAqIHRoZSB3cml0ZXLigJlzIGxvY2sgaXMgcmVsZWFzZWQgYmVmb3JlIHRoZSBzdHJlYW0gZmluaXNoZXMgY2xvc2luZy5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIHNpemUgdG8gZmlsbCB0aGUgc3RyZWFt4oCZcyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXMgb3Zlci1mdWxsLlxuICAgICAqIEEgcHJvZHVjZXIgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEgdG8gd3JpdGUuXG4gICAgICpcbiAgICAgKiBJdCB3aWxsIGJlIGBudWxsYCBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgd3JpdHRlbiB0byAoZHVlIHRvIGVpdGhlciBiZWluZyBlcnJvcmVkLCBvciBoYXZpbmcgYW4gYWJvcnRcbiAgICAgKiBxdWV1ZWQgdXApLiBJdCB3aWxsIHJldHVybiB6ZXJvIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkLiBBbmQgdGhlIGdldHRlciB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpbnZva2VkIHdoZW5cbiAgICAgKiB0aGUgd3JpdGVy4oCZcyBsb2NrIGlzIHJlbGVhc2VkLlxuICAgICAqL1xuICAgIGdldCBkZXNpcmVkU2l6ZSgpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSBzdHJlYW3igJlzIGludGVybmFsIHF1ZXVlIHRyYW5zaXRpb25zXG4gICAgICogZnJvbSBub24tcG9zaXRpdmUgdG8gcG9zaXRpdmUsIHNpZ25hbGluZyB0aGF0IGl0IGlzIG5vIGxvbmdlciBhcHBseWluZyBiYWNrcHJlc3N1cmUuIE9uY2UgdGhlIGRlc2lyZWQgc2l6ZSBkaXBzXG4gICAgICogYmFjayB0byB6ZXJvIG9yIGJlbG93LCB0aGUgZ2V0dGVyIHdpbGwgcmV0dXJuIGEgbmV3IHByb21pc2UgdGhhdCBzdGF5cyBwZW5kaW5nIHVudGlsIHRoZSBuZXh0IHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3RyZWFtIGJlY29tZXMgZXJyb3JlZCBvciBhYm9ydGVkLCBvciB0aGUgd3JpdGVy4oCZcyBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlY29tZVxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIGdldCByZWFkeSgpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWR5JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkeVByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSByZWFkZXIgaXMgYWN0aXZlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAbGluayBXcml0YWJsZVN0cmVhbS5hYm9ydCB8IHN0cmVhbS5hYm9ydChyZWFzb24pfS5cbiAgICAgKi9cbiAgICBhYm9ydChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Fib3J0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCdhYm9ydCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQWJvcnQodGhpcywgcmVhc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlYWRlciBpcyBhY3RpdmUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMge0BsaW5rIFdyaXRhYmxlU3RyZWFtLmNsb3NlIHwgc3RyZWFtLmNsb3NlKCl9LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjbG9zZSBhbiBhbHJlYWR5LWNsb3Npbmcgc3RyZWFtJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdGhlIHdyaXRlcuKAmXMgbG9jayBvbiB0aGUgY29ycmVzcG9uZGluZyBzdHJlYW0uIEFmdGVyIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgd3JpdGVyIGlzIG5vIGxvbmdlciBhY3RpdmUuXG4gICAgICogSWYgdGhlIGFzc29jaWF0ZWQgc3RyZWFtIGlzIGVycm9yZWQgd2hlbiB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIHdyaXRlciB3aWxsIGFwcGVhciBlcnJvcmVkIGluIHRoZSBzYW1lIHdheSBmcm9tXG4gICAgICogbm93IG9uOyBvdGhlcndpc2UsIHRoZSB3cml0ZXIgd2lsbCBhcHBlYXIgY2xvc2VkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBsb2NrIGNhbiBzdGlsbCBiZSByZWxlYXNlZCBldmVuIGlmIHNvbWUgb25nb2luZyB3cml0ZXMgaGF2ZSBub3QgeWV0IGZpbmlzaGVkIChpLmUuIGV2ZW4gaWYgdGhlXG4gICAgICogcHJvbWlzZXMgcmV0dXJuZWQgZnJvbSBwcmV2aW91cyBjYWxscyB0byB7QGxpbmsgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLndyaXRlIHwgd3JpdGUoKX0gaGF2ZSBub3QgeWV0IHNldHRsZWQpLlxuICAgICAqIEl04oCZcyBub3QgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlIGxvY2sgb24gdGhlIHdyaXRlciBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3cml0ZTsgdGhlIGxvY2sgaW5zdGVhZCBzaW1wbHkgcHJldmVudHNcbiAgICAgKiBvdGhlciBwcm9kdWNlcnMgZnJvbSB3cml0aW5nIGluIGFuIGludGVybGVhdmVkIG1hbm5lci5cbiAgICAgKi9cbiAgICByZWxlYXNlTG9jaygpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh0aGlzKTtcbiAgICB9XG4gICAgd3JpdGUoY2h1bmsgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3dyaXRlJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCd3cml0ZSB0bycpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyV3JpdGUodGhpcywgY2h1bmspO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIHtcbiAgICBhYm9ydDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgY2xvc2U6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlbGVhc2VMb2NrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB3cml0ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgY2xvc2VkOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBkZXNpcmVkU2l6ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVhZHk6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLlxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19vd25lcldyaXRhYmxlU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcjtcbn1cbi8vIEEgY2xpZW50IG9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGUgY2hlY2suXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydChzdHJlYW0sIHJlYXNvbik7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh3cml0ZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24od3JpdGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSB8fCBzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh3cml0ZXIpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHdyaXRlciwgZXJyb3IpIHtcbiAgICBpZiAod3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIGVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgZXJyb3IpIHtcbiAgICBpZiAod3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCBlcnJvcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHdyaXRlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcgfHwgc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh3cml0ZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgY29uc3QgcmVsZWFzZWRFcnJvciA9IG5ldyBUeXBlRXJyb3IoYFdyaXRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzYCk7XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCByZWxlYXNlZEVycm9yKTtcbiAgICAvLyBUaGUgc3RhdGUgdHJhbnNpdGlvbnMgdG8gXCJlcnJvcmVkXCIgYmVmb3JlIHRoZSBzaW5rIGFib3J0KCkgbWV0aG9kIHJ1bnMsIGJ1dCB0aGUgd3JpdGVyLmNsb3NlZCBwcm9taXNlIGlzIG5vdFxuICAgIC8vIHJlamVjdGVkIHVudGlsIGFmdGVyd2FyZHMuIFRoaXMgbWVhbnMgdGhhdCBzaW1wbHkgdGVzdGluZyBzdGF0ZSB3aWxsIG5vdCB3b3JrLlxuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZUNsb3NlZFByb21pc2VSZWplY3RlZCh3cml0ZXIsIHJlbGVhc2VkRXJyb3IpO1xuICAgIHN0cmVhbS5fd3JpdGVyID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbSA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspO1xuICAgIGlmIChzdHJlYW0gIT09IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignd3JpdGUgdG8nKSk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgfHwgc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgY2xvc2luZyBvciBjbG9zZWQgYW5kIGNhbm5vdCBiZSB3cml0dGVuIHRvJykpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSBXcml0YWJsZVN0cmVhbUFkZFdyaXRlUmVxdWVzdChzdHJlYW0pO1xuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJXcml0ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmNvbnN0IGNsb3NlU2VudGluZWwgPSB7fTtcbi8qKlxuICogQWxsb3dzIGNvbnRyb2wgb2YgYSB7QGxpbmsgV3JpdGFibGVTdHJlYW0gfCB3cml0YWJsZSBzdHJlYW19J3Mgc3RhdGUgYW5kIGludGVybmFsIHF1ZXVlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB3aGljaCB3YXMgcGFzc2VkIHRvIGBXcml0YWJsZVN0cmVhbS5hYm9ydChyZWFzb24pYCB3aGVuIHRoZSBzdHJlYW0gd2FzIGFib3J0ZWQuXG4gICAgICovXG4gICAgZ2V0IGFib3J0UmVhc29uKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2Fib3J0UmVhc29uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fib3J0UmVhc29uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBgQWJvcnRTaWduYWxgIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWJvcnQgdGhlIHBlbmRpbmcgd3JpdGUgb3IgY2xvc2Ugb3BlcmF0aW9uIHdoZW4gdGhlIHN0cmVhbSBpcyBhYm9ydGVkLlxuICAgICAqL1xuICAgIGdldCBzaWduYWwoKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMignc2lnbmFsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Fib3J0Q29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBPbGRlciBicm93c2VycyBvciBvbGRlciBOb2RlIHZlcnNpb25zIG1heSBub3Qgc3VwcG9ydCBgQWJvcnRDb250cm9sbGVyYCBvciBgQWJvcnRTaWduYWxgLlxuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBidW5kbGUgYW5kIHNoaXAgYW4gYEFib3J0Q29udHJvbGxlcmAgcG9seWZpbGwgdG9nZXRoZXIgd2l0aCBvdXIgcG9seWZpbGwsXG4gICAgICAgICAgICAvLyBzbyBpbnN0ZWFkIHdlIG9ubHkgaW1wbGVtZW50IHN1cHBvcnQgZm9yIGBzaWduYWxgIGlmIHdlIGZpbmQgYSBnbG9iYWwgYEFib3J0Q29udHJvbGxlcmAgY29uc3RydWN0b3IuXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5zaWduYWwgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGNvbnRyb2xsZWQgd3JpdGFibGUgc3RyZWFtLCBtYWtpbmcgYWxsIGZ1dHVyZSBpbnRlcmFjdGlvbnMgd2l0aCBpdCBmYWlsIHdpdGggdGhlIGdpdmVuIGVycm9yIGBlYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHJhcmVseSB1c2VkLCBzaW5jZSB1c3VhbGx5IGl0IHN1ZmZpY2VzIHRvIHJldHVybiBhIHJlamVjdGVkIHByb21pc2UgZnJvbSBvbmUgb2YgdGhlIHVuZGVybHlpbmdcbiAgICAgKiBzaW5rJ3MgbWV0aG9kcy4gSG93ZXZlciwgaXQgY2FuIGJlIHVzZWZ1bCBmb3Igc3VkZGVubHkgc2h1dHRpbmcgZG93biBhIHN0cmVhbSBpbiByZXNwb25zZSB0byBhbiBldmVudCBvdXRzaWRlIHRoZVxuICAgICAqIG5vcm1hbCBsaWZlY3ljbGUgb2YgaW50ZXJhY3Rpb25zIHdpdGggdGhlIHVuZGVybHlpbmcgc2luay5cbiAgICAgKi9cbiAgICBlcnJvcihlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMignZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBjbG9zZWQsIGVycm9yZWQgb3Igd2lsbCBiZSBzb29uLiBUaGUgc2luayBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgaWYgaXQgZ2V0cyBhbiBlcnJvciBoZXJlLCBzb1xuICAgICAgICAgICAgLy8ganVzdCB0cmVhdCBpdCBhcyBhIG5vLW9wLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCBlKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtBYm9ydFN0ZXBzXShyZWFzb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fYWJvcnRBbGdvcml0aG0ocmVhc29uKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtFcnJvclN0ZXBzXSgpIHtcbiAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIGVycm9yOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGltcGxlbWVudGluZyBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgdGhlIFdyaXRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XG59XG5mdW5jdGlvbiBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbSA9IHN0cmVhbTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgLy8gTmVlZCB0byBzZXQgdGhlIHNsb3RzIHNvIHRoYXQgdGhlIGFzc2VydCBkb2Vzbid0IGZpcmUuIEluIHRoZSBzcGVjIHRoZSBzbG90cyBhbHJlYWR5IGV4aXN0IGltcGxpY2l0bHkuXG4gICAgY29udHJvbGxlci5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPSB1bmRlZmluZWQ7XG4gICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLl9hYm9ydFJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9hYm9ydENvbnRyb2xsZXIgPSBjcmVhdGVBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtID0gc2l6ZUFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7XG4gICAgY29udHJvbGxlci5fd3JpdGVBbGdvcml0aG0gPSB3cml0ZUFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSA9IGNsb3NlQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gYWJvcnRBbGdvcml0aG07XG4gICAgY29uc3QgYmFja3ByZXNzdXJlID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKTtcbiAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBzdGFydEFsZ29yaXRobSgpO1xuICAgIGNvbnN0IHN0YXJ0UHJvbWlzZSA9IHByb21pc2VSZXNvbHZlZFdpdGgoc3RhcnRSZXN1bHQpO1xuICAgIHVwb25Qcm9taXNlKHN0YXJ0UHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH0sIHIgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIHIpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHN0cmVhbSwgdW5kZXJseWluZ1NpbmssIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgbGV0IHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZWZpbmVkO1xuICAgIGxldCB3cml0ZUFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBsZXQgY2xvc2VBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgbGV0IGFib3J0QWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGlmICh1bmRlcmx5aW5nU2luay5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ1Npbmsuc3RhcnQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nU2luay53cml0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdyaXRlQWxnb3JpdGhtID0gY2h1bmsgPT4gdW5kZXJseWluZ1Npbmsud3JpdGUoY2h1bmssIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBpZiAodW5kZXJseWluZ1NpbmsuY2xvc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbG9zZUFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdTaW5rLmNsb3NlKCk7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nU2luay5hYm9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFib3J0QWxnb3JpdGhtID0gcmVhc29uID0+IHVuZGVybHlpbmdTaW5rLmFib3J0KHJlYXNvbik7XG4gICAgfVxuICAgIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbn1cbi8vIENsZWFyQWxnb3JpdGhtcyBtYXkgYmUgY2FsbGVkIHR3aWNlLiBFcnJvcmluZyB0aGUgc2FtZSBzdHJlYW0gaW4gbXVsdGlwbGUgd2F5cyB3aWxsIG9mdGVuIHJlc3VsdCBpbiByZWR1bmRhbnQgY2FsbHMuXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHtcbiAgICBjb250cm9sbGVyLl93cml0ZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9hYm9ydEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoY29udHJvbGxlcikge1xuICAgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsIGNsb3NlU2VudGluZWwsIDApO1xuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtKGNodW5rKTtcbiAgICB9XG4gICAgY2F0Y2ggKGNodW5rU2l6ZUUpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoY29udHJvbGxlciwgY2h1bmtTaXplRSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyV3JpdGUoY29udHJvbGxlciwgY2h1bmssIGNodW5rU2l6ZSkge1xuICAgIHRyeSB7XG4gICAgICAgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpO1xuICAgIH1cbiAgICBjYXRjaCAoZW5xdWV1ZUUpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoY29udHJvbGxlciwgZW5xdWV1ZUUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICBpZiAoIVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgJiYgc3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBjb25zdCBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpO1xuICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgfVxuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgaWYgKCFjb250cm9sbGVyLl9zdGFydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IFBlZWtRdWV1ZVZhbHVlKGNvbnRyb2xsZXIpO1xuICAgIGlmICh2YWx1ZSA9PT0gY2xvc2VTZW50aW5lbCkge1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc0Nsb3NlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZShjb250cm9sbGVyLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoY29udHJvbGxlciwgZXJyb3IpIHtcbiAgICBpZiAoY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICBXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pO1xuICAgIERlcXVldWVWYWx1ZShjb250cm9sbGVyKTtcbiAgICBjb25zdCBzaW5rQ2xvc2VQcm9taXNlID0gY29udHJvbGxlci5fY2xvc2VBbGdvcml0aG0oKTtcbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgIHVwb25Qcm9taXNlKHNpbmtDbG9zZVByb21pc2UsICgpID0+IHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlKHN0cmVhbSk7XG4gICAgfSwgcmVhc29uID0+IHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHN0cmVhbSwgcmVhc29uKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzV3JpdGUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pO1xuICAgIGNvbnN0IHNpbmtXcml0ZVByb21pc2UgPSBjb250cm9sbGVyLl93cml0ZUFsZ29yaXRobShjaHVuayk7XG4gICAgdXBvblByb21pc2Uoc2lua1dyaXRlUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUoc3RyZWFtKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBEZXF1ZXVlVmFsdWUoY29udHJvbGxlcik7XG4gICAgICAgIGlmICghV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSAmJiBzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgY29uc3QgYmFja3ByZXNzdXJlID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKTtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKTtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgfSwgcmVhc29uID0+IHtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yKHN0cmVhbSwgcmVhc29uKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcikge1xuICAgIGNvbnN0IGRlc2lyZWRTaXplID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpO1xuICAgIHJldHVybiBkZXNpcmVkU2l6ZSA8PSAwO1xufVxuLy8gQSBjbGllbnQgb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGUgY2hlY2suXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZXJyb3IpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3Jpbmcoc3RyZWFtLCBlcnJvcik7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW0uXG5mdW5jdGlvbiBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIobmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW1gKTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDIobmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyYCk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLlxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcmApO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdDYW5ub3QgJyArIG5hbWUgKyAnIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgd3JpdGVyJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKSB7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncGVuZGluZyc7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7XG4gICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh3cml0ZXIpIHtcbiAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgcmVhc29uKSB7XG4gICAgaWYgKHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUod3JpdGVyLl9jbG9zZWRQcm9taXNlKTtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0KHJlYXNvbik7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9ICdyZWplY3RlZCc7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcikge1xuICAgIGlmICh3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZVN0YXRlID0gJ3Jlc29sdmVkJztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcikge1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdwZW5kaW5nJztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQod3JpdGVyKSB7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGlmICh3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUod3JpdGVyLl9yZWFkeVByb21pc2UpO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPSAncmVqZWN0ZWQnO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0KHdyaXRlcikge1xuICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcikge1xuICAgIGlmICh3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdmdWxmaWxsZWQnO1xufVxuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJkb21cIiAvPlxuY29uc3QgTmF0aXZlRE9NRXhjZXB0aW9uID0gdHlwZW9mIERPTUV4Y2VwdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBET01FeGNlcHRpb24gOiB1bmRlZmluZWQ7XG5cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwibm9kZVwiIC8+XG5mdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKGN0b3IpIHtcbiAgICBpZiAoISh0eXBlb2YgY3RvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgY3RvciA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbmV3IGN0b3IoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGNvbnN0IGN0b3IgPSBmdW5jdGlvbiBET01FeGNlcHRpb24obWVzc2FnZSwgbmFtZSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICcnO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdFcnJvcic7XG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdG9yLnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgeyB2YWx1ZTogY3Rvciwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gY3Rvcjtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmNvbnN0IERPTUV4Y2VwdGlvbiQxID0gaXNET01FeGNlcHRpb25Db25zdHJ1Y3RvcihOYXRpdmVET01FeGNlcHRpb24pID8gTmF0aXZlRE9NRXhjZXB0aW9uIDogY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwoKTtcblxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1QaXBlVG8oc291cmNlLCBkZXN0LCBwcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCwgc2lnbmFsKSB7XG4gICAgY29uc3QgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzb3VyY2UpO1xuICAgIGNvbnN0IHdyaXRlciA9IEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoZGVzdCk7XG4gICAgc291cmNlLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgICAvLyBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3BlYydzIHJlcXVpcmVtZW50IHRoYXQgd2Ugd2FpdCBmb3Igb25nb2luZyB3cml0ZXMgZHVyaW5nIHNodXRkb3duLlxuICAgIGxldCBjdXJyZW50V3JpdGUgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgYWJvcnRBbGdvcml0aG07XG4gICAgICAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWJvcnRBbGdvcml0aG0gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRE9NRXhjZXB0aW9uJDEoJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXZlbnRBYm9ydCkge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQoZGVzdCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcHJldmVudENhbmNlbCkge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5fc3RhdGUgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKCgpID0+IFByb21pc2UuYWxsKGFjdGlvbnMubWFwKGFjdGlvbiA9PiBhY3Rpb24oKSkpLCB0cnVlLCBlcnJvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgYWJvcnRBbGdvcml0aG0oKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEFsZ29yaXRobSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNpbmcgcmVhZGVyIGFuZCB3cml0ZXIsIHJlYWQgYWxsIGNodW5rcyBmcm9tIHRoaXMgYW5kIHdyaXRlIHRoZW0gdG8gZGVzdFxuICAgICAgICAvLyAtIEJhY2twcmVzc3VyZSBtdXN0IGJlIGVuZm9yY2VkXG4gICAgICAgIC8vIC0gU2h1dGRvd24gbXVzdCBzdG9wIGFsbCBhY3Rpdml0eVxuICAgICAgICBmdW5jdGlvbiBwaXBlTG9vcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9taXNlKChyZXNvbHZlTG9vcCwgcmVqZWN0TG9vcCkgPT4ge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5leHQoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBgUGVyZm9ybVByb21pc2VUaGVuYCBpbnN0ZWFkIG9mIGB1cG9uUHJvbWlzZWAgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGluZyB1bm5lY2Vzc2FyeSBgLmNhdGNoKHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbilgIGhhbmRsZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocGlwZVN0ZXAoKSwgbmV4dCwgcmVqZWN0TG9vcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwaXBlU3RlcCgpIHtcbiAgICAgICAgICAgIGlmIChzaHV0dGluZ0Rvd24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4od3JpdGVyLl9yZWFkeVByb21pc2UsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3UHJvbWlzZSgocmVzb2x2ZVJlYWQsIHJlamVjdFJlYWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFdyaXRlID0gUGVyZm9ybVByb21pc2VUaGVuKFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspLCB1bmRlZmluZWQsIG5vb3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVSZWFkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VTdGVwczogKCkgPT4gcmVzb2x2ZVJlYWQodHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBfZXJyb3JTdGVwczogcmVqZWN0UmVhZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVycm9ycyBtdXN0IGJlIHByb3BhZ2F0ZWQgZm9yd2FyZFxuICAgICAgICBpc09yQmVjb21lc0Vycm9yZWQoc291cmNlLCByZWFkZXIuX2Nsb3NlZFByb21pc2UsIHN0b3JlZEVycm9yID0+IHtcbiAgICAgICAgICAgIGlmICghcHJldmVudEFib3J0KSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKCgpID0+IFdyaXRhYmxlU3RyZWFtQWJvcnQoZGVzdCwgc3RvcmVkRXJyb3IpLCB0cnVlLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bih0cnVlLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBFcnJvcnMgbXVzdCBiZSBwcm9wYWdhdGVkIGJhY2t3YXJkXG4gICAgICAgIGlzT3JCZWNvbWVzRXJyb3JlZChkZXN0LCB3cml0ZXIuX2Nsb3NlZFByb21pc2UsIHN0b3JlZEVycm9yID0+IHtcbiAgICAgICAgICAgIGlmICghcHJldmVudENhbmNlbCkge1xuICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbigoKSA9PiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIHN0b3JlZEVycm9yKSwgdHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ2xvc2luZyBtdXN0IGJlIHByb3BhZ2F0ZWQgZm9yd2FyZFxuICAgICAgICBpc09yQmVjb21lc0Nsb3NlZChzb3VyY2UsIHJlYWRlci5fY2xvc2VkUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcmV2ZW50Q2xvc2UpIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oKCkgPT4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih3cml0ZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNodXRkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDbG9zaW5nIG11c3QgYmUgcHJvcGFnYXRlZCBiYWNrd2FyZFxuICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoZGVzdCkgfHwgZGVzdC5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0Q2xvc2VkID0gbmV3IFR5cGVFcnJvcigndGhlIGRlc3RpbmF0aW9uIHdyaXRhYmxlIHN0cmVhbSBjbG9zZWQgYmVmb3JlIGFsbCBkYXRhIGNvdWxkIGJlIHBpcGVkIHRvIGl0Jyk7XG4gICAgICAgICAgICBpZiAoIXByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oKCkgPT4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBkZXN0Q2xvc2VkKSwgdHJ1ZSwgZGVzdENsb3NlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bih0cnVlLCBkZXN0Q2xvc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHBpcGVMb29wKCkpO1xuICAgICAgICBmdW5jdGlvbiB3YWl0Rm9yV3JpdGVzVG9GaW5pc2goKSB7XG4gICAgICAgICAgICAvLyBBbm90aGVyIHdyaXRlIG1heSBoYXZlIHN0YXJ0ZWQgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIG9uIHRoaXMgY3VycmVudFdyaXRlLCBzbyB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gd2FpdFxuICAgICAgICAgICAgLy8gZm9yIHRoYXQgdG9vLlxuICAgICAgICAgICAgY29uc3Qgb2xkQ3VycmVudFdyaXRlID0gY3VycmVudFdyaXRlO1xuICAgICAgICAgICAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihjdXJyZW50V3JpdGUsICgpID0+IG9sZEN1cnJlbnRXcml0ZSAhPT0gY3VycmVudFdyaXRlID8gd2FpdEZvcldyaXRlc1RvRmluaXNoKCkgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzT3JCZWNvbWVzRXJyb3JlZChzdHJlYW0sIHByb21pc2UsIGFjdGlvbikge1xuICAgICAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgICAgIGFjdGlvbihzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwb25SZWplY3Rpb24ocHJvbWlzZSwgYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc09yQmVjb21lc0Nsb3NlZChzdHJlYW0sIHByb21pc2UsIGFjdGlvbikge1xuICAgICAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQocHJvbWlzZSwgYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzaHV0ZG93bldpdGhBY3Rpb24oYWN0aW9uLCBvcmlnaW5hbElzRXJyb3IsIG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChzaHV0dGluZ0Rvd24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmICFXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChkZXN0KSkge1xuICAgICAgICAgICAgICAgIHVwb25GdWxmaWxsbWVudCh3YWl0Rm9yV3JpdGVzVG9GaW5pc2goKSwgZG9UaGVSZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvVGhlUmVzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZG9UaGVSZXN0KCkge1xuICAgICAgICAgICAgICAgIHVwb25Qcm9taXNlKGFjdGlvbigpLCAoKSA9PiBmaW5hbGl6ZShvcmlnaW5hbElzRXJyb3IsIG9yaWdpbmFsRXJyb3IpLCBuZXdFcnJvciA9PiBmaW5hbGl6ZSh0cnVlLCBuZXdFcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNodXRkb3duKGlzRXJyb3IsIGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoc2h1dHRpbmdEb3duKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChkZXN0Ll9zdGF0ZSA9PT0gJ3dyaXRhYmxlJyAmJiAhV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoZGVzdCkpIHtcbiAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksICgpID0+IGZpbmFsaXplKGlzRXJyb3IsIGVycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZmluYWxpemUoaXNFcnJvciwgZXJyb3IpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2Uod3JpdGVyKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UocmVhZGVyKTtcbiAgICAgICAgICAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QWxnb3JpdGhtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEFsbG93cyBjb250cm9sIG9mIGEge0BsaW5rIFJlYWRhYmxlU3RyZWFtIHwgcmVhZGFibGUgc3RyZWFtfSdzIHN0YXRlIGFuZCBpbnRlcm5hbCBxdWV1ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSBjb250cm9sbGVkIHN0cmVhbSdzIGludGVybmFsIHF1ZXVlLiBJdCBjYW4gYmUgbmVnYXRpdmUsIGlmIHRoZSBxdWV1ZSBpc1xuICAgICAqIG92ZXItZnVsbC4gQW4gdW5kZXJseWluZyBzb3VyY2Ugb3VnaHQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gYW5kIGhvdyB0byBhcHBseSBiYWNrcHJlc3N1cmUuXG4gICAgICovXG4gICAgZ2V0IGRlc2lyZWRTaXplKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjb250cm9sbGVkIHJlYWRhYmxlIHN0cmVhbS4gQ29uc3VtZXJzIHdpbGwgc3RpbGwgYmUgYWJsZSB0byByZWFkIGFueSBwcmV2aW91c2x5LWVucXVldWVkIGNodW5rcyBmcm9tXG4gICAgICogdGhlIHN0cmVhbSwgYnV0IG9uY2UgdGhvc2UgYXJlIHJlYWQsIHRoZSBzdHJlYW0gd2lsbCBiZWNvbWUgY2xvc2VkLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Nsb3NlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgbm90IGluIGEgc3RhdGUgdGhhdCBwZXJtaXRzIGNsb3NlJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHRoaXMpO1xuICAgIH1cbiAgICBlbnF1ZXVlKGNodW5rID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnZW5xdWV1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGlzIG5vdCBpbiBhIHN0YXRlIHRoYXQgcGVybWl0cyBlbnF1ZXVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXJyb3JzIHRoZSBjb250cm9sbGVkIHJlYWRhYmxlIHN0cmVhbSwgbWFraW5nIGFsbCBmdXR1cmUgaW50ZXJhY3Rpb25zIHdpdGggaXQgZmFpbCB3aXRoIHRoZSBnaXZlbiBlcnJvciBgZWAuXG4gICAgICovXG4gICAgZXJyb3IoZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHRoaXMsIGUpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgW0NhbmNlbFN0ZXBzXShyZWFzb24pIHtcbiAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbUHVsbFN0ZXBzXShyZWFkUmVxdWVzdCkge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgICAgIGlmICh0aGlzLl9xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IERlcXVldWVWYWx1ZSh0aGlzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbG9zZVJlcXVlc3RlZCAmJiB0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2NodW5rU3RlcHMoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0sIHJlYWRSZXF1ZXN0KTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsIHtcbiAgICBjbG9zZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZW5xdWV1ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZXJyb3I6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGRlc2lyZWRTaXplOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNob3VsZFB1bGwgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcik7XG4gICAgaWYgKCFzaG91bGRQdWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXIuX3B1bGxpbmcpIHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwdWxsUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0oKTtcbiAgICB1cG9uUHJvbWlzZShwdWxsUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9wdWxsQWdhaW4pIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICB9LCBlID0+IHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoY29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWNvbnRyb2xsZXIuX3N0YXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBkZXNpcmVkU2l6ZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTtcbiAgICBpZiAoZGVzaXJlZFNpemUgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHtcbiAgICBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG59XG4vLyBBIGNsaWVudCBvZiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7XG4gICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoY29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGNvbnRyb2xsZXIsIGNodW5rKSB7XG4gICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoY29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGNodW5rLCBmYWxzZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgY2h1bmtTaXplO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2h1bmtTaXplID0gY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoY2h1bmtTaXplRSkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGNodW5rU2l6ZUUpO1xuICAgICAgICAgICAgdGhyb3cgY2h1bmtTaXplRTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgY2h1bmssIGNodW5rU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVucXVldWVFKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZW5xdWV1ZUUpO1xuICAgICAgICAgICAgdGhyb3cgZW5xdWV1ZUU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7XG59XG4vLyBUaGlzIGlzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIFRyYW5zZm9ybVN0cmVhbS5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJIYXNCYWNrcHJlc3N1cmUoY29udHJvbGxlcikge1xuICAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmICghY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgJiYgc3RhdGUgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0gPSBzdHJlYW07XG4gICAgY29udHJvbGxlci5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPSB1bmRlZmluZWQ7XG4gICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtID0gc2l6ZUFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7XG4gICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07XG4gICAgY29udHJvbGxlci5fY2FuY2VsQWxnb3JpdGhtID0gY2FuY2VsQWxnb3JpdGhtO1xuICAgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICBjb25zdCBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH0sIHIgPT4ge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdTb3VyY2UsIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgbGV0IHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZWZpbmVkO1xuICAgIGxldCBwdWxsQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGxldCBjYW5jZWxBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgaWYgKHVuZGVybHlpbmdTb3VyY2Uuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdGFydEFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdTb3VyY2Uuc3RhcnQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nU291cmNlLnB1bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwdWxsQWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ1NvdXJjZS5wdWxsKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBpZiAodW5kZXJseWluZ1NvdXJjZS5jYW5jZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYW5jZWxBbGdvcml0aG0gPSByZWFzb24gPT4gdW5kZXJseWluZ1NvdXJjZS5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gICAgU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbmZ1bmN0aW9uIGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcmApO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVRlZShzdHJlYW0sIGNsb25lRm9yQnJhbmNoMikge1xuICAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpKSB7XG4gICAgICAgIHJldHVybiBSZWFkYWJsZUJ5dGVTdHJlYW1UZWUoc3RyZWFtKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFRlZShzdHJlYW0pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0VGVlKHN0cmVhbSwgY2xvbmVGb3JCcmFuY2gyKSB7XG4gICAgY29uc3QgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pO1xuICAgIGxldCByZWFkaW5nID0gZmFsc2U7XG4gICAgbGV0IGNhbmNlbGVkMSA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWxlZDIgPSBmYWxzZTtcbiAgICBsZXQgcmVhc29uMTtcbiAgICBsZXQgcmVhc29uMjtcbiAgICBsZXQgYnJhbmNoMTtcbiAgICBsZXQgYnJhbmNoMjtcbiAgICBsZXQgcmVzb2x2ZUNhbmNlbFByb21pc2U7XG4gICAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ld1Byb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBwdWxsQWxnb3JpdGhtKCkge1xuICAgICAgICBpZiAocmVhZGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVhZFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfY2h1bmtTdGVwczogY2h1bmsgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZGVsYXllZCBhIG1pY3JvdGFzayBiZWNhdXNlIGl0IHRha2VzIGF0IGxlYXN0IGEgbWljcm90YXNrIHRvIGRldGVjdCBlcnJvcnMgKHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gcmVhZGVyLl9jbG9zZWRQcm9taXNlIGJlbG93KSwgYW5kIHdlIHdhbnQgZXJyb3JzIGluIHN0cmVhbSB0byBlcnJvciBib3RoIGJyYW5jaGVzIGltbWVkaWF0ZWx5LiBXZSBjYW5ub3QgbGV0XG4gICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCBzeW5jaHJvbm91c2x5LWF2YWlsYWJsZSByZWFkcyBnZXQgYWhlYWQgb2YgYXN5bmNocm9ub3VzbHktYXZhaWxhYmxlIGVycm9ycy5cbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsxID0gY2h1bms7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rMiA9IGNodW5rO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gYWNjZXNzIHRoZSBjbG9uaW5nIGNvZGUgcmlnaHQgbm93IGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFkZCBvbmUgdGhlbiB3ZSdsbCBuZWVkIGFuIGltcGxlbWVudGF0aW9uIGZvciBzZXJpYWxpemFibGUgb2JqZWN0cy5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFjYW5jZWxlZDIgJiYgY2xvbmVGb3JCcmFuY2gyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgY2h1bmsyID0gU3RydWN0dXJlZERlc2VyaWFsaXplKFN0cnVjdHVyZWRTZXJpYWxpemUoY2h1bmsyKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmsxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuazIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSB8fCAhY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9lcnJvclN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwgcmVhZFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWwxQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBjYW5jZWxlZDEgPSB0cnVlO1xuICAgICAgICByZWFzb24xID0gcmVhc29uO1xuICAgICAgICBpZiAoY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBDcmVhdGVBcnJheUZyb21MaXN0KFtyZWFzb24xLCByZWFzb24yXSk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWwyQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBjYW5jZWxlZDIgPSB0cnVlO1xuICAgICAgICByZWFzb24yID0gcmVhc29uO1xuICAgICAgICBpZiAoY2FuY2VsZWQxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBDcmVhdGVBcnJheUZyb21MaXN0KFtyZWFzb24xLCByZWFzb24yXSk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBicmFuY2gxID0gQ3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbDFBbGdvcml0aG0pO1xuICAgIGJyYW5jaDIgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7XG4gICAgdXBvblJlamVjdGlvbihyZWFkZXIuX2Nsb3NlZFByb21pc2UsIChyKSA9PiB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihicmFuY2gxLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgaWYgKCFjYW5jZWxlZDEgfHwgIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbYnJhbmNoMSwgYnJhbmNoMl07XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1UZWUoc3RyZWFtKSB7XG4gICAgbGV0IHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICBsZXQgcmVhZGluZyA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWxlZDEgPSBmYWxzZTtcbiAgICBsZXQgY2FuY2VsZWQyID0gZmFsc2U7XG4gICAgbGV0IHJlYXNvbjE7XG4gICAgbGV0IHJlYXNvbjI7XG4gICAgbGV0IGJyYW5jaDE7XG4gICAgbGV0IGJyYW5jaDI7XG4gICAgbGV0IHJlc29sdmVDYW5jZWxQcm9taXNlO1xuICAgIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXdQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gZm9yd2FyZFJlYWRlckVycm9yKHRoaXNSZWFkZXIpIHtcbiAgICAgICAgdXBvblJlamVjdGlvbih0aGlzUmVhZGVyLl9jbG9zZWRQcm9taXNlLCByID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzUmVhZGVyICE9PSByZWFkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHIpO1xuICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEgfHwgIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsV2l0aERlZmF1bHRSZWFkZXIoKSB7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG4gICAgICAgICAgICBmb3J3YXJkUmVhZGVyRXJyb3IocmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBkZWxheWVkIGEgbWljcm90YXNrIGJlY2F1c2UgaXQgdGFrZXMgYXQgbGVhc3QgYSBtaWNyb3Rhc2sgdG8gZGV0ZWN0IGVycm9ycyAodXNpbmdcbiAgICAgICAgICAgICAgICAvLyByZWFkZXIuX2Nsb3NlZFByb21pc2UgYmVsb3cpLCBhbmQgd2Ugd2FudCBlcnJvcnMgaW4gc3RyZWFtIHRvIGVycm9yIGJvdGggYnJhbmNoZXMgaW1tZWRpYXRlbHkuIFdlIGNhbm5vdCBsZXRcbiAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIHN5bmNocm9ub3VzbHktYXZhaWxhYmxlIHJlYWRzIGdldCBhaGVhZCBvZiBhc3luY2hyb25vdXNseS1hdmFpbGFibGUgZXJyb3JzLlxuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuazEgPSBjaHVuaztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rMiA9IGNodW5rO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSAmJiAhY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rMiA9IENsb25lQXNVaW50OEFycmF5KGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChjbG9uZUUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjbG9uZUUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNsb25lRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCBjbG9uZUUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmsxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuazIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQxIHx8ICFjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyLCByZWFkUmVxdWVzdCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1bGxXaXRoQllPQlJlYWRlcih2aWV3LCBmb3JCcmFuY2gyKSB7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHN0cmVhbSk7XG4gICAgICAgICAgICBmb3J3YXJkUmVhZGVyRXJyb3IocmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieW9iQnJhbmNoID0gZm9yQnJhbmNoMiA/IGJyYW5jaDIgOiBicmFuY2gxO1xuICAgICAgICBjb25zdCBvdGhlckJyYW5jaCA9IGZvckJyYW5jaDIgPyBicmFuY2gxIDogYnJhbmNoMjtcbiAgICAgICAgY29uc3QgcmVhZEludG9SZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlbGF5ZWQgYSBtaWNyb3Rhc2sgYmVjYXVzZSBpdCB0YWtlcyBhdCBsZWFzdCBhIG1pY3JvdGFzayB0byBkZXRlY3QgZXJyb3JzICh1c2luZ1xuICAgICAgICAgICAgICAgIC8vIHJlYWRlci5fY2xvc2VkUHJvbWlzZSBiZWxvdyksIGFuZCB3ZSB3YW50IGVycm9ycyBpbiBzdHJlYW0gdG8gZXJyb3IgYm90aCBicmFuY2hlcyBpbW1lZGlhdGVseS4gV2UgY2Fubm90IGxldFxuICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwgc3luY2hyb25vdXNseS1hdmFpbGFibGUgcmVhZHMgZ2V0IGFoZWFkIG9mIGFzeW5jaHJvbm91c2x5LWF2YWlsYWJsZSBlcnJvcnMuXG4gICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ5b2JDYW5jZWxlZCA9IGZvckJyYW5jaDIgPyBjYW5jZWxlZDIgOiBjYW5jZWxlZDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyQ2FuY2VsZWQgPSBmb3JCcmFuY2gyID8gY2FuY2VsZWQxIDogY2FuY2VsZWQyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW90aGVyQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9uZWRDaHVuaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkQ2h1bmsgPSBDbG9uZUFzVWludDhBcnJheShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoY2xvbmVFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2xvbmVFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3Iob3RoZXJCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2xvbmVFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNsb25lRSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnlvYkNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3VmlldyhieW9iQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKG90aGVyQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNsb25lZENodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghYnlvYkNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgYnlvYkNhbmNlbGVkID0gZm9yQnJhbmNoMiA/IGNhbmNlbGVkMiA6IGNhbmNlbGVkMTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlckNhbmNlbGVkID0gZm9yQnJhbmNoMiA/IGNhbmNlbGVkMSA6IGNhbmNlbGVkMjtcbiAgICAgICAgICAgICAgICBpZiAoIWJ5b2JDYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UoYnlvYkJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFvdGhlckNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShvdGhlckJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNodW5rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFieW9iQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcoYnlvYkJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvdGhlckNhbmNlbGVkICYmIG90aGVyQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQob3RoZXJCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFieW9iQ2FuY2VsZWQgfHwgIW90aGVyQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQocmVhZGVyLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsMUFsZ29yaXRobSgpIHtcbiAgICAgICAgaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJ5b2JSZXF1ZXN0ID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgIGlmIChieW9iUmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHVsbFdpdGhEZWZhdWx0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwdWxsV2l0aEJZT0JSZWFkZXIoYnlvYlJlcXVlc3QuX3ZpZXcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsMkFsZ29yaXRobSgpIHtcbiAgICAgICAgaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJ5b2JSZXF1ZXN0ID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgIGlmIChieW9iUmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHVsbFdpdGhEZWZhdWx0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwdWxsV2l0aEJZT0JSZWFkZXIoYnlvYlJlcXVlc3QuX3ZpZXcsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbDFBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgIGNhbmNlbGVkMSA9IHRydWU7XG4gICAgICAgIHJlYXNvbjEgPSByZWFzb247XG4gICAgICAgIGlmIChjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZVJlYXNvbiA9IENyZWF0ZUFycmF5RnJvbUxpc3QoW3JlYXNvbjEsIHJlYXNvbjJdKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTtcbiAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKGNhbmNlbFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbFByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbDJBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgIGNhbmNlbGVkMiA9IHRydWU7XG4gICAgICAgIHJlYXNvbjIgPSByZWFzb247XG4gICAgICAgIGlmIChjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZVJlYXNvbiA9IENyZWF0ZUFycmF5RnJvbUxpc3QoW3JlYXNvbjEsIHJlYXNvbjJdKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTtcbiAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKGNhbmNlbFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbFByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGJyYW5jaDEgPSBDcmVhdGVSZWFkYWJsZUJ5dGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGwxQWxnb3JpdGhtLCBjYW5jZWwxQWxnb3JpdGhtKTtcbiAgICBicmFuY2gyID0gQ3JlYXRlUmVhZGFibGVCeXRlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCBwdWxsMkFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7XG4gICAgZm9yd2FyZFJlYWRlckVycm9yKHJlYWRlcik7XG4gICAgcmV0dXJuIFticmFuY2gxLCBicmFuY2gyXTtcbn1cblxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdEZWZhdWx0T3JCeXRlU291cmNlKHNvdXJjZSwgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkoc291cmNlLCBjb250ZXh0KTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHNvdXJjZTtcbiAgICBjb25zdCBhdXRvQWxsb2NhdGVDaHVua1NpemUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwuYXV0b0FsbG9jYXRlQ2h1bmtTaXplO1xuICAgIGNvbnN0IGNhbmNlbCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5jYW5jZWw7XG4gICAgY29uc3QgcHVsbCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5wdWxsO1xuICAgIGNvbnN0IHN0YXJ0ID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnN0YXJ0O1xuICAgIGNvbnN0IHR5cGUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwudHlwZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhdXRvQWxsb2NhdGVDaHVua1NpemU6IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5zaWduZWRMb25nTG9uZ1dpdGhFbmZvcmNlUmFuZ2UoYXV0b0FsbG9jYXRlQ2h1bmtTaXplLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdhdXRvQWxsb2NhdGVDaHVua1NpemUnIHRoYXRgKSxcbiAgICAgICAgY2FuY2VsOiBjYW5jZWwgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTb3VyY2VDYW5jZWxDYWxsYmFjayhjYW5jZWwsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdjYW5jZWwnIHRoYXRgKSxcbiAgICAgICAgcHVsbDogcHVsbCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5kZXJseWluZ1NvdXJjZVB1bGxDYWxsYmFjayhwdWxsLCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAncHVsbCcgdGhhdGApLFxuICAgICAgICBzdGFydDogc3RhcnQgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTb3VyY2VTdGFydENhbGxiYWNrKHN0YXJ0LCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc3RhcnQnIHRoYXRgKSxcbiAgICAgICAgdHlwZTogdHlwZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogY29udmVydFJlYWRhYmxlU3RyZWFtVHlwZSh0eXBlLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICd0eXBlJyB0aGF0YClcbiAgICB9O1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTb3VyY2VDYW5jZWxDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChyZWFzb24pID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW3JlYXNvbl0pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTb3VyY2VQdWxsQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcHJvbWlzZUNhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTb3VyY2VTdGFydENhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKGNvbnRyb2xsZXIpID0+IHJlZmxlY3RDYWxsKGZuLCBvcmlnaW5hbCwgW2NvbnRyb2xsZXJdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRSZWFkYWJsZVN0cmVhbVR5cGUodHlwZSwgY29udGV4dCkge1xuICAgIHR5cGUgPSBgJHt0eXBlfWA7XG4gICAgaWYgKHR5cGUgIT09ICdieXRlcycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSAnJHt0eXBlfScgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yIFJlYWRhYmxlU3RyZWFtVHlwZWApO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZTtcbn1cblxuZnVuY3Rpb24gY29udmVydFJlYWRlck9wdGlvbnMob3B0aW9ucywgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkob3B0aW9ucywgY29udGV4dCk7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tb2RlO1xuICAgIHJldHVybiB7XG4gICAgICAgIG1vZGU6IG1vZGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRSZWFkYWJsZVN0cmVhbVJlYWRlck1vZGUobW9kZSwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnbW9kZScgdGhhdGApXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRSZWFkYWJsZVN0cmVhbVJlYWRlck1vZGUobW9kZSwgY29udGV4dCkge1xuICAgIG1vZGUgPSBgJHttb2RlfWA7XG4gICAgaWYgKG1vZGUgIT09ICdieW9iJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9ICcke21vZGV9JyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgUmVhZGFibGVTdHJlYW1SZWFkZXJNb2RlYCk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0SXRlcmF0b3JPcHRpb25zKG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KG9wdGlvbnMsIGNvbnRleHQpO1xuICAgIGNvbnN0IHByZXZlbnRDYW5jZWwgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldmVudENhbmNlbDtcbiAgICByZXR1cm4geyBwcmV2ZW50Q2FuY2VsOiBCb29sZWFuKHByZXZlbnRDYW5jZWwpIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQaXBlT3B0aW9ucyhvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShvcHRpb25zLCBjb250ZXh0KTtcbiAgICBjb25zdCBwcmV2ZW50QWJvcnQgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldmVudEFib3J0O1xuICAgIGNvbnN0IHByZXZlbnRDYW5jZWwgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldmVudENhbmNlbDtcbiAgICBjb25zdCBwcmV2ZW50Q2xvc2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldmVudENsb3NlO1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEFib3J0U2lnbmFsKHNpZ25hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc2lnbmFsJyB0aGF0YCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByZXZlbnRBYm9ydDogQm9vbGVhbihwcmV2ZW50QWJvcnQpLFxuICAgICAgICBwcmV2ZW50Q2FuY2VsOiBCb29sZWFuKHByZXZlbnRDYW5jZWwpLFxuICAgICAgICBwcmV2ZW50Q2xvc2U6IEJvb2xlYW4ocHJldmVudENsb3NlKSxcbiAgICAgICAgc2lnbmFsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFzc2VydEFib3J0U2lnbmFsKHNpZ25hbCwgY29udGV4dCkge1xuICAgIGlmICghaXNBYm9ydFNpZ25hbChzaWduYWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7Y29udGV4dH0gaXMgbm90IGFuIEFib3J0U2lnbmFsLmApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFJlYWRhYmxlV3JpdGFibGVQYWlyKHBhaXIsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KHBhaXIsIGNvbnRleHQpO1xuICAgIGNvbnN0IHJlYWRhYmxlID0gcGFpciA9PT0gbnVsbCB8fCBwYWlyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYWlyLnJlYWRhYmxlO1xuICAgIGFzc2VydFJlcXVpcmVkRmllbGQocmVhZGFibGUsICdyZWFkYWJsZScsICdSZWFkYWJsZVdyaXRhYmxlUGFpcicpO1xuICAgIGFzc2VydFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdyZWFkYWJsZScgdGhhdGApO1xuICAgIGNvbnN0IHdyaXRhYmxlID0gcGFpciA9PT0gbnVsbCB8fCBwYWlyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYWlyLndyaXRhYmxlO1xuICAgIGFzc2VydFJlcXVpcmVkRmllbGQod3JpdGFibGUsICd3cml0YWJsZScsICdSZWFkYWJsZVdyaXRhYmxlUGFpcicpO1xuICAgIGFzc2VydFdyaXRhYmxlU3RyZWFtKHdyaXRhYmxlLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICd3cml0YWJsZScgdGhhdGApO1xuICAgIHJldHVybiB7IHJlYWRhYmxlLCB3cml0YWJsZSB9O1xufVxuXG4vKipcbiAqIEEgcmVhZGFibGUgc3RyZWFtIHJlcHJlc2VudHMgYSBzb3VyY2Ugb2YgZGF0YSwgZnJvbSB3aGljaCB5b3UgY2FuIHJlYWQuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBSZWFkYWJsZVN0cmVhbSB7XG4gICAgY29uc3RydWN0b3IocmF3VW5kZXJseWluZ1NvdXJjZSA9IHt9LCByYXdTdHJhdGVneSA9IHt9KSB7XG4gICAgICAgIGlmIChyYXdVbmRlcmx5aW5nU291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJhd1VuZGVybHlpbmdTb3VyY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0T2JqZWN0KHJhd1VuZGVybHlpbmdTb3VyY2UsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJhdGVneSA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kocmF3U3RyYXRlZ3ksICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IHVuZGVybHlpbmdTb3VyY2UgPSBjb252ZXJ0VW5kZXJseWluZ0RlZmF1bHRPckJ5dGVTb3VyY2UocmF3VW5kZXJseWluZ1NvdXJjZSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBJbml0aWFsaXplUmVhZGFibGVTdHJlYW0odGhpcyk7XG4gICAgICAgIGlmICh1bmRlcmx5aW5nU291cmNlLnR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgICAgIGlmIChzdHJhdGVneS5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHN0cmF0ZWd5IGZvciBhIGJ5dGUgc3RyZWFtIGNhbm5vdCBoYXZlIGEgc2l6ZSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGlnaFdhdGVyTWFyayA9IEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHN0cmF0ZWd5LCAwKTtcbiAgICAgICAgICAgIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHRoaXMsIHVuZGVybHlpbmdTb3VyY2UsIGhpZ2hXYXRlck1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZUFsZ29yaXRobSA9IEV4dHJhY3RTaXplQWxnb3JpdGhtKHN0cmF0ZWd5KTtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hXYXRlck1hcmsgPSBFeHRyYWN0SGlnaFdhdGVyTWFyayhzdHJhdGVneSwgMSk7XG4gICAgICAgICAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcmVhZGFibGUgc3RyZWFtIGlzIGxvY2tlZCB0byBhIHtAbGluayBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgfCByZWFkZXJ9LlxuICAgICAqL1xuICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdsb2NrZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VscyB0aGUgc3RyZWFtLCBzaWduYWxpbmcgYSBsb3NzIG9mIGludGVyZXN0IGluIHRoZSBzdHJlYW0gYnkgYSBjb25zdW1lci5cbiAgICAgKlxuICAgICAqIFRoZSBzdXBwbGllZCBgcmVhc29uYCBhcmd1bWVudCB3aWxsIGJlIGdpdmVuIHRvIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSdzIHtAbGluayBVbmRlcmx5aW5nU291cmNlLmNhbmNlbCB8IGNhbmNlbCgpfVxuICAgICAqIG1ldGhvZCwgd2hpY2ggbWlnaHQgb3IgbWlnaHQgbm90IHVzZSBpdC5cbiAgICAgKi9cbiAgICBjYW5jZWwocmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdjYW5jZWwnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYW5jZWwgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHJlYWRlcicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwodGhpcywgcmVhc29uKTtcbiAgICB9XG4gICAgZ2V0UmVhZGVyKHJhd09wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2dldFJlYWRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb252ZXJ0UmVhZGVyT3B0aW9ucyhyYXdPcHRpb25zLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChvcHRpb25zLm1vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcyk7XG4gICAgfVxuICAgIHBpcGVUaHJvdWdoKHJhd1RyYW5zZm9ybSwgcmF3T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdwaXBlVGhyb3VnaCcpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQocmF3VHJhbnNmb3JtLCAxLCAncGlwZVRocm91Z2gnKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gY29udmVydFJlYWRhYmxlV3JpdGFibGVQYWlyKHJhd1RyYW5zZm9ybSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gY29udmVydFBpcGVPcHRpb25zKHJhd09wdGlvbnMsICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0cmFuc2Zvcm0ud3JpdGFibGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNlID0gUmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcywgdHJhbnNmb3JtLndyaXRhYmxlLCBvcHRpb25zLnByZXZlbnRDbG9zZSwgb3B0aW9ucy5wcmV2ZW50QWJvcnQsIG9wdGlvbnMucHJldmVudENhbmNlbCwgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHByb21pc2UpO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgIH1cbiAgICBwaXBlVG8oZGVzdGluYXRpb24sIHJhd09wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRvJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChgUGFyYW1ldGVyIDEgaXMgcmVxdWlyZWQgaW4gJ3BpcGVUbycuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKGRlc3RpbmF0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUbydzIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBXcml0YWJsZVN0cmVhbWApKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3B0aW9ucztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBjb252ZXJ0UGlwZU9wdGlvbnMocmF3T3B0aW9ucywgJ1NlY29uZCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQoZGVzdGluYXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFdyaXRhYmxlU3RyZWFtJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbVBpcGVUbyh0aGlzLCBkZXN0aW5hdGlvbiwgb3B0aW9ucy5wcmV2ZW50Q2xvc2UsIG9wdGlvbnMucHJldmVudEFib3J0LCBvcHRpb25zLnByZXZlbnRDYW5jZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVlcyB0aGlzIHJlYWRhYmxlIHN0cmVhbSwgcmV0dXJuaW5nIGEgdHdvLWVsZW1lbnQgYXJyYXkgY29udGFpbmluZyB0aGUgdHdvIHJlc3VsdGluZyBicmFuY2hlcyBhc1xuICAgICAqIG5ldyB7QGxpbmsgUmVhZGFibGVTdHJlYW19IGluc3RhbmNlcy5cbiAgICAgKlxuICAgICAqIFRlZWluZyBhIHN0cmVhbSB3aWxsIGxvY2sgaXQsIHByZXZlbnRpbmcgYW55IG90aGVyIGNvbnN1bWVyIGZyb20gYWNxdWlyaW5nIGEgcmVhZGVyLlxuICAgICAqIFRvIGNhbmNlbCB0aGUgc3RyZWFtLCBjYW5jZWwgYm90aCBvZiB0aGUgcmVzdWx0aW5nIGJyYW5jaGVzOyBhIGNvbXBvc2l0ZSBjYW5jZWxsYXRpb24gcmVhc29uIHdpbGwgdGhlbiBiZVxuICAgICAqIHByb3BhZ2F0ZWQgdG8gdGhlIHN0cmVhbSdzIHVuZGVybHlpbmcgc291cmNlLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBjaHVua3Mgc2VlbiBpbiBlYWNoIGJyYW5jaCB3aWxsIGJlIHRoZSBzYW1lIG9iamVjdC4gSWYgdGhlIGNodW5rcyBhcmUgbm90IGltbXV0YWJsZSxcbiAgICAgKiB0aGlzIGNvdWxkIGFsbG93IGludGVyZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gYnJhbmNoZXMuXG4gICAgICovXG4gICAgdGVlKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgndGVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnJhbmNoZXMgPSBSZWFkYWJsZVN0cmVhbVRlZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIENyZWF0ZUFycmF5RnJvbUxpc3QoYnJhbmNoZXMpO1xuICAgIH1cbiAgICB2YWx1ZXMocmF3T3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgndmFsdWVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbnZlcnRJdGVyYXRvck9wdGlvbnMocmF3T3B0aW9ucywgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzLCBvcHRpb25zLnByZXZlbnRDYW5jZWwpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIGNhbmNlbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZ2V0UmVhZGVyOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBwaXBlVGhyb3VnaDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcGlwZVRvOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB0ZWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHZhbHVlczogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgbG9ja2VkOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnUmVhZGFibGVTdHJlYW0nLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yLCB7XG4gICAgICAgIHZhbHVlOiBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUudmFsdWVzLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG4vLyBUaHJvd3MgaWYgYW5kIG9ubHkgaWYgc3RhcnRBbGdvcml0aG0gdGhyb3dzLlxuZnVuY3Rpb24gQ3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyayA9IDEsIHNpemVBbGdvcml0aG0gPSAoKSA9PiAxKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUpO1xuICAgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbShzdHJlYW0pO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuLy8gVGhyb3dzIGlmIGFuZCBvbmx5IGlmIHN0YXJ0QWxnb3JpdGhtIHRocm93cy5cbmZ1bmN0aW9uIENyZWF0ZVJlYWRhYmxlQnl0ZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUpO1xuICAgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbShzdHJlYW0pO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCAwLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiBzdHJlYW07XG59XG5mdW5jdGlvbiBJbml0aWFsaXplUmVhZGFibGVTdHJlYW0oc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdyZWFkYWJsZSc7XG4gICAgc3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW0uX2Rpc3R1cmJlZCA9IGZhbHNlO1xufVxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbTtcbn1cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5fcmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFJlYWRhYmxlU3RyZWFtIEFQSSBleHBvc2VkIGZvciBjb250cm9sbGVycy5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgaWYgKHJlYWRlciAhPT0gdW5kZWZpbmVkICYmIElzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLmZvckVhY2gocmVhZEludG9SZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fY2xvc2VTdGVwcyh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZUNhbmNlbFByb21pc2UgPSBzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcltDYW5jZWxTdGVwc10ocmVhc29uKTtcbiAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoc291cmNlQ2FuY2VsUHJvbWlzZSwgbm9vcCk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSkge1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnY2xvc2VkJztcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUocmVhZGVyKTtcbiAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICByZWFkZXIuX3JlYWRSZXF1ZXN0cy5mb3JFYWNoKHJlYWRSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgIHJlYWRSZXF1ZXN0Ll9jbG9zZVN0ZXBzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIuX3JlYWRSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKSB7XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICBzdHJlYW0uX3N0b3JlZEVycm9yID0gZTtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyZWFkZXIsIGUpO1xuICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgIHJlYWRlci5fcmVhZFJlcXVlc3RzLmZvckVhY2gocmVhZFJlcXVlc3QgPT4ge1xuICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2Vycm9yU3RlcHMoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIuX3JlYWRSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLmZvckVhY2gocmVhZEludG9SZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fZXJyb3JTdGVwcyhlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbS5cbmZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMShuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbWApO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5SW5pdChpbml0LCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShpbml0LCBjb250ZXh0KTtcbiAgICBjb25zdCBoaWdoV2F0ZXJNYXJrID0gaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LmhpZ2hXYXRlck1hcms7XG4gICAgYXNzZXJ0UmVxdWlyZWRGaWVsZChoaWdoV2F0ZXJNYXJrLCAnaGlnaFdhdGVyTWFyaycsICdRdWV1aW5nU3RyYXRlZ3lJbml0Jyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGlnaFdhdGVyTWFyazogY29udmVydFVucmVzdHJpY3RlZERvdWJsZShoaWdoV2F0ZXJNYXJrKVxuICAgIH07XG59XG5cbi8vIFRoZSBzaXplIGZ1bmN0aW9uIG11c3Qgbm90IGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgbm9yIGJlIGEgY29uc3RydWN0b3JcbmNvbnN0IGJ5dGVMZW5ndGhTaXplRnVuY3Rpb24gPSAoY2h1bmspID0+IHtcbiAgICByZXR1cm4gY2h1bmsuYnl0ZUxlbmd0aDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoYnl0ZUxlbmd0aFNpemVGdW5jdGlvbiwgJ25hbWUnLCB7XG4gICAgdmFsdWU6ICdzaXplJyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuLyoqXG4gKiBBIHF1ZXVpbmcgc3RyYXRlZ3kgdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIGNodW5rLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KG9wdGlvbnMsIDEsICdCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5Jyk7XG4gICAgICAgIG9wdGlvbnMgPSBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5SW5pdChvcHRpb25zLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIHRoaXMuX2J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoaWdoIHdhdGVyIG1hcmsgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGdldCBoaWdoV2F0ZXJNYXJrKCkge1xuICAgICAgICBpZiAoIUlzQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZUxlbmd0aEJyYW5kQ2hlY2tFeGNlcHRpb24oJ2hpZ2hXYXRlck1hcmsnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcms7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1lYXN1cmVzIHRoZSBzaXplIG9mIGBjaHVua2AgYnkgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiBpdHMgYGJ5dGVMZW5ndGhgIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBpZiAoIUlzQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZUxlbmd0aEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3NpemUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZUxlbmd0aFNpemVGdW5jdGlvbjtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZSwge1xuICAgIGhpZ2hXYXRlck1hcms6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHNpemU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3knLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LlxuZnVuY3Rpb24gYnl0ZUxlbmd0aEJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5YCk7XG59XG5mdW5jdGlvbiBJc0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3koeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19ieXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyaycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5O1xufVxuXG4vLyBUaGUgc2l6ZSBmdW5jdGlvbiBtdXN0IG5vdCBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG5vciBiZSBhIGNvbnN0cnVjdG9yXG5jb25zdCBjb3VudFNpemVGdW5jdGlvbiA9ICgpID0+IHtcbiAgICByZXR1cm4gMTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoY291bnRTaXplRnVuY3Rpb24sICduYW1lJywge1xuICAgIHZhbHVlOiAnc2l6ZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG59KTtcbi8qKlxuICogQSBxdWV1aW5nIHN0cmF0ZWd5IHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgY2h1bmtzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgQ291bnRRdWV1aW5nU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChvcHRpb25zLCAxLCAnQ291bnRRdWV1aW5nU3RyYXRlZ3knKTtcbiAgICAgICAgb3B0aW9ucyA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lJbml0KG9wdGlvbnMsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgdGhpcy5fY291bnRRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoaWdoIHdhdGVyIG1hcmsgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGdldCBoaWdoV2F0ZXJNYXJrKCkge1xuICAgICAgICBpZiAoIUlzQ291bnRRdWV1aW5nU3RyYXRlZ3kodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGNvdW50QnJhbmRDaGVja0V4Y2VwdGlvbignaGlnaFdhdGVyTWFyaycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcms7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1lYXN1cmVzIHRoZSBzaXplIG9mIGBjaHVua2AgYnkgYWx3YXlzIHJldHVybmluZyAxLlxuICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBxdWV1ZSBzaXplIGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBjaHVua3MgaW4gdGhlIHF1ZXVlLlxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBpZiAoIUlzQ291bnRRdWV1aW5nU3RyYXRlZ3kodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGNvdW50QnJhbmRDaGVja0V4Y2VwdGlvbignc2l6ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudFNpemVGdW5jdGlvbjtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb3VudFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUsIHtcbiAgICBoaWdoV2F0ZXJNYXJrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBzaXplOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb3VudFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnQ291bnRRdWV1aW5nU3RyYXRlZ3knLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBDb3VudFF1ZXVpbmdTdHJhdGVneS5cbmZ1bmN0aW9uIGNvdW50QnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYENvdW50UXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBDb3VudFF1ZXVpbmdTdHJhdGVneWApO1xufVxuZnVuY3Rpb24gSXNDb3VudFF1ZXVpbmdTdHJhdGVneSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvdW50UXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyaycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBDb3VudFF1ZXVpbmdTdHJhdGVneTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zZm9ybWVyKG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShvcmlnaW5hbCwgY29udGV4dCk7XG4gICAgY29uc3QgZmx1c2ggPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwuZmx1c2g7XG4gICAgY29uc3QgcmVhZGFibGVUeXBlID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnJlYWRhYmxlVHlwZTtcbiAgICBjb25zdCBzdGFydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5zdGFydDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwudHJhbnNmb3JtO1xuICAgIGNvbnN0IHdyaXRhYmxlVHlwZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC53cml0YWJsZVR5cGU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmx1c2g6IGZsdXNoID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRUcmFuc2Zvcm1lckZsdXNoQ2FsbGJhY2soZmx1c2gsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdmbHVzaCcgdGhhdGApLFxuICAgICAgICByZWFkYWJsZVR5cGUsXG4gICAgICAgIHN0YXJ0OiBzdGFydCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VHJhbnNmb3JtZXJTdGFydENhbGxiYWNrKHN0YXJ0LCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc3RhcnQnIHRoYXRgKSxcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0gPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFRyYW5zZm9ybWVyVHJhbnNmb3JtQ2FsbGJhY2sodHJhbnNmb3JtLCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAndHJhbnNmb3JtJyB0aGF0YCksXG4gICAgICAgIHdyaXRhYmxlVHlwZVxuICAgIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNmb3JtZXJGbHVzaENhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKGNvbnRyb2xsZXIpID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW2NvbnRyb2xsZXJdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2Zvcm1lclN0YXJ0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcmVmbGVjdENhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFRyYW5zZm9ybWVyVHJhbnNmb3JtQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY2h1bmssIGNvbnRyb2xsZXIpID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW2NodW5rLCBjb250cm9sbGVyXSk7XG59XG5cbi8vIENsYXNzIFRyYW5zZm9ybVN0cmVhbVxuLyoqXG4gKiBBIHRyYW5zZm9ybSBzdHJlYW0gY29uc2lzdHMgb2YgYSBwYWlyIG9mIHN0cmVhbXM6IGEge0BsaW5rIFdyaXRhYmxlU3RyZWFtIHwgd3JpdGFibGUgc3RyZWFtfSxcbiAqIGtub3duIGFzIGl0cyB3cml0YWJsZSBzaWRlLCBhbmQgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW0gfCByZWFkYWJsZSBzdHJlYW19LCBrbm93biBhcyBpdHMgcmVhZGFibGUgc2lkZS5cbiAqIEluIGEgbWFubmVyIHNwZWNpZmljIHRvIHRoZSB0cmFuc2Zvcm0gc3RyZWFtIGluIHF1ZXN0aW9uLCB3cml0ZXMgdG8gdGhlIHdyaXRhYmxlIHNpZGUgcmVzdWx0IGluIG5ldyBkYXRhIGJlaW5nXG4gKiBtYWRlIGF2YWlsYWJsZSBmb3IgcmVhZGluZyBmcm9tIHRoZSByZWFkYWJsZSBzaWRlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgVHJhbnNmb3JtU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihyYXdUcmFuc2Zvcm1lciA9IHt9LCByYXdXcml0YWJsZVN0cmF0ZWd5ID0ge30sIHJhd1JlYWRhYmxlU3RyYXRlZ3kgPSB7fSkge1xuICAgICAgICBpZiAocmF3VHJhbnNmb3JtZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmF3VHJhbnNmb3JtZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdyaXRhYmxlU3RyYXRlZ3kgPSBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5KHJhd1dyaXRhYmxlU3RyYXRlZ3ksICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlU3RyYXRlZ3kgPSBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5KHJhd1JlYWRhYmxlU3RyYXRlZ3ksICdUaGlyZCBwYXJhbWV0ZXInKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBjb252ZXJ0VHJhbnNmb3JtZXIocmF3VHJhbnNmb3JtZXIsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVyLnJlYWRhYmxlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCByZWFkYWJsZVR5cGUgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zZm9ybWVyLndyaXRhYmxlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB3cml0YWJsZVR5cGUgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGFibGVIaWdoV2F0ZXJNYXJrID0gRXh0cmFjdEhpZ2hXYXRlck1hcmsocmVhZGFibGVTdHJhdGVneSwgMCk7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlU2l6ZUFsZ29yaXRobSA9IEV4dHJhY3RTaXplQWxnb3JpdGhtKHJlYWRhYmxlU3RyYXRlZ3kpO1xuICAgICAgICBjb25zdCB3cml0YWJsZUhpZ2hXYXRlck1hcmsgPSBFeHRyYWN0SGlnaFdhdGVyTWFyayh3cml0YWJsZVN0cmF0ZWd5LCAxKTtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVTaXplQWxnb3JpdGhtID0gRXh0cmFjdFNpemVBbGdvcml0aG0od3JpdGFibGVTdHJhdGVneSk7XG4gICAgICAgIGxldCBzdGFydFByb21pc2VfcmVzb2x2ZTtcbiAgICAgICAgY29uc3Qgc3RhcnRQcm9taXNlID0gbmV3UHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHN0YXJ0UHJvbWlzZV9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIEluaXRpYWxpemVUcmFuc2Zvcm1TdHJlYW0odGhpcywgc3RhcnRQcm9taXNlLCB3cml0YWJsZUhpZ2hXYXRlck1hcmssIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSwgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLCByZWFkYWJsZVNpemVBbGdvcml0aG0pO1xuICAgICAgICBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVRyYW5zZm9ybWVyKHRoaXMsIHRyYW5zZm9ybWVyKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVyLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXJ0UHJvbWlzZV9yZXNvbHZlKHRyYW5zZm9ybWVyLnN0YXJ0KHRoaXMuX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0UHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlYWRhYmxlIHNpZGUgb2YgdGhlIHRyYW5zZm9ybSBzdHJlYW0uXG4gICAgICovXG4gICAgZ2V0IHJlYWRhYmxlKCkge1xuICAgICAgICBpZiAoIUlzVHJhbnNmb3JtU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdyZWFkYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHdyaXRhYmxlIHNpZGUgb2YgdGhlIHRyYW5zZm9ybSBzdHJlYW0uXG4gICAgICovXG4gICAgZ2V0IHdyaXRhYmxlKCkge1xuICAgICAgICBpZiAoIUlzVHJhbnNmb3JtU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCd3cml0YWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgcmVhZGFibGU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHdyaXRhYmxlOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1RyYW5zZm9ybVN0cmVhbScsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuZnVuY3Rpb24gSW5pdGlhbGl6ZVRyYW5zZm9ybVN0cmVhbShzdHJlYW0sIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKSB7XG4gICAgZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKSB7XG4gICAgICAgIHJldHVybiBzdGFydFByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdyaXRlQWxnb3JpdGhtKGNodW5rKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua1dyaXRlQWxnb3JpdGhtKHN0cmVhbSwgY2h1bmspO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhYm9ydEFsZ29yaXRobShyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQWJvcnRBbGdvcml0aG0oc3RyZWFtLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbG9zZUFsZ29yaXRobSgpIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQ2xvc2VBbGdvcml0aG0oc3RyZWFtKTtcbiAgICB9XG4gICAgc3RyZWFtLl93cml0YWJsZSA9IENyZWF0ZVdyaXRhYmxlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCB3cml0YWJsZUhpZ2hXYXRlck1hcmssIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSk7XG4gICAgZnVuY3Rpb24gcHVsbEFsZ29yaXRobSgpIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtKHN0cmVhbSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbEFsZ29yaXRobShyZWFzb24pIHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIHJlYXNvbik7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHN0cmVhbS5fcmVhZGFibGUgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCByZWFkYWJsZUhpZ2hXYXRlck1hcmssIHJlYWRhYmxlU2l6ZUFsZ29yaXRobSk7XG4gICAgLy8gVGhlIFtbYmFja3ByZXNzdXJlXV0gc2xvdCBpcyBzZXQgdG8gdW5kZWZpbmVkIHNvIHRoYXQgaXQgY2FuIGJlIGluaXRpYWxpc2VkIGJ5IFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZS5cbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgdHJ1ZSk7XG4gICAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gSXNUcmFuc2Zvcm1TdHJlYW0oeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ190cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFRyYW5zZm9ybVN0cmVhbTtcbn1cbi8vIFRoaXMgaXMgYSBuby1vcCBpZiBib3RoIHNpZGVzIGFyZSBhbHJlYWR5IGVycm9yZWQuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIGUpIHtcbiAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3Ioc3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBlKTtcbiAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSkge1xuICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcik7XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoc3RyZWFtLl93cml0YWJsZS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyLCBlKTtcbiAgICBpZiAoc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgLy8gUHJldGVuZCB0aGF0IHB1bGwoKSB3YXMgY2FsbGVkIHRvIHBlcm1pdCBhbnkgcGVuZGluZyB3cml0ZSgpIGNhbGxzIHRvIGNvbXBsZXRlLiBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoKVxuICAgICAgICAvLyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gZW5xdWV1ZSgpIG9yIHB1bGwoKSBvbmNlIHRoZSBSZWFkYWJsZVN0cmVhbSBpcyBlcnJvcmVkLCBzbyB0aGlzIHdpbGwgd2lsbCBiZSB0aGUgZmluYWwgdGltZVxuICAgICAgICAvLyBfYmFja3ByZXNzdXJlIGlzIHNldC5cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgZmFsc2UpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSkge1xuICAgIC8vIFBhc3NlcyBhbHNvIHdoZW4gY2FsbGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlKCk7XG4gICAgfVxuICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSA9IG5ld1Byb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTtcbn1cbi8vIENsYXNzIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyXG4vKipcbiAqIEFsbG93cyBjb250cm9sIG9mIHRoZSB7QGxpbmsgUmVhZGFibGVTdHJlYW19IGFuZCB7QGxpbmsgV3JpdGFibGVTdHJlYW19IG9mIHRoZSBhc3NvY2lhdGVkIHtAbGluayBUcmFuc2Zvcm1TdHJlYW19LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSByZWFkYWJsZSBzaWRl4oCZcyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXMgb3Zlci1mdWxsLlxuICAgICAqL1xuICAgIGdldCBkZXNpcmVkU2l6ZSgpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGFibGVDb250cm9sbGVyID0gdGhpcy5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShyZWFkYWJsZUNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBlbnF1ZXVlKGNodW5rID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdlbnF1ZXVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXJyb3JzIGJvdGggdGhlIHJlYWRhYmxlIHNpZGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlIG9mIHRoZSBjb250cm9sbGVkIHRyYW5zZm9ybSBzdHJlYW0sIG1ha2luZyBhbGwgZnV0dXJlXG4gICAgICogaW50ZXJhY3Rpb25zIHdpdGggaXQgZmFpbCB3aXRoIHRoZSBnaXZlbiBlcnJvciBgZWAuIEFueSBjaHVua3MgcXVldWVkIGZvciB0cmFuc2Zvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICBlcnJvcihyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHJlYWRhYmxlIHNpZGUgYW5kIGVycm9ycyB0aGUgd3JpdGFibGUgc2lkZSBvZiB0aGUgY29udHJvbGxlZCB0cmFuc2Zvcm0gc3RyZWFtLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZVxuICAgICAqIHRyYW5zZm9ybWVyIG9ubHkgbmVlZHMgdG8gY29uc3VtZSBhIHBvcnRpb24gb2YgdGhlIGNodW5rcyB3cml0dGVuIHRvIHRoZSB3cml0YWJsZSBzaWRlLlxuICAgICAqL1xuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Rlcm1pbmF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyVGVybWluYXRlKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIGVucXVldWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVycm9yOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB0ZXJtaW5hdGU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGRlc2lyZWRTaXplOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIFRyYW5zZm9ybSBTdHJlYW0gRGVmYXVsdCBDb250cm9sbGVyIEFic3RyYWN0IE9wZXJhdGlvbnNcbmZ1bmN0aW9uIElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xufVxuZnVuY3Rpb24gU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHRyYW5zZm9ybUFsZ29yaXRobSwgZmx1c2hBbGdvcml0aG0pIHtcbiAgICBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgY29udHJvbGxlci5fdHJhbnNmb3JtQWxnb3JpdGhtID0gdHJhbnNmb3JtQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtID0gZmx1c2hBbGdvcml0aG07XG59XG5mdW5jdGlvbiBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVRyYW5zZm9ybWVyKHN0cmVhbSwgdHJhbnNmb3JtZXIpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIGxldCB0cmFuc2Zvcm1BbGdvcml0aG0gPSAoY2h1bmspID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuayk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoICh0cmFuc2Zvcm1SZXN1bHRFKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh0cmFuc2Zvcm1SZXN1bHRFKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IGZsdXNoQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGlmICh0cmFuc2Zvcm1lci50cmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cmFuc2Zvcm1BbGdvcml0aG0gPSBjaHVuayA9PiB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtZXIuZmx1c2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmbHVzaEFsZ29yaXRobSA9ICgpID0+IHRyYW5zZm9ybWVyLmZsdXNoKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgdHJhbnNmb3JtQWxnb3JpdGhtLCBmbHVzaEFsZ29yaXRobSk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgY29udHJvbGxlci5fdHJhbnNmb3JtQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGNvbnRyb2xsZXIsIGNodW5rKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbTtcbiAgICBjb25zdCByZWFkYWJsZUNvbnRyb2xsZXIgPSBzdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUocmVhZGFibGVDb250cm9sbGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZSBzaWRlIGlzIG5vdCBpbiBhIHN0YXRlIHRoYXQgcGVybWl0cyBlbnF1ZXVlJyk7XG4gICAgfVxuICAgIC8vIFdlIHRocm90dGxlIHRyYW5zZm9ybSBpbnZvY2F0aW9ucyBiYXNlZCBvbiB0aGUgYmFja3ByZXNzdXJlIG9mIHRoZSBSZWFkYWJsZVN0cmVhbSwgYnV0IHdlIHN0aWxsXG4gICAgLy8gYWNjZXB0IFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSgpIGNhbGxzLlxuICAgIHRyeSB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlciwgY2h1bmspO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZWFkYWJsZVN0cmF0ZWd5LnNpemUoKSB0aHJvd3MuXG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKTtcbiAgICAgICAgdGhyb3cgc3RyZWFtLl9yZWFkYWJsZS5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGJhY2twcmVzc3VyZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJIYXNCYWNrcHJlc3N1cmUocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICBpZiAoYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHtcbiAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLCBlKTtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIGNvbnN0IHRyYW5zZm9ybVByb21pc2UgPSBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0oY2h1bmspO1xuICAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aCh0cmFuc2Zvcm1Qcm9taXNlLCB1bmRlZmluZWQsIHIgPT4ge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLCByKTtcbiAgICAgICAgdGhyb3cgcjtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyVGVybWluYXRlKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtO1xuICAgIGNvbnN0IHJlYWRhYmxlQ29udHJvbGxlciA9IHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoJ1RyYW5zZm9ybVN0cmVhbSB0ZXJtaW5hdGVkJyk7XG4gICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIGVycm9yKTtcbn1cbi8vIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rIEFsZ29yaXRobXNcbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuaykge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBzdHJlYW0uX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlKSB7XG4gICAgICAgIGNvbnN0IGJhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2U7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChiYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IHN0cmVhbS5fd3JpdGFibGU7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHdyaXRhYmxlLl9zdGF0ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IHdyaXRhYmxlLl9zdG9yZWRFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0oY29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuayk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Fib3J0QWxnb3JpdGhtKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgLy8gYWJvcnQoKSBpcyBub3QgY2FsbGVkIHN5bmNocm9ub3VzbHksIHNvIGl0IGlzIHBvc3NpYmxlIGZvciBhYm9ydCgpIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgYWxyZWFkeVxuICAgIC8vIGVycm9yZWQuXG4gICAgVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCByZWFzb24pO1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Nsb3NlQWxnb3JpdGhtKHN0cmVhbSkge1xuICAgIC8vIHN0cmVhbS5fcmVhZGFibGUgY2Fubm90IGNoYW5nZSBhZnRlciBjb25zdHJ1Y3Rpb24sIHNvIGNhY2hpbmcgaXQgYWNyb3NzIGEgY2FsbCB0byB1c2VyIGNvZGUgaXMgc2FmZS5cbiAgICBjb25zdCByZWFkYWJsZSA9IHN0cmVhbS5fcmVhZGFibGU7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcjtcbiAgICBjb25zdCBmbHVzaFByb21pc2UgPSBjb250cm9sbGVyLl9mbHVzaEFsZ29yaXRobSgpO1xuICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgIC8vIFJldHVybiBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB1bmRlZmluZWQgb24gc3VjY2Vzcy5cbiAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoZmx1c2hQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgIGlmIChyZWFkYWJsZS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgdGhyb3cgcmVhZGFibGUuX3N0b3JlZEVycm9yO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShyZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICB9LCByID0+IHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCByKTtcbiAgICAgICAgdGhyb3cgcmVhZGFibGUuX3N0b3JlZEVycm9yO1xuICAgIH0pO1xufVxuLy8gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNvdXJjZSBBbGdvcml0aG1zXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobShzdHJlYW0pIHtcbiAgICAvLyBJbnZhcmlhbnQuIEVuZm9yY2VkIGJ5IHRoZSBwcm9taXNlcyByZXR1cm5lZCBieSBzdGFydCgpIGFuZCBwdWxsKCkuXG4gICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgZmFsc2UpO1xuICAgIC8vIFByZXZlbnQgdGhlIG5leHQgcHVsbCgpIGNhbGwgdW50aWwgdGhlcmUgaXMgYmFja3ByZXNzdXJlLlxuICAgIHJldHVybiBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2U7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIuXG5mdW5jdGlvbiBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJgKTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBUcmFuc2Zvcm1TdHJlYW0uXG5mdW5jdGlvbiBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW1gKTtcbn1cblxuZXhwb3J0IHsgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSwgQ291bnRRdWV1aW5nU3RyYXRlZ3ksIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIFJlYWRhYmxlU3RyZWFtLCBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIsIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QsIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIsIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciwgVHJhbnNmb3JtU3RyZWFtLCBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciwgV3JpdGFibGVTdHJlYW0sIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIsIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9ueWZpbGwuZXMyMDE4Lm1qcy5tYXBcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZCA9IChtb2R1bGUpID0+IHtcblx0bW9kdWxlLnBhdGhzID0gW107XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KTtcbiJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJ0aGlzIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImV2ZW50VGFyZ2V0U2hpbSIsIkFib3J0U2lnbmFsIiwiRXZlbnRUYXJnZXQiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiVHlwZUVycm9yIiwiYWJvcnRlZCIsImFib3J0ZWRGbGFncyIsImdldCIsImRlZmluZUV2ZW50QXR0cmlidXRlIiwicHJvdG90eXBlIiwiV2Vha01hcCIsImRlZmluZVByb3BlcnRpZXMiLCJlbnVtZXJhYmxlIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJjb25maWd1cmFibGUiLCJBYm9ydENvbnRyb2xsZXIiLCJzaWduYWxzIiwic2V0Iiwic2lnbmFsIiwiY3JlYXRlIiwiY2FsbCIsImNyZWF0ZUFib3J0U2lnbmFsIiwiZ2V0U2lnbmFsIiwiYWJvcnQiLCJkaXNwYXRjaEV2ZW50IiwidHlwZSIsImNvbnRyb2xsZXIiLCJGb3JtRGF0YSIsImZvcm1EYXRhIiwiY2xpZW50Iiwib3B0aW9ucyIsIk1haWxndW4iLCJjb25maWciLCJ1cmwiLCJ1c2VybmFtZSIsIkVycm9yIiwia2V5IiwicmVxdWVzdCIsIm1haWxMaXN0c01lbWJlcnMiLCJkb21haW5DcmVkZW50aWFsc0NsaWVudCIsImRvbWFpblRlbXBsYXRlc0NsaWVudCIsIm11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCIsImRvbWFpbnMiLCJ3ZWJob29rcyIsImV2ZW50cyIsInN0YXRzIiwic3VwcHJlc3Npb25zIiwibWVzc2FnZXMiLCJyb3V0ZXMiLCJpcHMiLCJpcF9wb29scyIsImxpc3RzIiwidmFsaWRhdGUiLCJkYXRhIiwicmVjZWl2aW5nIiwic2VuZGluZyIsIm5hbWUiLCJyZXF1aXJlX3RscyIsInNraXBfdmVyaWZpY2F0aW9uIiwic3RhdGUiLCJ3aWxkY2FyZCIsInNwYW1fYWN0aW9uIiwiY3JlYXRlZF9hdCIsInNtdHBfcGFzc3dvcmQiLCJzbXRwX2xvZ2luIiwicmVjZWl2aW5nX2Ruc19yZWNvcmRzIiwic2VuZGluZ19kbnNfcmVjb3JkcyIsIkRvbWFpbiIsImRvbWFpbkNyZWRlbnRpYWxzIiwiZG9tYWluVGVtcGxhdGVzIiwiX3BhcnNlTWVzc2FnZSIsInJlc3BvbnNlIiwiYm9keSIsIl9wYXJzZURvbWFpbkxpc3QiLCJpdGVtcyIsIm1hcCIsIml0ZW0iLCJfcGFyc2VEb21haW4iLCJkb21haW4iLCJfcGFyc2VUcmFja2luZ1NldHRpbmdzIiwidHJhY2tpbmciLCJfcGFyc2VUcmFja2luZ1VwZGF0ZSIsImxpc3QiLCJxdWVyeSIsInRoZW4iLCJyZXMiLCJwb3N0T2JqIiwiZm9yY2VfZGtpbV9hdXRob3JpdHkiLCJ0b1N0cmluZyIsInBvc3RXaXRoRkQiLCJkZXN0cm95IiwiZGVsZXRlIiwiZ2V0Q29ubmVjdGlvbiIsInVwZGF0ZUNvbm5lY3Rpb24iLCJwdXQiLCJnZXRUcmFja2luZyIsInVwZGF0ZVRyYWNraW5nIiwiYWN0aXZlIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsIm1lc3NhZ2UiLCJwdXRXaXRoRkQiLCJnZXRJcHMiLCJhc3NpZ25JcCIsImlwIiwiZGVsZXRlSXAiLCJsaW5rSXBQb29sIiwicG9vbF9pZCIsInVubGlua0lwUG9sbCIsInJlcGxhY2VtZW50Iiwic2VhcmNoUGFyYW1zIiwidXBkYXRlREtJTUF1dGhvcml0eSIsInNlbGYiLCJ1cGRhdGVES0lNU2VsZWN0b3IiLCJka2ltU2VsZWN0b3IiLCJ1cGRhdGVXZWJQcmVmaXgiLCJ3ZWJQcmVmaXgiLCJiYXNlUm91dGUiLCJfcGFyc2VEb21haW5DcmVkZW50aWFsc0xpc3QiLCJ0b3RhbENvdW50IiwidG90YWxfY291bnQiLCJfcGFyc2VNZXNzYWdlUmVzcG9uc2UiLCJfcGFyc2VEZWxldGVkUmVzcG9uc2UiLCJzcGVjIiwidXBkYXRlIiwiY3JlZGVudGlhbHNMb2dpbiIsImRvbWFpblRlbXBsYXRlRnJvbUFQSSIsImRlc2NyaXB0aW9uIiwiY3JlYXRlZEF0IiwiRGF0ZSIsImNyZWF0ZWRCeSIsImlkIiwidmVyc2lvbiIsInZlcnNpb25zIiwibGVuZ3RoIiwicmVzdWx0IiwiRG9tYWluVGVtcGxhdGVJdGVtIiwicGFyc2VDcmVhdGlvblJlc3BvbnNlIiwidGVtcGxhdGUiLCJwYXJzZUNyZWF0aW9uVmVyc2lvblJlc3BvbnNlIiwicGFyc2VNdXRhdGlvblJlc3BvbnNlIiwidGVtcGxhdGVOYW1lIiwicGFyc2VOb3RpZmljYXRpb25SZXNwb25zZSIsInBhcnNlTXV0YXRlVGVtcGxhdGVWZXJzaW9uUmVzcG9uc2UiLCJ0ZW1wbGF0ZVZlcnNpb24iLCJ0YWciLCJwYXJzZUxpc3QiLCJkIiwicGFnZXMiLCJwYWdpbmciLCJwYXJzZUxpc3RUZW1wbGF0ZVZlcnNpb25zIiwiZGVzdHJveUFsbCIsImNyZWF0ZVZlcnNpb24iLCJnZXRWZXJzaW9uIiwidXBkYXRlVmVyc2lvbiIsImRlc3Ryb3lWZXJzaW9uIiwibGlzdFZlcnNpb25zIiwiYm9keU1lc3NhZ2UiLCJlcnJvciIsInN0YWNrIiwiZGV0YWlscyIsIl9wYXJzZVBhZ2VOdW1iZXIiLCJzcGxpdCIsInBvcCIsIl9wYXJzZVBhZ2UiLCJudW1iZXIiLCJfcGFyc2VQYWdlTGlua3MiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiZW50cmllIiwiX3BhcnNlRXZlbnRMaXN0IiwicXVlcnlDb3B5IiwicGFnZSIsInBhcnNlSXBQb29sc1Jlc3BvbnNlIiwicG9vbElkIiwicGF0Y2hXaXRoRkQiLCJwYXJzZUlwc1Jlc3BvbnNlIiwibWVtYmVycyIsIm1haWxMaXN0QWRkcmVzcyIsImNoZWNrQW5kVXBkYXRlRGF0YSIsIm5ld0RhdGEiLCJ2YXJzIiwiSlNPTiIsInN0cmluZ2lmeSIsInN1YnNjcmliZWQiLCJsaXN0TWVtYmVycyIsImdldE1lbWJlciIsIm1haWxMaXN0TWVtYmVyQWRkcmVzcyIsImNyZWF0ZU1lbWJlciIsInJlcURhdGEiLCJjcmVhdGVNZW1iZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwidXBzZXJ0IiwidXBkYXRlTWVtYmVyIiwiZGVzdHJveU1lbWJlciIsIl9wYXJzZVJlc3BvbnNlIiwibGlzdElkIiwiZmlsZSIsImlzU3RyZWFtIiwiYXR0YWNobWVudCIsInBpcGUiLCJpc05vZGVGb3JtRGF0YSIsImZvcm1EYXRhSW5zdGFuY2UiLCJ1bmRlZmluZWQiLCJnZXRIZWFkZXJzIiwidGltZW91dCIsImhlYWRlcnMiLCJGb3JtRGF0YUNvbnN0cnVjdG9yIiwibWV0aG9kIiwiaW5wdXRPcHRpb25zIiwiYmFzaWMiLCJlbmNvZGUiLCJBdXRob3JpemF0aW9uIiwicGFyYW1zIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInRvTG9jYWxlVXBwZXJDYXNlIiwidGhyb3dIdHRwRXJyb3JzIiwib2siLCJzdHJlYW0iLCJjaHVua3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiY2h1bmsiLCJwdXNoIiwiQnVmZmVyIiwiY29uY2F0IiwianNvbiIsImNvbW1hbmQiLCJoZWFkIiwicG9zdCIsImNyZWF0ZUZvcm1EYXRhIiwia2V5cyIsImZpbHRlciIsImZvcm1EYXRhQWNjIiwiaW5jbHVkZXMiLCJhZGRGaWxlc1RvRkQiLCJhZGRNaW1lRGF0YVRvRkQiLCJhZGRDb21tb25Qcm9wZXJ0eVRvRkQiLCJpc0J1ZmZlciIsImFwcGVuZCIsImZpbGVuYW1lIiwicHJvcGVydHlOYW1lIiwiYXBwZW5kRmlsZVRvRkQiLCJvYmoiLCJvYmpEYXRhIiwiY29udGVudFR5cGUiLCJrbm93bkxlbmd0aCIsImdldEF0dGFjaG1lbnRPcHRpb25zIiwiZm9yRWFjaCIsInBhdGNoIiwiUmVxdWVzdCIsInN0YXJ0IiwiZW5kIiwicmVzb2x1dGlvbiIsInN0YXQiLCJ0aW1lIiwicHJlcGFyZVNlYXJjaFBhcmFtcyIsImFycmF5V2l0aFBhaXJzIiwiY3VycmVudFBhaXIiLCJyZXBlYXRlZFByb3BlcnR5IiwiX3BhcnNlU3RhdHMiLCJTdGF0cyIsImdldERvbWFpbiIsImdldEFjY291bnQiLCJjcmVhdGVPcHRpb25zIiwiYWRkcmVzcyIsImNvZGUiLCJ0YWdzIiwicmVhc29uIiwibW9kZWxzIiwiYm91bmNlcyIsIkJvdW5jZSIsImNvbXBsYWludHMiLCJDb21wbGFpbnQiLCJ1bnN1YnNjcmliZXMiLCJVbnN1YnNjcmliZSIsIndoaXRlbGlzdHMiLCJXaGl0ZUxpc3QiLCJwYWdlVXJsIiwicGFyc2UiLCJfcGFyc2VMaXN0IiwiTW9kZWwiLCJfcGFyc2VJdGVtIiwiY3JlYXRlV2hpdGVMaXN0IiwibW9kZWwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJwb3N0RGF0YSIsIlN1cHByZXNzaW9uQ2xpZW50IiwibXVsdGlwbGVWYWxpZGF0aW9uIiwiX3BhcnNlV2ViaG9va0xpc3QiLCJfcGFyc2VXZWJob29rV2l0aElEIiwid2ViaG9va1Jlc3BvbnNlIiwid2ViaG9vayIsInVybHMiLCJXZWJob29rIiwiX3BhcnNlV2ViaG9va1Rlc3QiLCJ0ZXN0IiwiZnJlZUV4cG9ydHMiLCJmcmVlR2xvYmFsIiwiZ2xvYmFsIiwid2luZG93IiwiSW52YWxpZENoYXJhY3RlckVycm9yIiwiVEFCTEUiLCJSRUdFWF9TUEFDRV9DSEFSQUNURVJTIiwiYmFzZTY0IiwiaW5wdXQiLCJTdHJpbmciLCJhIiwiYiIsImMiLCJidWZmZXIiLCJwYWRkaW5nIiwib3V0cHV0IiwicG9zaXRpb24iLCJjaGFyQ29kZUF0IiwiY2hhckF0IiwicmVwbGFjZSIsImJpdFN0b3JhZ2UiLCJiaXRDb3VudGVyIiwiaW5kZXhPZiIsImZyb21DaGFyQ29kZSIsInVyaSIsImZpcnN0Q29tbWEiLCJtZXRhIiwic3Vic3RyaW5nIiwiY2hhcnNldCIsInR5cGVGdWxsIiwiaSIsImVuY29kaW5nIiwidW5lc2NhcGUiLCJmcm9tIiwicHJpdmF0ZURhdGEiLCJ3cmFwcGVycyIsInBkIiwiZXZlbnQiLCJyZXR2IiwiY29uc29sZSIsImFzc2VydCIsInNldENhbmNlbEZsYWciLCJwYXNzaXZlTGlzdGVuZXIiLCJjYW5jZWxhYmxlIiwiY2FuY2VsZWQiLCJwcmV2ZW50RGVmYXVsdCIsIkV2ZW50IiwiZXZlbnRUYXJnZXQiLCJldmVudFBoYXNlIiwiY3VycmVudFRhcmdldCIsInN0b3BwZWQiLCJpbW1lZGlhdGVTdG9wcGVkIiwidGltZVN0YW1wIiwibm93IiwiZGVmaW5lUmVkaXJlY3REZXNjcmlwdG9yIiwiZGVmaW5lQ2FsbERlc2NyaXB0b3IiLCJhcHBseSIsImFyZ3VtZW50cyIsImdldFdyYXBwZXIiLCJwcm90byIsIndyYXBwZXIiLCJCYXNlRXZlbnQiLCJDdXN0b21FdmVudCIsIndyaXRhYmxlIiwiaXNGdW5jIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZGVmaW5lV3JhcHBlciIsImdldFByb3RvdHlwZU9mIiwiaXNTdG9wcGVkIiwic2V0UGFzc2l2ZUxpc3RlbmVyIiwidGFyZ2V0IiwiY29tcG9zZWRQYXRoIiwiTk9ORSIsIkNBUFRVUklOR19QSEFTRSIsIkFUX1RBUkdFVCIsIkJVQkJMSU5HX1BIQVNFIiwic3RvcFByb3BhZ2F0aW9uIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiYnViYmxlcyIsIkJvb2xlYW4iLCJkZWZhdWx0UHJldmVudGVkIiwiY29tcG9zZWQiLCJzcmNFbGVtZW50IiwiY2FuY2VsQnViYmxlIiwicmV0dXJuVmFsdWUiLCJpbml0RXZlbnQiLCJzZXRQcm90b3R5cGVPZiIsImxpc3RlbmVyc01hcCIsImlzT2JqZWN0IiwieCIsImdldExpc3RlbmVycyIsImxpc3RlbmVycyIsImV2ZW50VGFyZ2V0UHJvdG90eXBlIiwiZXZlbnROYW1lIiwibm9kZSIsImxpc3RlbmVyVHlwZSIsImxpc3RlbmVyIiwibmV4dCIsInByZXYiLCJuZXdOb2RlIiwicGFzc2l2ZSIsIm9uY2UiLCJkZWZpbmVFdmVudEF0dHJpYnV0ZURlc2NyaXB0b3IiLCJkZWZpbmVDdXN0b21FdmVudFRhcmdldCIsImV2ZW50TmFtZXMiLCJDdXN0b21FdmVudFRhcmdldCIsInR5cGVzIiwiTWFwIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9wdGlvbnNJc09iaiIsImNhcHR1cmUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwid3JhcHBlZEV2ZW50Iiwid3JhcEV2ZW50IiwiZXJyIiwiaGFuZGxlRXZlbnQiLCJzZXRFdmVudFBoYXNlIiwic2V0Q3VycmVudFRhcmdldCIsIlJlYWRhYmxlIiwid20iLCJCbG9iIiwiYmxvYlBhcnRzIiwic2l6ZSIsInBhcnRzIiwiZWxlbWVudCIsIkFycmF5QnVmZmVyIiwiaXNWaWV3IiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsImFzeW5jIiwiYXJyYXlCdWZmZXIiLCJVaW50OEFycmF5Iiwib2Zmc2V0IiwicGFydCIsInJlYWQiLCJzbGljZSIsInJlbGF0aXZlU3RhcnQiLCJNYXRoIiwibWF4IiwibWluIiwicmVsYXRpdmVFbmQiLCJzcGFuIiwidmFsdWVzIiwiYWRkZWQiLCJibG9iIiwiYXNzaWduIiwic3RhdGljIiwiaGFzSW5zdGFuY2UiLCJvYmplY3QiLCJmZXRjaCIsImhpZ2hXYXRlck1hcmsiLCJIZWFkZXJzIiwiUmVzcG9uc2UiLCJSZWFkYWJsZVN0cmVhbSIsIl8iLCJnbG9iYWxzIiwiZ2V0R2xvYmFsIiwicHJvcGVydHkiLCJnbG9iYWxUaGlzIiwiZ2xvYmFsUHJvcGVydGllcyIsImdsb2JhbE9iamVjdCIsImJpbmQiLCJzdXBwb3J0c0Fib3J0Q29udHJvbGxlciIsInN1cHBvcnRzU3RyZWFtcyIsInN1cHBvcnRzRm9ybURhdGEiLCJtZXJnZUhlYWRlcnMiLCJzb3VyY2UxIiwic291cmNlMiIsImlzSGVhZGVyc0luc3RhbmNlIiwic291cmNlIiwiZGVlcE1lcmdlIiwic291cmNlcyIsInJlcXVlc3RNZXRob2RzIiwicmVzcG9uc2VUeXBlcyIsInRleHQiLCJyZXRyeUFmdGVyU3RhdHVzQ29kZXMiLCJzdG9wIiwiSFRUUEVycm9yIiwiVGltZW91dEVycm9yIiwiZGVsYXkiLCJtcyIsInNldFRpbWVvdXQiLCJub3JtYWxpemVSZXF1ZXN0TWV0aG9kIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0UmV0cnlPcHRpb25zIiwibGltaXQiLCJtZXRob2RzIiwic3RhdHVzQ29kZXMiLCJhZnRlclN0YXR1c0NvZGVzIiwibm9ybWFsaXplUmV0cnlPcHRpb25zIiwicmV0cnkiLCJtYXhTYWZlVGltZW91dCIsIkt5IiwiX3JldHJ5Q291bnQiLCJfaW5wdXQiLCJfb3B0aW9ucyIsImNyZWRlbnRpYWxzIiwiaG9va3MiLCJiZWZvcmVSZXF1ZXN0IiwiYmVmb3JlUmV0cnkiLCJhZnRlclJlc3BvbnNlIiwicHJlZml4VXJsIiwiVVJMIiwic3RhcnRzV2l0aCIsImVuZHNXaXRoIiwiYWJvcnRDb250cm9sbGVyIiwiVVJMU2VhcmNoUGFyYW1zIiwiZm4iLCJSYW5nZUVycm9yIiwiX2ZldGNoIiwiaG9vayIsIm1vZGlmaWVkUmVzcG9uc2UiLCJfZGVjb3JhdGVSZXNwb25zZSIsImNsb25lIiwib25Eb3dubG9hZFByb2dyZXNzIiwiX3N0cmVhbSIsIl9yZXRyeSIsIm1pbWVUeXBlIiwicGFyc2VKc29uIiwiX2NhbGN1bGF0ZVJldHJ5RGVsYXkiLCJyZXRyeUFmdGVyIiwiYWZ0ZXIiLCJOdW1iZXIiLCJpc05hTiIsIm1heFJldHJ5QWZ0ZXIiLCJyZXRyeUNvdW50IiwidGltZW91dElEIiwiY2F0Y2giLCJjbGVhclRpbWVvdXQiLCJ0b3RhbEJ5dGVzIiwidHJhbnNmZXJyZWRCeXRlcyIsInJlYWRlciIsImdldFJlYWRlciIsInBlcmNlbnQiLCJkb25lIiwiY2xvc2UiLCJlbnF1ZXVlIiwidmFsaWRhdGVBbmRNZXJnZSIsImNyZWF0ZUluc3RhbmNlIiwiZGVmYXVsdHMiLCJreSIsIm5ld0RlZmF1bHRzIiwiZXh0ZW5kIiwibm9ybWFsaXplIiwic3RyIiwiam9pbmVkIiwiam9pbiIsInJlcXVpcmUiLCJodHRwIiwiaHR0cHMiLCJ6bGliIiwiU3RyZWFtIiwiZGF0YVVyaVRvQnVmZmVyIiwidXRpbCIsImNyeXB0byIsIkZldGNoQmFzZUVycm9yIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJGZXRjaEVycm9yIiwic3lzdGVtRXJyb3IiLCJlcnJubyIsImVycm9yZWRTeXNDYWxsIiwic3lzY2FsbCIsIk5BTUUiLCJpc1VSTFNlYXJjaFBhcmFtZXRlcnMiLCJnZXRBbGwiLCJoYXMiLCJzb3J0IiwiaXNCbG9iIiwiaXNGb3JtRGF0YSIsImNhcnJpYWdlIiwiZGFzaGVzIiwicmVwZWF0IiwiY2FycmlhZ2VMZW5ndGgiLCJnZXRGb290ZXIiLCJib3VuZGFyeSIsImdldEhlYWRlciIsImZpZWxkIiwiaGVhZGVyIiwiSU5URVJOQUxTIiwiQm9keSIsImlzQW55QXJyYXlCdWZmZXIiLCJyYW5kb21CeXRlcyIsImZvcm0iLCJmb3JtRGF0YUl0ZXJhdG9yIiwiZGlzdHVyYmVkIiwiYm9keVVzZWQiLCJjb25zdW1lQm9keSIsImN0IiwiYnVmIiwiYWxsb2MiLCJhY2N1bSIsImFjY3VtQnl0ZXMiLCJyZWFkYWJsZUVuZGVkIiwiX3JlYWRhYmxlU3RhdGUiLCJlbmRlZCIsImV2ZXJ5IiwiaW5zdGFuY2UiLCJwMSIsInAyIiwiZ2V0Qm91bmRhcnkiLCJQYXNzVGhyb3VnaCIsImV4dHJhY3RDb250ZW50VHlwZSIsImdldFRvdGFsQnl0ZXMiLCJnZXRMZW5ndGhTeW5jIiwiaGFzS25vd25MZW5ndGgiLCJnZXRGb3JtRGF0YUxlbmd0aCIsInZhbGlkYXRlSGVhZGVyTmFtZSIsInZhbGlkYXRlSGVhZGVyVmFsdWUiLCJpbml0IiwicmF3IiwiaXNCb3hlZFByaW1pdGl2ZSIsIml0ZXJhdG9yIiwicGFpciIsIlByb3h5IiwicCIsInJlY2VpdmVyIiwiU2V0IiwiUmVmbGVjdCIsImNhbGxiYWNrIiwiZm9yIiwicmVkaXJlY3RTdGF0dXMiLCJpc1JlZGlyZWN0IiwiSU5URVJOQUxTJDEiLCJjb3VudGVyIiwicmVkaXJlY3RlZCIsImxvY2F0aW9uIiwiSU5URVJOQUxTJDIiLCJpc1JlcXVlc3QiLCJwYXJzZWRVUkwiLCJpbnB1dEJvZHkiLCJyZWRpcmVjdCIsImZvbGxvdyIsImNvbXByZXNzIiwiYWdlbnQiLCJpbnNlY3VyZUhUVFBQYXJzZXIiLCJmb3JtYXQiLCJBYm9ydEVycm9yIiwic3VwcG9ydGVkU2NoZW1hcyIsIm9wdGlvbnNfIiwiY29udGVudExlbmd0aFZhbHVlIiwic2VhcmNoIiwibGFzdE9mZnNldCIsImhyZWYiLCJoYXNoIiwiZ2V0U2VhcmNoIiwicGF0aCIsInBhdGhuYW1lIiwiaG9zdG5hbWUiLCJwcm90b2NvbCIsInBvcnQiLCJnZXROb2RlUmVxdWVzdE9wdGlvbnMiLCJzZW5kIiwiZW1pdCIsImFib3J0QW5kRmluYWxpemUiLCJmaW5hbGl6ZSIsInJlcXVlc3RfIiwicmVzcG9uc2VfIiwiaW5kZXgiLCJhcnJheSIsImZyb21SYXdIZWFkZXJzIiwicmF3SGVhZGVycyIsInN0YXR1c0NvZGUiLCJsb2NhdGlvblVSTCIsInJlcXVlc3RPcHRpb25zIiwicGlwZWxpbmUiLCJwcm9jZXNzIiwicmVzcG9uc2VPcHRpb25zIiwic3RhdHVzTWVzc2FnZSIsImNvZGluZ3MiLCJ6bGliT3B0aW9ucyIsImZsdXNoIiwiWl9TWU5DX0ZMVVNIIiwiZmluaXNoRmx1c2giLCJjcmVhdGVHdW56aXAiLCJjcmVhdGVCcm90bGlEZWNvbXByZXNzIiwiY3JlYXRlSW5mbGF0ZSIsImNyZWF0ZUluZmxhdGVSYXciLCJkZXN0Iiwid3JpdGUiLCJ3cml0ZVRvU3RyZWFtIiwiU3ltYm9sUG9seWZpbGwiLCJub29wIiwidHlwZUlzT2JqZWN0IiwicmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uIiwib3JpZ2luYWxQcm9taXNlIiwib3JpZ2luYWxQcm9taXNlVGhlbiIsIm9yaWdpbmFsUHJvbWlzZVJlc29sdmUiLCJvcmlnaW5hbFByb21pc2VSZWplY3QiLCJuZXdQcm9taXNlIiwiZXhlY3V0b3IiLCJwcm9taXNlUmVzb2x2ZWRXaXRoIiwicHJvbWlzZVJlamVjdGVkV2l0aCIsIlBlcmZvcm1Qcm9taXNlVGhlbiIsInByb21pc2UiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJ1cG9uUHJvbWlzZSIsInVwb25GdWxmaWxsbWVudCIsInVwb25SZWplY3Rpb24iLCJ0cmFuc2Zvcm1Qcm9taXNlV2l0aCIsImZ1bGZpbGxtZW50SGFuZGxlciIsInJlamVjdGlvbkhhbmRsZXIiLCJzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlIiwicXVldWVNaWNyb3Rhc2siLCJnbG9iYWxRdWV1ZU1pY3JvdGFzayIsInJlc29sdmVkUHJvbWlzZSIsInJlZmxlY3RDYWxsIiwiRiIsIlYiLCJhcmdzIiwiRnVuY3Rpb24iLCJwcm9taXNlQ2FsbCIsIlNpbXBsZVF1ZXVlIiwiX2N1cnNvciIsIl9zaXplIiwiX2Zyb250IiwiX2VsZW1lbnRzIiwiX25leHQiLCJfYmFjayIsIm9sZEJhY2siLCJuZXdCYWNrIiwiUVVFVUVfTUFYX0FSUkFZX1NJWkUiLCJzaGlmdCIsIm9sZEZyb250IiwibmV3RnJvbnQiLCJvbGRDdXJzb3IiLCJuZXdDdXJzb3IiLCJlbGVtZW50cyIsInBlZWsiLCJmcm9udCIsImN1cnNvciIsIlJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0luaXRpYWxpemUiLCJfb3duZXJSZWFkYWJsZVN0cmVhbSIsIl9yZWFkZXIiLCJfc3RhdGUiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCIsIl9zdG9yZWRFcnJvciIsIlJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCIsIlJlYWRhYmxlU3RyZWFtQ2FuY2VsIiwiUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0IiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQiLCJyZWFkZXJMb2NrRXhjZXB0aW9uIiwiX2Nsb3NlZFByb21pc2UiLCJfY2xvc2VkUHJvbWlzZV9yZXNvbHZlIiwiX2Nsb3NlZFByb21pc2VfcmVqZWN0IiwiQWJvcnRTdGVwcyIsIkVycm9yU3RlcHMiLCJDYW5jZWxTdGVwcyIsIlB1bGxTdGVwcyIsIk51bWJlcklzRmluaXRlIiwiaXNGaW5pdGUiLCJNYXRoVHJ1bmMiLCJ0cnVuYyIsInYiLCJjZWlsIiwiZmxvb3IiLCJhc3NlcnREaWN0aW9uYXJ5IiwiY29udGV4dCIsImFzc2VydEZ1bmN0aW9uIiwiYXNzZXJ0T2JqZWN0IiwiYXNzZXJ0UmVxdWlyZWRBcmd1bWVudCIsImFzc2VydFJlcXVpcmVkRmllbGQiLCJjb252ZXJ0VW5yZXN0cmljdGVkRG91YmxlIiwiY2Vuc29yTmVnYXRpdmVaZXJvIiwiY29udmVydFVuc2lnbmVkTG9uZ0xvbmdXaXRoRW5mb3JjZVJhbmdlIiwidXBwZXJCb3VuZCIsIk1BWF9TQUZFX0lOVEVHRVIiLCJpbnRlZ2VyUGFydCIsImFzc2VydFJlYWRhYmxlU3RyZWFtIiwiSXNSZWFkYWJsZVN0cmVhbSIsIkFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIiLCJSZWFkYWJsZVN0cmVhbUFkZFJlYWRSZXF1ZXN0IiwicmVhZFJlcXVlc3QiLCJfcmVhZFJlcXVlc3RzIiwiUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3QiLCJfY2xvc2VTdGVwcyIsIl9jaHVua1N0ZXBzIiwiUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMiLCJSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIiLCJJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciIsIklzUmVhZGFibGVTdHJlYW1Mb2NrZWQiLCJjbG9zZWQiLCJkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsImNhbmNlbCIsInJlc29sdmVQcm9taXNlIiwicmVqZWN0UHJvbWlzZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQiLCJfZXJyb3JTdGVwcyIsImUiLCJyZWxlYXNlTG9jayIsImhhc093blByb3BlcnR5IiwiX2Rpc3R1cmJlZCIsIl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIiLCJBc3luY0l0ZXJhdG9yUHJvdG90eXBlIiwiUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9ySW1wbCIsInByZXZlbnRDYW5jZWwiLCJfb25nb2luZ1Byb21pc2UiLCJfaXNGaW5pc2hlZCIsIl9wcmV2ZW50Q2FuY2VsIiwibmV4dFN0ZXBzIiwiX25leHRTdGVwcyIsInJldHVybiIsInJldHVyblN0ZXBzIiwiX3JldHVyblN0ZXBzIiwiUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlIiwiSXNSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IiLCJfYXN5bmNJdGVyYXRvckltcGwiLCJzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbiIsIl9hIiwiTnVtYmVySXNOYU4iLCJDcmVhdGVBcnJheUZyb21MaXN0IiwiQ29weURhdGFCbG9ja0J5dGVzIiwiZGVzdE9mZnNldCIsInNyYyIsInNyY09mZnNldCIsIm4iLCJBcnJheUJ1ZmZlclNsaWNlIiwiYmVnaW4iLCJDbG9uZUFzVWludDhBcnJheSIsIk8iLCJEZXF1ZXVlVmFsdWUiLCJjb250YWluZXIiLCJfcXVldWUiLCJfcXVldWVUb3RhbFNpemUiLCJFbnF1ZXVlVmFsdWVXaXRoU2l6ZSIsIkluZmluaXR5IiwiUmVzZXRRdWV1ZSIsIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QiLCJ2aWV3IiwiSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0IiwiYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uIiwiX3ZpZXciLCJyZXNwb25kIiwiYnl0ZXNXcml0dGVuIiwiX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQiLCJyZXNwb25kV2l0aE5ld1ZpZXciLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIsImJ5b2JSZXF1ZXN0IiwiSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0IiwiZGVzaXJlZFNpemUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUiLCJfY2xvc2VSZXF1ZXN0ZWQiLCJfY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyIsIl9jYW5jZWxBbGdvcml0aG0iLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiZW50cnkiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbiIsImF1dG9BbGxvY2F0ZUNodW5rU2l6ZSIsIl9hdXRvQWxsb2NhdGVDaHVua1NpemUiLCJidWZmZXJFIiwicHVsbEludG9EZXNjcmlwdG9yIiwiYnVmZmVyQnl0ZUxlbmd0aCIsImJ5dGVzRmlsbGVkIiwiZWxlbWVudFNpemUiLCJ2aWV3Q29uc3RydWN0b3IiLCJyZWFkZXJUeXBlIiwiX3BlbmRpbmdQdWxsSW50b3MiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCIsInNob3VsZFB1bGwiLCJfc3RhcnRlZCIsIlJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlciIsIlJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCIsIl9wdWxsaW5nIiwiX3B1bGxBZ2FpbiIsIl9wdWxsQWxnb3JpdGhtIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3IiLCJmaWxsZWRWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IiLCJyZWFkSW50b1JlcXVlc3QiLCJfcmVhZEludG9SZXF1ZXN0cyIsIlJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRJbnRvUmVxdWVzdCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUiLCJjdXJyZW50QWxpZ25lZEJ5dGVzIiwibWF4Qnl0ZXNUb0NvcHkiLCJtYXhCeXRlc0ZpbGxlZCIsIm1heEFsaWduZWRCeXRlcyIsInRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmciLCJyZWFkeSIsInF1ZXVlIiwiaGVhZE9mUXVldWUiLCJieXRlc1RvQ29weSIsImRlc3RTdGFydCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvciIsIlJlYWRhYmxlU3RyZWFtQ2xvc2UiLCJfYnlvYlJlcXVlc3QiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbCIsImZpcnN0RGVzY3JpcHRvciIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZSIsInJlbWFpbmRlclNpemUiLCJyZW1haW5kZXIiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEluUmVhZGFibGVTdGF0ZSIsInRyYW5zZmVycmVkQnVmZmVyIiwiZmlyc3RQZW5kaW5nUHVsbEludG8iLCJSZWFkYWJsZVN0cmVhbUVycm9yIiwiU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0IiwiX3N0cmF0ZWd5SFdNIiwiU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwic3RhcnRBbGdvcml0aG0iLCJwdWxsQWxnb3JpdGhtIiwiY2FuY2VsQWxnb3JpdGhtIiwiciIsIkFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIiLCJSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIiLCJSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdCIsIklzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIiwiYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXJSZWFkIiwiRGF0YVZpZXciLCJCWVRFU19QRVJfRUxFTUVOVCIsImN0b3IiLCJlbXB0eVZpZXciLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHVsbEludG8iLCJFeHRyYWN0SGlnaFdhdGVyTWFyayIsInN0cmF0ZWd5IiwiZGVmYXVsdEhXTSIsIkV4dHJhY3RTaXplQWxnb3JpdGhtIiwiY29udmVydFF1ZXVpbmdTdHJhdGVneSIsImNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lTaXplIiwiY29udmVydFVuZGVybHlpbmdTaW5rQWJvcnRDYWxsYmFjayIsIm9yaWdpbmFsIiwiY29udmVydFVuZGVybHlpbmdTaW5rQ2xvc2VDYWxsYmFjayIsImNvbnZlcnRVbmRlcmx5aW5nU2lua1N0YXJ0Q2FsbGJhY2siLCJjb252ZXJ0VW5kZXJseWluZ1NpbmtXcml0ZUNhbGxiYWNrIiwiYXNzZXJ0V3JpdGFibGVTdHJlYW0iLCJJc1dyaXRhYmxlU3RyZWFtIiwiV3JpdGFibGVTdHJlYW0iLCJyYXdVbmRlcmx5aW5nU2luayIsInJhd1N0cmF0ZWd5IiwidW5kZXJseWluZ1NpbmsiLCJjb252ZXJ0VW5kZXJseWluZ1NpbmsiLCJJbml0aWFsaXplV3JpdGFibGVTdHJlYW0iLCJzaXplQWxnb3JpdGhtIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsIndyaXRlQWxnb3JpdGhtIiwiY2xvc2VBbGdvcml0aG0iLCJhYm9ydEFsZ29yaXRobSIsIlNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsIlNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU2luayIsImxvY2tlZCIsInN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMiIsIklzV3JpdGFibGVTdHJlYW1Mb2NrZWQiLCJXcml0YWJsZVN0cmVhbUFib3J0IiwiV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQiLCJXcml0YWJsZVN0cmVhbUNsb3NlIiwiZ2V0V3JpdGVyIiwiQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIsIl93cml0ZXIiLCJfd3JpdGFibGVTdHJlYW1Db250cm9sbGVyIiwiX3dyaXRlUmVxdWVzdHMiLCJfaW5GbGlnaHRXcml0ZVJlcXVlc3QiLCJfY2xvc2VSZXF1ZXN0IiwiX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0IiwiX3BlbmRpbmdBYm9ydFJlcXVlc3QiLCJfYmFja3ByZXNzdXJlIiwiX2Fib3J0UmVhc29uIiwiX2Fib3J0Q29udHJvbGxlciIsIl9wcm9taXNlIiwid2FzQWxyZWFkeUVycm9yaW5nIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwiX3JlYXNvbiIsIl93YXNBbHJlYWR5RXJyb3JpbmciLCJXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3JpbmciLCJjbG9zZVJlcXVlc3QiLCJ3cml0ZXIiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSIsImNsb3NlU2VudGluZWwiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQiLCJXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uIiwiV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkIiwiV3JpdGFibGVTdHJlYW1IYXNPcGVyYXRpb25NYXJrZWRJbkZsaWdodCIsInN0b3JlZEVycm9yIiwid3JpdGVSZXF1ZXN0IiwiV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZCIsImFib3J0UmVxdWVzdCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0IiwiV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUiLCJiYWNrcHJlc3N1cmUiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCIsIl9vd25lcldyaXRhYmxlU3RyZWFtIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkIiwiZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkIiwiZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlIiwiZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCIsIklzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIiwiZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbiIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplIiwiX3JlYWR5UHJvbWlzZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckFib3J0IiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2UiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyV3JpdGUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVDbG9zZWRQcm9taXNlUmVqZWN0ZWQiLCJfY2xvc2VkUHJvbWlzZVN0YXRlIiwiZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQiLCJfcmVhZHlQcm9taXNlU3RhdGUiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVqZWN0IiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0VG9SZWplY3RlZCIsInJlbGVhc2VkRXJyb3IiLCJjaHVua1NpemUiLCJfc3RyYXRlZ3lTaXplQWxnb3JpdGhtIiwiY2h1bmtTaXplRSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldENodW5rU2l6ZSIsIldyaXRhYmxlU3RyZWFtQWRkV3JpdGVSZXF1ZXN0IiwiZW5xdWV1ZUUiLCJfY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJXcml0ZSIsImFib3J0UmVhc29uIiwiSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDIiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IiLCJfYWJvcnRBbGdvcml0aG0iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiY3JlYXRlQWJvcnRDb250cm9sbGVyIiwiX3dyaXRlQWxnb3JpdGhtIiwiX2Nsb3NlQWxnb3JpdGhtIiwiV3JpdGFibGVTdHJlYW1NYXJrQ2xvc2VSZXF1ZXN0SW5GbGlnaHQiLCJzaW5rQ2xvc2VQcm9taXNlIiwiV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlIiwiV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NDbG9zZSIsIldyaXRhYmxlU3RyZWFtTWFya0ZpcnN0V3JpdGVSZXF1ZXN0SW5GbGlnaHQiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGVXaXRoRXJyb3IiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc1dyaXRlIiwiX3JlYWR5UHJvbWlzZV9yZXNvbHZlIiwiX3JlYWR5UHJvbWlzZV9yZWplY3QiLCJOYXRpdmVET01FeGNlcHRpb24iLCJET01FeGNlcHRpb24iLCJET01FeGNlcHRpb24kMSIsImlzRE9NRXhjZXB0aW9uQ29uc3RydWN0b3IiLCJjcmVhdGVET01FeGNlcHRpb25Qb2x5ZmlsbCIsIlJlYWRhYmxlU3RyZWFtUGlwZVRvIiwicHJldmVudENsb3NlIiwicHJldmVudEFib3J0Iiwic2h1dHRpbmdEb3duIiwiY3VycmVudFdyaXRlIiwiYWN0aW9ucyIsInNodXRkb3duV2l0aEFjdGlvbiIsImFsbCIsImFjdGlvbiIsImlzT3JCZWNvbWVzRXJyb3JlZCIsInNodXRkb3duIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbiIsImRlc3RDbG9zZWQiLCJ3YWl0Rm9yV3JpdGVzVG9GaW5pc2giLCJvbGRDdXJyZW50V3JpdGUiLCJvcmlnaW5hbElzRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwiZG9UaGVSZXN0IiwibmV3RXJyb3IiLCJpc0Vycm9yIiwicmVzb2x2ZUxvb3AiLCJyZWplY3RMb29wIiwicmVzb2x2ZVJlYWQiLCJyZWplY3RSZWFkIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsIklzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsImRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsIiwiU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiUmVhZGFibGVTdHJlYW1UZWUiLCJjbG9uZUZvckJyYW5jaDIiLCJyZWFzb24xIiwicmVhc29uMiIsImJyYW5jaDEiLCJicmFuY2gyIiwicmVzb2x2ZUNhbmNlbFByb21pc2UiLCJyZWFkaW5nIiwiY2FuY2VsZWQxIiwiY2FuY2VsZWQyIiwiY2FuY2VsUHJvbWlzZSIsImZvcndhcmRSZWFkZXJFcnJvciIsInRoaXNSZWFkZXIiLCJwdWxsV2l0aERlZmF1bHRSZWFkZXIiLCJjaHVuazEiLCJjaHVuazIiLCJjbG9uZUUiLCJwdWxsV2l0aEJZT0JSZWFkZXIiLCJmb3JCcmFuY2gyIiwiYnlvYkJyYW5jaCIsIm90aGVyQnJhbmNoIiwiYnlvYkNhbmNlbGVkIiwiY2xvbmVkQ2h1bmsiLCJvdGhlckNhbmNlbGVkIiwicHVsbDFBbGdvcml0aG0iLCJwdWxsMkFsZ29yaXRobSIsImNhbmNlbDFBbGdvcml0aG0iLCJjb21wb3NpdGVSZWFzb24iLCJjYW5jZWxSZXN1bHQiLCJjYW5jZWwyQWxnb3JpdGhtIiwiQ3JlYXRlUmVhZGFibGVCeXRlU3RyZWFtIiwiUmVhZGFibGVCeXRlU3RyZWFtVGVlIiwiQ3JlYXRlUmVhZGFibGVTdHJlYW0iLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRUZWUiLCJjb252ZXJ0VW5kZXJseWluZ1NvdXJjZUNhbmNlbENhbGxiYWNrIiwiY29udmVydFVuZGVybHlpbmdTb3VyY2VQdWxsQ2FsbGJhY2siLCJjb252ZXJ0VW5kZXJseWluZ1NvdXJjZVN0YXJ0Q2FsbGJhY2siLCJjb252ZXJ0UmVhZGFibGVTdHJlYW1UeXBlIiwiY29udmVydFJlYWRhYmxlU3RyZWFtUmVhZGVyTW9kZSIsIm1vZGUiLCJjb252ZXJ0UGlwZU9wdGlvbnMiLCJpc0Fib3J0U2lnbmFsIiwiYXNzZXJ0QWJvcnRTaWduYWwiLCJyYXdVbmRlcmx5aW5nU291cmNlIiwidW5kZXJseWluZ1NvdXJjZSIsInB1bGwiLCJjb252ZXJ0VW5kZXJseWluZ0RlZmF1bHRPckJ5dGVTb3VyY2UiLCJJbml0aWFsaXplUmVhZGFibGVTdHJlYW0iLCJ1bmRlcmx5aW5nQnl0ZVNvdXJjZSIsIlNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlIiwiU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTb3VyY2UiLCJzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEiLCJyYXdPcHRpb25zIiwiY29udmVydFJlYWRlck9wdGlvbnMiLCJwaXBlVGhyb3VnaCIsInJhd1RyYW5zZm9ybSIsInRyYW5zZm9ybSIsInJlYWRhYmxlIiwiY29udmVydFJlYWRhYmxlV3JpdGFibGVQYWlyIiwicGlwZVRvIiwiZGVzdGluYXRpb24iLCJ0ZWUiLCJpbXBsIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciIsImNvbnZlcnRJdGVyYXRvck9wdGlvbnMiLCJjb252ZXJ0UXVldWluZ1N0cmF0ZWd5SW5pdCIsImFzeW5jSXRlcmF0b3IiLCJieXRlTGVuZ3RoU2l6ZUZ1bmN0aW9uIiwiQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSIsIl9ieXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyayIsIklzQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSIsImJ5dGVMZW5ndGhCcmFuZENoZWNrRXhjZXB0aW9uIiwiY291bnRTaXplRnVuY3Rpb24iLCJDb3VudFF1ZXVpbmdTdHJhdGVneSIsIl9jb3VudFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcmsiLCJJc0NvdW50UXVldWluZ1N0cmF0ZWd5IiwiY291bnRCcmFuZENoZWNrRXhjZXB0aW9uIiwiY29udmVydFRyYW5zZm9ybWVyRmx1c2hDYWxsYmFjayIsImNvbnZlcnRUcmFuc2Zvcm1lclN0YXJ0Q2FsbGJhY2siLCJjb252ZXJ0VHJhbnNmb3JtZXJUcmFuc2Zvcm1DYWxsYmFjayIsIlRyYW5zZm9ybVN0cmVhbSIsInJhd1RyYW5zZm9ybWVyIiwicmF3V3JpdGFibGVTdHJhdGVneSIsInJhd1JlYWRhYmxlU3RyYXRlZ3kiLCJ3cml0YWJsZVN0cmF0ZWd5IiwicmVhZGFibGVTdHJhdGVneSIsInRyYW5zZm9ybWVyIiwicmVhZGFibGVUeXBlIiwid3JpdGFibGVUeXBlIiwiY29udmVydFRyYW5zZm9ybWVyIiwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIiwicmVhZGFibGVTaXplQWxnb3JpdGhtIiwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIiwid3JpdGFibGVTaXplQWxnb3JpdGhtIiwic3RhcnRQcm9taXNlX3Jlc29sdmUiLCJzdGFydFByb21pc2UiLCJfdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlciIsIl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlIiwiX3dyaXRhYmxlIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtXcml0ZUFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbUVycm9yIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobSIsIl9yZWFkYWJsZSIsImZsdXNoUHJvbWlzZSIsIl9mbHVzaEFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtIiwiVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZSIsIkNyZWF0ZVdyaXRhYmxlU3RyZWFtIiwiX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSIsIkluaXRpYWxpemVUcmFuc2Zvcm1TdHJlYW0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsInRyYW5zZm9ybUFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSIsInRyYW5zZm9ybVJlc3VsdEUiLCJmbHVzaEFsZ29yaXRobSIsIl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtIiwiX3RyYW5zZm9ybUFsZ29yaXRobSIsIlNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVRyYW5zZm9ybWVyIiwiSXNUcmFuc2Zvcm1TdHJlYW0iLCJzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uIiwiSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsImRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsInRlcm1pbmF0ZSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyVGVybWluYXRlIiwicmVhZGFibGVDb250cm9sbGVyIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsImxvYWRlZCIsIl9fd2VicGFja19tb2R1bGVzX18iLCJkZWZpbml0aW9uIiwibyIsInByb3AiLCJubWQiLCJwYXRocyIsImNoaWxkcmVuIl0sInNvdXJjZVJvb3QiOiIifQ==
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mailgun=t():e.mailgun=t()}(this,(function(){return(()=>{var e={271:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(185);class AbortSignal extends n.EventTarget{constructor(){throw super(),new TypeError("AbortSignal cannot be constructed directly")}get aborted(){const e=o.get(this);if("boolean"!=typeof e)throw new TypeError("Expected 'this' to be an 'AbortSignal' object, but got "+(null===this?"null":typeof this));return e}}n.defineEventAttribute(AbortSignal.prototype,"abort");const o=new WeakMap;Object.defineProperties(AbortSignal.prototype,{aborted:{enumerable:!0}}),"function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag&&Object.defineProperty(AbortSignal.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortSignal"});class AbortController{constructor(){s.set(this,function(){const e=Object.create(AbortSignal.prototype);return n.EventTarget.call(e),o.set(e,!1),e}())}get signal(){return i(this)}abort(){var e;e=i(this),!1===o.get(e)&&(o.set(e,!0),e.dispatchEvent({type:"abort"}))}}const s=new WeakMap;function i(e){const t=s.get(e);if(null==t)throw new TypeError("Expected 'this' to be an 'AbortController' object, but got "+(null===e?"null":typeof e));return t}Object.defineProperties(AbortController.prototype,{signal:{enumerable:!0},abort:{enumerable:!0}}),"function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag&&Object.defineProperty(AbortController.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortController"}),t.AbortController=AbortController,t.AbortSignal=AbortSignal,t.default=AbortController,e.exports=AbortController,e.exports.AbortController=e.exports.default=AbortController,e.exports.AbortSignal=AbortSignal},48:function(e,t,r){"use strict";var n=(this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}})(r(475)),o=function(){function e(e){this.formData=e}return e.prototype.client=function(e){return new n.default(e,this.formData)},e}();e.exports=o},475:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=o(r(438)),i=o(r(373)),a=o(r(22)),u=o(r(747)),l=o(r(778)),c=o(r(750)),d=o(r(197)),f=o(r(277)),p=o(r(839)),h=o(r(345)),b=o(r(602)),y=o(r(126)),m=o(r(135)),g=o(r(60)),_=o(r(587)),v=o(r(955)),w=o(r(75)),S=function(e,t){var r=n({},e);if(r.url||(r.url="https://api.mailgun.net"),!r.username)throw new Error('Parameter "username" is required');if(!r.key)throw new Error('Parameter "key" is required');this.request=new s.default(r,t);var o=new m.default(this.request),S=new g.default(this.request),R=new v.default(this.request),T=new w.default(this.request),q=new _.default(this.request);this.domains=new i.default(this.request,S,R,T),this.webhooks=new c.default(this.request),this.events=new a.default(this.request),this.stats=new u.default(this.request),this.suppressions=new l.default(this.request),this.messages=new d.default(this.request),this.routes=new f.default(this.request),this.ips=new h.default(this.request),this.ip_pools=new b.default(this.request),this.lists=new y.default(this.request,o),this.validate=new p.default(this.request,q)};t.default=S},373:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Domain=void 0;var s=o(r(78)),i=o(r(142)),a=function(e,t,r){this.name=e.name,this.require_tls=e.require_tls,this.skip_verification=e.skip_verification,this.state=e.state,this.wildcard=e.wildcard,this.spam_action=e.spam_action,this.created_at=e.created_at,this.smtp_password=e.smtp_password,this.smtp_login=e.smtp_login,this.type=e.type,this.receiving_dns_records=t||null,this.sending_dns_records=r||null};t.Domain=a;var u=function(){function e(e,t,r,n){this.request=e,this.domainCredentials=t,this.domainTemplates=r,this.domainTags=n}return e.prototype._parseMessage=function(e){return e.body},e.prototype._parseDomainList=function(e){return e.body.items.map((function(e){return new a(e)}))},e.prototype._parseDomain=function(e){return new a(e.body.domain,e.body.receiving_dns_records,e.body.sending_dns_records)},e.prototype._parseTrackingSettings=function(e){return e.body.tracking},e.prototype._parseTrackingUpdate=function(e){return e.body},e.prototype.list=function(e){var t=this;return this.request.get("/v3/domains",e).then((function(e){return t._parseDomainList(e)}))},e.prototype.get=function(e){var t=this;return this.request.get("/v3/domains/"+e).then((function(e){return t._parseDomain(e)}))},e.prototype.create=function(e){var t=this,r=n({},e);return"force_dkim_authority"in r&&"boolean"==typeof r.force_dkim_authority&&(r.force_dkim_authority="true"===r.toString()?"true":"false"),this.request.postWithFD("/v3/domains",r).then((function(e){return t._parseDomain(e)}))},e.prototype.destroy=function(e){var t=this;return this.request.delete("/v3/domains/"+e).then((function(e){return t._parseMessage(e)}))},e.prototype.getConnection=function(e){return this.request.get("/v3/domains/"+e+"/connection").then((function(e){return e})).then((function(e){return e.body.connection}))},e.prototype.updateConnection=function(e,t){return this.request.put("/v3/domains/"+e+"/connection",t).then((function(e){return e})).then((function(e){return e.body}))},e.prototype.getTracking=function(e){return this.request.get((0,s.default)("/v3/domains",e,"tracking")).then(this._parseTrackingSettings)},e.prototype.updateTracking=function(e,t,r){var n=this;if("boolean"==typeof(null==r?void 0:r.active))throw new i.default({status:400,statusText:"",body:{message:'Property "active" must contain string value.'}});return this.request.putWithFD((0,s.default)("/v3/domains",e,"tracking",t),r).then((function(e){return n._parseTrackingUpdate(e)}))},e.prototype.getIps=function(e){return this.request.get((0,s.default)("/v3/domains",e,"ips")).then((function(e){var t;return null===(t=null==e?void 0:e.body)||void 0===t?void 0:t.items}))},e.prototype.assignIp=function(e,t){return this.request.postWithFD((0,s.default)("/v3/domains",e,"ips"),{ip:t})},e.prototype.deleteIp=function(e,t){return this.request.delete((0,s.default)("/v3/domains",e,"ips",t))},e.prototype.linkIpPool=function(e,t){return this.request.postWithFD((0,s.default)("/v3/domains",e,"ips"),{pool_id:t})},e.prototype.unlinkIpPoll=function(e,t){var r="";if(t.pool_id&&t.ip)throw new i.default({status:400,statusText:"",body:{message:"Please specify either pool_id or ip (not both)"}});return t.pool_id?r="?pool_id="+t.pool_id:t.ip&&(r="?ip="+t.ip),this.request.delete((0,s.default)("/v3/domains",e,"ips","ip_pool",r))},e.prototype.updateDKIMAuthority=function(e,t){return this.request.put("/v3/domains/"+e+"/dkim_authority",{},{query:"self="+t.self}).then((function(e){return e})).then((function(e){return e.body}))},e.prototype.updateDKIMSelector=function(e,t){return this.request.put("/v3/domains/"+e+"/dkim_selector",{},{query:"dkim_selector="+t.dkimSelector}).then((function(e){return e}))},e.prototype.updateWebPrefix=function(e,t){return this.request.put("/v3/domains/"+e+"/web_prefix",{},{query:"web_prefix="+t.webPrefix}).then((function(e){return e}))},e}();t.default=u},60:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=n(r(78)),s=function(){function e(e){this.request=e,this.baseRoute="/v3/domains/"}return e.prototype._parseDomainCredentialsList=function(e){return{items:e.body.items,totalCount:e.body.total_count}},e.prototype._parseMessageResponse=function(e){return{status:e.status,message:e.body.message}},e.prototype._parseDeletedResponse=function(e){return{status:e.status,message:e.body.message,spec:e.body.spec}},e.prototype.list=function(e,t){var r=this;return this.request.get((0,o.default)(this.baseRoute,e,"/credentials"),t).then((function(e){return r._parseDomainCredentialsList(e)}))},e.prototype.create=function(e,t){var r=this;return this.request.postWithFD(""+this.baseRoute+e+"/credentials",t).then((function(e){return r._parseMessageResponse(e)}))},e.prototype.update=function(e,t,r){var n=this;return this.request.putWithFD(""+this.baseRoute+e+"/credentials/"+t,r).then((function(e){return n._parseMessageResponse(e)}))},e.prototype.destroy=function(e,t){var r=this;return this.request.delete(""+this.baseRoute+e+"/credentials/"+t).then((function(e){return r._parseDeletedResponse(e)}))},e}();t.default=s},75:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomainTagStatistic=t.DomainTag=void 0;var s=o(r(78)),i=function(e){this.tag=e.tag,this.description=e.description,this["first-seen"]=new Date(e["first-seen"]),this["last-seen"]=new Date(e["last-seen"])};t.DomainTag=i;var a=function(e){this.tag=e.body.tag,this.description=e.body.description,this.start=new Date(e.body.start),this.end=new Date(e.body.end),this.resolution=e.body.resolution,this.stats=e.body.stats.map((function(e){return n(n({},e),{time:new Date(e.time)})}))};t.DomainTagStatistic=a;var u=function(){function e(e){this.request=e,this.baseRoute="/v3/"}return e.prototype._parsePageLinks=function(e){return Object.entries(e.body.paging).reduce((function(e,t){var r=t[0],n=t[1];return e[r]={id:r,url:n},e}),{})},e.prototype._parseDomainTagsList=function(e){return{items:e.body.items.map((function(e){return new i(e)})),pages:this._parsePageLinks(e)}},e.prototype._parseTagStatistic=function(e){return new a(e)},e.prototype.list=function(e,t){var r=this;return this.request.get((0,s.default)(this.baseRoute,e,"/tags"),t).then((function(e){return r._parseDomainTagsList(e)}))},e.prototype.get=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t)).then((function(e){return new i(e.body)}))},e.prototype.update=function(e,t,r){return this.request.put((0,s.default)(this.baseRoute,e,"/tags",t),r).then((function(e){return e.body}))},e.prototype.destroy=function(e,t){return this.request.delete(""+this.baseRoute+e+"/tags/"+t).then((function(e){return{message:e.body.message,status:e.status}}))},e.prototype.statistic=function(e,t,r){var n=this;return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats"),r).then((function(e){return n._parseTagStatistic(e)}))},e.prototype.countries=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/countries")).then((function(e){return e.body}))},e.prototype.providers=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/providers")).then((function(e){return e.body}))},e.prototype.devices=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/devices")).then((function(e){return e.body}))},e}();t.default=u},955:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomainTemplateItem=void 0;var s=o(r(78)),i=function(e){this.name=e.name,this.description=e.description,this.createdAt=e.createdAt?new Date(e.createdAt):"",this.createdBy=e.createdBy,this.id=e.id,e.version&&(this.version=e.version,e.version.createdAt&&(this.version.createdAt=new Date(e.version.createdAt))),e.versions&&e.versions.length&&(this.versions=e.versions.map((function(e){var t=n({},e);return t.createdAt=new Date(e.createdAt),t})))};t.DomainTemplateItem=i;var a=function(){function e(e){this.request=e,this.baseRoute="/v3/"}return e.prototype.parseCreationResponse=function(e){return new i(e.body.template)},e.prototype.parseCreationVersionResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body&&e.body.template&&(t.template=new i(e.body.template)),t},e.prototype.parseMutationResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body&&e.body.template&&(t.templateName=e.body.template.name),t},e.prototype.parseNotificationResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,t},e.prototype.parseMutateTemplateVersionResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body.template&&(t.templateName=e.body.template.name,t.templateVersion={tag:e.body.template.version.tag}),t},e.prototype.parseList=function(e){var t={};return t.items=e.body.items.map((function(e){return new i(e)})),t.pages=e.body.paging,t},e.prototype.parseListTemplateVersions=function(e){var t={};return t.template=new i(e.body.template),t.pages=e.body.paging,t},e.prototype.list=function(e,t){var r=this;return this.request.get((0,s.default)(this.baseRoute,e,"/templates"),t).then((function(e){return r.parseList(e)}))},e.prototype.get=function(e,t,r){return this.request.get((0,s.default)(this.baseRoute,e,"/templates/",t),r).then((function(e){return new i(e.body.template)}))},e.prototype.create=function(e,t){var r=this;return this.request.postWithFD((0,s.default)(this.baseRoute,e,"/templates"),t).then((function(e){return r.parseCreationResponse(e)}))},e.prototype.update=function(e,t,r){var n=this;return this.request.putWithFD((0,s.default)(this.baseRoute,e,"/templates/",t),r).then((function(e){return n.parseMutationResponse(e)}))},e.prototype.destroy=function(e,t){var r=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates/",t)).then((function(e){return r.parseMutationResponse(e)}))},e.prototype.destroyAll=function(e){var t=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates")).then((function(e){return t.parseNotificationResponse(e)}))},e.prototype.createVersion=function(e,t,r){var n=this;return this.request.postWithFD((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions"),r).then((function(e){return n.parseCreationVersionResponse(e)}))},e.prototype.getVersion=function(e,t,r){return this.request.get((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r)).then((function(e){return new i(e.body.template)}))},e.prototype.updateVersion=function(e,t,r,n){var o=this;return this.request.putWithFD((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r),n).then((function(e){return o.parseMutateTemplateVersionResponse(e)}))},e.prototype.destroyVersion=function(e,t,r){var n=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r)).then((function(e){return n.parseMutateTemplateVersionResponse(e)}))},e.prototype.listVersions=function(e,t,r){var n=this;return this.request.get((0,s.default)(this.baseRoute,e,"/templates",t,"/versions"),r).then((function(e){return n.parseListTemplateVersions(e)}))},e}();t.default=a},142:function(e,t){"use strict";var r,n=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},r(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var r=t.status,n=t.statusText,o=t.message,s=t.body,i=void 0===s?{}:s,a=this,u=i.message,l=i.error;return(a=e.call(this)||this).stack="",a.status=r,a.message=o||l||n,a.details=u,a}return n(t,e),t}(Error);t.default=o},22:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=o(r(78)),i=function(){function e(e){this.request=e}return e.prototype._parsePageNumber=function(e){return e.split("/").pop()},e.prototype._parsePage=function(e,t){return{id:e,number:this._parsePageNumber(t),url:t}},e.prototype._parsePageLinks=function(e){var t=this;return Object.entries(e.body.paging).reduce((function(e,r){var n=r[0],o=r[1];return e[n]=t._parsePage(n,o),e}),{})},e.prototype._parseEventList=function(e){return{items:e.body.items,pages:this._parsePageLinks(e)}},e.prototype.get=function(e,t){var r,o=this,i=n({},t);return i&&i.page?(r=(0,s.default)("/v3",e,"events",i.page),delete i.page):r=(0,s.default)("/v3",e,"events"),this.request.get(r,i).then((function(e){return o._parseEventList(e)}))},e}();t.default=i},602:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){var t=this;return this.request.get("/v1/ip_pools",e).then((function(e){return t.parseIpPoolsResponse(e)}))},e.prototype.create=function(e){return this.request.postWithFD("/v1/ip_pools",e).then((function(e){return null==e?void 0:e.body}))},e.prototype.update=function(e,t){return this.request.patchWithFD("/v1/ip_pools/"+e,t).then((function(e){return null==e?void 0:e.body}))},e.prototype.delete=function(e,t){return this.request.delete("/v1/ip_pools/"+e,t).then((function(e){return null==e?void 0:e.body}))},e.prototype.parseIpPoolsResponse=function(e){return e.body.ip_pools},e}();t.default=r},345:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){var t=this;return this.request.get("/v3/ips",e).then((function(e){return t.parseIpsResponse(e)}))},e.prototype.get=function(e){var t=this;return this.request.get("/v3/ips/"+e).then((function(e){return t.parseIpsResponse(e)}))},e.prototype.parseIpsResponse=function(e){return e.body},e}();t.default=r},126:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this.request=e,this.baseRoute="/v3/lists",this.members=t}return e.prototype.list=function(e){return this.request.get(this.baseRoute+"/pages",e).then((function(e){return e.body.items}))},e.prototype.get=function(e){return this.request.get(this.baseRoute+"/"+e).then((function(e){return e.body.list}))},e.prototype.create=function(e){return this.request.postWithFD(this.baseRoute,e).then((function(e){return e.body.list}))},e.prototype.update=function(e,t){return this.request.putWithFD(this.baseRoute+"/"+e,t).then((function(e){return e.body.list}))},e.prototype.destroy=function(e){return this.request.delete(this.baseRoute+"/"+e).then((function(e){return e.body}))},e}();t.default=r},135:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e){this.request=e,this.baseRoute="/v3/lists"}return e.prototype.checkAndUpdateData=function(e){var t=r({},e);return"object"==typeof e.vars&&(t.vars=JSON.stringify(t.vars)),"boolean"==typeof e.subscribed&&(t.subscribed=e.subscribed?"yes":"no"),t},e.prototype.listMembers=function(e,t){return this.request.get(this.baseRoute+"/"+e+"/members/pages",t).then((function(e){return e.body.items}))},e.prototype.getMember=function(e,t){return this.request.get(this.baseRoute+"/"+e+"/members/"+t).then((function(e){return e.body.member}))},e.prototype.createMember=function(e,t){var r=this.checkAndUpdateData(t);return this.request.postWithFD(this.baseRoute+"/"+e+"/members",r).then((function(e){return e.body.member}))},e.prototype.createMembers=function(e,t){var r={members:Array.isArray(t.members)?JSON.stringify(t.members):t.members,upsert:t.upsert};return this.request.postWithFD(this.baseRoute+"/"+e+"/members.json",r).then((function(e){return e.body}))},e.prototype.updateMember=function(e,t,r){var n=this.checkAndUpdateData(r);return this.request.putWithFD(this.baseRoute+"/"+e+"/members/"+t,n).then((function(e){return e.body.member}))},e.prototype.destroyMember=function(e,t){return this.request.delete(this.baseRoute+"/"+e+"/members/"+t).then((function(e){return e.body}))},e}();t.default=n},197:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype._parseResponse=function(e){return e.body?e.body:e},e.prototype.create=function(e,t){return t.message?this.request.postWithFD("/v3/"+e+"/messages.mime",t).then(this._parseResponse):this.request.postWithFD("/v3/"+e+"/messages",t).then(this._parseResponse)},e}();t.default=r},587:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(){return this.request.get("/v4/address/validate/bulk").then((function(e){return e.body}))},e.prototype.get=function(e){return this.request.get("/v4/address/validate/bulk/"+e).then((function(e){return e.body}))},e.prototype.create=function(e,t){return this.request.postWithFD("/v4/address/validate/bulk/"+e,t).then((function(e){return e.body}))},e.prototype.destroy=function(e){return this.request.delete("/v4/address/validate/bulk/"+e).then((function(e){return e}))},e}();t.default=r},438:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,s){function i(e){try{u(n.next(e))}catch(e){s(e)}}function a(e){try{u(n.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}u((n=n.apply(e,t||[])).next())}))},s=this&&this.__generator||function(e,t){var r,n,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,n=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var a=i(r(501)),u=i(r(78)),l=i(r(556)),c=i(r(142)),d=function(e){return"object"==typeof e&&"function"==typeof e.pipe};function f(e){return void 0!==e.getHeaders}var p=function(){function e(e,t){this.username=e.username,this.key=e.key,this.url=e.url,this.timeout=e.timeout,this.headers=e.headers||{},this.FormDataConstructor=t}return e.prototype.request=function(e,t,r){return o(this,void 0,void 0,(function(){var o,i,f,p,h,b,y,m;return s(this,(function(s){switch(s.label){case 0:return o=n({},r),i=a.default.encode(this.username+":"+this.key),f=n(n({Authorization:"Basic "+i},this.headers),null==o?void 0:o.headers),null==o||delete o.headers,f["Content-Type"]||delete f["Content-Type"],p=n({},o),(null==o?void 0:o.query)&&Object.getOwnPropertyNames(null==o?void 0:o.query).length>0&&(p.searchParams=o.query,delete p.query),[4,(0,l.default)((0,u.default)(this.url,t),n({method:e.toLocaleUpperCase(),headers:f,throwHttpErrors:!1,timeout:this.timeout},p))];case 1:return(null==(h=s.sent())?void 0:h.ok)?[3,6]:(null==h?void 0:h.body)&&d(h.body)?[4,(g=h.body,_=[],new Promise((function(e,t){g.on("data",(function(e){return _.push(e)})),g.on("error",t),g.on("end",(function(){return e(Buffer.concat(_).toString("utf8"))}))})))]:[3,3];case 2:return y=s.sent(),[3,5];case 3:return[4,null==h?void 0:h.json()];case 4:y=s.sent(),s.label=5;case 5:throw b=y,new c.default({status:null==h?void 0:h.status,statusText:null==h?void 0:h.statusText,body:{message:b}});case 6:return m={},[4,null==h?void 0:h.json()];case 7:return m.body=s.sent(),m.status=null==h?void 0:h.status,[2,m]}var g,_}))}))},e.prototype.query=function(e,t,r,o){return this.request(e,t,n({query:r},o))},e.prototype.command=function(e,t,r,o){return this.request(e,t,n({headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r},o))},e.prototype.get=function(e,t,r){return this.query("get",e,t,r)},e.prototype.head=function(e,t,r){return this.query("head",e,t,r)},e.prototype.options=function(e,t,r){return this.query("options",e,t,r)},e.prototype.post=function(e,t,r){return this.command("post",e,t,r)},e.prototype.postWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("post",e,r,{headers:{"Content-Type":null}})},e.prototype.putWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("put",e,r,{headers:{"Content-Type":null}})},e.prototype.patchWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("patch",e,r,{headers:{"Content-Type":null}})},e.prototype.createFormData=function(e){var t=this;return Object.keys(e).filter((function(t){return e[t]})).reduce((function(r,n){return["attachment","inline","file"].includes(n)?(t.addFilesToFD(n,e[n],r),r):"message"===n?(t.addMimeDataToFD(n,e[n],r),r):(t.addCommonPropertyToFD(n,e[n],r),r)}),new this.FormDataConstructor)},e.prototype.addMimeDataToFD=function(e,t,r){f(r)?Buffer.isBuffer(t)&&r.append(e,t,{filename:"MimeMessage"}):r.append(e,t,"MimeMessage")},e.prototype.addFilesToFD=function(e,t,r){var o=function(e,t,r){var o=d(t)?t:t.data,s=function(e){if("object"!=typeof e||d(e))return{};var t=e.filename,r=e.contentType,o=e.knownLength;return n(n(n({},t?{filename:t}:{filename:"file"}),r&&{contentType:r}),o&&{knownLength:o})}(t);f(r)?r.append(e,o,s):r.append(e,o,s.filename)};Array.isArray(t)?t.forEach((function(t){o(e,t,r)})):o(e,t,r)},e.prototype.addCommonPropertyToFD=function(e,t,r){Array.isArray(t)?t.forEach((function(t){r.append(e,t)})):null!=t&&r.append(e,t)},e.prototype.put=function(e,t,r){return this.command("put",e,t,r)},e.prototype.patch=function(e,t,r){return this.command("patch",e,t,r)},e.prototype.delete=function(e,t,r){return this.command("delete",e,t,r)},e}();t.default=p},277:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){return this.request.get("/v3/routes",e).then((function(e){return e.body.items}))},e.prototype.get=function(e){return this.request.get("/v3/routes/"+e).then((function(e){return e.body.route}))},e.prototype.create=function(e){return this.request.postWithFD("/v3/routes",e).then((function(e){return e.body.route}))},e.prototype.update=function(e,t){return this.request.putWithFD("/v3/routes/"+e,t).then((function(e){return e.body}))},e.prototype.destroy=function(e){return this.request.delete("/v3/routes/"+e).then((function(e){return e.body}))},e}();t.default=r},747:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,s=t.length;o<s;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var i=s(r(78)),a=function(e){this.start=new Date(e.start),this.end=new Date(e.end),this.resolution=e.resolution,this.stats=e.stats.map((function(e){var t=n({},e);return t.time=new Date(e.time),t}))},u=function(){function e(e){this.request=e}return e.prototype.prepareSearchParams=function(e){var t=[];return"object"==typeof e&&Object.keys(e).length&&(t=Object.entries(e).reduce((function(e,t){var r=t[0],n=t[1];if(Array.isArray(n)&&n.length){var s=n.map((function(e){return[r,e]}));return o(o([],e,!0),s,!0)}return e.push([r,n]),e}),[])),t},e.prototype._parseStats=function(e){return new a(e.body)},e.prototype.getDomain=function(e,t){var r=this.prepareSearchParams(t);return this.request.get((0,i.default)("/v3",e,"stats/total"),r).then(this._parseStats)},e.prototype.getAccount=function(e){var t=this.prepareSearchParams(e);return this.request.get("/v3/stats/total",t).then(this._parseStats)},e}();t.default=u},778:function(e,t,r){"use strict";var n=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,s=t.length;o<s;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=o(r(310)),i=o(r(78)),a={headers:{"Content-Type":"application/json"}},u=function(e){this.type="bounces",this.address=e.address,this.code=+e.code,this.error=e.error,this.created_at=new Date(e.created_at)},l=function(e){this.type="complaints",this.address=e.address,this.created_at=new Date(e.created_at)},c=function(e){this.type="unsubscribes",this.address=e.address,this.tags=e.tags,this.created_at=new Date(e.created_at)},d=function(e){this.type="whitelists",this.value=e.value,this.reason=e.reason,this.createdAt=new Date(e.createdAt)},f=function(){function e(e){this.request=e,this.models={bounces:u,complaints:l,unsubscribes:c,whitelists:d}}return e.prototype._parsePage=function(e,t){var r=s.default.parse(t,!0).query;return{id:e,page:r.page,address:r.address,url:t}},e.prototype._parsePageLinks=function(e){var t=this;return Object.entries(e.body.paging).reduce((function(e,r){var n=r[0],o=r[1];return e[n]=t._parsePage(n,o),e}),{})},e.prototype._parseList=function(e,t){var r={};return r.items=e.body.items.map((function(e){return new t(e)})),r.pages=this._parsePageLinks(e),r},e.prototype._parseItem=function(e,t){return new t(e.body)},e.prototype.createWhiteList=function(e,t){return this.request.postWithFD((0,i.default)("v3",e,"whitelists"),t,a).then((function(e){return e.body}))},e.prototype.list=function(e,t,r){var n=this,o=this.models[t];return this.request.get((0,i.default)("v3",e,t),r).then((function(e){return n._parseList(e,o)}))},e.prototype.get=function(e,t,r){var n=this,o=this.models[t];return this.request.get((0,i.default)("v3",e,t,encodeURIComponent(r))).then((function(e){return n._parseItem(e,o)}))},e.prototype.create=function(e,t,r){var o;return"whitelists"===t?this.createWhiteList(e,r):(o=Array.isArray(r)?n([],r,!0):[r],this.request.post((0,i.default)("v3",e,t),JSON.stringify(o),a).then((function(e){return e.body})))},e.prototype.destroy=function(e,t,r){return this.request.delete((0,i.default)("v3",e,t,encodeURIComponent(r))).then((function(e){return e.body}))},e}();t.default=f,e.exports=f},839:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this.request=e,this.multipleValidation=t}return e.prototype.get=function(e){return this.request.get("/v4/address/validate",{address:e}).then((function(e){return e})).then((function(e){return e.body}))},e}();t.default=r},750:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=n(r(78)),s=function(e,t){this.id=e,this.url=t},i=function(){function e(e){this.request=e}return e.prototype._parseWebhookList=function(e){return e.body.webhooks},e.prototype._parseWebhookWithID=function(e){return function(t){var r,n=null===(r=null==t?void 0:t.body)||void 0===r?void 0:r.webhook,o=null==n?void 0:n.url;return o||(o=(null==n?void 0:n.urls)&&n.urls.length?n.urls[0]:null),new s(e,o)}},e.prototype._parseWebhookTest=function(e){return{code:e.body.code,message:e.body.message}},e.prototype.list=function(e,t){return this.request.get((0,o.default)("/v3/domains",e,"webhooks"),t).then(this._parseWebhookList)},e.prototype.get=function(e,t){return this.request.get((0,o.default)("/v3/domains",e,"webhooks",t)).then(this._parseWebhookWithID(t))},e.prototype.create=function(e,t,r,n){return void 0===n&&(n=!1),n?this.request.putWithFD((0,o.default)("/v3/domains",e,"webhooks",t,"test"),{url:r}).then(this._parseWebhookTest):this.request.postWithFD((0,o.default)("/v3/domains",e,"webhooks"),{id:t,url:r}).then(this._parseWebhookWithID(t))},e.prototype.update=function(e,t,r){return this.request.putWithFD((0,o.default)("/v3/domains",e,"webhooks",t),{url:r}).then(this._parseWebhookWithID(t))},e.prototype.destroy=function(e,t){return this.request.delete((0,o.default)("/v3/domains",e,"webhooks",t)).then(this._parseWebhookWithID(t))},e}();t.default=i},501:function(e,t,r){var n;e=r.nmd(e),function(o){var s=t,i=(e&&e.exports,"object"==typeof global&&global);i.global!==i&&i.window;var a=function(e){this.message=e};(a.prototype=new Error).name="InvalidCharacterError";var u=function(e){throw new a(e)},l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=/[\t\n\f\r ]/g,d={encode:function(e){e=String(e),/[^\0-\xFF]/.test(e)&&u("The string to be encoded contains characters outside of the Latin1 range.");for(var t,r,n,o,s=e.length%3,i="",a=-1,c=e.length-s;++a<c;)t=e.charCodeAt(a)<<16,r=e.charCodeAt(++a)<<8,n=e.charCodeAt(++a),i+=l.charAt((o=t+r+n)>>18&63)+l.charAt(o>>12&63)+l.charAt(o>>6&63)+l.charAt(63&o);return 2==s?(t=e.charCodeAt(a)<<8,r=e.charCodeAt(++a),i+=l.charAt((o=t+r)>>10)+l.charAt(o>>4&63)+l.charAt(o<<2&63)+"="):1==s&&(o=e.charCodeAt(a),i+=l.charAt(o>>2)+l.charAt(o<<4&63)+"=="),i},decode:function(e){var t=(e=String(e).replace(c,"")).length;t%4==0&&(t=(e=e.replace(/==?$/,"")).length),(t%4==1||/[^+a-zA-Z0-9/]/.test(e))&&u("Invalid character: the string to be decoded is not correctly encoded.");for(var r,n,o=0,s="",i=-1;++i<t;)n=l.indexOf(e.charAt(i)),r=o%4?64*r+n:n,o++%4&&(s+=String.fromCharCode(255&r>>(-2*o&6)));return s},version:"1.0.0"};void 0===(n=function(){return d}.call(t,r,t,e))||(e.exports=n)}()},175:e=>{"use strict";e.exports=function(e){if(!/^data:/i.test(e))throw new TypeError('`uri` does not appear to be a Data URI (must begin with "data:")');const t=(e=e.replace(/\r?\n/g,"")).indexOf(",");if(-1===t||t<=4)throw new TypeError("malformed data: URI");const r=e.substring(5,t).split(";");let n="",o=!1;const s=r[0]||"text/plain";let i=s;for(let e=1;e<r.length;e++)"base64"===r[e]?o=!0:(i+=`;${r[e]}`,0===r[e].indexOf("charset=")&&(n=r[e].substring(8)));r[0]||n.length||(i+=";charset=US-ASCII",n="US-ASCII");const a=o?"base64":"ascii",u=unescape(e.substring(t+1)),l=Buffer.from(u,a);return l.type=s,l.typeFull=i,l.charset=n,l}},185:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=new WeakMap,n=new WeakMap;function o(e){const t=r.get(e);return console.assert(null!=t,"'this' is expected an Event object, but got",e),t}function s(e){null==e.passiveListener?e.event.cancelable&&(e.canceled=!0,"function"==typeof e.event.preventDefault&&e.event.preventDefault()):"undefined"!=typeof console&&"function"==typeof console.error&&console.error("Unable to preventDefault inside passive event listener invocation.",e.passiveListener)}function i(e,t){r.set(this,{eventTarget:e,event:t,eventPhase:2,currentTarget:e,canceled:!1,stopped:!1,immediateStopped:!1,passiveListener:null,timeStamp:t.timeStamp||Date.now()}),Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});const n=Object.keys(t);for(let e=0;e<n.length;++e){const t=n[e];t in this||Object.defineProperty(this,t,a(t))}}function a(e){return{get(){return o(this).event[e]},set(t){o(this).event[e]=t},configurable:!0,enumerable:!0}}function u(e){return{value(){const t=o(this).event;return t[e].apply(t,arguments)},configurable:!0,enumerable:!0}}function l(e){if(null==e||e===Object.prototype)return i;let t=n.get(e);return null==t&&(t=function(e,t){const r=Object.keys(t);if(0===r.length)return e;function n(t,r){e.call(this,t,r)}n.prototype=Object.create(e.prototype,{constructor:{value:n,configurable:!0,writable:!0}});for(let o=0;o<r.length;++o){const s=r[o];if(!(s in e.prototype)){const e="function"==typeof Object.getOwnPropertyDescriptor(t,s).value;Object.defineProperty(n.prototype,s,e?u(s):a(s))}}return n}(l(Object.getPrototypeOf(e)),e),n.set(e,t)),t}function c(e){return o(e).immediateStopped}function d(e,t){o(e).passiveListener=t}i.prototype={get type(){return o(this).event.type},get target(){return o(this).eventTarget},get currentTarget(){return o(this).currentTarget},composedPath(){const e=o(this).currentTarget;return null==e?[]:[e]},get NONE(){return 0},get CAPTURING_PHASE(){return 1},get AT_TARGET(){return 2},get BUBBLING_PHASE(){return 3},get eventPhase(){return o(this).eventPhase},stopPropagation(){const e=o(this);e.stopped=!0,"function"==typeof e.event.stopPropagation&&e.event.stopPropagation()},stopImmediatePropagation(){const e=o(this);e.stopped=!0,e.immediateStopped=!0,"function"==typeof e.event.stopImmediatePropagation&&e.event.stopImmediatePropagation()},get bubbles(){return Boolean(o(this).event.bubbles)},get cancelable(){return Boolean(o(this).event.cancelable)},preventDefault(){s(o(this))},get defaultPrevented(){return o(this).canceled},get composed(){return Boolean(o(this).event.composed)},get timeStamp(){return o(this).timeStamp},get srcElement(){return o(this).eventTarget},get cancelBubble(){return o(this).stopped},set cancelBubble(e){if(!e)return;const t=o(this);t.stopped=!0,"boolean"==typeof t.event.cancelBubble&&(t.event.cancelBubble=!0)},get returnValue(){return!o(this).canceled},set returnValue(e){e||s(o(this))},initEvent(){}},Object.defineProperty(i.prototype,"constructor",{value:i,configurable:!0,writable:!0}),"undefined"!=typeof window&&void 0!==window.Event&&(Object.setPrototypeOf(i.prototype,window.Event.prototype),n.set(window.Event.prototype,i));const f=new WeakMap;function p(e){return null!==e&&"object"==typeof e}function h(e){const t=f.get(e);if(null==t)throw new TypeError("'this' is expected an EventTarget object, but got another value.");return t}function b(e,t){Object.defineProperty(e,`on${t}`,function(e){return{get(){let t=h(this).get(e);for(;null!=t;){if(3===t.listenerType)return t.listener;t=t.next}return null},set(t){"function"==typeof t||p(t)||(t=null);const r=h(this);let n=null,o=r.get(e);for(;null!=o;)3===o.listenerType?null!==n?n.next=o.next:null!==o.next?r.set(e,o.next):r.delete(e):n=o,o=o.next;if(null!==t){const o={listener:t,listenerType:3,passive:!1,once:!1,next:null};null===n?r.set(e,o):n.next=o}},configurable:!0,enumerable:!0}}(t))}function y(e){function t(){m.call(this)}t.prototype=Object.create(m.prototype,{constructor:{value:t,configurable:!0,writable:!0}});for(let r=0;r<e.length;++r)b(t.prototype,e[r]);return t}function m(){if(!(this instanceof m)){if(1===arguments.length&&Array.isArray(arguments[0]))return y(arguments[0]);if(arguments.length>0){const e=new Array(arguments.length);for(let t=0;t<arguments.length;++t)e[t]=arguments[t];return y(e)}throw new TypeError("Cannot call a class as a function")}f.set(this,new Map)}m.prototype={addEventListener(e,t,r){if(null==t)return;if("function"!=typeof t&&!p(t))throw new TypeError("'listener' should be a function or an object.");const n=h(this),o=p(r),s=(o?Boolean(r.capture):Boolean(r))?1:2,i={listener:t,listenerType:s,passive:o&&Boolean(r.passive),once:o&&Boolean(r.once),next:null};let a=n.get(e);if(void 0===a)return void n.set(e,i);let u=null;for(;null!=a;){if(a.listener===t&&a.listenerType===s)return;u=a,a=a.next}u.next=i},removeEventListener(e,t,r){if(null==t)return;const n=h(this),o=(p(r)?Boolean(r.capture):Boolean(r))?1:2;let s=null,i=n.get(e);for(;null!=i;){if(i.listener===t&&i.listenerType===o)return void(null!==s?s.next=i.next:null!==i.next?n.set(e,i.next):n.delete(e));s=i,i=i.next}},dispatchEvent(e){if(null==e||"string"!=typeof e.type)throw new TypeError('"event.type" should be a string.');const t=h(this),r=e.type;let n=t.get(r);if(null==n)return!0;const s=function(e,t){return new(l(Object.getPrototypeOf(t)))(e,t)}(this,e);let i=null;for(;null!=n;){if(n.once?null!==i?i.next=n.next:null!==n.next?t.set(r,n.next):t.delete(r):i=n,d(s,n.passive?n.listener:null),"function"==typeof n.listener)try{n.listener.call(this,s)}catch(e){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(e)}else 3!==n.listenerType&&"function"==typeof n.listener.handleEvent&&n.listener.handleEvent(s);if(c(s))break;n=n.next}return d(s,null),function(e,t){o(e).eventPhase=t}(s,0),function(e,t){o(e).currentTarget=t}(s,null),!s.defaultPrevented}},Object.defineProperty(m.prototype,"constructor",{value:m,configurable:!0,writable:!0}),"undefined"!=typeof window&&void 0!==window.EventTarget&&Object.setPrototypeOf(m.prototype,window.EventTarget.prototype),t.defineEventAttribute=b,t.EventTarget=m,t.default=m,e.exports=m,e.exports.EventTarget=e.exports.default=m,e.exports.defineEventAttribute=b},30:(e,t,r)=>{const{Readable:n}=r(781),o=new WeakMap;class Blob{constructor(e=[],t={}){let r=0;const n=e.map((e=>{let t;return t=e instanceof Buffer?e:ArrayBuffer.isView(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof ArrayBuffer?Buffer.from(e):e instanceof Blob?e:Buffer.from("string"==typeof e?e:String(e)),r+=t.length||t.size||0,t})),s=void 0===t.type?"":String(t.type).toLowerCase();o.set(this,{type:/[^\u0020-\u007E]/.test(s)?"":s,size:r,parts:n})}get size(){return o.get(this).size}get type(){return o.get(this).type}async text(){return Buffer.from(await this.arrayBuffer()).toString()}async arrayBuffer(){const e=new Uint8Array(this.size);let t=0;for await(const r of this.stream())e.set(r,t),t+=r.length;return e.buffer}stream(){return n.from(async function*(e){for(const t of e)"stream"in t?yield*t.stream():yield t}(o.get(this).parts))}slice(e=0,t=this.size,r=""){const{size:n}=this;let s=e<0?Math.max(n+e,0):Math.min(e,n),i=t<0?Math.max(n+t,0):Math.min(t,n);const a=Math.max(i-s,0),u=o.get(this).parts.values(),l=[];let c=0;for(const e of u){const t=ArrayBuffer.isView(e)?e.byteLength:e.size;if(s&&t<=s)s-=t,i-=t;else{const r=e.slice(s,Math.min(t,i));if(l.push(r),c+=ArrayBuffer.isView(r)?r.byteLength:r.size,s=0,c>=a)break}}const d=new Blob([],{type:String(r).toLowerCase()});return Object.assign(o.get(d),{size:a,parts:l}),d}get[Symbol.toStringTag](){return"Blob"}static[Symbol.hasInstance](e){return e&&"object"==typeof e&&"function"==typeof e.stream&&0===e.stream.length&&"function"==typeof e.constructor&&/^(Blob|File)$/.test(e[Symbol.toStringTag])}}Object.defineProperties(Blob.prototype,{size:{enumerable:!0},type:{enumerable:!0},slice:{enumerable:!0}}),e.exports=Blob},556:(e,t,r)=>{"use strict";const n=r(594),o=r(271);if(global.fetch||(global.fetch=(e,t)=>n(e,{highWaterMark:1e7,...t})),global.Headers||(global.Headers=n.Headers),global.Request||(global.Request=n.Request),global.Response||(global.Response=n.Response),global.AbortController||(global.AbortController=o),!global.ReadableStream)try{global.ReadableStream=r(902)}catch(e){}e.exports=r(721)},721:function(e){var t;t=function(){"use strict";const e={},t=e=>"undefined"!=typeof self&&self&&e in self?self:"undefined"!=typeof window&&window&&e in window?window:"undefined"!=typeof global&&global&&e in global?global:"undefined"!=typeof globalThis&&globalThis?globalThis:void 0,r=["Headers","Request","Response","ReadableStream","fetch","AbortController","FormData"];for(const n of r)Object.defineProperty(e,n,{get(){const e=t(n),r=e&&e[n];return"function"==typeof r?r.bind(e):r}});const n=e=>null!==e&&"object"==typeof e,o="function"==typeof e.AbortController,s="function"==typeof e.ReadableStream,i="function"==typeof e.FormData,a=(t,r)=>{const n=new e.Headers(t||{}),o=r instanceof e.Headers,s=new e.Headers(r||{});for(const[e,t]of s)o&&"undefined"===t||void 0===t?n.delete(e):n.set(e,t);return n},u=(...e)=>{let t={},r={};for(const o of e){if(Array.isArray(o))Array.isArray(t)||(t=[]),t=[...t,...o];else if(n(o)){for(let[e,r]of Object.entries(o))n(r)&&e in t&&(r=u(t[e],r)),t={...t,[e]:r};n(o.headers)&&(r=a(r,o.headers))}t.headers=r}return t},l=["get","post","put","patch","head","delete"],c={json:"application/json",text:"text/*",formData:"multipart/form-data",arrayBuffer:"*/*",blob:"*/*"},d=[413,429,503],f=Symbol("stop");class HTTPError extends Error{constructor(e){super(e.statusText||String(0===e.status||e.status?e.status:"Unknown response error")),this.name="HTTPError",this.response=e}}class TimeoutError extends Error{constructor(e){super("Request timed out"),this.name="TimeoutError",this.request=e}}const p=e=>new Promise((t=>setTimeout(t,e))),h=e=>l.includes(e)?e.toUpperCase():e,b={limit:2,methods:["get","put","head","delete","options","trace"],statusCodes:[408,413,429,500,502,503,504],afterStatusCodes:d},y=(e={})=>{if("number"==typeof e)return{...b,limit:e};if(e.methods&&!Array.isArray(e.methods))throw new Error("retry.methods must be an array");if(e.statusCodes&&!Array.isArray(e.statusCodes))throw new Error("retry.statusCodes must be an array");return{...b,...e,afterStatusCodes:d}},m=2147483647;class Ky{constructor(t,r={}){if(console.log("ky UMD !!!!"),this._retryCount=0,this._input=t,this._options={credentials:this._input.credentials||"same-origin",...r,headers:a(this._input.headers,r.headers),hooks:u({beforeRequest:[],beforeRetry:[],afterResponse:[]},r.hooks),method:h(r.method||this._input.method),prefixUrl:String(r.prefixUrl||""),retry:y(r.retry),throwHttpErrors:!1!==r.throwHttpErrors,timeout:void 0===r.timeout?1e4:r.timeout,fetch:r.fetch||e.fetch},"string"!=typeof this._input&&!(this._input instanceof URL||this._input instanceof e.Request))throw new TypeError("`input` must be a string, URL, or Request");if(this._options.prefixUrl&&"string"==typeof this._input){if(this._input.startsWith("/"))throw new Error("`input` must not begin with a slash when using `prefixUrl`");this._options.prefixUrl.endsWith("/")||(this._options.prefixUrl+="/"),this._input=this._options.prefixUrl+this._input}if(o&&(this.abortController=new e.AbortController,this._options.signal&&this._options.signal.addEventListener("abort",(()=>{this.abortController.abort()})),this._options.signal=this.abortController.signal),this.request=new e.Request(this._input,this._options),this._options.searchParams){const t="?"+new URLSearchParams(this._options.searchParams).toString(),r=this.request.url.replace(/(?:\?.*?)?(?=#|$)/,t);!(i&&this._options.body instanceof e.FormData||this._options.body instanceof URLSearchParams)||this._options.headers&&this._options.headers["content-type"]||this.request.headers.delete("content-type"),this.request=new e.Request(new e.Request(r,this.request),this._options)}void 0!==this._options.json&&(this._options.body=JSON.stringify(this._options.json),this.request.headers.set("content-type","application/json"),this.request=new e.Request(this.request,{body:this._options.body}));const n=async()=>{if(this._options.timeout>m)throw new RangeError("The `timeout` option cannot be greater than 2147483647");await p(1);let t=await this._fetch();for(const r of this._options.hooks.afterResponse){const n=await r(this.request,this._options,this._decorateResponse(t.clone()));n instanceof e.Response&&(t=n)}if(this._decorateResponse(t),!t.ok&&this._options.throwHttpErrors)throw new HTTPError(t);if(this._options.onDownloadProgress){if("function"!=typeof this._options.onDownloadProgress)throw new TypeError("The `onDownloadProgress` option must be a function");if(!s)throw new Error("Streams are not supported in your environment. `ReadableStream` is missing.");return this._stream(t.clone(),this._options.onDownloadProgress)}return t},l=this._options.retry.methods.includes(this.request.method.toLowerCase())?this._retry(n):n();for(const[e,t]of Object.entries(c))l[e]=async()=>{this.request.headers.set("accept",this.request.headers.get("accept")||t);const n=(await l).clone();if("json"===e){if(204===n.status)return"";if(r.parseJson)return r.parseJson(await n.text())}return n[e]()};return l}_calculateRetryDelay(e){if(this._retryCount++,this._retryCount<this._options.retry.limit&&!(e instanceof TimeoutError)){if(e instanceof HTTPError){if(!this._options.retry.statusCodes.includes(e.response.status))return 0;const t=e.response.headers.get("Retry-After");if(t&&this._options.retry.afterStatusCodes.includes(e.response.status)){let e=Number(t);return Number.isNaN(e)?e=Date.parse(t)-Date.now():e*=1e3,void 0!==this._options.retry.maxRetryAfter&&e>this._options.retry.maxRetryAfter?0:e}if(413===e.response.status)return 0}return.3*2**(this._retryCount-1)*1e3}return 0}_decorateResponse(e){return this._options.parseJson&&(e.json=async()=>this._options.parseJson(await e.text())),e}async _retry(e){try{return await e()}catch(t){const r=Math.min(this._calculateRetryDelay(t),m);if(0!==r&&this._retryCount>0){await p(r);for(const e of this._options.hooks.beforeRetry)if(await e({request:this.request,options:this._options,error:t,retryCount:this._retryCount})===f)return;return this._retry(e)}if(this._options.throwHttpErrors)throw t}}async _fetch(){for(const e of this._options.hooks.beforeRequest){const t=await e(this.request,this._options);if(t instanceof Request){this.request=t;break}if(t instanceof Response)return t}return!1===this._options.timeout?this._options.fetch(this.request.clone()):(e=this.request.clone(),t=this.abortController,r=this._options,new Promise(((n,o)=>{const s=setTimeout((()=>{t&&t.abort(),o(new TimeoutError(e))}),r.timeout);r.fetch(e).then(n).catch(o).then((()=>{clearTimeout(s)}))})));var e,t,r}_stream(t,r){const n=Number(t.headers.get("content-length"))||0;let o=0;return new e.Response(new e.ReadableStream({start(e){const s=t.body.getReader();r&&r({percent:0,transferredBytes:0,totalBytes:n},new Uint8Array),async function t(){const{done:i,value:a}=await s.read();i?e.close():(r&&(o+=a.byteLength,r({percent:0===n?0:o/n,transferredBytes:o,totalBytes:n},a)),e.enqueue(a),t())}()}}))}}const g=(...e)=>{for(const t of e)if((!n(t)||Array.isArray(t))&&void 0!==t)throw new TypeError("The `options` argument must be an object");return u({},...e)},_=e=>{const t=(t,r)=>new Ky(t,g(e,r));for(const r of l)t[r]=(t,n)=>new Ky(t,g(e,n,{method:r}));return t.HTTPError=HTTPError,t.TimeoutError=TimeoutError,t.create=e=>_(g(e)),t.extend=t=>_(g(e,t)),t.stop=f,t};return _()},e.exports=t()},78:e=>{function t(e){return e.replace(/[\/]+/g,"/").replace(/\/\?/g,"?").replace(/\/\#/g,"#").replace(/\:\//g,"://")}e.exports=function(){var e=[].slice.call(arguments,0).join("/");return t(e)}},113:e=>{"use strict";e.exports=require("crypto")},685:e=>{"use strict";e.exports=require("http")},687:e=>{"use strict";e.exports=require("https")},781:e=>{"use strict";e.exports=require("stream")},310:e=>{"use strict";e.exports=require("url")},837:e=>{"use strict";e.exports=require("util")},796:e=>{"use strict";e.exports=require("zlib")},594:(e,t,r)=>{"use strict";t=e.exports=W;const n=r(685),o=r(687),s=r(796),i=r(781),a=r(175),u=r(837),l=r(30),c=r(113),d=r(310);class FetchBaseError extends Error{constructor(e,t){super(e),Error.captureStackTrace(this,this.constructor),this.type=t}get name(){return this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}}class FetchError extends FetchBaseError{constructor(e,t,r){super(e,t),r&&(this.code=this.errno=r.code,this.erroredSysCall=r.syscall)}}const f=Symbol.toStringTag,p=e=>"object"==typeof e&&"function"==typeof e.append&&"function"==typeof e.delete&&"function"==typeof e.get&&"function"==typeof e.getAll&&"function"==typeof e.has&&"function"==typeof e.set&&"function"==typeof e.sort&&"URLSearchParams"===e[f],h=e=>"object"==typeof e&&"function"==typeof e.arrayBuffer&&"string"==typeof e.type&&"function"==typeof e.stream&&"function"==typeof e.constructor&&/^(Blob|File)$/.test(e[f]);function b(e){return"object"==typeof e&&"function"==typeof e.append&&"function"==typeof e.set&&"function"==typeof e.get&&"function"==typeof e.getAll&&"function"==typeof e.delete&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries&&"function"==typeof e.constructor&&"FormData"===e[f]}const y="\r\n",m="-".repeat(2),g=Buffer.byteLength(y),_=e=>`${m}${e}${m}${y.repeat(2)}`;function v(e,t,r){let n="";return n+=`${m}${e}\r\n`,n+=`Content-Disposition: form-data; name="${t}"`,h(r)&&(n+=`; filename="${r.name}"\r\n`,n+=`Content-Type: ${r.type||"application/octet-stream"}`),`${n}${y.repeat(2)}`}const w=Symbol("Body internals");class Body{constructor(e,{size:t=0}={}){let r=null;null===e?e=null:p(e)?e=Buffer.from(e.toString()):h(e)||Buffer.isBuffer(e)||(u.types.isAnyArrayBuffer(e)?e=Buffer.from(e):ArrayBuffer.isView(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof i||(b(e)?(r=`NodeFetchFormDataBoundary${c.randomBytes(8).toString("hex")}`,e=i.Readable.from(async function*(e,t){for(const[r,n]of e)yield v(t,r,n),h(n)?yield*n.stream():yield n,yield y;yield _(t)}(e,r))):e=Buffer.from(String(e)))),this[w]={body:e,boundary:r,disturbed:!1,error:null},this.size=t,e instanceof i&&e.on("error",(e=>{const t=e instanceof FetchBaseError?e:new FetchError(`Invalid response body while trying to fetch ${this.url}: ${e.message}`,"system",e);this[w].error=t}))}get body(){return this[w].body}get bodyUsed(){return this[w].disturbed}async arrayBuffer(){const{buffer:e,byteOffset:t,byteLength:r}=await S(this);return e.slice(t,t+r)}async blob(){const e=this.headers&&this.headers.get("content-type")||this[w].body&&this[w].body.type||"",t=await this.buffer();return new l([t],{type:e})}async json(){const e=await S(this);return JSON.parse(e.toString())}async text(){return(await S(this)).toString()}buffer(){return S(this)}}async function S(e){if(e[w].disturbed)throw new TypeError(`body used already for: ${e.url}`);if(e[w].disturbed=!0,e[w].error)throw e[w].error;let{body:t}=e;if(null===t)return Buffer.alloc(0);if(h(t)&&(t=t.stream()),Buffer.isBuffer(t))return t;if(!(t instanceof i))return Buffer.alloc(0);const r=[];let n=0;try{for await(const o of t){if(e.size>0&&n+o.length>e.size){const r=new FetchError(`content size at ${e.url} over limit: ${e.size}`,"max-size");throw t.destroy(r),r}n+=o.length,r.push(o)}}catch(t){throw t instanceof FetchBaseError?t:new FetchError(`Invalid response body while trying to fetch ${e.url}: ${t.message}`,"system",t)}if(!0!==t.readableEnded&&!0!==t._readableState.ended)throw new FetchError(`Premature close of server response while trying to fetch ${e.url}`);try{return r.every((e=>"string"==typeof e))?Buffer.from(r.join("")):Buffer.concat(r,n)}catch(t){throw new FetchError(`Could not create Buffer from response body for ${e.url}: ${t.message}`,"system",t)}}Object.defineProperties(Body.prototype,{body:{enumerable:!0},bodyUsed:{enumerable:!0},arrayBuffer:{enumerable:!0},blob:{enumerable:!0},json:{enumerable:!0},text:{enumerable:!0}});const R=(e,t)=>{let r,n,{body:o}=e;if(e.bodyUsed)throw new Error("cannot clone body after it is used");return o instanceof i&&"function"!=typeof o.getBoundary&&(r=new i.PassThrough({highWaterMark:t}),n=new i.PassThrough({highWaterMark:t}),o.pipe(r),o.pipe(n),e[w].body=r,o=n),o},T=(e,t)=>null===e?null:"string"==typeof e?"text/plain;charset=UTF-8":p(e)?"application/x-www-form-urlencoded;charset=UTF-8":h(e)?e.type||null:Buffer.isBuffer(e)||u.types.isAnyArrayBuffer(e)||ArrayBuffer.isView(e)?null:e&&"function"==typeof e.getBoundary?`multipart/form-data;boundary=${e.getBoundary()}`:b(e)?`multipart/form-data; boundary=${t[w].boundary}`:e instanceof i?null:"text/plain;charset=UTF-8",q=e=>{const{body:t}=e;return null===t?0:h(t)?t.size:Buffer.isBuffer(t)?t.length:t&&"function"==typeof t.getLengthSync?t.hasKnownLength&&t.hasKnownLength()?t.getLengthSync():null:b(t)?function(e,t){let r=0;for(const[n,o]of e)r+=Buffer.byteLength(v(t,n,o)),h(o)?r+=o.size:r+=Buffer.byteLength(String(o)),r+=g;return r+=Buffer.byteLength(_(t)),r}(e[w].boundary):null},P="function"==typeof n.validateHeaderName?n.validateHeaderName:e=>{if(!/^[\^`\-\w!#$%&'*+.|~]+$/.test(e)){const t=new TypeError(`Header name must be a valid HTTP token [${e}]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_HTTP_TOKEN"}),t}},C="function"==typeof n.validateHeaderValue?n.validateHeaderValue:(e,t)=>{if(/[^\t\u0020-\u007E\u0080-\u00FF]/.test(t)){const t=new TypeError(`Invalid character in header content ["${e}"]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_CHAR"}),t}};class Headers extends URLSearchParams{constructor(e){let t=[];if(e instanceof Headers){const r=e.raw();for(const[e,n]of Object.entries(r))t.push(...n.map((t=>[e,t])))}else if(null==e);else{if("object"!=typeof e||u.types.isBoxedPrimitive(e))throw new TypeError("Failed to construct 'Headers': The provided value is not of type '(sequence<sequence<ByteString>> or record<ByteString, ByteString>)");{const r=e[Symbol.iterator];if(null==r)t.push(...Object.entries(e));else{if("function"!=typeof r)throw new TypeError("Header pairs must be iterable");t=[...e].map((e=>{if("object"!=typeof e||u.types.isBoxedPrimitive(e))throw new TypeError("Each header pair must be an iterable object");return[...e]})).map((e=>{if(2!==e.length)throw new TypeError("Each header pair must be a name/value tuple");return[...e]}))}}}return t=t.length>0?t.map((([e,t])=>(P(e),C(e,String(t)),[String(e).toLowerCase(),String(t)]))):void 0,super(t),new Proxy(this,{get(e,t,r){switch(t){case"append":case"set":return(e,n)=>(P(e),C(e,String(n)),URLSearchParams.prototype[t].call(r,String(e).toLowerCase(),String(n)));case"delete":case"has":case"getAll":return e=>(P(e),URLSearchParams.prototype[t].call(r,String(e).toLowerCase()));case"keys":return()=>(e.sort(),new Set(URLSearchParams.prototype.keys.call(e)).keys());default:return Reflect.get(e,t,r)}}})}get[Symbol.toStringTag](){return this.constructor.name}toString(){return Object.prototype.toString.call(this)}get(e){const t=this.getAll(e);if(0===t.length)return null;let r=t.join(", ");return/^content-encoding$/i.test(e)&&(r=r.toLowerCase()),r}forEach(e){for(const t of this.keys())e(this.get(t),t)}*values(){for(const e of this.keys())yield this.get(e)}*entries(){for(const e of this.keys())yield[e,this.get(e)]}[Symbol.iterator](){return this.entries()}raw(){return[...this.keys()].reduce(((e,t)=>(e[t]=this.getAll(t),e)),{})}[Symbol.for("nodejs.util.inspect.custom")](){return[...this.keys()].reduce(((e,t)=>{const r=this.getAll(t);return e[t]="host"===t?r[0]:r.length>1?r:r[0],e}),{})}}Object.defineProperties(Headers.prototype,["get","entries","forEach","values"].reduce(((e,t)=>(e[t]={enumerable:!0},e)),{}));const E=new Set([301,302,303,307,308]),O=e=>E.has(e),A=Symbol("Response internals");class Response extends Body{constructor(e=null,t={}){super(e,t);const r=t.status||200,n=new Headers(t.headers);if(null!==e&&!n.has("Content-Type")){const t=T(e);t&&n.append("Content-Type",t)}this[A]={url:t.url,status:r,statusText:t.statusText||"",headers:n,counter:t.counter,highWaterMark:t.highWaterMark}}get url(){return this[A].url||""}get status(){return this[A].status}get ok(){return this[A].status>=200&&this[A].status<300}get redirected(){return this[A].counter>0}get statusText(){return this[A].statusText}get headers(){return this[A].headers}get highWaterMark(){return this[A].highWaterMark}clone(){return new Response(R(this,this.highWaterMark),{url:this.url,status:this.status,statusText:this.statusText,headers:this.headers,ok:this.ok,redirected:this.redirected,size:this.size})}static redirect(e,t=302){if(!O(t))throw new RangeError('Failed to execute "redirect" on "response": Invalid status code');return new Response(null,{headers:{location:new URL(e).toString()},status:t})}get[Symbol.toStringTag](){return"Response"}}Object.defineProperties(Response.prototype,{url:{enumerable:!0},status:{enumerable:!0},ok:{enumerable:!0},redirected:{enumerable:!0},statusText:{enumerable:!0},headers:{enumerable:!0},clone:{enumerable:!0}});const j=Symbol("Request internals"),k=e=>"object"==typeof e&&"object"==typeof e[j];class Request extends Body{constructor(e,t={}){let r;k(e)?r=new URL(e.url):(r=new URL(e),e={});let n=t.method||e.method||"GET";if(n=n.toUpperCase(),(null!=t.body||k(e))&&null!==e.body&&("GET"===n||"HEAD"===n))throw new TypeError("Request with GET/HEAD method cannot have body");const o=t.body?t.body:k(e)&&null!==e.body?R(e):null;super(o,{size:t.size||e.size||0});const s=new Headers(t.headers||e.headers||{});if(null!==o&&!s.has("Content-Type")){const e=T(o,this);e&&s.append("Content-Type",e)}let i=k(e)?e.signal:null;if("signal"in t&&(i=t.signal),null!==i&&("object"!=typeof(a=i)||"AbortSignal"!==a[f]))throw new TypeError("Expected signal to be an instanceof AbortSignal");var a;this[j]={method:n,redirect:t.redirect||e.redirect||"follow",headers:s,parsedURL:r,signal:i},this.follow=void 0===t.follow?void 0===e.follow?20:e.follow:t.follow,this.compress=void 0===t.compress?void 0===e.compress||e.compress:t.compress,this.counter=t.counter||e.counter||0,this.agent=t.agent||e.agent,this.highWaterMark=t.highWaterMark||e.highWaterMark||16384,this.insecureHTTPParser=t.insecureHTTPParser||e.insecureHTTPParser||!1}get method(){return this[j].method}get url(){return d.format(this[j].parsedURL)}get headers(){return this[j].headers}get redirect(){return this[j].redirect}get signal(){return this[j].signal}clone(){return new Request(this)}get[Symbol.toStringTag](){return"Request"}}Object.defineProperties(Request.prototype,{method:{enumerable:!0},url:{enumerable:!0},headers:{enumerable:!0},redirect:{enumerable:!0},clone:{enumerable:!0},signal:{enumerable:!0}});class AbortError extends FetchBaseError{constructor(e,t="aborted"){super(e,t)}}const B=new Set(["data:","http:","https:"]);async function W(e,t){return new Promise(((r,u)=>{const l=new Request(e,t),c=(e=>{const{parsedURL:t}=e[j],r=new Headers(e[j].headers);r.has("Accept")||r.set("Accept","*/*");let n=null;if(null===e.body&&/^(post|put)$/i.test(e.method)&&(n="0"),null!==e.body){const t=q(e);"number"!=typeof t||Number.isNaN(t)||(n=String(t))}n&&r.set("Content-Length",n),r.has("User-Agent")||r.set("User-Agent","node-fetch"),e.compress&&!r.has("Accept-Encoding")&&r.set("Accept-Encoding","gzip,deflate,br");let{agent:o}=e;"function"==typeof o&&(o=o(t)),r.has("Connection")||o||r.set("Connection","close");const s=(e=>{if(e.search)return e.search;const t=e.href.length-1,r=e.hash||("#"===e.href[t]?"#":"");return"?"===e.href[t-r.length]?"?":""})(t);return{path:t.pathname+s,pathname:t.pathname,hostname:t.hostname,protocol:t.protocol,port:t.port,hash:t.hash,search:t.search,query:t.query,href:t.href,method:e.method,headers:r[Symbol.for("nodejs.util.inspect.custom")](),insecureHTTPParser:e.insecureHTTPParser,agent:o}})(l);if(!B.has(c.protocol))throw new TypeError(`node-fetch cannot load ${e}. URL scheme "${c.protocol.replace(/:$/,"")}" is not supported.`);if("data:"===c.protocol){const e=a(l.url),t=new Response(e,{headers:{"Content-Type":e.typeFull}});return void r(t)}const d=("https:"===c.protocol?o:n).request,{signal:f}=l;let p=null;const b=()=>{const e=new AbortError("The operation was aborted.");u(e),l.body&&l.body instanceof i.Readable&&l.body.destroy(e),p&&p.body&&p.body.emit("error",e)};if(f&&f.aborted)return void b();const y=()=>{b(),g()},m=d(c);f&&f.addEventListener("abort",y);const g=()=>{m.abort(),f&&f.removeEventListener("abort",y)};m.on("error",(e=>{u(new FetchError(`request to ${l.url} failed, reason: ${e.message}`,"system",e)),g()})),m.on("response",(e=>{m.setTimeout(0);const n=function(e=[]){return new Headers(e.reduce(((e,t,r,n)=>(r%2==0&&e.push(n.slice(r,r+2)),e)),[]).filter((([e,t])=>{try{return P(e),C(e,String(t)),!0}catch{return!1}})))}(e.rawHeaders);if(O(e.statusCode)){const o=n.get("Location"),s=null===o?null:new URL(o,l.url);switch(l.redirect){case"error":return u(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${l.url}`,"no-redirect")),void g();case"manual":if(null!==s)try{n.set("Location",s)}catch(e){u(e)}break;case"follow":{if(null===s)break;if(l.counter>=l.follow)return u(new FetchError(`maximum redirect reached at: ${l.url}`,"max-redirect")),void g();const n={headers:new Headers(l.headers),follow:l.follow,counter:l.counter+1,agent:l.agent,compress:l.compress,method:l.method,body:l.body,signal:l.signal,size:l.size};return 303!==e.statusCode&&l.body&&t.body instanceof i.Readable?(u(new FetchError("Cannot follow redirect with body being a readable stream","unsupported-redirect")),void g()):(303!==e.statusCode&&(301!==e.statusCode&&302!==e.statusCode||"POST"!==l.method)||(n.method="GET",n.body=void 0,n.headers.delete("content-length")),r(W(new Request(s,n))),void g())}}}e.once("end",(()=>{f&&f.removeEventListener("abort",y)}));let o=i.pipeline(e,new i.PassThrough,(e=>{u(e)}));process.version<"v12.10"&&e.on("aborted",y);const a={url:l.url,status:e.statusCode,statusText:e.statusMessage,headers:n,size:l.size,counter:l.counter,highWaterMark:l.highWaterMark},c=n.get("Content-Encoding");if(!l.compress||"HEAD"===l.method||null===c||204===e.statusCode||304===e.statusCode)return p=new Response(o,a),void r(p);const d={flush:s.Z_SYNC_FLUSH,finishFlush:s.Z_SYNC_FLUSH};if("gzip"===c||"x-gzip"===c)return o=i.pipeline(o,s.createGunzip(d),(e=>{u(e)})),p=new Response(o,a),void r(p);if("deflate"!==c&&"x-deflate"!==c){if("br"===c)return o=i.pipeline(o,s.createBrotliDecompress(),(e=>{u(e)})),p=new Response(o,a),void r(p);p=new Response(o,a),r(p)}else{i.pipeline(e,new i.PassThrough,(e=>{u(e)})).once("data",(e=>{o=8==(15&e[0])?i.pipeline(o,s.createInflate(),(e=>{u(e)})):i.pipeline(o,s.createInflateRaw(),(e=>{u(e)})),p=new Response(o,a),r(p)}))}})),((e,{body:t})=>{null===t?e.end():h(t)?t.stream().pipe(e):Buffer.isBuffer(t)?(e.write(t),e.end()):t.pipe(e)})(m,l)}))}t.AbortError=AbortError,t.FetchError=FetchError,t.Headers=Headers,t.Request=Request,t.Response=Response,t.default=W,t.isRedirect=O},902:(e,t,r)=>{"use strict";r.r(t),r.d(t,{ByteLengthQueuingStrategy:()=>ByteLengthQueuingStrategy,CountQueuingStrategy:()=>CountQueuingStrategy,ReadableByteStreamController:()=>ReadableByteStreamController,ReadableStream:()=>ReadableStream,ReadableStreamBYOBReader:()=>ReadableStreamBYOBReader,ReadableStreamBYOBRequest:()=>ReadableStreamBYOBRequest,ReadableStreamDefaultController:()=>ReadableStreamDefaultController,ReadableStreamDefaultReader:()=>ReadableStreamDefaultReader,TransformStream:()=>TransformStream,TransformStreamDefaultController:()=>TransformStreamDefaultController,WritableStream:()=>WritableStream,WritableStreamDefaultController:()=>WritableStreamDefaultController,WritableStreamDefaultWriter:()=>WritableStreamDefaultWriter});const n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol:e=>`Symbol(${e})`;function o(){}const s="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0;function i(e){return"object"==typeof e&&null!==e||"function"==typeof e}const a=o,u=Promise,l=Promise.prototype.then,c=Promise.resolve.bind(u),d=Promise.reject.bind(u);function f(e){return new u(e)}function p(e){return c(e)}function h(e){return d(e)}function b(e,t,r){return l.call(e,t,r)}function y(e,t,r){b(b(e,t,r),void 0,a)}function m(e,t){y(e,t)}function g(e,t){y(e,void 0,t)}function _(e,t,r){return b(e,t,r)}function v(e){b(e,void 0,a)}const w=(()=>{const e=s&&s.queueMicrotask;if("function"==typeof e)return e;const t=p(void 0);return e=>b(t,e)})();function S(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function R(e,t,r){try{return p(S(e,t,r))}catch(e){return h(e)}}class SimpleQueue{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0}get length(){return this._size}push(e){const t=this._back;let r=t;16383===t._elements.length&&(r={_elements:[],_next:void 0}),t._elements.push(e),r!==t&&(this._back=r,t._next=r),++this._size}shift(){const e=this._front;let t=e;const r=this._cursor;let n=r+1;const o=e._elements,s=o[r];return 16384===n&&(t=e._next,n=0),--this._size,this._cursor=n,e!==t&&(this._front=t),o[r]=void 0,s}forEach(e){let t=this._cursor,r=this._front,n=r._elements;for(;!(t===n.length&&void 0===r._next||t===n.length&&(r=r._next,n=r._elements,t=0,0===n.length));)e(n[t]),++t}peek(){const e=this._front,t=this._cursor;return e._elements[t]}}function T(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?E(e):"closed"===t._state?function(e){E(e),j(e)}(e):O(e,t._storedError)}function q(e,t){return pr(e._ownerReadableStream,t)}function P(e){"readable"===e._ownerReadableStream._state?A(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){O(e,t)}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),e._ownerReadableStream._reader=void 0,e._ownerReadableStream=void 0}function C(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function E(e){e._closedPromise=f(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r}))}function O(e,t){E(e),A(e,t)}function A(e,t){void 0!==e._closedPromise_reject&&(v(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}function j(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}const k=n("[[AbortSteps]]"),B=n("[[ErrorSteps]]"),W=n("[[CancelSteps]]"),D=n("[[PullSteps]]"),x=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)},L=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function F(e,t){if(void 0!==e&&("object"!=typeof(r=e)&&"function"!=typeof r))throw new TypeError(`${t} is not an object.`);var r}function M(e,t){if("function"!=typeof e)throw new TypeError(`${t} is not a function.`)}function z(e,t){if(!function(e){return"object"==typeof e&&null!==e||"function"==typeof e}(e))throw new TypeError(`${t} is not an object.`)}function I(e,t,r){if(void 0===e)throw new TypeError(`Parameter ${t} is required in '${r}'.`)}function $(e,t,r){if(void 0===e)throw new TypeError(`${t} is required in '${r}'.`)}function H(e){return Number(e)}function U(e){return 0===e?0:e}function N(e,t){const r=Number.MAX_SAFE_INTEGER;let n=Number(e);if(n=U(n),!x(n))throw new TypeError(`${t} is not a finite number`);if(n=function(e){return U(L(e))}(n),n<0||n>r)throw new TypeError(`${t} is outside the accepted range of 0 to ${r}, inclusive`);return x(n)&&0!==n?n:0}function Q(e,t){if(!dr(e))throw new TypeError(`${t} is not a ReadableStream.`)}function V(e){return new ReadableStreamDefaultReader(e)}function Y(e,t){e._reader._readRequests.push(t)}function G(e,t,r){const n=e._reader._readRequests.shift();r?n._closeSteps():n._chunkSteps(t)}function J(e){return e._reader._readRequests.length}function K(e){const t=e._reader;return void 0!==t&&!!Z(t)}class ReadableStreamDefaultReader{constructor(e){if(I(e,1,"ReadableStreamDefaultReader"),Q(e,"First parameter"),fr(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");T(this,e),this._readRequests=new SimpleQueue}get closed(){return Z(this)?this._closedPromise:h(ee("closed"))}cancel(e){return Z(this)?void 0===this._ownerReadableStream?h(C("cancel")):q(this,e):h(ee("cancel"))}read(){if(!Z(this))return h(ee("read"));if(void 0===this._ownerReadableStream)return h(C("read from"));let e,t;const r=f(((r,n)=>{e=r,t=n}));return X(this,{_chunkSteps:t=>e({value:t,done:!1}),_closeSteps:()=>e({value:void 0,done:!0}),_errorSteps:e=>t(e)}),r}releaseLock(){if(!Z(this))throw ee("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");P(this)}}}function Z(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readRequests")&&e instanceof ReadableStreamDefaultReader)}function X(e,t){const r=e._ownerReadableStream;r._disturbed=!0,"closed"===r._state?t._closeSteps():"errored"===r._state?t._errorSteps(r._storedError):r._readableStreamController[D](t)}function ee(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}Object.defineProperties(ReadableStreamDefaultReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamDefaultReader.prototype,n.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});const te=Object.getPrototypeOf(Object.getPrototypeOf((async function*(){})).prototype);class ReadableStreamAsyncIteratorImpl{constructor(e,t){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=e,this._preventCancel=t}next(){const e=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?_(this._ongoingPromise,e,e):e(),this._ongoingPromise}return(e){const t=()=>this._returnSteps(e);return this._ongoingPromise?_(this._ongoingPromise,t,t):t()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});const e=this._reader;if(void 0===e._ownerReadableStream)return h(C("iterate"));let t,r;const n=f(((e,n)=>{t=e,r=n}));return X(e,{_chunkSteps:e=>{this._ongoingPromise=void 0,w((()=>t({value:e,done:!1})))},_closeSteps:()=>{this._ongoingPromise=void 0,this._isFinished=!0,P(e),t({value:void 0,done:!0})},_errorSteps:t=>{this._ongoingPromise=void 0,this._isFinished=!0,P(e),r(t)}}),n}_returnSteps(e){if(this._isFinished)return Promise.resolve({value:e,done:!0});this._isFinished=!0;const t=this._reader;if(void 0===t._ownerReadableStream)return h(C("finish iterating"));if(!this._preventCancel){const r=q(t,e);return P(t),_(r,(()=>({value:e,done:!0})))}return P(t),p({value:e,done:!0})}}const re={next(){return ne(this)?this._asyncIteratorImpl.next():h(oe("next"))},return(e){return ne(this)?this._asyncIteratorImpl.return(e):h(oe("return"))}};function ne(e){if(!i(e))return!1;if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return!1;try{return e._asyncIteratorImpl instanceof ReadableStreamAsyncIteratorImpl}catch(e){return!1}}function oe(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}void 0!==te&&Object.setPrototypeOf(re,te);const se=Number.isNaN||function(e){return e!=e};function ie(e){return e.slice()}function ae(e,t,r,n,o){new Uint8Array(e).set(new Uint8Array(r,n,o),t)}function ue(e,t,r){if(e.slice)return e.slice(t,r);const n=r-t,o=new ArrayBuffer(n);return ae(o,0,e,t,n),o}function le(e){const t=ue(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}function ce(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function de(e,t,r){if("number"!=typeof(n=r)||se(n)||n<0||r===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");var n;e._queue.push({value:t,size:r}),e._queueTotalSize+=r}function fe(e){e._queue=new SimpleQueue,e._queueTotalSize=0}class ReadableStreamBYOBRequest{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!he(this))throw xe("view");return this._view}respond(e){if(!he(this))throw xe("respond");if(I(e,1,"respond"),e=N(e,"First parameter"),void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,Be(this._associatedReadableByteStreamController,e)}respondWithNewView(e){if(!he(this))throw xe("respondWithNewView");if(I(e,1,"respondWithNewView"),!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");e.buffer,We(this._associatedReadableByteStreamController,e)}}Object.defineProperties(ReadableStreamBYOBRequest.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamBYOBRequest.prototype,n.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class ReadableByteStreamController{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!pe(this))throw Le("byobRequest");return je(this)}get desiredSize(){if(!pe(this))throw Le("desiredSize");return ke(this)}close(){if(!pe(this))throw Le("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");const e=this._controlledReadableByteStream._state;if("readable"!==e)throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);Ee(this)}enqueue(e){if(!pe(this))throw Le("enqueue");if(I(e,1,"enqueue"),!ArrayBuffer.isView(e))throw new TypeError("chunk must be an array buffer view");if(0===e.byteLength)throw new TypeError("chunk must have non-zero byteLength");if(0===e.buffer.byteLength)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");const t=this._controlledReadableByteStream._state;if("readable"!==t)throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);Oe(this,e)}error(e){if(!pe(this))throw Le("error");Ae(this,e)}[W](e){ye(this),fe(this);const t=this._cancelAlgorithm(e);return Ce(this),t}[D](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0){const t=this._queue.shift();this._queueTotalSize-=t.byteLength,Se(this);const r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);return void e._chunkSteps(r)}const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r)}catch(t){return void e._errorSteps(t)}const n={buffer:t,bufferByteLength:r,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(n)}Y(t,e),be(this)}}function pe(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")&&e instanceof ReadableByteStreamController)}function he(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")&&e instanceof ReadableStreamBYOBRequest)}function be(e){const t=function(e){const t=e._controlledReadableByteStream;if("readable"!==t._state)return!1;if(e._closeRequested)return!1;if(!e._started)return!1;if(K(t)&&J(t)>0)return!0;if(Ie(t)&&ze(t)>0)return!0;if(ke(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;y(e._pullAlgorithm(),(()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,be(e))}),(t=>{Ae(e,t)}))}function ye(e){Re(e),e._pendingPullIntos=new SimpleQueue}function me(e,t){let r=!1;"closed"===e._state&&(r=!0);const n=ge(t);"default"===t.readerType?G(e,n,r):function(e,t,r){const n=e._reader._readIntoRequests.shift();r?n._closeSteps(t):n._chunkSteps(t)}(e,n,r)}function ge(e){const t=e.bytesFilled,r=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,t/r)}function _e(e,t,r,n){e._queue.push({buffer:t,byteOffset:r,byteLength:n}),e._queueTotalSize+=n}function ve(e,t){const r=t.elementSize,n=t.bytesFilled-t.bytesFilled%r,o=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),s=t.bytesFilled+o,i=s-s%r;let a=o,u=!1;i>n&&(a=i-t.bytesFilled,u=!0);const l=e._queue;for(;a>0;){const r=l.peek(),n=Math.min(a,r.byteLength),o=t.byteOffset+t.bytesFilled;ae(t.buffer,o,r.buffer,r.byteOffset,n),r.byteLength===n?l.shift():(r.byteOffset+=n,r.byteLength-=n),e._queueTotalSize-=n,we(e,n,t),a-=n}return u}function we(e,t,r){r.bytesFilled+=t}function Se(e){0===e._queueTotalSize&&e._closeRequested?(Ce(e),hr(e._controlledReadableByteStream)):be(e)}function Re(e){null!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null)}function Te(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos.peek();ve(e,t)&&(Pe(e),me(e._controlledReadableByteStream,t))}}function qe(e,t){const r=e._pendingPullIntos.peek();Re(e);"closed"===e._controlledReadableByteStream._state?function(e,t){const r=e._controlledReadableByteStream;if(Ie(r))for(;ze(r)>0;)me(r,Pe(e))}(e):function(e,t,r){if(we(0,t,r),r.bytesFilled<r.elementSize)return;Pe(e);const n=r.bytesFilled%r.elementSize;if(n>0){const t=r.byteOffset+r.bytesFilled,o=ue(r.buffer,t-n,t);_e(e,o,0,o.byteLength)}r.bytesFilled-=n,me(e._controlledReadableByteStream,r),Te(e)}(e,t,r),be(e)}function Pe(e){return e._pendingPullIntos.shift()}function Ce(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function Ee(e){const t=e._controlledReadableByteStream;if(!e._closeRequested&&"readable"===t._state)if(e._queueTotalSize>0)e._closeRequested=!0;else{if(e._pendingPullIntos.length>0){if(e._pendingPullIntos.peek().bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw Ae(e,t),t}}Ce(e),hr(t)}}function Oe(e,t){const r=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==r._state)return;const n=t.buffer,o=t.byteOffset,s=t.byteLength,i=n;if(e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek();t.buffer,0,t.buffer=t.buffer}if(Re(e),K(r))if(0===J(r))_e(e,i,o,s);else{G(r,new Uint8Array(i,o,s),!1)}else Ie(r)?(_e(e,i,o,s),Te(e)):_e(e,i,o,s);be(e)}function Ae(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(ye(e),fe(e),Ce(e),br(r,t))}function je(e){if(null===e._byobRequest&&e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek(),r=new Uint8Array(t.buffer,t.byteOffset+t.bytesFilled,t.byteLength-t.bytesFilled),n=Object.create(ReadableStreamBYOBRequest.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r}(n,e,r),e._byobRequest=n}return e._byobRequest}function ke(e){const t=e._controlledReadableByteStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Be(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else{if(0===t)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range")}r.buffer=r.buffer,qe(e,t)}function We(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t.byteLength)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(0===t.byteLength)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.bufferByteLength!==t.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(r.bytesFilled+t.byteLength>r.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");r.buffer=t.buffer,qe(e,t.byteLength)}function De(e,t,r,n,o,s,i){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,t._byobRequest=null,t._queue=t._queueTotalSize=void 0,fe(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=s,t._pullAlgorithm=n,t._cancelAlgorithm=o,t._autoAllocateChunkSize=i,t._pendingPullIntos=new SimpleQueue,e._readableStreamController=t;y(p(r()),(()=>{t._started=!0,be(t)}),(e=>{Ae(t,e)}))}function xe(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function Le(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function Fe(e){return new ReadableStreamBYOBReader(e)}function Me(e,t){e._reader._readIntoRequests.push(t)}function ze(e){return e._reader._readIntoRequests.length}function Ie(e){const t=e._reader;return void 0!==t&&!!$e(t)}Object.defineProperties(ReadableByteStreamController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableByteStreamController.prototype,n.toStringTag,{value:"ReadableByteStreamController",configurable:!0});class ReadableStreamBYOBReader{constructor(e){if(I(e,1,"ReadableStreamBYOBReader"),Q(e,"First parameter"),fr(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!pe(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");T(this,e),this._readIntoRequests=new SimpleQueue}get closed(){return $e(this)?this._closedPromise:h(Ue("closed"))}cancel(e){return $e(this)?void 0===this._ownerReadableStream?h(C("cancel")):q(this,e):h(Ue("cancel"))}read(e){if(!$e(this))return h(Ue("read"));if(!ArrayBuffer.isView(e))return h(new TypeError("view must be an array buffer view"));if(0===e.byteLength)return h(new TypeError("view must have non-zero byteLength"));if(0===e.buffer.byteLength)return h(new TypeError("view's buffer must have non-zero byteLength"));if(e.buffer,void 0===this._ownerReadableStream)return h(C("read from"));let t,r;const n=f(((e,n)=>{t=e,r=n}));return He(this,e,{_chunkSteps:e=>t({value:e,done:!1}),_closeSteps:e=>t({value:e,done:!0}),_errorSteps:e=>r(e)}),n}releaseLock(){if(!$e(this))throw Ue("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readIntoRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");P(this)}}}function $e(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")&&e instanceof ReadableStreamBYOBReader)}function He(e,t,r){const n=e._ownerReadableStream;n._disturbed=!0,"errored"===n._state?r._errorSteps(n._storedError):function(e,t,r){const n=e._controlledReadableByteStream;let o=1;t.constructor!==DataView&&(o=t.constructor.BYTES_PER_ELEMENT);const s=t.constructor,i=t.buffer,a={buffer:i,bufferByteLength:i.byteLength,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:o,viewConstructor:s,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(a),void Me(n,r);if("closed"!==n._state){if(e._queueTotalSize>0){if(ve(e,a)){const t=ge(a);return Se(e),void r._chunkSteps(t)}if(e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return Ae(e,t),void r._errorSteps(t)}}e._pendingPullIntos.push(a),Me(n,r),be(e)}else{const e=new s(a.buffer,a.byteOffset,0);r._closeSteps(e)}}(n._readableStreamController,t,r)}function Ue(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function Ne(e,t){const{highWaterMark:r}=e;if(void 0===r)return t;if(se(r)||r<0)throw new RangeError("Invalid highWaterMark");return r}function Qe(e){const{size:t}=e;return t||(()=>1)}function Ve(e,t){F(e,t);const r=null==e?void 0:e.highWaterMark,n=null==e?void 0:e.size;return{highWaterMark:void 0===r?void 0:H(r),size:void 0===n?void 0:Ye(n,`${t} has member 'size' that`)}}function Ye(e,t){return M(e,t),t=>H(e(t))}function Ge(e,t,r){return M(e,r),r=>R(e,t,[r])}function Je(e,t,r){return M(e,r),()=>R(e,t,[])}function Ke(e,t,r){return M(e,r),r=>S(e,t,[r])}function Ze(e,t,r){return M(e,r),(r,n)=>R(e,t,[r,n])}function Xe(e,t){if(!nt(e))throw new TypeError(`${t} is not a WritableStream.`)}Object.defineProperties(ReadableStreamBYOBReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamBYOBReader.prototype,n.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});const et="function"==typeof AbortController;class WritableStream{constructor(e={},t={}){void 0===e?e=null:z(e,"First parameter");const r=Ve(t,"Second parameter"),n=function(e,t){F(e,t);const r=null==e?void 0:e.abort,n=null==e?void 0:e.close,o=null==e?void 0:e.start,s=null==e?void 0:e.type,i=null==e?void 0:e.write;return{abort:void 0===r?void 0:Ge(r,e,`${t} has member 'abort' that`),close:void 0===n?void 0:Je(n,e,`${t} has member 'close' that`),start:void 0===o?void 0:Ke(o,e,`${t} has member 'start' that`),write:void 0===i?void 0:Ze(i,e,`${t} has member 'write' that`),type:s}}(e,"First parameter");rt(this);if(void 0!==n.type)throw new RangeError("Invalid type is specified");const o=Qe(r);!function(e,t,r,n){const o=Object.create(WritableStreamDefaultController.prototype);let s=()=>{},i=()=>p(void 0),a=()=>p(void 0),u=()=>p(void 0);void 0!==t.start&&(s=()=>t.start(o));void 0!==t.write&&(i=e=>t.write(e,o));void 0!==t.close&&(a=()=>t.close());void 0!==t.abort&&(u=e=>t.abort(e));wt(e,o,s,i,a,u,r,n)}(this,n,Ne(r,1),o)}get locked(){if(!nt(this))throw Et("locked");return ot(this)}abort(e){return nt(this)?ot(this)?h(new TypeError("Cannot abort a stream that already has a writer")):st(this,e):h(Et("abort"))}close(){return nt(this)?ot(this)?h(new TypeError("Cannot close a stream that already has a writer")):ct(this)?h(new TypeError("Cannot close an already-closing stream")):it(this):h(Et("close"))}getWriter(){if(!nt(this))throw Et("getWriter");return tt(this)}}function tt(e){return new WritableStreamDefaultWriter(e)}function rt(e){e._state="writable",e._storedError=void 0,e._writer=void 0,e._writableStreamController=void 0,e._writeRequests=new SimpleQueue,e._inFlightWriteRequest=void 0,e._closeRequest=void 0,e._inFlightCloseRequest=void 0,e._pendingAbortRequest=void 0,e._backpressure=!1}function nt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")&&e instanceof WritableStream)}function ot(e){return void 0!==e._writer}function st(e,t){var r;if("closed"===e._state||"errored"===e._state)return p(void 0);e._writableStreamController._abortReason=t,null===(r=e._writableStreamController._abortController)||void 0===r||r.abort();const n=e._state;if("closed"===n||"errored"===n)return p(void 0);if(void 0!==e._pendingAbortRequest)return e._pendingAbortRequest._promise;let o=!1;"erroring"===n&&(o=!0,t=void 0);const s=f(((r,n)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:n,_reason:t,_wasAlreadyErroring:o}}));return e._pendingAbortRequest._promise=s,o||ut(e,t),s}function it(e){const t=e._state;if("closed"===t||"errored"===t)return h(new TypeError(`The stream (in ${t} state) is not in the writable state and cannot be closed`));const r=f(((t,r)=>{const n={_resolve:t,_reject:r};e._closeRequest=n})),n=e._writer;var o;return void 0!==n&&e._backpressure&&"writable"===t&&zt(n),de(o=e._writableStreamController,_t,0),Tt(o),r}function at(e,t){"writable"!==e._state?lt(e):ut(e,t)}function ut(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const n=e._writer;void 0!==n&&yt(n,t),!function(e){if(void 0===e._inFlightWriteRequest&&void 0===e._inFlightCloseRequest)return!1;return!0}(e)&&r._started&&lt(e)}function lt(e){e._state="errored",e._writableStreamController[B]();const t=e._storedError;if(e._writeRequests.forEach((e=>{e._reject(t)})),e._writeRequests=new SimpleQueue,void 0===e._pendingAbortRequest)return void dt(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,r._wasAlreadyErroring)return r._reject(t),void dt(e);y(e._writableStreamController[k](r._reason),(()=>{r._resolve(),dt(e)}),(t=>{r._reject(t),dt(e)}))}function ct(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function dt(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&Wt(t,e._storedError)}function ft(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(t?function(e){xt(e)}(r):zt(r)),e._backpressure=t}Object.defineProperties(WritableStream.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStream.prototype,n.toStringTag,{value:"WritableStream",configurable:!0});class WritableStreamDefaultWriter{constructor(e){if(I(e,1,"WritableStreamDefaultWriter"),Xe(e,"First parameter"),ot(e))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=e,e._writer=this;const t=e._state;if("writable"===t)!ct(e)&&e._backpressure?xt(this):Ft(this),kt(this);else if("erroring"===t)Lt(this,e._storedError),kt(this);else if("closed"===t)Ft(this),kt(r=this),Dt(r);else{const t=e._storedError;Lt(this,t),Bt(this,t)}var r}get closed(){return pt(this)?this._closedPromise:h(At("closed"))}get desiredSize(){if(!pt(this))throw At("desiredSize");if(void 0===this._ownerWritableStream)throw jt("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return Rt(t._writableStreamController)}(this)}get ready(){return pt(this)?this._readyPromise:h(At("ready"))}abort(e){return pt(this)?void 0===this._ownerWritableStream?h(jt("abort")):function(e,t){return st(e._ownerWritableStream,t)}(this,e):h(At("abort"))}close(){if(!pt(this))return h(At("close"));const e=this._ownerWritableStream;return void 0===e?h(jt("close")):ct(e)?h(new TypeError("Cannot close an already-closing stream")):ht(this)}releaseLock(){if(!pt(this))throw At("releaseLock");void 0!==this._ownerWritableStream&&mt(this)}write(e){return pt(this)?void 0===this._ownerWritableStream?h(jt("write to")):gt(this,e):h(At("write"))}}function pt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")&&e instanceof WritableStreamDefaultWriter)}function ht(e){return it(e._ownerWritableStream)}function bt(e,t){"pending"===e._closedPromiseState?Wt(e,t):function(e,t){Bt(e,t)}(e,t)}function yt(e,t){"pending"===e._readyPromiseState?Mt(e,t):function(e,t){Lt(e,t)}(e,t)}function mt(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");yt(e,r),bt(e,r),t._writer=void 0,e._ownerWritableStream=void 0}function gt(e,t){const r=e._ownerWritableStream,n=r._writableStreamController,o=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return qt(e,t),1}}(n,t);if(r!==e._ownerWritableStream)return h(jt("write to"));const s=r._state;if("errored"===s)return h(r._storedError);if(ct(r)||"closed"===s)return h(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===s)return h(r._storedError);const i=function(e){return f(((t,r)=>{const n={_resolve:t,_reject:r};e._writeRequests.push(n)}))}(r);return function(e,t,r){try{de(e,t,r)}catch(t){return void qt(e,t)}const n=e._controlledWritableStream;if(!ct(n)&&"writable"===n._state){ft(n,Pt(e))}Tt(e)}(n,t,o),i}Object.defineProperties(WritableStreamDefaultWriter.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStreamDefaultWriter.prototype,n.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});const _t={};class WritableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!vt(this))throw Ot("abortReason");return this._abortReason}get signal(){if(!vt(this))throw Ot("signal");if(void 0===this._abortController)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(e){if(!vt(this))throw Ot("error");"writable"===this._controlledWritableStream._state&&Ct(this,e)}[k](e){const t=this._abortAlgorithm(e);return St(this),t}[B](){fe(this)}}function vt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")&&e instanceof WritableStreamDefaultController)}function wt(e,t,r,n,o,s,i,a){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,fe(t),t._abortReason=void 0,t._abortController=function(){if(et)return new AbortController}(),t._started=!1,t._strategySizeAlgorithm=a,t._strategyHWM=i,t._writeAlgorithm=n,t._closeAlgorithm=o,t._abortAlgorithm=s;const u=Pt(t);ft(e,u);y(p(r()),(()=>{t._started=!0,Tt(t)}),(r=>{t._started=!0,at(e,r)}))}function St(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Rt(e){return e._strategyHWM-e._queueTotalSize}function Tt(e){const t=e._controlledWritableStream;if(!e._started)return;if(void 0!==t._inFlightWriteRequest)return;if("erroring"===t._state)return void lt(t);if(0===e._queue.length)return;const r=e._queue.peek().value;r===_t?function(e){const t=e._controlledWritableStream;(function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0})(t),ce(e);const r=e._closeAlgorithm();St(e),y(r,(()=>{!function(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,"erroring"===e._state&&(e._storedError=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";const t=e._writer;void 0!==t&&Dt(t)}(t)}),(e=>{!function(e,t){e._inFlightCloseRequest._reject(t),e._inFlightCloseRequest=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._reject(t),e._pendingAbortRequest=void 0),at(e,t)}(t,e)}))}(e):function(e,t){const r=e._controlledWritableStream;!function(e){e._inFlightWriteRequest=e._writeRequests.shift()}(r);y(e._writeAlgorithm(t),(()=>{!function(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0}(r);const t=r._state;if(ce(e),!ct(r)&&"writable"===t){const t=Pt(e);ft(r,t)}Tt(e)}),(t=>{"writable"===r._state&&St(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,at(e,t)}(r,t)}))}(e,r)}function qt(e,t){"writable"===e._controlledWritableStream._state&&Ct(e,t)}function Pt(e){return Rt(e)<=0}function Ct(e,t){const r=e._controlledWritableStream;St(e),ut(r,t)}function Et(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function Ot(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function At(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function jt(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function kt(e){e._closedPromise=f(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending"}))}function Bt(e,t){kt(e),Wt(e,t)}function Wt(e,t){void 0!==e._closedPromise_reject&&(v(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected")}function Dt(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved")}function xt(e){e._readyPromise=f(((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r})),e._readyPromiseState="pending"}function Lt(e,t){xt(e),Mt(e,t)}function Ft(e){xt(e),zt(e)}function Mt(e,t){void 0!==e._readyPromise_reject&&(v(e._readyPromise),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected")}function zt(e){void 0!==e._readyPromise_resolve&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled")}Object.defineProperties(WritableStreamDefaultController.prototype,{error:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStreamDefaultController.prototype,n.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});const It="undefined"!=typeof DOMException?DOMException:void 0;const $t=function(e){if("function"!=typeof e&&"object"!=typeof e)return!1;try{return new e,!0}catch(e){return!1}}(It)?It:function(){const e=function(e,t){this.message=e||"",this.name=t||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}();function Ht(e,t,r,n,s,i){const a=V(e),u=tt(t);e._disturbed=!0;let l=!1,c=p(void 0);return f(((d,_)=>{let w;if(void 0!==i){if(w=()=>{const r=new $t("Aborted","AbortError"),o=[];n||o.push((()=>"writable"===t._state?st(t,r):p(void 0))),s||o.push((()=>"readable"===e._state?pr(e,r):p(void 0))),E((()=>Promise.all(o.map((e=>e())))),!0,r)},i.aborted)return void w();i.addEventListener("abort",w)}var S,R,T;if(C(e,a._closedPromise,(e=>{n?O(!0,e):E((()=>st(t,e)),!0,e)})),C(t,u._closedPromise,(t=>{s?O(!0,t):E((()=>pr(e,t)),!0,t)})),S=e,R=a._closedPromise,T=()=>{r?O():E((()=>function(e){const t=e._ownerWritableStream,r=t._state;return ct(t)||"closed"===r?p(void 0):"errored"===r?h(t._storedError):ht(e)}(u)))},"closed"===S._state?T():m(R,T),ct(t)||"closed"===t._state){const t=new TypeError("the destination writable stream closed before all data could be piped to it");s?O(!0,t):E((()=>pr(e,t)),!0,t)}function q(){const e=c;return b(c,(()=>e!==c?q():void 0))}function C(e,t,r){"errored"===e._state?r(e._storedError):g(t,r)}function E(e,r,n){function o(){y(e(),(()=>A(r,n)),(e=>A(!0,e)))}l||(l=!0,"writable"!==t._state||ct(t)?o():m(q(),o))}function O(e,r){l||(l=!0,"writable"!==t._state||ct(t)?A(e,r):m(q(),(()=>A(e,r))))}function A(e,t){mt(u),P(a),void 0!==i&&i.removeEventListener("abort",w),e?_(t):d(void 0)}v(f(((e,t)=>{!function r(n){n?e():b(l?p(!0):b(u._readyPromise,(()=>f(((e,t)=>{X(a,{_chunkSteps:t=>{c=b(gt(u,t),void 0,o),e(!1)},_closeSteps:()=>e(!0),_errorSteps:t})})))),r,t)}(!1)})))}))}class ReadableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!Ut(this))throw er("desiredSize");return Kt(this)}close(){if(!Ut(this))throw er("close");if(!Zt(this))throw new TypeError("The stream is not in a state that permits close");Yt(this)}enqueue(e){if(!Ut(this))throw er("enqueue");if(!Zt(this))throw new TypeError("The stream is not in a state that permits enqueue");return Gt(this,e)}error(e){if(!Ut(this))throw er("error");Jt(this,e)}[W](e){fe(this);const t=this._cancelAlgorithm(e);return Vt(this),t}[D](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=ce(this);this._closeRequested&&0===this._queue.length?(Vt(this),hr(t)):Nt(this),e._chunkSteps(r)}else Y(t,e),Nt(this)}}function Ut(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")&&e instanceof ReadableStreamDefaultController)}function Nt(e){if(!Qt(e))return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;y(e._pullAlgorithm(),(()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,Nt(e))}),(t=>{Jt(e,t)}))}function Qt(e){const t=e._controlledReadableStream;if(!Zt(e))return!1;if(!e._started)return!1;if(fr(t)&&J(t)>0)return!0;return Kt(e)>0}function Vt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Yt(e){if(!Zt(e))return;const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(Vt(e),hr(t))}function Gt(e,t){if(!Zt(e))return;const r=e._controlledReadableStream;if(fr(r)&&J(r)>0)G(r,t,!1);else{let r;try{r=e._strategySizeAlgorithm(t)}catch(t){throw Jt(e,t),t}try{de(e,t,r)}catch(t){throw Jt(e,t),t}}Nt(e)}function Jt(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(fe(e),Vt(e),br(r,t))}function Kt(e){const t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Zt(e){const t=e._controlledReadableStream._state;return!e._closeRequested&&"readable"===t}function Xt(e,t,r,n,o,s,i){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,fe(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=i,t._strategyHWM=s,t._pullAlgorithm=n,t._cancelAlgorithm=o,e._readableStreamController=t;y(p(r()),(()=>{t._started=!0,Nt(t)}),(e=>{Jt(t,e)}))}function er(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function tr(e,t){return pe(e._readableStreamController)?function(e){let t,r,n,o,s,i=V(e),a=!1,u=!1,l=!1;const c=f((e=>{s=e}));function d(e){g(e._closedPromise,(t=>{e===i&&(Ae(n._readableStreamController,t),Ae(o._readableStreamController,t),u&&l||s(void 0))}))}function h(){$e(i)&&(P(i),i=V(e),d(i));X(i,{_chunkSteps:t=>{w((()=>{a=!1;const r=t;let i=t;if(!u&&!l)try{i=le(t)}catch(t){return Ae(n._readableStreamController,t),Ae(o._readableStreamController,t),void s(pr(e,t))}u||Oe(n._readableStreamController,r),l||Oe(o._readableStreamController,i)}))},_closeSteps:()=>{a=!1,u||Ee(n._readableStreamController),l||Ee(o._readableStreamController),n._readableStreamController._pendingPullIntos.length>0&&Be(n._readableStreamController,0),o._readableStreamController._pendingPullIntos.length>0&&Be(o._readableStreamController,0),u&&l||s(void 0)},_errorSteps:()=>{a=!1}})}function b(t,r){Z(i)&&(P(i),i=Fe(e),d(i));const c=r?o:n,f=r?n:o;He(i,t,{_chunkSteps:t=>{w((()=>{a=!1;const n=r?l:u;if(r?u:l)n||We(c._readableStreamController,t);else{let r;try{r=le(t)}catch(t){return Ae(c._readableStreamController,t),Ae(f._readableStreamController,t),void s(pr(e,t))}n||We(c._readableStreamController,t),Oe(f._readableStreamController,r)}}))},_closeSteps:e=>{a=!1;const t=r?l:u,n=r?u:l;t||Ee(c._readableStreamController),n||Ee(f._readableStreamController),void 0!==e&&(t||We(c._readableStreamController,e),!n&&f._readableStreamController._pendingPullIntos.length>0&&Be(f._readableStreamController,0)),t&&n||s(void 0)},_errorSteps:()=>{a=!1}})}function y(){if(a)return p(void 0);a=!0;const e=je(n._readableStreamController);return null===e?h():b(e._view,!1),p(void 0)}function m(){if(a)return p(void 0);a=!0;const e=je(o._readableStreamController);return null===e?h():b(e._view,!0),p(void 0)}function _(n){if(u=!0,t=n,l){const n=ie([t,r]),o=pr(e,n);s(o)}return c}function v(n){if(l=!0,r=n,u){const n=ie([t,r]),o=pr(e,n);s(o)}return c}function S(){}return n=lr(S,y,_),o=lr(S,m,v),d(i),[n,o]}(e):function(e,t){const r=V(e);let n,o,s,i,a,u=!1,l=!1,c=!1;const d=f((e=>{a=e}));function h(){if(u)return p(void 0);u=!0;return X(r,{_chunkSteps:e=>{w((()=>{u=!1;const t=e,r=e;l||Gt(s._readableStreamController,t),c||Gt(i._readableStreamController,r)}))},_closeSteps:()=>{u=!1,l||Yt(s._readableStreamController),c||Yt(i._readableStreamController),l&&c||a(void 0)},_errorSteps:()=>{u=!1}}),p(void 0)}function b(t){if(l=!0,n=t,c){const t=ie([n,o]),r=pr(e,t);a(r)}return d}function y(t){if(c=!0,o=t,l){const t=ie([n,o]),r=pr(e,t);a(r)}return d}function m(){}return s=ur(m,h,b),i=ur(m,h,y),g(r._closedPromise,(e=>{Jt(s._readableStreamController,e),Jt(i._readableStreamController,e),l&&c||a(void 0)})),[s,i]}(e)}function rr(e,t,r){return M(e,r),r=>R(e,t,[r])}function nr(e,t,r){return M(e,r),r=>R(e,t,[r])}function or(e,t,r){return M(e,r),r=>S(e,t,[r])}function sr(e,t){if("bytes"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function ir(e,t){if("byob"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function ar(e,t){F(e,t);const r=null==e?void 0:e.preventAbort,n=null==e?void 0:e.preventCancel,o=null==e?void 0:e.preventClose,s=null==e?void 0:e.signal;return void 0!==s&&function(e,t){if(!function(e){if("object"!=typeof e||null===e)return!1;try{return"boolean"==typeof e.aborted}catch(e){return!1}}(e))throw new TypeError(`${t} is not an AbortSignal.`)}(s,`${t} has member 'signal' that`),{preventAbort:Boolean(r),preventCancel:Boolean(n),preventClose:Boolean(o),signal:s}}Object.defineProperties(ReadableStreamDefaultController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamDefaultController.prototype,n.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});class ReadableStream{constructor(e={},t={}){void 0===e?e=null:z(e,"First parameter");const r=Ve(t,"Second parameter"),n=function(e,t){F(e,t);const r=e,n=null==r?void 0:r.autoAllocateChunkSize,o=null==r?void 0:r.cancel,s=null==r?void 0:r.pull,i=null==r?void 0:r.start,a=null==r?void 0:r.type;return{autoAllocateChunkSize:void 0===n?void 0:N(n,`${t} has member 'autoAllocateChunkSize' that`),cancel:void 0===o?void 0:rr(o,r,`${t} has member 'cancel' that`),pull:void 0===s?void 0:nr(s,r,`${t} has member 'pull' that`),start:void 0===i?void 0:or(i,r,`${t} has member 'start' that`),type:void 0===a?void 0:sr(a,`${t} has member 'type' that`)}}(e,"First parameter");if(cr(this),"bytes"===n.type){if(void 0!==r.size)throw new RangeError("The strategy for a byte stream cannot have a size function");!function(e,t,r){const n=Object.create(ReadableByteStreamController.prototype);let o=()=>{},s=()=>p(void 0),i=()=>p(void 0);void 0!==t.start&&(o=()=>t.start(n)),void 0!==t.pull&&(s=()=>t.pull(n)),void 0!==t.cancel&&(i=e=>t.cancel(e));const a=t.autoAllocateChunkSize;if(0===a)throw new TypeError("autoAllocateChunkSize must be greater than 0");De(e,n,o,s,i,r,a)}(this,n,Ne(r,0))}else{const e=Qe(r);!function(e,t,r,n){const o=Object.create(ReadableStreamDefaultController.prototype);let s=()=>{},i=()=>p(void 0),a=()=>p(void 0);void 0!==t.start&&(s=()=>t.start(o)),void 0!==t.pull&&(i=()=>t.pull(o)),void 0!==t.cancel&&(a=e=>t.cancel(e)),Xt(e,o,s,i,a,r,n)}(this,n,Ne(r,1),e)}}get locked(){if(!dr(this))throw yr("locked");return fr(this)}cancel(e){return dr(this)?fr(this)?h(new TypeError("Cannot cancel a stream that already has a reader")):pr(this,e):h(yr("cancel"))}getReader(e){if(!dr(this))throw yr("getReader");return void 0===function(e,t){F(e,t);const r=null==e?void 0:e.mode;return{mode:void 0===r?void 0:ir(r,`${t} has member 'mode' that`)}}(e,"First parameter").mode?V(this):Fe(this)}pipeThrough(e,t={}){if(!dr(this))throw yr("pipeThrough");I(e,1,"pipeThrough");const r=function(e,t){F(e,t);const r=null==e?void 0:e.readable;$(r,"readable","ReadableWritablePair"),Q(r,`${t} has member 'readable' that`);const n=null==e?void 0:e.writable;return $(n,"writable","ReadableWritablePair"),Xe(n,`${t} has member 'writable' that`),{readable:r,writable:n}}(e,"First parameter"),n=ar(t,"Second parameter");if(fr(this))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(ot(r.writable))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return v(Ht(this,r.writable,n.preventClose,n.preventAbort,n.preventCancel,n.signal)),r.readable}pipeTo(e,t={}){if(!dr(this))return h(yr("pipeTo"));if(void 0===e)return h("Parameter 1 is required in 'pipeTo'.");if(!nt(e))return h(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let r;try{r=ar(t,"Second parameter")}catch(e){return h(e)}return fr(this)?h(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):ot(e)?h(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):Ht(this,e,r.preventClose,r.preventAbort,r.preventCancel,r.signal)}tee(){if(!dr(this))throw yr("tee");return ie(tr(this))}values(e){if(!dr(this))throw yr("values");return function(e,t){const r=V(e),n=new ReadableStreamAsyncIteratorImpl(r,t),o=Object.create(re);return o._asyncIteratorImpl=n,o}(this,function(e,t){F(e,t);const r=null==e?void 0:e.preventCancel;return{preventCancel:Boolean(r)}}(e,"First parameter").preventCancel)}}function ur(e,t,r,n=1,o=(()=>1)){const s=Object.create(ReadableStream.prototype);cr(s);return Xt(s,Object.create(ReadableStreamDefaultController.prototype),e,t,r,n,o),s}function lr(e,t,r){const n=Object.create(ReadableStream.prototype);cr(n);return De(n,Object.create(ReadableByteStreamController.prototype),e,t,r,0,void 0),n}function cr(e){e._state="readable",e._reader=void 0,e._storedError=void 0,e._disturbed=!1}function dr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")&&e instanceof ReadableStream)}function fr(e){return void 0!==e._reader}function pr(e,t){if(e._disturbed=!0,"closed"===e._state)return p(void 0);if("errored"===e._state)return h(e._storedError);hr(e);const r=e._reader;void 0!==r&&$e(r)&&(r._readIntoRequests.forEach((e=>{e._closeSteps(void 0)})),r._readIntoRequests=new SimpleQueue);return _(e._readableStreamController[W](t),o)}function hr(e){e._state="closed";const t=e._reader;void 0!==t&&(j(t),Z(t)&&(t._readRequests.forEach((e=>{e._closeSteps()})),t._readRequests=new SimpleQueue))}function br(e,t){e._state="errored",e._storedError=t;const r=e._reader;void 0!==r&&(A(r,t),Z(r)?(r._readRequests.forEach((e=>{e._errorSteps(t)})),r._readRequests=new SimpleQueue):(r._readIntoRequests.forEach((e=>{e._errorSteps(t)})),r._readIntoRequests=new SimpleQueue))}function yr(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function mr(e,t){F(e,t);const r=null==e?void 0:e.highWaterMark;return $(r,"highWaterMark","QueuingStrategyInit"),{highWaterMark:H(r)}}Object.defineProperties(ReadableStream.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStream.prototype,n.toStringTag,{value:"ReadableStream",configurable:!0}),"symbol"==typeof n.asyncIterator&&Object.defineProperty(ReadableStream.prototype,n.asyncIterator,{value:ReadableStream.prototype.values,writable:!0,configurable:!0});const gr=e=>e.byteLength;Object.defineProperty(gr,"name",{value:"size",configurable:!0});class ByteLengthQueuingStrategy{constructor(e){I(e,1,"ByteLengthQueuingStrategy"),e=mr(e,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!vr(this))throw _r("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!vr(this))throw _r("size");return gr}}function _r(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function vr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")&&e instanceof ByteLengthQueuingStrategy)}Object.defineProperties(ByteLengthQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ByteLengthQueuingStrategy.prototype,n.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});const wr=()=>1;Object.defineProperty(wr,"name",{value:"size",configurable:!0});class CountQueuingStrategy{constructor(e){I(e,1,"CountQueuingStrategy"),e=mr(e,"First parameter"),this._countQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!Rr(this))throw Sr("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!Rr(this))throw Sr("size");return wr}}function Sr(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function Rr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")&&e instanceof CountQueuingStrategy)}function Tr(e,t,r){return M(e,r),r=>R(e,t,[r])}function qr(e,t,r){return M(e,r),r=>S(e,t,[r])}function Pr(e,t,r){return M(e,r),(r,n)=>R(e,t,[r,n])}Object.defineProperties(CountQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(CountQueuingStrategy.prototype,n.toStringTag,{value:"CountQueuingStrategy",configurable:!0});class TransformStream{constructor(e={},t={},r={}){void 0===e&&(e=null);const n=Ve(t,"Second parameter"),o=Ve(r,"Third parameter"),s=function(e,t){F(e,t);const r=null==e?void 0:e.flush,n=null==e?void 0:e.readableType,o=null==e?void 0:e.start,s=null==e?void 0:e.transform,i=null==e?void 0:e.writableType;return{flush:void 0===r?void 0:Tr(r,e,`${t} has member 'flush' that`),readableType:n,start:void 0===o?void 0:qr(o,e,`${t} has member 'start' that`),transform:void 0===s?void 0:Pr(s,e,`${t} has member 'transform' that`),writableType:i}}(e,"First parameter");if(void 0!==s.readableType)throw new RangeError("Invalid readableType specified");if(void 0!==s.writableType)throw new RangeError("Invalid writableType specified");const i=Ne(o,0),a=Qe(o),u=Ne(n,1),l=Qe(n);let c;!function(e,t,r,n,o,s){function i(){return t}function a(t){return function(e,t){const r=e._transformStreamController;if(e._backpressure){return _(e._backpressureChangePromise,(()=>{const n=e._writable;if("erroring"===n._state)throw n._storedError;return Wr(r,t)}))}return Wr(r,t)}(e,t)}function u(t){return function(e,t){return Er(e,t),p(void 0)}(e,t)}function l(){return function(e){const t=e._readable,r=e._transformStreamController,n=r._flushAlgorithm();return kr(r),_(n,(()=>{if("errored"===t._state)throw t._storedError;Yt(t._readableStreamController)}),(r=>{throw Er(e,r),t._storedError}))}(e)}function c(){return function(e){return Ar(e,!1),e._backpressureChangePromise}(e)}function d(t){return Or(e,t),p(void 0)}e._writable=function(e,t,r,n,o=1,s=(()=>1)){const i=Object.create(WritableStream.prototype);return rt(i),wt(i,Object.create(WritableStreamDefaultController.prototype),e,t,r,n,o,s),i}(i,a,l,u,r,n),e._readable=ur(i,c,d,o,s),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,Ar(e,!0),e._transformStreamController=void 0}(this,f((e=>{c=e})),u,l,i,a),function(e,t){const r=Object.create(TransformStreamDefaultController.prototype);let n=e=>{try{return Br(r,e),p(void 0)}catch(e){return h(e)}},o=()=>p(void 0);void 0!==t.transform&&(n=e=>t.transform(e,r));void 0!==t.flush&&(o=()=>t.flush(r));!function(e,t,r,n){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=n}(e,r,n,o)}(this,s),void 0!==s.start?c(s.start(this._transformStreamController)):c(void 0)}get readable(){if(!Cr(this))throw xr("readable");return this._readable}get writable(){if(!Cr(this))throw xr("writable");return this._writable}}function Cr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")&&e instanceof TransformStream)}function Er(e,t){Jt(e._readable._readableStreamController,t),Or(e,t)}function Or(e,t){kr(e._transformStreamController),qt(e._writable._writableStreamController,t),e._backpressure&&Ar(e,!1)}function Ar(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=f((t=>{e._backpressureChangePromise_resolve=t})),e._backpressure=t}Object.defineProperties(TransformStream.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(TransformStream.prototype,n.toStringTag,{value:"TransformStream",configurable:!0});class TransformStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!jr(this))throw Dr("desiredSize");return Kt(this._controlledTransformStream._readable._readableStreamController)}enqueue(e){if(!jr(this))throw Dr("enqueue");Br(this,e)}error(e){if(!jr(this))throw Dr("error");var t;t=e,Er(this._controlledTransformStream,t)}terminate(){if(!jr(this))throw Dr("terminate");!function(e){const t=e._controlledTransformStream;Yt(t._readable._readableStreamController);const r=new TypeError("TransformStream terminated");Or(t,r)}(this)}}function jr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")&&e instanceof TransformStreamDefaultController)}function kr(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function Br(e,t){const r=e._controlledTransformStream,n=r._readable._readableStreamController;if(!Zt(n))throw new TypeError("Readable side is not in a state that permits enqueue");try{Gt(n,t)}catch(e){throw Or(r,e),r._readable._storedError}const o=function(e){return!Qt(e)}(n);o!==r._backpressure&&Ar(r,!0)}function Wr(e,t){return _(e._transformAlgorithm(t),void 0,(t=>{throw Er(e._controlledTransformStream,t),t}))}function Dr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function xr(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}Object.defineProperties(TransformStreamDefaultController.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(TransformStreamDefaultController.prototype,n.toStringTag,{value:"TransformStreamDefaultController",configurable:!0})}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var s=t[n]={id:n,loaded:!1,exports:{}};return e[n].call(s.exports,s,s.exports,r),s.loaded=!0,s.exports}return r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r(48)})()}));
3
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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dUMsS0FDakMsSUFBSSxJQUFJM3JDLEtBQU8yckMsRUFDWEwsRUFBb0JNLEVBQUVELEVBQVkzckMsS0FBU3NyQyxFQUFvQk0sRUFBRTF1QyxFQUFTOEMsSUFDNUV6QyxPQUFPQyxlQUFlTixFQUFTOEMsRUFBSyxDQUFFekIsWUFBWSxFQUFNTCxJQUFLeXRDLEVBQVczckMsTUNKM0VzckMsRUFBb0JNLEVBQUksQ0FBQ3g5QixFQUFLeTlCLElBQVV0dUMsT0FBT2EsVUFBVWt5QixlQUFldHhCLEtBQUtvUCxFQUFLeTlCLEdDQ2xGUCxFQUFvQnJULEVBQUsvNkIsSUFDSCxvQkFBWHNCLFFBQTBCQSxPQUFPQyxhQUMxQ2xCLE9BQU9DLGVBQWVOLEVBQVNzQixPQUFPQyxZQUFhLENBQUVoQixNQUFPLFdBRTdERixPQUFPQyxlQUFlTixFQUFTLGFBQWMsQ0FBRU8sT0FBTyxLQ0x2RDZ0QyxFQUFvQlEsSUFBTzN1QyxJQUMxQkEsRUFBTzR1QyxNQUFRLEdBQ1Y1dUMsRUFBTzZ1QyxXQUFVN3VDLEVBQU82dUMsU0FBVyxJQUNqQzd1QyxHQ0FrQm11QyxFQUFvQixLM0NPOUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2Fib3J0LWNvbnRyb2xsZXIvZGlzdC9hYm9ydC1jb250cm9sbGVyLmpzIiwid2VicGFjazovL21haWxndW4vLi9pbmRleC50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2NsaWVudC50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2RvbWFpbnMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9kb21haW5zQ3JlZGVudGlhbHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9kb21haW5zVGFncy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2RvbWFpbnNUZW1wbGF0ZXMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9lcnJvci50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2V2ZW50cy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2lwLXBvb2xzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvaXBzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvbGlzdHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9tYWlsTGlzdE1lbWJlcnMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9tZXNzYWdlcy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL211bHRpcGxlVmFsaWRhdGlvbi50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3JlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9yb3V0ZXMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9zdGF0cy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3N1cHByZXNzaW9ucy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3ZhbGlkYXRlLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvd2ViaG9va3MudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9iYXNlLTY0L2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2RhdGEtdXJpLXRvLWJ1ZmZlci9kaXN0L3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2V2ZW50LXRhcmdldC1zaGltL2Rpc3QvZXZlbnQtdGFyZ2V0LXNoaW0uanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9mZXRjaC1ibG9iL2luZGV4LmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMva3ktdW5pdmVyc2FsL2luZGV4LmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMva3kvdW1kLmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvdXJsLWpvaW4vbGliL3VybC1qb2luLmpzIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImNyeXB0b1wiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImh0dHBcIiIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJodHRwc1wiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInN0cmVhbVwiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInVybFwiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInV0aWxcIiIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ6bGliXCIiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9ub2RlLWZldGNoL2Rpc3QvaW5kZXguY2pzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvd2ViLXN0cmVhbXMtcG9seWZpbGwvZGlzdC9wb255ZmlsbC5lczIwMTgubWpzIiwid2VicGFjazovL21haWxndW4vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL21haWxndW4vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3N0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wibWFpbGd1blwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJtYWlsZ3VuXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hIDxodHRwczovL2dpdGh1Yi5jb20vbXlzdGljYXRlYT5cbiAqIFNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBkaXJlY3RvcnkgZm9yIGZ1bGwgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgZXZlbnRUYXJnZXRTaGltID0gcmVxdWlyZSgnZXZlbnQtdGFyZ2V0LXNoaW0nKTtcblxuLyoqXG4gKiBUaGUgc2lnbmFsIGNsYXNzLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2Fib3J0c2lnbmFsXG4gKi9cbmNsYXNzIEFib3J0U2lnbmFsIGV4dGVuZHMgZXZlbnRUYXJnZXRTaGltLkV2ZW50VGFyZ2V0IHtcbiAgICAvKipcbiAgICAgKiBBYm9ydFNpZ25hbCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBYm9ydFNpZ25hbCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHlcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYEFib3J0U2lnbmFsYCdzIGBBYm9ydENvbnRyb2xsZXJgIGhhcyBzaWduYWxlZCB0byBhYm9ydCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGdldCBhYm9ydGVkKCkge1xuICAgICAgICBjb25zdCBhYm9ydGVkID0gYWJvcnRlZEZsYWdzLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhYm9ydGVkICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJ3RoaXMnIHRvIGJlIGFuICdBYm9ydFNpZ25hbCcgb2JqZWN0LCBidXQgZ290ICR7dGhpcyA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHRoaXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFib3J0ZWQ7XG4gICAgfVxufVxuZXZlbnRUYXJnZXRTaGltLmRlZmluZUV2ZW50QXR0cmlidXRlKEFib3J0U2lnbmFsLnByb3RvdHlwZSwgXCJhYm9ydFwiKTtcbi8qKlxuICogQ3JlYXRlIGFuIEFib3J0U2lnbmFsIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQWJvcnRTaWduYWwoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gT2JqZWN0LmNyZWF0ZShBYm9ydFNpZ25hbC5wcm90b3R5cGUpO1xuICAgIGV2ZW50VGFyZ2V0U2hpbS5FdmVudFRhcmdldC5jYWxsKHNpZ25hbCk7XG4gICAgYWJvcnRlZEZsYWdzLnNldChzaWduYWwsIGZhbHNlKTtcbiAgICByZXR1cm4gc2lnbmFsO1xufVxuLyoqXG4gKiBBYm9ydCBhIGdpdmVuIHNpZ25hbC5cbiAqL1xuZnVuY3Rpb24gYWJvcnRTaWduYWwoc2lnbmFsKSB7XG4gICAgaWYgKGFib3J0ZWRGbGFncy5nZXQoc2lnbmFsKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhYm9ydGVkRmxhZ3Muc2V0KHNpZ25hbCwgdHJ1ZSk7XG4gICAgc2lnbmFsLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiBcImFib3J0XCIgfSk7XG59XG4vKipcbiAqIEFib3J0ZWQgZmxhZyBmb3IgZWFjaCBpbnN0YW5jZXMuXG4gKi9cbmNvbnN0IGFib3J0ZWRGbGFncyA9IG5ldyBXZWFrTWFwKCk7XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRTaWduYWwucHJvdG90eXBlLCB7XG4gICAgYWJvcnRlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG59KTtcbi8vIGB0b1N0cmluZygpYCBzaG91bGQgcmV0dXJuIGBcIltvYmplY3QgQWJvcnRTaWduYWxdXCJgXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRTaWduYWwucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogXCJBYm9ydFNpZ25hbFwiLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoZSBBYm9ydENvbnRyb2xsZXIuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jYWJvcnRjb250cm9sbGVyXG4gKi9cbmNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHNpZ25hbHMuc2V0KHRoaXMsIGNyZWF0ZUFib3J0U2lnbmFsKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgQWJvcnRTaWduYWxgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNpZ25hbCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWJvcnQgYW5kIHNpZ25hbCB0byBhbnkgb2JzZXJ2ZXJzIHRoYXQgdGhlIGFzc29jaWF0ZWQgYWN0aXZpdHkgaXMgdG8gYmUgYWJvcnRlZC5cbiAgICAgKi9cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgYWJvcnRTaWduYWwoZ2V0U2lnbmFsKHRoaXMpKTtcbiAgICB9XG59XG4vKipcbiAqIEFzc29jaWF0ZWQgc2lnbmFscy5cbiAqL1xuY29uc3Qgc2lnbmFscyA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdldCB0aGUgYXNzb2NpYXRlZCBzaWduYWwgb2YgYSBnaXZlbiBjb250cm9sbGVyLlxuICovXG5mdW5jdGlvbiBnZXRTaWduYWwoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZ2V0KGNvbnRyb2xsZXIpO1xuICAgIGlmIChzaWduYWwgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0Q29udHJvbGxlcicgb2JqZWN0LCBidXQgZ290ICR7Y29udHJvbGxlciA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGNvbnRyb2xsZXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBzaWduYWw7XG59XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIHNpZ25hbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgYWJvcnQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxufSk7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFwiQWJvcnRDb250cm9sbGVyXCIsXG4gICAgfSk7XG59XG5cbmV4cG9ydHMuQWJvcnRDb250cm9sbGVyID0gQWJvcnRDb250cm9sbGVyO1xuZXhwb3J0cy5BYm9ydFNpZ25hbCA9IEFib3J0U2lnbmFsO1xuZXhwb3J0cy5kZWZhdWx0ID0gQWJvcnRDb250cm9sbGVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFib3J0Q29udHJvbGxlclxubW9kdWxlLmV4cG9ydHMuQWJvcnRDb250cm9sbGVyID0gbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQWJvcnRDb250cm9sbGVyXG5tb2R1bGUuZXhwb3J0cy5BYm9ydFNpZ25hbCA9IEFib3J0U2lnbmFsXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hYm9ydC1jb250cm9sbGVyLmpzLm1hcFxuIiwiaW1wb3J0IENsaWVudCBmcm9tICcuL2xpYi9jbGllbnQnO1xuaW1wb3J0IHsgSW5wdXRGb3JtRGF0YSB9IGZyb20gJy4vbGliL2ludGVyZmFjZXMvSUZvcm1EYXRhJztcbmltcG9ydCBPcHRpb25zIGZyb20gJy4vbGliL2ludGVyZmFjZXMvT3B0aW9ucyc7XG5cbmNsYXNzIE1haWxndW4ge1xuICBwcml2YXRlIGZvcm1EYXRhOiBJbnB1dEZvcm1EYXRhXG5cbiAgY29uc3RydWN0b3IoRm9ybURhdGE6IElucHV0Rm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gRm9ybURhdGE7XG4gIH1cblxuICBjbGllbnQob3B0aW9uczogT3B0aW9ucykgOiBDbGllbnQge1xuICAgIHJldHVybiBuZXcgQ2xpZW50KG9wdGlvbnMsIHRoaXMuZm9ybURhdGEpO1xuICB9XG59XG5cbmV4cG9ydCA9IE1haWxndW47XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvT3B0aW9ucyc7XG5pbXBvcnQgUmVxdWVzdE9wdGlvbnMgZnJvbSAnLi9pbnRlcmZhY2VzL1JlcXVlc3RPcHRpb25zJztcblxuaW1wb3J0IERvbWFpbkNsaWVudCBmcm9tICcuL2RvbWFpbnMnO1xuaW1wb3J0IEV2ZW50Q2xpZW50IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCBTdGF0c0NsaWVudCBmcm9tICcuL3N0YXRzJztcbmltcG9ydCBTdXBwcmVzc2lvbkNsaWVudCBmcm9tICcuL3N1cHByZXNzaW9ucyc7XG5pbXBvcnQgV2ViaG9va0NsaWVudCBmcm9tICcuL3dlYmhvb2tzJztcbmltcG9ydCBNZXNzYWdlc0NsaWVudCBmcm9tICcuL21lc3NhZ2VzJztcbmltcG9ydCBSb3V0ZXNDbGllbnQgZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IFZhbGlkYXRlQ2xpZW50IGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IElwc0NsaWVudCBmcm9tICcuL2lwcyc7XG5pbXBvcnQgSXBQb29sc0NsaWVudCBmcm9tICcuL2lwLXBvb2xzJztcbmltcG9ydCBMaXN0c0NsaWVudCBmcm9tICcuL2xpc3RzJztcbmltcG9ydCBNYWlsTGlzdHNNZW1iZXJzIGZyb20gJy4vbWFpbExpc3RNZW1iZXJzJztcbmltcG9ydCB7IElucHV0Rm9ybURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvSUZvcm1EYXRhJztcbmltcG9ydCBEb21haW5DcmVkZW50aWFsc0NsaWVudCBmcm9tICcuL2RvbWFpbnNDcmVkZW50aWFscyc7XG5pbXBvcnQgTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50IGZyb20gJy4vbXVsdGlwbGVWYWxpZGF0aW9uJztcbmltcG9ydCBEb21haW5UZW1wbGF0ZXNDbGllbnQgZnJvbSAnLi9kb21haW5zVGVtcGxhdGVzJztcbmltcG9ydCBEb21haW5UYWdzQ2xpZW50IGZyb20gJy4vZG9tYWluc1RhZ3MnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnQge1xuICBwcml2YXRlIHJlcXVlc3Q7XG5cbiAgcHVibGljIGRvbWFpbnM7XG4gIHB1YmxpYyB3ZWJob29rcztcbiAgcHVibGljIGV2ZW50cztcbiAgcHVibGljIHN0YXRzO1xuICBwdWJsaWMgc3VwcHJlc3Npb25zO1xuICBwdWJsaWMgbWVzc2FnZXM7XG4gIHB1YmxpYyByb3V0ZXM7XG4gIHB1YmxpYyB2YWxpZGF0ZTtcbiAgcHVibGljIGlwcztcbiAgcHVibGljIGlwX3Bvb2xzO1xuICBwdWJsaWMgbGlzdHM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucywgZm9ybURhdGE6IElucHV0Rm9ybURhdGEpIHtcbiAgICBjb25zdCBjb25maWc6IFJlcXVlc3RPcHRpb25zID0geyAuLi5vcHRpb25zIH0gYXMgUmVxdWVzdE9wdGlvbnM7XG5cbiAgICBpZiAoIWNvbmZpZy51cmwpIHtcbiAgICAgIGNvbmZpZy51cmwgPSAnaHR0cHM6Ly9hcGkubWFpbGd1bi5uZXQnO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLnVzZXJuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciBcInVzZXJuYW1lXCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5rZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIFwia2V5XCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5yZXF1ZXN0ID0gbmV3IFJlcXVlc3QoY29uZmlnLCBmb3JtRGF0YSk7XG4gICAgY29uc3QgbWFpbExpc3RzTWVtYmVycyA9IG5ldyBNYWlsTGlzdHNNZW1iZXJzKHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgZG9tYWluQ3JlZGVudGlhbHNDbGllbnQgPSBuZXcgRG9tYWluQ3JlZGVudGlhbHNDbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICBjb25zdCBkb21haW5UZW1wbGF0ZXNDbGllbnQgPSBuZXcgRG9tYWluVGVtcGxhdGVzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgZG9tYWluVGFnc0NsaWVudCA9IG5ldyBEb21haW5UYWdzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgbXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50ID0gbmV3IE11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCh0aGlzLnJlcXVlc3QpO1xuXG4gICAgdGhpcy5kb21haW5zID0gbmV3IERvbWFpbkNsaWVudChcbiAgICAgIHRoaXMucmVxdWVzdCxcbiAgICAgIGRvbWFpbkNyZWRlbnRpYWxzQ2xpZW50LFxuICAgICAgZG9tYWluVGVtcGxhdGVzQ2xpZW50LFxuICAgICAgZG9tYWluVGFnc0NsaWVudFxuICAgICk7XG4gICAgdGhpcy53ZWJob29rcyA9IG5ldyBXZWJob29rQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRDbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICB0aGlzLnN0YXRzID0gbmV3IFN0YXRzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5zdXBwcmVzc2lvbnMgPSBuZXcgU3VwcHJlc3Npb25DbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICB0aGlzLm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5yb3V0ZXMgPSBuZXcgUm91dGVzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5pcHMgPSBuZXcgSXBzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5pcF9wb29scyA9IG5ldyBJcFBvb2xzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5saXN0cyA9IG5ldyBMaXN0c0NsaWVudCh0aGlzLnJlcXVlc3QsIG1haWxMaXN0c01lbWJlcnMpO1xuICAgIHRoaXMudmFsaWRhdGUgPSBuZXcgVmFsaWRhdGVDbGllbnQodGhpcy5yZXF1ZXN0LCBtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQpO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCB7XG4gIERvbWFpblJlc3BvbnNlRGF0YSxcbiAgRGVzdHJveWVkRG9tYWluUmVzcG9uc2UsXG4gIERvbWFpbnNRdWVyeSxcbiAgRG9tYWluSW5mbyxcbiAgRG9tYWluTGlzdFJlc3BvbnNlRGF0YSxcbiAgRG9tYWluU2hvcnREYXRhLFxuICBETlNSZWNvcmQsXG4gIENvbm5lY3Rpb25TZXR0aW5nc1Jlc3BvbnNlLFxuICBDb25uZWN0aW9uU2V0dGluZ3MsXG4gIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3MsXG4gIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3NSZXMsXG4gIERLSU1BdXRob3JpdHlJbmZvLFxuICBVcGRhdGVkREtJTUF1dGhvcml0eSxcbiAgVXBkYXRlZERLSU1BdXRob3JpdHlSZXNwb25zZSxcbiAgREtJTVNlbGVjdG9ySW5mbyxcbiAgVXBkYXRlZERLSU1TZWxlY3RvclJlc3BvbnNlLFxuICBXZWJQcmVmaXhJbmZvLFxuICBVcGRhdGVkV2ViUHJlZml4UmVzcG9uc2UsXG4gIFJlcGxhY2VtZW50Rm9yUG9vbCxcbiAgTWVzc2FnZVJlc3BvbnNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWlucyc7XG5cbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IEFQSUVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcblxuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIERvbWFpblRyYWNraW5nUmVzcG9uc2UsXG4gIERvbWFpblRyYWNraW5nRGF0YSxcbiAgT3BlblRyYWNraW5nSW5mbyxcbiAgQ2xpY2tUcmFja2luZ0luZm8sXG4gIFVuc3Vic2NyaWJlVHJhY2tpbmdJbmZvLFxuICBVcGRhdGVEb21haW5UcmFja2luZ1Jlc3BvbnNlLFxuICBVcGRhdGVkT3BlblRyYWNraW5nXG59IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UcmFja2luZyc7XG5pbXBvcnQgeyBJRG9tYWluQ3JlZGVudGlhbHMgfSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluQ3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgSURvbWFpblRlbXBsYXRlc0NsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UZW1wbGF0ZXMnO1xuaW1wb3J0IERvbWFpbkNyZWRlbnRpYWxzQ2xpZW50IGZyb20gJy4vZG9tYWluc0NyZWRlbnRpYWxzJztcbmltcG9ydCBEb21haW5UZW1wbGF0ZXNDbGllbnQgZnJvbSAnLi9kb21haW5zVGVtcGxhdGVzJztcbmltcG9ydCB7IElEb21haW5UYWdzQ2xpZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0RvbWFpblRhZ3MnO1xuaW1wb3J0IERvbWFpblRhZ3NDbGllbnQgZnJvbSAnLi9kb21haW5zVGFncyc7XG5cbmV4cG9ydCBjbGFzcyBEb21haW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHJlcXVpcmVfdGxzOiBib29sZWFuO1xuICBza2lwX3ZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgc3RhdGU6IHN0cmluZztcbiAgd2lsZGNhcmQ6IGJvb2xlYW47XG4gIHNwYW1fYWN0aW9uOiBzdHJpbmc7XG4gIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgc210cF9wYXNzd29yZDogc3RyaW5nO1xuICBzbXRwX2xvZ2luOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgcmVjZWl2aW5nX2Ruc19yZWNvcmRzOiBETlNSZWNvcmRbXSB8IG51bGw7XG4gIHNlbmRpbmdfZG5zX3JlY29yZHM6IEROU1JlY29yZFtdIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBEb21haW5TaG9ydERhdGEsIHJlY2VpdmluZz86IEROU1JlY29yZFtdIHwgbnVsbCwgc2VuZGluZz86IEROU1JlY29yZFtdIHwgbnVsbCkge1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLnJlcXVpcmVfdGxzID0gZGF0YS5yZXF1aXJlX3RscztcbiAgICB0aGlzLnNraXBfdmVyaWZpY2F0aW9uID0gZGF0YS5za2lwX3ZlcmlmaWNhdGlvbjtcbiAgICB0aGlzLnN0YXRlID0gZGF0YS5zdGF0ZTtcbiAgICB0aGlzLndpbGRjYXJkID0gZGF0YS53aWxkY2FyZDtcbiAgICB0aGlzLnNwYW1fYWN0aW9uID0gZGF0YS5zcGFtX2FjdGlvbjtcbiAgICB0aGlzLmNyZWF0ZWRfYXQgPSBkYXRhLmNyZWF0ZWRfYXQ7XG4gICAgdGhpcy5zbXRwX3Bhc3N3b3JkID0gZGF0YS5zbXRwX3Bhc3N3b3JkO1xuICAgIHRoaXMuc210cF9sb2dpbiA9IGRhdGEuc210cF9sb2dpbjtcbiAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICB0aGlzLnJlY2VpdmluZ19kbnNfcmVjb3JkcyA9IHJlY2VpdmluZyB8fCBudWxsO1xuICAgIHRoaXMuc2VuZGluZ19kbnNfcmVjb3JkcyA9IHNlbmRpbmcgfHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21haW5DbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuICBwdWJsaWMgZG9tYWluQ3JlZGVudGlhbHM6IElEb21haW5DcmVkZW50aWFscztcbiAgcHVibGljIGRvbWFpblRlbXBsYXRlczogSURvbWFpblRlbXBsYXRlc0NsaWVudDtcbiAgcHVibGljIGRvbWFpblRhZ3M6IElEb21haW5UYWdzQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgZG9tYWluQ3JlZGVudGlhbHNDbGllbnQ6IERvbWFpbkNyZWRlbnRpYWxzQ2xpZW50LFxuICAgIGRvbWFpblRlbXBsYXRlc0NsaWVudDogRG9tYWluVGVtcGxhdGVzQ2xpZW50LFxuICAgIGRvbWFpblRhZ3NDbGllbnQ6IERvbWFpblRhZ3NDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmRvbWFpbkNyZWRlbnRpYWxzID0gZG9tYWluQ3JlZGVudGlhbHNDbGllbnQ7XG4gICAgdGhpcy5kb21haW5UZW1wbGF0ZXMgPSBkb21haW5UZW1wbGF0ZXNDbGllbnQ7XG4gICAgdGhpcy5kb21haW5UYWdzID0gZG9tYWluVGFnc0NsaWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlTWVzc2FnZShyZXNwb25zZTogRGVzdHJveWVkRG9tYWluUmVzcG9uc2UpIDogTWVzc2FnZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRG9tYWluTGlzdChyZXNwb25zZTogRG9tYWluTGlzdFJlc3BvbnNlRGF0YSk6IERvbWFpbltdIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keS5pdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBuZXcgRG9tYWluKGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VEb21haW4ocmVzcG9uc2U6IERvbWFpblJlc3BvbnNlRGF0YSk6IERvbWFpbiB7XG4gICAgcmV0dXJuIG5ldyBEb21haW4oXG4gICAgICByZXNwb25zZS5ib2R5LmRvbWFpbixcbiAgICAgIHJlc3BvbnNlLmJvZHkucmVjZWl2aW5nX2Ruc19yZWNvcmRzLFxuICAgICAgcmVzcG9uc2UuYm9keS5zZW5kaW5nX2Ruc19yZWNvcmRzXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVHJhY2tpbmdTZXR0aW5ncyhyZXNwb25zZTogRG9tYWluVHJhY2tpbmdSZXNwb25zZSkgOiBEb21haW5UcmFja2luZ0RhdGEge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5LnRyYWNraW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VUcmFja2luZ1VwZGF0ZShyZXNwb25zZTogVXBkYXRlRG9tYWluVHJhY2tpbmdSZXNwb25zZSkgOlVwZGF0ZWRPcGVuVHJhY2tpbmcge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICB9XG5cbiAgbGlzdChxdWVyeT86IERvbWFpbnNRdWVyeSk6IFByb21pc2U8RG9tYWluW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3YzL2RvbWFpbnMnLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW5MaXN0KHJlcyBhcyBEb21haW5MaXN0UmVzcG9uc2VEYXRhKSk7XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcpIDogUHJvbWlzZTxEb21haW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgL3YzL2RvbWFpbnMvJHtkb21haW59YClcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW4ocmVzIGFzIERvbWFpblJlc3BvbnNlRGF0YSkpO1xuICB9XG5cbiAgY3JlYXRlKGRhdGE6IERvbWFpbkluZm8pIDogUHJvbWlzZTxEb21haW4+IHtcbiAgICBjb25zdCBwb3N0T2JqID0geyAuLi5kYXRhIH07XG4gICAgaWYgKCdmb3JjZV9ka2ltX2F1dGhvcml0eScgaW4gcG9zdE9iaiAmJiB0eXBlb2YgcG9zdE9iai5mb3JjZV9ka2ltX2F1dGhvcml0eSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBwb3N0T2JqLmZvcmNlX2RraW1fYXV0aG9yaXR5ID0gcG9zdE9iai50b1N0cmluZygpID09PSAndHJ1ZScgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCgnL3YzL2RvbWFpbnMnLCBwb3N0T2JqKVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZURvbWFpbihyZXMgYXMgRG9tYWluUmVzcG9uc2VEYXRhKSk7XG4gIH1cblxuICBkZXN0cm95KGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxNZXNzYWdlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgL3YzL2RvbWFpbnMvJHtkb21haW59YClcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VNZXNzYWdlKHJlcyBhcyBEZXN0cm95ZWREb21haW5SZXNwb25zZSkpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbihkb21haW46IHN0cmluZyk6IFByb21pc2U8Q29ubmVjdGlvblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYC92My9kb21haW5zLyR7ZG9tYWlufS9jb25uZWN0aW9uYClcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gcmVzIGFzIENvbm5lY3Rpb25TZXR0aW5nc1Jlc3BvbnNlKVxuICAgICAgLnRoZW4oKHJlczpDb25uZWN0aW9uU2V0dGluZ3NSZXNwb25zZSkgPT4gcmVzLmJvZHkuY29ubmVjdGlvbiBhcyBDb25uZWN0aW9uU2V0dGluZ3MpO1xuICB9XG5cbiAgdXBkYXRlQ29ubmVjdGlvbihkb21haW46IHN0cmluZywgZGF0YTogQ29ubmVjdGlvblNldHRpbmdzKTogUHJvbWlzZTxVcGRhdGVkQ29ubmVjdGlvblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXQoYC92My9kb21haW5zLyR7ZG9tYWlufS9jb25uZWN0aW9uYCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gcmVzIGFzIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3NSZXMpXG4gICAgICAudGhlbigocmVzOlVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3NSZXMpID0+IHJlcy5ib2R5IGFzIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3MpO1xuICB9XG5cbiAgLy8gVHJhY2tpbmdcblxuICBnZXRUcmFja2luZyhkb21haW46IHN0cmluZykgOiBQcm9taXNlPERvbWFpblRyYWNraW5nRGF0YT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAndHJhY2tpbmcnKSlcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlVHJhY2tpbmdTZXR0aW5ncyk7XG4gIH1cblxuICB1cGRhdGVUcmFja2luZyhcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgZGF0YTogT3BlblRyYWNraW5nSW5mbyB8IENsaWNrVHJhY2tpbmdJbmZvIHwgVW5zdWJzY3JpYmVUcmFja2luZ0luZm9cbiAgKTogUHJvbWlzZTxVcGRhdGVkT3BlblRyYWNraW5nPiB7XG4gICAgaWYgKHR5cGVvZiBkYXRhPy5hY3RpdmUgPT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHsgc3RhdHVzOiA0MDAsIHN0YXR1c1RleHQ6ICcnLCBib2R5OiB7IG1lc3NhZ2U6ICdQcm9wZXJ0eSBcImFjdGl2ZVwiIG11c3QgY29udGFpbiBzdHJpbmcgdmFsdWUuJyB9IH0gYXMgQVBJRXJyb3JPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICd0cmFja2luZycsIHR5cGUpLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZVRyYWNraW5nVXBkYXRlKHJlcyBhcyBVcGRhdGVEb21haW5UcmFja2luZ1Jlc3BvbnNlKSk7XG4gIH1cblxuICAvLyBJUHNcblxuICBnZXRJcHMoZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICdpcHMnKSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogQVBJUmVzcG9uc2UpID0+IHJlc3BvbnNlPy5ib2R5Py5pdGVtcyk7XG4gIH1cblxuICBhc3NpZ25JcChkb21haW46IHN0cmluZywgaXA6IHN0cmluZyk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICdpcHMnKSwgeyBpcCB9KTtcbiAgfVxuXG4gIGRlbGV0ZUlwKGRvbWFpbjogc3RyaW5nLCBpcDogc3RyaW5nKTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJywgaXApKTtcbiAgfVxuXG4gIGxpbmtJcFBvb2woZG9tYWluOiBzdHJpbmcsIHBvb2xfaWQ6IHN0cmluZyk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICdpcHMnKSwgeyBwb29sX2lkIH0pO1xuICB9XG5cbiAgdW5saW5rSXBQb2xsKGRvbWFpbjogc3RyaW5nLCByZXBsYWNlbWVudDogUmVwbGFjZW1lbnRGb3JQb29sKTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGxldCBzZWFyY2hQYXJhbXMgPSAnJztcbiAgICBpZiAocmVwbGFjZW1lbnQucG9vbF9pZCAmJiByZXBsYWNlbWVudC5pcCkge1xuICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHsgc3RhdHVzOiA0MDAsIHN0YXR1c1RleHQ6ICcnLCBib2R5OiB7IG1lc3NhZ2U6ICdQbGVhc2Ugc3BlY2lmeSBlaXRoZXIgcG9vbF9pZCBvciBpcCAobm90IGJvdGgpJyB9IH0gYXMgQVBJRXJyb3JPcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VtZW50LnBvb2xfaWQpIHtcbiAgICAgIHNlYXJjaFBhcmFtcyA9IGA/cG9vbF9pZD0ke3JlcGxhY2VtZW50LnBvb2xfaWR9YDtcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VtZW50LmlwKSB7XG4gICAgICBzZWFyY2hQYXJhbXMgPSBgP2lwPSR7cmVwbGFjZW1lbnQuaXB9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICdpcHMnLCAnaXBfcG9vbCcsIHNlYXJjaFBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlREtJTUF1dGhvcml0eShkb21haW46IHN0cmluZywgZGF0YTogREtJTUF1dGhvcml0eUluZm8pOiBQcm9taXNlPFVwZGF0ZWRES0lNQXV0aG9yaXR5PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXQoYC92My9kb21haW5zLyR7ZG9tYWlufS9ka2ltX2F1dGhvcml0eWAsIHt9LCB7IHF1ZXJ5OiBgc2VsZj0ke2RhdGEuc2VsZn1gIH0pXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHJlcylcbiAgICAgIC50aGVuKChyZXMgOiBVcGRhdGVkREtJTUF1dGhvcml0eVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBVcGRhdGVkREtJTUF1dGhvcml0eSk7XG4gIH1cblxuICB1cGRhdGVES0lNU2VsZWN0b3IoZG9tYWluOiBzdHJpbmcsIGRhdGE6IERLSU1TZWxlY3RvckluZm8pOiBQcm9taXNlPFVwZGF0ZWRES0lNU2VsZWN0b3JSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vZGtpbV9zZWxlY3RvcmAsIHt9LCB7IHF1ZXJ5OiBgZGtpbV9zZWxlY3Rvcj0ke2RhdGEuZGtpbVNlbGVjdG9yfWAgfSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gcmVzIGFzIFVwZGF0ZWRES0lNU2VsZWN0b3JSZXNwb25zZSk7XG4gIH1cblxuICB1cGRhdGVXZWJQcmVmaXgoZG9tYWluOiBzdHJpbmcsIGRhdGE6IFdlYlByZWZpeEluZm8pOiBQcm9taXNlPFVwZGF0ZWRXZWJQcmVmaXhSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vd2ViX3ByZWZpeGAsIHt9LCB7IHF1ZXJ5OiBgd2ViX3ByZWZpeD0ke2RhdGEud2ViUHJlZml4fWAgfSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gcmVzIGFzIFVwZGF0ZWRXZWJQcmVmaXhSZXNwb25zZSk7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuaW1wb3J0IHtcbiAgQ3JlYXRlZFVwZGF0ZWREb21haW5DcmVkZW50aWFsc1Jlc3BvbnNlLFxuICBEZWxldGVkRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZSxcbiAgRG9tYWluQ3JlZGVudGlhbHMsXG4gIERvbWFpbkNyZWRlbnRpYWxzTGlzdCxcbiAgRG9tYWluQ3JlZGVudGlhbHNRdWVyeSxcbiAgRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZURhdGEsXG4gIERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0LFxuICBJRG9tYWluQ3JlZGVudGlhbHMsXG4gIFVwZGF0ZURvbWFpbkNyZWRlbnRpYWxzRGF0YVxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluQ3JlZGVudGlhbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21haW5DcmVkZW50aWFsc0NsaWVudCBpbXBsZW1lbnRzIElEb21haW5DcmVkZW50aWFscyB7XG4gIGJhc2VSb3V0ZTogc3RyaW5nO1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuYmFzZVJvdXRlID0gJy92My9kb21haW5zLyc7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZURvbWFpbkNyZWRlbnRpYWxzTGlzdChcbiAgICByZXNwb25zZTogRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZURhdGFcbiAgKTogRG9tYWluQ3JlZGVudGlhbHNMaXN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IHJlc3BvbnNlLmJvZHkuaXRlbXMsXG4gICAgICB0b3RhbENvdW50OiByZXNwb25zZS5ib2R5LnRvdGFsX2NvdW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlTWVzc2FnZVJlc3BvbnNlKFxuICAgIHJlc3BvbnNlOiBDcmVhdGVkVXBkYXRlZERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2VcbiAgKTogRG9tYWluQ3JlZGVudGlhbHNSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UuYm9keS5tZXNzYWdlXG4gICAgfSBhcyBEb21haW5DcmVkZW50aWFsc1Jlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VEZWxldGVkUmVzcG9uc2UoXG4gICAgcmVzcG9uc2U6RGVsZXRlZERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2VcbiAgKTogRG9tYWluQ3JlZGVudGlhbHNSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UuYm9keS5tZXNzYWdlLFxuICAgICAgc3BlYzogcmVzcG9uc2UuYm9keS5zcGVjXG4gICAgfSBhcyBEb21haW5DcmVkZW50aWFsc1Jlc3VsdDtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBsaXN0KGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IERvbWFpbkNyZWRlbnRpYWxzUXVlcnkpOiBQcm9taXNlPERvbWFpbkNyZWRlbnRpYWxzTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy9jcmVkZW50aWFscycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW5DcmVkZW50aWFsc0xpc3QocmVzIGFzIERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2VEYXRhKVxuICAgICAgKTtcbiAgfVxuXG4gIGNyZWF0ZShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBkYXRhOiBEb21haW5DcmVkZW50aWFsc1xuICApOiBQcm9taXNlPERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKGAke3RoaXMuYmFzZVJvdXRlfSR7ZG9tYWlufS9jcmVkZW50aWFsc2AsIGRhdGEpXG4gICAgICAudGhlbigocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VNZXNzYWdlUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICB1cGRhdGUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHNMb2dpbjogc3RyaW5nLFxuICAgIGRhdGE6IFVwZGF0ZURvbWFpbkNyZWRlbnRpYWxzRGF0YVxuICApOiBQcm9taXNlPERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQoYCR7dGhpcy5iYXNlUm91dGV9JHtkb21haW59L2NyZWRlbnRpYWxzLyR7Y3JlZGVudGlhbHNMb2dpbn1gLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlTWVzc2FnZVJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgZGVzdHJveShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBjcmVkZW50aWFsc0xvZ2luOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEb21haW5DcmVkZW50aWFsc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAke3RoaXMuYmFzZVJvdXRlfSR7ZG9tYWlufS9jcmVkZW50aWFscy8ke2NyZWRlbnRpYWxzTG9naW59YClcbiAgICAgIC50aGVuKChyZXM6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZURlbGV0ZWRSZXNwb25zZShyZXMpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHVybGpvaW4gZnJvbSAndXJsLWpvaW4nO1xuaW1wb3J0IEFQSVJlc3BvbnNlIGZyb20gJy4vaW50ZXJmYWNlcy9BcGlSZXNwb25zZSc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5pbXBvcnQge1xuICBEb21haW5UYWdBUElSZXNwb25zZVN0YXRzSXRlbSxcbiAgRG9tYWluVGFnQ291bnRyaWVzQWdncmVnYXRpb24sXG4gIERvbWFpblRhZ0NvdW50cmllc0FQSVJlc3BvbnNlLFxuICBEb21haW5UYWdEZXZpY2VzQWdncmVnYXRpb24sXG4gIERvbWFpblRhZ0RldmljZXNBUElSZXNwb25zZSxcbiAgRG9tYWluVGFnUHJvdmlkZXJzQWdncmVnYXRpb24sXG4gIERvbWFpblRhZ1Byb3ZpZGVyc0FQSVJlc3BvbnNlLFxuICBEb21haW5UYWdzSXRlbSxcbiAgRG9tYWluVGFnc0l0ZW1JbmZvLFxuICBEb21haW5UYWdzTGlzdCxcbiAgRG9tYWluVGFnc01lc3NhZ2VSZXMsXG4gIERvbWFpblRhZ3NRdWVyeSxcbiAgRG9tYWluVGFnc1Jlc3BvbnNlRGF0YSxcbiAgRG9tYWluVGFnc1N0YXRpc3RpY1F1ZXJ5LFxuICBEb21haW5UYWdTdGF0QVBJUmVzcG9uc2UsXG4gIERvbWFpblRhZ1N0YXRpc3RpY0l0ZW0sXG4gIERvbWFpblRhZ1N0YXRpc3RpY1Jlc3VsdCxcbiAgSURvbWFpblRhZ3NDbGllbnQsXG4gIFBhZ2VzTGlzdCxcbiAgUGFnZXNMaXN0QWNjdW11bGF0b3IsXG4gIFBhcnNlZFBhZ2VzTGlzdCxcbiAgUmVzb2x1dGlvblxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluVGFncyc7XG5cbmV4cG9ydCBjbGFzcyBEb21haW5UYWcgaW1wbGVtZW50cyBEb21haW5UYWdzSXRlbSB7XG4gIHRhZzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAnZmlyc3Qtc2Vlbic6IERhdGU7XG4gICdsYXN0LXNlZW4nOiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKHRhZ0luZm86IERvbWFpblRhZ3NJdGVtSW5mbykge1xuICAgIHRoaXMudGFnID0gdGFnSW5mby50YWc7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHRhZ0luZm8uZGVzY3JpcHRpb247XG4gICAgdGhpc1snZmlyc3Qtc2VlbiddID0gbmV3IERhdGUodGFnSW5mb1snZmlyc3Qtc2VlbiddKTtcbiAgICB0aGlzWydsYXN0LXNlZW4nXSA9IG5ldyBEYXRlKHRhZ0luZm9bJ2xhc3Qtc2VlbiddKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9tYWluVGFnU3RhdGlzdGljIGltcGxlbWVudHMgRG9tYWluVGFnU3RhdGlzdGljUmVzdWx0IHtcbiAgdGFnOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHN0YXJ0OiBEYXRlO1xuICBlbmQ6IERhdGU7XG4gIHJlc29sdXRpb246IFJlc29sdXRpb247XG4gIHN0YXRzOiBEb21haW5UYWdTdGF0aXN0aWNJdGVtW107XG5cbiAgY29uc3RydWN0b3IodGFnU3RhdGlzdGljSW5mbzogRG9tYWluVGFnU3RhdEFQSVJlc3BvbnNlKSB7XG4gICAgdGhpcy50YWcgPSB0YWdTdGF0aXN0aWNJbmZvLmJvZHkudGFnO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSB0YWdTdGF0aXN0aWNJbmZvLmJvZHkuZGVzY3JpcHRpb247XG4gICAgdGhpcy5zdGFydCA9IG5ldyBEYXRlKHRhZ1N0YXRpc3RpY0luZm8uYm9keS5zdGFydCk7XG4gICAgdGhpcy5lbmQgPSBuZXcgRGF0ZSh0YWdTdGF0aXN0aWNJbmZvLmJvZHkuZW5kKTtcbiAgICB0aGlzLnJlc29sdXRpb24gPSB0YWdTdGF0aXN0aWNJbmZvLmJvZHkucmVzb2x1dGlvbjtcbiAgICB0aGlzLnN0YXRzID0gdGFnU3RhdGlzdGljSW5mby5ib2R5LnN0YXRzLm1hcChmdW5jdGlvbiAoc3RhdDogRG9tYWluVGFnQVBJUmVzcG9uc2VTdGF0c0l0ZW0pIHtcbiAgICAgIGNvbnN0IHJlcyA9IHsgLi4uc3RhdCwgdGltZTogbmV3IERhdGUoc3RhdC50aW1lKSB9O1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21haW5UYWdzQ2xpZW50IGltcGxlbWVudHMgSURvbWFpblRhZ3NDbGllbnQge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvJztcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlOiBEb21haW5UYWdzUmVzcG9uc2VEYXRhKTogUGFyc2VkUGFnZXNMaXN0IHtcbiAgICBjb25zdCBwYWdlcyA9IE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmJvZHkucGFnaW5nIGFzIFBhZ2VzTGlzdCk7XG4gICAgcmV0dXJuIHBhZ2VzLnJlZHVjZShcbiAgICAgIChhY2M6IFBhZ2VzTGlzdEFjY3VtdWxhdG9yLCBlbnRyaWU6IFt1cmw6IHN0cmluZywgaWQ6IHN0cmluZ10pID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBlbnRyaWVbMF07XG4gICAgICAgIGNvbnN0IHVybCA9IGVudHJpZVsxXTtcbiAgICAgICAgYWNjW2lkXSA9IHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICB1cmxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9XG4gICAgKSBhcyB1bmtub3duIGFzIFBhcnNlZFBhZ2VzTGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRG9tYWluVGFnc0xpc3QoXG4gICAgcmVzcG9uc2U6IERvbWFpblRhZ3NSZXNwb25zZURhdGFcbiAgKTogRG9tYWluVGFnc0xpc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcmVzcG9uc2UuYm9keS5pdGVtcy5tYXAoKHRhZ0luZm8pID0+IG5ldyBEb21haW5UYWcodGFnSW5mbykpLFxuICAgICAgcGFnZXM6IHRoaXMuX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVRhZ1N0YXRpc3RpYyhcbiAgICByZXNwb25zZTogRG9tYWluVGFnU3RhdEFQSVJlc3BvbnNlXG4gICk6IERvbWFpblRhZ1N0YXRpc3RpYyB7XG4gICAgcmV0dXJuIG5ldyBEb21haW5UYWdTdGF0aXN0aWMocmVzcG9uc2UpO1xuICB9XG5cbiAgbGlzdChkb21haW46IHN0cmluZywgcXVlcnk/OiBEb21haW5UYWdzUXVlcnkpOiBQcm9taXNlPERvbWFpblRhZ3NMaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RhZ3MnKSwgcXVlcnkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRG9tYWluVGFnc0xpc3QocmVzIGFzIERvbWFpblRhZ3NSZXNwb25zZURhdGEpXG4gICAgICApO1xuICB9XG5cbiAgZ2V0KGRvbWFpbjogc3RyaW5nLCB0YWc6IHN0cmluZyk6IFByb21pc2U8RG9tYWluVGFnc0l0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZykpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQVBJUmVzcG9uc2UpID0+IG5ldyBEb21haW5UYWcocmVzLmJvZHkpXG4gICAgICApO1xuICB9XG5cbiAgdXBkYXRlKGRvbWFpbjogc3RyaW5nLCB0YWc6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8RG9tYWluVGFnc01lc3NhZ2VSZXM+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZyksIGRlc2NyaXB0aW9uKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IEFQSVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBEb21haW5UYWdzTWVzc2FnZVJlc1xuICAgICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3koXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEb21haW5UYWdzTWVzc2FnZVJlcz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAke3RoaXMuYmFzZVJvdXRlfSR7ZG9tYWlufS90YWdzLyR7dGFnfWApXG4gICAgICAudGhlbigocmVzOiBBUElSZXNwb25zZSkgPT4gKFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogcmVzLmJvZHkubWVzc2FnZSxcbiAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXNcbiAgICAgICAgfSBhcyBEb21haW5UYWdzTWVzc2FnZVJlcykpO1xuICB9XG5cbiAgc3RhdGlzdGljKGRvbWFpbjogc3RyaW5nLCB0YWc6IHN0cmluZywgcXVlcnk6IERvbWFpblRhZ3NTdGF0aXN0aWNRdWVyeSlcbiAgICA6IFByb21pc2U8RG9tYWluVGFnU3RhdGlzdGljPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RhZ3MnLCB0YWcsICdzdGF0cycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VUYWdTdGF0aXN0aWMocmVzKVxuICAgICAgKTtcbiAgfVxuXG4gIGNvdW50cmllcyhkb21haW46IHN0cmluZywgdGFnOiBzdHJpbmcpOiBQcm9taXNlPERvbWFpblRhZ0NvdW50cmllc0FnZ3JlZ2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RhZ3MnLCB0YWcsICdzdGF0cy9hZ2dyZWdhdGVzL2NvdW50cmllcycpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IERvbWFpblRhZ0NvdW50cmllc0FQSVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBEb21haW5UYWdDb3VudHJpZXNBZ2dyZWdhdGlvblxuICAgICAgKTtcbiAgfVxuXG4gIHByb3ZpZGVycyhkb21haW46IHN0cmluZywgdGFnOiBzdHJpbmcpOiBQcm9taXNlPERvbWFpblRhZ1Byb3ZpZGVyc0FnZ3JlZ2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RhZ3MnLCB0YWcsICdzdGF0cy9hZ2dyZWdhdGVzL3Byb3ZpZGVycycpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IERvbWFpblRhZ1Byb3ZpZGVyc0FQSVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBEb21haW5UYWdQcm92aWRlcnNBZ2dyZWdhdGlvblxuICAgICAgKTtcbiAgfVxuXG4gIGRldmljZXMoZG9tYWluOiBzdHJpbmcsIHRhZzogc3RyaW5nKTogUHJvbWlzZTxEb21haW5UYWdEZXZpY2VzQWdncmVnYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZywgJ3N0YXRzL2FnZ3JlZ2F0ZXMvZGV2aWNlcycpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IERvbWFpblRhZ0RldmljZXNBUElSZXNwb25zZSkgPT4gcmVzLmJvZHkgYXMgRG9tYWluVGFnRGV2aWNlc0FnZ3JlZ2F0aW9uXG4gICAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQgQVBJUmVzcG9uc2UgZnJvbSAnLi9pbnRlcmZhY2VzL0FwaVJlc3BvbnNlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmltcG9ydCB7XG4gIENyZWF0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UsXG4gIENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlLFxuICBDcmVhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQsXG4gIERvbWFpblRlbXBsYXRlLCBEb21haW5UZW1wbGF0ZURhdGEsXG4gIERvbWFpblRlbXBsYXRlc1F1ZXJ5LFxuICBEb21haW5UZW1wbGF0ZVVwZGF0ZURhdGEsXG4gIERvbWFpblRlbXBsYXRlVXBkYXRlVmVyc2lvbkRhdGEsXG4gIERvbWFpblRlbXBsYXRlVmVyc2lvbkRhdGEsXG4gIEdldERvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UsXG4gIElEb21haW5UZW1wbGF0ZXNDbGllbnQsXG4gIExpc3REb21haW5UZW1wbGF0ZXNBUElSZXNwb25zZSxcbiAgTGlzdERvbWFpblRlbXBsYXRlc1Jlc3VsdCxcbiAgTGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNBUElSZXNwb25zZSxcbiAgTGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNSZXN1bHQsXG4gIE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlLFxuICBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQsXG4gIE5vdGlmaWNhdGlvbkFQSVJlc3BvbnNlLFxuICBOb3RpZmljYXRpb25SZXN1bHQsXG4gIFNob3J0VGVtcGxhdGVWZXJzaW9uLFxuICBUZW1wbGF0ZVF1ZXJ5LFxuICBUZW1wbGF0ZVZlcnNpb24sXG4gIFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSxcbiAgVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdFxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluVGVtcGxhdGVzJztcblxuZXhwb3J0IGNsYXNzIERvbWFpblRlbXBsYXRlSXRlbSBpbXBsZW1lbnRzIERvbWFpblRlbXBsYXRlIHtcbiAgbmFtZSA6IHN0cmluZztcbiAgZGVzY3JpcHRpb24gOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdCA6IERhdGUgfCAnJztcbiAgY3JlYXRlZEJ5IDogc3RyaW5nO1xuICBpZCA6IHN0cmluZztcbiAgdmVyc2lvbj86IFRlbXBsYXRlVmVyc2lvbjtcbiAgdmVyc2lvbnM/OiBTaG9ydFRlbXBsYXRlVmVyc2lvbltdO1xuXG4gIGNvbnN0cnVjdG9yKGRvbWFpblRlbXBsYXRlRnJvbUFQSTogRG9tYWluVGVtcGxhdGUpIHtcbiAgICB0aGlzLm5hbWUgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkubmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZG9tYWluVGVtcGxhdGVGcm9tQVBJLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZG9tYWluVGVtcGxhdGVGcm9tQVBJLmNyZWF0ZWRBdCA/IG5ldyBEYXRlKGRvbWFpblRlbXBsYXRlRnJvbUFQSS5jcmVhdGVkQXQpIDogJyc7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkuY3JlYXRlZEJ5O1xuICAgIHRoaXMuaWQgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkuaWQ7XG5cbiAgICBpZiAoZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb24pIHtcbiAgICAgIHRoaXMudmVyc2lvbiA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS52ZXJzaW9uO1xuICAgICAgaWYgKGRvbWFpblRlbXBsYXRlRnJvbUFQSS52ZXJzaW9uLmNyZWF0ZWRBdCkge1xuICAgICAgICB0aGlzLnZlcnNpb24uY3JlYXRlZEF0ID0gbmV3IERhdGUoZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb24uY3JlYXRlZEF0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb25zICYmIGRvbWFpblRlbXBsYXRlRnJvbUFQSS52ZXJzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmVyc2lvbnMgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkudmVyc2lvbnMubWFwKCh2ZXJzaW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4udmVyc2lvbiB9O1xuICAgICAgICByZXN1bHQuY3JlYXRlZEF0ID0gbmV3IERhdGUodmVyc2lvbi5jcmVhdGVkQXQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbWFpblRlbXBsYXRlc0NsaWVudCBpbXBsZW1lbnRzIElEb21haW5UZW1wbGF0ZXNDbGllbnQge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvJztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDcmVhdGlvblJlc3BvbnNlKGRhdGE6IENyZWF0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpOiBEb21haW5UZW1wbGF0ZUl0ZW0ge1xuICAgIHJldHVybiBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKGRhdGEuYm9keS50ZW1wbGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ3JlYXRpb25WZXJzaW9uUmVzcG9uc2UoXG4gICAgZGF0YTogQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2VcbiAgKTogQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQ6IENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdCA9IHt9IGFzIENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdDtcbiAgICByZXN1bHQuc3RhdHVzID0gZGF0YS5zdGF0dXM7XG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBkYXRhLmJvZHkubWVzc2FnZTtcbiAgICBpZiAoZGF0YS5ib2R5ICYmIGRhdGEuYm9keS50ZW1wbGF0ZSkge1xuICAgICAgcmVzdWx0LnRlbXBsYXRlID0gbmV3IERvbWFpblRlbXBsYXRlSXRlbShkYXRhLmJvZHkudGVtcGxhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU11dGF0aW9uUmVzcG9uc2UoXG4gICAgZGF0YTogVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZUFQSVJlc3BvbnNlXG4gICk6IFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdCA9IHt9IGFzIFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVSZXN1bHQ7XG4gICAgcmVzdWx0LnN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICAgIHJlc3VsdC5tZXNzYWdlID0gZGF0YS5ib2R5Lm1lc3NhZ2U7XG4gICAgaWYgKGRhdGEuYm9keSAmJiBkYXRhLmJvZHkudGVtcGxhdGUpIHtcbiAgICAgIHJlc3VsdC50ZW1wbGF0ZU5hbWUgPSBkYXRhLmJvZHkudGVtcGxhdGUubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VOb3RpZmljYXRpb25SZXNwb25zZShkYXRhOiBOb3RpZmljYXRpb25BUElSZXNwb25zZSk6IE5vdGlmaWNhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0OiBOb3RpZmljYXRpb25SZXN1bHQgPSB7fSBhcyBOb3RpZmljYXRpb25SZXN1bHQ7XG4gICAgcmVzdWx0LnN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICAgIHJlc3VsdC5tZXNzYWdlID0gZGF0YS5ib2R5Lm1lc3NhZ2U7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VNdXRhdGVUZW1wbGF0ZVZlcnNpb25SZXNwb25zZShcbiAgICBkYXRhOiBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25BUElSZXNwb25zZVxuICApOiBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0ID0ge30gYXMgTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0O1xuICAgIHJlc3VsdC5zdGF0dXMgPSBkYXRhLnN0YXR1cztcbiAgICByZXN1bHQubWVzc2FnZSA9IGRhdGEuYm9keS5tZXNzYWdlO1xuICAgIGlmIChkYXRhLmJvZHkudGVtcGxhdGUpIHtcbiAgICAgIHJlc3VsdC50ZW1wbGF0ZU5hbWUgPSBkYXRhLmJvZHkudGVtcGxhdGUubmFtZTtcbiAgICAgIHJlc3VsdC50ZW1wbGF0ZVZlcnNpb24gPSB7IHRhZzogZGF0YS5ib2R5LnRlbXBsYXRlLnZlcnNpb24udGFnIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTGlzdChyZXNwb25zZTogTGlzdERvbWFpblRlbXBsYXRlc0FQSVJlc3BvbnNlKTogTGlzdERvbWFpblRlbXBsYXRlc1Jlc3VsdCB7XG4gICAgY29uc3QgZGF0YSA9IHt9IGFzIExpc3REb21haW5UZW1wbGF0ZXNSZXN1bHQ7XG5cbiAgICBkYXRhLml0ZW1zID0gcmVzcG9uc2UuYm9keS5pdGVtcy5tYXAoKGQ6IERvbWFpblRlbXBsYXRlKSA9PiBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKGQpKTtcblxuICAgIGRhdGEucGFnZXMgPSByZXNwb25zZS5ib2R5LnBhZ2luZztcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxpc3RUZW1wbGF0ZVZlcnNpb25zKFxuICAgIHJlc3BvbnNlOiBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc0FQSVJlc3BvbnNlXG4gICk6IExpc3REb21haW5UZW1wbGF0ZVZlcnNpb25zUmVzdWx0IHtcbiAgICBjb25zdCBkYXRhID0ge30gYXMgTGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNSZXN1bHQ7XG5cbiAgICBkYXRhLnRlbXBsYXRlID0gbmV3IERvbWFpblRlbXBsYXRlSXRlbShyZXNwb25zZS5ib2R5LnRlbXBsYXRlKTtcblxuICAgIGRhdGEucGFnZXMgPSByZXNwb25zZS5ib2R5LnBhZ2luZztcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgbGlzdChkb21haW46IHN0cmluZywgcXVlcnk/OiBEb21haW5UZW1wbGF0ZXNRdWVyeSk6IFByb21pc2U8TGlzdERvbWFpblRlbXBsYXRlc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMnKSwgcXVlcnkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VMaXN0KHJlcylcbiAgICAgICk7XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcsIHRlbXBsYXRlTmFtZTogc3RyaW5nLCBxdWVyeT86IFRlbXBsYXRlUXVlcnkpOiBQcm9taXNlPERvbWFpblRlbXBsYXRlSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lKSwgcXVlcnkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogR2V0RG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSkgPT4gbmV3IERvbWFpblRlbXBsYXRlSXRlbShyZXMuYm9keS50ZW1wbGF0ZSlcbiAgICAgICk7XG4gIH1cblxuICBjcmVhdGUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluVGVtcGxhdGVEYXRhXG4gICk6IFByb21pc2U8RG9tYWluVGVtcGxhdGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMnKSwgZGF0YSlcbiAgICAgIC50aGVuKChyZXM6IENyZWF0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VDcmVhdGlvblJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgdXBkYXRlKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHRlbXBsYXRlTmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IERvbWFpblRlbXBsYXRlVXBkYXRlRGF0YVxuICApOiBQcm9taXNlPFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSksIGRhdGEpXG4gICAgICAudGhlbigocmVzOiBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VNdXRhdGlvblJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgZGVzdHJveShkb21haW46IHN0cmluZywgdGVtcGxhdGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSkpXG4gICAgICAudGhlbigocmVzOiBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VNdXRhdGlvblJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgZGVzdHJveUFsbChkb21haW46IHN0cmluZyk6IFByb21pc2U8Tm90aWZpY2F0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcycpKVxuICAgICAgLnRoZW4oKHJlczogTm90aWZpY2F0aW9uQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VOb3RpZmljYXRpb25SZXNwb25zZShyZXMpKTtcbiAgfVxuXG4gIGNyZWF0ZVZlcnNpb24oXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluVGVtcGxhdGVWZXJzaW9uRGF0YVxuICApOiBQcm9taXNlPENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSwgJy92ZXJzaW9ucycpLCBkYXRhKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlKSA9PiB0aGlzLnBhcnNlQ3JlYXRpb25WZXJzaW9uUmVzcG9uc2UocmVzKVxuICAgICAgKTtcbiAgfVxuXG4gIGdldFZlcnNpb24oZG9tYWluOiBzdHJpbmcsIHRlbXBsYXRlTmFtZTogc3RyaW5nLCB0YWc6IHN0cmluZyk6IFByb21pc2U8RG9tYWluVGVtcGxhdGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcy8nLCB0ZW1wbGF0ZU5hbWUsICcvdmVyc2lvbnMvJywgdGFnKSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBHZXREb21haW5UZW1wbGF0ZUFQSVJlc3BvbnNlKSA9PiBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKHJlcy5ib2R5LnRlbXBsYXRlKVxuICAgICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVZlcnNpb24oXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluVGVtcGxhdGVVcGRhdGVWZXJzaW9uRGF0YVxuICApOiBQcm9taXNlPE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lLCAnL3ZlcnNpb25zLycsIHRhZyksIGRhdGEpXG4gICAgICAudGhlbihcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgKHJlczogTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VNdXRhdGVUZW1wbGF0ZVZlcnNpb25SZXNwb25zZShyZXMpXG4gICAgICApO1xuICB9XG5cbiAgZGVzdHJveVZlcnNpb24oXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSwgJy92ZXJzaW9ucy8nLCB0YWcpKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgIC50aGVuKChyZXM6IE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlKSA9PiB0aGlzLnBhcnNlTXV0YXRlVGVtcGxhdGVWZXJzaW9uUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICBsaXN0VmVyc2lvbnMoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBEb21haW5UZW1wbGF0ZXNRdWVyeVxuICApOiBQcm9taXNlPExpc3REb21haW5UZW1wbGF0ZVZlcnNpb25zUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcycsIHRlbXBsYXRlTmFtZSwgJy92ZXJzaW9ucycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc0FQSVJlc3BvbnNlKSA9PiB0aGlzLnBhcnNlTGlzdFRlbXBsYXRlVmVyc2lvbnMocmVzKVxuICAgICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQVBJRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXR1czogbnVtYmVyIHwgc3RyaW5nO1xuICBzdGFjazogc3RyaW5nO1xuICBkZXRhaWxzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIHN0YXR1cyxcbiAgICBzdGF0dXNUZXh0LFxuICAgIG1lc3NhZ2UsXG4gICAgYm9keSA9IHt9XG4gIH06IEFQSUVycm9yT3B0aW9ucykge1xuICAgIGNvbnN0IHsgbWVzc2FnZTogYm9keU1lc3NhZ2UsIGVycm9yIH0gPSBib2R5O1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCBlcnJvciB8fCBzdGF0dXNUZXh0O1xuICAgIHRoaXMuZGV0YWlscyA9IGJvZHlNZXNzYWdlO1xuICB9XG59XG4iLCJpbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQge1xuICBFdmVudHNMaXN0LCBFdmVudHNQYWdlLCBFdmVudHNSZXNwb25zZSwgUGFnZXNMaXN0LCBQYWdlc0xpc3RBY2N1bXVsYXRvciwgUGFyc2VkUGFnZXNMaXN0XG59IGZyb20gJy4vaW50ZXJmYWNlcy9FdmVudHMnO1xuXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudENsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBfcGFyc2VQYWdlTnVtYmVyKHVybDogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5zcGxpdCgnLycpLnBvcCgpO1xuICB9XG5cbiAgX3BhcnNlUGFnZShpZDogc3RyaW5nLCB1cmw6IHN0cmluZykgOiBFdmVudHNQYWdlIHtcbiAgICByZXR1cm4geyBpZCwgbnVtYmVyOiB0aGlzLl9wYXJzZVBhZ2VOdW1iZXIodXJsKSwgdXJsIH07XG4gIH1cblxuICBfcGFyc2VQYWdlTGlua3MocmVzcG9uc2U6IEV2ZW50c1Jlc3BvbnNlKSA6IFBhcnNlZFBhZ2VzTGlzdCB7XG4gICAgY29uc3QgcGFnZXMgPSBPYmplY3QuZW50cmllcyhyZXNwb25zZS5ib2R5LnBhZ2luZyBhcyBQYWdlc0xpc3QpO1xuICAgIHJldHVybiBwYWdlcy5yZWR1Y2UoXG4gICAgICAoYWNjOiBQYWdlc0xpc3RBY2N1bXVsYXRvciwgZW50cmllOiBbdXJsOiBzdHJpbmcsIGlkOiBzdHJpbmddKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gZW50cmllWzBdO1xuICAgICAgICBjb25zdCB1cmwgPSBlbnRyaWVbMV07XG4gICAgICAgIGFjY1tpZF0gPSB0aGlzLl9wYXJzZVBhZ2UoaWQsIHVybCk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fVxuICAgICkgYXMgdW5rbm93biBhcyBQYXJzZWRQYWdlc0xpc3Q7XG4gIH1cblxuICBfcGFyc2VFdmVudExpc3QocmVzcG9uc2U6IEV2ZW50c1Jlc3BvbnNlKSA6IEV2ZW50c0xpc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcmVzcG9uc2UuYm9keS5pdGVtcyxcbiAgICAgIHBhZ2VzOiB0aGlzLl9wYXJzZVBhZ2VMaW5rcyhyZXNwb25zZSlcbiAgICB9O1xuICB9XG5cbiAgZ2V0KGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IHsgcGFnZTogc3RyaW5nIH0pIDogUHJvbWlzZTxFdmVudHNMaXN0PiB7XG4gICAgbGV0IHVybDtcbiAgICBjb25zdCBxdWVyeUNvcHkgPSB7IC4uLnF1ZXJ5IH07XG4gICAgaWYgKHF1ZXJ5Q29weSAmJiBxdWVyeUNvcHkucGFnZSkge1xuICAgICAgdXJsID0gdXJsam9pbignL3YzJywgZG9tYWluLCAnZXZlbnRzJywgcXVlcnlDb3B5LnBhZ2UpO1xuICAgICAgZGVsZXRlIHF1ZXJ5Q29weS5wYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSB1cmxqb2luKCcvdjMnLCBkb21haW4sICdldmVudHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsLCBxdWVyeUNvcHkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IEV2ZW50c1Jlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZUV2ZW50TGlzdChyZXNwb25zZSkpO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmltcG9ydCB7IElwUG9vbCwgSXBQb29sTGlzdFJlc3BvbnNlLCBJcFBvb2xVcGRhdGVEYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lwUG9vbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJcFBvb2xzQ2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIGxpc3QocXVlcnk6IGFueSk6IFByb21pc2U8SXBQb29sW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3YxL2lwX3Bvb2xzJywgcXVlcnkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IElwUG9vbExpc3RSZXNwb25zZSkgPT4gdGhpcy5wYXJzZUlwUG9vbHNSZXNwb25zZShyZXNwb25zZSkpO1xuICB9XG5cbiAgY3JlYXRlKGRhdGE6IHsgbmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZywgaXBzPzogc3RyaW5nW10gfSkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCgnL3YxL2lwX3Bvb2xzJywgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiB7IG1lc3NhZ2U6IHN0cmluZywgcG9vbF9pZDogc3RyaW5nIH0gfSkgPT4gcmVzcG9uc2U/LmJvZHkpO1xuICB9XG5cbiAgdXBkYXRlKHBvb2xJZDogc3RyaW5nLCBkYXRhOiBJcFBvb2xVcGRhdGVEYXRhKSA6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wYXRjaFdpdGhGRChgL3YxL2lwX3Bvb2xzLyR7cG9vbElkfWAsIGRhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2U6IHsgYm9keTogYW55IH0pID0+IHJlc3BvbnNlPy5ib2R5KTtcbiAgfVxuXG4gIGRlbGV0ZShwb29sSWQ6IHN0cmluZywgZGF0YTogeyBpZDogc3RyaW5nLCBwb29sX2lkOiBzdHJpbmcgfSkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAvdjEvaXBfcG9vbHMvJHtwb29sSWR9YCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiBhbnkgfSkgPT4gcmVzcG9uc2U/LmJvZHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUlwUG9vbHNSZXNwb25zZShyZXNwb25zZTogeyBib2R5OiBhbnkgfCBhbnkgfSkge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5LmlwX3Bvb2xzO1xuICB9XG59XG4iLCJpbXBvcnQgTWdSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgeyBJcERhdGEsIElwc0xpc3RSZXNwb25zZUJvZHkgfSBmcm9tICcuL2ludGVyZmFjZXMvSXBzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSXBzQ2xpZW50IHtcbiAgcmVxdWVzdDogTWdSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IE1nUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBsaXN0KHF1ZXJ5OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3YzL2lwcycsIHF1ZXJ5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiB7IGJvZHk6IElwc0xpc3RSZXNwb25zZUJvZHkgfSkgPT4gdGhpcy5wYXJzZUlwc1Jlc3BvbnNlKHJlc3BvbnNlKSk7XG4gIH1cblxuICBnZXQoaXA6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAvdjMvaXBzLyR7aXB9YClcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiBJcERhdGEgfSkgPT4gdGhpcy5wYXJzZUlwc1Jlc3BvbnNlKHJlc3BvbnNlKSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSXBzUmVzcG9uc2UocmVzcG9uc2U6IHsgYm9keTogSXBzTGlzdFJlc3BvbnNlQm9keSB8IElwRGF0YSB9KSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG4gIH1cbn1cbiIsImltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQge1xuICBMaXN0c1F1ZXJ5LFxuICBDcmVhdGVVcGRhdGVMaXN0LFxuICBEZXN0cm95ZWRMaXN0LFxuICBNYWlsaW5nTGlzdFxufSBmcm9tICcuL2ludGVyZmFjZXMvbGlzdHMnO1xuaW1wb3J0IHsgSU1haWxMaXN0c01lbWJlcnMgfSBmcm9tICcuL2ludGVyZmFjZXMvbWFpbExpc3RNZW1iZXJzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdHNDbGllbnQge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcbiAgbWVtYmVyczogSU1haWxMaXN0c01lbWJlcnM7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCwgbWVtYmVyczpJTWFpbExpc3RzTWVtYmVycykge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgdGhpcy5iYXNlUm91dGUgPSAnL3YzL2xpc3RzJztcbiAgICB0aGlzLm1lbWJlcnMgPSBtZW1iZXJzO1xuICB9XG5cbiAgbGlzdChxdWVyeT86IExpc3RzUXVlcnkpOiBQcm9taXNlPE1haWxpbmdMaXN0W10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgJHt0aGlzLmJhc2VSb3V0ZX0vcGFnZXNgLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5pdGVtcyBhcyBNYWlsaW5nTGlzdFtdKTtcbiAgfVxuXG4gIGdldChtYWlsTGlzdEFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8TWFpbGluZ0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5saXN0IGFzIE1haWxpbmdMaXN0KTtcbiAgfVxuXG4gIGNyZWF0ZShkYXRhOiBDcmVhdGVVcGRhdGVMaXN0KTogUHJvbWlzZTxNYWlsaW5nTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCh0aGlzLmJhc2VSb3V0ZSwgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5saXN0IGFzIE1haWxpbmdMaXN0KTtcbiAgfVxuXG4gIHVwZGF0ZShtYWlsTGlzdEFkZHJlc3M6IHN0cmluZywgZGF0YTogQ3JlYXRlVXBkYXRlTGlzdCk6IFByb21pc2U8TWFpbGluZ0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9YCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5saXN0IGFzIE1haWxpbmdMaXN0KTtcbiAgfVxuXG4gIGRlc3Ryb3kobWFpbExpc3RBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPERlc3Ryb3llZExpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSBhcyBEZXN0cm95ZWRMaXN0KTtcbiAgfVxufVxuIiwiaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIE1haWxMaXN0TWVtYmVyc1F1ZXJ5LFxuICBJTWFpbExpc3RzTWVtYmVycyxcbiAgQ3JlYXRlVXBkYXRlTWFpbExpc3RNZW1iZXJzLFxuICBNYWlsTGlzdE1lbWJlcixcbiAgTXVsdGlwbGVNZW1iZXJzRGF0YSxcbiAgTXVsdGlwbGVNZW1iZXJzUmVxRGF0YSxcbiAgRGVsZXRlZE1lbWJlcixcbiAgQ3JlYXRlVXBkYXRlTWFpbExpc3RNZW1iZXJzUmVxLFxuICBOZXdNdWx0aXBsZU1lbWJlcnNSZXNwb25zZVxufSBmcm9tICcuL2ludGVyZmFjZXMvbWFpbExpc3RNZW1iZXJzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFpbExpc3RzTWVtYmVycyBpbXBsZW1lbnRzIElNYWlsTGlzdHNNZW1iZXJzIHtcbiAgYmFzZVJvdXRlOiBzdHJpbmc7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgdGhpcy5iYXNlUm91dGUgPSAnL3YzL2xpc3RzJztcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBbmRVcGRhdGVEYXRhKGRhdGE6IENyZWF0ZVVwZGF0ZU1haWxMaXN0TWVtYmVycykge1xuICAgIGNvbnN0IG5ld0RhdGEgPSB7IC4uLmRhdGEgfTtcblxuICAgIGlmICh0eXBlb2YgZGF0YS52YXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgbmV3RGF0YS52YXJzID0gSlNPTi5zdHJpbmdpZnkobmV3RGF0YS52YXJzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEuc3Vic2NyaWJlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBuZXdEYXRhLnN1YnNjcmliZWQgPSBkYXRhLnN1YnNjcmliZWQgPyAneWVzJyA6ICdubyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0RhdGEgYXMgQ3JlYXRlVXBkYXRlTWFpbExpc3RNZW1iZXJzUmVxO1xuICB9XG5cbiAgbGlzdE1lbWJlcnMobWFpbExpc3RBZGRyZXNzOiBzdHJpbmcsIHF1ZXJ5PzogTWFpbExpc3RNZW1iZXJzUXVlcnkpOiBQcm9taXNlPE1haWxMaXN0TWVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnMvcGFnZXNgLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5pdGVtcyBhcyBNYWlsTGlzdE1lbWJlcltdKTtcbiAgfVxuXG4gIGdldE1lbWJlcihtYWlsTGlzdEFkZHJlc3M6IHN0cmluZywgbWFpbExpc3RNZW1iZXJBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPE1haWxMaXN0TWVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS9tZW1iZXJzLyR7bWFpbExpc3RNZW1iZXJBZGRyZXNzfWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkubWVtYmVyIGFzIE1haWxMaXN0TWVtYmVyKTtcbiAgfVxuXG4gIGNyZWF0ZU1lbWJlcihcbiAgICBtYWlsTGlzdEFkZHJlc3M6IHN0cmluZyxcbiAgICBkYXRhOiBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnNcbiAgKTogUHJvbWlzZTxNYWlsTGlzdE1lbWJlcj4ge1xuICAgIGNvbnN0IHJlcURhdGEgPSB0aGlzLmNoZWNrQW5kVXBkYXRlRGF0YShkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS9tZW1iZXJzYCwgcmVxRGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5tZW1iZXIgYXMgTWFpbExpc3RNZW1iZXIpO1xuICB9XG5cbiAgY3JlYXRlTWVtYmVycyhcbiAgICBtYWlsTGlzdEFkZHJlc3M6IHN0cmluZyxcbiAgICBkYXRhOiBNdWx0aXBsZU1lbWJlcnNEYXRhXG4gICk6IFByb21pc2U8TmV3TXVsdGlwbGVNZW1iZXJzUmVzcG9uc2U+IHtcbiAgICBjb25zdCBuZXdEYXRhOiBNdWx0aXBsZU1lbWJlcnNSZXFEYXRhID0ge1xuICAgICAgbWVtYmVyczogQXJyYXkuaXNBcnJheShkYXRhLm1lbWJlcnMpID8gSlNPTi5zdHJpbmdpZnkoZGF0YS5tZW1iZXJzKSA6IGRhdGEubWVtYmVycyxcbiAgICAgIHVwc2VydDogZGF0YS51cHNlcnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc30vbWVtYmVycy5qc29uYCwgbmV3RGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSBhcyBOZXdNdWx0aXBsZU1lbWJlcnNSZXNwb25zZSk7XG4gIH1cblxuICB1cGRhdGVNZW1iZXIoXG4gICAgbWFpbExpc3RBZGRyZXNzOiBzdHJpbmcsXG4gICAgbWFpbExpc3RNZW1iZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgZGF0YTogQ3JlYXRlVXBkYXRlTWFpbExpc3RNZW1iZXJzXG4gICk6IFByb21pc2U8TWFpbExpc3RNZW1iZXI+IHtcbiAgICBjb25zdCByZXFEYXRhID0gdGhpcy5jaGVja0FuZFVwZGF0ZURhdGEoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS9tZW1iZXJzLyR7bWFpbExpc3RNZW1iZXJBZGRyZXNzfWAsIHJlcURhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkubWVtYmVyIGFzIE1haWxMaXN0TWVtYmVyKTtcbiAgfVxuXG4gIGRlc3Ryb3lNZW1iZXIobWFpbExpc3RBZGRyZXNzOiBzdHJpbmcsIG1haWxMaXN0TWVtYmVyQWRkcmVzczogc3RyaW5nKSA6IFByb21pc2U8RGVsZXRlZE1lbWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc30vbWVtYmVycy8ke21haWxMaXN0TWVtYmVyQWRkcmVzc31gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5IGFzIERlbGV0ZWRNZW1iZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZXNzYWdlc0NsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBfcGFyc2VSZXNwb25zZShyZXNwb25zZTogeyBib2R5OiBhbnkgfSkge1xuICAgIGlmIChyZXNwb25zZS5ib2R5KSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjcmVhdGUoZG9tYWluOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgIGlmIChkYXRhLm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgL3YzLyR7ZG9tYWlufS9tZXNzYWdlcy5taW1lYCwgZGF0YSlcbiAgICAgICAgLnRoZW4odGhpcy5fcGFyc2VSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKGAvdjMvJHtkb21haW59L21lc3NhZ2VzYCwgZGF0YSlcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlUmVzcG9uc2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDYW5jZWxlZE11bHRpcGxlVmFsaWRhdGlvbkpvYixcbiAgQ3JlYXRlZE11bHRpcGxlVmFsaWRhdGlvbkpvYixcbiAgSU11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCxcbiAgTXVsdGlwbGVWYWxpZGF0aW9uSm9iLFxuICBNdWx0aXBsZVZhbGlkYXRpb25Kb2JzTGlzdFJlc3VsdFxufVxuICBmcm9tICcuL2ludGVyZmFjZXMvTXVsdGlwbGVWYWxpZGF0aW9uJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCBpbXBsZW1lbnRzIElNdWx0aXBsZVZhbGlkYXRpb25DbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgbGlzdCgpOiBQcm9taXNlPE11bHRpcGxlVmFsaWRhdGlvbkpvYnNMaXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92NC9hZGRyZXNzL3ZhbGlkYXRlL2J1bGsnKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5IGFzIE11bHRpcGxlVmFsaWRhdGlvbkpvYnNMaXN0UmVzdWx0KTtcbiAgfVxuXG4gIGdldChsaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8TXVsdGlwbGVWYWxpZGF0aW9uSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYC92NC9hZGRyZXNzL3ZhbGlkYXRlL2J1bGsvJHtsaXN0SWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSk7XG4gIH1cblxuICBjcmVhdGUobGlzdElkOiBzdHJpbmcsIGZpbGU6IGFueSk6IFByb21pc2U8Q3JlYXRlZE11bHRpcGxlVmFsaWRhdGlvbkpvYj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgL3Y0L2FkZHJlc3MvdmFsaWRhdGUvYnVsay8ke2xpc3RJZH1gLCBmaWxlKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxuXG4gIGRlc3Ryb3kobGlzdElkOiBzdHJpbmcpOiBQcm9taXNlPENhbmNlbGVkTXVsdGlwbGVWYWxpZGF0aW9uSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYC92NC9hZGRyZXNzL3ZhbGlkYXRlL2J1bGsvJHtsaXN0SWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UpO1xuICB9XG59XG4iLCJpbXBvcnQgTm9kZUZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5pbXBvcnQgYmFzZTY0IGZyb20gJ2Jhc2UtNjQnO1xuaW1wb3J0IHVybGpvaW4gZnJvbSAndXJsLWpvaW4nO1xuaW1wb3J0IGt5IGZyb20gJ2t5LXVuaXZlcnNhbCc7XG5pbXBvcnQgQVBJRXJyb3IgZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgUmVxdWVzdE9wdGlvbnMgZnJvbSAnLi9pbnRlcmZhY2VzL1JlcXVlc3RPcHRpb25zJztcbmltcG9ydCBBUElFcnJvck9wdGlvbnMgZnJvbSAnLi9pbnRlcmZhY2VzL0FQSUVycm9yT3B0aW9ucyc7XG5pbXBvcnQgeyBJbnB1dEZvcm1EYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lGb3JtRGF0YSc7XG5pbXBvcnQgQVBJUmVzcG9uc2UgZnJvbSAnLi9pbnRlcmZhY2VzL0FwaVJlc3BvbnNlJztcblxuY29uc3QgaXNTdHJlYW0gPSAoYXR0YWNobWVudDogYW55KSA9PiB0eXBlb2YgYXR0YWNobWVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGF0dGFjaG1lbnQucGlwZSA9PT0gJ2Z1bmN0aW9uJztcblxuZnVuY3Rpb24gaXNOb2RlRm9ybURhdGEoZm9ybURhdGFJbnN0YW5jZTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEpXG4gIDogZm9ybURhdGFJbnN0YW5jZSBpcyBOb2RlRm9ybURhdGEge1xuICByZXR1cm4gKDxOb2RlRm9ybURhdGE+Zm9ybURhdGFJbnN0YW5jZSkuZ2V0SGVhZGVycyAhPT0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCBnZXRBdHRhY2htZW50T3B0aW9ucyA9IChpdGVtOiBhbnkpOiB7XG4gIGZpbGVuYW1lPzogc3RyaW5nLFxuICBjb250ZW50VHlwZT86IHN0cmluZyxcbiAga25vd25MZW5ndGg/OiBudW1iZXJcbn0gPT4ge1xuICBpZiAodHlwZW9mIGl0ZW0gIT09ICdvYmplY3QnIHx8IGlzU3RyZWFtKGl0ZW0pKSByZXR1cm4ge307XG5cbiAgY29uc3Qge1xuICAgIGZpbGVuYW1lLFxuICAgIGNvbnRlbnRUeXBlLFxuICAgIGtub3duTGVuZ3RoXG4gIH0gPSBpdGVtO1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGZpbGVuYW1lID8geyBmaWxlbmFtZSB9IDogeyBmaWxlbmFtZTogJ2ZpbGUnIH0pLFxuICAgIC4uLihjb250ZW50VHlwZSAmJiB7IGNvbnRlbnRUeXBlIH0pLFxuICAgIC4uLihrbm93bkxlbmd0aCAmJiB7IGtub3duTGVuZ3RoIH0pXG4gIH07XG59O1xuXG5jb25zdCBzdHJlYW1Ub1N0cmluZyA9IChzdHJlYW06IGFueSkgPT4ge1xuICBjb25zdCBjaHVua3M6IGFueSA9IFtdO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN0cmVhbS5vbignZGF0YScsIChjaHVuazogYW55KSA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgIHN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0ZjgnKSkpO1xuICB9KTtcbn07XG5cbmNsYXNzIFJlcXVlc3Qge1xuICBwcml2YXRlIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUga2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgdXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgdGltZW91dDogbnVtYmVyO1xuICBwcml2YXRlIGhlYWRlcnM6IGFueTtcbiAgcHJpdmF0ZSBGb3JtRGF0YUNvbnN0cnVjdG9yOiBJbnB1dEZvcm1EYXRhO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLCBmb3JtRGF0YTogSW5wdXRGb3JtRGF0YSkge1xuICAgIHRoaXMudXNlcm5hbWUgPSBvcHRpb25zLnVzZXJuYW1lO1xuICAgIHRoaXMua2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdGhpcy51cmwgPSBvcHRpb25zLnVybCBhcyBzdHJpbmc7XG4gICAgdGhpcy50aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0O1xuICAgIHRoaXMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgICB0aGlzLkZvcm1EYXRhQ29uc3RydWN0b3IgPSBmb3JtRGF0YTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3QobWV0aG9kOiBzdHJpbmcsIHVybDogc3RyaW5nLCBpbnB1dE9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uaW5wdXRPcHRpb25zIH07XG4gICAgY29uc3QgYmFzaWMgPSBiYXNlNjQuZW5jb2RlKGAke3RoaXMudXNlcm5hbWV9OiR7dGhpcy5rZXl9YCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljfWAsXG4gICAgICAuLi50aGlzLmhlYWRlcnMsXG4gICAgICAuLi5vcHRpb25zPy5oZWFkZXJzXG4gICAgfTtcblxuICAgIGRlbGV0ZSBvcHRpb25zPy5oZWFkZXJzO1xuXG4gICAgaWYgKCFoZWFkZXJzWydDb250ZW50LVR5cGUnXSkge1xuICAgICAgLy8gZm9yIGZvcm0tZGF0YSBpdCB3aWxsIGJlIE51bGwgc28gd2UgbmVlZCB0byByZW1vdmUgaXRcbiAgICAgIGRlbGV0ZSBoZWFkZXJzWydDb250ZW50LVR5cGUnXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7IC4uLm9wdGlvbnMgfTtcblxuICAgIGlmIChvcHRpb25zPy5xdWVyeSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvcHRpb25zPy5xdWVyeSkubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zLnNlYXJjaFBhcmFtcyA9IG9wdGlvbnMucXVlcnk7XG4gICAgICBkZWxldGUgcGFyYW1zLnF1ZXJ5O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQga3koXG4gICAgICB1cmxqb2luKHRoaXMudXJsLCB1cmwpLFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IG1ldGhvZC50b0xvY2FsZVVwcGVyQ2FzZSgpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICAgIC4uLnBhcmFtc1xuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoIXJlc3BvbnNlPy5vaykge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3BvbnNlPy5ib2R5ICYmIGlzU3RyZWFtKHJlc3BvbnNlLmJvZHkpXG4gICAgICAgID8gYXdhaXQgc3RyZWFtVG9TdHJpbmcocmVzcG9uc2UuYm9keSlcbiAgICAgICAgOiBhd2FpdCByZXNwb25zZT8uanNvbigpO1xuXG4gICAgICB0aHJvdyBuZXcgQVBJRXJyb3Ioe1xuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlPy5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlPy5zdGF0dXNUZXh0LFxuICAgICAgICBib2R5OiB7IG1lc3NhZ2UgfVxuICAgICAgfSBhcyBBUElFcnJvck9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgIGJvZHk6IGF3YWl0IHJlc3BvbnNlPy5qc29uKCksXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlPy5zdGF0dXNcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHF1ZXJ5KG1ldGhvZDogc3RyaW5nLCB1cmw6IHN0cmluZywgcXVlcnk6IGFueSwgb3B0aW9ucz86IGFueSkgOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXRob2QsIHVybCwgeyBxdWVyeSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIGNvbW1hbmQobWV0aG9kOiBzdHJpbmcsIHVybDogc3RyaW5nLCBkYXRhOiBhbnksIG9wdGlvbnM/OiBhbnkpIDogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWV0aG9kLCB1cmwsIHtcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KHVybDogc3RyaW5nLCBxdWVyeT86IGFueSwgb3B0aW9ucz86IGFueSkgOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoJ2dldCcsIHVybCwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgaGVhZCh1cmw6IHN0cmluZywgcXVlcnk6IGFueSwgb3B0aW9uczogYW55KSA6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnaGVhZCcsIHVybCwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgb3B0aW9ucyh1cmw6IHN0cmluZywgcXVlcnk6IGFueSwgb3B0aW9uczogYW55KSA6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnb3B0aW9ucycsIHVybCwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgcG9zdCh1cmw6IHN0cmluZywgZGF0YTogYW55LCBvcHRpb25zPzogYW55KSA6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdwb3N0JywgdXJsLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIHBvc3RXaXRoRkQodXJsOiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgZGF0YSBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7XG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiBudWxsIH1cbiAgICB9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5jcmVhdGVGb3JtRGF0YShkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdwb3N0JywgdXJsLCBmb3JtRGF0YSwgcGFyYW1zKTtcbiAgfVxuXG4gIHB1dFdpdGhGRCh1cmw6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBkYXRhIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IG51bGwgfVxuICAgIH07XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmNyZWF0ZUZvcm1EYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3B1dCcsIHVybCwgZm9ybURhdGEsIHBhcmFtcyk7XG4gIH1cblxuICBwYXRjaFdpdGhGRCh1cmw6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBkYXRhIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IG51bGwgfVxuICAgIH07XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmNyZWF0ZUZvcm1EYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3BhdGNoJywgdXJsLCBmb3JtRGF0YSwgcGFyYW1zKTtcbiAgfVxuXG4gIGNyZWF0ZUZvcm1EYXRhKGRhdGE6IGFueSk6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhIHtcbiAgICBjb25zdCBmb3JtRGF0YTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEgPSBPYmplY3Qua2V5cyhkYXRhKVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBkYXRhW2tleV07IH0pXG4gICAgICAucmVkdWNlKChmb3JtRGF0YUFjYzogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5cyA9IFsnYXR0YWNobWVudCcsICdpbmxpbmUnLCAnZmlsZSddO1xuICAgICAgICBpZiAoZmlsZUtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHRoaXMuYWRkRmlsZXNUb0ZEKGtleSwgZGF0YVtrZXldLCBmb3JtRGF0YUFjYyk7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ21lc3NhZ2UnKSB7IC8vIG1pbWUgbWVzc2FnZVxuICAgICAgICAgIHRoaXMuYWRkTWltZURhdGFUb0ZEKGtleSwgZGF0YVtrZXldLCBmb3JtRGF0YUFjYyk7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRDb21tb25Qcm9wZXJ0eVRvRkQoa2V5LCBkYXRhW2tleV0sIGZvcm1EYXRhQWNjKTtcbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgfSwgbmV3IHRoaXMuRm9ybURhdGFDb25zdHJ1Y3RvcigpKTtcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cblxuICBwcml2YXRlIGFkZE1pbWVEYXRhVG9GRChcbiAgICBrZXk6IHN0cmluZyxcbiAgICBkYXRhOiBCdWZmZXIgfCBCbG9iLFxuICAgIGZvcm1EYXRhSW5zdGFuY2U6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhXG4gICk6IHZvaWQge1xuICAgIGlmIChpc05vZGVGb3JtRGF0YShmb3JtRGF0YUluc3RhbmNlKSkge1xuICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgICBmb3JtRGF0YUluc3RhbmNlLmFwcGVuZChrZXksIGRhdGEsIHsgZmlsZW5hbWU6ICdNaW1lTWVzc2FnZScgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1EYXRhSW5zdGFuY2UuYXBwZW5kKGtleSwgZGF0YSBhcyBCbG9iLCAnTWltZU1lc3NhZ2UnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEZpbGVzVG9GRChcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55LFxuICAgIGZvcm1EYXRhSW5zdGFuY2U6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGFwcGVuZEZpbGVUb0ZEID0gKFxuICAgICAga2V5OiBzdHJpbmcsXG4gICAgICBvYmo6IGFueSxcbiAgICAgIGZvcm1EYXRhOiBOb2RlRm9ybURhdGEgfCBGb3JtRGF0YVxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgaXNTdHJlYW1EYXRhID0gaXNTdHJlYW0ob2JqKTtcbiAgICAgIGNvbnN0IG9iakRhdGEgPSBpc1N0cmVhbURhdGEgPyBvYmogOiBvYmouZGF0YTtcbiAgICAgIC8vIGdldEF0dGFjaG1lbnRPcHRpb25zIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBvYmogcGFyYW1ldGVyIHRvIHByZXZlbnQgbG9vc2luZyBmaWxlbmFtZVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldEF0dGFjaG1lbnRPcHRpb25zKG9iaik7XG4gICAgICBpZiAoaXNOb2RlRm9ybURhdGEoZm9ybURhdGEpKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9iakRhdGEsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpEYXRhLCBvcHRpb25zLmZpbGVuYW1lKTtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGFwcGVuZEZpbGVUb0ZEKHByb3BlcnR5TmFtZSwgaXRlbSwgZm9ybURhdGFJbnN0YW5jZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kRmlsZVRvRkQocHJvcGVydHlOYW1lLCB2YWx1ZSwgZm9ybURhdGFJbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb21tb25Qcm9wZXJ0eVRvRkQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBmb3JtRGF0YUFjYzogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGFcbiAgKTogdm9pZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgICAgZm9ybURhdGFBY2MuYXBwZW5kKGtleSwgaXRlbSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGZvcm1EYXRhQWNjLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwdXQodXJsOiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdwdXQnLCB1cmwsIGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcGF0Y2godXJsOiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdwYXRjaCcsIHVybCwgZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBkZWxldGUodXJsOiBzdHJpbmcsIGRhdGE/OiBhbnksIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZCgnZGVsZXRlJywgdXJsLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0O1xuIiwiaW1wb3J0IHtcbiAgQ3JlYXRlVXBkYXRlUm91dGVEYXRhLCBEZXN0cm95Um91dGVSZXNwb25zZSwgUm91dGUsIFJvdXRlc0xpc3RRdWVyeSwgVXBkYXRlUm91dGVSZXNwb25zZVxufSBmcm9tICcuL2ludGVyZmFjZXMvcm91dGVzJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlc0NsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBsaXN0KHF1ZXJ5OiBSb3V0ZXNMaXN0UXVlcnkpOiBQcm9taXNlPFJvdXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3YzL3JvdXRlcycsIHF1ZXJ5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lml0ZW1zKTtcbiAgfVxuXG4gIGdldChpZDogc3RyaW5nKTogUHJvbWlzZTxSb3V0ZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAvdjMvcm91dGVzLyR7aWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5yb3V0ZSk7XG4gIH1cblxuICBjcmVhdGUoZGF0YTogQ3JlYXRlVXBkYXRlUm91dGVEYXRhKTogUHJvbWlzZTxSb3V0ZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCgnL3YzL3JvdXRlcycsIGRhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkucm91dGUpO1xuICB9XG5cbiAgdXBkYXRlKGlkOiBzdHJpbmcsIGRhdGE6IENyZWF0ZVVwZGF0ZVJvdXRlRGF0YSk6IFByb21pc2U8VXBkYXRlUm91dGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKGAvdjMvcm91dGVzLyR7aWR9YCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSk7XG4gIH1cblxuICBkZXN0cm95KGlkOiBzdHJpbmcpOiBQcm9taXNlPERlc3Ryb3lSb3V0ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYC92My9yb3V0ZXMvJHtpZH1gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHVybGpvaW4gZnJvbSAndXJsLWpvaW4nO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7IFN0YXRzUXVlcnksIFN0YXRzT3B0aW9ucywgU3RhdCB9IGZyb20gJy4vaW50ZXJmYWNlcy9TdGF0c09wdGlvbnMnO1xuXG5jbGFzcyBTdGF0cyB7XG4gIHN0YXJ0OiBEYXRlO1xuICBlbmQ6IERhdGU7XG4gIHJlc29sdXRpb246IHN0cmluZztcbiAgc3RhdHM6IFN0YXRbXTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTdGF0c09wdGlvbnMpIHtcbiAgICB0aGlzLnN0YXJ0ID0gbmV3IERhdGUoZGF0YS5zdGFydCk7XG4gICAgdGhpcy5lbmQgPSBuZXcgRGF0ZShkYXRhLmVuZCk7XG4gICAgdGhpcy5yZXNvbHV0aW9uID0gZGF0YS5yZXNvbHV0aW9uO1xuICAgIHRoaXMuc3RhdHMgPSBkYXRhLnN0YXRzLm1hcChmdW5jdGlvbiAoc3RhdDogU3RhdCkge1xuICAgICAgY29uc3QgcmVzID0geyAuLi5zdGF0IH07XG4gICAgICByZXMudGltZSA9IG5ldyBEYXRlKHN0YXQudGltZSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRzQ2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVNlYXJjaFBhcmFtcyhxdWVyeTogU3RhdHNRdWVyeSk6IEFycmF5PEFycmF5PHN0cmluZz4+IHtcbiAgICBsZXQgc2VhcmNoUGFyYW1zID0gW107XG4gICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCkge1xuICAgICAgc2VhcmNoUGFyYW1zID0gT2JqZWN0LmVudHJpZXMocXVlcnkpLnJlZHVjZSgoYXJyYXlXaXRoUGFpcnMsIGN1cnJlbnRQYWlyKSA9PiB7XG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGN1cnJlbnRQYWlyO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcmVwZWF0ZWRQcm9wZXJ0eSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gW2tleSwgaXRlbV0pO1xuICAgICAgICAgIHJldHVybiBbLi4uYXJyYXlXaXRoUGFpcnMsIC4uLnJlcGVhdGVkUHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIGFycmF5V2l0aFBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgcmV0dXJuIGFycmF5V2l0aFBhaXJzO1xuICAgICAgfSwgW10pO1xuICAgIH1cblxuICAgIHJldHVybiBzZWFyY2hQYXJhbXM7XG4gIH1cblxuICBfcGFyc2VTdGF0cyhyZXNwb25zZTogeyBib2R5OiBTdGF0c09wdGlvbnMgfSk6IFN0YXRzIHtcbiAgICByZXR1cm4gbmV3IFN0YXRzKHJlc3BvbnNlLmJvZHkpO1xuICB9XG5cbiAgZ2V0RG9tYWluKGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IFN0YXRzUXVlcnkpOiBQcm9taXNlPFN0YXRzPiB7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5wcmVwYXJlU2VhcmNoUGFyYW1zKHF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKCcvdjMnLCBkb21haW4sICdzdGF0cy90b3RhbCcpLCBzZWFyY2hQYXJhbXMpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVN0YXRzKTtcbiAgfVxuXG4gIGdldEFjY291bnQocXVlcnk/OiBTdGF0c1F1ZXJ5KTogUHJvbWlzZTxTdGF0cz4ge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHRoaXMucHJlcGFyZVNlYXJjaFBhcmFtcyhxdWVyeSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92My9zdGF0cy90b3RhbCcsIHNlYXJjaFBhcmFtcylcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlU3RhdHMpO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcblxuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIEJvdW5jZURhdGEsXG4gIENvbXBsYWludERhdGEsXG4gIFVuc3Vic2NyaWJlRGF0YSxcbiAgV2hpdGVMaXN0RGF0YVxufSBmcm9tICcuL2ludGVyZmFjZXMvU3VwcmVzc2lvbnMnO1xuXG5jb25zdCBjcmVhdGVPcHRpb25zID0ge1xuICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxufTtcblxuY2xhc3MgQm91bmNlIHtcbiAgdHlwZTogc3RyaW5nO1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNvZGU6IG51bWJlcjtcbiAgZXJyb3I6IHN0cmluZztcbiAgY3JlYXRlZF9hdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBCb3VuY2VEYXRhKSB7XG4gICAgdGhpcy50eXBlID0gJ2JvdW5jZXMnO1xuICAgIHRoaXMuYWRkcmVzcyA9IGRhdGEuYWRkcmVzcztcbiAgICB0aGlzLmNvZGUgPSArZGF0YS5jb2RlO1xuICAgIHRoaXMuZXJyb3IgPSBkYXRhLmVycm9yO1xuICAgIHRoaXMuY3JlYXRlZF9hdCA9IG5ldyBEYXRlKGRhdGEuY3JlYXRlZF9hdCk7XG4gIH1cbn1cblxuY2xhc3MgQ29tcGxhaW50IHtcbiAgdHlwZTogc3RyaW5nO1xuICBhZGRyZXNzOiBhbnk7XG4gIGNyZWF0ZWRfYXQ6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogQ29tcGxhaW50RGF0YSkge1xuICAgIHRoaXMudHlwZSA9ICdjb21wbGFpbnRzJztcbiAgICB0aGlzLmFkZHJlc3MgPSBkYXRhLmFkZHJlc3M7XG4gICAgdGhpcy5jcmVhdGVkX2F0ID0gbmV3IERhdGUoZGF0YS5jcmVhdGVkX2F0KTtcbiAgfVxufVxuXG5jbGFzcyBVbnN1YnNjcmliZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgYWRkcmVzczogc3RyaW5nO1xuICB0YWdzOiBhbnk7XG4gIGNyZWF0ZWRfYXQ6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogVW5zdWJzY3JpYmVEYXRhKSB7XG4gICAgdGhpcy50eXBlID0gJ3Vuc3Vic2NyaWJlcyc7XG4gICAgdGhpcy5hZGRyZXNzID0gZGF0YS5hZGRyZXNzO1xuICAgIHRoaXMudGFncyA9IGRhdGEudGFncztcbiAgICB0aGlzLmNyZWF0ZWRfYXQgPSBuZXcgRGF0ZShkYXRhLmNyZWF0ZWRfYXQpO1xuICB9XG59XG5cbmNsYXNzIFdoaXRlTGlzdCB7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgcmVhc29uOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBXaGl0ZUxpc3REYXRhKSB7XG4gICAgdGhpcy50eXBlID0gJ3doaXRlbGlzdHMnO1xuICAgIHRoaXMudmFsdWUgPSBkYXRhLnZhbHVlO1xuICAgIHRoaXMucmVhc29uID0gZGF0YS5yZWFzb247XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBuZXcgRGF0ZShkYXRhLmNyZWF0ZWRBdCk7XG4gIH1cbn1cblxudHlwZSBUTW9kZWwgPSB0eXBlb2YgQm91bmNlIHwgdHlwZW9mIENvbXBsYWludCB8IHR5cGVvZiBVbnN1YnNjcmliZSB8IHR5cGVvZiBXaGl0ZUxpc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1cHByZXNzaW9uQ2xpZW50IHtcbiAgcmVxdWVzdDogYW55O1xuICBtb2RlbHM6IHtcbiAgICBib3VuY2VzOiB0eXBlb2YgQm91bmNlO1xuICAgIGNvbXBsYWludHM6IHR5cGVvZiBDb21wbGFpbnQ7XG4gICAgdW5zdWJzY3JpYmVzOiB0eXBlb2YgVW5zdWJzY3JpYmU7XG4gICAgd2hpdGVsaXN0czogdHlwZW9mIFdoaXRlTGlzdDtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLm1vZGVscyA9IHtcbiAgICAgIGJvdW5jZXM6IEJvdW5jZSxcbiAgICAgIGNvbXBsYWludHM6IENvbXBsYWludCxcbiAgICAgIHVuc3Vic2NyaWJlczogVW5zdWJzY3JpYmUsXG4gICAgICB3aGl0ZWxpc3RzOiBXaGl0ZUxpc3QsXG4gICAgfTtcbiAgfVxuXG4gIF9wYXJzZVBhZ2UoaWQ6IHN0cmluZywgcGFnZVVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gdXJsLnBhcnNlKHBhZ2VVcmwsIHRydWUpO1xuICAgIGNvbnN0IHsgcXVlcnkgfSA9IHBhcnNlZFVybDtcblxuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIHBhZ2U6IHF1ZXJ5LnBhZ2UsXG4gICAgICBhZGRyZXNzOiBxdWVyeS5hZGRyZXNzLFxuICAgICAgdXJsOiBwYWdlVXJsXG4gICAgfTtcbiAgfVxuXG4gIF9wYXJzZVBhZ2VMaW5rcyhyZXNwb25zZTogeyBib2R5OiB7IHBhZ2luZzogYW55IH0gfSkge1xuICAgIGNvbnN0IHBhZ2VzID0gT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuYm9keS5wYWdpbmcpO1xuICAgIHJldHVybiBwYWdlcy5yZWR1Y2UoXG4gICAgICAoYWNjOiBhbnksIFtpZCwgcGFnZVVybF06IFtwYWdlVXJsOiBzdHJpbmcsIGlkOiBzdHJpbmddKSA9PiB7XG4gICAgICAgIGFjY1tpZF0gPSB0aGlzLl9wYXJzZVBhZ2UoaWQsIHBhZ2VVcmwpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge31cbiAgICApO1xuICB9XG5cbiAgX3BhcnNlTGlzdChyZXNwb25zZTogeyBib2R5OiB7IGl0ZW1zOiBhbnksIHBhZ2luZzogYW55IH0gfSwgTW9kZWw6IFRNb2RlbCkge1xuICAgIGNvbnN0IGRhdGEgPSB7fSBhcyBhbnk7XG5cbiAgICBkYXRhLml0ZW1zID0gcmVzcG9uc2UuYm9keS5pdGVtcy5tYXAoKGQ6IGFueSkgPT4gbmV3IE1vZGVsKGQpKTtcblxuICAgIGRhdGEucGFnZXMgPSB0aGlzLl9wYXJzZVBhZ2VMaW5rcyhyZXNwb25zZSk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIF9wYXJzZUl0ZW0ocmVzcG9uc2U6IHsgYm9keTogYW55IH0sIE1vZGVsOiBUTW9kZWwpIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsKHJlc3BvbnNlLmJvZHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXaGl0ZUxpc3QoZG9tYWluOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RcbiAgICAgIC5wb3N0V2l0aEZEKHVybGpvaW4oJ3YzJywgZG9tYWluLCAnd2hpdGVsaXN0cycpLCBkYXRhLCBjcmVhdGVPcHRpb25zKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiB7IGJvZHk6IGFueSB9KSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxuXG4gIGxpc3QoZG9tYWluOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgcXVlcnk6IGFueSkge1xuICAgIGNvbnN0IG1vZGVsID0gKHRoaXMubW9kZWxzIGFzIGFueSlbdHlwZV07XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0XG4gICAgICAuZ2V0KHVybGpvaW4oJ3YzJywgZG9tYWluLCB0eXBlKSwgcXVlcnkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IHsgYm9keTogeyBpdGVtczogYW55LCBwYWdpbmc6IGFueSB9IH0pID0+IHRoaXMuX3BhcnNlTGlzdChyZXNwb25zZSwgbW9kZWwpKTtcbiAgfVxuXG4gIGdldChkb21haW46IHN0cmluZywgdHlwZTogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtb2RlbCA9ICh0aGlzLm1vZGVscyBhcyBhbnkpW3R5cGVdO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFxuICAgICAgLmdldCh1cmxqb2luKCd2MycsIGRvbWFpbiwgdHlwZSwgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiBhbnkgfSkgPT4gdGhpcy5fcGFyc2VJdGVtKHJlc3BvbnNlLCBtb2RlbCkpO1xuICB9XG5cbiAgY3JlYXRlKGRvbWFpbjogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgIC8vIHN1cHBvcnRzIGFkZGluZyBtdWx0aXBsZSBzdXBwcmVzc2lvbnMgYnkgZGVmYXVsdFxuICAgIGxldCBwb3N0RGF0YTtcbiAgICBpZiAodHlwZSA9PT0gJ3doaXRlbGlzdHMnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVXaGl0ZUxpc3QoZG9tYWluLCBkYXRhKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHBvc3REYXRhID0gW2RhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0RGF0YSA9IFsuLi5kYXRhXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0XG4gICAgICAucG9zdCh1cmxqb2luKCd2MycsIGRvbWFpbiwgdHlwZSksIEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKSwgY3JlYXRlT3B0aW9ucylcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiBhbnkgfSkgPT4gcmVzcG9uc2UuYm9keSk7XG4gIH1cblxuICBkZXN0cm95KGRvbWFpbjogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGFkZHJlc3M6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RcbiAgICAgIC5kZWxldGUodXJsam9pbigndjMnLCBkb21haW4sIHR5cGUsIGVuY29kZVVSSUNvbXBvbmVudChhZGRyZXNzKSkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IHsgYm9keTogYW55IH0pID0+IHJlc3BvbnNlLmJvZHkpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU3VwcHJlc3Npb25DbGllbnQ7XG4iLCJpbXBvcnQgQVBJUmVzcG9uc2UgZnJvbSAnLi9pbnRlcmZhY2VzL0FwaVJlc3BvbnNlJztcbmltcG9ydCB7IElNdWx0aXBsZVZhbGlkYXRpb25DbGllbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvTXVsdGlwbGVWYWxpZGF0aW9uJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQsIFZhbGlkYXRpb25SZXNwb25zZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9WYWxpZGF0ZSc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0ZUNsaWVudCB7XG4gIHB1YmxpYyBtdWx0aXBsZVZhbGlkYXRpb247XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCwgbXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50OiBJTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLm11bHRpcGxlVmFsaWRhdGlvbiA9IG11bHRpcGxlVmFsaWRhdGlvbkNsaWVudDtcbiAgfVxuXG4gIGdldChhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3Y0L2FkZHJlc3MvdmFsaWRhdGUnLCB7IGFkZHJlc3MgfSlcbiAgICAgIC50aGVuKChyZXNwb25zZSA6IEFQSVJlc3BvbnNlKSA9PiByZXNwb25zZSlcbiAgICAgIC50aGVuKChyZXMgOiBWYWxpZGF0aW9uUmVzcG9uc2UpID0+IHJlcy5ib2R5IGFzIFZhbGlkYXRpb25SZXN1bHQpO1xuICB9XG59XG4iLCJpbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5cbmltcG9ydCB7XG4gIFZhbGlkYXRpb25SZXNwb25zZSxcbiAgV2ViaG9va0xpc3QsXG4gIFdlYmhvb2tSZXNwb25zZSxcbiAgV2ViaG9va3NRdWVyeVxufSBmcm9tICcuL2ludGVyZmFjZXMvV2ViaG9va3MnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuY2xhc3MgV2ViaG9vayB7XG4gIGlkOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIHVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYmhvb2tDbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgX3BhcnNlV2ViaG9va0xpc3QocmVzcG9uc2U6IHsgYm9keTogeyB3ZWJob29rczogV2ViaG9va0xpc3QgfSB9KTogV2ViaG9va0xpc3Qge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5LndlYmhvb2tzO1xuICB9XG5cbiAgX3BhcnNlV2ViaG9va1dpdGhJRChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZXNwb25zZTogV2ViaG9va1Jlc3BvbnNlKTogV2ViaG9vayB7XG4gICAgICBjb25zdCB3ZWJob29rUmVzcG9uc2UgPSByZXNwb25zZT8uYm9keT8ud2ViaG9vaztcbiAgICAgIGxldCB1cmwgPSB3ZWJob29rUmVzcG9uc2U/LnVybDtcbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHVybCA9IHdlYmhvb2tSZXNwb25zZT8udXJscyAmJiB3ZWJob29rUmVzcG9uc2UudXJscy5sZW5ndGggPyB3ZWJob29rUmVzcG9uc2UudXJsc1swXSA6IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFdlYmhvb2soaWQsIHVybCk7XG4gICAgfTtcbiAgfVxuXG4gIF9wYXJzZVdlYmhvb2tUZXN0KHJlc3BvbnNlOiB7IGJvZHk6IHsgY29kZTogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcgfSB9KVxuICA6IHtjb2RlOiBudW1iZXIsIG1lc3NhZ2U6c3RyaW5nfSB7XG4gICAgcmV0dXJuIHsgY29kZTogcmVzcG9uc2UuYm9keS5jb2RlLCBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UgfSBhcyBWYWxpZGF0aW9uUmVzcG9uc2U7XG4gIH1cblxuICBsaXN0KGRvbWFpbjogc3RyaW5nLCBxdWVyeTogV2ViaG9va3NRdWVyeSk6IFByb21pc2U8V2ViaG9va0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJyksIHF1ZXJ5KVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rTGlzdCk7XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFdlYmhvb2s+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJywgaWQpKVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rV2l0aElEKGlkKSk7XG4gIH1cblxuICBjcmVhdGUoZG9tYWluOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0ZXN0ID0gZmFsc2UpOiBQcm9taXNlPFdlYmhvb2sgfCBWYWxpZGF0aW9uUmVzcG9uc2U+IHtcbiAgICBpZiAodGVzdCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICd3ZWJob29rcycsIGlkLCAndGVzdCcpLCB7IHVybCB9KVxuICAgICAgICAudGhlbih0aGlzLl9wYXJzZVdlYmhvb2tUZXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICd3ZWJob29rcycpLCB7IGlkLCB1cmwgfSlcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlV2ViaG9va1dpdGhJRChpZCkpO1xuICB9XG5cbiAgdXBkYXRlKGRvbWFpbjogc3RyaW5nLCBpZDogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFByb21pc2U8V2ViaG9vaz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnd2ViaG9va3MnLCBpZCksIHsgdXJsIH0pXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVdlYmhvb2tXaXRoSUQoaWQpKTtcbiAgfVxuXG4gIGRlc3Ryb3koZG9tYWluOiBzdHJpbmcsIGlkOiBzdHJpbmcpIDogUHJvbWlzZTxXZWJob29rPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICd3ZWJob29rcycsIGlkKSlcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlV2ViaG9va1dpdGhJRChpZCkpO1xuICB9XG59XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL2Jhc2U2NCB2MS4wLjAgYnkgQG1hdGhpYXMgfCBNSVQgbGljZW5zZSAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGVzIGBleHBvcnRzYC5cblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cztcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC5cblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdG1vZHVsZS5leHBvcnRzID09IGZyZWVFeHBvcnRzICYmIG1vZHVsZTtcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCwgZnJvbSBOb2RlLmpzIG9yIEJyb3dzZXJpZmllZCBjb2RlLCBhbmQgdXNlXG5cdC8vIGl0IGFzIGByb290YC5cblx0dmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcblx0aWYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsKSB7XG5cdFx0cm9vdCA9IGZyZWVHbG9iYWw7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHR2YXIgSW52YWxpZENoYXJhY3RlckVycm9yID0gZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdH07XG5cdEludmFsaWRDaGFyYWN0ZXJFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3I7XG5cdEludmFsaWRDaGFyYWN0ZXJFcnJvci5wcm90b3R5cGUubmFtZSA9ICdJbnZhbGlkQ2hhcmFjdGVyRXJyb3InO1xuXG5cdHZhciBlcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcblx0XHQvLyBOb3RlOiB0aGUgZXJyb3IgbWVzc2FnZXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgZmlsZSBtYXRjaCB0aG9zZSB1c2VkIGJ5XG5cdFx0Ly8gdGhlIG5hdGl2ZSBgYXRvYmAvYGJ0b2FgIGltcGxlbWVudGF0aW9uIGluIENocm9taXVtLlxuXHRcdHRocm93IG5ldyBJbnZhbGlkQ2hhcmFjdGVyRXJyb3IobWVzc2FnZSk7XG5cdH07XG5cblx0dmFyIFRBQkxFID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXHQvLyBodHRwOi8vd2hhdHdnLm9yZy9odG1sL2NvbW1vbi1taWNyb3N5bnRheGVzLmh0bWwjc3BhY2UtY2hhcmFjdGVyXG5cdHZhciBSRUdFWF9TUEFDRV9DSEFSQUNURVJTID0gL1tcXHRcXG5cXGZcXHIgXS9nO1xuXG5cdC8vIGBkZWNvZGVgIGlzIGRlc2lnbmVkIHRvIGJlIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBgYXRvYmAgYXMgZGVzY3JpYmVkIGluIHRoZVxuXHQvLyBIVE1MIFN0YW5kYXJkLiBodHRwOi8vd2hhdHdnLm9yZy9odG1sL3dlYmFwcGFwaXMuaHRtbCNkb20td2luZG93YmFzZTY0LWF0b2Jcblx0Ly8gVGhlIG9wdGltaXplZCBiYXNlNjQtZGVjb2RpbmcgYWxnb3JpdGhtIHVzZWQgaXMgYmFzZWQgb24gQGF0a+KAmXMgZXhjZWxsZW50XG5cdC8vIGltcGxlbWVudGF0aW9uLiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9hdGsvMTAyMDM5NlxuXHR2YXIgZGVjb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0XHRpbnB1dCA9IFN0cmluZyhpbnB1dClcblx0XHRcdC5yZXBsYWNlKFJFR0VYX1NQQUNFX0NIQVJBQ1RFUlMsICcnKTtcblx0XHR2YXIgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXHRcdGlmIChsZW5ndGggJSA0ID09IDApIHtcblx0XHRcdGlucHV0ID0gaW5wdXQucmVwbGFjZSgvPT0/JC8sICcnKTtcblx0XHRcdGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0bGVuZ3RoICUgNCA9PSAxIHx8XG5cdFx0XHQvLyBodHRwOi8vd2hhdHdnLm9yZy9DI2FscGhhbnVtZXJpYy1hc2NpaS1jaGFyYWN0ZXJzXG5cdFx0XHQvW14rYS16QS1aMC05L10vLnRlc3QoaW5wdXQpXG5cdFx0KSB7XG5cdFx0XHRlcnJvcihcblx0XHRcdFx0J0ludmFsaWQgY2hhcmFjdGVyOiB0aGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLidcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHZhciBiaXRDb3VudGVyID0gMDtcblx0XHR2YXIgYml0U3RvcmFnZTtcblx0XHR2YXIgYnVmZmVyO1xuXHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHR2YXIgcG9zaXRpb24gPSAtMTtcblx0XHR3aGlsZSAoKytwb3NpdGlvbiA8IGxlbmd0aCkge1xuXHRcdFx0YnVmZmVyID0gVEFCTEUuaW5kZXhPZihpbnB1dC5jaGFyQXQocG9zaXRpb24pKTtcblx0XHRcdGJpdFN0b3JhZ2UgPSBiaXRDb3VudGVyICUgNCA/IGJpdFN0b3JhZ2UgKiA2NCArIGJ1ZmZlciA6IGJ1ZmZlcjtcblx0XHRcdC8vIFVubGVzcyB0aGlzIGlzIHRoZSBmaXJzdCBvZiBhIGdyb3VwIG9mIDQgY2hhcmFjdGVyc+KAplxuXHRcdFx0aWYgKGJpdENvdW50ZXIrKyAlIDQpIHtcblx0XHRcdFx0Ly8g4oCmY29udmVydCB0aGUgZmlyc3QgOCBiaXRzIHRvIGEgc2luZ2xlIEFTQ0lJIGNoYXJhY3Rlci5cblx0XHRcdFx0b3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG5cdFx0XHRcdFx0MHhGRiAmIGJpdFN0b3JhZ2UgPj4gKC0yICogYml0Q291bnRlciAmIDYpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH07XG5cblx0Ly8gYGVuY29kZWAgaXMgZGVzaWduZWQgdG8gYmUgZnVsbHkgY29tcGF0aWJsZSB3aXRoIGBidG9hYCBhcyBkZXNjcmliZWQgaW4gdGhlXG5cdC8vIEhUTUwgU3RhbmRhcmQ6IGh0dHA6Ly93aGF0d2cub3JnL2h0bWwvd2ViYXBwYXBpcy5odG1sI2RvbS13aW5kb3diYXNlNjQtYnRvYVxuXHR2YXIgZW5jb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0XHRpbnB1dCA9IFN0cmluZyhpbnB1dCk7XG5cdFx0aWYgKC9bXlxcMC1cXHhGRl0vLnRlc3QoaW5wdXQpKSB7XG5cdFx0XHQvLyBOb3RlOiBubyBuZWVkIHRvIHNwZWNpYWwtY2FzZSBhc3RyYWwgc3ltYm9scyBoZXJlLCBhcyBzdXJyb2dhdGVzIGFyZVxuXHRcdFx0Ly8gbWF0Y2hlZCwgYW5kIHRoZSBpbnB1dCBpcyBzdXBwb3NlZCB0byBvbmx5IGNvbnRhaW4gQVNDSUkgYW55d2F5LlxuXHRcdFx0ZXJyb3IoXG5cdFx0XHRcdCdUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQgY29udGFpbnMgY2hhcmFjdGVycyBvdXRzaWRlIG9mIHRoZSAnICtcblx0XHRcdFx0J0xhdGluMSByYW5nZS4nXG5cdFx0XHQpO1xuXHRcdH1cblx0XHR2YXIgcGFkZGluZyA9IGlucHV0Lmxlbmd0aCAlIDM7XG5cdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdHZhciBwb3NpdGlvbiA9IC0xO1xuXHRcdHZhciBhO1xuXHRcdHZhciBiO1xuXHRcdHZhciBjO1xuXHRcdHZhciBidWZmZXI7XG5cdFx0Ly8gTWFrZSBzdXJlIGFueSBwYWRkaW5nIGlzIGhhbmRsZWQgb3V0c2lkZSBvZiB0aGUgbG9vcC5cblx0XHR2YXIgbGVuZ3RoID0gaW5wdXQubGVuZ3RoIC0gcGFkZGluZztcblxuXHRcdHdoaWxlICgrK3Bvc2l0aW9uIDwgbGVuZ3RoKSB7XG5cdFx0XHQvLyBSZWFkIHRocmVlIGJ5dGVzLCBpLmUuIDI0IGJpdHMuXG5cdFx0XHRhID0gaW5wdXQuY2hhckNvZGVBdChwb3NpdGlvbikgPDwgMTY7XG5cdFx0XHRiID0gaW5wdXQuY2hhckNvZGVBdCgrK3Bvc2l0aW9uKSA8PCA4O1xuXHRcdFx0YyA9IGlucHV0LmNoYXJDb2RlQXQoKytwb3NpdGlvbik7XG5cdFx0XHRidWZmZXIgPSBhICsgYiArIGM7XG5cdFx0XHQvLyBUdXJuIHRoZSAyNCBiaXRzIGludG8gZm91ciBjaHVua3Mgb2YgNiBiaXRzIGVhY2gsIGFuZCBhcHBlbmQgdGhlXG5cdFx0XHQvLyBtYXRjaGluZyBjaGFyYWN0ZXIgZm9yIGVhY2ggb2YgdGhlbSB0byB0aGUgb3V0cHV0LlxuXHRcdFx0b3V0cHV0ICs9IChcblx0XHRcdFx0VEFCTEUuY2hhckF0KGJ1ZmZlciA+PiAxOCAmIDB4M0YpICtcblx0XHRcdFx0VEFCTEUuY2hhckF0KGJ1ZmZlciA+PiAxMiAmIDB4M0YpICtcblx0XHRcdFx0VEFCTEUuY2hhckF0KGJ1ZmZlciA+PiA2ICYgMHgzRikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyICYgMHgzRilcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHBhZGRpbmcgPT0gMikge1xuXHRcdFx0YSA9IGlucHV0LmNoYXJDb2RlQXQocG9zaXRpb24pIDw8IDg7XG5cdFx0XHRiID0gaW5wdXQuY2hhckNvZGVBdCgrK3Bvc2l0aW9uKTtcblx0XHRcdGJ1ZmZlciA9IGEgKyBiO1xuXHRcdFx0b3V0cHV0ICs9IChcblx0XHRcdFx0VEFCTEUuY2hhckF0KGJ1ZmZlciA+PiAxMCkgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoKGJ1ZmZlciA+PiA0KSAmIDB4M0YpICtcblx0XHRcdFx0VEFCTEUuY2hhckF0KChidWZmZXIgPDwgMikgJiAweDNGKSArXG5cdFx0XHRcdCc9J1xuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKHBhZGRpbmcgPT0gMSkge1xuXHRcdFx0YnVmZmVyID0gaW5wdXQuY2hhckNvZGVBdChwb3NpdGlvbik7XG5cdFx0XHRvdXRwdXQgKz0gKFxuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDIpICtcblx0XHRcdFx0VEFCTEUuY2hhckF0KChidWZmZXIgPDwgNCkgJiAweDNGKSArXG5cdFx0XHRcdCc9PSdcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fTtcblxuXHR2YXIgYmFzZTY0ID0ge1xuXHRcdCdlbmNvZGUnOiBlbmNvZGUsXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQndmVyc2lvbic6ICcxLjAuMCdcblx0fTtcblxuXHQvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBzcGVjaWZpYyBjb25kaXRpb24gcGF0dGVybnNcblx0Ly8gbGlrZSB0aGUgZm9sbG93aW5nOlxuXHRpZiAoXG5cdFx0dHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiZcblx0XHRkZWZpbmUuYW1kXG5cdCkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBiYXNlNjQ7XG5cdFx0fSk7XG5cdH1cdGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmICFmcmVlRXhwb3J0cy5ub2RlVHlwZSkge1xuXHRcdGlmIChmcmVlTW9kdWxlKSB7IC8vIGluIE5vZGUuanMgb3IgUmluZ29KUyB2MC44LjArXG5cdFx0XHRmcmVlTW9kdWxlLmV4cG9ydHMgPSBiYXNlNjQ7XG5cdFx0fSBlbHNlIHsgLy8gaW4gTmFyd2hhbCBvciBSaW5nb0pTIHYwLjcuMC1cblx0XHRcdGZvciAodmFyIGtleSBpbiBiYXNlNjQpIHtcblx0XHRcdFx0YmFzZTY0Lmhhc093blByb3BlcnR5KGtleSkgJiYgKGZyZWVFeHBvcnRzW2tleV0gPSBiYXNlNjRba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgeyAvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5iYXNlNjQgPSBiYXNlNjQ7XG5cdH1cblxufSh0aGlzKSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogUmV0dXJucyBhIGBCdWZmZXJgIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGRhdGEgVVJJIGB1cmlgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgRGF0YSBVUkkgdG8gdHVybiBpbnRvIGEgQnVmZmVyIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IEJ1ZmZlciBpbnN0YW5jZSBmcm9tIERhdGEgVVJJXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBkYXRhVXJpVG9CdWZmZXIodXJpKSB7XG4gICAgaWYgKCEvXmRhdGE6L2kudGVzdCh1cmkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2B1cmlgIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIERhdGEgVVJJIChtdXN0IGJlZ2luIHdpdGggXCJkYXRhOlwiKScpO1xuICAgIH1cbiAgICAvLyBzdHJpcCBuZXdsaW5lc1xuICAgIHVyaSA9IHVyaS5yZXBsYWNlKC9cXHI/XFxuL2csICcnKTtcbiAgICAvLyBzcGxpdCB0aGUgVVJJIHVwIGludG8gdGhlIFwibWV0YWRhdGFcIiBhbmQgdGhlIFwiZGF0YVwiIHBvcnRpb25zXG4gICAgY29uc3QgZmlyc3RDb21tYSA9IHVyaS5pbmRleE9mKCcsJyk7XG4gICAgaWYgKGZpcnN0Q29tbWEgPT09IC0xIHx8IGZpcnN0Q29tbWEgPD0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxmb3JtZWQgZGF0YTogVVJJJyk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSB0aGUgXCJkYXRhOlwiIHNjaGVtZSBhbmQgcGFyc2UgdGhlIG1ldGFkYXRhXG4gICAgY29uc3QgbWV0YSA9IHVyaS5zdWJzdHJpbmcoNSwgZmlyc3RDb21tYSkuc3BsaXQoJzsnKTtcbiAgICBsZXQgY2hhcnNldCA9ICcnO1xuICAgIGxldCBiYXNlNjQgPSBmYWxzZTtcbiAgICBjb25zdCB0eXBlID0gbWV0YVswXSB8fCAndGV4dC9wbGFpbic7XG4gICAgbGV0IHR5cGVGdWxsID0gdHlwZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1ldGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG1ldGFbaV0gPT09ICdiYXNlNjQnKSB7XG4gICAgICAgICAgICBiYXNlNjQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHlwZUZ1bGwgKz0gYDske21ldGFbaV19YDtcbiAgICAgICAgICAgIGlmIChtZXRhW2ldLmluZGV4T2YoJ2NoYXJzZXQ9JykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gbWV0YVtpXS5zdWJzdHJpbmcoOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZGVmYXVsdHMgdG8gVVMtQVNDSUkgb25seSBpZiB0eXBlIGlzIG5vdCBwcm92aWRlZFxuICAgIGlmICghbWV0YVswXSAmJiAhY2hhcnNldC5sZW5ndGgpIHtcbiAgICAgICAgdHlwZUZ1bGwgKz0gJztjaGFyc2V0PVVTLUFTQ0lJJztcbiAgICAgICAgY2hhcnNldCA9ICdVUy1BU0NJSSc7XG4gICAgfVxuICAgIC8vIGdldCB0aGUgZW5jb2RlZCBkYXRhIHBvcnRpb24gYW5kIGRlY29kZSBVUkktZW5jb2RlZCBjaGFyc1xuICAgIGNvbnN0IGVuY29kaW5nID0gYmFzZTY0ID8gJ2Jhc2U2NCcgOiAnYXNjaWknO1xuICAgIGNvbnN0IGRhdGEgPSB1bmVzY2FwZSh1cmkuc3Vic3RyaW5nKGZpcnN0Q29tbWEgKyAxKSk7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSwgZW5jb2RpbmcpO1xuICAgIC8vIHNldCBgLnR5cGVgIGFuZCBgLnR5cGVGdWxsYCBwcm9wZXJ0aWVzIHRvIE1JTUUgdHlwZVxuICAgIGJ1ZmZlci50eXBlID0gdHlwZTtcbiAgICBidWZmZXIudHlwZUZ1bGwgPSB0eXBlRnVsbDtcbiAgICAvLyBzZXQgdGhlIGAuY2hhcnNldGAgcHJvcGVydHlcbiAgICBidWZmZXIuY2hhcnNldCA9IGNoYXJzZXQ7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZGF0YVVyaVRvQnVmZmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hIDxodHRwczovL2dpdGh1Yi5jb20vbXlzdGljYXRlYT5cbiAqIEBjb3B5cmlnaHQgMjAxNSBUb3J1IE5hZ2FzaGltYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBkaXJlY3RvcnkgZm9yIGZ1bGwgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaXZhdGVEYXRhXG4gKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHt7dHlwZTpzdHJpbmd9fSBldmVudCBUaGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGV2ZW50UGhhc2UgVGhlIGN1cnJlbnQgZXZlbnQgcGhhc2UuXG4gKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fG51bGx9IGN1cnJlbnRUYXJnZXQgVGhlIGN1cnJlbnQgZXZlbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBjYW5jZWxlZCBUaGUgZmxhZyB0byBwcmV2ZW50IGRlZmF1bHQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0b3BwZWQgVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW1tZWRpYXRlU3RvcHBlZCBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uIGltbWVkaWF0ZWx5LlxuICogQHByb3BlcnR5IHtGdW5jdGlvbnxudWxsfSBwYXNzaXZlTGlzdGVuZXIgVGhlIGxpc3RlbmVyIGlmIHRoZSBjdXJyZW50IGxpc3RlbmVyIGlzIHBhc3NpdmUuIE90aGVyd2lzZSB0aGlzIGlzIG51bGwuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZVN0YW1wIFRoZSB1bml4IHRpbWUuXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogUHJpdmF0ZSBkYXRhIGZvciBldmVudCB3cmFwcGVycy5cbiAqIEB0eXBlIHtXZWFrTWFwPEV2ZW50LCBQcml2YXRlRGF0YT59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBwcml2YXRlRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2FjaGUgZm9yIHdyYXBwZXIgY2xhc3Nlcy5cbiAqIEB0eXBlIHtXZWFrTWFwPE9iamVjdCwgRnVuY3Rpb24+fVxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd3JhcHBlcnMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEdldCBwcml2YXRlIGRhdGEuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgb2JqZWN0IHRvIGdldCBwcml2YXRlIGRhdGEuXG4gKiBAcmV0dXJucyB7UHJpdmF0ZURhdGF9IFRoZSBwcml2YXRlIGRhdGEgb2YgdGhlIGV2ZW50LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcGQoZXZlbnQpIHtcbiAgICBjb25zdCByZXR2ID0gcHJpdmF0ZURhdGEuZ2V0KGV2ZW50KTtcbiAgICBjb25zb2xlLmFzc2VydChcbiAgICAgICAgcmV0diAhPSBudWxsLFxuICAgICAgICBcIid0aGlzJyBpcyBleHBlY3RlZCBhbiBFdmVudCBvYmplY3QsIGJ1dCBnb3RcIixcbiAgICAgICAgZXZlbnRcbiAgICApO1xuICAgIHJldHVybiByZXR2XG59XG5cbi8qKlxuICogaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNzZXQtdGhlLWNhbmNlbGVkLWZsYWdcbiAqIEBwYXJhbSBkYXRhIHtQcml2YXRlRGF0YX0gcHJpdmF0ZSBkYXRhLlxuICovXG5mdW5jdGlvbiBzZXRDYW5jZWxGbGFnKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5wYXNzaXZlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJVbmFibGUgdG8gcHJldmVudERlZmF1bHQgaW5zaWRlIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXIgaW52b2NhdGlvbi5cIixcbiAgICAgICAgICAgICAgICBkYXRhLnBhc3NpdmVMaXN0ZW5lclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFkYXRhLmV2ZW50LmNhbmNlbGFibGUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGF0YS5jYW5jZWxlZCA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnByZXZlbnREZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZGF0YS5ldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLWV2ZW50XG4gKiBAcHJpdmF0ZVxuICovXG4vKipcbiAqIFRoZSBldmVudCB3cmFwcGVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IG9mIHRoaXMgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge0V2ZW50fHt0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudCB0byB3cmFwLlxuICovXG5mdW5jdGlvbiBFdmVudChldmVudFRhcmdldCwgZXZlbnQpIHtcbiAgICBwcml2YXRlRGF0YS5zZXQodGhpcywge1xuICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGV2ZW50UGhhc2U6IDIsXG4gICAgICAgIGN1cnJlbnRUYXJnZXQ6IGV2ZW50VGFyZ2V0LFxuICAgICAgICBjYW5jZWxlZDogZmFsc2UsXG4gICAgICAgIHN0b3BwZWQ6IGZhbHNlLFxuICAgICAgICBpbW1lZGlhdGVTdG9wcGVkOiBmYWxzZSxcbiAgICAgICAgcGFzc2l2ZUxpc3RlbmVyOiBudWxsLFxuICAgICAgICB0aW1lU3RhbXA6IGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpLFxuICAgIH0pO1xuXG4gICAgLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jVW5mb3JnZWFibGVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc1RydXN0ZWRcIiwgeyB2YWx1ZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAvLyBEZWZpbmUgYWNjZXNzb3JzXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFNob3VsZCBiZSBlbnVtZXJhYmxlLCBidXQgY2xhc3MgbWV0aG9kcyBhcmUgbm90IGVudW1lcmFibGUuXG5FdmVudC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnQudHlwZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fVxuICAgICAqL1xuICAgIGdldCB0YXJnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFRhcmdldFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fVxuICAgICAqL1xuICAgIGdldCBjdXJyZW50VGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuY3VycmVudFRhcmdldFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRUYXJnZXRbXX0gVGhlIGNvbXBvc2VkIHBhdGggb2YgdGhpcyBldmVudC5cbiAgICAgKi9cbiAgICBjb21wb3NlZFBhdGgoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBwZCh0aGlzKS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICBpZiAoY3VycmVudFRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2N1cnJlbnRUYXJnZXRdXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IG9mIE5PTkUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgTk9ORSgpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgQ0FQVFVSSU5HX1BIQVNFLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IENBUFRVUklOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgQVRfVEFSR0VULlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IEFUX1RBUkdFVCgpIHtcbiAgICAgICAgcmV0dXJuIDJcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgQlVCQkxJTkdfUEhBU0UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQlVCQkxJTkdfUEhBU0UoKSB7XG4gICAgICAgIHJldHVybiAzXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBldmVudFBoYXNlKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRQaGFzZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIGV2ZW50IGJ1YmJsaW5nLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHBkKHRoaXMpO1xuXG4gICAgICAgIGRhdGEuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudC5zdG9wUHJvcGFnYXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIGV2ZW50IGJ1YmJsaW5nLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHBkKHRoaXMpO1xuXG4gICAgICAgIGRhdGEuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGRhdGEuaW1tZWRpYXRlU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBidWJibGluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgYnViYmxlcygpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuYnViYmxlcylcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gYmUgY2FuY2VsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgY2FuY2VsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuY2FuY2VsYWJsZSlcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIHRoaXMgZXZlbnQuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHNldENhbmNlbEZsYWcocGQodGhpcykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBpbmRpY2F0ZSBjYW5jZWxsYXRpb24gc3RhdGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRQcmV2ZW50ZWQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5jYW5jZWxlZFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBjb21wb3NlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgY29tcG9zZWQoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBkKHRoaXMpLmV2ZW50LmNvbXBvc2VkKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdW5peCB0aW1lIG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdGltZVN0YW1wKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykudGltZVN0YW1wXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXQgc3JjRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIHN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXQgY2FuY2VsQnViYmxlKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuc3RvcHBlZFxuICAgIH0sXG4gICAgc2V0IGNhbmNlbEJ1YmJsZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LmNhbmNlbEJ1YmJsZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGRhdGEuZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBpbmRpY2F0ZSBjYW5jZWxsYXRpb24gc3RhdGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXQgcmV0dXJuVmFsdWUoKSB7XG4gICAgICAgIHJldHVybiAhcGQodGhpcykuY2FuY2VsZWRcbiAgICB9LFxuICAgIHNldCByZXR1cm5WYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICBzZXRDYW5jZWxGbGFnKHBkKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoaXMgZXZlbnQgb2JqZWN0LiBCdXQgZG8gbm90aGluZyB1bmRlciBldmVudCBkaXNwYXRjaGluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtidWJibGVzPWZhbHNlXSBUaGUgZmxhZyB0byBiZSBwb3NzaWJsZSB0byBidWJibGUgdXAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2FuY2VsYWJsZT1mYWxzZV0gVGhlIGZsYWcgdG8gYmUgcG9zc2libGUgdG8gY2FuY2VsLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5pdEV2ZW50KCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH0sXG59O1xuXG4vLyBgY29uc3RydWN0b3JgIGlzIG5vdCBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LnByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEV2ZW50LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbn0pO1xuXG4vLyBFbnN1cmUgYGV2ZW50IGluc3RhbmNlb2Ygd2luZG93LkV2ZW50YCBpcyBgdHJ1ZWAuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LkV2ZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEV2ZW50LnByb3RvdHlwZSwgd2luZG93LkV2ZW50LnByb3RvdHlwZSk7XG5cbiAgICAvLyBNYWtlIGFzc29jaWF0aW9uIGZvciB3cmFwcGVycy5cbiAgICB3cmFwcGVycy5zZXQod2luZG93LkV2ZW50LnByb3RvdHlwZSwgRXZlbnQpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byByZWRpcmVjdCBhIGdpdmVuIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBQcm9wZXJ0eSBuYW1lIHRvIGRlZmluZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1Byb3BlcnR5RGVzY3JpcHRvcn0gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gcmVkaXJlY3QgdGhlIHByb3BlcnR5LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVkaXJlY3REZXNjcmlwdG9yKGtleSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFtrZXldXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgcGQodGhpcykuZXZlbnRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byBjYWxsIGEgZ2l2ZW4gbWV0aG9kIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBQcm9wZXJ0eSBuYW1lIHRvIGRlZmluZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1Byb3BlcnR5RGVzY3JpcHRvcn0gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gY2FsbCB0aGUgbWV0aG9kIHByb3BlcnR5LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ2FsbERlc2NyaXB0b3Ioa2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUoKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHBkKHRoaXMpLmV2ZW50O1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50W2tleV0uYXBwbHkoZXZlbnQsIGFyZ3VtZW50cylcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIH1cbn1cblxuLyoqXG4gKiBEZWZpbmUgbmV3IHdyYXBwZXIgY2xhc3MuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBCYXNlRXZlbnQgVGhlIGJhc2Ugd3JhcHBlciBjbGFzcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgcHJvdG90eXBlIG9mIHRoZSBvcmlnaW5hbCBldmVudC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIGRlZmluZWQgd3JhcHBlciBjbGFzcy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZVdyYXBwZXIoQmFzZUV2ZW50LCBwcm90bykge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm90byk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCYXNlRXZlbnRcbiAgICB9XG5cbiAgICAvKiogQ3VzdG9tRXZlbnQgKi9cbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudFRhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgQmFzZUV2ZW50LmNhbGwodGhpcywgZXZlbnRUYXJnZXQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IEN1c3RvbUV2ZW50LCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0sXG4gICAgfSk7XG5cbiAgICAvLyBEZWZpbmUgYWNjZXNzb3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBpZiAoIShrZXkgaW4gQmFzZUV2ZW50LnByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgaXNGdW5jID0gdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBDdXN0b21FdmVudC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIGlzRnVuY1xuICAgICAgICAgICAgICAgICAgICA/IGRlZmluZUNhbGxEZXNjcmlwdG9yKGtleSlcbiAgICAgICAgICAgICAgICAgICAgOiBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21FdmVudFxufVxuXG4vKipcbiAqIEdldCB0aGUgd3JhcHBlciBjbGFzcyBvZiBhIGdpdmVuIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgcHJvdG90eXBlIG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBnZXQgaXRzIHdyYXBwZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSB3cmFwcGVyIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0V3JhcHBlcihwcm90bykge1xuICAgIGlmIChwcm90byA9PSBudWxsIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHJldHVybiBFdmVudFxuICAgIH1cblxuICAgIGxldCB3cmFwcGVyID0gd3JhcHBlcnMuZ2V0KHByb3RvKTtcbiAgICBpZiAod3JhcHBlciA9PSBudWxsKSB7XG4gICAgICAgIHdyYXBwZXIgPSBkZWZpbmVXcmFwcGVyKGdldFdyYXBwZXIoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSksIHByb3RvKTtcbiAgICAgICAgd3JhcHBlcnMuc2V0KHByb3RvLCB3cmFwcGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZXJcbn1cblxuLyoqXG4gKiBXcmFwIGEgZ2l2ZW4gZXZlbnQgdG8gbWFuYWdlbWVudCBhIGRpc3BhdGNoaW5nLlxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgVGhlIGV2ZW50IHRhcmdldCBvZiB0aGlzIGRpc3BhdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFRoZSBldmVudCB0byB3cmFwLlxuICogQHJldHVybnMge0V2ZW50fSBUaGUgd3JhcHBlciBpbnN0YW5jZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHdyYXBFdmVudChldmVudFRhcmdldCwgZXZlbnQpIHtcbiAgICBjb25zdCBXcmFwcGVyID0gZ2V0V3JhcHBlcihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXZlbnQpKTtcbiAgICByZXR1cm4gbmV3IFdyYXBwZXIoZXZlbnRUYXJnZXQsIGV2ZW50KVxufVxuXG4vKipcbiAqIEdldCB0aGUgaW1tZWRpYXRlU3RvcHBlZCBmbGFnIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gZ2V0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24gaW1tZWRpYXRlbHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc1N0b3BwZWQoZXZlbnQpIHtcbiAgICByZXR1cm4gcGQoZXZlbnQpLmltbWVkaWF0ZVN0b3BwZWRcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgZXZlbnQgcGhhc2Ugb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBzZXQgY3VycmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge251bWJlcn0gZXZlbnRQaGFzZSBOZXcgZXZlbnQgcGhhc2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldEV2ZW50UGhhc2UoZXZlbnQsIGV2ZW50UGhhc2UpIHtcbiAgICBwZChldmVudCkuZXZlbnRQaGFzZSA9IGV2ZW50UGhhc2U7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IHRhcmdldCBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8bnVsbH0gY3VycmVudFRhcmdldCBOZXcgY3VycmVudCB0YXJnZXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldEN1cnJlbnRUYXJnZXQoZXZlbnQsIGN1cnJlbnRUYXJnZXQpIHtcbiAgICBwZChldmVudCkuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG59XG5cbi8qKlxuICogU2V0IGEgcGFzc2l2ZSBsaXN0ZW5lciBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gcGFzc2l2ZUxpc3RlbmVyIE5ldyBwYXNzaXZlIGxpc3RlbmVyLlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRQYXNzaXZlTGlzdGVuZXIoZXZlbnQsIHBhc3NpdmVMaXN0ZW5lcikge1xuICAgIHBkKGV2ZW50KS5wYXNzaXZlTGlzdGVuZXIgPSBwYXNzaXZlTGlzdGVuZXI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTGlzdGVuZXJOb2RlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogQHByb3BlcnR5IHsxfDJ8M30gbGlzdGVuZXJUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhc3NpdmVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb25jZVxuICogQHByb3BlcnR5IHtMaXN0ZW5lck5vZGV8bnVsbH0gbmV4dFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgTGlzdGVuZXJOb2RlPj59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBsaXN0ZW5lcnNNYXAgPSBuZXcgV2Vha01hcCgpO1xuXG4vLyBMaXN0ZW5lciB0eXBlc1xuY29uc3QgQ0FQVFVSRSA9IDE7XG5jb25zdCBCVUJCTEUgPSAyO1xuY29uc3QgQVRUUklCVVRFID0gMztcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0IG9yIG5vdC5cbiAqIEBwYXJhbSB7YW55fSB4IFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiIC8vZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxufVxuXG4vKipcbiAqIEdldCBsaXN0ZW5lcnMuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IHRvIGdldC5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBMaXN0ZW5lck5vZGU+fSBUaGUgbGlzdGVuZXJzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0TGlzdGVuZXJzKGV2ZW50VGFyZ2V0KSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdGVuZXJzTWFwLmdldChldmVudFRhcmdldCk7XG4gICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBcIid0aGlzJyBpcyBleHBlY3RlZCBhbiBFdmVudFRhcmdldCBvYmplY3QsIGJ1dCBnb3QgYW5vdGhlciB2YWx1ZS5cIlxuICAgICAgICApXG4gICAgfVxuICAgIHJldHVybiBsaXN0ZW5lcnNcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBldmVudCBhdHRyaWJ1dGUgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gZ2V0IHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUV2ZW50QXR0cmlidXRlRGVzY3JpcHRvcihldmVudE5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5saXN0ZW5lclR5cGUgPT09IEFUVFJJQlVURSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5saXN0ZW5lclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIiAmJiAhaXNPYmplY3QobGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG5cbiAgICAgICAgICAgIC8vIFRyYXZlcnNlIHRvIHRoZSB0YWlsIHdoaWxlIHJlbW92aW5nIG9sZCB2YWx1ZS5cbiAgICAgICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RlbmVyVHlwZSA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBvbGQgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbm9kZS5uZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBuZXcgdmFsdWUuXG4gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdOb2RlID0ge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJUeXBlOiBBVFRSSUJVVEUsXG4gICAgICAgICAgICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBvbmNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBuZXdOb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIH1cbn1cblxuLyoqXG4gKiBEZWZpbmUgYW4gZXZlbnQgYXR0cmlidXRlIChlLmcuIGBldmVudFRhcmdldC5vbmNsaWNrYCkuXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnRUYXJnZXRQcm90b3R5cGUgVGhlIGV2ZW50IHRhcmdldCBwcm90b3R5cGUgdG8gZGVmaW5lIGFuIGV2ZW50IGF0dHJiaXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBkZWZpbmUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGUoZXZlbnRUYXJnZXRQcm90b3R5cGUsIGV2ZW50TmFtZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgZXZlbnRUYXJnZXRQcm90b3R5cGUsXG4gICAgICAgIGBvbiR7ZXZlbnROYW1lfWAsXG4gICAgICAgIGRlZmluZUV2ZW50QXR0cmlidXRlRGVzY3JpcHRvcihldmVudE5hbWUpXG4gICAgKTtcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBjdXN0b20gRXZlbnRUYXJnZXQgd2l0aCBldmVudCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXZlbnROYW1lcyBFdmVudCBuYW1lcyBmb3IgZXZlbnQgYXR0cmlidXRlcy5cbiAqIEByZXR1cm5zIHtFdmVudFRhcmdldH0gVGhlIGN1c3RvbSBFdmVudFRhcmdldC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KGV2ZW50TmFtZXMpIHtcbiAgICAvKiogQ3VzdG9tRXZlbnRUYXJnZXQgKi9cbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudFRhcmdldCgpIHtcbiAgICAgICAgRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBDdXN0b21FdmVudFRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgICAgdmFsdWU6IEN1c3RvbUV2ZW50VGFyZ2V0LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGVmaW5lRXZlbnRBdHRyaWJ1dGUoQ3VzdG9tRXZlbnRUYXJnZXQucHJvdG90eXBlLCBldmVudE5hbWVzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tRXZlbnRUYXJnZXRcbn1cblxuLyoqXG4gKiBFdmVudFRhcmdldC5cbiAqXG4gKiAtIFRoaXMgaXMgY29uc3RydWN0b3IgaWYgbm8gYXJndW1lbnRzLlxuICogLSBUaGlzIGlzIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIEN1c3RvbUV2ZW50VGFyZ2V0IGNvbnN0cnVjdG9yIGlmIHRoZXJlIGFyZSBhcmd1bWVudHMuXG4gKlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIGNsYXNzIEEgZXh0ZW5kcyBFdmVudFRhcmdldCB7fVxuICogICAgIGNsYXNzIEIgZXh0ZW5kcyBFdmVudFRhcmdldChcIm1lc3NhZ2VcIikge31cbiAqICAgICBjbGFzcyBDIGV4dGVuZHMgRXZlbnRUYXJnZXQoXCJtZXNzYWdlXCIsIFwiZXJyb3JcIikge31cbiAqICAgICBjbGFzcyBEIGV4dGVuZHMgRXZlbnRUYXJnZXQoW1wibWVzc2FnZVwiLCBcImVycm9yXCJdKSB7fVxuICovXG5mdW5jdGlvbiBFdmVudFRhcmdldCgpIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBFdmVudFRhcmdldCkge1xuICAgICAgICBsaXN0ZW5lcnNNYXAuc2V0KHRoaXMsIG5ldyBNYXAoKSk7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KGFyZ3VtZW50c1swXSlcbiAgICB9XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHR5cGVzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdHlwZXNbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KHR5cGVzKVxuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpXG4gICAgLyplc2xpbnQtZW5hYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG59XG5cbi8vIFNob3VsZCBiZSBlbnVtZXJhYmxlLCBidXQgY2xhc3MgbWV0aG9kcyBhcmUgbm90IGVudW1lcmFibGUuXG5FdmVudFRhcmdldC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQWRkIGEgZ2l2ZW4gbGlzdGVuZXIgdG8gdGhpcyBldmVudCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBhZGQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58e2NhcHR1cmU/OmJvb2xlYW4scGFzc2l2ZT86Ym9vbGVhbixvbmNlPzpib29sZWFufX0gW29wdGlvbnNdIFRoZSBvcHRpb25zIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmICFpc09iamVjdChsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCInbGlzdGVuZXInIHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdC5cIilcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0lzT2JqID0gaXNPYmplY3Qob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBvcHRpb25zSXNPYmpcbiAgICAgICAgICAgID8gQm9vbGVhbihvcHRpb25zLmNhcHR1cmUpXG4gICAgICAgICAgICA6IEJvb2xlYW4ob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyVHlwZSA9IGNhcHR1cmUgPyBDQVBUVVJFIDogQlVCQkxFO1xuICAgICAgICBjb25zdCBuZXdOb2RlID0ge1xuICAgICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgICBsaXN0ZW5lclR5cGUsXG4gICAgICAgICAgICBwYXNzaXZlOiBvcHRpb25zSXNPYmogJiYgQm9vbGVhbihvcHRpb25zLnBhc3NpdmUpLFxuICAgICAgICAgICAgb25jZTogb3B0aW9uc0lzT2JqICYmIEJvb2xlYW4ob3B0aW9ucy5vbmNlKSxcbiAgICAgICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0IGl0IGFzIHRoZSBmaXJzdCBub2RlIGlmIHRoZSBmaXJzdCBub2RlIGlzIG51bGwuXG4gICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbmV3Tm9kZSk7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYXZlcnNlIHRvIHRoZSB0YWlsIHdoaWxlIGNoZWNraW5nIGR1cGxpY2F0aW9uLi5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lciA9PT0gbGlzdGVuZXIgJiZcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyVHlwZSA9PT0gbGlzdGVuZXJUeXBlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBTaG91bGQgaWdub3JlIGR1cGxpY2F0aW9uLlxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGl0LlxuICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoaXMgZXZlbnQgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufHtjYXB0dXJlPzpib29sZWFuLHBhc3NpdmU/OmJvb2xlYW4sb25jZT86Ym9vbGVhbn19IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBjYXB0dXJlID0gaXNPYmplY3Qob3B0aW9ucylcbiAgICAgICAgICAgID8gQm9vbGVhbihvcHRpb25zLmNhcHR1cmUpXG4gICAgICAgICAgICA6IEJvb2xlYW4ob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyVHlwZSA9IGNhcHR1cmUgPyBDQVBUVVJFIDogQlVCQkxFO1xuXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyID09PSBsaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlID09PSBsaXN0ZW5lclR5cGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbm9kZS5uZXh0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBnaXZlbiBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fHt0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYGZhbHNlYCBpZiBjYW5jZWxlZC5cbiAgICAgKi9cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCA9PSBudWxsIHx8IHR5cGVvZiBldmVudC50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImV2ZW50LnR5cGVcIiBzaG91bGQgYmUgYSBzdHJpbmcuJylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGxpc3RlbmVycyBhcmVuJ3QgcmVnaXN0ZXJlZCwgdGVybWluYXRlLlxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGV2ZW50LnR5cGU7XG4gICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2luY2Ugd2UgY2Fubm90IHJld3JpdGUgc2V2ZXJhbCBwcm9wZXJ0aWVzLCBzbyB3cmFwIG9iamVjdC5cbiAgICAgICAgY29uc3Qgd3JhcHBlZEV2ZW50ID0gd3JhcEV2ZW50KHRoaXMsIGV2ZW50KTtcblxuICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgcHJvY2VzcyBjYXB0dXJpbmcgcGhhc2UgYW5kIGJ1YmJsaW5nIHBoYXNlLlxuICAgICAgICAvLyBUaGlzIGlzbid0IHBhcnRpY2lwYXRpbmcgaW4gYSB0cmVlLlxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGxpc3RlbmVyIGlmIGl0J3Mgb25jZVxuICAgICAgICAgICAgaWYgKG5vZGUub25jZSkge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbm9kZS5uZXh0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsbCB0aGlzIGxpc3RlbmVyXG4gICAgICAgICAgICBzZXRQYXNzaXZlTGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgd3JhcHBlZEV2ZW50LFxuICAgICAgICAgICAgICAgIG5vZGUucGFzc2l2ZSA/IG5vZGUubGlzdGVuZXIgOiBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmxpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmNhbGwodGhpcywgd3JhcHBlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlICE9PSBBVFRSSUJVVEUgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygbm9kZS5saXN0ZW5lci5oYW5kbGVFdmVudCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50KHdyYXBwZWRFdmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJyZWFrIGlmIGBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25gIHdhcyBjYWxsZWQuXG4gICAgICAgICAgICBpZiAoaXNTdG9wcGVkKHdyYXBwZWRFdmVudCkpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHNldFBhc3NpdmVMaXN0ZW5lcih3cmFwcGVkRXZlbnQsIG51bGwpO1xuICAgICAgICBzZXRFdmVudFBoYXNlKHdyYXBwZWRFdmVudCwgMCk7XG4gICAgICAgIHNldEN1cnJlbnRUYXJnZXQod3JhcHBlZEV2ZW50LCBudWxsKTtcblxuICAgICAgICByZXR1cm4gIXdyYXBwZWRFdmVudC5kZWZhdWx0UHJldmVudGVkXG4gICAgfSxcbn07XG5cbi8vIGBjb25zdHJ1Y3RvcmAgaXMgbm90IGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRUYXJnZXQucHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogRXZlbnRUYXJnZXQsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxufSk7XG5cbi8vIEVuc3VyZSBgZXZlbnRUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRUYXJnZXRgIGlzIGB0cnVlYC5cbmlmIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgdHlwZW9mIHdpbmRvdy5FdmVudFRhcmdldCAhPT0gXCJ1bmRlZmluZWRcIlxuKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgd2luZG93LkV2ZW50VGFyZ2V0LnByb3RvdHlwZSk7XG59XG5cbmV4cG9ydHMuZGVmaW5lRXZlbnRBdHRyaWJ1dGUgPSBkZWZpbmVFdmVudEF0dHJpYnV0ZTtcbmV4cG9ydHMuRXZlbnRUYXJnZXQgPSBFdmVudFRhcmdldDtcbmV4cG9ydHMuZGVmYXVsdCA9IEV2ZW50VGFyZ2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50VGFyZ2V0XG5tb2R1bGUuZXhwb3J0cy5FdmVudFRhcmdldCA9IG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEV2ZW50VGFyZ2V0XG5tb2R1bGUuZXhwb3J0cy5kZWZpbmVFdmVudEF0dHJpYnV0ZSA9IGRlZmluZUV2ZW50QXR0cmlidXRlXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ldmVudC10YXJnZXQtc2hpbS5qcy5tYXBcbiIsImNvbnN0IHtSZWFkYWJsZX0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxCbG9iLCB7dHlwZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHBhcnRzOiAoQmxvYiB8IEJ1ZmZlcilbXSB9Pn1cbiAqL1xuY29uc3Qgd20gPSBuZXcgV2Vha01hcCgpO1xuXG5hc3luYyBmdW5jdGlvbiAqIHJlYWQocGFydHMpIHtcblx0Zm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG5cdFx0aWYgKCdzdHJlYW0nIGluIHBhcnQpIHtcblx0XHRcdHlpZWxkICogcGFydC5zdHJlYW0oKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0eWllbGQgcGFydDtcblx0XHR9XG5cdH1cbn1cblxuY2xhc3MgQmxvYiB7XG5cdC8qKlxuXHQgKiBUaGUgQmxvYigpIGNvbnN0cnVjdG9yIHJldHVybnMgYSBuZXcgQmxvYiBvYmplY3QuIFRoZSBjb250ZW50XG5cdCAqIG9mIHRoZSBibG9iIGNvbnNpc3RzIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB2YWx1ZXMgZ2l2ZW5cblx0ICogaW4gdGhlIHBhcmFtZXRlciBhcnJheS5cblx0ICpcblx0ICogQHBhcmFtIHsoQXJyYXlCdWZmZXJMaWtlIHwgQXJyYXlCdWZmZXJWaWV3IHwgQmxvYiB8IEJ1ZmZlciB8IHN0cmluZylbXX0gYmxvYlBhcnRzXG5cdCAqIEBwYXJhbSB7eyB0eXBlPzogc3RyaW5nIH19IFtvcHRpb25zXVxuXHQgKi9cblx0Y29uc3RydWN0b3IoYmxvYlBhcnRzID0gW10sIG9wdGlvbnMgPSB7fSkge1xuXHRcdGxldCBzaXplID0gMDtcblxuXHRcdGNvbnN0IHBhcnRzID0gYmxvYlBhcnRzLm1hcChlbGVtZW50ID0+IHtcblx0XHRcdGxldCBidWZmZXI7XG5cdFx0XHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuXHRcdFx0XHRidWZmZXIgPSBlbGVtZW50O1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZWxlbWVudCkpIHtcblx0XHRcdFx0YnVmZmVyID0gQnVmZmVyLmZyb20oZWxlbWVudC5idWZmZXIsIGVsZW1lbnQuYnl0ZU9mZnNldCwgZWxlbWVudC5ieXRlTGVuZ3RoKTtcblx0XHRcdH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGVsZW1lbnQpO1xuXHRcdFx0fSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQmxvYikge1xuXHRcdFx0XHRidWZmZXIgPSBlbGVtZW50O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVmZmVyID0gQnVmZmVyLmZyb20odHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnID8gZWxlbWVudCA6IFN0cmluZyhlbGVtZW50KSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2V4cGxpY2l0LWxlbmd0aC1jaGVja1xuXHRcdFx0c2l6ZSArPSBidWZmZXIubGVuZ3RoIHx8IGJ1ZmZlci5zaXplIHx8IDA7XG5cdFx0XHRyZXR1cm4gYnVmZmVyO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdHlwZSA9IG9wdGlvbnMudHlwZSA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcob3B0aW9ucy50eXBlKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0d20uc2V0KHRoaXMsIHtcblx0XHRcdHR5cGU6IC9bXlxcdTAwMjAtXFx1MDA3RV0vLnRlc3QodHlwZSkgPyAnJyA6IHR5cGUsXG5cdFx0XHRzaXplLFxuXHRcdFx0cGFydHNcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgQmxvYiBpbnRlcmZhY2UncyBzaXplIHByb3BlcnR5IHJldHVybnMgdGhlXG5cdCAqIHNpemUgb2YgdGhlIEJsb2IgaW4gYnl0ZXMuXG5cdCAqL1xuXHRnZXQgc2l6ZSgpIHtcblx0XHRyZXR1cm4gd20uZ2V0KHRoaXMpLnNpemU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHR5cGUgcHJvcGVydHkgb2YgYSBCbG9iIG9iamVjdCByZXR1cm5zIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRnZXQgdHlwZSgpIHtcblx0XHRyZXR1cm4gd20uZ2V0KHRoaXMpLnR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRleHQoKSBtZXRob2QgaW4gdGhlIEJsb2IgaW50ZXJmYWNlIHJldHVybnMgYSBQcm9taXNlXG5cdCAqIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZlxuXHQgKiB0aGUgYmxvYiwgaW50ZXJwcmV0ZWQgYXMgVVRGLTguXG5cdCAqXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn1cblx0ICovXG5cdGFzeW5jIHRleHQoKSB7XG5cdFx0cmV0dXJuIEJ1ZmZlci5mcm9tKGF3YWl0IHRoaXMuYXJyYXlCdWZmZXIoKSkudG9TdHJpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYXJyYXlCdWZmZXIoKSBtZXRob2QgaW4gdGhlIEJsb2IgaW50ZXJmYWNlIHJldHVybnMgYVxuXHQgKiBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGJsb2IgYXNcblx0ICogYmluYXJ5IGRhdGEgY29udGFpbmVkIGluIGFuIEFycmF5QnVmZmVyLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5QnVmZmVyPn1cblx0ICovXG5cdGFzeW5jIGFycmF5QnVmZmVyKCkge1xuXHRcdGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLnNpemUpO1xuXHRcdGxldCBvZmZzZXQgPSAwO1xuXHRcdGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgdGhpcy5zdHJlYW0oKSkge1xuXHRcdFx0ZGF0YS5zZXQoY2h1bmssIG9mZnNldCk7XG5cdFx0XHRvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhLmJ1ZmZlcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgQmxvYiBpbnRlcmZhY2UncyBzdHJlYW0oKSBtZXRob2QgaXMgZGlmZmVyZW5jZSBmcm9tIG5hdGl2ZVxuXHQgKiBhbmQgdXNlcyBub2RlIHN0cmVhbXMgaW5zdGVhZCBvZiB3aGF0d2cgc3RyZWFtcy5cblx0ICpcblx0ICogQHJldHVybnMge1JlYWRhYmxlfSBOb2RlIHJlYWRhYmxlIHN0cmVhbVxuXHQgKi9cblx0c3RyZWFtKCkge1xuXHRcdHJldHVybiBSZWFkYWJsZS5mcm9tKHJlYWQod20uZ2V0KHRoaXMpLnBhcnRzKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJsb2IgaW50ZXJmYWNlJ3Mgc2xpY2UoKSBtZXRob2QgY3JlYXRlcyBhbmQgcmV0dXJucyBhXG5cdCAqIG5ldyBCbG9iIG9iamVjdCB3aGljaCBjb250YWlucyBkYXRhIGZyb20gYSBzdWJzZXQgb2YgdGhlXG5cdCAqIGJsb2Igb24gd2hpY2ggaXQncyBjYWxsZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRdXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kXVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3R5cGVdXG5cdCAqL1xuXHRzbGljZShzdGFydCA9IDAsIGVuZCA9IHRoaXMuc2l6ZSwgdHlwZSA9ICcnKSB7XG5cdFx0Y29uc3Qge3NpemV9ID0gdGhpcztcblxuXHRcdGxldCByZWxhdGl2ZVN0YXJ0ID0gc3RhcnQgPCAwID8gTWF0aC5tYXgoc2l6ZSArIHN0YXJ0LCAwKSA6IE1hdGgubWluKHN0YXJ0LCBzaXplKTtcblx0XHRsZXQgcmVsYXRpdmVFbmQgPSBlbmQgPCAwID8gTWF0aC5tYXgoc2l6ZSArIGVuZCwgMCkgOiBNYXRoLm1pbihlbmQsIHNpemUpO1xuXG5cdFx0Y29uc3Qgc3BhbiA9IE1hdGgubWF4KHJlbGF0aXZlRW5kIC0gcmVsYXRpdmVTdGFydCwgMCk7XG5cdFx0Y29uc3QgcGFydHMgPSB3bS5nZXQodGhpcykucGFydHMudmFsdWVzKCk7XG5cdFx0Y29uc3QgYmxvYlBhcnRzID0gW107XG5cdFx0bGV0IGFkZGVkID0gMDtcblxuXHRcdGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuXHRcdFx0Y29uc3Qgc2l6ZSA9IEFycmF5QnVmZmVyLmlzVmlldyhwYXJ0KSA/IHBhcnQuYnl0ZUxlbmd0aCA6IHBhcnQuc2l6ZTtcblx0XHRcdGlmIChyZWxhdGl2ZVN0YXJ0ICYmIHNpemUgPD0gcmVsYXRpdmVTdGFydCkge1xuXHRcdFx0XHQvLyBTa2lwIHRoZSBiZWdpbm5pbmcgYW5kIGNoYW5nZSB0aGUgcmVsYXRpdmVcblx0XHRcdFx0Ly8gc3RhcnQgJiBlbmQgcG9zaXRpb24gYXMgd2Ugc2tpcCB0aGUgdW53YW50ZWQgcGFydHNcblx0XHRcdFx0cmVsYXRpdmVTdGFydCAtPSBzaXplO1xuXHRcdFx0XHRyZWxhdGl2ZUVuZCAtPSBzaXplO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgY2h1bmsgPSBwYXJ0LnNsaWNlKHJlbGF0aXZlU3RhcnQsIE1hdGgubWluKHNpemUsIHJlbGF0aXZlRW5kKSk7XG5cdFx0XHRcdGJsb2JQYXJ0cy5wdXNoKGNodW5rKTtcblx0XHRcdFx0YWRkZWQgKz0gQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSA/IGNodW5rLmJ5dGVMZW5ndGggOiBjaHVuay5zaXplO1xuXHRcdFx0XHRyZWxhdGl2ZVN0YXJ0ID0gMDsgLy8gQWxsIG5leHQgc2VxdWVudGFsIHBhcnRzIHNob3VsZCBzdGFydCBhdCAwXG5cblx0XHRcdFx0Ly8gZG9uJ3QgYWRkIHRoZSBvdmVyZmxvdyB0byBuZXcgYmxvYlBhcnRzXG5cdFx0XHRcdGlmIChhZGRlZCA+PSBzcGFuKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBibG9iID0gbmV3IEJsb2IoW10sIHt0eXBlOiBTdHJpbmcodHlwZSkudG9Mb3dlckNhc2UoKX0pO1xuXHRcdE9iamVjdC5hc3NpZ24od20uZ2V0KGJsb2IpLCB7c2l6ZTogc3BhbiwgcGFydHM6IGJsb2JQYXJ0c30pO1xuXG5cdFx0cmV0dXJuIGJsb2I7XG5cdH1cblxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG5cdFx0cmV0dXJuICdCbG9iJztcblx0fVxuXG5cdHN0YXRpYyBbU3ltYm9sLmhhc0luc3RhbmNlXShvYmplY3QpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0b2JqZWN0ICYmXG5cdFx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdFx0dHlwZW9mIG9iamVjdC5zdHJlYW0gPT09ICdmdW5jdGlvbicgJiZcblx0XHRcdG9iamVjdC5zdHJlYW0ubGVuZ3RoID09PSAwICYmXG5cdFx0XHR0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nICYmXG5cdFx0XHQvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSlcblx0XHQpO1xuXHR9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJsb2IucHJvdG90eXBlLCB7XG5cdHNpemU6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0dHlwZToge2VudW1lcmFibGU6IHRydWV9LFxuXHRzbGljZToge2VudW1lcmFibGU6IHRydWV9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCbG9iO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgZmV0Y2ggPSByZXF1aXJlKCdub2RlLWZldGNoJyk7XG5jb25zdCBBYm9ydENvbnRyb2xsZXIgPSByZXF1aXJlKCdhYm9ydC1jb250cm9sbGVyJyk7XG5cbmNvbnN0IFRFTl9NRUdBQllURVMgPSAxMDAwICogMTAwMCAqIDEwO1xuXG5pZiAoIWdsb2JhbC5mZXRjaCkge1xuXHRnbG9iYWwuZmV0Y2ggPSAodXJsLCBvcHRpb25zKSA9PiBmZXRjaCh1cmwsIHtoaWdoV2F0ZXJNYXJrOiBURU5fTUVHQUJZVEVTLCAuLi5vcHRpb25zfSk7XG59XG5cbmlmICghZ2xvYmFsLkhlYWRlcnMpIHtcblx0Z2xvYmFsLkhlYWRlcnMgPSBmZXRjaC5IZWFkZXJzO1xufVxuXG5pZiAoIWdsb2JhbC5SZXF1ZXN0KSB7XG5cdGdsb2JhbC5SZXF1ZXN0ID0gZmV0Y2guUmVxdWVzdDtcbn1cblxuaWYgKCFnbG9iYWwuUmVzcG9uc2UpIHtcblx0Z2xvYmFsLlJlc3BvbnNlID0gZmV0Y2guUmVzcG9uc2U7XG59XG5cbmlmICghZ2xvYmFsLkFib3J0Q29udHJvbGxlcikge1xuXHRnbG9iYWwuQWJvcnRDb250cm9sbGVyID0gQWJvcnRDb250cm9sbGVyO1xufVxuXG5pZiAoIWdsb2JhbC5SZWFkYWJsZVN0cmVhbSkge1xuXHR0cnkge1xuXHRcdGdsb2JhbC5SZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3dlYi1zdHJlYW1zLXBvbHlmaWxsL3BvbnlmaWxsL2VzMjAxOCcpO1xuXHR9IGNhdGNoIChfKSB7fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2t5L3VtZCcpO1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuXHQoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwua3kgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cblx0LyohIE1JVCBMaWNlbnNlIMKpIFNpbmRyZSBTb3JodXMgKi9cblxuXHRjb25zdCBnbG9iYWxzID0ge307XG5cblx0Y29uc3QgZ2V0R2xvYmFsID0gcHJvcGVydHkgPT4ge1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdFx0aWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmICYmIHByb3BlcnR5IGluIHNlbGYpIHtcblx0XHRcdHJldHVybiBzZWxmO1xuXHRcdH1cblxuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyAmJiBwcm9wZXJ0eSBpbiB3aW5kb3cpIHtcblx0XHRcdHJldHVybiB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCAmJiBwcm9wZXJ0eSBpbiBnbG9iYWwpIHtcblx0XHRcdHJldHVybiBnbG9iYWw7XG5cdFx0fVxuXG5cdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0XHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHtcblx0XHRcdHJldHVybiBnbG9iYWxUaGlzO1xuXHRcdH1cblx0fTtcblxuXHRjb25zdCBnbG9iYWxQcm9wZXJ0aWVzID0gW1xuXHRcdCdIZWFkZXJzJyxcblx0XHQnUmVxdWVzdCcsXG5cdFx0J1Jlc3BvbnNlJyxcblx0XHQnUmVhZGFibGVTdHJlYW0nLFxuXHRcdCdmZXRjaCcsXG5cdFx0J0Fib3J0Q29udHJvbGxlcicsXG5cdFx0J0Zvcm1EYXRhJ1xuXHRdO1xuXG5cdGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2xvYmFsUHJvcGVydGllcykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxzLCBwcm9wZXJ0eSwge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRjb25zdCBnbG9iYWxPYmplY3QgPSBnZXRHbG9iYWwocHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGdsb2JhbE9iamVjdCAmJiBnbG9iYWxPYmplY3RbcHJvcGVydHldO1xuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUuYmluZChnbG9iYWxPYmplY3QpIDogdmFsdWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRjb25zdCBpc09iamVjdCA9IHZhbHVlID0+IHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG5cdGNvbnN0IHN1cHBvcnRzQWJvcnRDb250cm9sbGVyID0gdHlwZW9mIGdsb2JhbHMuQWJvcnRDb250cm9sbGVyID09PSAnZnVuY3Rpb24nO1xuXHRjb25zdCBzdXBwb3J0c1N0cmVhbXMgPSB0eXBlb2YgZ2xvYmFscy5SZWFkYWJsZVN0cmVhbSA9PT0gJ2Z1bmN0aW9uJztcblx0Y29uc3Qgc3VwcG9ydHNGb3JtRGF0YSA9IHR5cGVvZiBnbG9iYWxzLkZvcm1EYXRhID09PSAnZnVuY3Rpb24nO1xuXG5cdGNvbnN0IG1lcmdlSGVhZGVycyA9IChzb3VyY2UxLCBzb3VyY2UyKSA9PiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gbmV3IGdsb2JhbHMuSGVhZGVycyhzb3VyY2UxIHx8IHt9KTtcblx0XHRjb25zdCBpc0hlYWRlcnNJbnN0YW5jZSA9IHNvdXJjZTIgaW5zdGFuY2VvZiBnbG9iYWxzLkhlYWRlcnM7XG5cdFx0Y29uc3Qgc291cmNlID0gbmV3IGdsb2JhbHMuSGVhZGVycyhzb3VyY2UyIHx8IHt9KTtcblxuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZSkge1xuXHRcdFx0aWYgKChpc0hlYWRlcnNJbnN0YW5jZSAmJiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0LmRlbGV0ZShrZXkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0LnNldChrZXksIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdGNvbnN0IGRlZXBNZXJnZSA9ICguLi5zb3VyY2VzKSA9PiB7XG5cdFx0bGV0IHJldHVyblZhbHVlID0ge307XG5cdFx0bGV0IGhlYWRlcnMgPSB7fTtcblxuXHRcdGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcblx0XHRcdFx0aWYgKCEoQXJyYXkuaXNBcnJheShyZXR1cm5WYWx1ZSkpKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVyblZhbHVlID0gWy4uLnJldHVyblZhbHVlLCAuLi5zb3VyY2VdO1xuXHRcdFx0fSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG5cdFx0XHRcdGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG5cdFx0XHRcdFx0aWYgKGlzT2JqZWN0KHZhbHVlKSAmJiAoa2V5IGluIHJldHVyblZhbHVlKSkge1xuXHRcdFx0XHRcdFx0dmFsdWUgPSBkZWVwTWVyZ2UocmV0dXJuVmFsdWVba2V5XSwgdmFsdWUpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gey4uLnJldHVyblZhbHVlLCBba2V5XTogdmFsdWV9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzT2JqZWN0KHNvdXJjZS5oZWFkZXJzKSkge1xuXHRcdFx0XHRcdGhlYWRlcnMgPSBtZXJnZUhlYWRlcnMoaGVhZGVycywgc291cmNlLmhlYWRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVyblZhbHVlLmhlYWRlcnMgPSBoZWFkZXJzO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fTtcblxuXHRjb25zdCByZXF1ZXN0TWV0aG9kcyA9IFtcblx0XHQnZ2V0Jyxcblx0XHQncG9zdCcsXG5cdFx0J3B1dCcsXG5cdFx0J3BhdGNoJyxcblx0XHQnaGVhZCcsXG5cdFx0J2RlbGV0ZSdcblx0XTtcblxuXHRjb25zdCByZXNwb25zZVR5cGVzID0ge1xuXHRcdGpzb246ICdhcHBsaWNhdGlvbi9qc29uJyxcblx0XHR0ZXh0OiAndGV4dC8qJyxcblx0XHRmb3JtRGF0YTogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxuXHRcdGFycmF5QnVmZmVyOiAnKi8qJyxcblx0XHRibG9iOiAnKi8qJ1xuXHR9O1xuXG5cdGNvbnN0IHJldHJ5TWV0aG9kcyA9IFtcblx0XHQnZ2V0Jyxcblx0XHQncHV0Jyxcblx0XHQnaGVhZCcsXG5cdFx0J2RlbGV0ZScsXG5cdFx0J29wdGlvbnMnLFxuXHRcdCd0cmFjZSdcblx0XTtcblxuXHRjb25zdCByZXRyeVN0YXR1c0NvZGVzID0gW1xuXHRcdDQwOCxcblx0XHQ0MTMsXG5cdFx0NDI5LFxuXHRcdDUwMCxcblx0XHQ1MDIsXG5cdFx0NTAzLFxuXHRcdDUwNFxuXHRdO1xuXG5cdGNvbnN0IHJldHJ5QWZ0ZXJTdGF0dXNDb2RlcyA9IFtcblx0XHQ0MTMsXG5cdFx0NDI5LFxuXHRcdDUwM1xuXHRdO1xuXG5cdGNvbnN0IHN0b3AgPSBTeW1ib2woJ3N0b3AnKTtcblxuXHRjbGFzcyBIVFRQRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdFx0Y29uc3RydWN0b3IocmVzcG9uc2UpIHtcblx0XHRcdC8vIFNldCB0aGUgbWVzc2FnZSB0byB0aGUgc3RhdHVzIHRleHQsIHN1Y2ggYXMgVW5hdXRob3JpemVkLFxuXHRcdFx0Ly8gd2l0aCBzb21lIGZhbGxiYWNrcy4gVGhpcyBtZXNzYWdlIHNob3VsZCBuZXZlciBiZSB1bmRlZmluZWQuXG5cdFx0XHRzdXBlcihcblx0XHRcdFx0cmVzcG9uc2Uuc3RhdHVzVGV4dCB8fFxuXHRcdFx0XHRTdHJpbmcoXG5cdFx0XHRcdFx0KHJlc3BvbnNlLnN0YXR1cyA9PT0gMCB8fCByZXNwb25zZS5zdGF0dXMpID9cblx0XHRcdFx0XHRcdHJlc3BvbnNlLnN0YXR1cyA6ICdVbmtub3duIHJlc3BvbnNlIGVycm9yJ1xuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5uYW1lID0gJ0hUVFBFcnJvcic7XG5cdFx0XHR0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG5cdFx0fVxuXHR9XG5cblx0Y2xhc3MgVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRcdGNvbnN0cnVjdG9yKHJlcXVlc3QpIHtcblx0XHRcdHN1cGVyKCdSZXF1ZXN0IHRpbWVkIG91dCcpO1xuXHRcdFx0dGhpcy5uYW1lID0gJ1RpbWVvdXRFcnJvcic7XG5cdFx0XHR0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGRlbGF5ID0gbXMgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cblx0Ly8gYFByb21pc2UucmFjZSgpYCB3b3JrYXJvdW5kICgjOTEpXG5cdGNvbnN0IHRpbWVvdXQgPSAocmVxdWVzdCwgYWJvcnRDb250cm9sbGVyLCBvcHRpb25zKSA9PlxuXHRcdG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IHRpbWVvdXRJRCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYWJvcnRDb250cm9sbGVyKSB7XG5cdFx0XHRcdFx0YWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZWplY3QobmV3IFRpbWVvdXRFcnJvcihyZXF1ZXN0KSk7XG5cdFx0XHR9LCBvcHRpb25zLnRpbWVvdXQpO1xuXG5cdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuICovXG5cdFx0XHRvcHRpb25zLmZldGNoKHJlcXVlc3QpXG5cdFx0XHRcdC50aGVuKHJlc29sdmUpXG5cdFx0XHRcdC5jYXRjaChyZWplY3QpXG5cdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGltZW91dElEKTtcblx0XHRcdFx0fSk7XG5cdFx0XHQvKiBlc2xpbnQtZW5hYmxlIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW4gKi9cblx0XHR9KTtcblxuXHRjb25zdCBub3JtYWxpemVSZXF1ZXN0TWV0aG9kID0gaW5wdXQgPT4gcmVxdWVzdE1ldGhvZHMuaW5jbHVkZXMoaW5wdXQpID8gaW5wdXQudG9VcHBlckNhc2UoKSA6IGlucHV0O1xuXG5cdGNvbnN0IGRlZmF1bHRSZXRyeU9wdGlvbnMgPSB7XG5cdFx0bGltaXQ6IDIsXG5cdFx0bWV0aG9kczogcmV0cnlNZXRob2RzLFxuXHRcdHN0YXR1c0NvZGVzOiByZXRyeVN0YXR1c0NvZGVzLFxuXHRcdGFmdGVyU3RhdHVzQ29kZXM6IHJldHJ5QWZ0ZXJTdGF0dXNDb2Rlc1xuXHR9O1xuXG5cdGNvbnN0IG5vcm1hbGl6ZVJldHJ5T3B0aW9ucyA9IChyZXRyeSA9IHt9KSA9PiB7XG5cdFx0aWYgKHR5cGVvZiByZXRyeSA9PT0gJ251bWJlcicpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdC4uLmRlZmF1bHRSZXRyeU9wdGlvbnMsXG5cdFx0XHRcdGxpbWl0OiByZXRyeVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAocmV0cnkubWV0aG9kcyAmJiAhQXJyYXkuaXNBcnJheShyZXRyeS5tZXRob2RzKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdyZXRyeS5tZXRob2RzIG11c3QgYmUgYW4gYXJyYXknKTtcblx0XHR9XG5cblx0XHRpZiAocmV0cnkuc3RhdHVzQ29kZXMgJiYgIUFycmF5LmlzQXJyYXkocmV0cnkuc3RhdHVzQ29kZXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3JldHJ5LnN0YXR1c0NvZGVzIG11c3QgYmUgYW4gYXJyYXknKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4uZGVmYXVsdFJldHJ5T3B0aW9ucyxcblx0XHRcdC4uLnJldHJ5LFxuXHRcdFx0YWZ0ZXJTdGF0dXNDb2RlczogcmV0cnlBZnRlclN0YXR1c0NvZGVzXG5cdFx0fTtcblx0fTtcblxuXHQvLyBUaGUgbWF4aW11bSB2YWx1ZSBvZiBhIDMyYml0IGludCAoc2VlIGlzc3VlICMxMTcpXG5cdGNvbnN0IG1heFNhZmVUaW1lb3V0ID0gMjE0NzQ4MzY0NztcblxuXHRjbGFzcyBLeSB7XG5cdFx0Y29uc3RydWN0b3IoaW5wdXQsIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0Y29uc29sZS5sb2coJ2t5IFVNRCAhISEhJyk7XG5cdFx0XHR0aGlzLl9yZXRyeUNvdW50ID0gMDtcblx0XHRcdHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0ge1xuXHRcdFx0XHQvLyBUT0RPOiBjcmVkZW50aWFscyBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZSBzcGVjIGNoYW5nZSBpcyBpbXBsZW1lbnRlZCBpbiBhbGwgYnJvd3NlcnMuIENvbnRleHQ6IGh0dHBzOi8vd3d3LmNocm9tZXN0YXR1cy5jb20vZmVhdHVyZS80NTM5NDczMzEyMzUwMjA4XG5cdFx0XHRcdGNyZWRlbnRpYWxzOiB0aGlzLl9pbnB1dC5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nLFxuXHRcdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0XHRoZWFkZXJzOiBtZXJnZUhlYWRlcnModGhpcy5faW5wdXQuaGVhZGVycywgb3B0aW9ucy5oZWFkZXJzKSxcblx0XHRcdFx0aG9va3M6IGRlZXBNZXJnZSh7XG5cdFx0XHRcdFx0YmVmb3JlUmVxdWVzdDogW10sXG5cdFx0XHRcdFx0YmVmb3JlUmV0cnk6IFtdLFxuXHRcdFx0XHRcdGFmdGVyUmVzcG9uc2U6IFtdXG5cdFx0XHRcdH0sIG9wdGlvbnMuaG9va3MpLFxuXHRcdFx0XHRtZXRob2Q6IG5vcm1hbGl6ZVJlcXVlc3RNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5faW5wdXQubWV0aG9kKSxcblx0XHRcdFx0cHJlZml4VXJsOiBTdHJpbmcob3B0aW9ucy5wcmVmaXhVcmwgfHwgJycpLFxuXHRcdFx0XHRyZXRyeTogbm9ybWFsaXplUmV0cnlPcHRpb25zKG9wdGlvbnMucmV0cnkpLFxuXHRcdFx0XHR0aHJvd0h0dHBFcnJvcnM6IG9wdGlvbnMudGhyb3dIdHRwRXJyb3JzICE9PSBmYWxzZSxcblx0XHRcdFx0dGltZW91dDogdHlwZW9mIG9wdGlvbnMudGltZW91dCA9PT0gJ3VuZGVmaW5lZCcgPyAxMDAwMCA6IG9wdGlvbnMudGltZW91dCxcblx0XHRcdFx0ZmV0Y2g6IG9wdGlvbnMuZmV0Y2ggfHwgZ2xvYmFscy5mZXRjaFxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLl9pbnB1dCAhPT0gJ3N0cmluZycgJiYgISh0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIFVSTCB8fCB0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIGdsb2JhbHMuUmVxdWVzdCkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignYGlucHV0YCBtdXN0IGJlIGEgc3RyaW5nLCBVUkwsIG9yIFJlcXVlc3QnKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMucHJlZml4VXJsICYmIHR5cGVvZiB0aGlzLl9pbnB1dCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2lucHV0LnN0YXJ0c1dpdGgoJy8nKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignYGlucHV0YCBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgc2xhc2ggd2hlbiB1c2luZyBgcHJlZml4VXJsYCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0aGlzLl9vcHRpb25zLnByZWZpeFVybC5lbmRzV2l0aCgnLycpKSB7XG5cdFx0XHRcdFx0dGhpcy5fb3B0aW9ucy5wcmVmaXhVcmwgKz0gJy8nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5faW5wdXQgPSB0aGlzLl9vcHRpb25zLnByZWZpeFVybCArIHRoaXMuX2lucHV0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3VwcG9ydHNBYm9ydENvbnRyb2xsZXIpIHtcblx0XHRcdFx0dGhpcy5hYm9ydENvbnRyb2xsZXIgPSBuZXcgZ2xvYmFscy5BYm9ydENvbnRyb2xsZXIoKTtcblx0XHRcdFx0aWYgKHRoaXMuX29wdGlvbnMuc2lnbmFsKSB7XG5cdFx0XHRcdFx0dGhpcy5fb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5zaWduYWwgPSB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWw7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVxdWVzdCA9IG5ldyBnbG9iYWxzLlJlcXVlc3QodGhpcy5faW5wdXQsIHRoaXMuX29wdGlvbnMpO1xuXG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5zZWFyY2hQYXJhbXMpIHtcblx0XHRcdFx0Y29uc3Qgc2VhcmNoUGFyYW1zID0gJz8nICsgbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLl9vcHRpb25zLnNlYXJjaFBhcmFtcykudG9TdHJpbmcoKTtcblx0XHRcdFx0Y29uc3QgdXJsID0gdGhpcy5yZXF1ZXN0LnVybC5yZXBsYWNlKC8oPzpcXD8uKj8pPyg/PSN8JCkvLCBzZWFyY2hQYXJhbXMpO1xuXG5cdFx0XHRcdC8vIFRvIHByb3ZpZGUgY29ycmVjdCBmb3JtIGJvdW5kYXJ5LCBDb250ZW50LVR5cGUgaGVhZGVyIHNob3VsZCBiZSBkZWxldGVkIGVhY2ggdGltZSB3aGVuIG5ldyBSZXF1ZXN0IGluc3RhbnRpYXRlZCBmcm9tIGFub3RoZXIgb25lXG5cdFx0XHRcdGlmICgoKHN1cHBvcnRzRm9ybURhdGEgJiYgdGhpcy5fb3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgZ2xvYmFscy5Gb3JtRGF0YSkgfHwgdGhpcy5fb3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSAmJiAhKHRoaXMuX29wdGlvbnMuaGVhZGVycyAmJiB0aGlzLl9vcHRpb25zLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSkge1xuXHRcdFx0XHRcdHRoaXMucmVxdWVzdC5oZWFkZXJzLmRlbGV0ZSgnY29udGVudC10eXBlJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnJlcXVlc3QgPSBuZXcgZ2xvYmFscy5SZXF1ZXN0KG5ldyBnbG9iYWxzLlJlcXVlc3QodXJsLCB0aGlzLnJlcXVlc3QpLCB0aGlzLl9vcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMuanNvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX29wdGlvbnMuanNvbik7XG5cdFx0XHRcdHRoaXMucmVxdWVzdC5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0ID0gbmV3IGdsb2JhbHMuUmVxdWVzdCh0aGlzLnJlcXVlc3QsIHtib2R5OiB0aGlzLl9vcHRpb25zLmJvZHl9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZm4gPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRpbWVvdXQgPiBtYXhTYWZlVGltZW91dCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgXFxgdGltZW91dFxcYCBvcHRpb24gY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAke21heFNhZmVUaW1lb3V0fWApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgZGVsYXkoMSk7XG5cdFx0XHRcdGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2ZldGNoKCk7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBob29rIG9mIHRoaXMuX29wdGlvbnMuaG9va3MuYWZ0ZXJSZXNwb25zZSkge1xuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG5cdFx0XHRcdFx0Y29uc3QgbW9kaWZpZWRSZXNwb25zZSA9IGF3YWl0IGhvb2soXG5cdFx0XHRcdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRcdFx0XHR0aGlzLl9vcHRpb25zLFxuXHRcdFx0XHRcdFx0dGhpcy5fZGVjb3JhdGVSZXNwb25zZShyZXNwb25zZS5jbG9uZSgpKVxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAobW9kaWZpZWRSZXNwb25zZSBpbnN0YW5jZW9mIGdsb2JhbHMuUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gbW9kaWZpZWRSZXNwb25zZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9kZWNvcmF0ZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuXHRcdFx0XHRpZiAoIXJlc3BvbnNlLm9rICYmIHRoaXMuX29wdGlvbnMudGhyb3dIdHRwRXJyb3JzKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEhUVFBFcnJvcihyZXNwb25zZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiBgb25Eb3dubG9hZFByb2dyZXNzYCBpcyBwYXNzZWQsIGl0IHVzZXMgdGhlIHN0cmVhbSBBUEkgaW50ZXJuYWxseVxuXHRcdFx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5vbkRvd25sb2FkUHJvZ3Jlc3MpIHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHRoaXMuX29wdGlvbnMub25Eb3dubG9hZFByb2dyZXNzICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYG9uRG93bmxvYWRQcm9ncmVzc2Agb3B0aW9uIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghc3VwcG9ydHNTdHJlYW1zKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1N0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4geW91ciBlbnZpcm9ubWVudC4gYFJlYWRhYmxlU3RyZWFtYCBpcyBtaXNzaW5nLicpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9zdHJlYW0ocmVzcG9uc2UuY2xvbmUoKSwgdGhpcy5fb3B0aW9ucy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgaXNSZXRyaWFibGVNZXRob2QgPSB0aGlzLl9vcHRpb25zLnJldHJ5Lm1ldGhvZHMuaW5jbHVkZXModGhpcy5yZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpKTtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGlzUmV0cmlhYmxlTWV0aG9kID8gdGhpcy5fcmV0cnkoZm4pIDogZm4oKTtcblxuXHRcdFx0Zm9yIChjb25zdCBbdHlwZSwgbWltZVR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlVHlwZXMpKSB7XG5cdFx0XHRcdHJlc3VsdFt0eXBlXSA9IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3QuaGVhZGVycy5zZXQoJ2FjY2VwdCcsIHRoaXMucmVxdWVzdC5oZWFkZXJzLmdldCgnYWNjZXB0JykgfHwgbWltZVR5cGUpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgcmVzdWx0KS5jbG9uZSgpO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGUgPT09ICdqc29uJykge1xuXHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAnJztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMucGFyc2VKc29uKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvcHRpb25zLnBhcnNlSnNvbihhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXNwb25zZVt0eXBlXSgpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdF9jYWxjdWxhdGVSZXRyeURlbGF5KGVycm9yKSB7XG5cdFx0XHR0aGlzLl9yZXRyeUNvdW50Kys7XG5cblx0XHRcdGlmICh0aGlzLl9yZXRyeUNvdW50IDwgdGhpcy5fb3B0aW9ucy5yZXRyeS5saW1pdCAmJiAhKGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSkge1xuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBIVFRQRXJyb3IpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX29wdGlvbnMucmV0cnkuc3RhdHVzQ29kZXMuaW5jbHVkZXMoZXJyb3IucmVzcG9uc2Uuc3RhdHVzKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgcmV0cnlBZnRlciA9IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpO1xuXHRcdFx0XHRcdGlmIChyZXRyeUFmdGVyICYmIHRoaXMuX29wdGlvbnMucmV0cnkuYWZ0ZXJTdGF0dXNDb2Rlcy5pbmNsdWRlcyhlcnJvci5yZXNwb25zZS5zdGF0dXMpKSB7XG5cdFx0XHRcdFx0XHRsZXQgYWZ0ZXIgPSBOdW1iZXIocmV0cnlBZnRlcik7XG5cdFx0XHRcdFx0XHRpZiAoTnVtYmVyLmlzTmFOKGFmdGVyKSkge1xuXHRcdFx0XHRcdFx0XHRhZnRlciA9IERhdGUucGFyc2UocmV0cnlBZnRlcikgLSBEYXRlLm5vdygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YWZ0ZXIgKj0gMTAwMDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiB0aGlzLl9vcHRpb25zLnJldHJ5Lm1heFJldHJ5QWZ0ZXIgIT09ICd1bmRlZmluZWQnICYmIGFmdGVyID4gdGhpcy5fb3B0aW9ucy5yZXRyeS5tYXhSZXRyeUFmdGVyKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gYWZ0ZXI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDEzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBCQUNLT0ZGX0ZBQ1RPUiA9IDAuMztcblx0XHRcdFx0cmV0dXJuIEJBQ0tPRkZfRkFDVE9SICogKDIgKiogKHRoaXMuX3JldHJ5Q291bnQgLSAxKSkgKiAxMDAwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRfZGVjb3JhdGVSZXNwb25zZShyZXNwb25zZSkge1xuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMucGFyc2VKc29uKSB7XG5cdFx0XHRcdHJlc3BvbnNlLmpzb24gPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX29wdGlvbnMucGFyc2VKc29uKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXNwb25zZTtcblx0XHR9XG5cblx0XHRhc3luYyBfcmV0cnkoZm4pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJldHVybiBhd2FpdCBmbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgbXMgPSBNYXRoLm1pbih0aGlzLl9jYWxjdWxhdGVSZXRyeURlbGF5KGVycm9yKSwgbWF4U2FmZVRpbWVvdXQpO1xuXHRcdFx0XHRpZiAobXMgIT09IDAgJiYgdGhpcy5fcmV0cnlDb3VudCA+IDApIHtcblx0XHRcdFx0XHRhd2FpdCBkZWxheShtcyk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5fb3B0aW9ucy5ob29rcy5iZWZvcmVSZXRyeSkge1xuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3Bcblx0XHRcdFx0XHRcdGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rKHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiB0aGlzLl9vcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRlcnJvcixcblx0XHRcdFx0XHRcdFx0cmV0cnlDb3VudDogdGhpcy5fcmV0cnlDb3VudFxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdC8vIElmIGBzdG9wYCBpcyByZXR1cm5lZCBmcm9tIHRoZSBob29rLCB0aGUgcmV0cnkgcHJvY2VzcyBpcyBzdG9wcGVkXG5cdFx0XHRcdFx0XHRpZiAoaG9va1Jlc3VsdCA9PT0gc3RvcCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3JldHJ5KGZuKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRocm93SHR0cEVycm9ycykge1xuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YXN5bmMgX2ZldGNoKCkge1xuXHRcdFx0Zm9yIChjb25zdCBob29rIG9mIHRoaXMuX29wdGlvbnMuaG9va3MuYmVmb3JlUmVxdWVzdCkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBob29rKHRoaXMucmVxdWVzdCwgdGhpcy5fb3B0aW9ucyk7XG5cblx0XHRcdFx0aWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3QgPSByZXN1bHQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRpbWVvdXQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9vcHRpb25zLmZldGNoKHRoaXMucmVxdWVzdC5jbG9uZSgpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRpbWVvdXQodGhpcy5yZXF1ZXN0LmNsb25lKCksIHRoaXMuYWJvcnRDb250cm9sbGVyLCB0aGlzLl9vcHRpb25zKTtcblx0XHR9XG5cblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdF9zdHJlYW0ocmVzcG9uc2UsIG9uRG93bmxvYWRQcm9ncmVzcykge1xuXHRcdFx0Y29uc3QgdG90YWxCeXRlcyA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSkgfHwgMDtcblx0XHRcdGxldCB0cmFuc2ZlcnJlZEJ5dGVzID0gMDtcblxuXHRcdFx0cmV0dXJuIG5ldyBnbG9iYWxzLlJlc3BvbnNlKFxuXHRcdFx0XHRuZXcgZ2xvYmFscy5SZWFkYWJsZVN0cmVhbSh7XG5cdFx0XHRcdFx0c3RhcnQoY29udHJvbGxlcikge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcblxuXHRcdFx0XHRcdFx0aWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuXHRcdFx0XHRcdFx0XHRvbkRvd25sb2FkUHJvZ3Jlc3Moe3BlcmNlbnQ6IDAsIHRyYW5zZmVycmVkQnl0ZXM6IDAsIHRvdGFsQnl0ZXN9LCBuZXcgVWludDhBcnJheSgpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YXN5bmMgZnVuY3Rpb24gcmVhZCgpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG5cdFx0XHRcdFx0XHRcdGlmIChkb25lKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvbkRvd25sb2FkUHJvZ3Jlc3MpIHtcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2ZlcnJlZEJ5dGVzICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcGVyY2VudCA9IHRvdGFsQnl0ZXMgPT09IDAgPyAwIDogdHJhbnNmZXJyZWRCeXRlcyAvIHRvdGFsQnl0ZXM7XG5cdFx0XHRcdFx0XHRcdFx0b25Eb3dubG9hZFByb2dyZXNzKHtwZXJjZW50LCB0cmFuc2ZlcnJlZEJ5dGVzLCB0b3RhbEJ5dGVzfSwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5lbnF1ZXVlKHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0cmVhZCgpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZWFkKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCB2YWxpZGF0ZUFuZE1lcmdlID0gKC4uLnNvdXJjZXMpID0+IHtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG5cdFx0XHRpZiAoKCFpc09iamVjdChzb3VyY2UpIHx8IEFycmF5LmlzQXJyYXkoc291cmNlKSkgJiYgdHlwZW9mIHNvdXJjZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGBvcHRpb25zYCBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBkZWVwTWVyZ2Uoe30sIC4uLnNvdXJjZXMpO1xuXHR9O1xuXG5cdGNvbnN0IGNyZWF0ZUluc3RhbmNlID0gZGVmYXVsdHMgPT4ge1xuXHRcdGNvbnN0IGt5ID0gKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgS3koaW5wdXQsIHZhbGlkYXRlQW5kTWVyZ2UoZGVmYXVsdHMsIG9wdGlvbnMpKTtcblxuXHRcdGZvciAoY29uc3QgbWV0aG9kIG9mIHJlcXVlc3RNZXRob2RzKSB7XG5cdFx0XHRreVttZXRob2RdID0gKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgS3koaW5wdXQsIHZhbGlkYXRlQW5kTWVyZ2UoZGVmYXVsdHMsIG9wdGlvbnMsIHttZXRob2R9KSk7XG5cdFx0fVxuXG5cdFx0a3kuSFRUUEVycm9yID0gSFRUUEVycm9yO1xuXHRcdGt5LlRpbWVvdXRFcnJvciA9IFRpbWVvdXRFcnJvcjtcblx0XHRreS5jcmVhdGUgPSBuZXdEZWZhdWx0cyA9PiBjcmVhdGVJbnN0YW5jZSh2YWxpZGF0ZUFuZE1lcmdlKG5ld0RlZmF1bHRzKSk7XG5cdFx0a3kuZXh0ZW5kID0gbmV3RGVmYXVsdHMgPT4gY3JlYXRlSW5zdGFuY2UodmFsaWRhdGVBbmRNZXJnZShkZWZhdWx0cywgbmV3RGVmYXVsdHMpKTtcblx0XHRreS5zdG9wID0gc3RvcDtcblxuXHRcdHJldHVybiBreTtcblx0fTtcblxuXHR2YXIgaW5kZXggPSBjcmVhdGVJbnN0YW5jZSgpO1xuXG5cdHJldHVybiBpbmRleDtcblxufSkpKTtcbiIsImZ1bmN0aW9uIG5vcm1hbGl6ZSAoc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgICAgICAgICAucmVwbGFjZSgvW1xcL10rL2csICcvJylcbiAgICAgICAgICAucmVwbGFjZSgvXFwvXFw/L2csICc/JylcbiAgICAgICAgICAucmVwbGFjZSgvXFwvXFwjL2csICcjJylcbiAgICAgICAgICAucmVwbGFjZSgvXFw6XFwvL2csICc6Ly8nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBqb2luZWQgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCkuam9pbignLycpO1xuICByZXR1cm4gbm9ybWFsaXplKGpvaW5lZCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImh0dHBzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInN0cmVhbVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ6bGliXCIpOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZmV0Y2g7XG5cbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCBkYXRhVXJpVG9CdWZmZXIgPSByZXF1aXJlKCdkYXRhLXVyaS10by1idWZmZXInKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBCbG9iID0gcmVxdWlyZSgnZmV0Y2gtYmxvYicpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCB1cmwgPSByZXF1aXJlKCd1cmwnKTtcblxuY2xhc3MgRmV0Y2hCYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHR5cGUpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHQvLyBIaWRlIGN1c3RvbSBlcnJvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZyb20gZW5kLXVzZXJzXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG5cblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHR9XG5cblx0Z2V0IG5hbWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcblx0fVxuXG5cdGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXHR9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge3sgYWRkcmVzcz86IHN0cmluZywgY29kZTogc3RyaW5nLCBkZXN0Pzogc3RyaW5nLCBlcnJubzogbnVtYmVyLCBpbmZvPzogb2JqZWN0LCBtZXNzYWdlOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIHN5c2NhbGw6IHN0cmluZ319IFN5c3RlbUVycm9yXG4qL1xuXG4vKipcbiAqIEZldGNoRXJyb3IgaW50ZXJmYWNlIGZvciBvcGVyYXRpb25hbCBlcnJvcnNcbiAqL1xuY2xhc3MgRmV0Y2hFcnJvciBleHRlbmRzIEZldGNoQmFzZUVycm9yIHtcblx0LyoqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gbWVzc2FnZSAtICAgICAgRXJyb3IgbWVzc2FnZSBmb3IgaHVtYW5cblx0ICogQHBhcmFtICB7c3RyaW5nfSBbdHlwZV0gLSAgICAgICAgRXJyb3IgdHlwZSBmb3IgbWFjaGluZVxuXHQgKiBAcGFyYW0gIHtTeXN0ZW1FcnJvcn0gW3N5c3RlbUVycm9yXSAtIEZvciBOb2RlLmpzIHN5c3RlbSBlcnJvclxuXHQgKi9cblx0Y29uc3RydWN0b3IobWVzc2FnZSwgdHlwZSwgc3lzdGVtRXJyb3IpIHtcblx0XHRzdXBlcihtZXNzYWdlLCB0eXBlKTtcblx0XHQvLyBXaGVuIGVyci50eXBlIGlzIGBzeXN0ZW1gLCBlcnIuZXJyb3JlZFN5c0NhbGwgY29udGFpbnMgc3lzdGVtIGVycm9yIGFuZCBlcnIuY29kZSBjb250YWlucyBzeXN0ZW0gZXJyb3IgY29kZVxuXHRcdGlmIChzeXN0ZW1FcnJvcikge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW11bHRpLWFzc2lnblxuXHRcdFx0dGhpcy5jb2RlID0gdGhpcy5lcnJubyA9IHN5c3RlbUVycm9yLmNvZGU7XG5cdFx0XHR0aGlzLmVycm9yZWRTeXNDYWxsID0gc3lzdGVtRXJyb3Iuc3lzY2FsbDtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBJcy5qc1xuICpcbiAqIE9iamVjdCB0eXBlIGNoZWNrcy5cbiAqL1xuXG5jb25zdCBOQU1FID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICogcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL2lzc3Vlcy8yOTYjaXNzdWVjb21tZW50LTMwNzU5ODE0M1xuICpcbiAqIEBwYXJhbSAgeyp9IG9ialxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNVUkxTZWFyY2hQYXJhbWV0ZXJzID0gb2JqZWN0ID0+IHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5oYXMgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3Quc29ydCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdG9iamVjdFtOQU1FXSA9PT0gJ1VSTFNlYXJjaFBhcmFtcydcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamVjdGAgaXMgYSBXM0MgYEJsb2JgIG9iamVjdCAod2hpY2ggYEZpbGVgIGluaGVyaXRzIGZyb20pXG4gKlxuICogQHBhcmFtICB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5jb25zdCBpc0Jsb2IgPSBvYmplY3QgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QudHlwZSA9PT0gJ3N0cmluZycgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcblx0XHQvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbTkFNRV0pXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgc3BlYy1jb21wbGlhbnQgYEZvcm1EYXRhYCBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YShvYmplY3QpIHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5zZXQgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcblx0XHRvYmplY3RbTkFNRV0gPT09ICdGb3JtRGF0YSdcblx0KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBpbnN0YW5jZSBvZiBBYm9ydFNpZ25hbC5cbiAqXG4gKiBAcGFyYW0gIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQWJvcnRTaWduYWwgPSBvYmplY3QgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0b2JqZWN0W05BTUVdID09PSAnQWJvcnRTaWduYWwnXG5cdCk7XG59O1xuXG5jb25zdCBjYXJyaWFnZSA9ICdcXHJcXG4nO1xuY29uc3QgZGFzaGVzID0gJy0nLnJlcGVhdCgyKTtcbmNvbnN0IGNhcnJpYWdlTGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoY2FycmlhZ2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZGFyeVxuICovXG5jb25zdCBnZXRGb290ZXIgPSBib3VuZGFyeSA9PiBgJHtkYXNoZXN9JHtib3VuZGFyeX0ke2Rhc2hlc30ke2NhcnJpYWdlLnJlcGVhdCgyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZGFyeVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldEhlYWRlcihib3VuZGFyeSwgbmFtZSwgZmllbGQpIHtcblx0bGV0IGhlYWRlciA9ICcnO1xuXG5cdGhlYWRlciArPSBgJHtkYXNoZXN9JHtib3VuZGFyeX0ke2NhcnJpYWdlfWA7XG5cdGhlYWRlciArPSBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiJHtuYW1lfVwiYDtcblxuXHRpZiAoaXNCbG9iKGZpZWxkKSkge1xuXHRcdGhlYWRlciArPSBgOyBmaWxlbmFtZT1cIiR7ZmllbGQubmFtZX1cIiR7Y2FycmlhZ2V9YDtcblx0XHRoZWFkZXIgKz0gYENvbnRlbnQtVHlwZTogJHtmaWVsZC50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfWA7XG5cdH1cblxuXHRyZXR1cm4gYCR7aGVhZGVyfSR7Y2FycmlhZ2UucmVwZWF0KDIpfWA7XG59XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRCb3VuZGFyeSA9ICgpID0+IGNyeXB0by5yYW5kb21CeXRlcyg4KS50b1N0cmluZygnaGV4Jyk7XG5cbi8qKlxuICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IGJvdW5kYXJ5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uICogZm9ybURhdGFJdGVyYXRvcihmb3JtLCBib3VuZGFyeSkge1xuXHRmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZm9ybSkge1xuXHRcdHlpZWxkIGdldEhlYWRlcihib3VuZGFyeSwgbmFtZSwgdmFsdWUpO1xuXG5cdFx0aWYgKGlzQmxvYih2YWx1ZSkpIHtcblx0XHRcdHlpZWxkICogdmFsdWUuc3RyZWFtKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHlpZWxkIHZhbHVlO1xuXHRcdH1cblxuXHRcdHlpZWxkIGNhcnJpYWdlO1xuXHR9XG5cblx0eWllbGQgZ2V0Rm9vdGVyKGJvdW5kYXJ5KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9ybURhdGFMZW5ndGgoZm9ybSwgYm91bmRhcnkpIHtcblx0bGV0IGxlbmd0aCA9IDA7XG5cblx0Zm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGZvcm0pIHtcblx0XHRsZW5ndGggKz0gQnVmZmVyLmJ5dGVMZW5ndGgoZ2V0SGVhZGVyKGJvdW5kYXJ5LCBuYW1lLCB2YWx1ZSkpO1xuXG5cdFx0aWYgKGlzQmxvYih2YWx1ZSkpIHtcblx0XHRcdGxlbmd0aCArPSB2YWx1ZS5zaXplO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZW5ndGggKz0gQnVmZmVyLmJ5dGVMZW5ndGgoU3RyaW5nKHZhbHVlKSk7XG5cdFx0fVxuXG5cdFx0bGVuZ3RoICs9IGNhcnJpYWdlTGVuZ3RoO1xuXHR9XG5cblx0bGVuZ3RoICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKGdldEZvb3Rlcihib3VuZGFyeSkpO1xuXG5cdHJldHVybiBsZW5ndGg7XG59XG5cbmNvbnN0IElOVEVSTkFMUyA9IFN5bWJvbCgnQm9keSBpbnRlcm5hbHMnKTtcblxuLyoqXG4gKiBCb2R5IG1peGluXG4gKlxuICogUmVmOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keVxuICpcbiAqIEBwYXJhbSAgIFN0cmVhbSAgYm9keSAgUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0gICBPYmplY3QgIG9wdHMgIFJlc3BvbnNlIG9wdGlvbnNcbiAqIEByZXR1cm4gIFZvaWRcbiAqL1xuY2xhc3MgQm9keSB7XG5cdGNvbnN0cnVjdG9yKGJvZHksIHtcblx0XHRzaXplID0gMFxuXHR9ID0ge30pIHtcblx0XHRsZXQgYm91bmRhcnkgPSBudWxsO1xuXG5cdFx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHRcdC8vIEJvZHkgaXMgdW5kZWZpbmVkIG9yIG51bGxcblx0XHRcdGJvZHkgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAoaXNVUkxTZWFyY2hQYXJhbWV0ZXJzKGJvZHkpKSB7XG5cdFx0Ly8gQm9keSBpcyBhIFVSTFNlYXJjaFBhcmFtc1xuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkudG9TdHJpbmcoKSk7XG5cdFx0fSBlbHNlIGlmIChpc0Jsb2IoYm9keSkpIDsgZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSA7IGVsc2UgaWYgKHV0aWwudHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihib2R5KSkge1xuXHRcdFx0Ly8gQm9keSBpcyBBcnJheUJ1ZmZlclxuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkpO1xuXHRcdH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGJvZHkpKSB7XG5cdFx0XHQvLyBCb2R5IGlzIEFycmF5QnVmZmVyVmlld1xuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyLCBib2R5LmJ5dGVPZmZzZXQsIGJvZHkuYnl0ZUxlbmd0aCk7XG5cdFx0fSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSA7IGVsc2UgaWYgKGlzRm9ybURhdGEoYm9keSkpIHtcblx0XHRcdC8vIEJvZHkgaXMgYW4gaW5zdGFuY2Ugb2YgZm9ybWRhdGEtbm9kZVxuXHRcdFx0Ym91bmRhcnkgPSBgTm9kZUZldGNoRm9ybURhdGFCb3VuZGFyeSR7Z2V0Qm91bmRhcnkoKX1gO1xuXHRcdFx0Ym9keSA9IFN0cmVhbS5SZWFkYWJsZS5mcm9tKGZvcm1EYXRhSXRlcmF0b3IoYm9keSwgYm91bmRhcnkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm9uZSBvZiB0aGUgYWJvdmVcblx0XHRcdC8vIGNvZXJjZSB0byBzdHJpbmcgdGhlbiBidWZmZXJcblx0XHRcdGJvZHkgPSBCdWZmZXIuZnJvbShTdHJpbmcoYm9keSkpO1xuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTXSA9IHtcblx0XHRcdGJvZHksXG5cdFx0XHRib3VuZGFyeSxcblx0XHRcdGRpc3R1cmJlZDogZmFsc2UsXG5cdFx0XHRlcnJvcjogbnVsbFxuXHRcdH07XG5cdFx0dGhpcy5zaXplID0gc2l6ZTtcblxuXHRcdGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSB7XG5cdFx0XHRib2R5Lm9uKCdlcnJvcicsIGVyciA9PiB7XG5cdFx0XHRcdGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRmV0Y2hCYXNlRXJyb3IgP1xuXHRcdFx0XHRcdGVyciA6XG5cdFx0XHRcdFx0bmV3IEZldGNoRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgYm9keSB3aGlsZSB0cnlpbmcgdG8gZmV0Y2ggJHt0aGlzLnVybH06ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycik7XG5cdFx0XHRcdHRoaXNbSU5URVJOQUxTXS5lcnJvciA9IGVycm9yO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGJvZHkoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTXS5ib2R5O1xuXHR9XG5cblx0Z2V0IGJvZHlVc2VkKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMU10uZGlzdHVyYmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY29kZSByZXNwb25zZSBhcyBBcnJheUJ1ZmZlclxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyBhcnJheUJ1ZmZlcigpIHtcblx0XHRjb25zdCB7YnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RofSA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBidWZmZXIuc2xpY2UoYnl0ZU9mZnNldCwgYnl0ZU9mZnNldCArIGJ5dGVMZW5ndGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiByYXcgcmVzcG9uc2UgYXMgQmxvYlxuXHQgKlxuXHQgKiBAcmV0dXJuIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIGJsb2IoKSB7XG5cdFx0Y29uc3QgY3QgPSAodGhpcy5oZWFkZXJzICYmIHRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB8fCAodGhpc1tJTlRFUk5BTFNdLmJvZHkgJiYgdGhpc1tJTlRFUk5BTFNdLmJvZHkudHlwZSkgfHwgJyc7XG5cdFx0Y29uc3QgYnVmID0gYXdhaXQgdGhpcy5idWZmZXIoKTtcblxuXHRcdHJldHVybiBuZXcgQmxvYihbYnVmXSwge1xuXHRcdFx0dHlwZTogY3Rcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMganNvblxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyBqc29uKCkge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBKU09OLnBhcnNlKGJ1ZmZlci50b1N0cmluZygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMgdGV4dFxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyB0ZXh0KCkge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBidWZmZXIudG9TdHJpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMgYnVmZmVyIChub24tc3BlYyBhcGkpXG5cdCAqXG5cdCAqIEByZXR1cm4gIFByb21pc2Vcblx0ICovXG5cdGJ1ZmZlcigpIHtcblx0XHRyZXR1cm4gY29uc3VtZUJvZHkodGhpcyk7XG5cdH1cbn1cblxuLy8gSW4gYnJvd3NlcnMsIGFsbCBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQm9keS5wcm90b3R5cGUsIHtcblx0Ym9keToge2VudW1lcmFibGU6IHRydWV9LFxuXHRib2R5VXNlZDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRhcnJheUJ1ZmZlcjoge2VudW1lcmFibGU6IHRydWV9LFxuXHRibG9iOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGpzb246IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0dGV4dDoge2VudW1lcmFibGU6IHRydWV9XG59KTtcblxuLyoqXG4gKiBDb25zdW1lIGFuZCBjb252ZXJ0IGFuIGVudGlyZSBCb2R5IHRvIGEgQnVmZmVyLlxuICpcbiAqIFJlZjogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keS1jb25zdW1lLWJvZHlcbiAqXG4gKiBAcmV0dXJuIFByb21pc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uc3VtZUJvZHkoZGF0YSkge1xuXHRpZiAoZGF0YVtJTlRFUk5BTFNdLmRpc3R1cmJlZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYGJvZHkgdXNlZCBhbHJlYWR5IGZvcjogJHtkYXRhLnVybH1gKTtcblx0fVxuXG5cdGRhdGFbSU5URVJOQUxTXS5kaXN0dXJiZWQgPSB0cnVlO1xuXG5cdGlmIChkYXRhW0lOVEVSTkFMU10uZXJyb3IpIHtcblx0XHR0aHJvdyBkYXRhW0lOVEVSTkFMU10uZXJyb3I7XG5cdH1cblxuXHRsZXQge2JvZHl9ID0gZGF0YTtcblxuXHQvLyBCb2R5IGlzIG51bGxcblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBibG9iXG5cdGlmIChpc0Jsb2IoYm9keSkpIHtcblx0XHRib2R5ID0gYm9keS5zdHJlYW0oKTtcblx0fVxuXG5cdC8vIEJvZHkgaXMgYnVmZmVyXG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHRyZXR1cm4gYm9keTtcblx0fVxuXG5cdC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cblx0aWYgKCEoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBzdHJlYW1cblx0Ly8gZ2V0IHJlYWR5IHRvIGFjdHVhbGx5IGNvbnN1bWUgdGhlIGJvZHlcblx0Y29uc3QgYWNjdW0gPSBbXTtcblx0bGV0IGFjY3VtQnl0ZXMgPSAwO1xuXG5cdHRyeSB7XG5cdFx0Zm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBib2R5KSB7XG5cdFx0XHRpZiAoZGF0YS5zaXplID4gMCAmJiBhY2N1bUJ5dGVzICsgY2h1bmsubGVuZ3RoID4gZGF0YS5zaXplKSB7XG5cdFx0XHRcdGNvbnN0IGVyciA9IG5ldyBGZXRjaEVycm9yKGBjb250ZW50IHNpemUgYXQgJHtkYXRhLnVybH0gb3ZlciBsaW1pdDogJHtkYXRhLnNpemV9YCwgJ21heC1zaXplJyk7XG5cdFx0XHRcdGJvZHkuZGVzdHJveShlcnIpO1xuXHRcdFx0XHR0aHJvdyBlcnI7XG5cdFx0XHR9XG5cblx0XHRcdGFjY3VtQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuXHRcdFx0YWNjdW0ucHVzaChjaHVuayk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIEZldGNoQmFzZUVycm9yKSB7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXIgZXJyb3JzLCBzdWNoIGFzIGluY29ycmVjdCBjb250ZW50LWVuY29kaW5nXG5cdFx0XHR0aHJvdyBuZXcgRmV0Y2hFcnJvcihgSW52YWxpZCByZXNwb25zZSBib2R5IHdoaWxlIHRyeWluZyB0byBmZXRjaCAke2RhdGEudXJsfTogJHtlcnJvci5tZXNzYWdlfWAsICdzeXN0ZW0nLCBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGJvZHkucmVhZGFibGVFbmRlZCA9PT0gdHJ1ZSB8fCBib2R5Ll9yZWFkYWJsZVN0YXRlLmVuZGVkID09PSB0cnVlKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhY2N1bS5ldmVyeShjID0+IHR5cGVvZiBjID09PSAnc3RyaW5nJykpIHtcblx0XHRcdFx0cmV0dXJuIEJ1ZmZlci5mcm9tKGFjY3VtLmpvaW4oJycpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIEJ1ZmZlci5jb25jYXQoYWNjdW0sIGFjY3VtQnl0ZXMpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRmV0Y2hFcnJvcihgQ291bGQgbm90IGNyZWF0ZSBCdWZmZXIgZnJvbSByZXNwb25zZSBib2R5IGZvciAke2RhdGEudXJsfTogJHtlcnJvci5tZXNzYWdlfWAsICdzeXN0ZW0nLCBlcnJvcik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBGZXRjaEVycm9yKGBQcmVtYXR1cmUgY2xvc2Ugb2Ygc2VydmVyIHJlc3BvbnNlIHdoaWxlIHRyeWluZyB0byBmZXRjaCAke2RhdGEudXJsfWApO1xuXHR9XG59XG5cbi8qKlxuICogQ2xvbmUgYm9keSBnaXZlbiBSZXMvUmVxIGluc3RhbmNlXG4gKlxuICogQHBhcmFtICAgTWl4ZWQgICBpbnN0YW5jZSAgICAgICBSZXNwb25zZSBvciBSZXF1ZXN0IGluc3RhbmNlXG4gKiBAcGFyYW0gICBTdHJpbmcgIGhpZ2hXYXRlck1hcmsgIGhpZ2hXYXRlck1hcmsgZm9yIGJvdGggUGFzc1Rocm91Z2ggYm9keSBzdHJlYW1zXG4gKiBAcmV0dXJuICBNaXhlZFxuICovXG5jb25zdCBjbG9uZSA9IChpbnN0YW5jZSwgaGlnaFdhdGVyTWFyaykgPT4ge1xuXHRsZXQgcDE7XG5cdGxldCBwMjtcblx0bGV0IHtib2R5fSA9IGluc3RhbmNlO1xuXG5cdC8vIERvbid0IGFsbG93IGNsb25pbmcgYSB1c2VkIGJvZHlcblx0aWYgKGluc3RhbmNlLmJvZHlVc2VkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY2xvbmUgYm9keSBhZnRlciBpdCBpcyB1c2VkJyk7XG5cdH1cblxuXHQvLyBDaGVjayB0aGF0IGJvZHkgaXMgYSBzdHJlYW0gYW5kIG5vdCBmb3JtLWRhdGEgb2JqZWN0XG5cdC8vIG5vdGU6IHdlIGNhbid0IGNsb25lIHRoZSBmb3JtLWRhdGEgb2JqZWN0IHdpdGhvdXQgaGF2aW5nIGl0IGFzIGEgZGVwZW5kZW5jeVxuXHRpZiAoKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0pICYmICh0eXBlb2YgYm9keS5nZXRCb3VuZGFyeSAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHQvLyBUZWUgaW5zdGFuY2UgYm9keVxuXHRcdHAxID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7aGlnaFdhdGVyTWFya30pO1xuXHRcdHAyID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7aGlnaFdhdGVyTWFya30pO1xuXHRcdGJvZHkucGlwZShwMSk7XG5cdFx0Ym9keS5waXBlKHAyKTtcblx0XHQvLyBTZXQgaW5zdGFuY2UgYm9keSB0byB0ZWVkIGJvZHkgYW5kIHJldHVybiB0aGUgb3RoZXIgdGVlZCBib2R5XG5cdFx0aW5zdGFuY2VbSU5URVJOQUxTXS5ib2R5ID0gcDE7XG5cdFx0Ym9keSA9IHAyO1xuXHR9XG5cblx0cmV0dXJuIGJvZHk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcGVyYXRpb24gXCJleHRyYWN0IGEgYENvbnRlbnQtVHlwZWAgdmFsdWUgZnJvbSB8b2JqZWN0fFwiIGFzXG4gKiBzcGVjaWZpZWQgaW4gdGhlIHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5aW5pdC1leHRyYWN0XG4gKlxuICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgaW5zdGFuY2UuYm9keSBpcyBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSB7YW55fSBib2R5IEFueSBvcHRpb25zLmJvZHkgaW5wdXRcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICovXG5jb25zdCBleHRyYWN0Q29udGVudFR5cGUgPSAoYm9keSwgcmVxdWVzdCkgPT4ge1xuXHQvLyBCb2R5IGlzIG51bGwgb3IgdW5kZWZpbmVkXG5cdGlmIChib2R5ID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBCb2R5IGlzIHN0cmluZ1xuXHRpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBhIFVSTFNlYXJjaFBhcmFtc1xuXHRpZiAoaXNVUkxTZWFyY2hQYXJhbWV0ZXJzKGJvZHkpKSB7XG5cdFx0cmV0dXJuICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XG5cdH1cblxuXHQvLyBCb2R5IGlzIGJsb2Jcblx0aWYgKGlzQmxvYihib2R5KSkge1xuXHRcdHJldHVybiBib2R5LnR5cGUgfHwgbnVsbDtcblx0fVxuXG5cdC8vIEJvZHkgaXMgYSBCdWZmZXIgKEJ1ZmZlciwgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KVxuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpIHx8IHV0aWwudHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihib2R5KSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYm9keSkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIERldGVjdCBmb3JtIGRhdGEgaW5wdXQgZnJvbSBmb3JtLWRhdGEgbW9kdWxlXG5cdGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmdldEJvdW5kYXJ5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIGBtdWx0aXBhcnQvZm9ybS1kYXRhO2JvdW5kYXJ5PSR7Ym9keS5nZXRCb3VuZGFyeSgpfWA7XG5cdH1cblxuXHRpZiAoaXNGb3JtRGF0YShib2R5KSkge1xuXHRcdHJldHVybiBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtyZXF1ZXN0W0lOVEVSTkFMU10uYm91bmRhcnl9YDtcblx0fVxuXG5cdC8vIEJvZHkgaXMgc3RyZWFtIC0gY2FuJ3QgcmVhbGx5IGRvIG11Y2ggYWJvdXQgdGhpc1xuXHRpZiAoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gQm9keSBjb25zdHJ1Y3RvciBkZWZhdWx0cyBvdGhlciB0aGluZ3MgdG8gc3RyaW5nXG5cdHJldHVybiAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Jztcbn07XG5cbi8qKlxuICogVGhlIEZldGNoIFN0YW5kYXJkIHRyZWF0cyB0aGlzIGFzIGlmIFwidG90YWwgYnl0ZXNcIiBpcyBhIHByb3BlcnR5IG9uIHRoZSBib2R5LlxuICogRm9yIHVzLCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZ2V0IGl0IHdpdGggYSBmdW5jdGlvbi5cbiAqXG4gKiByZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktdG90YWwtYnl0ZXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gb2JqLmJvZHkgQm9keSBvYmplY3QgZnJvbSB0aGUgQm9keSBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfVxuICovXG5jb25zdCBnZXRUb3RhbEJ5dGVzID0gcmVxdWVzdCA9PiB7XG5cdGNvbnN0IHtib2R5fSA9IHJlcXVlc3Q7XG5cblx0Ly8gQm9keSBpcyBudWxsIG9yIHVuZGVmaW5lZFxuXHRpZiAoYm9keSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBCbG9iXG5cdGlmIChpc0Jsb2IoYm9keSkpIHtcblx0XHRyZXR1cm4gYm9keS5zaXplO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBCdWZmZXJcblx0aWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuXHRcdHJldHVybiBib2R5Lmxlbmd0aDtcblx0fVxuXG5cdC8vIERldGVjdCBmb3JtIGRhdGEgaW5wdXQgZnJvbSBmb3JtLWRhdGEgbW9kdWxlXG5cdGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmdldExlbmd0aFN5bmMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gYm9keS5oYXNLbm93bkxlbmd0aCAmJiBib2R5Lmhhc0tub3duTGVuZ3RoKCkgPyBib2R5LmdldExlbmd0aFN5bmMoKSA6IG51bGw7XG5cdH1cblxuXHQvLyBCb2R5IGlzIGEgc3BlYy1jb21wbGlhbnQgZm9ybS1kYXRhXG5cdGlmIChpc0Zvcm1EYXRhKGJvZHkpKSB7XG5cdFx0cmV0dXJuIGdldEZvcm1EYXRhTGVuZ3RoKHJlcXVlc3RbSU5URVJOQUxTXS5ib3VuZGFyeSk7XG5cdH1cblxuXHQvLyBCb2R5IGlzIHN0cmVhbVxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogV3JpdGUgYSBCb2R5IHRvIGEgTm9kZS5qcyBXcml0YWJsZVN0cmVhbSAoZS5nLiBodHRwLlJlcXVlc3QpIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmVhbS5Xcml0YWJsZX0gZGVzdCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIG9iai5ib2R5IEJvZHkgb2JqZWN0IGZyb20gdGhlIEJvZHkgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgd3JpdGVUb1N0cmVhbSA9IChkZXN0LCB7Ym9keX0pID0+IHtcblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHQvLyBCb2R5IGlzIG51bGxcblx0XHRkZXN0LmVuZCgpO1xuXHR9IGVsc2UgaWYgKGlzQmxvYihib2R5KSkge1xuXHRcdC8vIEJvZHkgaXMgQmxvYlxuXHRcdGJvZHkuc3RyZWFtKCkucGlwZShkZXN0KTtcblx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHQvLyBCb2R5IGlzIGJ1ZmZlclxuXHRcdGRlc3Qud3JpdGUoYm9keSk7XG5cdFx0ZGVzdC5lbmQoKTtcblx0fSBlbHNlIHtcblx0XHQvLyBCb2R5IGlzIHN0cmVhbVxuXHRcdGJvZHkucGlwZShkZXN0KTtcblx0fVxufTtcblxuLyoqXG4gKiBIZWFkZXJzLmpzXG4gKlxuICogSGVhZGVycyBjbGFzcyBvZmZlcnMgY29udmVuaWVudCBoZWxwZXJzXG4gKi9cblxuY29uc3QgdmFsaWRhdGVIZWFkZXJOYW1lID0gdHlwZW9mIGh0dHAudmFsaWRhdGVIZWFkZXJOYW1lID09PSAnZnVuY3Rpb24nID9cblx0aHR0cC52YWxpZGF0ZUhlYWRlck5hbWUgOlxuXHRuYW1lID0+IHtcblx0XHRpZiAoIS9eW1xcXmBcXC1cXHchIyQlJicqKy58fl0rJC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc3QgZXJyID0gbmV3IFR5cGVFcnJvcihgSGVhZGVyIG5hbWUgbXVzdCBiZSBhIHZhbGlkIEhUVFAgdG9rZW4gWyR7bmFtZX1dYCk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnY29kZScsIHt2YWx1ZTogJ0VSUl9JTlZBTElEX0hUVFBfVE9LRU4nfSk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9O1xuXG5jb25zdCB2YWxpZGF0ZUhlYWRlclZhbHVlID0gdHlwZW9mIGh0dHAudmFsaWRhdGVIZWFkZXJWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/XG5cdGh0dHAudmFsaWRhdGVIZWFkZXJWYWx1ZSA6XG5cdChuYW1lLCB2YWx1ZSkgPT4ge1xuXHRcdGlmICgvW15cXHRcXHUwMDIwLVxcdTAwN0VcXHUwMDgwLVxcdTAwRkZdLy50ZXN0KHZhbHVlKSkge1xuXHRcdFx0Y29uc3QgZXJyID0gbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGNvbnRlbnQgW1wiJHtuYW1lfVwiXWApO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ2NvZGUnLCB7dmFsdWU6ICdFUlJfSU5WQUxJRF9DSEFSJ30pO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7SGVhZGVycyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBJdGVyYWJsZTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiB8IEl0ZXJhYmxlPEl0ZXJhYmxlPHN0cmluZz4+fSBIZWFkZXJzSW5pdFxuICovXG5cbi8qKlxuICogVGhpcyBGZXRjaCBBUEkgaW50ZXJmYWNlIGFsbG93cyB5b3UgdG8gcGVyZm9ybSB2YXJpb3VzIGFjdGlvbnMgb24gSFRUUCByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzLlxuICogVGhlc2UgYWN0aW9ucyBpbmNsdWRlIHJldHJpZXZpbmcsIHNldHRpbmcsIGFkZGluZyB0bywgYW5kIHJlbW92aW5nLlxuICogQSBIZWFkZXJzIG9iamVjdCBoYXMgYW4gYXNzb2NpYXRlZCBoZWFkZXIgbGlzdCwgd2hpY2ggaXMgaW5pdGlhbGx5IGVtcHR5IGFuZCBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgbmFtZSBhbmQgdmFsdWUgcGFpcnMuXG4gKiBZb3UgY2FuIGFkZCB0byB0aGlzIHVzaW5nIG1ldGhvZHMgbGlrZSBhcHBlbmQoKSAoc2VlIEV4YW1wbGVzLilcbiAqIEluIGFsbCBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlLCBoZWFkZXIgbmFtZXMgYXJlIG1hdGNoZWQgYnkgY2FzZS1pbnNlbnNpdGl2ZSBieXRlIHNlcXVlbmNlLlxuICpcbiAqL1xuY2xhc3MgSGVhZGVycyBleHRlbmRzIFVSTFNlYXJjaFBhcmFtcyB7XG5cdC8qKlxuXHQgKiBIZWFkZXJzIGNsYXNzXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge0hlYWRlcnNJbml0fSBbaW5pdF0gLSBSZXNwb25zZSBoZWFkZXJzXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihpbml0KSB7XG5cdFx0Ly8gVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBpbml0IG9iamVjdCBpbiBbbmFtZSwgdmFsdWUocyldW11cblx0XHQvKiogQHR5cGUge3N0cmluZ1tdW119ICovXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xuXHRcdGlmIChpbml0IGluc3RhbmNlb2YgSGVhZGVycykge1xuXHRcdFx0Y29uc3QgcmF3ID0gaW5pdC5yYXcoKTtcblx0XHRcdGZvciAoY29uc3QgW25hbWUsIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMocmF3KSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCguLi52YWx1ZXMubWFwKHZhbHVlID0+IFtuYW1lLCB2YWx1ZV0pKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGluaXQgPT0gbnVsbCkgOyBlbHNlIGlmICh0eXBlb2YgaW5pdCA9PT0gJ29iamVjdCcgJiYgIXV0aWwudHlwZXMuaXNCb3hlZFByaW1pdGl2ZShpbml0KSkge1xuXHRcdFx0Y29uc3QgbWV0aG9kID0gaW5pdFtTeW1ib2wuaXRlcmF0b3JdO1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsIGVxZXFlcVxuXHRcdFx0aWYgKG1ldGhvZCA9PSBudWxsKSB7XG5cdFx0XHRcdC8vIFJlY29yZDxCeXRlU3RyaW5nLCBCeXRlU3RyaW5nPlxuXHRcdFx0XHRyZXN1bHQucHVzaCguLi5PYmplY3QuZW50cmllcyhpbml0KSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlciBwYWlycyBtdXN0IGJlIGl0ZXJhYmxlJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj5cblx0XHRcdFx0Ly8gTm90ZTogcGVyIHNwZWMgd2UgaGF2ZSB0byBmaXJzdCBleGhhdXN0IHRoZSBsaXN0cyB0aGVuIHByb2Nlc3MgdGhlbVxuXHRcdFx0XHRyZXN1bHQgPSBbLi4uaW5pdF1cblx0XHRcdFx0XHQubWFwKHBhaXIgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgcGFpciAhPT0gJ29iamVjdCcgfHwgdXRpbC50eXBlcy5pc0JveGVkUHJpbWl0aXZlKHBhaXIpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRWFjaCBoZWFkZXIgcGFpciBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9iamVjdCcpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gWy4uLnBhaXJdO1xuXHRcdFx0XHRcdH0pLm1hcChwYWlyID0+IHtcblx0XHRcdFx0XHRcdGlmIChwYWlyLmxlbmd0aCAhPT0gMikge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFYWNoIGhlYWRlciBwYWlyIG11c3QgYmUgYSBuYW1lL3ZhbHVlIHR1cGxlJyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBbLi4ucGFpcl07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBjb25zdHJ1Y3QgXFwnSGVhZGVyc1xcJzogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlIFxcJyhzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4gb3IgcmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+KScpO1xuXHRcdH1cblxuXHRcdC8vIFZhbGlkYXRlIGFuZCBsb3dlcmNhc2Vcblx0XHRyZXN1bHQgPVxuXHRcdFx0cmVzdWx0Lmxlbmd0aCA+IDAgP1xuXHRcdFx0XHRyZXN1bHQubWFwKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJOYW1lKG5hbWUpO1xuXHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyVmFsdWUobmFtZSwgU3RyaW5nKHZhbHVlKSk7XG5cdFx0XHRcdFx0cmV0dXJuIFtTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKSwgU3RyaW5nKHZhbHVlKV07XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0dW5kZWZpbmVkO1xuXG5cdFx0c3VwZXIocmVzdWx0KTtcblxuXHRcdC8vIFJldHVybmluZyBhIFByb3h5IHRoYXQgd2lsbCBsb3dlcmNhc2Uga2V5IG5hbWVzLCB2YWxpZGF0ZSBwYXJhbWV0ZXJzIGFuZCBzb3J0IGtleXNcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RydWN0b3ItcmV0dXJuXG5cdFx0cmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG5cdFx0XHRnZXQodGFyZ2V0LCBwLCByZWNlaXZlcikge1xuXHRcdFx0XHRzd2l0Y2ggKHApIHtcblx0XHRcdFx0XHRjYXNlICdhcHBlbmQnOlxuXHRcdFx0XHRcdGNhc2UgJ3NldCc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG5hbWUsIHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyTmFtZShuYW1lKTtcblx0XHRcdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJWYWx1ZShuYW1lLCBTdHJpbmcodmFsdWUpKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbcF0uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRyZWNlaXZlcixcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcodmFsdWUpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Y2FzZSAnZGVsZXRlJzpcblx0XHRcdFx0XHRjYXNlICdoYXMnOlxuXHRcdFx0XHRcdGNhc2UgJ2dldEFsbCc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gbmFtZSA9PiB7XG5cdFx0XHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyTmFtZShuYW1lKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbcF0uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRyZWNlaXZlcixcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGNhc2UgJ2tleXMnOlxuXHRcdFx0XHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0LnNvcnQoKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG5ldyBTZXQoVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5rZXlzLmNhbGwodGFyZ2V0KSkua2V5cygpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8qIGM4IGlnbm9yZSBuZXh0ICovXG5cdFx0fSk7XG5cdH1cblxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcblx0fVxuXG5cdHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdH1cblxuXHRnZXQobmFtZSkge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuXHRcdGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRsZXQgdmFsdWUgPSB2YWx1ZXMuam9pbignLCAnKTtcblx0XHRpZiAoL15jb250ZW50LWVuY29kaW5nJC9pLnRlc3QobmFtZSkpIHtcblx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRmb3JFYWNoKGNhbGxiYWNrKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHRjYWxsYmFjayh0aGlzLmdldChuYW1lKSwgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0KiB2YWx1ZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHR5aWVsZCB0aGlzLmdldChuYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHR5cGUgeygpID0+IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT59XG5cdCAqL1xuXHQqIGVudHJpZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHR5aWVsZCBbbmFtZSwgdGhpcy5nZXQobmFtZSldO1xuXHRcdH1cblx0fVxuXG5cdFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOb2RlLWZldGNoIG5vbi1zcGVjIG1ldGhvZFxuXHQgKiByZXR1cm5pbmcgYWxsIGhlYWRlcnMgYW5kIHRoZWlyIHZhbHVlcyBhcyBhcnJheVxuXHQgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fVxuXHQgKi9cblx0cmF3KCkge1xuXHRcdHJldHVybiBbLi4udGhpcy5rZXlzKCldLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcblx0XHRcdHJlc3VsdFtrZXldID0gdGhpcy5nZXRBbGwoa2V5KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSwge30pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZvciBiZXR0ZXIgY29uc29sZS5sb2coaGVhZGVycykgYW5kIGFsc28gdG8gY29udmVydCBIZWFkZXJzIGludG8gTm9kZS5qcyBSZXF1ZXN0IGNvbXBhdGlibGUgZm9ybWF0XG5cdCAqL1xuXHRbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0oKSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLmtleXMoKV0ucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5nZXRBbGwoa2V5KTtcblx0XHRcdC8vIEh0dHAucmVxdWVzdCgpIG9ubHkgc3VwcG9ydHMgc3RyaW5nIGFzIEhvc3QgaGVhZGVyLlxuXHRcdFx0Ly8gVGhpcyBoYWNrIG1ha2VzIHNwZWNpZnlpbmcgY3VzdG9tIEhvc3QgaGVhZGVyIHBvc3NpYmxlLlxuXHRcdFx0aWYgKGtleSA9PT0gJ2hvc3QnKSB7XG5cdFx0XHRcdHJlc3VsdFtrZXldID0gdmFsdWVzWzBdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSB2YWx1ZXMubGVuZ3RoID4gMSA/IHZhbHVlcyA6IHZhbHVlc1swXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LCB7fSk7XG5cdH1cbn1cblxuLyoqXG4gKiBSZS1zaGFwaW5nIG9iamVjdCBmb3IgV2ViIElETCB0ZXN0c1xuICogT25seSBuZWVkIHRvIGRvIGl0IGZvciBvdmVycmlkZGVuIG1ldGhvZHNcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG5cdEhlYWRlcnMucHJvdG90eXBlLFxuXHRbJ2dldCcsICdlbnRyaWVzJywgJ2ZvckVhY2gnLCAndmFsdWVzJ10ucmVkdWNlKChyZXN1bHQsIHByb3BlcnR5KSA9PiB7XG5cdFx0cmVzdWx0W3Byb3BlcnR5XSA9IHtlbnVtZXJhYmxlOiB0cnVlfTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCB7fSlcbik7XG5cbi8qKlxuICogQ3JlYXRlIGEgSGVhZGVycyBvYmplY3QgZnJvbSBhbiBodHRwLkluY29taW5nTWVzc2FnZS5yYXdIZWFkZXJzLCBpZ25vcmluZyB0aG9zZSB0aGF0IGRvXG4gKiBub3QgY29uZm9ybSB0byBIVFRQIGdyYW1tYXIgcHJvZHVjdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydCgnaHR0cCcpLkluY29taW5nTWVzc2FnZVsncmF3SGVhZGVycyddfSBoZWFkZXJzXG4gKi9cbmZ1bmN0aW9uIGZyb21SYXdIZWFkZXJzKGhlYWRlcnMgPSBbXSkge1xuXHRyZXR1cm4gbmV3IEhlYWRlcnMoXG5cdFx0aGVhZGVyc1xuXHRcdFx0Ly8gU3BsaXQgaW50byBwYWlyc1xuXHRcdFx0LnJlZHVjZSgocmVzdWx0LCB2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG5cdFx0XHRcdGlmIChpbmRleCAlIDIgPT09IDApIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChhcnJheS5zbGljZShpbmRleCwgaW5kZXggKyAyKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSwgW10pXG5cdFx0XHQuZmlsdGVyKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJOYW1lKG5hbWUpO1xuXHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyVmFsdWUobmFtZSwgU3RyaW5nKHZhbHVlKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHQpO1xufVxuXG5jb25zdCByZWRpcmVjdFN0YXR1cyA9IG5ldyBTZXQoWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XSk7XG5cbi8qKlxuICogUmVkaXJlY3QgY29kZSBtYXRjaGluZ1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIC0gU3RhdHVzIGNvZGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUmVkaXJlY3QgPSBjb2RlID0+IHtcblx0cmV0dXJuIHJlZGlyZWN0U3RhdHVzLmhhcyhjb2RlKTtcbn07XG5cbi8qKlxuICogUmVzcG9uc2UuanNcbiAqXG4gKiBSZXNwb25zZSBjbGFzcyBwcm92aWRlcyBjb250ZW50IGRlY29kaW5nXG4gKi9cblxuY29uc3QgSU5URVJOQUxTJDEgPSBTeW1ib2woJ1Jlc3BvbnNlIGludGVybmFscycpO1xuXG4vKipcbiAqIFJlc3BvbnNlIGNsYXNzXG4gKlxuICogQHBhcmFtICAgU3RyZWFtICBib2R5ICBSZWFkYWJsZSBzdHJlYW1cbiAqIEBwYXJhbSAgIE9iamVjdCAgb3B0cyAgUmVzcG9uc2Ugb3B0aW9uc1xuICogQHJldHVybiAgVm9pZFxuICovXG5jbGFzcyBSZXNwb25zZSBleHRlbmRzIEJvZHkge1xuXHRjb25zdHJ1Y3Rvcihib2R5ID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0c3VwZXIoYm9keSwgb3B0aW9ucyk7XG5cblx0XHRjb25zdCBzdGF0dXMgPSBvcHRpb25zLnN0YXR1cyB8fCAyMDA7XG5cdFx0Y29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG5cblx0XHRpZiAoYm9keSAhPT0gbnVsbCAmJiAhaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpKSB7XG5cdFx0XHRjb25zdCBjb250ZW50VHlwZSA9IGV4dHJhY3RDb250ZW50VHlwZShib2R5KTtcblx0XHRcdGlmIChjb250ZW50VHlwZSkge1xuXHRcdFx0XHRoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgY29udGVudFR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTJDFdID0ge1xuXHRcdFx0dXJsOiBvcHRpb25zLnVybCxcblx0XHRcdHN0YXR1cyxcblx0XHRcdHN0YXR1c1RleHQ6IG9wdGlvbnMuc3RhdHVzVGV4dCB8fCAnJyxcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRjb3VudGVyOiBvcHRpb25zLmNvdW50ZXIsXG5cdFx0XHRoaWdoV2F0ZXJNYXJrOiBvcHRpb25zLmhpZ2hXYXRlck1hcmtcblx0XHR9O1xuXHR9XG5cblx0Z2V0IHVybCgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0udXJsIHx8ICcnO1xuXHR9XG5cblx0Z2V0IHN0YXR1cygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0uc3RhdHVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIHByb3BlcnR5IHJlcHJlc2VudGluZyBpZiB0aGUgcmVxdWVzdCBlbmRlZCBub3JtYWxseVxuXHQgKi9cblx0Z2V0IG9rKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXMgPj0gMjAwICYmIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1cyA8IDMwMDtcblx0fVxuXG5cdGdldCByZWRpcmVjdGVkKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5jb3VudGVyID4gMDtcblx0fVxuXG5cdGdldCBzdGF0dXNUZXh0KCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXNUZXh0O1xuXHR9XG5cblx0Z2V0IGhlYWRlcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLmhlYWRlcnM7XG5cdH1cblxuXHRnZXQgaGlnaFdhdGVyTWFyaygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0uaGlnaFdhdGVyTWFyaztcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9uZSB0aGlzIHJlc3BvbnNlXG5cdCAqXG5cdCAqIEByZXR1cm4gIFJlc3BvbnNlXG5cdCAqL1xuXHRjbG9uZSgpIHtcblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNlKGNsb25lKHRoaXMsIHRoaXMuaGlnaFdhdGVyTWFyayksIHtcblx0XHRcdHVybDogdGhpcy51cmwsXG5cdFx0XHRzdGF0dXM6IHRoaXMuc3RhdHVzLFxuXHRcdFx0c3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0b2s6IHRoaXMub2ssXG5cdFx0XHRyZWRpcmVjdGVkOiB0aGlzLnJlZGlyZWN0ZWQsXG5cdFx0XHRzaXplOiB0aGlzLnNpemVcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsICAgIFRoZSBVUkwgdGhhdCB0aGUgbmV3IHJlc3BvbnNlIGlzIHRvIG9yaWdpbmF0ZSBmcm9tLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzIEFuIG9wdGlvbmFsIHN0YXR1cyBjb2RlIGZvciB0aGUgcmVzcG9uc2UgKGUuZy4sIDMwMi4pXG5cdCAqIEByZXR1cm5zIHtSZXNwb25zZX0gICAgQSBSZXNwb25zZSBvYmplY3QuXG5cdCAqL1xuXHRzdGF0aWMgcmVkaXJlY3QodXJsLCBzdGF0dXMgPSAzMDIpIHtcblx0XHRpZiAoIWlzUmVkaXJlY3Qoc3RhdHVzKSkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFwicmVkaXJlY3RcIiBvbiBcInJlc3BvbnNlXCI6IEludmFsaWQgc3RhdHVzIGNvZGUnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0bG9jYXRpb246IG5ldyBVUkwodXJsKS50b1N0cmluZygpXG5cdFx0XHR9LFxuXHRcdFx0c3RhdHVzXG5cdFx0fSk7XG5cdH1cblxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG5cdFx0cmV0dXJuICdSZXNwb25zZSc7XG5cdH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG5cdHVybDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRzdGF0dXM6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0b2s6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0cmVkaXJlY3RlZDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRzdGF0dXNUZXh0OiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGhlYWRlcnM6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0Y2xvbmU6IHtlbnVtZXJhYmxlOiB0cnVlfVxufSk7XG5cbmNvbnN0IGdldFNlYXJjaCA9IHBhcnNlZFVSTCA9PiB7XG5cdGlmIChwYXJzZWRVUkwuc2VhcmNoKSB7XG5cdFx0cmV0dXJuIHBhcnNlZFVSTC5zZWFyY2g7XG5cdH1cblxuXHRjb25zdCBsYXN0T2Zmc2V0ID0gcGFyc2VkVVJMLmhyZWYubGVuZ3RoIC0gMTtcblx0Y29uc3QgaGFzaCA9IHBhcnNlZFVSTC5oYXNoIHx8IChwYXJzZWRVUkwuaHJlZltsYXN0T2Zmc2V0XSA9PT0gJyMnID8gJyMnIDogJycpO1xuXHRyZXR1cm4gcGFyc2VkVVJMLmhyZWZbbGFzdE9mZnNldCAtIGhhc2gubGVuZ3RoXSA9PT0gJz8nID8gJz8nIDogJyc7XG59O1xuXG5jb25zdCBJTlRFUk5BTFMkMiA9IFN5bWJvbCgnUmVxdWVzdCBpbnRlcm5hbHMnKTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBpbnN0YW5jZSBvZiBSZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSAgeyp9IG9ialxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNSZXF1ZXN0ID0gb2JqZWN0ID0+IHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3RbSU5URVJOQUxTJDJdID09PSAnb2JqZWN0J1xuXHQpO1xufTtcblxuLyoqXG4gKiBSZXF1ZXN0IGNsYXNzXG4gKlxuICogQHBhcmFtICAgTWl4ZWQgICBpbnB1dCAgVXJsIG9yIFJlcXVlc3QgaW5zdGFuY2VcbiAqIEBwYXJhbSAgIE9iamVjdCAgaW5pdCAgIEN1c3RvbSBvcHRpb25zXG4gKiBAcmV0dXJuICBWb2lkXG4gKi9cbmNsYXNzIFJlcXVlc3QgZXh0ZW5kcyBCb2R5IHtcblx0Y29uc3RydWN0b3IoaW5wdXQsIGluaXQgPSB7fSkge1xuXHRcdGxldCBwYXJzZWRVUkw7XG5cblx0XHQvLyBOb3JtYWxpemUgaW5wdXQgYW5kIGZvcmNlIFVSTCB0byBiZSBlbmNvZGVkIGFzIFVURi04IChodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL2lzc3Vlcy8yNDUpXG5cdFx0aWYgKGlzUmVxdWVzdChpbnB1dCkpIHtcblx0XHRcdHBhcnNlZFVSTCA9IG5ldyBVUkwoaW5wdXQudXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyc2VkVVJMID0gbmV3IFVSTChpbnB1dCk7XG5cdFx0XHRpbnB1dCA9IHt9O1xuXHRcdH1cblxuXHRcdGxldCBtZXRob2QgPSBpbml0Lm1ldGhvZCB8fCBpbnB1dC5tZXRob2QgfHwgJ0dFVCc7XG5cdFx0bWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCwgZXFlcWVxXG5cdFx0aWYgKCgoaW5pdC5ib2R5ICE9IG51bGwgfHwgaXNSZXF1ZXN0KGlucHV0KSkgJiYgaW5wdXQuYm9keSAhPT0gbnVsbCkgJiZcblx0XHRcdChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5Jyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5wdXRCb2R5ID0gaW5pdC5ib2R5ID9cblx0XHRcdGluaXQuYm9keSA6XG5cdFx0XHQoaXNSZXF1ZXN0KGlucHV0KSAmJiBpbnB1dC5ib2R5ICE9PSBudWxsID9cblx0XHRcdFx0Y2xvbmUoaW5wdXQpIDpcblx0XHRcdFx0bnVsbCk7XG5cblx0XHRzdXBlcihpbnB1dEJvZHksIHtcblx0XHRcdHNpemU6IGluaXQuc2l6ZSB8fCBpbnB1dC5zaXplIHx8IDBcblx0XHR9KTtcblxuXHRcdGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMgfHwgaW5wdXQuaGVhZGVycyB8fCB7fSk7XG5cblx0XHRpZiAoaW5wdXRCb2R5ICE9PSBudWxsICYmICFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gZXh0cmFjdENvbnRlbnRUeXBlKGlucHV0Qm9keSwgdGhpcyk7XG5cdFx0XHRpZiAoY29udGVudFR5cGUpIHtcblx0XHRcdFx0aGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc2lnbmFsID0gaXNSZXF1ZXN0KGlucHV0KSA/XG5cdFx0XHRpbnB1dC5zaWduYWwgOlxuXHRcdFx0bnVsbDtcblx0XHRpZiAoJ3NpZ25hbCcgaW4gaW5pdCkge1xuXHRcdFx0c2lnbmFsID0gaW5pdC5zaWduYWw7XG5cdFx0fVxuXG5cdFx0aWYgKHNpZ25hbCAhPT0gbnVsbCAmJiAhaXNBYm9ydFNpZ25hbChzaWduYWwpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBzaWduYWwgdG8gYmUgYW4gaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCcpO1xuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTJDJdID0ge1xuXHRcdFx0bWV0aG9kLFxuXHRcdFx0cmVkaXJlY3Q6IGluaXQucmVkaXJlY3QgfHwgaW5wdXQucmVkaXJlY3QgfHwgJ2ZvbGxvdycsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0cGFyc2VkVVJMLFxuXHRcdFx0c2lnbmFsXG5cdFx0fTtcblxuXHRcdC8vIE5vZGUtZmV0Y2gtb25seSBvcHRpb25zXG5cdFx0dGhpcy5mb2xsb3cgPSBpbml0LmZvbGxvdyA9PT0gdW5kZWZpbmVkID8gKGlucHV0LmZvbGxvdyA9PT0gdW5kZWZpbmVkID8gMjAgOiBpbnB1dC5mb2xsb3cpIDogaW5pdC5mb2xsb3c7XG5cdFx0dGhpcy5jb21wcmVzcyA9IGluaXQuY29tcHJlc3MgPT09IHVuZGVmaW5lZCA/IChpbnB1dC5jb21wcmVzcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGlucHV0LmNvbXByZXNzKSA6IGluaXQuY29tcHJlc3M7XG5cdFx0dGhpcy5jb3VudGVyID0gaW5pdC5jb3VudGVyIHx8IGlucHV0LmNvdW50ZXIgfHwgMDtcblx0XHR0aGlzLmFnZW50ID0gaW5pdC5hZ2VudCB8fCBpbnB1dC5hZ2VudDtcblx0XHR0aGlzLmhpZ2hXYXRlck1hcmsgPSBpbml0LmhpZ2hXYXRlck1hcmsgfHwgaW5wdXQuaGlnaFdhdGVyTWFyayB8fCAxNjM4NDtcblx0XHR0aGlzLmluc2VjdXJlSFRUUFBhcnNlciA9IGluaXQuaW5zZWN1cmVIVFRQUGFyc2VyIHx8IGlucHV0Lmluc2VjdXJlSFRUUFBhcnNlciB8fCBmYWxzZTtcblx0fVxuXG5cdGdldCBtZXRob2QoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLm1ldGhvZDtcblx0fVxuXG5cdGdldCB1cmwoKSB7XG5cdFx0cmV0dXJuIHVybC5mb3JtYXQodGhpc1tJTlRFUk5BTFMkMl0ucGFyc2VkVVJMKTtcblx0fVxuXG5cdGdldCBoZWFkZXJzKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQyXS5oZWFkZXJzO1xuXHR9XG5cblx0Z2V0IHJlZGlyZWN0KCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQyXS5yZWRpcmVjdDtcblx0fVxuXG5cdGdldCBzaWduYWwoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLnNpZ25hbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9uZSB0aGlzIHJlcXVlc3Rcblx0ICpcblx0ICogQHJldHVybiAgUmVxdWVzdFxuXHQgKi9cblx0Y2xvbmUoKSB7XG5cdFx0cmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMpO1xuXHR9XG5cblx0Z2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuXHRcdHJldHVybiAnUmVxdWVzdCc7XG5cdH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVxdWVzdC5wcm90b3R5cGUsIHtcblx0bWV0aG9kOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHVybDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRoZWFkZXJzOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHJlZGlyZWN0OiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGNsb25lOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHNpZ25hbDoge2VudW1lcmFibGU6IHRydWV9XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgUmVxdWVzdCB0byBOb2RlLmpzIGh0dHAgcmVxdWVzdCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSAgIFJlcXVlc3QgIEEgUmVxdWVzdCBpbnN0YW5jZVxuICogQHJldHVybiAgT2JqZWN0ICAgVGhlIG9wdGlvbnMgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byBodHRwLnJlcXVlc3RcbiAqL1xuY29uc3QgZ2V0Tm9kZVJlcXVlc3RPcHRpb25zID0gcmVxdWVzdCA9PiB7XG5cdGNvbnN0IHtwYXJzZWRVUkx9ID0gcmVxdWVzdFtJTlRFUk5BTFMkMl07XG5cdGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXF1ZXN0W0lOVEVSTkFMUyQyXS5oZWFkZXJzKTtcblxuXHQvLyBGZXRjaCBzdGVwIDEuM1xuXHRpZiAoIWhlYWRlcnMuaGFzKCdBY2NlcHQnKSkge1xuXHRcdGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnKi8qJyk7XG5cdH1cblxuXHQvLyBIVFRQLW5ldHdvcmstb3ItY2FjaGUgZmV0Y2ggc3RlcHMgMi40LTIuN1xuXHRsZXQgY29udGVudExlbmd0aFZhbHVlID0gbnVsbDtcblx0aWYgKHJlcXVlc3QuYm9keSA9PT0gbnVsbCAmJiAvXihwb3N0fHB1dCkkL2kudGVzdChyZXF1ZXN0Lm1ldGhvZCkpIHtcblx0XHRjb250ZW50TGVuZ3RoVmFsdWUgPSAnMCc7XG5cdH1cblxuXHRpZiAocmVxdWVzdC5ib2R5ICE9PSBudWxsKSB7XG5cdFx0Y29uc3QgdG90YWxCeXRlcyA9IGdldFRvdGFsQnl0ZXMocmVxdWVzdCk7XG5cdFx0Ly8gU2V0IENvbnRlbnQtTGVuZ3RoIGlmIHRvdGFsQnl0ZXMgaXMgYSBudW1iZXIgKHRoYXQgaXMgbm90IE5hTilcblx0XHRpZiAodHlwZW9mIHRvdGFsQnl0ZXMgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odG90YWxCeXRlcykpIHtcblx0XHRcdGNvbnRlbnRMZW5ndGhWYWx1ZSA9IFN0cmluZyh0b3RhbEJ5dGVzKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoY29udGVudExlbmd0aFZhbHVlKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0NvbnRlbnQtTGVuZ3RoJywgY29udGVudExlbmd0aFZhbHVlKTtcblx0fVxuXG5cdC8vIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBzdGVwIDIuMTFcblx0aWYgKCFoZWFkZXJzLmhhcygnVXNlci1BZ2VudCcpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCAnbm9kZS1mZXRjaCcpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIHN0ZXAgMi4xNVxuXHRpZiAocmVxdWVzdC5jb21wcmVzcyAmJiAhaGVhZGVycy5oYXMoJ0FjY2VwdC1FbmNvZGluZycpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0FjY2VwdC1FbmNvZGluZycsICdnemlwLGRlZmxhdGUsYnInKTtcblx0fVxuXG5cdGxldCB7YWdlbnR9ID0gcmVxdWVzdDtcblx0aWYgKHR5cGVvZiBhZ2VudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGFnZW50ID0gYWdlbnQocGFyc2VkVVJMKTtcblx0fVxuXG5cdGlmICghaGVhZGVycy5oYXMoJ0Nvbm5lY3Rpb24nKSAmJiAhYWdlbnQpIHtcblx0XHRoZWFkZXJzLnNldCgnQ29ubmVjdGlvbicsICdjbG9zZScpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrIGZldGNoIHN0ZXAgNC4yXG5cdC8vIGNodW5rZWQgZW5jb2RpbmcgaXMgaGFuZGxlZCBieSBOb2RlLmpzXG5cblx0Y29uc3Qgc2VhcmNoID0gZ2V0U2VhcmNoKHBhcnNlZFVSTCk7XG5cblx0Ly8gTWFudWFsbHkgc3ByZWFkIHRoZSBVUkwgb2JqZWN0IGluc3RlYWQgb2Ygc3ByZWFkIHN5bnRheFxuXHRjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcblx0XHRwYXRoOiBwYXJzZWRVUkwucGF0aG5hbWUgKyBzZWFyY2gsXG5cdFx0cGF0aG5hbWU6IHBhcnNlZFVSTC5wYXRobmFtZSxcblx0XHRob3N0bmFtZTogcGFyc2VkVVJMLmhvc3RuYW1lLFxuXHRcdHByb3RvY29sOiBwYXJzZWRVUkwucHJvdG9jb2wsXG5cdFx0cG9ydDogcGFyc2VkVVJMLnBvcnQsXG5cdFx0aGFzaDogcGFyc2VkVVJMLmhhc2gsXG5cdFx0c2VhcmNoOiBwYXJzZWRVUkwuc2VhcmNoLFxuXHRcdHF1ZXJ5OiBwYXJzZWRVUkwucXVlcnksXG5cdFx0aHJlZjogcGFyc2VkVVJMLmhyZWYsXG5cdFx0bWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcblx0XHRoZWFkZXJzOiBoZWFkZXJzW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldKCksXG5cdFx0aW5zZWN1cmVIVFRQUGFyc2VyOiByZXF1ZXN0Lmluc2VjdXJlSFRUUFBhcnNlcixcblx0XHRhZ2VudFxuXHR9O1xuXG5cdHJldHVybiByZXF1ZXN0T3B0aW9ucztcbn07XG5cbi8qKlxuICogQWJvcnRFcnJvciBpbnRlcmZhY2UgZm9yIGNhbmNlbGxlZCByZXF1ZXN0c1xuICovXG5jbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRmV0Y2hCYXNlRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlLCB0eXBlID0gJ2Fib3J0ZWQnKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgdHlwZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBJbmRleC5qc1xuICpcbiAqIGEgcmVxdWVzdCBBUEkgY29tcGF0aWJsZSB3aXRoIHdpbmRvdy5mZXRjaFxuICpcbiAqIEFsbCBzcGVjIGFsZ29yaXRobSBzdGVwIG51bWJlcnMgYXJlIGJhc2VkIG9uIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnL2NvbW1pdC1zbmFwc2hvdHMvYWU3MTY4MjJjYjNhNjE4NDMyMjZjZDA5MGVlZmM2NTg5NDQ2YzFkMi8uXG4gKi9cblxuY29uc3Qgc3VwcG9ydGVkU2NoZW1hcyA9IG5ldyBTZXQoWydkYXRhOicsICdodHRwOicsICdodHRwczonXSk7XG5cbi8qKlxuICogRmV0Y2ggZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0gICB7c3RyaW5nIHwgVVJMIHwgaW1wb3J0KCcuL3JlcXVlc3QnKS5kZWZhdWx0fSB1cmwgLSBBYnNvbHV0ZSB1cmwgb3IgUmVxdWVzdCBpbnN0YW5jZVxuICogQHBhcmFtICAgeyp9IFtvcHRpb25zX10gLSBGZXRjaCBvcHRpb25zXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxpbXBvcnQoJy4vcmVzcG9uc2UnKS5kZWZhdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2godXJsLCBvcHRpb25zXykge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdC8vIEJ1aWxkIHJlcXVlc3Qgb2JqZWN0XG5cdFx0Y29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwgb3B0aW9uc18pO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXROb2RlUmVxdWVzdE9wdGlvbnMocmVxdWVzdCk7XG5cdFx0aWYgKCFzdXBwb3J0ZWRTY2hlbWFzLmhhcyhvcHRpb25zLnByb3RvY29sKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgbm9kZS1mZXRjaCBjYW5ub3QgbG9hZCAke3VybH0uIFVSTCBzY2hlbWUgXCIke29wdGlvbnMucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJyl9XCIgaXMgbm90IHN1cHBvcnRlZC5gKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5wcm90b2NvbCA9PT0gJ2RhdGE6Jykge1xuXHRcdFx0Y29uc3QgZGF0YSA9IGRhdGFVcmlUb0J1ZmZlcihyZXF1ZXN0LnVybCk7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZShkYXRhLCB7aGVhZGVyczogeydDb250ZW50LVR5cGUnOiBkYXRhLnR5cGVGdWxsfX0pO1xuXHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gV3JhcCBodHRwLnJlcXVlc3QgaW50byBmZXRjaFxuXHRcdGNvbnN0IHNlbmQgPSAob3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBodHRwcyA6IGh0dHApLnJlcXVlc3Q7XG5cdFx0Y29uc3Qge3NpZ25hbH0gPSByZXF1ZXN0O1xuXHRcdGxldCByZXNwb25zZSA9IG51bGw7XG5cblx0XHRjb25zdCBhYm9ydCA9ICgpID0+IHtcblx0XHRcdGNvbnN0IGVycm9yID0gbmV3IEFib3J0RXJyb3IoJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJyk7XG5cdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0aWYgKHJlcXVlc3QuYm9keSAmJiByZXF1ZXN0LmJvZHkgaW5zdGFuY2VvZiBTdHJlYW0uUmVhZGFibGUpIHtcblx0XHRcdFx0cmVxdWVzdC5ib2R5LmRlc3Ryb3koZXJyb3IpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5ib2R5KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2UuYm9keS5lbWl0KCdlcnJvcicsIGVycm9yKTtcblx0XHR9O1xuXG5cdFx0aWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkge1xuXHRcdFx0YWJvcnQoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhYm9ydEFuZEZpbmFsaXplID0gKCkgPT4ge1xuXHRcdFx0YWJvcnQoKTtcblx0XHRcdGZpbmFsaXplKCk7XG5cdFx0fTtcblxuXHRcdC8vIFNlbmQgcmVxdWVzdFxuXHRcdGNvbnN0IHJlcXVlc3RfID0gc2VuZChvcHRpb25zKTtcblxuXHRcdGlmIChzaWduYWwpIHtcblx0XHRcdHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QW5kRmluYWxpemUpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpbmFsaXplID0gKCkgPT4ge1xuXHRcdFx0cmVxdWVzdF8uYWJvcnQoKTtcblx0XHRcdGlmIChzaWduYWwpIHtcblx0XHRcdFx0c2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJlcXVlc3RfLm9uKCdlcnJvcicsIGVyciA9PiB7XG5cdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYHJlcXVlc3QgdG8gJHtyZXF1ZXN0LnVybH0gZmFpbGVkLCByZWFzb246ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycikpO1xuXHRcdFx0ZmluYWxpemUoKTtcblx0XHR9KTtcblxuXHRcdHJlcXVlc3RfLm9uKCdyZXNwb25zZScsIHJlc3BvbnNlXyA9PiB7XG5cdFx0XHRyZXF1ZXN0Xy5zZXRUaW1lb3V0KDApO1xuXHRcdFx0Y29uc3QgaGVhZGVycyA9IGZyb21SYXdIZWFkZXJzKHJlc3BvbnNlXy5yYXdIZWFkZXJzKTtcblxuXHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDVcblx0XHRcdGlmIChpc1JlZGlyZWN0KHJlc3BvbnNlXy5zdGF0dXNDb2RlKSkge1xuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS4yXG5cdFx0XHRcdGNvbnN0IGxvY2F0aW9uID0gaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk7XG5cblx0XHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDUuM1xuXHRcdFx0XHRjb25zdCBsb2NhdGlvblVSTCA9IGxvY2F0aW9uID09PSBudWxsID8gbnVsbCA6IG5ldyBVUkwobG9jYXRpb24sIHJlcXVlc3QudXJsKTtcblxuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS41XG5cdFx0XHRcdHN3aXRjaCAocmVxdWVzdC5yZWRpcmVjdCkge1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9yJzpcblx0XHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgdXJpIHJlcXVlc3RlZCByZXNwb25kcyB3aXRoIGEgcmVkaXJlY3QsIHJlZGlyZWN0IG1vZGUgaXMgc2V0IHRvIGVycm9yOiAke3JlcXVlc3QudXJsfWAsICduby1yZWRpcmVjdCcpKTtcblx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0Y2FzZSAnbWFudWFsJzpcblx0XHRcdFx0XHRcdC8vIE5vZGUtZmV0Y2gtc3BlY2lmaWMgc3RlcDogbWFrZSBtYW51YWwgcmVkaXJlY3QgYSBiaXQgZWFzaWVyIHRvIHVzZSBieSBzZXR0aW5nIHRoZSBMb2NhdGlvbiBoZWFkZXIgdmFsdWUgdG8gdGhlIHJlc29sdmVkIFVSTC5cblx0XHRcdFx0XHRcdGlmIChsb2NhdGlvblVSTCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgY29ycnVwdGVkIGhlYWRlclxuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGhlYWRlcnMuc2V0KCdMb2NhdGlvbicsIGxvY2F0aW9uVVJMKTtcblx0XHRcdFx0XHRcdFx0XHQvKiBjOCBpZ25vcmUgbmV4dCAzICovXG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmb2xsb3cnOiB7XG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMlxuXHRcdFx0XHRcdFx0aWYgKGxvY2F0aW9uVVJMID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgNVxuXHRcdFx0XHRcdFx0aWYgKHJlcXVlc3QuY291bnRlciA+PSByZXF1ZXN0LmZvbGxvdykge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYG1heGltdW0gcmVkaXJlY3QgcmVhY2hlZCBhdDogJHtyZXF1ZXN0LnVybH1gLCAnbWF4LXJlZGlyZWN0JykpO1xuXHRcdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCA2IChjb3VudGVyIGluY3JlbWVudClcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBSZXF1ZXN0IG9iamVjdC5cblx0XHRcdFx0XHRcdGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRoZWFkZXJzOiBuZXcgSGVhZGVycyhyZXF1ZXN0LmhlYWRlcnMpLFxuXHRcdFx0XHRcdFx0XHRmb2xsb3c6IHJlcXVlc3QuZm9sbG93LFxuXHRcdFx0XHRcdFx0XHRjb3VudGVyOiByZXF1ZXN0LmNvdW50ZXIgKyAxLFxuXHRcdFx0XHRcdFx0XHRhZ2VudDogcmVxdWVzdC5hZ2VudCxcblx0XHRcdFx0XHRcdFx0Y29tcHJlc3M6IHJlcXVlc3QuY29tcHJlc3MsXG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHJlcXVlc3QuYm9keSxcblx0XHRcdFx0XHRcdFx0c2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcblx0XHRcdFx0XHRcdFx0c2l6ZTogcmVxdWVzdC5zaXplXG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgOVxuXHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlXy5zdGF0dXNDb2RlICE9PSAzMDMgJiYgcmVxdWVzdC5ib2R5ICYmIG9wdGlvbnNfLmJvZHkgaW5zdGFuY2VvZiBTdHJlYW0uUmVhZGFibGUpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKCdDYW5ub3QgZm9sbG93IHJlZGlyZWN0IHdpdGggYm9keSBiZWluZyBhIHJlYWRhYmxlIHN0cmVhbScsICd1bnN1cHBvcnRlZC1yZWRpcmVjdCcpKTtcblx0XHRcdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMTFcblx0XHRcdFx0XHRcdGlmIChyZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzAzIHx8ICgocmVzcG9uc2VfLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzAyKSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnKSkge1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0T3B0aW9ucy5tZXRob2QgPSAnR0VUJztcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE9wdGlvbnMuYm9keSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ2NvbnRlbnQtbGVuZ3RoJyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCAxNVxuXHRcdFx0XHRcdFx0cmVzb2x2ZShmZXRjaChuZXcgUmVxdWVzdChsb2NhdGlvblVSTCwgcmVxdWVzdE9wdGlvbnMpKSk7XG5cdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBEbyBub3RoaW5nXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUHJlcGFyZSByZXNwb25zZVxuXHRcdFx0cmVzcG9uc2VfLm9uY2UoJ2VuZCcsICgpID0+IHtcblx0XHRcdFx0aWYgKHNpZ25hbCkge1xuXHRcdFx0XHRcdHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QW5kRmluYWxpemUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bGV0IGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUocmVzcG9uc2VfLCBuZXcgU3RyZWFtLlBhc3NUaHJvdWdoKCksIGVycm9yID0+IHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH0pO1xuXHRcdFx0Ly8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzI5Mzc2XG5cdFx0XHRpZiAocHJvY2Vzcy52ZXJzaW9uIDwgJ3YxMi4xMCcpIHtcblx0XHRcdFx0cmVzcG9uc2VfLm9uKCdhYm9ydGVkJywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlc3BvbnNlT3B0aW9ucyA9IHtcblx0XHRcdFx0dXJsOiByZXF1ZXN0LnVybCxcblx0XHRcdFx0c3RhdHVzOiByZXNwb25zZV8uc3RhdHVzQ29kZSxcblx0XHRcdFx0c3RhdHVzVGV4dDogcmVzcG9uc2VfLnN0YXR1c01lc3NhZ2UsXG5cdFx0XHRcdGhlYWRlcnMsXG5cdFx0XHRcdHNpemU6IHJlcXVlc3Quc2l6ZSxcblx0XHRcdFx0Y291bnRlcjogcmVxdWVzdC5jb3VudGVyLFxuXHRcdFx0XHRoaWdoV2F0ZXJNYXJrOiByZXF1ZXN0LmhpZ2hXYXRlck1hcmtcblx0XHRcdH07XG5cblx0XHRcdC8vIEhUVFAtbmV0d29yayBmZXRjaCBzdGVwIDEyLjEuMS4zXG5cdFx0XHRjb25zdCBjb2RpbmdzID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtRW5jb2RpbmcnKTtcblxuXHRcdFx0Ly8gSFRUUC1uZXR3b3JrIGZldGNoIHN0ZXAgMTIuMS4xLjQ6IGhhbmRsZSBjb250ZW50IGNvZGluZ3NcblxuXHRcdFx0Ly8gaW4gZm9sbG93aW5nIHNjZW5hcmlvcyB3ZSBpZ25vcmUgY29tcHJlc3Npb24gc3VwcG9ydFxuXHRcdFx0Ly8gMS4gY29tcHJlc3Npb24gc3VwcG9ydCBpcyBkaXNhYmxlZFxuXHRcdFx0Ly8gMi4gSEVBRCByZXF1ZXN0XG5cdFx0XHQvLyAzLiBubyBDb250ZW50LUVuY29kaW5nIGhlYWRlclxuXHRcdFx0Ly8gNC4gbm8gY29udGVudCByZXNwb25zZSAoMjA0KVxuXHRcdFx0Ly8gNS4gY29udGVudCBub3QgbW9kaWZpZWQgcmVzcG9uc2UgKDMwNClcblx0XHRcdGlmICghcmVxdWVzdC5jb21wcmVzcyB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0hFQUQnIHx8IGNvZGluZ3MgPT09IG51bGwgfHwgcmVzcG9uc2VfLnN0YXR1c0NvZGUgPT09IDIwNCB8fCByZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzA0KSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBOb2RlIHY2K1xuXHRcdFx0Ly8gQmUgbGVzcyBzdHJpY3Qgd2hlbiBkZWNvZGluZyBjb21wcmVzc2VkIHJlc3BvbnNlcywgc2luY2Ugc29tZXRpbWVzXG5cdFx0XHQvLyBzZXJ2ZXJzIHNlbmQgc2xpZ2h0bHkgaW52YWxpZCByZXNwb25zZXMgdGhhdCBhcmUgc3RpbGwgYWNjZXB0ZWRcblx0XHRcdC8vIGJ5IGNvbW1vbiBicm93c2Vycy5cblx0XHRcdC8vIEFsd2F5cyB1c2luZyBaX1NZTkNfRkxVU0ggaXMgd2hhdCBjVVJMIGRvZXMuXG5cdFx0XHRjb25zdCB6bGliT3B0aW9ucyA9IHtcblx0XHRcdFx0Zmx1c2g6IHpsaWIuWl9TWU5DX0ZMVVNILFxuXHRcdFx0XHRmaW5pc2hGbHVzaDogemxpYi5aX1NZTkNfRkxVU0hcblx0XHRcdH07XG5cblx0XHRcdC8vIEZvciBnemlwXG5cdFx0XHRpZiAoY29kaW5ncyA9PT0gJ2d6aXAnIHx8IGNvZGluZ3MgPT09ICd4LWd6aXAnKSB7XG5cdFx0XHRcdGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUoYm9keSwgemxpYi5jcmVhdGVHdW56aXAoemxpYk9wdGlvbnMpLCBlcnJvciA9PiB7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBkZWZsYXRlXG5cdFx0XHRpZiAoY29kaW5ncyA9PT0gJ2RlZmxhdGUnIHx8IGNvZGluZ3MgPT09ICd4LWRlZmxhdGUnKSB7XG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgaW5mYW1vdXMgcmF3IGRlZmxhdGUgcmVzcG9uc2UgZnJvbSBvbGQgc2VydmVyc1xuXHRcdFx0XHQvLyBhIGhhY2sgZm9yIG9sZCBJSVMgYW5kIEFwYWNoZSBzZXJ2ZXJzXG5cdFx0XHRcdGNvbnN0IHJhdyA9IFN0cmVhbS5waXBlbGluZShyZXNwb25zZV8sIG5ldyBTdHJlYW0uUGFzc1Rocm91Z2goKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyYXcub25jZSgnZGF0YScsIGNodW5rID0+IHtcblx0XHRcdFx0XHQvLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzUxOTgyOFxuXHRcdFx0XHRcdGlmICgoY2h1bmtbMF0gJiAweDBGKSA9PT0gMHgwOCkge1xuXHRcdFx0XHRcdFx0Ym9keSA9IFN0cmVhbS5waXBlbGluZShib2R5LCB6bGliLmNyZWF0ZUluZmxhdGUoKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUoYm9keSwgemxpYi5jcmVhdGVJbmZsYXRlUmF3KCksIGVycm9yID0+IHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBiclxuXHRcdFx0aWYgKGNvZGluZ3MgPT09ICdicicpIHtcblx0XHRcdFx0Ym9keSA9IFN0cmVhbS5waXBlbGluZShib2R5LCB6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZU9wdGlvbnMpO1xuXHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIHVzZSByZXNwb25zZSBhcy1pc1xuXHRcdFx0cmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2VPcHRpb25zKTtcblx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdH0pO1xuXG5cdFx0d3JpdGVUb1N0cmVhbShyZXF1ZXN0XywgcmVxdWVzdCk7XG5cdH0pO1xufVxuXG5leHBvcnRzLkFib3J0RXJyb3IgPSBBYm9ydEVycm9yO1xuZXhwb3J0cy5GZXRjaEVycm9yID0gRmV0Y2hFcnJvcjtcbmV4cG9ydHMuSGVhZGVycyA9IEhlYWRlcnM7XG5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuZXhwb3J0cy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuZXhwb3J0cy5kZWZhdWx0ID0gZmV0Y2g7XG5leHBvcnRzLmlzUmVkaXJlY3QgPSBpc1JlZGlyZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguY2pzLm1hcFxuIiwiLyoqXG4gKiB3ZWItc3RyZWFtcy1wb2x5ZmlsbCB2My4xLjFcbiAqL1xuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LnN5bWJvbFwiIC8+XG5jb25zdCBTeW1ib2xQb2x5ZmlsbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcgP1xuICAgIFN5bWJvbCA6XG4gICAgZGVzY3JpcHRpb24gPT4gYFN5bWJvbCgke2Rlc2NyaXB0aW9ufSlgO1xuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJkb21cIiAvPlxuZnVuY3Rpb24gbm9vcCgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZ2V0R2xvYmFscygpIHtcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuY29uc3QgZ2xvYmFscyA9IGdldEdsb2JhbHMoKTtcblxuZnVuY3Rpb24gdHlwZUlzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKSB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmNvbnN0IHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbiA9IG5vb3A7XG5cbmNvbnN0IG9yaWdpbmFsUHJvbWlzZSA9IFByb21pc2U7XG5jb25zdCBvcmlnaW5hbFByb21pc2VUaGVuID0gUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcbmNvbnN0IG9yaWdpbmFsUHJvbWlzZVJlc29sdmUgPSBQcm9taXNlLnJlc29sdmUuYmluZChvcmlnaW5hbFByb21pc2UpO1xuY29uc3Qgb3JpZ2luYWxQcm9taXNlUmVqZWN0ID0gUHJvbWlzZS5yZWplY3QuYmluZChvcmlnaW5hbFByb21pc2UpO1xuZnVuY3Rpb24gbmV3UHJvbWlzZShleGVjdXRvcikge1xuICAgIHJldHVybiBuZXcgb3JpZ2luYWxQcm9taXNlKGV4ZWN1dG9yKTtcbn1cbmZ1bmN0aW9uIHByb21pc2VSZXNvbHZlZFdpdGgodmFsdWUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxQcm9taXNlUmVzb2x2ZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYXNvbikge1xuICAgIHJldHVybiBvcmlnaW5hbFByb21pc2VSZWplY3QocmVhc29uKTtcbn1cbmZ1bmN0aW9uIFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIC8vIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gY29ycmVjdGx5IGVtdWxhdGUgdGhlIGJlaGF2aW91ciBmcm9tIEphdmFTY3JpcHQsIHNvIHRoaXMgaXMganVzdCBhblxuICAgIC8vIGFwcHJveGltYXRpb24uXG4gICAgcmV0dXJuIG9yaWdpbmFsUHJvbWlzZVRoZW4uY2FsbChwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG59XG5mdW5jdGlvbiB1cG9uUHJvbWlzZShwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIFBlcmZvcm1Qcm9taXNlVGhlbihQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpLCB1bmRlZmluZWQsIHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbik7XG59XG5mdW5jdGlvbiB1cG9uRnVsZmlsbG1lbnQocHJvbWlzZSwgb25GdWxmaWxsZWQpIHtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlLCBvbkZ1bGZpbGxlZCk7XG59XG5mdW5jdGlvbiB1cG9uUmVqZWN0aW9uKHByb21pc2UsIG9uUmVqZWN0ZWQpIHtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlLCB1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtUHJvbWlzZVdpdGgocHJvbWlzZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xufVxuZnVuY3Rpb24gc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShwcm9taXNlKSB7XG4gICAgUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIHVuZGVmaW5lZCwgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKTtcbn1cbmNvbnN0IHF1ZXVlTWljcm90YXNrID0gKCgpID0+IHtcbiAgICBjb25zdCBnbG9iYWxRdWV1ZU1pY3JvdGFzayA9IGdsb2JhbHMgJiYgZ2xvYmFscy5xdWV1ZU1pY3JvdGFzaztcbiAgICBpZiAodHlwZW9mIGdsb2JhbFF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxRdWV1ZU1pY3JvdGFzaztcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIHJldHVybiAoZm4pID0+IFBlcmZvcm1Qcm9taXNlVGhlbihyZXNvbHZlZFByb21pc2UsIGZuKTtcbn0pKCk7XG5mdW5jdGlvbiByZWZsZWN0Q2FsbChGLCBWLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBGICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChGLCBWLCBhcmdzKTtcbn1cbmZ1bmN0aW9uIHByb21pc2VDYWxsKEYsIFYsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChyZWZsZWN0Q2FsbChGLCBWLCBhcmdzKSk7XG4gICAgfVxuICAgIGNhdGNoICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2YWx1ZSk7XG4gICAgfVxufVxuXG4vLyBPcmlnaW5hbCBmcm9tIENocm9taXVtXG4vLyBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLysvMGFlZTQ0MzRhNGRiYTQyYTQyYWJhZWE5YmZiYzBjZDE5NmE2M2JjMS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N0cmVhbXMvU2ltcGxlUXVldWUuanNcbmNvbnN0IFFVRVVFX01BWF9BUlJBWV9TSVpFID0gMTYzODQ7XG4vKipcbiAqIFNpbXBsZSBxdWV1ZSBzdHJ1Y3R1cmUuXG4gKlxuICogQXZvaWRzIHNjYWxhYmlsaXR5IGlzc3VlcyB3aXRoIHVzaW5nIGEgcGFja2VkIGFycmF5IGRpcmVjdGx5IGJ5IHVzaW5nXG4gKiBtdWx0aXBsZSBhcnJheXMgaW4gYSBsaW5rZWQgbGlzdCBhbmQga2VlcGluZyB0aGUgYXJyYXkgc2l6ZSBib3VuZGVkLlxuICovXG5jbGFzcyBTaW1wbGVRdWV1ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICAvLyBfZnJvbnQgYW5kIF9iYWNrIGFyZSBhbHdheXMgZGVmaW5lZC5cbiAgICAgICAgdGhpcy5fZnJvbnQgPSB7XG4gICAgICAgICAgICBfZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgX25leHQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iYWNrID0gdGhpcy5fZnJvbnQ7XG4gICAgICAgIC8vIFRoZSBjdXJzb3IgaXMgdXNlZCB0byBhdm9pZCBjYWxsaW5nIEFycmF5LnNoaWZ0KCkuXG4gICAgICAgIC8vIEl0IGNvbnRhaW5zIHRoZSBpbmRleCBvZiB0aGUgZnJvbnQgZWxlbWVudCBvZiB0aGUgYXJyYXkgaW5zaWRlIHRoZVxuICAgICAgICAvLyBmcm9udC1tb3N0IG5vZGUuIEl0IGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgWzAsIFFVRVVFX01BWF9BUlJBWV9TSVpFKS5cbiAgICAgICAgdGhpcy5fY3Vyc29yID0gMDtcbiAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBub2RlLCBzaXplID09PSBlbGVtZW50cy5sZW5ndGggLSBjdXJzb3IuXG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgLy8gRm9yIGV4Y2VwdGlvbiBzYWZldHksIHRoaXMgbWV0aG9kIGlzIHN0cnVjdHVyZWQgaW4gb3JkZXI6XG4gICAgLy8gMS4gUmVhZCBzdGF0ZVxuICAgIC8vIDIuIENhbGN1bGF0ZSByZXF1aXJlZCBzdGF0ZSBtdXRhdGlvbnNcbiAgICAvLyAzLiBQZXJmb3JtIHN0YXRlIG11dGF0aW9uc1xuICAgIHB1c2goZWxlbWVudCkge1xuICAgICAgICBjb25zdCBvbGRCYWNrID0gdGhpcy5fYmFjaztcbiAgICAgICAgbGV0IG5ld0JhY2sgPSBvbGRCYWNrO1xuICAgICAgICBpZiAob2xkQmFjay5fZWxlbWVudHMubGVuZ3RoID09PSBRVUVVRV9NQVhfQVJSQVlfU0laRSAtIDEpIHtcbiAgICAgICAgICAgIG5ld0JhY2sgPSB7XG4gICAgICAgICAgICAgICAgX2VsZW1lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBfbmV4dDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIHB1c2goKSBpcyB0aGUgbXV0YXRpb24gbW9zdCBsaWtlbHkgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBzbyBpdFxuICAgICAgICAvLyBnb2VzIGZpcnN0LlxuICAgICAgICBvbGRCYWNrLl9lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICBpZiAobmV3QmFjayAhPT0gb2xkQmFjaykge1xuICAgICAgICAgICAgdGhpcy5fYmFjayA9IG5ld0JhY2s7XG4gICAgICAgICAgICBvbGRCYWNrLl9uZXh0ID0gbmV3QmFjaztcbiAgICAgICAgfVxuICAgICAgICArK3RoaXMuX3NpemU7XG4gICAgfVxuICAgIC8vIExpa2UgcHVzaCgpLCBzaGlmdCgpIGZvbGxvd3MgdGhlIHJlYWQgLT4gY2FsY3VsYXRlIC0+IG11dGF0ZSBwYXR0ZXJuIGZvclxuICAgIC8vIGV4Y2VwdGlvbiBzYWZldHkuXG4gICAgc2hpZnQoKSB7IC8vIG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhbiBlbXB0eSBxdWV1ZVxuICAgICAgICBjb25zdCBvbGRGcm9udCA9IHRoaXMuX2Zyb250O1xuICAgICAgICBsZXQgbmV3RnJvbnQgPSBvbGRGcm9udDtcbiAgICAgICAgY29uc3Qgb2xkQ3Vyc29yID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICBsZXQgbmV3Q3Vyc29yID0gb2xkQ3Vyc29yICsgMTtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBvbGRGcm9udC5fZWxlbWVudHM7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tvbGRDdXJzb3JdO1xuICAgICAgICBpZiAobmV3Q3Vyc29yID09PSBRVUVVRV9NQVhfQVJSQVlfU0laRSkge1xuICAgICAgICAgICAgbmV3RnJvbnQgPSBvbGRGcm9udC5fbmV4dDtcbiAgICAgICAgICAgIG5ld0N1cnNvciA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gbXV0YXRpb25zIGJlZm9yZSB0aGlzIHBvaW50LlxuICAgICAgICAtLXRoaXMuX3NpemU7XG4gICAgICAgIHRoaXMuX2N1cnNvciA9IG5ld0N1cnNvcjtcbiAgICAgICAgaWYgKG9sZEZyb250ICE9PSBuZXdGcm9udCkge1xuICAgICAgICAgICAgdGhpcy5fZnJvbnQgPSBuZXdGcm9udDtcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJtaXQgc2hpZnRlZCBlbGVtZW50IHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgICAgICBlbGVtZW50c1tvbGRDdXJzb3JdID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgLy8gVGhlIHRyaWNreSB0aGluZyBhYm91dCBmb3JFYWNoKCkgaXMgdGhhdCBpdCBjYW4gYmUgY2FsbGVkXG4gICAgLy8gcmUtZW50cmFudGx5LiBUaGUgcXVldWUgbWF5IGJlIG11dGF0ZWQgaW5zaWRlIHRoZSBjYWxsYmFjay4gSXQgaXMgZWFzeSB0b1xuICAgIC8vIHNlZSB0aGF0IHB1c2goKSB3aXRoaW4gdGhlIGNhbGxiYWNrIGhhcyBubyBuZWdhdGl2ZSBlZmZlY3RzIHNpbmNlIHRoZSBlbmRcbiAgICAvLyBvZiB0aGUgcXVldWUgaXMgY2hlY2tlZCBmb3Igb24gZXZlcnkgaXRlcmF0aW9uLiBJZiBzaGlmdCgpIGlzIGNhbGxlZFxuICAgIC8vIHJlcGVhdGVkbHkgd2l0aGluIHRoZSBjYWxsYmFjayB0aGVuIHRoZSBuZXh0IGl0ZXJhdGlvbiBtYXkgcmV0dXJuIGFuXG4gICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuIEluIHRoaXMgY2FzZSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWRcbiAgICAvLyB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMgdW50aWwgd2UgZWl0aGVyIFwiY2F0Y2ggdXBcIiB3aXRoIGVsZW1lbnRzIHRoYXQgc3RpbGxcbiAgICAvLyBleGlzdCBvciByZWFjaCB0aGUgYmFjayBvZiB0aGUgcXVldWUuXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgICBsZXQgaSA9IHRoaXMuX2N1cnNvcjtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gbm9kZS5fZWxlbWVudHM7XG4gICAgICAgIHdoaWxlIChpICE9PSBlbGVtZW50cy5sZW5ndGggfHwgbm9kZS5fbmV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuX25leHQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMgPSBub2RlLl9lbGVtZW50cztcbiAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVsZW1lbnRzW2ldKTtcbiAgICAgICAgICAgICsraTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBpZiBzaGlmdCgpIHdhcyBjYWxsZWQgbm93LFxuICAgIC8vIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBxdWV1ZS5cbiAgICBwZWVrKCkgeyAvLyBtdXN0IG5vdCBiZSBjYWxsZWQgb24gYW4gZW1wdHkgcXVldWVcbiAgICAgICAgY29uc3QgZnJvbnQgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgY29uc3QgY3Vyc29yID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICByZXR1cm4gZnJvbnQuX2VsZW1lbnRzW2N1cnNvcl07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHJlYWRlciwgc3RyZWFtKSB7XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5fcmVhZGVyID0gcmVhZGVyO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHJlYWRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHJlYWRlciwgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxufVxuLy8gQSBjbGllbnQgb2YgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIGFuZCBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgbWF5IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgdG8gYnlwYXNzIHN0YXRlXG4vLyBjaGVjay5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbChyZWFkZXIsIHJlYXNvbikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbTtcbiAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpIHtcbiAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyZWFkZXIsIG5ldyBUeXBlRXJyb3IoYFJlYWRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzYCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCBuZXcgVHlwZUVycm9yKGBSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtJ3MgY2xvc2VkbmVzc2ApKTtcbiAgICB9XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID0gdW5kZWZpbmVkO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIHJlYWRlcnMuXG5mdW5jdGlvbiByZWFkZXJMb2NrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQ2Fubm90ICcgKyBuYW1lICsgJyBhIHN0cmVhbSB1c2luZyBhIHJlbGVhc2VkIHJlYWRlcicpO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpIHtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpO1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQocmVhZGVyKSB7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHJlYWRlcik7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcik7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyZWFkZXIsIHJlYXNvbikge1xuICAgIGlmIChyZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHJlYWRlci5fY2xvc2VkUHJvbWlzZSk7XG4gICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZChyZWFkZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQocmVhZGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcikge1xuICAgIGlmIChyZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCBBYm9ydFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbQWJvcnRTdGVwc11dJyk7XG5jb25zdCBFcnJvclN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbRXJyb3JTdGVwc11dJyk7XG5jb25zdCBDYW5jZWxTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0NhbmNlbFN0ZXBzXV0nKTtcbmNvbnN0IFB1bGxTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW1B1bGxTdGVwc11dJyk7XG5cbi8vLyA8cmVmZXJlbmNlIGxpYj1cImVzMjAxNS5jb3JlXCIgLz5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0Zpbml0ZSNQb2x5ZmlsbFxuY29uc3QgTnVtYmVySXNGaW5pdGUgPSBOdW1iZXIuaXNGaW5pdGUgfHwgZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInICYmIGlzRmluaXRlKHgpO1xufTtcblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC90cnVuYyNQb2x5ZmlsbFxuY29uc3QgTWF0aFRydW5jID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2IDwgMCA/IE1hdGguY2VpbCh2KSA6IE1hdGguZmxvb3Iodik7XG59O1xuXG4vLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtZGljdGlvbmFyaWVzXG5mdW5jdGlvbiBpc0RpY3Rpb25hcnkoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBhc3NlcnREaWN0aW9uYXJ5KG9iaiwgY29udGV4dCkge1xuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCAmJiAhaXNEaWN0aW9uYXJ5KG9iaikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYW4gb2JqZWN0LmApO1xuICAgIH1cbn1cbi8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC1jYWxsYmFjay1mdW5jdGlvbnNcbmZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uKHgsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIHggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYSBmdW5jdGlvbi5gKTtcbiAgICB9XG59XG4vLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtb2JqZWN0XG5mdW5jdGlvbiBpc09iamVjdCh4KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCkgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBhc3NlcnRPYmplY3QoeCwgY29udGV4dCkge1xuICAgIGlmICghaXNPYmplY3QoeCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYW4gb2JqZWN0LmApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoeCwgcG9zaXRpb24sIGNvbnRleHQpIHtcbiAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFBhcmFtZXRlciAke3Bvc2l0aW9ufSBpcyByZXF1aXJlZCBpbiAnJHtjb250ZXh0fScuYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0UmVxdWlyZWRGaWVsZCh4LCBmaWVsZCwgY29udGV4dCkge1xuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtmaWVsZH0gaXMgcmVxdWlyZWQgaW4gJyR7Y29udGV4dH0nLmApO1xuICAgIH1cbn1cbi8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC11bnJlc3RyaWN0ZWQtZG91YmxlXG5mdW5jdGlvbiBjb252ZXJ0VW5yZXN0cmljdGVkRG91YmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG59XG5mdW5jdGlvbiBjZW5zb3JOZWdhdGl2ZVplcm8oeCkge1xuICAgIHJldHVybiB4ID09PSAwID8gMCA6IHg7XG59XG5mdW5jdGlvbiBpbnRlZ2VyUGFydCh4KSB7XG4gICAgcmV0dXJuIGNlbnNvck5lZ2F0aXZlWmVybyhNYXRoVHJ1bmMoeCkpO1xufVxuLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jaWRsLXVuc2lnbmVkLWxvbmctbG9uZ1xuZnVuY3Rpb24gY29udmVydFVuc2lnbmVkTG9uZ0xvbmdXaXRoRW5mb3JjZVJhbmdlKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgbG93ZXJCb3VuZCA9IDA7XG4gICAgY29uc3QgdXBwZXJCb3VuZCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIGxldCB4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICB4ID0gY2Vuc29yTmVnYXRpdmVaZXJvKHgpO1xuICAgIGlmICghTnVtYmVySXNGaW5pdGUoeCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyYCk7XG4gICAgfVxuICAgIHggPSBpbnRlZ2VyUGFydCh4KTtcbiAgICBpZiAoeCA8IGxvd2VyQm91bmQgfHwgeCA+IHVwcGVyQm91bmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBvdXRzaWRlIHRoZSBhY2NlcHRlZCByYW5nZSBvZiAke2xvd2VyQm91bmR9IHRvICR7dXBwZXJCb3VuZH0sIGluY2x1c2l2ZWApO1xuICAgIH1cbiAgICBpZiAoIU51bWJlcklzRmluaXRlKHgpIHx8IHggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vIFRPRE8gVXNlIEJpZ0ludCBpZiBzdXBwb3J0ZWQ/XG4gICAgLy8gbGV0IHhCaWdJbnQgPSBCaWdJbnQoaW50ZWdlclBhcnQoeCkpO1xuICAgIC8vIHhCaWdJbnQgPSBCaWdJbnQuYXNVaW50Tig2NCwgeEJpZ0ludCk7XG4gICAgLy8gcmV0dXJuIE51bWJlcih4QmlnSW50KTtcbiAgICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVhZGFibGVTdHJlYW0oeCwgY29udGV4dCkge1xuICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhIFJlYWRhYmxlU3RyZWFtLmApO1xuICAgIH1cbn1cblxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pIHtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pO1xufVxuLy8gUmVhZGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0sIHJlYWRSZXF1ZXN0KSB7XG4gICAgc3RyZWFtLl9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5wdXNoKHJlYWRSZXF1ZXN0KTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBjb25zdCByZWFkUmVxdWVzdCA9IHJlYWRlci5fcmVhZFJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgICAgcmVhZFJlcXVlc3QuX2Nsb3NlU3RlcHMoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlYWRSZXF1ZXN0Ll9jaHVua1N0ZXBzKGNodW5rKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pIHtcbiAgICByZXR1cm4gc3RyZWFtLl9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5sZW5ndGg7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSB7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIEEgZGVmYXVsdCByZWFkZXIgdmVuZGVkIGJ5IGEge0BsaW5rIFJlYWRhYmxlU3RyZWFtfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoc3RyZWFtLCAxLCAnUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyJyk7XG4gICAgICAgIGFzc2VydFJlYWRhYmxlU3RyZWFtKHN0cmVhbSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHJlYWRpbmcgYnkgYW5vdGhlciByZWFkZXInKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgIHRoaXMuX3JlYWRSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIHN0cmVhbSBiZWNvbWVzIGNsb3NlZCxcbiAgICAgKiBvciByZWplY3RlZCBpZiB0aGUgc3RyZWFtIGV2ZXIgZXJyb3JzIG9yIHRoZSByZWFkZXIncyBsb2NrIGlzIHJlbGVhc2VkIGJlZm9yZSB0aGUgc3RyZWFtIGZpbmlzaGVzIGNsb3NpbmcuXG4gICAgICovXG4gICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlYWRlciBpcyBhY3RpdmUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMge0BsaW5rIFJlYWRhYmxlU3RyZWFtLmNhbmNlbCB8IHN0cmVhbS5jYW5jZWwocmVhc29uKX0uXG4gICAgICovXG4gICAgY2FuY2VsKHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2FuY2VsJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgbmV4dCBjaHVuayBmcm9tIHRoZSBzdHJlYW0ncyBpbnRlcm5hbCBxdWV1ZSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogSWYgcmVhZGluZyBhIGNodW5rIGNhdXNlcyB0aGUgcXVldWUgdG8gYmVjb21lIGVtcHR5LCBtb3JlIGRhdGEgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgdW5kZXJseWluZyBzb3VyY2UuXG4gICAgICovXG4gICAgcmVhZCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigncmVhZCBmcm9tJykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlUHJvbWlzZTtcbiAgICAgICAgbGV0IHJlamVjdFByb21pc2U7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlamVjdFByb21pc2UgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZWFkUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSksXG4gICAgICAgICAgICBfY2xvc2VTdGVwczogKCkgPT4gcmVzb2x2ZVByb21pc2UoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pLFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6IGUgPT4gcmVqZWN0UHJvbWlzZShlKVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHRoaXMsIHJlYWRSZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSByZWFkZXIncyBsb2NrIG9uIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbS4gQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZWFkZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS5cbiAgICAgKiBJZiB0aGUgYXNzb2NpYXRlZCBzdHJlYW0gaXMgZXJyb3JlZCB3aGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmVhZGVyIHdpbGwgYXBwZWFyIGVycm9yZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICogZnJvbSBub3cgb247IG90aGVyd2lzZSwgdGhlIHJlYWRlciB3aWxsIGFwcGVhciBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBBIHJlYWRlcidzIGxvY2sgY2Fubm90IGJlIHJlbGVhc2VkIHdoaWxlIGl0IHN0aWxsIGhhcyBhIHBlbmRpbmcgcmVhZCByZXF1ZXN0LCBpLmUuLCBpZiBhIHByb21pc2UgcmV0dXJuZWQgYnlcbiAgICAgKiB0aGUgcmVhZGVyJ3Mge0BsaW5rIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5yZWFkIHwgcmVhZCgpfSBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBzZXR0bGVkLiBBdHRlbXB0aW5nIHRvXG4gICAgICogZG8gc28gd2lsbCB0aHJvdyBhIGBUeXBlRXJyb3JgIGFuZCBsZWF2ZSB0aGUgcmVhZGVyIGxvY2tlZCB0byB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIHJlbGVhc2VMb2NrKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlYWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UodGhpcyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZSwge1xuICAgIGNhbmNlbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVhZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVsZWFzZUxvY2s6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGNsb3NlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSByZWFkZXJzLlxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19yZWFkUmVxdWVzdHMnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIsIHJlYWRSZXF1ZXN0KSB7XG4gICAgY29uc3Qgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmVhZFJlcXVlc3QuX2Nsb3NlU3RlcHMoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJlYWRSZXF1ZXN0Ll9lcnJvclN0ZXBzKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXJbUHVsbFN0ZXBzXShyZWFkUmVxdWVzdCk7XG4gICAgfVxufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJgKTtcbn1cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE4LmFzeW5jaXRlcmFibGVcIiAvPlxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICovXG5jb25zdCBBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbiogKCkgeyB9KS5wcm90b3R5cGUpO1xuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTguYXN5bmNpdGVyYWJsZVwiIC8+XG5jbGFzcyBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkZXIsIHByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgdGhpcy5fb25nb2luZ1Byb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2lzRmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gcmVhZGVyO1xuICAgICAgICB0aGlzLl9wcmV2ZW50Q2FuY2VsID0gcHJldmVudENhbmNlbDtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgbmV4dFN0ZXBzID0gKCkgPT4gdGhpcy5fbmV4dFN0ZXBzKCk7XG4gICAgICAgIHRoaXMuX29uZ29pbmdQcm9taXNlID0gdGhpcy5fb25nb2luZ1Byb21pc2UgP1xuICAgICAgICAgICAgdHJhbnNmb3JtUHJvbWlzZVdpdGgodGhpcy5fb25nb2luZ1Byb21pc2UsIG5leHRTdGVwcywgbmV4dFN0ZXBzKSA6XG4gICAgICAgICAgICBuZXh0U3RlcHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uZ29pbmdQcm9taXNlO1xuICAgIH1cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmV0dXJuU3RlcHMgPSAoKSA9PiB0aGlzLl9yZXR1cm5TdGVwcyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbmdvaW5nUHJvbWlzZSA/XG4gICAgICAgICAgICB0cmFuc2Zvcm1Qcm9taXNlV2l0aCh0aGlzLl9vbmdvaW5nUHJvbWlzZSwgcmV0dXJuU3RlcHMsIHJldHVyblN0ZXBzKSA6XG4gICAgICAgICAgICByZXR1cm5TdGVwcygpO1xuICAgIH1cbiAgICBfbmV4dFN0ZXBzKCkge1xuICAgICAgICBpZiAodGhpcy5faXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGVyID0gdGhpcy5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2l0ZXJhdGUnKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVQcm9taXNlO1xuICAgICAgICBsZXQgcmVqZWN0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlYWRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbmdvaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlbGF5ZWQgYnkgb25lIG1pY3JvdGFzaywgb3RoZXJ3aXNlIHdlIHN0b3AgcHVsbGluZyB0b28gZWFybHkgd2hpY2ggYnJlYWtzIGEgdGVzdC5cbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBJcyB0aGlzIGEgYnVnIGluIHRoZSBzcGVjaWZpY2F0aW9uLCBvciBpbiB0aGUgdGVzdD9cbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9jbG9zZVN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25nb2luZ1Byb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfZXJyb3JTdGVwczogcmVhc29uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbmdvaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICAgICAgcmVqZWN0UHJvbWlzZShyZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwgcmVhZFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgX3JldHVyblN0ZXBzKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWUsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHRoaXMuX3JlYWRlcjtcbiAgICAgICAgaWYgKHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdmaW5pc2ggaXRlcmF0aW5nJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fcHJldmVudENhbmNlbCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHJlYWRlciwgdmFsdWUpO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKHJlc3VsdCwgKCkgPT4gKHsgdmFsdWUsIGRvbmU6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UocmVhZGVyKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoeyB2YWx1ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICB9XG59XG5jb25zdCBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSB7XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24oJ25leHQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jSXRlcmF0b3JJbXBsLm5leHQoKTtcbiAgICB9LFxuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbigncmV0dXJuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hc3luY0l0ZXJhdG9ySW1wbC5yZXR1cm4odmFsdWUpO1xuICAgIH1cbn07XG5pZiAoQXN5bmNJdGVyYXRvclByb3RvdHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG5mdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgcHJldmVudENhbmNlbCkge1xuICAgIGNvbnN0IHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICBjb25zdCBpbXBsID0gbmV3IFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGwocmVhZGVyLCBwcmV2ZW50Q2FuY2VsKTtcbiAgICBjb25zdCBpdGVyYXRvciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICBpdGVyYXRvci5fYXN5bmNJdGVyYXRvckltcGwgPSBpbXBsO1xuICAgIHJldHVybiBpdGVyYXRvcjtcbn1cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYXN5bmNJdGVyYXRvckltcGwnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBTdXNwaWNpb3VzVHlwZU9mR3VhcmRcbiAgICAgICAgcmV0dXJuIHguX2FzeW5jSXRlcmF0b3JJbXBsIGluc3RhbmNlb2ZcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGw7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdGVhbUFzeW5jSXRlcmF0b3JgKTtcbn1cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTnVtYmVyL2lzTmFOI1BvbHlmaWxsXG5jb25zdCBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoeCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4geCAhPT0geDtcbn07XG5cbmZ1bmN0aW9uIENyZWF0ZUFycmF5RnJvbUxpc3QoZWxlbWVudHMpIHtcbiAgICAvLyBXZSB1c2UgYXJyYXlzIHRvIHJlcHJlc2VudCBsaXN0cywgc28gdGhpcyBpcyBiYXNpY2FsbHkgYSBuby1vcC5cbiAgICAvLyBEbyBhIHNsaWNlIHRob3VnaCBqdXN0IGluIGNhc2Ugd2UgaGFwcGVuIHRvIGRlcGVuZCBvbiB0aGUgdW5pcXVlLW5lc3MuXG4gICAgcmV0dXJuIGVsZW1lbnRzLnNsaWNlKCk7XG59XG5mdW5jdGlvbiBDb3B5RGF0YUJsb2NrQnl0ZXMoZGVzdCwgZGVzdE9mZnNldCwgc3JjLCBzcmNPZmZzZXQsIG4pIHtcbiAgICBuZXcgVWludDhBcnJheShkZXN0KS5zZXQobmV3IFVpbnQ4QXJyYXkoc3JjLCBzcmNPZmZzZXQsIG4pLCBkZXN0T2Zmc2V0KTtcbn1cbi8vIE5vdCBpbXBsZW1lbnRlZCBjb3JyZWN0bHlcbmZ1bmN0aW9uIFRyYW5zZmVyQXJyYXlCdWZmZXIoTykge1xuICAgIHJldHVybiBPO1xufVxuLy8gTm90IGltcGxlbWVudGVkIGNvcnJlY3RseVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gSXNEZXRhY2hlZEJ1ZmZlcihPKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gQXJyYXlCdWZmZXJTbGljZShidWZmZXIsIGJlZ2luLCBlbmQpIHtcbiAgICAvLyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgaXMgbm90IGF2YWlsYWJsZSBvbiBJRTEwXG4gICAgLy8gaHR0cHM6Ly93d3cuY2FuaXVzZS5jb20vbWRuLWphdmFzY3JpcHRfYnVpbHRpbnNfYXJyYXlidWZmZXJfc2xpY2VcbiAgICBpZiAoYnVmZmVyLnNsaWNlKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoYmVnaW4sIGVuZCk7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IGVuZCAtIGJlZ2luO1xuICAgIGNvbnN0IHNsaWNlID0gbmV3IEFycmF5QnVmZmVyKGxlbmd0aCk7XG4gICAgQ29weURhdGFCbG9ja0J5dGVzKHNsaWNlLCAwLCBidWZmZXIsIGJlZ2luLCBsZW5ndGgpO1xuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gSXNOb25OZWdhdGl2ZU51bWJlcih2KSB7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChOdW1iZXJJc05hTih2KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gQ2xvbmVBc1VpbnQ4QXJyYXkoTykge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEFycmF5QnVmZmVyU2xpY2UoTy5idWZmZXIsIE8uYnl0ZU9mZnNldCwgTy5ieXRlT2Zmc2V0ICsgTy5ieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gRGVxdWV1ZVZhbHVlKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IHBhaXIgPSBjb250YWluZXIuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSAtPSBwYWlyLnNpemU7XG4gICAgaWYgKGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPCAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gcGFpci52YWx1ZTtcbn1cbmZ1bmN0aW9uIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRhaW5lciwgdmFsdWUsIHNpemUpIHtcbiAgICBpZiAoIUlzTm9uTmVnYXRpdmVOdW1iZXIoc2l6ZSkgfHwgc2l6ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1NpemUgbXVzdCBiZSBhIGZpbml0ZSwgbm9uLU5hTiwgbm9uLW5lZ2F0aXZlIG51bWJlci4nKTtcbiAgICB9XG4gICAgY29udGFpbmVyLl9xdWV1ZS5wdXNoKHsgdmFsdWUsIHNpemUgfSk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSArPSBzaXplO1xufVxuZnVuY3Rpb24gUGVla1F1ZXVlVmFsdWUoY29udGFpbmVyKSB7XG4gICAgY29uc3QgcGFpciA9IGNvbnRhaW5lci5fcXVldWUucGVlaygpO1xuICAgIHJldHVybiBwYWlyLnZhbHVlO1xufVxuZnVuY3Rpb24gUmVzZXRRdWV1ZShjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuX3F1ZXVlID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA9IDA7XG59XG5cbi8qKlxuICogQSBwdWxsLWludG8gcmVxdWVzdCBpbiBhIHtAbGluayBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZpZXcgZm9yIHdyaXRpbmcgaW4gdG8sIG9yIGBudWxsYCBpZiB0aGUgQllPQiByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gcmVzcG9uZGVkIHRvLlxuICAgICAqL1xuICAgIGdldCB2aWV3KCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKCd2aWV3Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXc7XG4gICAgfVxuICAgIHJlc3BvbmQoYnl0ZXNXcml0dGVuKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Jlc3BvbmQnKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KGJ5dGVzV3JpdHRlbiwgMSwgJ3Jlc3BvbmQnKTtcbiAgICAgICAgYnl0ZXNXcml0dGVuID0gY29udmVydFVuc2lnbmVkTG9uZ0xvbmdXaXRoRW5mb3JjZVJhbmdlKGJ5dGVzV3JpdHRlbiwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih0aGlzLl92aWV3LmJ1ZmZlcikpIDtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbik7XG4gICAgfVxuICAgIHJlc3BvbmRXaXRoTmV3Vmlldyh2aWV3KSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Jlc3BvbmRXaXRoTmV3VmlldycpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQodmlldywgMSwgJ3Jlc3BvbmRXaXRoTmV3VmlldycpO1xuICAgICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyh2aWV3KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IGNhbiBvbmx5IHJlc3BvbmQgd2l0aCBhcnJheSBidWZmZXIgdmlld3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih2aWV3LmJ1ZmZlcikpIDtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3Vmlldyh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciwgdmlldyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUsIHtcbiAgICByZXNwb25kOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICByZXNwb25kV2l0aE5ld1ZpZXc6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHZpZXc6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QnLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8qKlxuICogQWxsb3dzIGNvbnRyb2wgb2YgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW0gfCByZWFkYWJsZSBieXRlIHN0cmVhbX0ncyBzdGF0ZSBhbmQgaW50ZXJuYWwgcXVldWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEJZT0IgcHVsbCByZXF1ZXN0LCBvciBgbnVsbGAgaWYgdGhlcmUgaXNuJ3Qgb25lLlxuICAgICAqL1xuICAgIGdldCBieW9iUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignYnlvYlJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIHNpemUgdG8gZmlsbCB0aGUgY29udHJvbGxlZCBzdHJlYW0ncyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXNcbiAgICAgKiBvdmVyLWZ1bGwuIEFuIHVuZGVybHlpbmcgYnl0ZSBzb3VyY2Ugb3VnaHQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gYW5kIGhvdyB0byBhcHBseSBiYWNrcHJlc3N1cmUuXG4gICAgICovXG4gICAgZ2V0IGRlc2lyZWRTaXplKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdkZXNpcmVkU2l6ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29udHJvbGxlZCByZWFkYWJsZSBzdHJlYW0uIENvbnN1bWVycyB3aWxsIHN0aWxsIGJlIGFibGUgdG8gcmVhZCBhbnkgcHJldmlvdXNseS1lbnF1ZXVlZCBjaHVua3MgZnJvbVxuICAgICAqIHRoZSBzdHJlYW0sIGJ1dCBvbmNlIHRob3NlIGFyZSByZWFkLCB0aGUgc3RyZWFtIHdpbGwgYmVjb21lIGNsb3NlZC5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQ7IGRvIG5vdCBjbG9zZSBpdCBhZ2FpbiEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBzdHJlYW0gKGluICR7c3RhdGV9IHN0YXRlKSBpcyBub3QgaW4gdGhlIHJlYWRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkYCk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlKHRoaXMpO1xuICAgIH1cbiAgICBlbnF1ZXVlKGNodW5rKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2VucXVldWUnKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KGNodW5rLCAxLCAnZW5xdWV1ZScpO1xuICAgICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyhjaHVuaykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NodW5rIG11c3QgYmUgYW4gYXJyYXkgYnVmZmVyIHZpZXcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2h1bmsuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2h1bmsgbXVzdCBoYXZlIG5vbi16ZXJvIGJ5dGVMZW5ndGgnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2h1bmsuYnVmZmVyLmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGNodW5rJ3MgYnVmZmVyIG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgc3RyZWFtIChpbiAke3N0YXRlfSBzdGF0ZSkgaXMgbm90IGluIHRoZSByZWFkYWJsZSBzdGF0ZSBhbmQgY2Fubm90IGJlIGVucXVldWVkIHRvYCk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUodGhpcywgY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFcnJvcnMgdGhlIGNvbnRyb2xsZWQgcmVhZGFibGUgc3RyZWFtLCBtYWtpbmcgYWxsIGZ1dHVyZSBpbnRlcmFjdGlvbnMgd2l0aCBpdCBmYWlsIHdpdGggdGhlIGdpdmVuIGVycm9yIGBlYC5cbiAgICAgKi9cbiAgICBlcnJvcihlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKHRoaXMsIGUpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgW0NhbmNlbFN0ZXBzXShyZWFzb24pIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyh0aGlzKTtcbiAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbUHVsbFN0ZXBzXShyZWFkUmVxdWVzdCkge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAodGhpcy5fcXVldWVUb3RhbFNpemUgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZVRvdGFsU2l6ZSAtPSBlbnRyeS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4odGhpcyk7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW50cnkuYnVmZmVyLCBlbnRyeS5ieXRlT2Zmc2V0LCBlbnRyeS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIHJlYWRSZXF1ZXN0Ll9jaHVua1N0ZXBzKHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHRoaXMuX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICAgICAgaWYgKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYnVmZmVyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChidWZmZXJFKSB7XG4gICAgICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2Vycm9yU3RlcHMoYnVmZmVyRSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHVsbEludG9EZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgICBidWZmZXJCeXRlTGVuZ3RoOiBhdXRvQWxsb2NhdGVDaHVua1NpemUsXG4gICAgICAgICAgICAgICAgYnl0ZU9mZnNldDogMCxcbiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiBhdXRvQWxsb2NhdGVDaHVua1NpemUsXG4gICAgICAgICAgICAgICAgYnl0ZXNGaWxsZWQ6IDAsXG4gICAgICAgICAgICAgICAgZWxlbWVudFNpemU6IDEsXG4gICAgICAgICAgICAgICAgdmlld0NvbnN0cnVjdG9yOiBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgIHJlYWRlclR5cGU6ICdkZWZhdWx0J1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdQdWxsSW50b3MucHVzaChwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtLCByZWFkUmVxdWVzdCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgY2xvc2U6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVucXVldWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVycm9yOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBieW9iUmVxdWVzdDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZGVzaXJlZFNpemU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLlxuZnVuY3Rpb24gSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyO1xufVxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzaG91bGRQdWxsID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpO1xuICAgIGlmICghc2hvdWxkUHVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9wdWxsaW5nKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udHJvbGxlci5fcHVsbGluZyA9IHRydWU7XG4gICAgLy8gVE9ETzogVGVzdCBjb250cm9sbGVyIGFyZ3VtZW50XG4gICAgY29uc3QgcHVsbFByb21pc2UgPSBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHVsbFByb21pc2UsICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoY29udHJvbGxlci5fcHVsbEFnYWluKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgfSwgZSA9PiB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcikge1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcihzdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcikge1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBmaWxsZWRWaWV3ID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICBpZiAocHVsbEludG9EZXNjcmlwdG9yLnJlYWRlclR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGZpbGxlZFZpZXcsIGRvbmUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgZmlsbGVkVmlldywgZG9uZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgY29uc3QgYnl0ZXNGaWxsZWQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQ7XG4gICAgY29uc3QgZWxlbWVudFNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgcmV0dXJuIG5ldyBwdWxsSW50b0Rlc2NyaXB0b3Iudmlld0NvbnN0cnVjdG9yKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0LCBieXRlc0ZpbGxlZCAvIGVsZW1lbnRTaXplKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgIGNvbnRyb2xsZXIuX3F1ZXVlLnB1c2goeyBidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGggfSk7XG4gICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgKz0gYnl0ZUxlbmd0aDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikge1xuICAgIGNvbnN0IGVsZW1lbnRTaXplID0gcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplO1xuICAgIGNvbnN0IGN1cnJlbnRBbGlnbmVkQnl0ZXMgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBlbGVtZW50U2l6ZTtcbiAgICBjb25zdCBtYXhCeXRlc1RvQ29weSA9IE1hdGgubWluKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZUxlbmd0aCAtIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCk7XG4gICAgY29uc3QgbWF4Qnl0ZXNGaWxsZWQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKyBtYXhCeXRlc1RvQ29weTtcbiAgICBjb25zdCBtYXhBbGlnbmVkQnl0ZXMgPSBtYXhCeXRlc0ZpbGxlZCAtIG1heEJ5dGVzRmlsbGVkICUgZWxlbWVudFNpemU7XG4gICAgbGV0IHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPSBtYXhCeXRlc1RvQ29weTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICBpZiAobWF4QWxpZ25lZEJ5dGVzID4gY3VycmVudEFsaWduZWRCeXRlcykge1xuICAgICAgICB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nID0gbWF4QWxpZ25lZEJ5dGVzIC0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICByZWFkeSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXVlID0gY29udHJvbGxlci5fcXVldWU7XG4gICAgd2hpbGUgKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPiAwKSB7XG4gICAgICAgIGNvbnN0IGhlYWRPZlF1ZXVlID0gcXVldWUucGVlaygpO1xuICAgICAgICBjb25zdCBieXRlc1RvQ29weSA9IE1hdGgubWluKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcsIGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCBkZXN0U3RhcnQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCArIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgQ29weURhdGFCbG9ja0J5dGVzKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIGRlc3RTdGFydCwgaGVhZE9mUXVldWUuYnVmZmVyLCBoZWFkT2ZRdWV1ZS5ieXRlT2Zmc2V0LCBieXRlc1RvQ29weSk7XG4gICAgICAgIGlmIChoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoID09PSBieXRlc1RvQ29weSkge1xuICAgICAgICAgICAgcXVldWUuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRPZlF1ZXVlLmJ5dGVPZmZzZXQgKz0gYnl0ZXNUb0NvcHk7XG4gICAgICAgICAgICBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoIC09IGJ5dGVzVG9Db3B5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplIC09IGJ5dGVzVG9Db3B5O1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNUb0NvcHksIHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgLT0gYnl0ZXNUb0NvcHk7XG4gICAgfVxuICAgIHJldHVybiByZWFkeTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLCBzaXplLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKz0gc2l6ZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDAgJiYgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcikge1xuICAgIGlmIChjb250cm9sbGVyLl9ieW9iUmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0Ll9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9ieW9iUmVxdWVzdC5fdmlldyA9IG51bGw7XG4gICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSBudWxsO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclByb2Nlc3NQdWxsSW50b0Rlc2NyaXB0b3JzVXNpbmdRdWV1ZShjb250cm9sbGVyKSB7XG4gICAgd2hpbGUgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdWxsSW50b0Rlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICAgICAgaWYgKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhjb250cm9sbGVyLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGxldCBlbGVtZW50U2l6ZSA9IDE7XG4gICAgaWYgKHZpZXcuY29uc3RydWN0b3IgIT09IERhdGFWaWV3KSB7XG4gICAgICAgIGVsZW1lbnRTaXplID0gdmlldy5jb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICB9XG4gICAgY29uc3QgY3RvciA9IHZpZXcuY29uc3RydWN0b3I7XG4gICAgLy8gdHJ5IHtcbiAgICBjb25zdCBidWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKTtcbiAgICAvLyB9IGNhdGNoIChlKSB7XG4gICAgLy8gICByZWFkSW50b1JlcXVlc3QuX2Vycm9yU3RlcHMoZSk7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIGNvbnN0IHB1bGxJbnRvRGVzY3JpcHRvciA9IHtcbiAgICAgICAgYnVmZmVyLFxuICAgICAgICBidWZmZXJCeXRlTGVuZ3RoOiBidWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgYnl0ZU9mZnNldDogdmlldy5ieXRlT2Zmc2V0LFxuICAgICAgICBieXRlTGVuZ3RoOiB2aWV3LmJ5dGVMZW5ndGgsXG4gICAgICAgIGJ5dGVzRmlsbGVkOiAwLFxuICAgICAgICBlbGVtZW50U2l6ZSxcbiAgICAgICAgdmlld0NvbnN0cnVjdG9yOiBjdG9yLFxuICAgICAgICByZWFkZXJUeXBlOiAnYnlvYidcbiAgICB9O1xuICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIC8vIE5vIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKCkgY2FsbCBzaW5jZTpcbiAgICAgICAgLy8gLSBObyBjaGFuZ2UgaGFwcGVucyBvbiBkZXNpcmVkU2l6ZVxuICAgICAgICAvLyAtIFRoZSBzb3VyY2UgaGFzIGFscmVhZHkgYmVlbiBub3RpZmllZCBvZiB0aGF0IHRoZXJlJ3MgYXQgbGVhc3QgMSBwZW5kaW5nIHJlYWQodmlldylcbiAgICAgICAgUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtLCByZWFkSW50b1JlcXVlc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBjb25zdCBlbXB0eVZpZXcgPSBuZXcgY3RvcihwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCwgMCk7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fY2xvc2VTdGVwcyhlbXB0eVZpZXcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgaWYgKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGxlZFZpZXcgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4oY29udHJvbGxlcik7XG4gICAgICAgICAgICByZWFkSW50b1JlcXVlc3QuX2NodW5rU3RlcHMoZmlsbGVkVmlldyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgICAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9lcnJvclN0ZXBzKGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucHVzaChwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgcmVhZEludG9SZXF1ZXN0KTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0JZT0JSZWFkZXIoc3RyZWFtKSkge1xuICAgICAgICB3aGlsZSAoUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwdWxsSW50b0Rlc2NyaXB0b3IgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcik7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKHN0cmVhbSwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICBpZiAocHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkIDwgcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHJlbWFpbmRlclNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgaWYgKHJlbWFpbmRlclNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICBjb25zdCByZW1haW5kZXIgPSBBcnJheUJ1ZmZlclNsaWNlKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIGVuZCAtIHJlbWFpbmRlclNpemUsIGVuZCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHJlbWFpbmRlciwgMCwgcmVtYWluZGVyLmJ5dGVMZW5ndGgpO1xuICAgIH1cbiAgICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLT0gcmVtYWluZGVyU2l6ZTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclByb2Nlc3NQdWxsSW50b0Rlc2NyaXB0b3JzVXNpbmdRdWV1ZShjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKSB7XG4gICAgY29uc3QgZmlyc3REZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBmaXJzdERlc2NyaXB0b3IpO1xuICAgIH1cbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3Muc2hpZnQoKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghY29udHJvbGxlci5fc3RhcnRlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZGVzaXJlZFNpemUgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcik7XG4gICAgaWYgKGRlc2lyZWRTaXplID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9jYW5jZWxBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG59XG4vLyBBIGNsaWVudCBvZiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICBpZiAoY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgfHwgc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlyc3RQZW5kaW5nUHVsbEludG8gPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICAgICAgaWYgKGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ5dGVzRmlsbGVkID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBUeXBlRXJyb3IoJ0luc3VmZmljaWVudCBieXRlcyB0byBmaWxsIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBidWZmZXInKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkIHx8IHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBjaHVuay5idWZmZXI7XG4gICAgY29uc3QgYnl0ZU9mZnNldCA9IGNodW5rLmJ5dGVPZmZzZXQ7XG4gICAgY29uc3QgYnl0ZUxlbmd0aCA9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgY29uc3QgdHJhbnNmZXJyZWRCdWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKGJ1ZmZlcik7XG4gICAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdFBlbmRpbmdQdWxsSW50byA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcihmaXJzdFBlbmRpbmdQdWxsSW50by5idWZmZXIpKSA7XG4gICAgICAgIGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3RQZW5kaW5nUHVsbEludG8uYnVmZmVyKTtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICBpZiAoUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyKHN0cmVhbSkpIHtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPT09IDApIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVycmVkVmlldyA9IG5ldyBVaW50OEFycmF5KHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgdHJhbnNmZXJyZWRWaWV3LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkpIHtcbiAgICAgICAgLy8gVE9ETzogSWRlYWxseSBpbiB0aGlzIGJyYW5jaCBkZXRhY2hpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IGlmIHRoZSBidWZmZXIgaXMgbm90IGNvbnN1bWVkIGZ1bGx5LlxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyhjb250cm9sbGVyKTtcbiAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPT09IG51bGwgJiYgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciwgZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQsIGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTtcbiAgICAgICAgY29uc3QgYnlvYlJlcXVlc3QgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlKTtcbiAgICAgICAgU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KGJ5b2JSZXF1ZXN0LCBjb250cm9sbGVyLCB2aWV3KTtcbiAgICAgICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSBieW9iUmVxdWVzdDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0O1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbikge1xuICAgIGNvbnN0IGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBpZiAoYnl0ZXNXcml0dGVuICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdieXRlc1dyaXR0ZW4gbXVzdCBiZSAwIHdoZW4gY2FsbGluZyByZXNwb25kKCkgb24gYSBjbG9zZWQgc3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChieXRlc1dyaXR0ZW4gPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J5dGVzV3JpdHRlbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIHdoZW4gY2FsbGluZyByZXNwb25kKCkgb24gYSByZWFkYWJsZSBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgYnl0ZXNXcml0dGVuID4gZmlyc3REZXNjcmlwdG9yLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdieXRlc1dyaXR0ZW4gb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlcik7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbChjb250cm9sbGVyLCBieXRlc1dyaXR0ZW4pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3Vmlldyhjb250cm9sbGVyLCB2aWV3KSB7XG4gICAgY29uc3QgZmlyc3REZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIGlmICh2aWV3LmJ5dGVMZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2aWV3XFwncyBsZW5ndGggbXVzdCBiZSAwIHdoZW4gY2FsbGluZyByZXNwb25kV2l0aE5ld1ZpZXcoKSBvbiBhIGNsb3NlZCBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHZpZXcuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZpZXdcXCdzIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIHdoZW4gY2FsbGluZyByZXNwb25kV2l0aE5ld1ZpZXcoKSBvbiBhIHJlYWRhYmxlIHN0cmVhbScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChmaXJzdERlc2NyaXB0b3IuYnl0ZU9mZnNldCArIGZpcnN0RGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAhPT0gdmlldy5ieXRlT2Zmc2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgcmVnaW9uIHNwZWNpZmllZCBieSB2aWV3IGRvZXMgbm90IG1hdGNoIGJ5b2JSZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGlmIChmaXJzdERlc2NyaXB0b3IuYnVmZmVyQnl0ZUxlbmd0aCAhPT0gdmlldy5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGJ1ZmZlciBvZiB2aWV3IGhhcyBkaWZmZXJlbnQgY2FwYWNpdHkgdGhhbiBieW9iUmVxdWVzdCcpO1xuICAgIH1cbiAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgdmlldy5ieXRlTGVuZ3RoID4gZmlyc3REZXNjcmlwdG9yLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSByZWdpb24gc3BlY2lmaWVkIGJ5IHZpZXcgaXMgbGFyZ2VyIHRoYW4gYnlvYlJlcXVlc3QnKTtcbiAgICB9XG4gICAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIodmlldy5idWZmZXIpO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgdmlldy5ieXRlTGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSkge1xuICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0gPSBzdHJlYW07XG4gICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID0gbnVsbDtcbiAgICAvLyBOZWVkIHRvIHNldCB0aGUgc2xvdHMgc28gdGhhdCB0aGUgYXNzZXJ0IGRvZXNuJ3QgZmlyZS4gSW4gdGhlIHNwZWMgdGhlIHNsb3RzIGFscmVhZHkgZXhpc3QgaW1wbGljaXRseS5cbiAgICBjb250cm9sbGVyLl9xdWV1ZSA9IGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkO1xuICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lIV00gPSBoaWdoV2F0ZXJNYXJrO1xuICAgIGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0gPSBwdWxsQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9hdXRvQWxsb2NhdGVDaHVua1NpemUgPSBhdXRvQWxsb2NhdGVDaHVua1NpemU7XG4gICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICBjb25zdCBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH0sIHIgPT4ge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdCeXRlU291cmNlLCBoaWdoV2F0ZXJNYXJrKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIGxldCBzdGFydEFsZ29yaXRobSA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICBsZXQgcHVsbEFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBsZXQgY2FuY2VsQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ0J5dGVTb3VyY2Uuc3RhcnQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5wdWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHVsbEFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdCeXRlU291cmNlLnB1bGwoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5jYW5jZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYW5jZWxBbGdvcml0aG0gPSByZWFzb24gPT4gdW5kZXJseWluZ0J5dGVTb3VyY2UuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIGNvbnN0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHVuZGVybHlpbmdCeXRlU291cmNlLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICBpZiAoYXV0b0FsbG9jYXRlQ2h1bmtTaXplID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F1dG9BbGxvY2F0ZUNodW5rU2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuICAgIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSk7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QocmVxdWVzdCwgY29udHJvbGxlciwgdmlldykge1xuICAgIHJlcXVlc3QuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICByZXF1ZXN0Ll92aWV3ID0gdmlldztcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LlxuZnVuY3Rpb24gYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdGApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIuXG5mdW5jdGlvbiBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyYCk7XG59XG5cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbS5cbmZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtKTtcbn1cbi8vIFJlYWRhYmxlU3RyZWFtIEFQSSBleHBvc2VkIGZvciBjb250cm9sbGVycy5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgcmVhZEludG9SZXF1ZXN0KSB7XG4gICAgc3RyZWFtLl9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMucHVzaChyZWFkSW50b1JlcXVlc3QpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBjb25zdCByZWFkSW50b1JlcXVlc3QgPSByZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMuc2hpZnQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgICByZWFkSW50b1JlcXVlc3QuX2Nsb3NlU3RlcHMoY2h1bmspO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9jaHVua1N0ZXBzKGNodW5rKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5fcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogQSBCWU9CIHJlYWRlciB2ZW5kZWQgYnkgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW19LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChzdHJlYW0sIDEsICdSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXInKTtcbiAgICAgICAgYXNzZXJ0UmVhZGFibGVTdHJlYW0oc3RyZWFtLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgcmVhZGluZyBieSBhbm90aGVyIHJlYWRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciBmb3IgYSBzdHJlYW0gbm90IGNvbnN0cnVjdGVkIHdpdGggYSBieXRlICcgK1xuICAgICAgICAgICAgICAgICdzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgIHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCB3aGVuIHRoZSBzdHJlYW0gYmVjb21lcyBjbG9zZWQsIG9yIHJlamVjdGVkIGlmIHRoZSBzdHJlYW0gZXZlciBlcnJvcnMgb3JcbiAgICAgKiB0aGUgcmVhZGVyJ3MgbG9jayBpcyByZWxlYXNlZCBiZWZvcmUgdGhlIHN0cmVhbSBmaW5pc2hlcyBjbG9zaW5nLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSByZWFkZXIgaXMgYWN0aXZlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAbGluayBSZWFkYWJsZVN0cmVhbS5jYW5jZWwgfCBzdHJlYW0uY2FuY2VsKHJlYXNvbil9LlxuICAgICAqL1xuICAgIGNhbmNlbChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdjYW5jZWwnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byByZWFkcyBieXRlcyBpbnRvIHZpZXcsIGFuZCByZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBJZiByZWFkaW5nIGEgY2h1bmsgY2F1c2VzIHRoZSBxdWV1ZSB0byBiZWNvbWUgZW1wdHksIG1vcmUgZGF0YSB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvdXJjZS5cbiAgICAgKi9cbiAgICByZWFkKHZpZXcpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ3ZpZXcgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlldy5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCd2aWV3IG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2aWV3LmJ1ZmZlci5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKGB2aWV3J3MgYnVmZmVyIG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoYCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHZpZXcuYnVmZmVyKSkgO1xuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdyZWFkIGZyb20nKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVQcm9taXNlO1xuICAgICAgICBsZXQgcmVqZWN0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlYWRJbnRvUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSksXG4gICAgICAgICAgICBfY2xvc2VTdGVwczogY2h1bmsgPT4gcmVzb2x2ZVByb21pc2UoeyB2YWx1ZTogY2h1bmssIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICBfZXJyb3JTdGVwczogZSA9PiByZWplY3RQcm9taXNlKGUpXG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQodGhpcywgdmlldywgcmVhZEludG9SZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSByZWFkZXIncyBsb2NrIG9uIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbS4gQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZWFkZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS5cbiAgICAgKiBJZiB0aGUgYXNzb2NpYXRlZCBzdHJlYW0gaXMgZXJyb3JlZCB3aGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmVhZGVyIHdpbGwgYXBwZWFyIGVycm9yZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICogZnJvbSBub3cgb247IG90aGVyd2lzZSwgdGhlIHJlYWRlciB3aWxsIGFwcGVhciBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBBIHJlYWRlcidzIGxvY2sgY2Fubm90IGJlIHJlbGVhc2VkIHdoaWxlIGl0IHN0aWxsIGhhcyBhIHBlbmRpbmcgcmVhZCByZXF1ZXN0LCBpLmUuLCBpZiBhIHByb21pc2UgcmV0dXJuZWQgYnlcbiAgICAgKiB0aGUgcmVhZGVyJ3Mge0BsaW5rIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5yZWFkIHwgcmVhZCgpfSBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBzZXR0bGVkLiBBdHRlbXB0aW5nIHRvXG4gICAgICogZG8gc28gd2lsbCB0aHJvdyBhIGBUeXBlRXJyb3JgIGFuZCBsZWF2ZSB0aGUgcmVhZGVyIGxvY2tlZCB0byB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIHJlbGVhc2VMb2NrKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUsIHtcbiAgICBjYW5jZWw6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlYWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlbGVhc2VMb2NrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBjbG9zZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgcmVhZGVycy5cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZEludG9SZXF1ZXN0cycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXI7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXJSZWFkKHJlYWRlciwgdmlldywgcmVhZEludG9SZXF1ZXN0KSB7XG4gICAgY29uc3Qgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fZXJyb3JTdGVwcyhzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmlldywgcmVhZEludG9SZXF1ZXN0KTtcbiAgICB9XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLlxuZnVuY3Rpb24gYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcmApO1xufVxuXG5mdW5jdGlvbiBFeHRyYWN0SGlnaFdhdGVyTWFyayhzdHJhdGVneSwgZGVmYXVsdEhXTSkge1xuICAgIGNvbnN0IHsgaGlnaFdhdGVyTWFyayB9ID0gc3RyYXRlZ3k7XG4gICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdEhXTTtcbiAgICB9XG4gICAgaWYgKE51bWJlcklzTmFOKGhpZ2hXYXRlck1hcmspIHx8IGhpZ2hXYXRlck1hcmsgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIGhpZ2hXYXRlck1hcmsnKTtcbiAgICB9XG4gICAgcmV0dXJuIGhpZ2hXYXRlck1hcms7XG59XG5mdW5jdGlvbiBFeHRyYWN0U2l6ZUFsZ29yaXRobShzdHJhdGVneSkge1xuICAgIGNvbnN0IHsgc2l6ZSB9ID0gc3RyYXRlZ3k7XG4gICAgaWYgKCFzaXplKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiAxO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cblxuZnVuY3Rpb24gY29udmVydFF1ZXVpbmdTdHJhdGVneShpbml0LCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShpbml0LCBjb250ZXh0KTtcbiAgICBjb25zdCBoaWdoV2F0ZXJNYXJrID0gaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LmhpZ2hXYXRlck1hcms7XG4gICAgY29uc3Qgc2l6ZSA9IGluaXQgPT09IG51bGwgfHwgaW5pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5pdC5zaXplO1xuICAgIHJldHVybiB7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRVbnJlc3RyaWN0ZWREb3VibGUoaGlnaFdhdGVyTWFyayksXG4gICAgICAgIHNpemU6IHNpemUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lTaXplKHNpemUsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3NpemUnIHRoYXRgKVxuICAgIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5U2l6ZShmbiwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gY2h1bmsgPT4gY29udmVydFVucmVzdHJpY3RlZERvdWJsZShmbihjaHVuaykpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VW5kZXJseWluZ1Npbmsob3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KG9yaWdpbmFsLCBjb250ZXh0KTtcbiAgICBjb25zdCBhYm9ydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5hYm9ydDtcbiAgICBjb25zdCBjbG9zZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5jbG9zZTtcbiAgICBjb25zdCBzdGFydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5zdGFydDtcbiAgICBjb25zdCB0eXBlID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnR5cGU7XG4gICAgY29uc3Qgd3JpdGUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwud3JpdGU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWJvcnQ6IGFib3J0ID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Fib3J0Q2FsbGJhY2soYWJvcnQsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdhYm9ydCcgdGhhdGApLFxuICAgICAgICBjbG9zZTogY2xvc2UgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTaW5rQ2xvc2VDYWxsYmFjayhjbG9zZSwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ2Nsb3NlJyB0aGF0YCksXG4gICAgICAgIHN0YXJ0OiBzdGFydCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5kZXJseWluZ1NpbmtTdGFydENhbGxiYWNrKHN0YXJ0LCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc3RhcnQnIHRoYXRgKSxcbiAgICAgICAgd3JpdGU6IHdyaXRlID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU2lua1dyaXRlQ2FsbGJhY2sod3JpdGUsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICd3cml0ZScgdGhhdGApLFxuICAgICAgICB0eXBlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Fib3J0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAocmVhc29uKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtyZWFzb25dKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Nsb3NlQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua1N0YXJ0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcmVmbGVjdENhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTaW5rV3JpdGVDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjaHVuaywgY29udHJvbGxlcikgPT4gcHJvbWlzZUNhbGwoZm4sIG9yaWdpbmFsLCBbY2h1bmssIGNvbnRyb2xsZXJdKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0V3JpdGFibGVTdHJlYW0oeCwgY29udGV4dCkge1xuICAgIGlmICghSXNXcml0YWJsZVN0cmVhbSh4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhIFdyaXRhYmxlU3RyZWFtLmApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5hYm9ydGVkID09PSAnYm9vbGVhbic7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICAvLyBBYm9ydFNpZ25hbC5wcm90b3R5cGUuYWJvcnRlZCB0aHJvd3MgaWYgaXRzIGJyYW5kIGNoZWNrIGZhaWxzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBzdXBwb3J0c0Fib3J0Q29udHJvbGxlciA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbic7XG4vKipcbiAqIENvbnN0cnVjdCBhIG5ldyBBYm9ydENvbnRyb2xsZXIsIGlmIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0uXG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFib3J0Q29udHJvbGxlcigpIHtcbiAgICBpZiAoc3VwcG9ydHNBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHdyaXRhYmxlIHN0cmVhbSByZXByZXNlbnRzIGEgZGVzdGluYXRpb24gZm9yIGRhdGEsIGludG8gd2hpY2ggeW91IGNhbiB3cml0ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFdyaXRhYmxlU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihyYXdVbmRlcmx5aW5nU2luayA9IHt9LCByYXdTdHJhdGVneSA9IHt9KSB7XG4gICAgICAgIGlmIChyYXdVbmRlcmx5aW5nU2luayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByYXdVbmRlcmx5aW5nU2luayA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnRPYmplY3QocmF3VW5kZXJseWluZ1NpbmssICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJhdGVneSA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kocmF3U3RyYXRlZ3ksICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IHVuZGVybHlpbmdTaW5rID0gY29udmVydFVuZGVybHlpbmdTaW5rKHJhd1VuZGVybHlpbmdTaW5rLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbSh0aGlzKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHVuZGVybHlpbmdTaW5rLnR5cGU7XG4gICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGUgaXMgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2l6ZUFsZ29yaXRobSA9IEV4dHJhY3RTaXplQWxnb3JpdGhtKHN0cmF0ZWd5KTtcbiAgICAgICAgY29uc3QgaGlnaFdhdGVyTWFyayA9IEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHN0cmF0ZWd5LCAxKTtcbiAgICAgICAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHRoaXMsIHVuZGVybHlpbmdTaW5rLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgd3JpdGFibGUgc3RyZWFtIGlzIGxvY2tlZCB0byBhIHdyaXRlci5cbiAgICAgKi9cbiAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMignbG9ja2VkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFib3J0cyB0aGUgc3RyZWFtLCBzaWduYWxpbmcgdGhhdCB0aGUgcHJvZHVjZXIgY2FuIG5vIGxvbmdlciBzdWNjZXNzZnVsbHkgd3JpdGUgdG8gdGhlIHN0cmVhbSBhbmQgaXQgaXMgdG8gYmVcbiAgICAgKiBpbW1lZGlhdGVseSBtb3ZlZCB0byBhbiBlcnJvcmVkIHN0YXRlLCB3aXRoIGFueSBxdWV1ZWQtdXAgd3JpdGVzIGRpc2NhcmRlZC4gVGhpcyB3aWxsIGFsc28gZXhlY3V0ZSBhbnkgYWJvcnRcbiAgICAgKiBtZWNoYW5pc20gb2YgdGhlIHVuZGVybHlpbmcgc2luay5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgZnVsZmlsbCBpZiB0aGUgc3RyZWFtIHNodXRzIGRvd24gc3VjY2Vzc2Z1bGx5LCBvciByZWplY3QgaWYgdGhlIHVuZGVybHlpbmcgc2luayBzaWduYWxlZFxuICAgICAqIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIGRvaW5nIHNvLiBBZGRpdGlvbmFsbHksIGl0IHdpbGwgcmVqZWN0IHdpdGggYSBgVHlwZUVycm9yYCAod2l0aG91dCBhdHRlbXB0aW5nIHRvIGNhbmNlbFxuICAgICAqIHRoZSBzdHJlYW0pIGlmIHRoZSBzdHJlYW0gaXMgY3VycmVudGx5IGxvY2tlZC5cbiAgICAgKi9cbiAgICBhYm9ydChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2Fib3J0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgYWJvcnQgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHdyaXRlcicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbS4gVGhlIHVuZGVybHlpbmcgc2luayB3aWxsIGZpbmlzaCBwcm9jZXNzaW5nIGFueSBwcmV2aW91c2x5LXdyaXR0ZW4gY2h1bmtzLCBiZWZvcmUgaW52b2tpbmcgaXRzXG4gICAgICogY2xvc2UgYmVoYXZpb3IuIER1cmluZyB0aGlzIHRpbWUgYW55IGZ1cnRoZXIgYXR0ZW1wdHMgdG8gd3JpdGUgd2lsbCBmYWlsICh3aXRob3V0IGVycm9yaW5nIHRoZSBzdHJlYW0pLlxuICAgICAqXG4gICAgICogVGhlIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgZnVsZmlsbCBpZiBhbGwgcmVtYWluaW5nIGNodW5rcyBhcmUgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gYW5kIHRoZSBzdHJlYW1cbiAgICAgKiBzdWNjZXNzZnVsbHkgY2xvc2VzLCBvciByZWplY3RzIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGR1cmluZyB0aGlzIHByb2Nlc3MuIEFkZGl0aW9uYWxseSwgaXQgd2lsbCByZWplY3Qgd2l0aFxuICAgICAqIGEgYFR5cGVFcnJvcmAgKHdpdGhvdXQgYXR0ZW1wdGluZyB0byBjYW5jZWwgdGhlIHN0cmVhbSkgaWYgdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjbG9zZSBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgd3JpdGVyJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodCh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGFuIGFscmVhZHktY2xvc2luZyBzdHJlYW0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQ2xvc2UodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHwgd3JpdGVyfSBhbmQgbG9ja3MgdGhlIHN0cmVhbSB0byB0aGUgbmV3IHdyaXRlci4gV2hpbGUgdGhlIHN0cmVhbVxuICAgICAqIGlzIGxvY2tlZCwgbm8gb3RoZXIgd3JpdGVyIGNhbiBiZSBhY3F1aXJlZCB1bnRpbCB0aGlzIG9uZSBpcyByZWxlYXNlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgY3JlYXRpbmcgYWJzdHJhY3Rpb25zIHRoYXQgZGVzaXJlIHRoZSBhYmlsaXR5IHRvIHdyaXRlIHRvIGEgc3RyZWFtXG4gICAgICogd2l0aG91dCBpbnRlcnJ1cHRpb24gb3IgaW50ZXJsZWF2aW5nLiBCeSBnZXR0aW5nIGEgd3JpdGVyIGZvciB0aGUgc3RyZWFtLCB5b3UgY2FuIGVuc3VyZSBub2JvZHkgZWxzZSBjYW4gd3JpdGUgYXRcbiAgICAgKiB0aGUgc2FtZSB0aW1lLCB3aGljaCB3b3VsZCBjYXVzZSB0aGUgcmVzdWx0aW5nIHdyaXR0ZW4gZGF0YSB0byBiZSB1bnByZWRpY3RhYmxlIGFuZCBwcm9iYWJseSB1c2VsZXNzLlxuICAgICAqL1xuICAgIGdldFdyaXRlcigpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2dldFdyaXRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBY3F1aXJlV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIGFib3J0OiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBjbG9zZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZ2V0V3JpdGVyOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBsb2NrZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdXcml0YWJsZVN0cmVhbScsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihzdHJlYW0pIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihzdHJlYW0pO1xufVxuLy8gVGhyb3dzIGlmIGFuZCBvbmx5IGlmIHN0YXJ0QWxnb3JpdGhtIHRocm93cy5cbmZ1bmN0aW9uIENyZWF0ZVdyaXRhYmxlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrID0gMSwgc2l6ZUFsZ29yaXRobSA9ICgpID0+IDEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHN0cmVhbSk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuZnVuY3Rpb24gSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHN0cmVhbSkge1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnd3JpdGFibGUnO1xuICAgIC8vIFRoZSBlcnJvciB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYnkgbmV3IG1ldGhvZCBjYWxscyBvbmNlIHRoZSBzdGF0ZSBiZWNvbWVzIGVycm9yZWQuIE9ubHkgc2V0IHdoZW4gW1tzdGF0ZV1dIGlzXG4gICAgLy8gJ2Vycm9yaW5nJyBvciAnZXJyb3JlZCcuIE1heSBiZSBzZXQgdG8gYW4gdW5kZWZpbmVkIHZhbHVlLlxuICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl93cml0ZXIgPSB1bmRlZmluZWQ7XG4gICAgLy8gSW5pdGlhbGl6ZSB0byB1bmRlZmluZWQgZmlyc3QgYmVjYXVzZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNvbnRyb2xsZXIgY2hlY2tzIHRoaXNcbiAgICAvLyB2YXJpYWJsZSB0byB2YWxpZGF0ZSB0aGUgY2FsbGVyLlxuICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoaXMgcXVldWUgaXMgcGxhY2VkIGhlcmUgaW5zdGVhZCBvZiB0aGUgd3JpdGVyIGNsYXNzIGluIG9yZGVyIHRvIGFsbG93IGZvciBwYXNzaW5nIGEgd3JpdGVyIHRvIHRoZSBuZXh0IGRhdGFcbiAgICAvLyBwcm9kdWNlciB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBxdWV1ZWQgd3JpdGVzIHRvIGZpbmlzaC5cbiAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAvLyBXcml0ZSByZXF1ZXN0cyBhcmUgcmVtb3ZlZCBmcm9tIF93cml0ZVJlcXVlc3RzIHdoZW4gd3JpdGUoKSBpcyBjYWxsZWQgb24gdGhlIHVuZGVybHlpbmcgc2luay4gVGhpcyBwcmV2ZW50c1xuICAgIC8vIHRoZW0gZnJvbSBiZWluZyBlcnJvbmVvdXNseSByZWplY3RlZCBvbiBlcnJvci4gSWYgYSB3cml0ZSgpIGNhbGwgaXMgaW4tZmxpZ2h0LCB0aGUgcmVxdWVzdCBpcyBzdG9yZWQgaGVyZS5cbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBwcm9taXNlIHRoYXQgd2FzIHJldHVybmVkIGZyb20gd3JpdGVyLmNsb3NlKCkuIFN0b3JlZCBoZXJlIGJlY2F1c2UgaXQgbWF5IGJlIGZ1bGZpbGxlZCBhZnRlciB0aGUgd3JpdGVyXG4gICAgLy8gaGFzIGJlZW4gZGV0YWNoZWQuXG4gICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgLy8gQ2xvc2UgcmVxdWVzdCBpcyByZW1vdmVkIGZyb20gX2Nsb3NlUmVxdWVzdCB3aGVuIGNsb3NlKCkgaXMgY2FsbGVkIG9uIHRoZSB1bmRlcmx5aW5nIHNpbmsuIFRoaXMgcHJldmVudHMgaXRcbiAgICAvLyBmcm9tIGJlaW5nIGVycm9uZW91c2x5IHJlamVjdGVkIG9uIGVycm9yLiBJZiBhIGNsb3NlKCkgY2FsbCBpcyBpbi1mbGlnaHQsIHRoZSByZXF1ZXN0IGlzIHN0b3JlZCBoZXJlLlxuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIHByb21pc2UgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB3cml0ZXIuYWJvcnQoKS4gVGhpcyBtYXkgYWxzbyBiZSBmdWxmaWxsZWQgYWZ0ZXIgdGhlIHdyaXRlciBoYXMgZGV0YWNoZWQuXG4gICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBiYWNrcHJlc3N1cmUgc2lnbmFsIHNldCBieSB0aGUgY29udHJvbGxlci5cbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXcml0YWJsZVN0cmVhbTtcbn1cbmZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5fd3JpdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtQWJvcnQoc3RyZWFtLCByZWFzb24pIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnIHx8IHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlci5fYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgKF9hID0gc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIuX2Fib3J0Q29udHJvbGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0KCk7XG4gICAgLy8gVHlwZVNjcmlwdCBuYXJyb3dzIHRoZSB0eXBlIG9mIGBzdHJlYW0uX3N0YXRlYCBkb3duIHRvICd3cml0YWJsZScgfCAnZXJyb3JpbmcnLFxuICAgIC8vIGJ1dCBpdCBkb2Vzbid0IGtub3cgdGhhdCBzaWduYWxpbmcgYWJvcnQgcnVucyBhdXRob3IgY29kZSB0aGF0IG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGUgc3RhdGUuXG4gICAgLy8gV2lkZW4gdGhlIHR5cGUgYWdhaW4gYnkgY2FzdGluZyB0byBXcml0YWJsZVN0cmVhbVN0YXRlLlxuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnIHx8IHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2U7XG4gICAgfVxuICAgIGxldCB3YXNBbHJlYWR5RXJyb3JpbmcgPSBmYWxzZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgd2FzQWxyZWFkeUVycm9yaW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gcmVhc29uIHdpbGwgbm90IGJlIHVzZWQsIHNvIGRvbid0IGtlZXAgYSByZWZlcmVuY2UgdG8gaXQuXG4gICAgICAgIHJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfcHJvbWlzZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX3Jlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICBfcmVqZWN0OiByZWplY3QsXG4gICAgICAgICAgICBfcmVhc29uOiByZWFzb24sXG4gICAgICAgICAgICBfd2FzQWxyZWFkeUVycm9yaW5nOiB3YXNBbHJlYWR5RXJyb3JpbmdcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2UgPSBwcm9taXNlO1xuICAgIGlmICghd2FzQWxyZWFkeUVycm9yaW5nKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIHJlYXNvbik7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pIHtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoYFRoZSBzdHJlYW0gKGluICR7c3RhdGV9IHN0YXRlKSBpcyBub3QgaW4gdGhlIHdyaXRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkYCkpO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNsb3NlUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9yZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgX3JlamVjdDogcmVqZWN0XG4gICAgICAgIH07XG4gICAgICAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gY2xvc2VSZXF1ZXN0O1xuICAgIH0pO1xuICAgIGNvbnN0IHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2JhY2twcmVzc3VyZSAmJiBzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xuICAgIH1cbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2Uoc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuLy8gV3JpdGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3cml0ZVJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgIF9yZWplY3Q6IHJlamVjdFxuICAgICAgICB9O1xuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMucHVzaCh3cml0ZVJlcXVlc3QpO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3Jpbmcoc3RyZWFtLCBlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnZXJyb3JpbmcnO1xuICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgY29uc3Qgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbiAgICB9XG4gICAgaWYgKCFXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0KHN0cmVhbSkgJiYgY29udHJvbGxlci5fc3RhcnRlZCkge1xuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pIHtcbiAgICBzdHJlYW0uX3N0YXRlID0gJ2Vycm9yZWQnO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyW0Vycm9yU3RlcHNdKCk7XG4gICAgY29uc3Qgc3RvcmVkRXJyb3IgPSBzdHJlYW0uX3N0b3JlZEVycm9yO1xuICAgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5mb3JFYWNoKHdyaXRlUmVxdWVzdCA9PiB7XG4gICAgICAgIHdyaXRlUmVxdWVzdC5fcmVqZWN0KHN0b3JlZEVycm9yKTtcbiAgICB9KTtcbiAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFib3J0UmVxdWVzdCA9IHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdDtcbiAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFib3J0UmVxdWVzdC5fd2FzQWxyZWFkeUVycm9yaW5nKSB7XG4gICAgICAgIGFib3J0UmVxdWVzdC5fcmVqZWN0KHN0b3JlZEVycm9yKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltBYm9ydFN0ZXBzXShhYm9ydFJlcXVlc3QuX3JlYXNvbik7XG4gICAgdXBvblByb21pc2UocHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBhYm9ydFJlcXVlc3QuX3Jlc29sdmUoKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgIH0sIChyZWFzb24pID0+IHtcbiAgICAgICAgYWJvcnRSZXF1ZXN0Ll9yZWplY3QocmVhc29uKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlKHN0cmVhbSkge1xuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHtcbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0Ll9yZWplY3QoZXJyb3IpO1xuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZShzdHJlYW0pIHtcbiAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0Ll9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7XG4gICAgICAgIC8vIFRoZSBlcnJvciB3YXMgdG9vIGxhdGUgdG8gZG8gYW55dGhpbmcsIHNvIGl0IGlzIGlnbm9yZWQuXG4gICAgICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0Ll9yZXNvbHZlKCk7XG4gICAgICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIGNvbnN0IHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbiAgICB9XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3Ioc3RyZWFtLCBlcnJvcikge1xuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QuX3JlamVjdChlcnJvcik7XG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAvLyBOZXZlciBleGVjdXRlIHNpbmsgYWJvcnQoKSBhZnRlciBzaW5rIGNsb3NlKCkuXG4gICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uKHN0cmVhbSwgZXJyb3IpO1xufVxuLy8gVE9ETyhyaWNlYSk6IEZpeCBhbHBoYWJldGljYWwgb3JkZXIuXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl9jbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtSGFzT3BlcmF0aW9uTWFya2VkSW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSkge1xuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSBzdHJlYW0uX2Nsb3NlUmVxdWVzdDtcbiAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtTWFya0ZpcnN0V3JpdGVSZXF1ZXN0SW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5zaGlmdCgpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl9jbG9zZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdC5fcmVqZWN0KHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjtcbiAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQgJiYgYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICBpZiAoYmFja3ByZXNzdXJlKSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQod3JpdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSBiYWNrcHJlc3N1cmU7XG59XG4vKipcbiAqIEEgZGVmYXVsdCB3cml0ZXIgdmVuZGVkIGJ5IGEge0BsaW5rIFdyaXRhYmxlU3RyZWFtfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoc3RyZWFtLCAxLCAnV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyJyk7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlU3RyZWFtKHN0cmVhbSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHdyaXRpbmcgYnkgYW5vdGhlciB3cml0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBzdHJlYW0uX3dyaXRlciA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICBpZiAoIVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgJiYgc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsIHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZEVycm9yID0gc3RyZWFtLl9zdG9yZWRFcnJvcjtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0aGlzLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsIHN0b3JlZEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIHN0cmVhbSBiZWNvbWVzIGNsb3NlZCwgb3IgcmVqZWN0ZWQgaWYgdGhlIHN0cmVhbSBldmVyIGVycm9ycyBvclxuICAgICAqIHRoZSB3cml0ZXLigJlzIGxvY2sgaXMgcmVsZWFzZWQgYmVmb3JlIHRoZSBzdHJlYW0gZmluaXNoZXMgY2xvc2luZy5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIHNpemUgdG8gZmlsbCB0aGUgc3RyZWFt4oCZcyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXMgb3Zlci1mdWxsLlxuICAgICAqIEEgcHJvZHVjZXIgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEgdG8gd3JpdGUuXG4gICAgICpcbiAgICAgKiBJdCB3aWxsIGJlIGBudWxsYCBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgd3JpdHRlbiB0byAoZHVlIHRvIGVpdGhlciBiZWluZyBlcnJvcmVkLCBvciBoYXZpbmcgYW4gYWJvcnRcbiAgICAgKiBxdWV1ZWQgdXApLiBJdCB3aWxsIHJldHVybiB6ZXJvIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkLiBBbmQgdGhlIGdldHRlciB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpbnZva2VkIHdoZW5cbiAgICAgKiB0aGUgd3JpdGVy4oCZcyBsb2NrIGlzIHJlbGVhc2VkLlxuICAgICAqL1xuICAgIGdldCBkZXNpcmVkU2l6ZSgpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSBzdHJlYW3igJlzIGludGVybmFsIHF1ZXVlIHRyYW5zaXRpb25zXG4gICAgICogZnJvbSBub24tcG9zaXRpdmUgdG8gcG9zaXRpdmUsIHNpZ25hbGluZyB0aGF0IGl0IGlzIG5vIGxvbmdlciBhcHBseWluZyBiYWNrcHJlc3N1cmUuIE9uY2UgdGhlIGRlc2lyZWQgc2l6ZSBkaXBzXG4gICAgICogYmFjayB0byB6ZXJvIG9yIGJlbG93LCB0aGUgZ2V0dGVyIHdpbGwgcmV0dXJuIGEgbmV3IHByb21pc2UgdGhhdCBzdGF5cyBwZW5kaW5nIHVudGlsIHRoZSBuZXh0IHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3RyZWFtIGJlY29tZXMgZXJyb3JlZCBvciBhYm9ydGVkLCBvciB0aGUgd3JpdGVy4oCZcyBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlY29tZVxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIGdldCByZWFkeSgpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWR5JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkeVByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSByZWFkZXIgaXMgYWN0aXZlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAbGluayBXcml0YWJsZVN0cmVhbS5hYm9ydCB8IHN0cmVhbS5hYm9ydChyZWFzb24pfS5cbiAgICAgKi9cbiAgICBhYm9ydChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Fib3J0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCdhYm9ydCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQWJvcnQodGhpcywgcmVhc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlYWRlciBpcyBhY3RpdmUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMge0BsaW5rIFdyaXRhYmxlU3RyZWFtLmNsb3NlIHwgc3RyZWFtLmNsb3NlKCl9LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjbG9zZSBhbiBhbHJlYWR5LWNsb3Npbmcgc3RyZWFtJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdGhlIHdyaXRlcuKAmXMgbG9jayBvbiB0aGUgY29ycmVzcG9uZGluZyBzdHJlYW0uIEFmdGVyIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgd3JpdGVyIGlzIG5vIGxvbmdlciBhY3RpdmUuXG4gICAgICogSWYgdGhlIGFzc29jaWF0ZWQgc3RyZWFtIGlzIGVycm9yZWQgd2hlbiB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIHdyaXRlciB3aWxsIGFwcGVhciBlcnJvcmVkIGluIHRoZSBzYW1lIHdheSBmcm9tXG4gICAgICogbm93IG9uOyBvdGhlcndpc2UsIHRoZSB3cml0ZXIgd2lsbCBhcHBlYXIgY2xvc2VkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBsb2NrIGNhbiBzdGlsbCBiZSByZWxlYXNlZCBldmVuIGlmIHNvbWUgb25nb2luZyB3cml0ZXMgaGF2ZSBub3QgeWV0IGZpbmlzaGVkIChpLmUuIGV2ZW4gaWYgdGhlXG4gICAgICogcHJvbWlzZXMgcmV0dXJuZWQgZnJvbSBwcmV2aW91cyBjYWxscyB0byB7QGxpbmsgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLndyaXRlIHwgd3JpdGUoKX0gaGF2ZSBub3QgeWV0IHNldHRsZWQpLlxuICAgICAqIEl04oCZcyBub3QgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlIGxvY2sgb24gdGhlIHdyaXRlciBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3cml0ZTsgdGhlIGxvY2sgaW5zdGVhZCBzaW1wbHkgcHJldmVudHNcbiAgICAgKiBvdGhlciBwcm9kdWNlcnMgZnJvbSB3cml0aW5nIGluIGFuIGludGVybGVhdmVkIG1hbm5lci5cbiAgICAgKi9cbiAgICByZWxlYXNlTG9jaygpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh0aGlzKTtcbiAgICB9XG4gICAgd3JpdGUoY2h1bmsgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3dyaXRlJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCd3cml0ZSB0bycpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyV3JpdGUodGhpcywgY2h1bmspO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIHtcbiAgICBhYm9ydDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgY2xvc2U6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlbGVhc2VMb2NrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB3cml0ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgY2xvc2VkOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBkZXNpcmVkU2l6ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVhZHk6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLlxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19vd25lcldyaXRhYmxlU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcjtcbn1cbi8vIEEgY2xpZW50IG9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGUgY2hlY2suXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydChzdHJlYW0sIHJlYXNvbik7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh3cml0ZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24od3JpdGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSB8fCBzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh3cml0ZXIpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHdyaXRlciwgZXJyb3IpIHtcbiAgICBpZiAod3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIGVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgZXJyb3IpIHtcbiAgICBpZiAod3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCBlcnJvcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHdyaXRlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcgfHwgc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh3cml0ZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgY29uc3QgcmVsZWFzZWRFcnJvciA9IG5ldyBUeXBlRXJyb3IoYFdyaXRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzYCk7XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCByZWxlYXNlZEVycm9yKTtcbiAgICAvLyBUaGUgc3RhdGUgdHJhbnNpdGlvbnMgdG8gXCJlcnJvcmVkXCIgYmVmb3JlIHRoZSBzaW5rIGFib3J0KCkgbWV0aG9kIHJ1bnMsIGJ1dCB0aGUgd3JpdGVyLmNsb3NlZCBwcm9taXNlIGlzIG5vdFxuICAgIC8vIHJlamVjdGVkIHVudGlsIGFmdGVyd2FyZHMuIFRoaXMgbWVhbnMgdGhhdCBzaW1wbHkgdGVzdGluZyBzdGF0ZSB3aWxsIG5vdCB3b3JrLlxuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZUNsb3NlZFByb21pc2VSZWplY3RlZCh3cml0ZXIsIHJlbGVhc2VkRXJyb3IpO1xuICAgIHN0cmVhbS5fd3JpdGVyID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbSA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspO1xuICAgIGlmIChzdHJlYW0gIT09IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignd3JpdGUgdG8nKSk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgfHwgc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgY2xvc2luZyBvciBjbG9zZWQgYW5kIGNhbm5vdCBiZSB3cml0dGVuIHRvJykpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSBXcml0YWJsZVN0cmVhbUFkZFdyaXRlUmVxdWVzdChzdHJlYW0pO1xuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJXcml0ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmNvbnN0IGNsb3NlU2VudGluZWwgPSB7fTtcbi8qKlxuICogQWxsb3dzIGNvbnRyb2wgb2YgYSB7QGxpbmsgV3JpdGFibGVTdHJlYW0gfCB3cml0YWJsZSBzdHJlYW19J3Mgc3RhdGUgYW5kIGludGVybmFsIHF1ZXVlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB3aGljaCB3YXMgcGFzc2VkIHRvIGBXcml0YWJsZVN0cmVhbS5hYm9ydChyZWFzb24pYCB3aGVuIHRoZSBzdHJlYW0gd2FzIGFib3J0ZWQuXG4gICAgICovXG4gICAgZ2V0IGFib3J0UmVhc29uKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2Fib3J0UmVhc29uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fib3J0UmVhc29uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBgQWJvcnRTaWduYWxgIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWJvcnQgdGhlIHBlbmRpbmcgd3JpdGUgb3IgY2xvc2Ugb3BlcmF0aW9uIHdoZW4gdGhlIHN0cmVhbSBpcyBhYm9ydGVkLlxuICAgICAqL1xuICAgIGdldCBzaWduYWwoKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMignc2lnbmFsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Fib3J0Q29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBPbGRlciBicm93c2VycyBvciBvbGRlciBOb2RlIHZlcnNpb25zIG1heSBub3Qgc3VwcG9ydCBgQWJvcnRDb250cm9sbGVyYCBvciBgQWJvcnRTaWduYWxgLlxuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBidW5kbGUgYW5kIHNoaXAgYW4gYEFib3J0Q29udHJvbGxlcmAgcG9seWZpbGwgdG9nZXRoZXIgd2l0aCBvdXIgcG9seWZpbGwsXG4gICAgICAgICAgICAvLyBzbyBpbnN0ZWFkIHdlIG9ubHkgaW1wbGVtZW50IHN1cHBvcnQgZm9yIGBzaWduYWxgIGlmIHdlIGZpbmQgYSBnbG9iYWwgYEFib3J0Q29udHJvbGxlcmAgY29uc3RydWN0b3IuXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS5zaWduYWwgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGNvbnRyb2xsZWQgd3JpdGFibGUgc3RyZWFtLCBtYWtpbmcgYWxsIGZ1dHVyZSBpbnRlcmFjdGlvbnMgd2l0aCBpdCBmYWlsIHdpdGggdGhlIGdpdmVuIGVycm9yIGBlYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHJhcmVseSB1c2VkLCBzaW5jZSB1c3VhbGx5IGl0IHN1ZmZpY2VzIHRvIHJldHVybiBhIHJlamVjdGVkIHByb21pc2UgZnJvbSBvbmUgb2YgdGhlIHVuZGVybHlpbmdcbiAgICAgKiBzaW5rJ3MgbWV0aG9kcy4gSG93ZXZlciwgaXQgY2FuIGJlIHVzZWZ1bCBmb3Igc3VkZGVubHkgc2h1dHRpbmcgZG93biBhIHN0cmVhbSBpbiByZXNwb25zZSB0byBhbiBldmVudCBvdXRzaWRlIHRoZVxuICAgICAqIG5vcm1hbCBsaWZlY3ljbGUgb2YgaW50ZXJhY3Rpb25zIHdpdGggdGhlIHVuZGVybHlpbmcgc2luay5cbiAgICAgKi9cbiAgICBlcnJvcihlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMignZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBjbG9zZWQsIGVycm9yZWQgb3Igd2lsbCBiZSBzb29uLiBUaGUgc2luayBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgaWYgaXQgZ2V0cyBhbiBlcnJvciBoZXJlLCBzb1xuICAgICAgICAgICAgLy8ganVzdCB0cmVhdCBpdCBhcyBhIG5vLW9wLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCBlKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtBYm9ydFN0ZXBzXShyZWFzb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fYWJvcnRBbGdvcml0aG0ocmVhc29uKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtFcnJvclN0ZXBzXSgpIHtcbiAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIGVycm9yOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGltcGxlbWVudGluZyBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgdGhlIFdyaXRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XG59XG5mdW5jdGlvbiBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbSA9IHN0cmVhbTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgLy8gTmVlZCB0byBzZXQgdGhlIHNsb3RzIHNvIHRoYXQgdGhlIGFzc2VydCBkb2Vzbid0IGZpcmUuIEluIHRoZSBzcGVjIHRoZSBzbG90cyBhbHJlYWR5IGV4aXN0IGltcGxpY2l0bHkuXG4gICAgY29udHJvbGxlci5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPSB1bmRlZmluZWQ7XG4gICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLl9hYm9ydFJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9hYm9ydENvbnRyb2xsZXIgPSBjcmVhdGVBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtID0gc2l6ZUFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7XG4gICAgY29udHJvbGxlci5fd3JpdGVBbGdvcml0aG0gPSB3cml0ZUFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSA9IGNsb3NlQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gYWJvcnRBbGdvcml0aG07XG4gICAgY29uc3QgYmFja3ByZXNzdXJlID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKTtcbiAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBzdGFydEFsZ29yaXRobSgpO1xuICAgIGNvbnN0IHN0YXJ0UHJvbWlzZSA9IHByb21pc2VSZXNvbHZlZFdpdGgoc3RhcnRSZXN1bHQpO1xuICAgIHVwb25Qcm9taXNlKHN0YXJ0UHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH0sIHIgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIHIpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHN0cmVhbSwgdW5kZXJseWluZ1NpbmssIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgbGV0IHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZWZpbmVkO1xuICAgIGxldCB3cml0ZUFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBsZXQgY2xvc2VBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgbGV0IGFib3J0QWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGlmICh1bmRlcmx5aW5nU2luay5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ1Npbmsuc3RhcnQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nU2luay53cml0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdyaXRlQWxnb3JpdGhtID0gY2h1bmsgPT4gdW5kZXJseWluZ1Npbmsud3JpdGUoY2h1bmssIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBpZiAodW5kZXJseWluZ1NpbmsuY2xvc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbG9zZUFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdTaW5rLmNsb3NlKCk7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nU2luay5hYm9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFib3J0QWxnb3JpdGhtID0gcmVhc29uID0+IHVuZGVybHlpbmdTaW5rLmFib3J0KHJlYXNvbik7XG4gICAgfVxuICAgIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbn1cbi8vIENsZWFyQWxnb3JpdGhtcyBtYXkgYmUgY2FsbGVkIHR3aWNlLiBFcnJvcmluZyB0aGUgc2FtZSBzdHJlYW0gaW4gbXVsdGlwbGUgd2F5cyB3aWxsIG9mdGVuIHJlc3VsdCBpbiByZWR1bmRhbnQgY2FsbHMuXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHtcbiAgICBjb250cm9sbGVyLl93cml0ZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9hYm9ydEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoY29udHJvbGxlcikge1xuICAgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsIGNsb3NlU2VudGluZWwsIDApO1xuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtKGNodW5rKTtcbiAgICB9XG4gICAgY2F0Y2ggKGNodW5rU2l6ZUUpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoY29udHJvbGxlciwgY2h1bmtTaXplRSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyV3JpdGUoY29udHJvbGxlciwgY2h1bmssIGNodW5rU2l6ZSkge1xuICAgIHRyeSB7XG4gICAgICAgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpO1xuICAgIH1cbiAgICBjYXRjaCAoZW5xdWV1ZUUpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoY29udHJvbGxlciwgZW5xdWV1ZUUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICBpZiAoIVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgJiYgc3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBjb25zdCBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpO1xuICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgfVxuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgaWYgKCFjb250cm9sbGVyLl9zdGFydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IFBlZWtRdWV1ZVZhbHVlKGNvbnRyb2xsZXIpO1xuICAgIGlmICh2YWx1ZSA9PT0gY2xvc2VTZW50aW5lbCkge1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc0Nsb3NlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZShjb250cm9sbGVyLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoY29udHJvbGxlciwgZXJyb3IpIHtcbiAgICBpZiAoY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICBXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pO1xuICAgIERlcXVldWVWYWx1ZShjb250cm9sbGVyKTtcbiAgICBjb25zdCBzaW5rQ2xvc2VQcm9taXNlID0gY29udHJvbGxlci5fY2xvc2VBbGdvcml0aG0oKTtcbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgIHVwb25Qcm9taXNlKHNpbmtDbG9zZVByb21pc2UsICgpID0+IHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlKHN0cmVhbSk7XG4gICAgfSwgcmVhc29uID0+IHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlV2l0aEVycm9yKHN0cmVhbSwgcmVhc29uKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzV3JpdGUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pO1xuICAgIGNvbnN0IHNpbmtXcml0ZVByb21pc2UgPSBjb250cm9sbGVyLl93cml0ZUFsZ29yaXRobShjaHVuayk7XG4gICAgdXBvblByb21pc2Uoc2lua1dyaXRlUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUoc3RyZWFtKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBEZXF1ZXVlVmFsdWUoY29udHJvbGxlcik7XG4gICAgICAgIGlmICghV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSAmJiBzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgY29uc3QgYmFja3ByZXNzdXJlID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKTtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKTtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgfSwgcmVhc29uID0+IHtcbiAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yKHN0cmVhbSwgcmVhc29uKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcikge1xuICAgIGNvbnN0IGRlc2lyZWRTaXplID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpO1xuICAgIHJldHVybiBkZXNpcmVkU2l6ZSA8PSAwO1xufVxuLy8gQSBjbGllbnQgb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGUgY2hlY2suXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZXJyb3IpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3Jpbmcoc3RyZWFtLCBlcnJvcik7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW0uXG5mdW5jdGlvbiBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIobmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW1gKTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDIobmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyYCk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLlxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcmApO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdDYW5ub3QgJyArIG5hbWUgKyAnIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgd3JpdGVyJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKSB7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncGVuZGluZyc7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7XG4gICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh3cml0ZXIpIHtcbiAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgcmVhc29uKSB7XG4gICAgaWYgKHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUod3JpdGVyLl9jbG9zZWRQcm9taXNlKTtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0KHJlYXNvbik7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9ICdyZWplY3RlZCc7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcikge1xuICAgIGlmICh3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZVN0YXRlID0gJ3Jlc29sdmVkJztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcikge1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdwZW5kaW5nJztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQod3JpdGVyKSB7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGlmICh3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUod3JpdGVyLl9yZWFkeVByb21pc2UpO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPSAncmVqZWN0ZWQnO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0KHdyaXRlcikge1xuICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcikge1xuICAgIGlmICh3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdmdWxmaWxsZWQnO1xufVxuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJkb21cIiAvPlxuY29uc3QgTmF0aXZlRE9NRXhjZXB0aW9uID0gdHlwZW9mIERPTUV4Y2VwdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBET01FeGNlcHRpb24gOiB1bmRlZmluZWQ7XG5cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwibm9kZVwiIC8+XG5mdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKGN0b3IpIHtcbiAgICBpZiAoISh0eXBlb2YgY3RvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgY3RvciA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbmV3IGN0b3IoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGNvbnN0IGN0b3IgPSBmdW5jdGlvbiBET01FeGNlcHRpb24obWVzc2FnZSwgbmFtZSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICcnO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdFcnJvcic7XG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdG9yLnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgeyB2YWx1ZTogY3Rvciwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gY3Rvcjtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmNvbnN0IERPTUV4Y2VwdGlvbiQxID0gaXNET01FeGNlcHRpb25Db25zdHJ1Y3RvcihOYXRpdmVET01FeGNlcHRpb24pID8gTmF0aXZlRE9NRXhjZXB0aW9uIDogY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwoKTtcblxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1QaXBlVG8oc291cmNlLCBkZXN0LCBwcmV2ZW50Q2xvc2UsIHByZXZlbnRBYm9ydCwgcHJldmVudENhbmNlbCwgc2lnbmFsKSB7XG4gICAgY29uc3QgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzb3VyY2UpO1xuICAgIGNvbnN0IHdyaXRlciA9IEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoZGVzdCk7XG4gICAgc291cmNlLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgICAvLyBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3BlYydzIHJlcXVpcmVtZW50IHRoYXQgd2Ugd2FpdCBmb3Igb25nb2luZyB3cml0ZXMgZHVyaW5nIHNodXRkb3duLlxuICAgIGxldCBjdXJyZW50V3JpdGUgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgYWJvcnRBbGdvcml0aG07XG4gICAgICAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWJvcnRBbGdvcml0aG0gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRE9NRXhjZXB0aW9uJDEoJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXZlbnRBYm9ydCkge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQWJvcnQoZGVzdCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcHJldmVudENhbmNlbCkge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5fc3RhdGUgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKCgpID0+IFByb21pc2UuYWxsKGFjdGlvbnMubWFwKGFjdGlvbiA9PiBhY3Rpb24oKSkpLCB0cnVlLCBlcnJvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgYWJvcnRBbGdvcml0aG0oKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEFsZ29yaXRobSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNpbmcgcmVhZGVyIGFuZCB3cml0ZXIsIHJlYWQgYWxsIGNodW5rcyBmcm9tIHRoaXMgYW5kIHdyaXRlIHRoZW0gdG8gZGVzdFxuICAgICAgICAvLyAtIEJhY2twcmVzc3VyZSBtdXN0IGJlIGVuZm9yY2VkXG4gICAgICAgIC8vIC0gU2h1dGRvd24gbXVzdCBzdG9wIGFsbCBhY3Rpdml0eVxuICAgICAgICBmdW5jdGlvbiBwaXBlTG9vcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9taXNlKChyZXNvbHZlTG9vcCwgcmVqZWN0TG9vcCkgPT4ge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5leHQoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBgUGVyZm9ybVByb21pc2VUaGVuYCBpbnN0ZWFkIG9mIGB1cG9uUHJvbWlzZWAgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGluZyB1bm5lY2Vzc2FyeSBgLmNhdGNoKHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbilgIGhhbmRsZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocGlwZVN0ZXAoKSwgbmV4dCwgcmVqZWN0TG9vcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwaXBlU3RlcCgpIHtcbiAgICAgICAgICAgIGlmIChzaHV0dGluZ0Rvd24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4od3JpdGVyLl9yZWFkeVByb21pc2UsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3UHJvbWlzZSgocmVzb2x2ZVJlYWQsIHJlamVjdFJlYWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFdyaXRlID0gUGVyZm9ybVByb21pc2VUaGVuKFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspLCB1bmRlZmluZWQsIG5vb3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVSZWFkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VTdGVwczogKCkgPT4gcmVzb2x2ZVJlYWQodHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBfZXJyb3JTdGVwczogcmVqZWN0UmVhZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVycm9ycyBtdXN0IGJlIHByb3BhZ2F0ZWQgZm9yd2FyZFxuICAgICAgICBpc09yQmVjb21lc0Vycm9yZWQoc291cmNlLCByZWFkZXIuX2Nsb3NlZFByb21pc2UsIHN0b3JlZEVycm9yID0+IHtcbiAgICAgICAgICAgIGlmICghcHJldmVudEFib3J0KSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKCgpID0+IFdyaXRhYmxlU3RyZWFtQWJvcnQoZGVzdCwgc3RvcmVkRXJyb3IpLCB0cnVlLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bih0cnVlLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBFcnJvcnMgbXVzdCBiZSBwcm9wYWdhdGVkIGJhY2t3YXJkXG4gICAgICAgIGlzT3JCZWNvbWVzRXJyb3JlZChkZXN0LCB3cml0ZXIuX2Nsb3NlZFByb21pc2UsIHN0b3JlZEVycm9yID0+IHtcbiAgICAgICAgICAgIGlmICghcHJldmVudENhbmNlbCkge1xuICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbigoKSA9PiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIHN0b3JlZEVycm9yKSwgdHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ2xvc2luZyBtdXN0IGJlIHByb3BhZ2F0ZWQgZm9yd2FyZFxuICAgICAgICBpc09yQmVjb21lc0Nsb3NlZChzb3VyY2UsIHJlYWRlci5fY2xvc2VkUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcmV2ZW50Q2xvc2UpIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oKCkgPT4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih3cml0ZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNodXRkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDbG9zaW5nIG11c3QgYmUgcHJvcGFnYXRlZCBiYWNrd2FyZFxuICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoZGVzdCkgfHwgZGVzdC5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0Q2xvc2VkID0gbmV3IFR5cGVFcnJvcigndGhlIGRlc3RpbmF0aW9uIHdyaXRhYmxlIHN0cmVhbSBjbG9zZWQgYmVmb3JlIGFsbCBkYXRhIGNvdWxkIGJlIHBpcGVkIHRvIGl0Jyk7XG4gICAgICAgICAgICBpZiAoIXByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oKCkgPT4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBkZXN0Q2xvc2VkKSwgdHJ1ZSwgZGVzdENsb3NlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bih0cnVlLCBkZXN0Q2xvc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHBpcGVMb29wKCkpO1xuICAgICAgICBmdW5jdGlvbiB3YWl0Rm9yV3JpdGVzVG9GaW5pc2goKSB7XG4gICAgICAgICAgICAvLyBBbm90aGVyIHdyaXRlIG1heSBoYXZlIHN0YXJ0ZWQgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIG9uIHRoaXMgY3VycmVudFdyaXRlLCBzbyB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gd2FpdFxuICAgICAgICAgICAgLy8gZm9yIHRoYXQgdG9vLlxuICAgICAgICAgICAgY29uc3Qgb2xkQ3VycmVudFdyaXRlID0gY3VycmVudFdyaXRlO1xuICAgICAgICAgICAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihjdXJyZW50V3JpdGUsICgpID0+IG9sZEN1cnJlbnRXcml0ZSAhPT0gY3VycmVudFdyaXRlID8gd2FpdEZvcldyaXRlc1RvRmluaXNoKCkgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzT3JCZWNvbWVzRXJyb3JlZChzdHJlYW0sIHByb21pc2UsIGFjdGlvbikge1xuICAgICAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgICAgIGFjdGlvbihzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwb25SZWplY3Rpb24ocHJvbWlzZSwgYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc09yQmVjb21lc0Nsb3NlZChzdHJlYW0sIHByb21pc2UsIGFjdGlvbikge1xuICAgICAgICAgICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQocHJvbWlzZSwgYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzaHV0ZG93bldpdGhBY3Rpb24oYWN0aW9uLCBvcmlnaW5hbElzRXJyb3IsIG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChzaHV0dGluZ0Rvd24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmICFXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChkZXN0KSkge1xuICAgICAgICAgICAgICAgIHVwb25GdWxmaWxsbWVudCh3YWl0Rm9yV3JpdGVzVG9GaW5pc2goKSwgZG9UaGVSZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvVGhlUmVzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZG9UaGVSZXN0KCkge1xuICAgICAgICAgICAgICAgIHVwb25Qcm9taXNlKGFjdGlvbigpLCAoKSA9PiBmaW5hbGl6ZShvcmlnaW5hbElzRXJyb3IsIG9yaWdpbmFsRXJyb3IpLCBuZXdFcnJvciA9PiBmaW5hbGl6ZSh0cnVlLCBuZXdFcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNodXRkb3duKGlzRXJyb3IsIGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoc2h1dHRpbmdEb3duKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChkZXN0Ll9zdGF0ZSA9PT0gJ3dyaXRhYmxlJyAmJiAhV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoZGVzdCkpIHtcbiAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksICgpID0+IGZpbmFsaXplKGlzRXJyb3IsIGVycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZmluYWxpemUoaXNFcnJvciwgZXJyb3IpIHtcbiAgICAgICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2Uod3JpdGVyKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UocmVhZGVyKTtcbiAgICAgICAgICAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QWxnb3JpdGhtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEFsbG93cyBjb250cm9sIG9mIGEge0BsaW5rIFJlYWRhYmxlU3RyZWFtIHwgcmVhZGFibGUgc3RyZWFtfSdzIHN0YXRlIGFuZCBpbnRlcm5hbCBxdWV1ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSBjb250cm9sbGVkIHN0cmVhbSdzIGludGVybmFsIHF1ZXVlLiBJdCBjYW4gYmUgbmVnYXRpdmUsIGlmIHRoZSBxdWV1ZSBpc1xuICAgICAqIG92ZXItZnVsbC4gQW4gdW5kZXJseWluZyBzb3VyY2Ugb3VnaHQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gYW5kIGhvdyB0byBhcHBseSBiYWNrcHJlc3N1cmUuXG4gICAgICovXG4gICAgZ2V0IGRlc2lyZWRTaXplKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjb250cm9sbGVkIHJlYWRhYmxlIHN0cmVhbS4gQ29uc3VtZXJzIHdpbGwgc3RpbGwgYmUgYWJsZSB0byByZWFkIGFueSBwcmV2aW91c2x5LWVucXVldWVkIGNodW5rcyBmcm9tXG4gICAgICogdGhlIHN0cmVhbSwgYnV0IG9uY2UgdGhvc2UgYXJlIHJlYWQsIHRoZSBzdHJlYW0gd2lsbCBiZWNvbWUgY2xvc2VkLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Nsb3NlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgbm90IGluIGEgc3RhdGUgdGhhdCBwZXJtaXRzIGNsb3NlJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHRoaXMpO1xuICAgIH1cbiAgICBlbnF1ZXVlKGNodW5rID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnZW5xdWV1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGlzIG5vdCBpbiBhIHN0YXRlIHRoYXQgcGVybWl0cyBlbnF1ZXVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXJyb3JzIHRoZSBjb250cm9sbGVkIHJlYWRhYmxlIHN0cmVhbSwgbWFraW5nIGFsbCBmdXR1cmUgaW50ZXJhY3Rpb25zIHdpdGggaXQgZmFpbCB3aXRoIHRoZSBnaXZlbiBlcnJvciBgZWAuXG4gICAgICovXG4gICAgZXJyb3IoZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHRoaXMsIGUpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgW0NhbmNlbFN0ZXBzXShyZWFzb24pIHtcbiAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbUHVsbFN0ZXBzXShyZWFkUmVxdWVzdCkge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgICAgIGlmICh0aGlzLl9xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IERlcXVldWVWYWx1ZSh0aGlzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbG9zZVJlcXVlc3RlZCAmJiB0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2NodW5rU3RlcHMoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0sIHJlYWRSZXF1ZXN0KTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsIHtcbiAgICBjbG9zZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZW5xdWV1ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZXJyb3I6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGRlc2lyZWRTaXplOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNob3VsZFB1bGwgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcik7XG4gICAgaWYgKCFzaG91bGRQdWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXIuX3B1bGxpbmcpIHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwdWxsUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0oKTtcbiAgICB1cG9uUHJvbWlzZShwdWxsUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9wdWxsQWdhaW4pIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICB9LCBlID0+IHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoY29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWNvbnRyb2xsZXIuX3N0YXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBkZXNpcmVkU2l6ZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTtcbiAgICBpZiAoZGVzaXJlZFNpemUgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHtcbiAgICBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG59XG4vLyBBIGNsaWVudCBvZiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7XG4gICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoY29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGNvbnRyb2xsZXIsIGNodW5rKSB7XG4gICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoY29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGNodW5rLCBmYWxzZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgY2h1bmtTaXplO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2h1bmtTaXplID0gY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoY2h1bmtTaXplRSkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGNodW5rU2l6ZUUpO1xuICAgICAgICAgICAgdGhyb3cgY2h1bmtTaXplRTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgY2h1bmssIGNodW5rU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVucXVldWVFKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZW5xdWV1ZUUpO1xuICAgICAgICAgICAgdGhyb3cgZW5xdWV1ZUU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7XG59XG4vLyBUaGlzIGlzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIFRyYW5zZm9ybVN0cmVhbS5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJIYXNCYWNrcHJlc3N1cmUoY29udHJvbGxlcikge1xuICAgIGlmIChSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmICghY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgJiYgc3RhdGUgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0gPSBzdHJlYW07XG4gICAgY29udHJvbGxlci5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPSB1bmRlZmluZWQ7XG4gICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtID0gc2l6ZUFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7XG4gICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07XG4gICAgY29udHJvbGxlci5fY2FuY2VsQWxnb3JpdGhtID0gY2FuY2VsQWxnb3JpdGhtO1xuICAgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICBjb25zdCBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH0sIHIgPT4ge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdTb3VyY2UsIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgbGV0IHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZWZpbmVkO1xuICAgIGxldCBwdWxsQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGxldCBjYW5jZWxBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgaWYgKHVuZGVybHlpbmdTb3VyY2Uuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdGFydEFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdTb3VyY2Uuc3RhcnQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nU291cmNlLnB1bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwdWxsQWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ1NvdXJjZS5wdWxsKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBpZiAodW5kZXJseWluZ1NvdXJjZS5jYW5jZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYW5jZWxBbGdvcml0aG0gPSByZWFzb24gPT4gdW5kZXJseWluZ1NvdXJjZS5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gICAgU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbmZ1bmN0aW9uIGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcmApO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVRlZShzdHJlYW0sIGNsb25lRm9yQnJhbmNoMikge1xuICAgIGlmIChJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpKSB7XG4gICAgICAgIHJldHVybiBSZWFkYWJsZUJ5dGVTdHJlYW1UZWUoc3RyZWFtKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFRlZShzdHJlYW0pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0VGVlKHN0cmVhbSwgY2xvbmVGb3JCcmFuY2gyKSB7XG4gICAgY29uc3QgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pO1xuICAgIGxldCByZWFkaW5nID0gZmFsc2U7XG4gICAgbGV0IGNhbmNlbGVkMSA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWxlZDIgPSBmYWxzZTtcbiAgICBsZXQgcmVhc29uMTtcbiAgICBsZXQgcmVhc29uMjtcbiAgICBsZXQgYnJhbmNoMTtcbiAgICBsZXQgYnJhbmNoMjtcbiAgICBsZXQgcmVzb2x2ZUNhbmNlbFByb21pc2U7XG4gICAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ld1Byb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBwdWxsQWxnb3JpdGhtKCkge1xuICAgICAgICBpZiAocmVhZGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVhZFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfY2h1bmtTdGVwczogY2h1bmsgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZGVsYXllZCBhIG1pY3JvdGFzayBiZWNhdXNlIGl0IHRha2VzIGF0IGxlYXN0IGEgbWljcm90YXNrIHRvIGRldGVjdCBlcnJvcnMgKHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gcmVhZGVyLl9jbG9zZWRQcm9taXNlIGJlbG93KSwgYW5kIHdlIHdhbnQgZXJyb3JzIGluIHN0cmVhbSB0byBlcnJvciBib3RoIGJyYW5jaGVzIGltbWVkaWF0ZWx5LiBXZSBjYW5ub3QgbGV0XG4gICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCBzeW5jaHJvbm91c2x5LWF2YWlsYWJsZSByZWFkcyBnZXQgYWhlYWQgb2YgYXN5bmNocm9ub3VzbHktYXZhaWxhYmxlIGVycm9ycy5cbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsxID0gY2h1bms7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rMiA9IGNodW5rO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gYWNjZXNzIHRoZSBjbG9uaW5nIGNvZGUgcmlnaHQgbm93IGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFkZCBvbmUgdGhlbiB3ZSdsbCBuZWVkIGFuIGltcGxlbWVudGF0aW9uIGZvciBzZXJpYWxpemFibGUgb2JqZWN0cy5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFjYW5jZWxlZDIgJiYgY2xvbmVGb3JCcmFuY2gyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgY2h1bmsyID0gU3RydWN0dXJlZERlc2VyaWFsaXplKFN0cnVjdHVyZWRTZXJpYWxpemUoY2h1bmsyKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmsxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuazIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSB8fCAhY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9lcnJvclN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwgcmVhZFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWwxQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBjYW5jZWxlZDEgPSB0cnVlO1xuICAgICAgICByZWFzb24xID0gcmVhc29uO1xuICAgICAgICBpZiAoY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBDcmVhdGVBcnJheUZyb21MaXN0KFtyZWFzb24xLCByZWFzb24yXSk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWwyQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBjYW5jZWxlZDIgPSB0cnVlO1xuICAgICAgICByZWFzb24yID0gcmVhc29uO1xuICAgICAgICBpZiAoY2FuY2VsZWQxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBDcmVhdGVBcnJheUZyb21MaXN0KFtyZWFzb24xLCByZWFzb24yXSk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBicmFuY2gxID0gQ3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbDFBbGdvcml0aG0pO1xuICAgIGJyYW5jaDIgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7XG4gICAgdXBvblJlamVjdGlvbihyZWFkZXIuX2Nsb3NlZFByb21pc2UsIChyKSA9PiB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihicmFuY2gxLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgaWYgKCFjYW5jZWxlZDEgfHwgIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbYnJhbmNoMSwgYnJhbmNoMl07XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1UZWUoc3RyZWFtKSB7XG4gICAgbGV0IHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICBsZXQgcmVhZGluZyA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWxlZDEgPSBmYWxzZTtcbiAgICBsZXQgY2FuY2VsZWQyID0gZmFsc2U7XG4gICAgbGV0IHJlYXNvbjE7XG4gICAgbGV0IHJlYXNvbjI7XG4gICAgbGV0IGJyYW5jaDE7XG4gICAgbGV0IGJyYW5jaDI7XG4gICAgbGV0IHJlc29sdmVDYW5jZWxQcm9taXNlO1xuICAgIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXdQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gZm9yd2FyZFJlYWRlckVycm9yKHRoaXNSZWFkZXIpIHtcbiAgICAgICAgdXBvblJlamVjdGlvbih0aGlzUmVhZGVyLl9jbG9zZWRQcm9taXNlLCByID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzUmVhZGVyICE9PSByZWFkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHIpO1xuICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEgfHwgIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsV2l0aERlZmF1bHRSZWFkZXIoKSB7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG4gICAgICAgICAgICBmb3J3YXJkUmVhZGVyRXJyb3IocmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBkZWxheWVkIGEgbWljcm90YXNrIGJlY2F1c2UgaXQgdGFrZXMgYXQgbGVhc3QgYSBtaWNyb3Rhc2sgdG8gZGV0ZWN0IGVycm9ycyAodXNpbmdcbiAgICAgICAgICAgICAgICAvLyByZWFkZXIuX2Nsb3NlZFByb21pc2UgYmVsb3cpLCBhbmQgd2Ugd2FudCBlcnJvcnMgaW4gc3RyZWFtIHRvIGVycm9yIGJvdGggYnJhbmNoZXMgaW1tZWRpYXRlbHkuIFdlIGNhbm5vdCBsZXRcbiAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIHN5bmNocm9ub3VzbHktYXZhaWxhYmxlIHJlYWRzIGdldCBhaGVhZCBvZiBhc3luY2hyb25vdXNseS1hdmFpbGFibGUgZXJyb3JzLlxuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuazEgPSBjaHVuaztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rMiA9IGNodW5rO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSAmJiAhY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rMiA9IENsb25lQXNVaW50OEFycmF5KGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChjbG9uZUUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjbG9uZUUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNsb25lRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCBjbG9uZUUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmsxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuazIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQxIHx8ICFjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyLCByZWFkUmVxdWVzdCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1bGxXaXRoQllPQlJlYWRlcih2aWV3LCBmb3JCcmFuY2gyKSB7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHN0cmVhbSk7XG4gICAgICAgICAgICBmb3J3YXJkUmVhZGVyRXJyb3IocmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieW9iQnJhbmNoID0gZm9yQnJhbmNoMiA/IGJyYW5jaDIgOiBicmFuY2gxO1xuICAgICAgICBjb25zdCBvdGhlckJyYW5jaCA9IGZvckJyYW5jaDIgPyBicmFuY2gxIDogYnJhbmNoMjtcbiAgICAgICAgY29uc3QgcmVhZEludG9SZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlbGF5ZWQgYSBtaWNyb3Rhc2sgYmVjYXVzZSBpdCB0YWtlcyBhdCBsZWFzdCBhIG1pY3JvdGFzayB0byBkZXRlY3QgZXJyb3JzICh1c2luZ1xuICAgICAgICAgICAgICAgIC8vIHJlYWRlci5fY2xvc2VkUHJvbWlzZSBiZWxvdyksIGFuZCB3ZSB3YW50IGVycm9ycyBpbiBzdHJlYW0gdG8gZXJyb3IgYm90aCBicmFuY2hlcyBpbW1lZGlhdGVseS4gV2UgY2Fubm90IGxldFxuICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwgc3luY2hyb25vdXNseS1hdmFpbGFibGUgcmVhZHMgZ2V0IGFoZWFkIG9mIGFzeW5jaHJvbm91c2x5LWF2YWlsYWJsZSBlcnJvcnMuXG4gICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ5b2JDYW5jZWxlZCA9IGZvckJyYW5jaDIgPyBjYW5jZWxlZDIgOiBjYW5jZWxlZDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyQ2FuY2VsZWQgPSBmb3JCcmFuY2gyID8gY2FuY2VsZWQxIDogY2FuY2VsZWQyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW90aGVyQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9uZWRDaHVuaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkQ2h1bmsgPSBDbG9uZUFzVWludDhBcnJheShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoY2xvbmVFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2xvbmVFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3Iob3RoZXJCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2xvbmVFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNsb25lRSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnlvYkNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3VmlldyhieW9iQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKG90aGVyQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNsb25lZENodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghYnlvYkNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgYnlvYkNhbmNlbGVkID0gZm9yQnJhbmNoMiA/IGNhbmNlbGVkMiA6IGNhbmNlbGVkMTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlckNhbmNlbGVkID0gZm9yQnJhbmNoMiA/IGNhbmNlbGVkMSA6IGNhbmNlbGVkMjtcbiAgICAgICAgICAgICAgICBpZiAoIWJ5b2JDYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UoYnlvYkJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFvdGhlckNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShvdGhlckJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNodW5rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFieW9iQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcoYnlvYkJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvdGhlckNhbmNlbGVkICYmIG90aGVyQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQob3RoZXJCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFieW9iQ2FuY2VsZWQgfHwgIW90aGVyQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQocmVhZGVyLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsMUFsZ29yaXRobSgpIHtcbiAgICAgICAgaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJ5b2JSZXF1ZXN0ID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgIGlmIChieW9iUmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHVsbFdpdGhEZWZhdWx0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwdWxsV2l0aEJZT0JSZWFkZXIoYnlvYlJlcXVlc3QuX3ZpZXcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsMkFsZ29yaXRobSgpIHtcbiAgICAgICAgaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJ5b2JSZXF1ZXN0ID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgIGlmIChieW9iUmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHVsbFdpdGhEZWZhdWx0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwdWxsV2l0aEJZT0JSZWFkZXIoYnlvYlJlcXVlc3QuX3ZpZXcsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbDFBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgIGNhbmNlbGVkMSA9IHRydWU7XG4gICAgICAgIHJlYXNvbjEgPSByZWFzb247XG4gICAgICAgIGlmIChjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZVJlYXNvbiA9IENyZWF0ZUFycmF5RnJvbUxpc3QoW3JlYXNvbjEsIHJlYXNvbjJdKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTtcbiAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKGNhbmNlbFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbFByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbDJBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgIGNhbmNlbGVkMiA9IHRydWU7XG4gICAgICAgIHJlYXNvbjIgPSByZWFzb247XG4gICAgICAgIGlmIChjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZVJlYXNvbiA9IENyZWF0ZUFycmF5RnJvbUxpc3QoW3JlYXNvbjEsIHJlYXNvbjJdKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTtcbiAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKGNhbmNlbFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbFByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGJyYW5jaDEgPSBDcmVhdGVSZWFkYWJsZUJ5dGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGwxQWxnb3JpdGhtLCBjYW5jZWwxQWxnb3JpdGhtKTtcbiAgICBicmFuY2gyID0gQ3JlYXRlUmVhZGFibGVCeXRlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCBwdWxsMkFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7XG4gICAgZm9yd2FyZFJlYWRlckVycm9yKHJlYWRlcik7XG4gICAgcmV0dXJuIFticmFuY2gxLCBicmFuY2gyXTtcbn1cblxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdEZWZhdWx0T3JCeXRlU291cmNlKHNvdXJjZSwgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkoc291cmNlLCBjb250ZXh0KTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHNvdXJjZTtcbiAgICBjb25zdCBhdXRvQWxsb2NhdGVDaHVua1NpemUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwuYXV0b0FsbG9jYXRlQ2h1bmtTaXplO1xuICAgIGNvbnN0IGNhbmNlbCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5jYW5jZWw7XG4gICAgY29uc3QgcHVsbCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5wdWxsO1xuICAgIGNvbnN0IHN0YXJ0ID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnN0YXJ0O1xuICAgIGNvbnN0IHR5cGUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwudHlwZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhdXRvQWxsb2NhdGVDaHVua1NpemU6IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5zaWduZWRMb25nTG9uZ1dpdGhFbmZvcmNlUmFuZ2UoYXV0b0FsbG9jYXRlQ2h1bmtTaXplLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdhdXRvQWxsb2NhdGVDaHVua1NpemUnIHRoYXRgKSxcbiAgICAgICAgY2FuY2VsOiBjYW5jZWwgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTb3VyY2VDYW5jZWxDYWxsYmFjayhjYW5jZWwsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdjYW5jZWwnIHRoYXRgKSxcbiAgICAgICAgcHVsbDogcHVsbCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5kZXJseWluZ1NvdXJjZVB1bGxDYWxsYmFjayhwdWxsLCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAncHVsbCcgdGhhdGApLFxuICAgICAgICBzdGFydDogc3RhcnQgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTb3VyY2VTdGFydENhbGxiYWNrKHN0YXJ0LCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc3RhcnQnIHRoYXRgKSxcbiAgICAgICAgdHlwZTogdHlwZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogY29udmVydFJlYWRhYmxlU3RyZWFtVHlwZSh0eXBlLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICd0eXBlJyB0aGF0YClcbiAgICB9O1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTb3VyY2VDYW5jZWxDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChyZWFzb24pID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW3JlYXNvbl0pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTb3VyY2VQdWxsQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcHJvbWlzZUNhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTb3VyY2VTdGFydENhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKGNvbnRyb2xsZXIpID0+IHJlZmxlY3RDYWxsKGZuLCBvcmlnaW5hbCwgW2NvbnRyb2xsZXJdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRSZWFkYWJsZVN0cmVhbVR5cGUodHlwZSwgY29udGV4dCkge1xuICAgIHR5cGUgPSBgJHt0eXBlfWA7XG4gICAgaWYgKHR5cGUgIT09ICdieXRlcycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSAnJHt0eXBlfScgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yIFJlYWRhYmxlU3RyZWFtVHlwZWApO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZTtcbn1cblxuZnVuY3Rpb24gY29udmVydFJlYWRlck9wdGlvbnMob3B0aW9ucywgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkob3B0aW9ucywgY29udGV4dCk7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tb2RlO1xuICAgIHJldHVybiB7XG4gICAgICAgIG1vZGU6IG1vZGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRSZWFkYWJsZVN0cmVhbVJlYWRlck1vZGUobW9kZSwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnbW9kZScgdGhhdGApXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRSZWFkYWJsZVN0cmVhbVJlYWRlck1vZGUobW9kZSwgY29udGV4dCkge1xuICAgIG1vZGUgPSBgJHttb2RlfWA7XG4gICAgaWYgKG1vZGUgIT09ICdieW9iJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9ICcke21vZGV9JyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgUmVhZGFibGVTdHJlYW1SZWFkZXJNb2RlYCk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0SXRlcmF0b3JPcHRpb25zKG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KG9wdGlvbnMsIGNvbnRleHQpO1xuICAgIGNvbnN0IHByZXZlbnRDYW5jZWwgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldmVudENhbmNlbDtcbiAgICByZXR1cm4geyBwcmV2ZW50Q2FuY2VsOiBCb29sZWFuKHByZXZlbnRDYW5jZWwpIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQaXBlT3B0aW9ucyhvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShvcHRpb25zLCBjb250ZXh0KTtcbiAgICBjb25zdCBwcmV2ZW50QWJvcnQgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldmVudEFib3J0O1xuICAgIGNvbnN0IHByZXZlbnRDYW5jZWwgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldmVudENhbmNlbDtcbiAgICBjb25zdCBwcmV2ZW50Q2xvc2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJldmVudENsb3NlO1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEFib3J0U2lnbmFsKHNpZ25hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc2lnbmFsJyB0aGF0YCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByZXZlbnRBYm9ydDogQm9vbGVhbihwcmV2ZW50QWJvcnQpLFxuICAgICAgICBwcmV2ZW50Q2FuY2VsOiBCb29sZWFuKHByZXZlbnRDYW5jZWwpLFxuICAgICAgICBwcmV2ZW50Q2xvc2U6IEJvb2xlYW4ocHJldmVudENsb3NlKSxcbiAgICAgICAgc2lnbmFsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFzc2VydEFib3J0U2lnbmFsKHNpZ25hbCwgY29udGV4dCkge1xuICAgIGlmICghaXNBYm9ydFNpZ25hbChzaWduYWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7Y29udGV4dH0gaXMgbm90IGFuIEFib3J0U2lnbmFsLmApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFJlYWRhYmxlV3JpdGFibGVQYWlyKHBhaXIsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KHBhaXIsIGNvbnRleHQpO1xuICAgIGNvbnN0IHJlYWRhYmxlID0gcGFpciA9PT0gbnVsbCB8fCBwYWlyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYWlyLnJlYWRhYmxlO1xuICAgIGFzc2VydFJlcXVpcmVkRmllbGQocmVhZGFibGUsICdyZWFkYWJsZScsICdSZWFkYWJsZVdyaXRhYmxlUGFpcicpO1xuICAgIGFzc2VydFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdyZWFkYWJsZScgdGhhdGApO1xuICAgIGNvbnN0IHdyaXRhYmxlID0gcGFpciA9PT0gbnVsbCB8fCBwYWlyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYWlyLndyaXRhYmxlO1xuICAgIGFzc2VydFJlcXVpcmVkRmllbGQod3JpdGFibGUsICd3cml0YWJsZScsICdSZWFkYWJsZVdyaXRhYmxlUGFpcicpO1xuICAgIGFzc2VydFdyaXRhYmxlU3RyZWFtKHdyaXRhYmxlLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICd3cml0YWJsZScgdGhhdGApO1xuICAgIHJldHVybiB7IHJlYWRhYmxlLCB3cml0YWJsZSB9O1xufVxuXG4vKipcbiAqIEEgcmVhZGFibGUgc3RyZWFtIHJlcHJlc2VudHMgYSBzb3VyY2Ugb2YgZGF0YSwgZnJvbSB3aGljaCB5b3UgY2FuIHJlYWQuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBSZWFkYWJsZVN0cmVhbSB7XG4gICAgY29uc3RydWN0b3IocmF3VW5kZXJseWluZ1NvdXJjZSA9IHt9LCByYXdTdHJhdGVneSA9IHt9KSB7XG4gICAgICAgIGlmIChyYXdVbmRlcmx5aW5nU291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJhd1VuZGVybHlpbmdTb3VyY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0T2JqZWN0KHJhd1VuZGVybHlpbmdTb3VyY2UsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJhdGVneSA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kocmF3U3RyYXRlZ3ksICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IHVuZGVybHlpbmdTb3VyY2UgPSBjb252ZXJ0VW5kZXJseWluZ0RlZmF1bHRPckJ5dGVTb3VyY2UocmF3VW5kZXJseWluZ1NvdXJjZSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBJbml0aWFsaXplUmVhZGFibGVTdHJlYW0odGhpcyk7XG4gICAgICAgIGlmICh1bmRlcmx5aW5nU291cmNlLnR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgICAgIGlmIChzdHJhdGVneS5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHN0cmF0ZWd5IGZvciBhIGJ5dGUgc3RyZWFtIGNhbm5vdCBoYXZlIGEgc2l6ZSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGlnaFdhdGVyTWFyayA9IEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHN0cmF0ZWd5LCAwKTtcbiAgICAgICAgICAgIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHRoaXMsIHVuZGVybHlpbmdTb3VyY2UsIGhpZ2hXYXRlck1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZUFsZ29yaXRobSA9IEV4dHJhY3RTaXplQWxnb3JpdGhtKHN0cmF0ZWd5KTtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hXYXRlck1hcmsgPSBFeHRyYWN0SGlnaFdhdGVyTWFyayhzdHJhdGVneSwgMSk7XG4gICAgICAgICAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcmVhZGFibGUgc3RyZWFtIGlzIGxvY2tlZCB0byBhIHtAbGluayBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgfCByZWFkZXJ9LlxuICAgICAqL1xuICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdsb2NrZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VscyB0aGUgc3RyZWFtLCBzaWduYWxpbmcgYSBsb3NzIG9mIGludGVyZXN0IGluIHRoZSBzdHJlYW0gYnkgYSBjb25zdW1lci5cbiAgICAgKlxuICAgICAqIFRoZSBzdXBwbGllZCBgcmVhc29uYCBhcmd1bWVudCB3aWxsIGJlIGdpdmVuIHRvIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSdzIHtAbGluayBVbmRlcmx5aW5nU291cmNlLmNhbmNlbCB8IGNhbmNlbCgpfVxuICAgICAqIG1ldGhvZCwgd2hpY2ggbWlnaHQgb3IgbWlnaHQgbm90IHVzZSBpdC5cbiAgICAgKi9cbiAgICBjYW5jZWwocmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdjYW5jZWwnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYW5jZWwgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHJlYWRlcicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwodGhpcywgcmVhc29uKTtcbiAgICB9XG4gICAgZ2V0UmVhZGVyKHJhd09wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2dldFJlYWRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb252ZXJ0UmVhZGVyT3B0aW9ucyhyYXdPcHRpb25zLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChvcHRpb25zLm1vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcyk7XG4gICAgfVxuICAgIHBpcGVUaHJvdWdoKHJhd1RyYW5zZm9ybSwgcmF3T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdwaXBlVGhyb3VnaCcpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQocmF3VHJhbnNmb3JtLCAxLCAncGlwZVRocm91Z2gnKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gY29udmVydFJlYWRhYmxlV3JpdGFibGVQYWlyKHJhd1RyYW5zZm9ybSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gY29udmVydFBpcGVPcHRpb25zKHJhd09wdGlvbnMsICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0cmFuc2Zvcm0ud3JpdGFibGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRocm91Z2ggY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNlID0gUmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcywgdHJhbnNmb3JtLndyaXRhYmxlLCBvcHRpb25zLnByZXZlbnRDbG9zZSwgb3B0aW9ucy5wcmV2ZW50QWJvcnQsIG9wdGlvbnMucHJldmVudENhbmNlbCwgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHByb21pc2UpO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgIH1cbiAgICBwaXBlVG8oZGVzdGluYXRpb24sIHJhd09wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRvJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChgUGFyYW1ldGVyIDEgaXMgcmVxdWlyZWQgaW4gJ3BpcGVUbycuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKGRlc3RpbmF0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUbydzIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBXcml0YWJsZVN0cmVhbWApKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3B0aW9ucztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBjb252ZXJ0UGlwZU9wdGlvbnMocmF3T3B0aW9ucywgJ1NlY29uZCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgUmVhZGFibGVTdHJlYW0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQoZGVzdGluYXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFdyaXRhYmxlU3RyZWFtJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbVBpcGVUbyh0aGlzLCBkZXN0aW5hdGlvbiwgb3B0aW9ucy5wcmV2ZW50Q2xvc2UsIG9wdGlvbnMucHJldmVudEFib3J0LCBvcHRpb25zLnByZXZlbnRDYW5jZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVlcyB0aGlzIHJlYWRhYmxlIHN0cmVhbSwgcmV0dXJuaW5nIGEgdHdvLWVsZW1lbnQgYXJyYXkgY29udGFpbmluZyB0aGUgdHdvIHJlc3VsdGluZyBicmFuY2hlcyBhc1xuICAgICAqIG5ldyB7QGxpbmsgUmVhZGFibGVTdHJlYW19IGluc3RhbmNlcy5cbiAgICAgKlxuICAgICAqIFRlZWluZyBhIHN0cmVhbSB3aWxsIGxvY2sgaXQsIHByZXZlbnRpbmcgYW55IG90aGVyIGNvbnN1bWVyIGZyb20gYWNxdWlyaW5nIGEgcmVhZGVyLlxuICAgICAqIFRvIGNhbmNlbCB0aGUgc3RyZWFtLCBjYW5jZWwgYm90aCBvZiB0aGUgcmVzdWx0aW5nIGJyYW5jaGVzOyBhIGNvbXBvc2l0ZSBjYW5jZWxsYXRpb24gcmVhc29uIHdpbGwgdGhlbiBiZVxuICAgICAqIHByb3BhZ2F0ZWQgdG8gdGhlIHN0cmVhbSdzIHVuZGVybHlpbmcgc291cmNlLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBjaHVua3Mgc2VlbiBpbiBlYWNoIGJyYW5jaCB3aWxsIGJlIHRoZSBzYW1lIG9iamVjdC4gSWYgdGhlIGNodW5rcyBhcmUgbm90IGltbXV0YWJsZSxcbiAgICAgKiB0aGlzIGNvdWxkIGFsbG93IGludGVyZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gYnJhbmNoZXMuXG4gICAgICovXG4gICAgdGVlKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgndGVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnJhbmNoZXMgPSBSZWFkYWJsZVN0cmVhbVRlZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIENyZWF0ZUFycmF5RnJvbUxpc3QoYnJhbmNoZXMpO1xuICAgIH1cbiAgICB2YWx1ZXMocmF3T3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgndmFsdWVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbnZlcnRJdGVyYXRvck9wdGlvbnMocmF3T3B0aW9ucywgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzLCBvcHRpb25zLnByZXZlbnRDYW5jZWwpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIGNhbmNlbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZ2V0UmVhZGVyOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBwaXBlVGhyb3VnaDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcGlwZVRvOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB0ZWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHZhbHVlczogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgbG9ja2VkOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnUmVhZGFibGVTdHJlYW0nLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yLCB7XG4gICAgICAgIHZhbHVlOiBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUudmFsdWVzLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG4vLyBUaHJvd3MgaWYgYW5kIG9ubHkgaWYgc3RhcnRBbGdvcml0aG0gdGhyb3dzLlxuZnVuY3Rpb24gQ3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyayA9IDEsIHNpemVBbGdvcml0aG0gPSAoKSA9PiAxKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUpO1xuICAgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbShzdHJlYW0pO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuLy8gVGhyb3dzIGlmIGFuZCBvbmx5IGlmIHN0YXJ0QWxnb3JpdGhtIHRocm93cy5cbmZ1bmN0aW9uIENyZWF0ZVJlYWRhYmxlQnl0ZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUpO1xuICAgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbShzdHJlYW0pO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCAwLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiBzdHJlYW07XG59XG5mdW5jdGlvbiBJbml0aWFsaXplUmVhZGFibGVTdHJlYW0oc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdyZWFkYWJsZSc7XG4gICAgc3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW0uX2Rpc3R1cmJlZCA9IGZhbHNlO1xufVxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbTtcbn1cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5fcmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFJlYWRhYmxlU3RyZWFtIEFQSSBleHBvc2VkIGZvciBjb250cm9sbGVycy5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgaWYgKHJlYWRlciAhPT0gdW5kZWZpbmVkICYmIElzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLmZvckVhY2gocmVhZEludG9SZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fY2xvc2VTdGVwcyh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZUNhbmNlbFByb21pc2UgPSBzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcltDYW5jZWxTdGVwc10ocmVhc29uKTtcbiAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoc291cmNlQ2FuY2VsUHJvbWlzZSwgbm9vcCk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSkge1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnY2xvc2VkJztcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUocmVhZGVyKTtcbiAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICByZWFkZXIuX3JlYWRSZXF1ZXN0cy5mb3JFYWNoKHJlYWRSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgIHJlYWRSZXF1ZXN0Ll9jbG9zZVN0ZXBzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIuX3JlYWRSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKSB7XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICBzdHJlYW0uX3N0b3JlZEVycm9yID0gZTtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyZWFkZXIsIGUpO1xuICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgIHJlYWRlci5fcmVhZFJlcXVlc3RzLmZvckVhY2gocmVhZFJlcXVlc3QgPT4ge1xuICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2Vycm9yU3RlcHMoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIuX3JlYWRSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLmZvckVhY2gocmVhZEludG9SZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fZXJyb3JTdGVwcyhlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbS5cbmZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMShuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbWApO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5SW5pdChpbml0LCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShpbml0LCBjb250ZXh0KTtcbiAgICBjb25zdCBoaWdoV2F0ZXJNYXJrID0gaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LmhpZ2hXYXRlck1hcms7XG4gICAgYXNzZXJ0UmVxdWlyZWRGaWVsZChoaWdoV2F0ZXJNYXJrLCAnaGlnaFdhdGVyTWFyaycsICdRdWV1aW5nU3RyYXRlZ3lJbml0Jyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGlnaFdhdGVyTWFyazogY29udmVydFVucmVzdHJpY3RlZERvdWJsZShoaWdoV2F0ZXJNYXJrKVxuICAgIH07XG59XG5cbi8vIFRoZSBzaXplIGZ1bmN0aW9uIG11c3Qgbm90IGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgbm9yIGJlIGEgY29uc3RydWN0b3JcbmNvbnN0IGJ5dGVMZW5ndGhTaXplRnVuY3Rpb24gPSAoY2h1bmspID0+IHtcbiAgICByZXR1cm4gY2h1bmsuYnl0ZUxlbmd0aDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoYnl0ZUxlbmd0aFNpemVGdW5jdGlvbiwgJ25hbWUnLCB7XG4gICAgdmFsdWU6ICdzaXplJyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuLyoqXG4gKiBBIHF1ZXVpbmcgc3RyYXRlZ3kgdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIGNodW5rLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KG9wdGlvbnMsIDEsICdCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5Jyk7XG4gICAgICAgIG9wdGlvbnMgPSBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5SW5pdChvcHRpb25zLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIHRoaXMuX2J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoaWdoIHdhdGVyIG1hcmsgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGdldCBoaWdoV2F0ZXJNYXJrKCkge1xuICAgICAgICBpZiAoIUlzQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZUxlbmd0aEJyYW5kQ2hlY2tFeGNlcHRpb24oJ2hpZ2hXYXRlck1hcmsnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcms7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1lYXN1cmVzIHRoZSBzaXplIG9mIGBjaHVua2AgYnkgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiBpdHMgYGJ5dGVMZW5ndGhgIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBpZiAoIUlzQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZUxlbmd0aEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3NpemUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZUxlbmd0aFNpemVGdW5jdGlvbjtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZSwge1xuICAgIGhpZ2hXYXRlck1hcms6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHNpemU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3knLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LlxuZnVuY3Rpb24gYnl0ZUxlbmd0aEJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5YCk7XG59XG5mdW5jdGlvbiBJc0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3koeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19ieXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyaycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5O1xufVxuXG4vLyBUaGUgc2l6ZSBmdW5jdGlvbiBtdXN0IG5vdCBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG5vciBiZSBhIGNvbnN0cnVjdG9yXG5jb25zdCBjb3VudFNpemVGdW5jdGlvbiA9ICgpID0+IHtcbiAgICByZXR1cm4gMTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoY291bnRTaXplRnVuY3Rpb24sICduYW1lJywge1xuICAgIHZhbHVlOiAnc2l6ZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG59KTtcbi8qKlxuICogQSBxdWV1aW5nIHN0cmF0ZWd5IHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgY2h1bmtzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgQ291bnRRdWV1aW5nU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChvcHRpb25zLCAxLCAnQ291bnRRdWV1aW5nU3RyYXRlZ3knKTtcbiAgICAgICAgb3B0aW9ucyA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lJbml0KG9wdGlvbnMsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgdGhpcy5fY291bnRRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoaWdoIHdhdGVyIG1hcmsgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGdldCBoaWdoV2F0ZXJNYXJrKCkge1xuICAgICAgICBpZiAoIUlzQ291bnRRdWV1aW5nU3RyYXRlZ3kodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGNvdW50QnJhbmRDaGVja0V4Y2VwdGlvbignaGlnaFdhdGVyTWFyaycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcms7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1lYXN1cmVzIHRoZSBzaXplIG9mIGBjaHVua2AgYnkgYWx3YXlzIHJldHVybmluZyAxLlxuICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBxdWV1ZSBzaXplIGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBjaHVua3MgaW4gdGhlIHF1ZXVlLlxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBpZiAoIUlzQ291bnRRdWV1aW5nU3RyYXRlZ3kodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGNvdW50QnJhbmRDaGVja0V4Y2VwdGlvbignc2l6ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudFNpemVGdW5jdGlvbjtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb3VudFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUsIHtcbiAgICBoaWdoV2F0ZXJNYXJrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBzaXplOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb3VudFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnQ291bnRRdWV1aW5nU3RyYXRlZ3knLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBDb3VudFF1ZXVpbmdTdHJhdGVneS5cbmZ1bmN0aW9uIGNvdW50QnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYENvdW50UXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBDb3VudFF1ZXVpbmdTdHJhdGVneWApO1xufVxuZnVuY3Rpb24gSXNDb3VudFF1ZXVpbmdTdHJhdGVneSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvdW50UXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyaycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBDb3VudFF1ZXVpbmdTdHJhdGVneTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zZm9ybWVyKG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShvcmlnaW5hbCwgY29udGV4dCk7XG4gICAgY29uc3QgZmx1c2ggPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwuZmx1c2g7XG4gICAgY29uc3QgcmVhZGFibGVUeXBlID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnJlYWRhYmxlVHlwZTtcbiAgICBjb25zdCBzdGFydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5zdGFydDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwudHJhbnNmb3JtO1xuICAgIGNvbnN0IHdyaXRhYmxlVHlwZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC53cml0YWJsZVR5cGU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmx1c2g6IGZsdXNoID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRUcmFuc2Zvcm1lckZsdXNoQ2FsbGJhY2soZmx1c2gsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdmbHVzaCcgdGhhdGApLFxuICAgICAgICByZWFkYWJsZVR5cGUsXG4gICAgICAgIHN0YXJ0OiBzdGFydCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VHJhbnNmb3JtZXJTdGFydENhbGxiYWNrKHN0YXJ0LCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc3RhcnQnIHRoYXRgKSxcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0gPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFRyYW5zZm9ybWVyVHJhbnNmb3JtQ2FsbGJhY2sodHJhbnNmb3JtLCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAndHJhbnNmb3JtJyB0aGF0YCksXG4gICAgICAgIHdyaXRhYmxlVHlwZVxuICAgIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNmb3JtZXJGbHVzaENhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKGNvbnRyb2xsZXIpID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW2NvbnRyb2xsZXJdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2Zvcm1lclN0YXJ0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcmVmbGVjdENhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFRyYW5zZm9ybWVyVHJhbnNmb3JtQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY2h1bmssIGNvbnRyb2xsZXIpID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW2NodW5rLCBjb250cm9sbGVyXSk7XG59XG5cbi8vIENsYXNzIFRyYW5zZm9ybVN0cmVhbVxuLyoqXG4gKiBBIHRyYW5zZm9ybSBzdHJlYW0gY29uc2lzdHMgb2YgYSBwYWlyIG9mIHN0cmVhbXM6IGEge0BsaW5rIFdyaXRhYmxlU3RyZWFtIHwgd3JpdGFibGUgc3RyZWFtfSxcbiAqIGtub3duIGFzIGl0cyB3cml0YWJsZSBzaWRlLCBhbmQgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW0gfCByZWFkYWJsZSBzdHJlYW19LCBrbm93biBhcyBpdHMgcmVhZGFibGUgc2lkZS5cbiAqIEluIGEgbWFubmVyIHNwZWNpZmljIHRvIHRoZSB0cmFuc2Zvcm0gc3RyZWFtIGluIHF1ZXN0aW9uLCB3cml0ZXMgdG8gdGhlIHdyaXRhYmxlIHNpZGUgcmVzdWx0IGluIG5ldyBkYXRhIGJlaW5nXG4gKiBtYWRlIGF2YWlsYWJsZSBmb3IgcmVhZGluZyBmcm9tIHRoZSByZWFkYWJsZSBzaWRlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgVHJhbnNmb3JtU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihyYXdUcmFuc2Zvcm1lciA9IHt9LCByYXdXcml0YWJsZVN0cmF0ZWd5ID0ge30sIHJhd1JlYWRhYmxlU3RyYXRlZ3kgPSB7fSkge1xuICAgICAgICBpZiAocmF3VHJhbnNmb3JtZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmF3VHJhbnNmb3JtZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdyaXRhYmxlU3RyYXRlZ3kgPSBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5KHJhd1dyaXRhYmxlU3RyYXRlZ3ksICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlU3RyYXRlZ3kgPSBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5KHJhd1JlYWRhYmxlU3RyYXRlZ3ksICdUaGlyZCBwYXJhbWV0ZXInKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBjb252ZXJ0VHJhbnNmb3JtZXIocmF3VHJhbnNmb3JtZXIsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVyLnJlYWRhYmxlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCByZWFkYWJsZVR5cGUgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zZm9ybWVyLndyaXRhYmxlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB3cml0YWJsZVR5cGUgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGFibGVIaWdoV2F0ZXJNYXJrID0gRXh0cmFjdEhpZ2hXYXRlck1hcmsocmVhZGFibGVTdHJhdGVneSwgMCk7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlU2l6ZUFsZ29yaXRobSA9IEV4dHJhY3RTaXplQWxnb3JpdGhtKHJlYWRhYmxlU3RyYXRlZ3kpO1xuICAgICAgICBjb25zdCB3cml0YWJsZUhpZ2hXYXRlck1hcmsgPSBFeHRyYWN0SGlnaFdhdGVyTWFyayh3cml0YWJsZVN0cmF0ZWd5LCAxKTtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVTaXplQWxnb3JpdGhtID0gRXh0cmFjdFNpemVBbGdvcml0aG0od3JpdGFibGVTdHJhdGVneSk7XG4gICAgICAgIGxldCBzdGFydFByb21pc2VfcmVzb2x2ZTtcbiAgICAgICAgY29uc3Qgc3RhcnRQcm9taXNlID0gbmV3UHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHN0YXJ0UHJvbWlzZV9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIEluaXRpYWxpemVUcmFuc2Zvcm1TdHJlYW0odGhpcywgc3RhcnRQcm9taXNlLCB3cml0YWJsZUhpZ2hXYXRlck1hcmssIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSwgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLCByZWFkYWJsZVNpemVBbGdvcml0aG0pO1xuICAgICAgICBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVRyYW5zZm9ybWVyKHRoaXMsIHRyYW5zZm9ybWVyKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVyLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXJ0UHJvbWlzZV9yZXNvbHZlKHRyYW5zZm9ybWVyLnN0YXJ0KHRoaXMuX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0UHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlYWRhYmxlIHNpZGUgb2YgdGhlIHRyYW5zZm9ybSBzdHJlYW0uXG4gICAgICovXG4gICAgZ2V0IHJlYWRhYmxlKCkge1xuICAgICAgICBpZiAoIUlzVHJhbnNmb3JtU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCdyZWFkYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHdyaXRhYmxlIHNpZGUgb2YgdGhlIHRyYW5zZm9ybSBzdHJlYW0uXG4gICAgICovXG4gICAgZ2V0IHdyaXRhYmxlKCkge1xuICAgICAgICBpZiAoIUlzVHJhbnNmb3JtU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKCd3cml0YWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgcmVhZGFibGU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHdyaXRhYmxlOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1RyYW5zZm9ybVN0cmVhbScsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuZnVuY3Rpb24gSW5pdGlhbGl6ZVRyYW5zZm9ybVN0cmVhbShzdHJlYW0sIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKSB7XG4gICAgZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKSB7XG4gICAgICAgIHJldHVybiBzdGFydFByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdyaXRlQWxnb3JpdGhtKGNodW5rKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua1dyaXRlQWxnb3JpdGhtKHN0cmVhbSwgY2h1bmspO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhYm9ydEFsZ29yaXRobShyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQWJvcnRBbGdvcml0aG0oc3RyZWFtLCByZWFzb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbG9zZUFsZ29yaXRobSgpIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQ2xvc2VBbGdvcml0aG0oc3RyZWFtKTtcbiAgICB9XG4gICAgc3RyZWFtLl93cml0YWJsZSA9IENyZWF0ZVdyaXRhYmxlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCB3cml0YWJsZUhpZ2hXYXRlck1hcmssIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSk7XG4gICAgZnVuY3Rpb24gcHVsbEFsZ29yaXRobSgpIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtKHN0cmVhbSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbEFsZ29yaXRobShyZWFzb24pIHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIHJlYXNvbik7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHN0cmVhbS5fcmVhZGFibGUgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCByZWFkYWJsZUhpZ2hXYXRlck1hcmssIHJlYWRhYmxlU2l6ZUFsZ29yaXRobSk7XG4gICAgLy8gVGhlIFtbYmFja3ByZXNzdXJlXV0gc2xvdCBpcyBzZXQgdG8gdW5kZWZpbmVkIHNvIHRoYXQgaXQgY2FuIGJlIGluaXRpYWxpc2VkIGJ5IFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZS5cbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgdHJ1ZSk7XG4gICAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gSXNUcmFuc2Zvcm1TdHJlYW0oeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ190cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFRyYW5zZm9ybVN0cmVhbTtcbn1cbi8vIFRoaXMgaXMgYSBuby1vcCBpZiBib3RoIHNpZGVzIGFyZSBhbHJlYWR5IGVycm9yZWQuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIGUpIHtcbiAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3Ioc3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBlKTtcbiAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSkge1xuICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcik7XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQoc3RyZWFtLl93cml0YWJsZS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyLCBlKTtcbiAgICBpZiAoc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgLy8gUHJldGVuZCB0aGF0IHB1bGwoKSB3YXMgY2FsbGVkIHRvIHBlcm1pdCBhbnkgcGVuZGluZyB3cml0ZSgpIGNhbGxzIHRvIGNvbXBsZXRlLiBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoKVxuICAgICAgICAvLyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gZW5xdWV1ZSgpIG9yIHB1bGwoKSBvbmNlIHRoZSBSZWFkYWJsZVN0cmVhbSBpcyBlcnJvcmVkLCBzbyB0aGlzIHdpbGwgd2lsbCBiZSB0aGUgZmluYWwgdGltZVxuICAgICAgICAvLyBfYmFja3ByZXNzdXJlIGlzIHNldC5cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgZmFsc2UpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSkge1xuICAgIC8vIFBhc3NlcyBhbHNvIHdoZW4gY2FsbGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlKCk7XG4gICAgfVxuICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSA9IG5ld1Byb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTtcbn1cbi8vIENsYXNzIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyXG4vKipcbiAqIEFsbG93cyBjb250cm9sIG9mIHRoZSB7QGxpbmsgUmVhZGFibGVTdHJlYW19IGFuZCB7QGxpbmsgV3JpdGFibGVTdHJlYW19IG9mIHRoZSBhc3NvY2lhdGVkIHtAbGluayBUcmFuc2Zvcm1TdHJlYW19LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSByZWFkYWJsZSBzaWRl4oCZcyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXMgb3Zlci1mdWxsLlxuICAgICAqL1xuICAgIGdldCBkZXNpcmVkU2l6ZSgpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGFibGVDb250cm9sbGVyID0gdGhpcy5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShyZWFkYWJsZUNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBlbnF1ZXVlKGNodW5rID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdlbnF1ZXVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHRoaXMsIGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXJyb3JzIGJvdGggdGhlIHJlYWRhYmxlIHNpZGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlIG9mIHRoZSBjb250cm9sbGVkIHRyYW5zZm9ybSBzdHJlYW0sIG1ha2luZyBhbGwgZnV0dXJlXG4gICAgICogaW50ZXJhY3Rpb25zIHdpdGggaXQgZmFpbCB3aXRoIHRoZSBnaXZlbiBlcnJvciBgZWAuIEFueSBjaHVua3MgcXVldWVkIGZvciB0cmFuc2Zvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICBlcnJvcihyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHJlYWRhYmxlIHNpZGUgYW5kIGVycm9ycyB0aGUgd3JpdGFibGUgc2lkZSBvZiB0aGUgY29udHJvbGxlZCB0cmFuc2Zvcm0gc3RyZWFtLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZVxuICAgICAqIHRyYW5zZm9ybWVyIG9ubHkgbmVlZHMgdG8gY29uc3VtZSBhIHBvcnRpb24gb2YgdGhlIGNodW5rcyB3cml0dGVuIHRvIHRoZSB3cml0YWJsZSBzaWRlLlxuICAgICAqL1xuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Rlcm1pbmF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyVGVybWluYXRlKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIGVucXVldWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVycm9yOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB0ZXJtaW5hdGU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGRlc2lyZWRTaXplOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIFRyYW5zZm9ybSBTdHJlYW0gRGVmYXVsdCBDb250cm9sbGVyIEFic3RyYWN0IE9wZXJhdGlvbnNcbmZ1bmN0aW9uIElzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xufVxuZnVuY3Rpb24gU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHRyYW5zZm9ybUFsZ29yaXRobSwgZmx1c2hBbGdvcml0aG0pIHtcbiAgICBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgY29udHJvbGxlci5fdHJhbnNmb3JtQWxnb3JpdGhtID0gdHJhbnNmb3JtQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtID0gZmx1c2hBbGdvcml0aG07XG59XG5mdW5jdGlvbiBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVRyYW5zZm9ybWVyKHN0cmVhbSwgdHJhbnNmb3JtZXIpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIGxldCB0cmFuc2Zvcm1BbGdvcml0aG0gPSAoY2h1bmspID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuayk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoICh0cmFuc2Zvcm1SZXN1bHRFKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh0cmFuc2Zvcm1SZXN1bHRFKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IGZsdXNoQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGlmICh0cmFuc2Zvcm1lci50cmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cmFuc2Zvcm1BbGdvcml0aG0gPSBjaHVuayA9PiB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtZXIuZmx1c2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmbHVzaEFsZ29yaXRobSA9ICgpID0+IHRyYW5zZm9ybWVyLmZsdXNoKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgdHJhbnNmb3JtQWxnb3JpdGhtLCBmbHVzaEFsZ29yaXRobSk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgY29udHJvbGxlci5fdHJhbnNmb3JtQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGNvbnRyb2xsZXIsIGNodW5rKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbTtcbiAgICBjb25zdCByZWFkYWJsZUNvbnRyb2xsZXIgPSBzdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUocmVhZGFibGVDb250cm9sbGVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWFkYWJsZSBzaWRlIGlzIG5vdCBpbiBhIHN0YXRlIHRoYXQgcGVybWl0cyBlbnF1ZXVlJyk7XG4gICAgfVxuICAgIC8vIFdlIHRocm90dGxlIHRyYW5zZm9ybSBpbnZvY2F0aW9ucyBiYXNlZCBvbiB0aGUgYmFja3ByZXNzdXJlIG9mIHRoZSBSZWFkYWJsZVN0cmVhbSwgYnV0IHdlIHN0aWxsXG4gICAgLy8gYWNjZXB0IFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSgpIGNhbGxzLlxuICAgIHRyeSB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlciwgY2h1bmspO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZWFkYWJsZVN0cmF0ZWd5LnNpemUoKSB0aHJvd3MuXG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKTtcbiAgICAgICAgdGhyb3cgc3RyZWFtLl9yZWFkYWJsZS5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGJhY2twcmVzc3VyZSA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJIYXNCYWNrcHJlc3N1cmUocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICBpZiAoYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHtcbiAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLCBlKTtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIGNvbnN0IHRyYW5zZm9ybVByb21pc2UgPSBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0oY2h1bmspO1xuICAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aCh0cmFuc2Zvcm1Qcm9taXNlLCB1bmRlZmluZWQsIHIgPT4ge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLCByKTtcbiAgICAgICAgdGhyb3cgcjtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyVGVybWluYXRlKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtO1xuICAgIGNvbnN0IHJlYWRhYmxlQ29udHJvbGxlciA9IHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoJ1RyYW5zZm9ybVN0cmVhbSB0ZXJtaW5hdGVkJyk7XG4gICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIGVycm9yKTtcbn1cbi8vIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rIEFsZ29yaXRobXNcbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuaykge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBzdHJlYW0uX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlKSB7XG4gICAgICAgIGNvbnN0IGJhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2U7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChiYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IHN0cmVhbS5fd3JpdGFibGU7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHdyaXRhYmxlLl9zdGF0ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IHdyaXRhYmxlLl9zdG9yZWRFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0oY29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuayk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Fib3J0QWxnb3JpdGhtKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgLy8gYWJvcnQoKSBpcyBub3QgY2FsbGVkIHN5bmNocm9ub3VzbHksIHNvIGl0IGlzIHBvc3NpYmxlIGZvciBhYm9ydCgpIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgYWxyZWFkeVxuICAgIC8vIGVycm9yZWQuXG4gICAgVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCByZWFzb24pO1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Nsb3NlQWxnb3JpdGhtKHN0cmVhbSkge1xuICAgIC8vIHN0cmVhbS5fcmVhZGFibGUgY2Fubm90IGNoYW5nZSBhZnRlciBjb25zdHJ1Y3Rpb24sIHNvIGNhY2hpbmcgaXQgYWNyb3NzIGEgY2FsbCB0byB1c2VyIGNvZGUgaXMgc2FmZS5cbiAgICBjb25zdCByZWFkYWJsZSA9IHN0cmVhbS5fcmVhZGFibGU7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcjtcbiAgICBjb25zdCBmbHVzaFByb21pc2UgPSBjb250cm9sbGVyLl9mbHVzaEFsZ29yaXRobSgpO1xuICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgIC8vIFJldHVybiBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB1bmRlZmluZWQgb24gc3VjY2Vzcy5cbiAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoZmx1c2hQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgIGlmIChyZWFkYWJsZS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICAgICAgdGhyb3cgcmVhZGFibGUuX3N0b3JlZEVycm9yO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShyZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICB9LCByID0+IHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCByKTtcbiAgICAgICAgdGhyb3cgcmVhZGFibGUuX3N0b3JlZEVycm9yO1xuICAgIH0pO1xufVxuLy8gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNvdXJjZSBBbGdvcml0aG1zXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobShzdHJlYW0pIHtcbiAgICAvLyBJbnZhcmlhbnQuIEVuZm9yY2VkIGJ5IHRoZSBwcm9taXNlcyByZXR1cm5lZCBieSBzdGFydCgpIGFuZCBwdWxsKCkuXG4gICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgZmFsc2UpO1xuICAgIC8vIFByZXZlbnQgdGhlIG5leHQgcHVsbCgpIGNhbGwgdW50aWwgdGhlcmUgaXMgYmFja3ByZXNzdXJlLlxuICAgIHJldHVybiBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2U7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIuXG5mdW5jdGlvbiBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJgKTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBUcmFuc2Zvcm1TdHJlYW0uXG5mdW5jdGlvbiBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW1gKTtcbn1cblxuZXhwb3J0IHsgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSwgQ291bnRRdWV1aW5nU3RyYXRlZ3ksIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIFJlYWRhYmxlU3RyZWFtLCBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIsIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QsIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIsIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciwgVHJhbnNmb3JtU3RyZWFtLCBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciwgV3JpdGFibGVTdHJlYW0sIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIsIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9ueWZpbGwuZXMyMDE4Lm1qcy5tYXBcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZCA9IChtb2R1bGUpID0+IHtcblx0bW9kdWxlLnBhdGhzID0gW107XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KTtcbiJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJ0aGlzIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImV2ZW50VGFyZ2V0U2hpbSIsIkFib3J0U2lnbmFsIiwiRXZlbnRUYXJnZXQiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiVHlwZUVycm9yIiwiYWJvcnRlZCIsImFib3J0ZWRGbGFncyIsImdldCIsImRlZmluZUV2ZW50QXR0cmlidXRlIiwicHJvdG90eXBlIiwiV2Vha01hcCIsImRlZmluZVByb3BlcnRpZXMiLCJlbnVtZXJhYmxlIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJjb25maWd1cmFibGUiLCJBYm9ydENvbnRyb2xsZXIiLCJzaWduYWxzIiwic2V0Iiwic2lnbmFsIiwiY3JlYXRlIiwiY2FsbCIsImNyZWF0ZUFib3J0U2lnbmFsIiwiZ2V0U2lnbmFsIiwiYWJvcnQiLCJkaXNwYXRjaEV2ZW50IiwidHlwZSIsImNvbnRyb2xsZXIiLCJGb3JtRGF0YSIsImZvcm1EYXRhIiwiY2xpZW50Iiwib3B0aW9ucyIsIk1haWxndW4iLCJjb25maWciLCJ1cmwiLCJ1c2VybmFtZSIsIkVycm9yIiwia2V5IiwicmVxdWVzdCIsIm1haWxMaXN0c01lbWJlcnMiLCJkb21haW5DcmVkZW50aWFsc0NsaWVudCIsImRvbWFpblRlbXBsYXRlc0NsaWVudCIsImRvbWFpblRhZ3NDbGllbnQiLCJtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQiLCJkb21haW5zIiwid2ViaG9va3MiLCJldmVudHMiLCJzdGF0cyIsInN1cHByZXNzaW9ucyIsIm1lc3NhZ2VzIiwicm91dGVzIiwiaXBzIiwiaXBfcG9vbHMiLCJsaXN0cyIsInZhbGlkYXRlIiwiZGF0YSIsInJlY2VpdmluZyIsInNlbmRpbmciLCJuYW1lIiwicmVxdWlyZV90bHMiLCJza2lwX3ZlcmlmaWNhdGlvbiIsInN0YXRlIiwid2lsZGNhcmQiLCJzcGFtX2FjdGlvbiIsImNyZWF0ZWRfYXQiLCJzbXRwX3Bhc3N3b3JkIiwic210cF9sb2dpbiIsInJlY2VpdmluZ19kbnNfcmVjb3JkcyIsInNlbmRpbmdfZG5zX3JlY29yZHMiLCJEb21haW4iLCJkb21haW5DcmVkZW50aWFscyIsImRvbWFpblRlbXBsYXRlcyIsImRvbWFpblRhZ3MiLCJfcGFyc2VNZXNzYWdlIiwicmVzcG9uc2UiLCJib2R5IiwiX3BhcnNlRG9tYWluTGlzdCIsIml0ZW1zIiwibWFwIiwiaXRlbSIsIl9wYXJzZURvbWFpbiIsImRvbWFpbiIsIl9wYXJzZVRyYWNraW5nU2V0dGluZ3MiLCJ0cmFja2luZyIsIl9wYXJzZVRyYWNraW5nVXBkYXRlIiwibGlzdCIsInF1ZXJ5IiwidGhlbiIsInJlcyIsInBvc3RPYmoiLCJmb3JjZV9ka2ltX2F1dGhvcml0eSIsInRvU3RyaW5nIiwicG9zdFdpdGhGRCIsImRlc3Ryb3kiLCJkZWxldGUiLCJnZXRDb25uZWN0aW9uIiwidXBkYXRlQ29ubmVjdGlvbiIsInB1dCIsImdldFRyYWNraW5nIiwidXBkYXRlVHJhY2tpbmciLCJhY3RpdmUiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwibWVzc2FnZSIsInB1dFdpdGhGRCIsImdldElwcyIsImFzc2lnbklwIiwiaXAiLCJkZWxldGVJcCIsImxpbmtJcFBvb2wiLCJwb29sX2lkIiwidW5saW5rSXBQb2xsIiwicmVwbGFjZW1lbnQiLCJzZWFyY2hQYXJhbXMiLCJ1cGRhdGVES0lNQXV0aG9yaXR5Iiwic2VsZiIsInVwZGF0ZURLSU1TZWxlY3RvciIsImRraW1TZWxlY3RvciIsInVwZGF0ZVdlYlByZWZpeCIsIndlYlByZWZpeCIsImJhc2VSb3V0ZSIsIl9wYXJzZURvbWFpbkNyZWRlbnRpYWxzTGlzdCIsInRvdGFsQ291bnQiLCJ0b3RhbF9jb3VudCIsIl9wYXJzZU1lc3NhZ2VSZXNwb25zZSIsIl9wYXJzZURlbGV0ZWRSZXNwb25zZSIsInNwZWMiLCJ1cGRhdGUiLCJjcmVkZW50aWFsc0xvZ2luIiwidGFnSW5mbyIsInRhZyIsImRlc2NyaXB0aW9uIiwiRGF0ZSIsIkRvbWFpblRhZyIsInRhZ1N0YXRpc3RpY0luZm8iLCJzdGFydCIsImVuZCIsInJlc29sdXRpb24iLCJzdGF0IiwidGltZSIsIkRvbWFpblRhZ1N0YXRpc3RpYyIsIl9wYXJzZVBhZ2VMaW5rcyIsImVudHJpZXMiLCJwYWdpbmciLCJyZWR1Y2UiLCJhY2MiLCJlbnRyaWUiLCJpZCIsIl9wYXJzZURvbWFpblRhZ3NMaXN0IiwicGFnZXMiLCJfcGFyc2VUYWdTdGF0aXN0aWMiLCJzdGF0aXN0aWMiLCJjb3VudHJpZXMiLCJwcm92aWRlcnMiLCJkZXZpY2VzIiwiZG9tYWluVGVtcGxhdGVGcm9tQVBJIiwiY3JlYXRlZEF0IiwiY3JlYXRlZEJ5IiwidmVyc2lvbiIsInZlcnNpb25zIiwibGVuZ3RoIiwicmVzdWx0IiwiRG9tYWluVGVtcGxhdGVJdGVtIiwicGFyc2VDcmVhdGlvblJlc3BvbnNlIiwidGVtcGxhdGUiLCJwYXJzZUNyZWF0aW9uVmVyc2lvblJlc3BvbnNlIiwicGFyc2VNdXRhdGlvblJlc3BvbnNlIiwidGVtcGxhdGVOYW1lIiwicGFyc2VOb3RpZmljYXRpb25SZXNwb25zZSIsInBhcnNlTXV0YXRlVGVtcGxhdGVWZXJzaW9uUmVzcG9uc2UiLCJ0ZW1wbGF0ZVZlcnNpb24iLCJwYXJzZUxpc3QiLCJkIiwicGFyc2VMaXN0VGVtcGxhdGVWZXJzaW9ucyIsImRlc3Ryb3lBbGwiLCJjcmVhdGVWZXJzaW9uIiwiZ2V0VmVyc2lvbiIsInVwZGF0ZVZlcnNpb24iLCJkZXN0cm95VmVyc2lvbiIsImxpc3RWZXJzaW9ucyIsImJvZHlNZXNzYWdlIiwiZXJyb3IiLCJzdGFjayIsImRldGFpbHMiLCJfcGFyc2VQYWdlTnVtYmVyIiwic3BsaXQiLCJwb3AiLCJfcGFyc2VQYWdlIiwibnVtYmVyIiwiX3BhcnNlRXZlbnRMaXN0IiwicXVlcnlDb3B5IiwicGFnZSIsInBhcnNlSXBQb29sc1Jlc3BvbnNlIiwicG9vbElkIiwicGF0Y2hXaXRoRkQiLCJwYXJzZUlwc1Jlc3BvbnNlIiwibWVtYmVycyIsIm1haWxMaXN0QWRkcmVzcyIsImNoZWNrQW5kVXBkYXRlRGF0YSIsIm5ld0RhdGEiLCJ2YXJzIiwiSlNPTiIsInN0cmluZ2lmeSIsInN1YnNjcmliZWQiLCJsaXN0TWVtYmVycyIsImdldE1lbWJlciIsIm1haWxMaXN0TWVtYmVyQWRkcmVzcyIsImNyZWF0ZU1lbWJlciIsInJlcURhdGEiLCJjcmVhdGVNZW1iZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwidXBzZXJ0IiwidXBkYXRlTWVtYmVyIiwiZGVzdHJveU1lbWJlciIsIl9wYXJzZVJlc3BvbnNlIiwibGlzdElkIiwiZmlsZSIsImlzU3RyZWFtIiwiYXR0YWNobWVudCIsInBpcGUiLCJpc05vZGVGb3JtRGF0YSIsImZvcm1EYXRhSW5zdGFuY2UiLCJ1bmRlZmluZWQiLCJnZXRIZWFkZXJzIiwidGltZW91dCIsImhlYWRlcnMiLCJGb3JtRGF0YUNvbnN0cnVjdG9yIiwibWV0aG9kIiwiaW5wdXRPcHRpb25zIiwiYmFzaWMiLCJlbmNvZGUiLCJBdXRob3JpemF0aW9uIiwicGFyYW1zIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInRvTG9jYWxlVXBwZXJDYXNlIiwidGhyb3dIdHRwRXJyb3JzIiwib2siLCJzdHJlYW0iLCJjaHVua3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiY2h1bmsiLCJwdXNoIiwiQnVmZmVyIiwiY29uY2F0IiwianNvbiIsImNvbW1hbmQiLCJoZWFkIiwicG9zdCIsImNyZWF0ZUZvcm1EYXRhIiwia2V5cyIsImZpbHRlciIsImZvcm1EYXRhQWNjIiwiaW5jbHVkZXMiLCJhZGRGaWxlc1RvRkQiLCJhZGRNaW1lRGF0YVRvRkQiLCJhZGRDb21tb25Qcm9wZXJ0eVRvRkQiLCJpc0J1ZmZlciIsImFwcGVuZCIsImZpbGVuYW1lIiwicHJvcGVydHlOYW1lIiwiYXBwZW5kRmlsZVRvRkQiLCJvYmoiLCJvYmpEYXRhIiwiY29udGVudFR5cGUiLCJrbm93bkxlbmd0aCIsImdldEF0dGFjaG1lbnRPcHRpb25zIiwiZm9yRWFjaCIsInBhdGNoIiwiUmVxdWVzdCIsInByZXBhcmVTZWFyY2hQYXJhbXMiLCJhcnJheVdpdGhQYWlycyIsImN1cnJlbnRQYWlyIiwicmVwZWF0ZWRQcm9wZXJ0eSIsIl9wYXJzZVN0YXRzIiwiU3RhdHMiLCJnZXREb21haW4iLCJnZXRBY2NvdW50IiwiY3JlYXRlT3B0aW9ucyIsImFkZHJlc3MiLCJjb2RlIiwidGFncyIsInJlYXNvbiIsIm1vZGVscyIsImJvdW5jZXMiLCJCb3VuY2UiLCJjb21wbGFpbnRzIiwiQ29tcGxhaW50IiwidW5zdWJzY3JpYmVzIiwiVW5zdWJzY3JpYmUiLCJ3aGl0ZWxpc3RzIiwiV2hpdGVMaXN0IiwicGFnZVVybCIsInBhcnNlIiwiX3BhcnNlTGlzdCIsIk1vZGVsIiwiX3BhcnNlSXRlbSIsImNyZWF0ZVdoaXRlTGlzdCIsIm1vZGVsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicG9zdERhdGEiLCJTdXBwcmVzc2lvbkNsaWVudCIsIm11bHRpcGxlVmFsaWRhdGlvbiIsIl9wYXJzZVdlYmhvb2tMaXN0IiwiX3BhcnNlV2ViaG9va1dpdGhJRCIsIndlYmhvb2tSZXNwb25zZSIsIndlYmhvb2siLCJ1cmxzIiwiV2ViaG9vayIsIl9wYXJzZVdlYmhvb2tUZXN0IiwidGVzdCIsImZyZWVFeHBvcnRzIiwiZnJlZUdsb2JhbCIsImdsb2JhbCIsIndpbmRvdyIsIkludmFsaWRDaGFyYWN0ZXJFcnJvciIsIlRBQkxFIiwiUkVHRVhfU1BBQ0VfQ0hBUkFDVEVSUyIsImJhc2U2NCIsImlucHV0IiwiU3RyaW5nIiwiYSIsImIiLCJjIiwiYnVmZmVyIiwicGFkZGluZyIsIm91dHB1dCIsInBvc2l0aW9uIiwiY2hhckNvZGVBdCIsImNoYXJBdCIsInJlcGxhY2UiLCJiaXRTdG9yYWdlIiwiYml0Q291bnRlciIsImluZGV4T2YiLCJmcm9tQ2hhckNvZGUiLCJ1cmkiLCJmaXJzdENvbW1hIiwibWV0YSIsInN1YnN0cmluZyIsImNoYXJzZXQiLCJ0eXBlRnVsbCIsImkiLCJlbmNvZGluZyIsInVuZXNjYXBlIiwiZnJvbSIsInByaXZhdGVEYXRhIiwid3JhcHBlcnMiLCJwZCIsImV2ZW50IiwicmV0diIsImNvbnNvbGUiLCJhc3NlcnQiLCJzZXRDYW5jZWxGbGFnIiwicGFzc2l2ZUxpc3RlbmVyIiwiY2FuY2VsYWJsZSIsImNhbmNlbGVkIiwicHJldmVudERlZmF1bHQiLCJFdmVudCIsImV2ZW50VGFyZ2V0IiwiZXZlbnRQaGFzZSIsImN1cnJlbnRUYXJnZXQiLCJzdG9wcGVkIiwiaW1tZWRpYXRlU3RvcHBlZCIsInRpbWVTdGFtcCIsIm5vdyIsImRlZmluZVJlZGlyZWN0RGVzY3JpcHRvciIsImRlZmluZUNhbGxEZXNjcmlwdG9yIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJnZXRXcmFwcGVyIiwicHJvdG8iLCJ3cmFwcGVyIiwiQmFzZUV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJ3cml0YWJsZSIsImlzRnVuYyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlZmluZVdyYXBwZXIiLCJnZXRQcm90b3R5cGVPZiIsImlzU3RvcHBlZCIsInNldFBhc3NpdmVMaXN0ZW5lciIsInRhcmdldCIsImNvbXBvc2VkUGF0aCIsIk5PTkUiLCJDQVBUVVJJTkdfUEhBU0UiLCJBVF9UQVJHRVQiLCJCVUJCTElOR19QSEFTRSIsInN0b3BQcm9wYWdhdGlvbiIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsImJ1YmJsZXMiLCJCb29sZWFuIiwiZGVmYXVsdFByZXZlbnRlZCIsImNvbXBvc2VkIiwic3JjRWxlbWVudCIsImNhbmNlbEJ1YmJsZSIsInJldHVyblZhbHVlIiwiaW5pdEV2ZW50Iiwic2V0UHJvdG90eXBlT2YiLCJsaXN0ZW5lcnNNYXAiLCJpc09iamVjdCIsIngiLCJnZXRMaXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJldmVudFRhcmdldFByb3RvdHlwZSIsImV2ZW50TmFtZSIsIm5vZGUiLCJsaXN0ZW5lclR5cGUiLCJsaXN0ZW5lciIsIm5leHQiLCJwcmV2IiwibmV3Tm9kZSIsInBhc3NpdmUiLCJvbmNlIiwiZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yIiwiZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQiLCJldmVudE5hbWVzIiwiQ3VzdG9tRXZlbnRUYXJnZXQiLCJ0eXBlcyIsIk1hcCIsImFkZEV2ZW50TGlzdGVuZXIiLCJvcHRpb25zSXNPYmoiLCJjYXB0dXJlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIndyYXBwZWRFdmVudCIsIndyYXBFdmVudCIsImVyciIsImhhbmRsZUV2ZW50Iiwic2V0RXZlbnRQaGFzZSIsInNldEN1cnJlbnRUYXJnZXQiLCJSZWFkYWJsZSIsIndtIiwiQmxvYiIsImJsb2JQYXJ0cyIsInNpemUiLCJwYXJ0cyIsImVsZW1lbnQiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwidG9Mb3dlckNhc2UiLCJhc3luYyIsImFycmF5QnVmZmVyIiwiVWludDhBcnJheSIsIm9mZnNldCIsInBhcnQiLCJyZWFkIiwic2xpY2UiLCJyZWxhdGl2ZVN0YXJ0IiwiTWF0aCIsIm1heCIsIm1pbiIsInJlbGF0aXZlRW5kIiwic3BhbiIsInZhbHVlcyIsImFkZGVkIiwiYmxvYiIsImFzc2lnbiIsInN0YXRpYyIsImhhc0luc3RhbmNlIiwib2JqZWN0IiwiZmV0Y2giLCJoaWdoV2F0ZXJNYXJrIiwiSGVhZGVycyIsIlJlc3BvbnNlIiwiUmVhZGFibGVTdHJlYW0iLCJfIiwiZ2xvYmFscyIsImdldEdsb2JhbCIsInByb3BlcnR5IiwiZ2xvYmFsVGhpcyIsImdsb2JhbFByb3BlcnRpZXMiLCJnbG9iYWxPYmplY3QiLCJiaW5kIiwic3VwcG9ydHNBYm9ydENvbnRyb2xsZXIiLCJzdXBwb3J0c1N0cmVhbXMiLCJzdXBwb3J0c0Zvcm1EYXRhIiwibWVyZ2VIZWFkZXJzIiwic291cmNlMSIsInNvdXJjZTIiLCJpc0hlYWRlcnNJbnN0YW5jZSIsInNvdXJjZSIsImRlZXBNZXJnZSIsInNvdXJjZXMiLCJyZXF1ZXN0TWV0aG9kcyIsInJlc3BvbnNlVHlwZXMiLCJ0ZXh0IiwicmV0cnlBZnRlclN0YXR1c0NvZGVzIiwic3RvcCIsIkhUVFBFcnJvciIsIlRpbWVvdXRFcnJvciIsImRlbGF5IiwibXMiLCJzZXRUaW1lb3V0Iiwibm9ybWFsaXplUmVxdWVzdE1ldGhvZCIsInRvVXBwZXJDYXNlIiwiZGVmYXVsdFJldHJ5T3B0aW9ucyIsImxpbWl0IiwibWV0aG9kcyIsInN0YXR1c0NvZGVzIiwiYWZ0ZXJTdGF0dXNDb2RlcyIsIm5vcm1hbGl6ZVJldHJ5T3B0aW9ucyIsInJldHJ5IiwibWF4U2FmZVRpbWVvdXQiLCJLeSIsImxvZyIsIl9yZXRyeUNvdW50IiwiX2lucHV0IiwiX29wdGlvbnMiLCJjcmVkZW50aWFscyIsImhvb2tzIiwiYmVmb3JlUmVxdWVzdCIsImJlZm9yZVJldHJ5IiwiYWZ0ZXJSZXNwb25zZSIsInByZWZpeFVybCIsIlVSTCIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsImFib3J0Q29udHJvbGxlciIsIlVSTFNlYXJjaFBhcmFtcyIsImZuIiwiUmFuZ2VFcnJvciIsIl9mZXRjaCIsImhvb2siLCJtb2RpZmllZFJlc3BvbnNlIiwiX2RlY29yYXRlUmVzcG9uc2UiLCJjbG9uZSIsIm9uRG93bmxvYWRQcm9ncmVzcyIsIl9zdHJlYW0iLCJfcmV0cnkiLCJtaW1lVHlwZSIsInBhcnNlSnNvbiIsIl9jYWxjdWxhdGVSZXRyeURlbGF5IiwicmV0cnlBZnRlciIsImFmdGVyIiwiTnVtYmVyIiwiaXNOYU4iLCJtYXhSZXRyeUFmdGVyIiwicmV0cnlDb3VudCIsInRpbWVvdXRJRCIsImNhdGNoIiwiY2xlYXJUaW1lb3V0IiwidG90YWxCeXRlcyIsInRyYW5zZmVycmVkQnl0ZXMiLCJyZWFkZXIiLCJnZXRSZWFkZXIiLCJwZXJjZW50IiwiZG9uZSIsImNsb3NlIiwiZW5xdWV1ZSIsInZhbGlkYXRlQW5kTWVyZ2UiLCJjcmVhdGVJbnN0YW5jZSIsImRlZmF1bHRzIiwia3kiLCJuZXdEZWZhdWx0cyIsImV4dGVuZCIsIm5vcm1hbGl6ZSIsInN0ciIsImpvaW5lZCIsImpvaW4iLCJyZXF1aXJlIiwiaHR0cCIsImh0dHBzIiwiemxpYiIsIlN0cmVhbSIsImRhdGFVcmlUb0J1ZmZlciIsInV0aWwiLCJjcnlwdG8iLCJGZXRjaEJhc2VFcnJvciIsImNhcHR1cmVTdGFja1RyYWNlIiwiRmV0Y2hFcnJvciIsInN5c3RlbUVycm9yIiwiZXJybm8iLCJlcnJvcmVkU3lzQ2FsbCIsInN5c2NhbGwiLCJOQU1FIiwiaXNVUkxTZWFyY2hQYXJhbWV0ZXJzIiwiZ2V0QWxsIiwiaGFzIiwic29ydCIsImlzQmxvYiIsImlzRm9ybURhdGEiLCJjYXJyaWFnZSIsImRhc2hlcyIsInJlcGVhdCIsImNhcnJpYWdlTGVuZ3RoIiwiZ2V0Rm9vdGVyIiwiYm91bmRhcnkiLCJnZXRIZWFkZXIiLCJmaWVsZCIsImhlYWRlciIsIklOVEVSTkFMUyIsIkJvZHkiLCJpc0FueUFycmF5QnVmZmVyIiwicmFuZG9tQnl0ZXMiLCJmb3JtIiwiZm9ybURhdGFJdGVyYXRvciIsImRpc3R1cmJlZCIsImJvZHlVc2VkIiwiY29uc3VtZUJvZHkiLCJjdCIsImJ1ZiIsImFsbG9jIiwiYWNjdW0iLCJhY2N1bUJ5dGVzIiwicmVhZGFibGVFbmRlZCIsIl9yZWFkYWJsZVN0YXRlIiwiZW5kZWQiLCJldmVyeSIsImluc3RhbmNlIiwicDEiLCJwMiIsImdldEJvdW5kYXJ5IiwiUGFzc1Rocm91Z2giLCJleHRyYWN0Q29udGVudFR5cGUiLCJnZXRUb3RhbEJ5dGVzIiwiZ2V0TGVuZ3RoU3luYyIsImhhc0tub3duTGVuZ3RoIiwiZ2V0Rm9ybURhdGFMZW5ndGgiLCJ2YWxpZGF0ZUhlYWRlck5hbWUiLCJ2YWxpZGF0ZUhlYWRlclZhbHVlIiwiaW5pdCIsInJhdyIsImlzQm94ZWRQcmltaXRpdmUiLCJpdGVyYXRvciIsInBhaXIiLCJQcm94eSIsInAiLCJyZWNlaXZlciIsIlNldCIsIlJlZmxlY3QiLCJjYWxsYmFjayIsImZvciIsInJlZGlyZWN0U3RhdHVzIiwiaXNSZWRpcmVjdCIsIklOVEVSTkFMUyQxIiwiY291bnRlciIsInJlZGlyZWN0ZWQiLCJsb2NhdGlvbiIsIklOVEVSTkFMUyQyIiwiaXNSZXF1ZXN0IiwicGFyc2VkVVJMIiwiaW5wdXRCb2R5IiwicmVkaXJlY3QiLCJmb2xsb3ciLCJjb21wcmVzcyIsImFnZW50IiwiaW5zZWN1cmVIVFRQUGFyc2VyIiwiZm9ybWF0IiwiQWJvcnRFcnJvciIsInN1cHBvcnRlZFNjaGVtYXMiLCJvcHRpb25zXyIsImNvbnRlbnRMZW5ndGhWYWx1ZSIsInNlYXJjaCIsImxhc3RPZmZzZXQiLCJocmVmIiwiaGFzaCIsImdldFNlYXJjaCIsInBhdGgiLCJwYXRobmFtZSIsImhvc3RuYW1lIiwicHJvdG9jb2wiLCJwb3J0IiwiZ2V0Tm9kZVJlcXVlc3RPcHRpb25zIiwic2VuZCIsImVtaXQiLCJhYm9ydEFuZEZpbmFsaXplIiwiZmluYWxpemUiLCJyZXF1ZXN0XyIsInJlc3BvbnNlXyIsImluZGV4IiwiYXJyYXkiLCJmcm9tUmF3SGVhZGVycyIsInJhd0hlYWRlcnMiLCJzdGF0dXNDb2RlIiwibG9jYXRpb25VUkwiLCJyZXF1ZXN0T3B0aW9ucyIsInBpcGVsaW5lIiwicHJvY2VzcyIsInJlc3BvbnNlT3B0aW9ucyIsInN0YXR1c01lc3NhZ2UiLCJjb2RpbmdzIiwiemxpYk9wdGlvbnMiLCJmbHVzaCIsIlpfU1lOQ19GTFVTSCIsImZpbmlzaEZsdXNoIiwiY3JlYXRlR3VuemlwIiwiY3JlYXRlQnJvdGxpRGVjb21wcmVzcyIsImNyZWF0ZUluZmxhdGUiLCJjcmVhdGVJbmZsYXRlUmF3IiwiZGVzdCIsIndyaXRlIiwid3JpdGVUb1N0cmVhbSIsIlN5bWJvbFBvbHlmaWxsIiwibm9vcCIsInR5cGVJc09iamVjdCIsInJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbiIsIm9yaWdpbmFsUHJvbWlzZSIsIm9yaWdpbmFsUHJvbWlzZVRoZW4iLCJvcmlnaW5hbFByb21pc2VSZXNvbHZlIiwib3JpZ2luYWxQcm9taXNlUmVqZWN0IiwibmV3UHJvbWlzZSIsImV4ZWN1dG9yIiwicHJvbWlzZVJlc29sdmVkV2l0aCIsInByb21pc2VSZWplY3RlZFdpdGgiLCJQZXJmb3JtUHJvbWlzZVRoZW4iLCJwcm9taXNlIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwidXBvblByb21pc2UiLCJ1cG9uRnVsZmlsbG1lbnQiLCJ1cG9uUmVqZWN0aW9uIiwidHJhbnNmb3JtUHJvbWlzZVdpdGgiLCJmdWxmaWxsbWVudEhhbmRsZXIiLCJyZWplY3Rpb25IYW5kbGVyIiwic2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSIsInF1ZXVlTWljcm90YXNrIiwiZ2xvYmFsUXVldWVNaWNyb3Rhc2siLCJyZXNvbHZlZFByb21pc2UiLCJyZWZsZWN0Q2FsbCIsIkYiLCJWIiwiYXJncyIsIkZ1bmN0aW9uIiwicHJvbWlzZUNhbGwiLCJTaW1wbGVRdWV1ZSIsIl9jdXJzb3IiLCJfc2l6ZSIsIl9mcm9udCIsIl9lbGVtZW50cyIsIl9uZXh0IiwiX2JhY2siLCJvbGRCYWNrIiwibmV3QmFjayIsIlFVRVVFX01BWF9BUlJBWV9TSVpFIiwic2hpZnQiLCJvbGRGcm9udCIsIm5ld0Zyb250Iiwib2xkQ3Vyc29yIiwibmV3Q3Vyc29yIiwiZWxlbWVudHMiLCJwZWVrIiwiZnJvbnQiLCJjdXJzb3IiLCJSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplIiwiX293bmVyUmVhZGFibGVTdHJlYW0iLCJfcmVhZGVyIiwiX3N0YXRlIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQiLCJfc3RvcmVkRXJyb3IiLCJSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwiLCJSZWFkYWJsZVN0cmVhbUNhbmNlbCIsIlJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkIiwicmVhZGVyTG9ja0V4Y2VwdGlvbiIsIl9jbG9zZWRQcm9taXNlIiwiX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSIsIl9jbG9zZWRQcm9taXNlX3JlamVjdCIsIkFib3J0U3RlcHMiLCJFcnJvclN0ZXBzIiwiQ2FuY2VsU3RlcHMiLCJQdWxsU3RlcHMiLCJOdW1iZXJJc0Zpbml0ZSIsImlzRmluaXRlIiwiTWF0aFRydW5jIiwidHJ1bmMiLCJ2IiwiY2VpbCIsImZsb29yIiwiYXNzZXJ0RGljdGlvbmFyeSIsImNvbnRleHQiLCJhc3NlcnRGdW5jdGlvbiIsImFzc2VydE9iamVjdCIsImFzc2VydFJlcXVpcmVkQXJndW1lbnQiLCJhc3NlcnRSZXF1aXJlZEZpZWxkIiwiY29udmVydFVucmVzdHJpY3RlZERvdWJsZSIsImNlbnNvck5lZ2F0aXZlWmVybyIsImNvbnZlcnRVbnNpZ25lZExvbmdMb25nV2l0aEVuZm9yY2VSYW5nZSIsInVwcGVyQm91bmQiLCJNQVhfU0FGRV9JTlRFR0VSIiwiaW50ZWdlclBhcnQiLCJhc3NlcnRSZWFkYWJsZVN0cmVhbSIsIklzUmVhZGFibGVTdHJlYW0iLCJBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIiwiUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdCIsInJlYWRSZXF1ZXN0IiwiX3JlYWRSZXF1ZXN0cyIsIlJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0IiwiX2Nsb3NlU3RlcHMiLCJfY2h1bmtTdGVwcyIsIlJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzIiwiUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyIiwiSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIiLCJJc1JlYWRhYmxlU3RyZWFtTG9ja2VkIiwiY2xvc2VkIiwiZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJjYW5jZWwiLCJyZXNvbHZlUHJvbWlzZSIsInJlamVjdFByb21pc2UiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkIiwiX2Vycm9yU3RlcHMiLCJlIiwicmVsZWFzZUxvY2siLCJoYXNPd25Qcm9wZXJ0eSIsIl9kaXN0dXJiZWQiLCJfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyIiwiQXN5bmNJdGVyYXRvclByb3RvdHlwZSIsIlJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGwiLCJwcmV2ZW50Q2FuY2VsIiwiX29uZ29pbmdQcm9taXNlIiwiX2lzRmluaXNoZWQiLCJfcHJldmVudENhbmNlbCIsIm5leHRTdGVwcyIsIl9uZXh0U3RlcHMiLCJyZXR1cm4iLCJyZXR1cm5TdGVwcyIsIl9yZXR1cm5TdGVwcyIsIlJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSIsIklzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yIiwiX2FzeW5jSXRlcmF0b3JJbXBsIiwic3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJfYSIsIk51bWJlcklzTmFOIiwiQ3JlYXRlQXJyYXlGcm9tTGlzdCIsIkNvcHlEYXRhQmxvY2tCeXRlcyIsImRlc3RPZmZzZXQiLCJzcmMiLCJzcmNPZmZzZXQiLCJuIiwiQXJyYXlCdWZmZXJTbGljZSIsImJlZ2luIiwiQ2xvbmVBc1VpbnQ4QXJyYXkiLCJPIiwiRGVxdWV1ZVZhbHVlIiwiY29udGFpbmVyIiwiX3F1ZXVlIiwiX3F1ZXVlVG90YWxTaXplIiwiRW5xdWV1ZVZhbHVlV2l0aFNpemUiLCJJbmZpbml0eSIsIlJlc2V0UXVldWUiLCJSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0IiwidmlldyIsIklzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCIsImJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbiIsIl92aWV3IiwicmVzcG9uZCIsImJ5dGVzV3JpdHRlbiIsIl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kIiwicmVzcG9uZFdpdGhOZXdWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3VmlldyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiLCJieW9iUmVxdWVzdCIsIklzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIsImJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXRCWU9CUmVxdWVzdCIsImRlc2lyZWRTaXplIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplIiwiX2Nsb3NlUmVxdWVzdGVkIiwiX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0iLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvciIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MiLCJfY2FuY2VsQWxnb3JpdGhtIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsImVudHJ5IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4iLCJhdXRvQWxsb2NhdGVDaHVua1NpemUiLCJfYXV0b0FsbG9jYXRlQ2h1bmtTaXplIiwiYnVmZmVyRSIsInB1bGxJbnRvRGVzY3JpcHRvciIsImJ1ZmZlckJ5dGVMZW5ndGgiLCJieXRlc0ZpbGxlZCIsImVsZW1lbnRTaXplIiwidmlld0NvbnN0cnVjdG9yIiwicmVhZGVyVHlwZSIsIl9wZW5kaW5nUHVsbEludG9zIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQiLCJzaG91bGRQdWxsIiwiX3N0YXJ0ZWQiLCJSZWFkYWJsZVN0cmVhbUhhc0JZT0JSZWFkZXIiLCJSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hvdWxkQ2FsbFB1bGwiLCJfcHVsbGluZyIsIl9wdWxsQWdhaW4iLCJfcHVsbEFsZ29yaXRobSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yIiwiZmlsbGVkVmlldyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yIiwicmVhZEludG9SZXF1ZXN0IiwiX3JlYWRJbnRvUmVxdWVzdHMiLCJSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkSW50b1JlcXVlc3QiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlIiwiY3VycmVudEFsaWduZWRCeXRlcyIsIm1heEJ5dGVzVG9Db3B5IiwibWF4Qnl0ZXNGaWxsZWQiLCJtYXhBbGlnbmVkQnl0ZXMiLCJ0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nIiwicmVhZHkiLCJxdWV1ZSIsImhlYWRPZlF1ZXVlIiwiYnl0ZXNUb0NvcHkiLCJkZXN0U3RhcnQiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IiLCJSZWFkYWJsZVN0cmVhbUNsb3NlIiwiX2J5b2JSZXF1ZXN0IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclByb2Nlc3NQdWxsSW50b0Rlc2NyaXB0b3JzVXNpbmdRdWV1ZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwiLCJmaXJzdERlc2NyaXB0b3IiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEluQ2xvc2VkU3RhdGUiLCJyZW1haW5kZXJTaXplIiwicmVtYWluZGVyIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUiLCJ0cmFuc2ZlcnJlZEJ1ZmZlciIsImZpcnN0UGVuZGluZ1B1bGxJbnRvIiwiUmVhZGFibGVTdHJlYW1FcnJvciIsIlNldFVwUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCIsIl9zdHJhdGVneUhXTSIsIlNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIsInN0YXJ0QWxnb3JpdGhtIiwicHVsbEFsZ29yaXRobSIsImNhbmNlbEFsZ29yaXRobSIsInIiLCJBY3F1aXJlUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIiwiUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIiwiUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3QiLCJJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlciIsImJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyUmVhZCIsIkRhdGFWaWV3IiwiQllURVNfUEVSX0VMRU1FTlQiLCJjdG9yIiwiZW1wdHlWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclB1bGxJbnRvIiwiRXh0cmFjdEhpZ2hXYXRlck1hcmsiLCJzdHJhdGVneSIsImRlZmF1bHRIV00iLCJFeHRyYWN0U2l6ZUFsZ29yaXRobSIsImNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kiLCJjb252ZXJ0UXVldWluZ1N0cmF0ZWd5U2l6ZSIsImNvbnZlcnRVbmRlcmx5aW5nU2lua0Fib3J0Q2FsbGJhY2siLCJvcmlnaW5hbCIsImNvbnZlcnRVbmRlcmx5aW5nU2lua0Nsb3NlQ2FsbGJhY2siLCJjb252ZXJ0VW5kZXJseWluZ1NpbmtTdGFydENhbGxiYWNrIiwiY29udmVydFVuZGVybHlpbmdTaW5rV3JpdGVDYWxsYmFjayIsImFzc2VydFdyaXRhYmxlU3RyZWFtIiwiSXNXcml0YWJsZVN0cmVhbSIsIldyaXRhYmxlU3RyZWFtIiwicmF3VW5kZXJseWluZ1NpbmsiLCJyYXdTdHJhdGVneSIsInVuZGVybHlpbmdTaW5rIiwiY29udmVydFVuZGVybHlpbmdTaW5rIiwiSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtIiwic2l6ZUFsZ29yaXRobSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJ3cml0ZUFsZ29yaXRobSIsImNsb3NlQWxnb3JpdGhtIiwiYWJvcnRBbGdvcml0aG0iLCJTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NpbmsiLCJsb2NrZWQiLCJzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIiLCJJc1dyaXRhYmxlU3RyZWFtTG9ja2VkIiwiV3JpdGFibGVTdHJlYW1BYm9ydCIsIldyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0IiwiV3JpdGFibGVTdHJlYW1DbG9zZSIsImdldFdyaXRlciIsIkFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIiLCJfd3JpdGVyIiwiX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciIsIl93cml0ZVJlcXVlc3RzIiwiX2luRmxpZ2h0V3JpdGVSZXF1ZXN0IiwiX2Nsb3NlUmVxdWVzdCIsIl9pbkZsaWdodENsb3NlUmVxdWVzdCIsIl9wZW5kaW5nQWJvcnRSZXF1ZXN0IiwiX2JhY2twcmVzc3VyZSIsIl9hYm9ydFJlYXNvbiIsIl9hYm9ydENvbnRyb2xsZXIiLCJfcHJvbWlzZSIsIndhc0FscmVhZHlFcnJvcmluZyIsIl9yZXNvbHZlIiwiX3JlamVjdCIsIl9yZWFzb24iLCJfd2FzQWxyZWFkeUVycm9yaW5nIiwiV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nIiwiY2xvc2VSZXF1ZXN0Iiwid3JpdGVyIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUiLCJjbG9zZVNlbnRpbmVsIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkIiwiV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbiIsIldyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3JpbmciLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZCIsIldyaXRhYmxlU3RyZWFtSGFzT3BlcmF0aW9uTWFya2VkSW5GbGlnaHQiLCJzdG9yZWRFcnJvciIsIndyaXRlUmVxdWVzdCIsIldyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQiLCJhYm9ydFJlcXVlc3QiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCIsIldyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlIiwiYmFja3ByZXNzdXJlIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQiLCJfb3duZXJXcml0YWJsZVN0cmVhbSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQiLCJJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIsImRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJHZXREZXNpcmVkU2l6ZSIsIl9yZWFkeVByb21pc2UiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkIiwiX2Nsb3NlZFByb21pc2VTdGF0ZSIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkIiwiX3JlYWR5UHJvbWlzZVN0YXRlIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQiLCJyZWxlYXNlZEVycm9yIiwiY2h1bmtTaXplIiwiX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSIsImNodW5rU2l6ZUUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZCIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUiLCJXcml0YWJsZVN0cmVhbUFkZFdyaXRlUmVxdWVzdCIsImVucXVldWVFIiwiX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyV3JpdGUiLCJhYm9ydFJlYXNvbiIsIklzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsImRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQyIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yIiwiX2Fib3J0QWxnb3JpdGhtIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsImNyZWF0ZUFib3J0Q29udHJvbGxlciIsIl93cml0ZUFsZ29yaXRobSIsIl9jbG9zZUFsZ29yaXRobSIsIldyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0Iiwic2lua0Nsb3NlUHJvbWlzZSIsIldyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZSIsIldyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZVdpdGhFcnJvciIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UiLCJXcml0YWJsZVN0cmVhbU1hcmtGaXJzdFdyaXRlUmVxdWVzdEluRmxpZ2h0IiwiV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlIiwiV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZSIsIl9yZWFkeVByb21pc2VfcmVzb2x2ZSIsIl9yZWFkeVByb21pc2VfcmVqZWN0IiwiTmF0aXZlRE9NRXhjZXB0aW9uIiwiRE9NRXhjZXB0aW9uIiwiRE9NRXhjZXB0aW9uJDEiLCJpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yIiwiY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwiLCJSZWFkYWJsZVN0cmVhbVBpcGVUbyIsInByZXZlbnRDbG9zZSIsInByZXZlbnRBYm9ydCIsInNodXR0aW5nRG93biIsImN1cnJlbnRXcml0ZSIsImFjdGlvbnMiLCJzaHV0ZG93bldpdGhBY3Rpb24iLCJhbGwiLCJhY3Rpb24iLCJpc09yQmVjb21lc0Vycm9yZWQiLCJzaHV0ZG93biIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24iLCJkZXN0Q2xvc2VkIiwid2FpdEZvcldyaXRlc1RvRmluaXNoIiwib2xkQ3VycmVudFdyaXRlIiwib3JpZ2luYWxJc0Vycm9yIiwib3JpZ2luYWxFcnJvciIsImRvVGhlUmVzdCIsIm5ld0Vycm9yIiwiaXNFcnJvciIsInJlc29sdmVMb29wIiwicmVqZWN0TG9vcCIsInJlc29sdmVSZWFkIiwicmVqZWN0UmVhZCIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsIl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0iLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCIsIlNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsIlJlYWRhYmxlU3RyZWFtVGVlIiwiY2xvbmVGb3JCcmFuY2gyIiwicmVhc29uMSIsInJlYXNvbjIiLCJicmFuY2gxIiwiYnJhbmNoMiIsInJlc29sdmVDYW5jZWxQcm9taXNlIiwicmVhZGluZyIsImNhbmNlbGVkMSIsImNhbmNlbGVkMiIsImNhbmNlbFByb21pc2UiLCJmb3J3YXJkUmVhZGVyRXJyb3IiLCJ0aGlzUmVhZGVyIiwicHVsbFdpdGhEZWZhdWx0UmVhZGVyIiwiY2h1bmsxIiwiY2h1bmsyIiwiY2xvbmVFIiwicHVsbFdpdGhCWU9CUmVhZGVyIiwiZm9yQnJhbmNoMiIsImJ5b2JCcmFuY2giLCJvdGhlckJyYW5jaCIsImJ5b2JDYW5jZWxlZCIsImNsb25lZENodW5rIiwib3RoZXJDYW5jZWxlZCIsInB1bGwxQWxnb3JpdGhtIiwicHVsbDJBbGdvcml0aG0iLCJjYW5jZWwxQWxnb3JpdGhtIiwiY29tcG9zaXRlUmVhc29uIiwiY2FuY2VsUmVzdWx0IiwiY2FuY2VsMkFsZ29yaXRobSIsIkNyZWF0ZVJlYWRhYmxlQnl0ZVN0cmVhbSIsIlJlYWRhYmxlQnl0ZVN0cmVhbVRlZSIsIkNyZWF0ZVJlYWRhYmxlU3RyZWFtIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0VGVlIiwiY29udmVydFVuZGVybHlpbmdTb3VyY2VDYW5jZWxDYWxsYmFjayIsImNvbnZlcnRVbmRlcmx5aW5nU291cmNlUHVsbENhbGxiYWNrIiwiY29udmVydFVuZGVybHlpbmdTb3VyY2VTdGFydENhbGxiYWNrIiwiY29udmVydFJlYWRhYmxlU3RyZWFtVHlwZSIsImNvbnZlcnRSZWFkYWJsZVN0cmVhbVJlYWRlck1vZGUiLCJtb2RlIiwiY29udmVydFBpcGVPcHRpb25zIiwiaXNBYm9ydFNpZ25hbCIsImFzc2VydEFib3J0U2lnbmFsIiwicmF3VW5kZXJseWluZ1NvdXJjZSIsInVuZGVybHlpbmdTb3VyY2UiLCJwdWxsIiwiY29udmVydFVuZGVybHlpbmdEZWZhdWx0T3JCeXRlU291cmNlIiwiSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtIiwidW5kZXJseWluZ0J5dGVTb3VyY2UiLCJTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSIsIlNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlIiwic3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxIiwicmF3T3B0aW9ucyIsImNvbnZlcnRSZWFkZXJPcHRpb25zIiwicGlwZVRocm91Z2giLCJyYXdUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iLCJyZWFkYWJsZSIsImNvbnZlcnRSZWFkYWJsZVdyaXRhYmxlUGFpciIsInBpcGVUbyIsImRlc3RpbmF0aW9uIiwidGVlIiwiaW1wbCIsIkFjcXVpcmVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IiLCJjb252ZXJ0SXRlcmF0b3JPcHRpb25zIiwiY29udmVydFF1ZXVpbmdTdHJhdGVneUluaXQiLCJhc3luY0l0ZXJhdG9yIiwiYnl0ZUxlbmd0aFNpemVGdW5jdGlvbiIsIkJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kiLCJfYnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcmsiLCJJc0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kiLCJieXRlTGVuZ3RoQnJhbmRDaGVja0V4Y2VwdGlvbiIsImNvdW50U2l6ZUZ1bmN0aW9uIiwiQ291bnRRdWV1aW5nU3RyYXRlZ3kiLCJfY291bnRRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrIiwiSXNDb3VudFF1ZXVpbmdTdHJhdGVneSIsImNvdW50QnJhbmRDaGVja0V4Y2VwdGlvbiIsImNvbnZlcnRUcmFuc2Zvcm1lckZsdXNoQ2FsbGJhY2siLCJjb252ZXJ0VHJhbnNmb3JtZXJTdGFydENhbGxiYWNrIiwiY29udmVydFRyYW5zZm9ybWVyVHJhbnNmb3JtQ2FsbGJhY2siLCJUcmFuc2Zvcm1TdHJlYW0iLCJyYXdUcmFuc2Zvcm1lciIsInJhd1dyaXRhYmxlU3RyYXRlZ3kiLCJyYXdSZWFkYWJsZVN0cmF0ZWd5Iiwid3JpdGFibGVTdHJhdGVneSIsInJlYWRhYmxlU3RyYXRlZ3kiLCJ0cmFuc2Zvcm1lciIsInJlYWRhYmxlVHlwZSIsIndyaXRhYmxlVHlwZSIsImNvbnZlcnRUcmFuc2Zvcm1lciIsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIsInJlYWRhYmxlU2l6ZUFsZ29yaXRobSIsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsIndyaXRhYmxlU2l6ZUFsZ29yaXRobSIsInN0YXJ0UHJvbWlzZV9yZXNvbHZlIiwic3RhcnRQcm9taXNlIiwiX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIiLCJfYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSIsIl93cml0YWJsZSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1FcnJvciIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQWJvcnRBbGdvcml0aG0iLCJfcmVhZGFibGUiLCJmbHVzaFByb21pc2UiLCJfZmx1c2hBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQ2xvc2VBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUiLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUiLCJDcmVhdGVXcml0YWJsZVN0cmVhbSIsIl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUiLCJJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJ0cmFuc2Zvcm1BbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUiLCJ0cmFuc2Zvcm1SZXN1bHRFIiwiZmx1c2hBbGdvcml0aG0iLCJfY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSIsIl90cmFuc2Zvcm1BbGdvcml0aG0iLCJTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21UcmFuc2Zvcm1lciIsIklzVHJhbnNmb3JtU3RyZWFtIiwic3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiIsIklzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJ0ZXJtaW5hdGUiLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclRlcm1pbmF0ZSIsInJlYWRhYmxlQ29udHJvbGxlciIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJIYXNCYWNrcHJlc3N1cmUiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJsb2FkZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiZGVmaW5pdGlvbiIsIm8iLCJwcm9wIiwibm1kIiwicGF0aHMiLCJjaGlsZHJlbiJdLCJzb3VyY2VSb290IjoiIn0=