From 11dbe3e09414d21a0d052df4e169b5002b727bb2 Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Mon, 5 Sep 2022 07:20:30 +0100 Subject: [PATCH] Reformat and don't pass back default parameters to URL --- app/local_settings.example.py | 133 +-- app/settings.py | 31 +- app/urls.py | 2 +- core/lib/manticore.py | 8 +- core/static/chart.js | 70 +- core/static/js/chart.js | 2 +- core/static/js/column-shifter.js | 84 +- core/static/js/magnet.min.js | 2 +- core/static/modal.js | 34 +- core/static/style.css | 84 +- core/static/tabs.js | 42 +- core/templates/base.html | 570 +++++------ core/templates/billing.html | 84 +- core/templates/cancel.html | 6 +- core/templates/denied.html | 4 +- core/templates/index.html | 84 +- .../manage/threshold/irc/network/actions.html | 152 +-- .../threshold/irc/network/channels.html | 84 +- .../threshold/irc/network/edit-network.html | 140 +-- .../manage/threshold/irc/network/info.html | 116 +-- .../irc/network/modals/registration.html | 164 +-- .../manage/threshold/irc/network/network.html | 264 ++--- .../manage/threshold/irc/network/relays.html | 430 ++++---- .../manage/threshold/irc/network/stats.html | 50 +- .../threshold/irc/overview/actions.html | 86 +- .../threshold/irc/overview/aliases.html | 80 +- .../irc/overview/modals/add-network.html | 132 +-- .../irc/overview/modals/edit-aliases.html | 114 +-- .../threshold/irc/overview/networks.html | 146 +-- .../threshold/irc/overview/overview.html | 146 +-- .../manage/threshold/irc/overview/stats.html | 86 +- .../manage/threshold/partials/notify.html | 6 +- core/templates/modals/context.html | 206 ++-- core/templates/modals/drilldown.html | 2 +- core/templates/partials/context_table.html | 344 +++---- core/templates/partials/notify-alt.html | 6 +- core/templates/partials/notify.html | 6 +- core/templates/partials/product-list.html | 78 +- core/templates/registration/login.html | 36 +- core/templates/registration/signup.html | 36 +- core/templates/subscriptioncancel.html | 6 +- core/templates/success.html | 12 +- core/templates/ui/drilldown/drilldown.html | 270 ++--- .../ui/drilldown/search_partial.html | 788 +++++++-------- .../ui/drilldown/sentiment_partial.html | 8 +- .../ui/drilldown/table_results_partial.html | 954 +++++++++--------- core/templates/ui/insights/channels.html | 52 +- core/templates/ui/insights/info.html | 190 ++-- core/templates/ui/insights/insights.html | 176 ++-- core/templates/ui/insights/meta.html | 32 +- core/templates/ui/insights/nicks.html | 98 +- core/templates/widgets/drilldown.html | 8 +- core/templates/widgets/table_results.html | 66 +- core/templates/window-content/context.html | 208 ++-- .../window-content/context_table.html | 344 +++---- core/templates/window-content/drilldown.html | 194 ++-- core/templates/windows/drilldown.html | 4 +- core/templates/wm/magnet.html | 10 +- core/templates/wm/modal.html | 14 +- core/templates/wm/panel.html | 28 +- core/templates/wm/widget.html | 61 +- core/views/helpers.py | 14 + core/views/ui/drilldown.py | 21 +- docker/Dockerfile | 2 +- 64 files changed, 3843 insertions(+), 3867 deletions(-) diff --git a/app/local_settings.example.py b/app/local_settings.example.py index e330b23..3508e36 100644 --- a/app/local_settings.example.py +++ b/app/local_settings.example.py @@ -5,98 +5,64 @@ OPENSEARCH_TLS = True OPENSEARCH_USERNAME = "admin" OPENSEARCH_PASSWORD = "" -OPENSEARCH_INDEX_MAIN = "main" -OPENSEARCH_INDEX_META = "meta" -OPENSEARCH_INDEX_INT = "int" +OPENSEARCH_INDEX_MAIN = "pathogen-main" +OPENSEARCH_INDEX_META = "pathogen-meta" +OPENSEARCH_INDEX_INT = "pathogen-int" OPENSEARCH_MAIN_SIZES = ["20", "50", "100", "200", "400", "800"] OPENSEARCH_MAIN_SIZES_ANON = ["20", "50", "100"] -OPENSEARCH_MAIN_WILDCARD = True -OPENSEARCH_MAIN_WILDCARD_ANON = False -OPENSEARCH_MAIN_SOURCES = ["irc", "dis", "all"] +OPENSEARCH_MAIN_SOURCES = ["dis", "4ch", "all"] +OPENSEARCH_SOURCES_RESTRICTED = ["irc"] + +# Manticore settings +MANTICORE_URL = "http://monolith-db-1:9308" +MANTICORE_INDEX_MAIN = "main" +MANTICORE_INDEX_META = "meta" +MANTICORE_INDEX_INT = "int" + +MANTICORE_MAIN_SIZES = ["20", "50", "100", "200", "400", "800"] +MANTICORE_MAIN_SIZES_ANON = ["20", "50", "100"] +MANTICORE_MAIN_SOURCES = ["dis", "4ch", "all"] +MANTICORE_SOURCES_RESTRICTED = ["irc"] + DRILLDOWN_RESULTS_PER_PAGE = 15 +DRILLDOWN_DEFAULT_PARAMS = { + "size": "20", + "index": "main", + "sorting": "desc", + "source": "4ch", +} # Encryption -ENCRYPTION = False -ENCRYPTION_KEY = b"" +# ENCRYPTION = False +# ENCRYPTION_KEY = b"" # Hashing -HASHING = True -HASHING_KEY = "xxx" +# HASHING = True +# HASHING_KEY = "xxx" # Obfuscation -OBFUSCATION = True -# Fields obfuscate based on separators -OBFUSCATE_FIELDS_SEP = ["date", "time"] -# Fields to obfuscate based on length -OBFUSCATE_FIELDS = ["ts"] -OBFUSCATE_KEEP_RATIO = 0.9 -# DON'T obfuscate the last X fields of values separates by dashes -OBFUSCATE_DASH_NUM = 2 -# DON'T obfuscate the last X fields of values separates by colons -OBFUSCATE_COLON_NUM = 1 +# OBFUSCATION = True +# # Fields obfuscate based on separators +# OBFUSCATE_FIELDS_SEP = ["date", "time"] +# # Fields to obfuscate based on length +# OBFUSCATE_FIELDS = ["ts"] +# OBFUSCATE_KEEP_RATIO = 0.9 +# # DON'T obfuscate the last X fields of values separates by dashes +# OBFUSCATE_DASH_NUM = 2 +# # DON'T obfuscate the last X fields of values separates by colons +# OBFUSCATE_COLON_NUM = 1 -SEARCH_FIELDS_DENY = ["ts", "date", "time"] - -DELAY_RESULTS = True -# Delay results by this many days -DELAY_DURATION = 10 - -# Common to encryption and hashing -WHITELIST_FIELDS = [ - "ts", - "date", - "time", - "sentiment", - "version_sentiment", - "tokens", - "num_chans", - "num_users", - "online", - "src", - "exemption", - "hidden", - "type", -] - -# Don't obfuscate these parameters, or lookup hashes in them -NO_OBFUSCATE_PARAMS = [ - "query", - # "query_full", - "size", - "source", - "sorting", - "tags", - "index", - "dedup", - "check_sentiment", - "sentiment_method", - "dates", - "sort", - "page", -] - -# Don't allow tag search for these parameters -TAG_SEARCH_DENY = [ - "query", - "query_full", - "size", - "source", - "sorting", - "tags", - "index", - "dedup", - "check_sentiment", - "sentiment_method", - "dates", - "sort", - "page", -] +# SEARCH_FIELDS_DENY = ["ts", "date", "time"] +# DELAY_RESULTS = True +# # Delay results by this many days +# DELAY_DURATION = 10 OPENSEARCH_BLACKLISTED = {} -# URLs + +# URLs\ DOMAIN = "example.com" URL = f"https://{DOMAIN}" @@ -121,8 +87,8 @@ SECRET_KEY = "a" STRIPE_ADMIN_COUPON = "" # Threshold -THRESHOLD_ENDPOINT = "" -THRESHOLD_API_KEY = "api_1" +THRESHOLD_ENDPOINT = "http://threshold-app-1:13869" +THRESHOLD_API_KEY = "" THRESHOLD_API_TOKEN = "" THRESHOLD_API_COUNTER = "" @@ -138,3 +104,12 @@ META_QUERY_SIZE = 10000 DEBUG = True PROFILER = False + +if DEBUG: + import socket # only if you haven't already imported this + + hostname, _, ips = socket.gethostbyname_ex(socket.gethostname()) + INTERNAL_IPS = [ip[: ip.rfind(".")] + ".1" for ip in ips] + [ + "127.0.0.1", + "10.0.2.2", + ] diff --git a/app/settings.py b/app/settings.py index 692d9e8..9d2e722 100644 --- a/app/settings.py +++ b/app/settings.py @@ -42,7 +42,6 @@ INSTALLED_APPS = [ "crispy_bulma", "django_tables2", "django_tables2_bulma_template", - ] CRISPY_TEMPLATE_PACK = "bulma" CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",) @@ -149,21 +148,21 @@ INTERNAL_IPS = [ ] DEBUG_TOOLBAR_PANELS = [ - 'template_profiler_panel.panels.template.TemplateProfilerPanel', - 'debug_toolbar.panels.history.HistoryPanel', - 'debug_toolbar.panels.versions.VersionsPanel', - 'debug_toolbar.panels.timer.TimerPanel', - 'debug_toolbar.panels.settings.SettingsPanel', - 'debug_toolbar.panels.headers.HeadersPanel', - 'debug_toolbar.panels.request.RequestPanel', - 'debug_toolbar.panels.sql.SQLPanel', - 'debug_toolbar.panels.staticfiles.StaticFilesPanel', - 'debug_toolbar.panels.templates.TemplatesPanel', - 'debug_toolbar.panels.cache.CachePanel', - 'debug_toolbar.panels.signals.SignalsPanel', - 'debug_toolbar.panels.logging.LoggingPanel', - 'debug_toolbar.panels.redirects.RedirectsPanel', - 'debug_toolbar.panels.profiling.ProfilingPanel', + "template_profiler_panel.panels.template.TemplateProfilerPanel", + "debug_toolbar.panels.history.HistoryPanel", + "debug_toolbar.panels.versions.VersionsPanel", + "debug_toolbar.panels.timer.TimerPanel", + "debug_toolbar.panels.settings.SettingsPanel", + "debug_toolbar.panels.headers.HeadersPanel", + "debug_toolbar.panels.request.RequestPanel", + "debug_toolbar.panels.sql.SQLPanel", + "debug_toolbar.panels.staticfiles.StaticFilesPanel", + "debug_toolbar.panels.templates.TemplatesPanel", + "debug_toolbar.panels.cache.CachePanel", + "debug_toolbar.panels.signals.SignalsPanel", + "debug_toolbar.panels.logging.LoggingPanel", + "debug_toolbar.panels.redirects.RedirectsPanel", + "debug_toolbar.panels.profiling.ProfilingPanel", ] from app.local_settings import * # noqa diff --git a/app/urls.py b/app/urls.py index 53b0b7c..64cfa3f 100644 --- a/app/urls.py +++ b/app/urls.py @@ -73,7 +73,7 @@ from core.views.ui.insights import ( ) urlpatterns = [ - path('__debug__/', include('debug_toolbar.urls')), + path("__debug__/", include("debug_toolbar.urls")), path("", DrilldownTableView.as_view(), name="home"), path("search/", DrilldownTableView.as_view(), name="search"), path("about/", About.as_view(), name="about"), diff --git a/core/lib/manticore.py b/core/lib/manticore.py index f3737ec..050b022 100644 --- a/core/lib/manticore.py +++ b/core/lib/manticore.py @@ -5,7 +5,7 @@ import manticoresearch from django.conf import settings from core.lib.processing import annotate_results, filter_blacklisted, parse_results -from core.views.helpers import dedup_list +from core.views import helpers def initialise_manticore(): @@ -68,7 +68,9 @@ def query_results( sort = None query_created = False source = None - + print("BEFORE ADD DEFAULTS", query_params) + helpers.add_defaults(query_params) + print("AFTER ADD DEFAULTS", query_params) # Check size if request.user.is_anonymous: sizes = settings.MANTICORE_MAIN_SIZES_ANON @@ -283,7 +285,7 @@ def query_results( if dedup: if not dedup_fields: dedup_fields = ["msg", "nick", "ident", "host", "net", "channel"] - results_parsed = dedup_list(results_parsed, dedup_fields) + results_parsed = helpers.dedup_list(results_parsed, dedup_fields) context = { "object_list": results_parsed, "card": results["hits"]["total"], diff --git a/core/static/chart.js b/core/static/chart.js index d445bb5..858680e 100644 --- a/core/static/chart.js +++ b/core/static/chart.js @@ -6,42 +6,42 @@ var full_data = jsonData.map((item) => item); var ctx = document.getElementById('sentiment-chart').getContext("2d"); new Chart(ctx, { - type: 'line', - data: { - datasets: [ - { - label: "Sentiment", - fill: false, - backgroundColor: 'black', - borderColor: 'lightblue', - tension: 0.3, - data: full_data, - spanGaps: true, - } - ], - }, - options: { - responsive: true, - maintainAspectRatio: false, - parsing: { - xAxisKey: 'date', - yAxisKey: 'value', + type: 'line', + data: { + datasets: [ + { + label: "Sentiment", + fill: false, + backgroundColor: 'black', + borderColor: 'lightblue', + tension: 0.3, + data: full_data, + spanGaps: true, + } + ], }, - plugins: { - tooltip: { - callbacks: { - footer: function(context) { - var foot = "Text: " + full_data[context[0].dataIndex].text + "\n"; - foot += "Nick: " + full_data[context[0].dataIndex].nick + "\n"; - foot += "Channel: " + full_data[context[0].dataIndex].channel + "\n"; - foot += "Net: " + full_data[context[0].dataIndex].net; - return foot; - } + options: { + responsive: true, + maintainAspectRatio: false, + parsing: { + xAxisKey: 'date', + yAxisKey: 'value', + }, + plugins: { + tooltip: { + callbacks: { + footer: function(context) { + var foot = "Text: " + full_data[context[0].dataIndex].text + "\n"; + foot += "Nick: " + full_data[context[0].dataIndex].nick + "\n"; + foot += "Channel: " + full_data[context[0].dataIndex].channel + "\n"; + foot += "Net: " + full_data[context[0].dataIndex].net; + return foot; + } + } + }, + legend: { + display: false, + }, } - }, - legend: { - display: false, - }, } - } }); diff --git a/core/static/js/chart.js b/core/static/js/chart.js index 8f69759..98d2d31 100644 --- a/core/static/js/chart.js +++ b/core/static/js/chart.js @@ -5,7 +5,7 @@ * Released under the MIT License */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";function t(){}const e=function(){let t=0;return function(){return t++}}();function i(t){return null==t}function s(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function n(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const o=t=>("number"==typeof t||t instanceof Number)&&isFinite(+t);function a(t,e){return o(t)?t:e}function r(t,e){return void 0===t?e:t}const l=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function c(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function d(t,e,i,o){let a,r,l;if(s(t))if(r=t.length,o)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function y(t,e){const i=_[e]||(_[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const M=t=>void 0!==t,k=t=>"function"==typeof t,S=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function P(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const D=Math.PI,O=2*D,C=O+D,A=Number.POSITIVE_INFINITY,T=D/180,L=D/2,E=D/4,R=2*D/3,I=Math.log10,z=Math.sign;function F(t){const e=Math.round(t);t=N(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(I(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function V(t){const e=[],i=Math.sqrt(t);let s;for(s=1;st-e)).pop(),e}function B(t){return!isNaN(parseFloat(t))&&isFinite(t)}function N(t,e,i){return Math.abs(t-e)=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function tt(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const et=(t,e,i,s)=>tt(t,i,s?s=>t[s][e]<=i:s=>t[s][e]tt(t,i,(s=>t[s][e]>=i));function st(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function at(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(nt.forEach((e=>{delete t[e]})),delete t._chartjs)}function rt(t){const e=new Set;let i,s;for(i=0,s=t.length;iArray.prototype.slice.call(t));let n=!1,o=[];return function(...i){o=s(i),n||(n=!0,lt.call(window,(()=>{n=!1,t.apply(e,o)})))}}function ct(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const dt=t=>"start"===t?"left":"end"===t?"right":"center",ut=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,ft=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function gt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=Z(Math.min(et(r,a.axis,h).lo,i?s:et(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?Z(Math.max(et(r,a.axis,c,!0).hi+1,i?0:et(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function pt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}var mt=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=lt.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}; -/*! + /*! * @kurkle/color v0.2.1 * https://github.com/kurkle/color#readme * (c) 2022 Jukka Kurkela diff --git a/core/static/js/column-shifter.js b/core/static/js/column-shifter.js index b8b3c35..fd22295 100644 --- a/core/static/js/column-shifter.js +++ b/core/static/js/column-shifter.js @@ -26,45 +26,45 @@ $(document).ready(function(){ var storage = localStorage.getItem(COLUMN_SHIFTER_STORAGE_ACCESOR); if (storage === null) { storage = { - "drilldown-table": { - "date": "off", - "time": "off", - "id": "off", - "host": "off", - "ident": "off", - "channel": "off", - "net": "off", - "num": "off", - "channel_nsfw": "off", - "channel_category": "off", - "channel_category_id": "off", - "channel_category_nsfw": "off", - "channel_id": "off", - "guild_member_count": "off", - "bot": "off", - "msg_id": "off", - "net_id": "off", - "user_id": "off", - "nick_id": "off", - "status": "off", - "num_users": "off", - "num_chans": "off", - "exemption": "off", - // "version_sentiment": "off", - "sentiment": "off", - "num": "off", - "online": "off", - "mtype": "off", - "realname": "off", - "server": "off", - "mtype": "off", - "hidden": "off", - "filename": "off", - "file_md5": "off", - "file_ext": "off", - "file_size": "off", - }, - }; + "drilldown-table": { + "date": "off", + "time": "off", + "id": "off", + "host": "off", + "ident": "off", + "channel": "off", + "net": "off", + "num": "off", + "channel_nsfw": "off", + "channel_category": "off", + "channel_category_id": "off", + "channel_category_nsfw": "off", + "channel_id": "off", + "guild_member_count": "off", + "bot": "off", + "msg_id": "off", + "net_id": "off", + "user_id": "off", + "nick_id": "off", + "status": "off", + "num_users": "off", + "num_chans": "off", + "exemption": "off", + // "version_sentiment": "off", + "sentiment": "off", + "num": "off", + "online": "off", + "mtype": "off", + "realname": "off", + "server": "off", + "mtype": "off", + "hidden": "off", + "filename": "off", + "file_md5": "off", + "file_ext": "off", + "file_size": "off", + }, + }; } else { storage = JSON.parse(storage); } @@ -226,9 +226,9 @@ $(document).ready(function(){ // show or hide columns based on data from web storage shift_columns(); - + // Add API method for retrieving non-visible cols for table - // Pass the 0-based index of the table or leave the parameter + // Pass the 0-based index of the table or leave the parameter // empty to return the hidden cols for the 1st table found $.django_tables2_column_shifter_hidden = function(idx) { if(idx==undefined) { @@ -236,7 +236,7 @@ $(document).ready(function(){ } return $('#table-container').eq(idx).find('.btn-shift-column').filter(function(z) { return $(this).data('state')=='off' - }).map(function(z) { + }).map(function(z) { return $(this).data('td-class') }).toArray(); } diff --git a/core/static/js/magnet.min.js b/core/static/js/magnet.min.js index f536a3b..37f25e7 100644 --- a/core/static/js/magnet.min.js +++ b/core/static/js/magnet.min.js @@ -1,2 +1,2 @@ (()=>{"use strict";const t=function(t,e){return t instanceof DOMPoint?DOMPoint.fromPoint(t):t instanceof DOMRect?new DOMPoint(t.x,t.y):new DOMPoint(t,e)},e=t;function n(e){const{best:n}=e;return t(n.x?.rawDistance??0,n.y?.rawDistance??0)}const a=/[|;,\s]/;function s(t,e){if(null===t)return[];const n=t.split(a);return void 0===e?n:Object.values(e).filter((t=>n.includes(t)))}function o(t,e){const n=Array.isArray(t)?t:[t];return void 0===e?n.join("|"):Object.values(e).filter((t=>n.includes(t))).join("|")}const r=function(t,e){return customElements.get(e)?Promise.reject(new Error(`Already defined <${e}>`)):(customElements.define(e,t),customElements.whenDefined(e))};var i;!function(t){t.topToTop="topToTop",t.topToBottom="topToBottom",t.rightToRight="rightToRight",t.rightToLeft="rightToLeft",t.bottomToTop="bottomToTop",t.bottomToBottom="bottomToBottom",t.leftToRight="leftToRight",t.leftToLeft="leftToLeft",t.xCenterToXCenter="xCenterToXCenter",t.yCenterToYCenter="yCenterToYCenter"}(i||(i={}));const c=[i.rightToRight,i.rightToLeft,i.leftToRight,i.leftToLeft,i.xCenterToXCenter],l=[i.topToTop,i.topToBottom,i.bottomToTop,i.bottomToBottom,i.yCenterToYCenter],u=i;var g;let h;!function(t){t.outer="outer",t.inner="inner",t.center="center",t.extend="extend"}(g||(g={})),function(t){t.inner="inner",t.center="center"}(h||(h={}));const f=g;var d;!function(t){t.disabled="disabled",t.group="group",t.unattractable="unattractable",t.unmovable="unmovable",t.attractDistance="attract-distance",t.alignTo="align-to",t.alignToParent="align-to-parent",t.crossPrevent="cross-prevent",t.offsetUnit="offset-unit"}(d||(d={}));const m=d;var b;!function(t){t.parent="parent"}(b||(b={}));const p=b;var T;!function(t){t.magnetstart="magnetstart",t.magnetmove="magnetmove",t.magnetend="magnetend",t.attract="attract",t.attracted="attracted",t.attractmove="attractmove",t.attractedmove="attractedmove",t.unattract="unattract",t.unattracted="unattracted"}(T||(T={}));const y=T;var D;!function(t){t.pixel="px",t.px="px",t.percentage="%",t["%"]="%"}(D||(D={}));const x=D,{isNaN:v}=globalThis,{abs:P}=Math,A=document.createElement("template"),M={[m.disabled]:!1,[m.group]:null,[m.attractDistance]:10,[m.unattractable]:!1,[m.unmovable]:!1,get[m.alignTo](){return[f.outer,f.center,f.extend]},get[m.alignToParent](){return[]},get[m.crossPrevent](){return[]},[m.offsetUnit]:x.pixel};A.innerHTML="\n \n \n \n";class w extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.append(A.content.cloneNode(!0))}static get ALIGNMENT(){return{...u}}static get ALIGN_TO(){return{...f}}static get ALIGN_TO_PARENT(){return{...h}}static get CROSS_PREVENT(){return{...p}}static get EVENT(){return{...y}}static getAlignmentsFromAlignTo(t){const e=Array.isArray(t)?t:[t],n=[];return e.includes(f.outer)&&n.push(u.topToBottom,u.rightToLeft,u.bottomToTop,u.leftToRight),e.includes(f.inner)&&n.push(u.topToTop,u.rightToRight,u.bottomToBottom,u.leftToLeft),e.includes(f.center)&&n.push(u.xCenterToXCenter,u.yCenterToYCenter),n}static getMagnetAttractionOffset=n;get disabled(){return null!==this.traceMagnetAttributeValue(m.disabled)}set disabled(t){t?this.setAttribute(m.disabled,""):this.removeAttribute(m.disabled)}get group(){return this.traceMagnetAttributeValue(m.group)}set group(t){null===t||0===t.length?this.removeAttribute(m.group):this.setAttribute(m.group,t)}get parentMagnet(){const t=this.getAttribute(m.group);let e=this.parentElement;for(;e;){if(e instanceof w){const n=e.getAttribute(m.group);if(null===t||null===n||t===n)return e}e=e.parentElement}return null}get unattractable(){return null!==this.traceMagnetAttributeValue(m.unattractable)}set unattractable(t){t?this.setAttribute(m.unattractable,""):this.removeAttribute(m.unattractable)}get unmovable(){return null!==this.traceMagnetAttributeValue(m.unmovable)}set unmovable(t){t?this.setAttribute(m.unmovable,""):this.removeAttribute(m.unmovable)}get attractDistance(){const t=this.traceMagnetAttributeValue(m.attractDistance);return null===t?M[m.attractDistance]:Number(t)}set attractDistance(t){if(null===t)this.removeAttribute(m.attractDistance);else{if(v(t))throw new TypeError(`Invalid attraction distance: ${t}`);if(t<0)throw new RangeError(`Attraction distance should be greater than 0: ${t}`);t!==this.attractDistance&&this.setAttribute(m.attractDistance,`${t}`)}}get alignTos(){const t=this.traceMagnetAttributeValue(m.alignTo);return null===t?M[m.alignTo]:s(t,f)}set alignTos(t){this.setAttribute(m.alignTo,o(Array.isArray(t)?t:s(t,f)))}get alignToParents(){const t=this.traceMagnetAttributeValue(m.alignToParent);return null===t?M[m.alignToParent]:s(t,h)}set alignToParents(t){this.setAttribute(m.alignToParent,o(Array.isArray(t)?t:s(t,h)))}get alignments(){return w.getAlignmentsFromAlignTo(this.alignTos)}get parentAlignments(){return w.getAlignmentsFromAlignTo(this.alignToParents)}get crossPrevents(){const t=this.traceMagnetAttributeValue(m.crossPrevent);return null===t?M[m.crossPrevent]:s(t,p)}set crossPrevents(t){this.setAttribute(m.crossPrevent,o(Array.isArray(t)?t:s(t,p)))}get offsetUnit(){const t=this.traceMagnetAttributeValue(m.offsetUnit);return null===t?M[m.offsetUnit]:t}set offsetUnit(t){if(null===t)this.removeAttribute(m.offsetUnit);else{if(!Object.values(x).includes(t))throw new Error(`Invalid offset unit: ${t}`);t!==this.offsetUnit&&this.setAttribute(m.offsetUnit,t)}}traceMagnetAttributeValue(t){const e=this.getAttribute(t);if(null!==e)return e;const{parentMagnet:n}=this;return n?n.traceMagnetAttributeValue(t):null}}r(w,"magnet-pack");const C=w;function R(t,...e){if(t instanceof Window)return new DOMRect(0,0,t.innerWidth,t.innerHeight);if(t instanceof Document)return document.body.getBoundingClientRect();if(t instanceof Element)return t.getBoundingClientRect();if(E.isPack(t))return DOMRect.fromRect(t.rect);if("object"!=typeof t){const n=t,[a,s,o]=e;return new DOMRect(n,a,s,o)}const{top:n,right:a,bottom:s,left:o,x:r=o,y:i=n,width:c=a-r,height:l=s-i}=t;return new DOMRect(r,i,c,l)}function k(t){return E.isPack(t)?t.rect:t instanceof DOMRect?t:R(t)}const B=R;class J{constructor(t,e=k(t)){const n=J.isPack(t)?t.raw:t;this.raw=n,this.rect=e,Object.freeze(this)}static isPack(t){return t instanceof J}}function O(t){return J.isPack(t)?t:new J(t)}const E=J,L=function(t,e,n){switch(n){default:return 1/0;case u.topToTop:return e.top-t.top;case u.topToBottom:return e.bottom-t.top;case u.rightToRight:return e.right-t.right;case u.rightToLeft:return e.left-t.right;case u.bottomToTop:return e.top-t.bottom;case u.bottomToBottom:return e.bottom-t.bottom;case u.leftToRight:return e.right-t.left;case u.leftToLeft:return e.left-t.left;case u.xCenterToXCenter:return(e.right+e.left-(t.right+t.left))/2;case u.yCenterToYCenter:return(e.top+e.bottom-(t.top+t.bottom))/2}},j=()=>!0,F=()=>!1;function N(t,e){const n=t.right+t.left,a=e.right+e.left;return P(n-a)/2}function X(t,e){const n=t.top+t.bottom,a=e.top+e.bottom;return P(n-a)/2}const Y=function(t,e,n={}){const a=O(t),s=e.map((t=>O(t))),{attractDistance:o=M[m.attractDistance],alignTos:r=M[m.alignTo],alignments:i=C.getAlignmentsFromAlignTo(r),onJudgeDistance:c=j,onJudgeAttraction:l=j,attractionBest:g={}}=n,h={attractDistance:o,alignTos:r,alignments:i,onJudgeDistance:c};return s.reduce(((t,e)=>{const n=it.prototype.attractionTo.call(a,e,h),{best:s,results:r}=n,i=l({source:a,target:e,results:[...r],best:{x:s.x,y:s.y}});if(t.target.push(e),i){const{results:e,best:n}=t;if(e.push(...r),s.x)if(void 0===n.x||s.x.absDistancee)s.x.alignment===u.leftToLeft&&(n.x=s.x);else if(s.x.rawDistance<-e)s.x.alignment===u.rightToRight&&(n.x=s.x);else if(s.x.alignment===u.xCenterToXCenter){const e=s.x.target.rect,a=n.x.target.rect,o=e.top+e.bottom,r=a.top+a.bottom,i=t.top+t.bottom,c=P(o-i);P(r-i)e)s.y.alignment===u.topToTop&&(n.y=s.y);else if(s.y.alignment===u.yCenterToYCenter){const e=s.y.target.rect,a=n.y.target.rect,o=e.right+e.left,r=a.right+a.left,i=t.right+t.left,c=P(o-i);P(r-i){const n=it.prototype.distanceTo.call(a,s,e);if(g({...n},{attractDistance:o,alignTos:r})){const{results:a,best:s}=t;if(a.push(n),c.includes(e)){if(void 0===s.x||n.absDistancet?n.alignment===u.leftToLeft&&(s.x=n):n.rawDistance<-t?n.alignment===u.rightToRight&&(s.x=n):n.alignment===u.xCenterToXCenter&&(s.x=n)}}else if(l.includes(e))if(void 0===s.y||n.absDistancet?n.alignment===u.topToTop&&(s.y=n):n.alignment===u.yCenterToYCenter&&(s.y=n)}}return t}),{source:a,target:s,results:[],best:{}})},I=function(t){return Boolean(t.best.x??t.best.y)},$=function(){return!0};function U(t,e,n,a){e.forEach((e=>{!function(t,e,n,a){t.addEventListener(e,n,a)}(t,e,n,a)}))}function S(t,e,n,a){e.forEach((e=>{t.removeEventListener(e,n,a)}))}function W(t,e,n){return t.dispatchEvent(new CustomEvent(e,n))}const H=function(t,n){let a=0,s=0;return t.leftn.right&&(a=n.right-t.right),t.topn.bottom&&(s=n.bottom-t.bottom),e(a,s)},z=function(t,a,s={}){const o=t.raw,{ignoreEvent:r=!(o instanceof HTMLElement),alignToParents:i=M[m.alignToParent],crossPrevents:c=M[m.crossPrevent],parentPack:l,lastAttractionBest:u,onJudgeMovement:g=j}=s,h=u?.x,f=u?.y,d=it.getAlignmentsFromAlignTo(i).length>0,b=c.includes(p.parent)&&l,T=k(t),{width:D,height:x}=T,v=k(l??T),P=T,A=b?H(P,v):e(0,0),w=B(P.x+A.x,P.y+A.y,D,x),C=new E(o,w),R=g(C),J=[],O=[],L=[],N=t=>{r||O.forEach((e=>{const n=e.target,a=n.raw,s={source:C,target:n,sourceNextRect:t};W(a,y.unattracted,{bubbles:!0,cancelable:!1,composed:!0,detail:s})}))};if(!R)return h&&O.push(h),f&&O.push(f),N(w),{position:null,attractionBest:null};const X={},{unattractable:I=M[m.unattractable],attractDistance:$=M[m.attractDistance],alignTos:U=M[m.alignTo],alignments:S=it.getAlignmentsFromAlignTo(U),onJudgeDistanceInParent:z=j}=s,_=new E(o,P),G=I?F:s.onJudgeDistance??j;if(d&&l){const{best:t}=V(_,l,{attractDistance:$,alignTos:U,alignments:S,onJudgeDistance:G});X.x=t.x,X.y=t.y}const q=b?t=>z(t,{attractDistance:$,alignTos:U,parent:l,onJudgeDistance:G}):G,K=I?F:s.onJudgeAttraction??j,Q=Y(_,a,{attractDistance:$,alignTos:U,alignments:S,onJudgeDistance:q,onJudgeAttraction:K,attractionBest:X}),Z=Q.best,tt=n(Q),et=B(P.x+tt.x,P.y+tt.y,D,x),nt=b?H(et,v):e(0,0),at=B(et.x+nt.x,et.y+nt.y,D,x);if(!r){const{x:t,y:n}=Z,a=h?.target,s=f?.target,r=t?.target,i=n?.target,c=i!==s;if(r!==a)a&&O.push(h),r&&J.push(t);else if(r){const e=h?.alignment;e!==t.alignment?J.push(t):L.push(t)}if(c)s&&O.push(f),i&&J.push(n);else if(i){const t=f?.alignment;t!==n.alignment?J.push(n):L.push(n)}if(J.length>0){const t={source:C,nextRect:at,attraction:Q};if(!W(o,y.attract,{bubbles:!0,cancelable:!0,composed:!0,detail:t}))return h&&O.push(h),f&&O.push(f),{position:e(P.x+A.x,P.y+A.y),attractionBest:null}}if(O.length>0){const t={source:C,nextRect:at,attraction:Q};W(o,y.unattract,{bubbles:!0,cancelable:!1,composed:!0,detail:t})}if(L.length>0){const t={source:C,nextRect:at,attraction:Q};W(o,y.attractmove,{bubbles:!0,cancelable:!1,composed:!0,detail:t})}}var st;return st=at,r||J.forEach((t=>{const e=t.target,n=e.raw,a={source:C,target:e,sourceNextRect:st,distance:t};W(n,y.attracted,{bubbles:!0,cancelable:!1,composed:!0,detail:a})})),N(at),(t=>{r||L.forEach((e=>{const n=e.target,a=n.raw,s={source:C,target:n,sourceNextRect:t,distance:e};W(a,y.attractedmove,{bubbles:!0,cancelable:!1,composed:!0,detail:s})}))})(at),{position:e(P.x+tt.x+nt.x,P.y+tt.y+nt.y),attractionBest:Z}},_=function(e){const{clientX:n,clientY:a}=e;return t(n,a)},G=["pointerdown"],q=["pointermove"],K=["pointerup"];function Q(t){t.resetMagnetRect(),t.resetParentPack(),t.resetTargetMagnetPacks()}function Z(t,n,a){const{magnetRect:s,targetMagnetPacks:o,judgeMagnetMovement:r}=this,{position:i,attractionBest:c}=z(new E(this,B(s.x+a.x-t.x,s.y+a.y-t.y,s.width,s.height)),o,{unattractable:this.unattractable,attractDistance:this.attractDistance,alignTos:this.alignTos,alignToParents:this.alignToParents,crossPrevents:this.crossPrevents,parentPack:this.parentPack,lastAttractionBest:this.lastAttractionBest,onJudgeDistance:this.judgeMagnetDistance,onJudgeDistanceInParent:this.judgeMagnetDistanceInParent,onJudgeAttraction:this.judgeMagnetAttraction,onJudgeMovement:n=>{if(!r(n))return!1;const s={source:n,targets:o,startPoint:e(t),movePoint:e(a)};return W(this,y.magnetmove,{bubbles:!0,cancelable:!0,composed:!0,detail:s})}});return this.setMagnetOffset((i?.x??s.x)-s.x+n.x,(i?.y??s.y)-s.y+n.y),this.lastAttractionBest=c,a}function tt(t){if(this.disabled||this.unmovable)return;const n=_(t);this.isMoving=!1,Q(this);const{magnetRect:a,targetMagnetPacks:s}=this,o={source:new E(this,a),targets:s,startPoint:e(n)};if(!W(this,y.magnetstart,{bubbles:!0,cancelable:!0,composed:!0,detail:o}))return;let r=n;const i=Z.bind(this,n,this.lastOffset),c=t=>{const e=_(t);r=i(e)},l=new MutationObserver((()=>{i(r)})),u=()=>{this.isMoving=!1,this.style.removeProperty("z-index"),S(document,q,c),S(document,K,u),l.disconnect(),Q(this),W(this,y.magnetend,{bubbles:!0,cancelable:!1,composed:!0})};this.isMoving=!0,this.style.setProperty("z-index",`${Date.now()}`),t.preventDefault(),U(document,q,c),U(document,K,u),l.observe(this,{attributes:!0,attributeFilter:Object.values(m)}),i(r)}function et(t){t.disabled||t.unmovable?function(t){S(t,G,tt)}(t):function(t){U(t,G,tt)}(t)}var nt;!function(t){t.offsetX="--offset-x",t.offsetY="--offset-y"}(nt||(nt={}));const at=nt,st="magnet-block",ot=document.createElement("template");ot.innerHTML=`\n \n \n \n`;class rt extends C{rectCache=null;parentPackCache=null;targetMagnetPacksCache=null;isMoving=!1;lastOffset=e(0,0);lastAttractionBest=null;constructor(){super(),this.shadowRoot.append(ot.content.cloneNode(!0)),et(this)}get disabled(){return super.disabled}set disabled(t){super.disabled=t,et(this)}get unmovable(){return super.unmovable}set unmovable(t){super.unmovable=t,et(this)}get magnetRect(){return this.rectCache||(this.rectCache=k(this)),this.rectCache}resetMagnetRect(){this.isMoving||(this.rectCache=null)}get parentPack(){const t=this.parentElement??document.body;return this.parentPackCache||(this.parentPackCache=O(t)),this.parentPackCache}resetParentPack(){this.isMoving||(this.parentPackCache=null)}get targetMagnetPacks(){return this.targetMagnetPacksCache||(this.targetMagnetPacksCache=this.getAttractableMagnets().map((t=>O(t)))),this.targetMagnetPacksCache}resetTargetMagnetPacks(){this.isMoving||(this.targetMagnetPacksCache=null)}getOtherMagnets(){return Array.from(document.querySelectorAll(st)).filter((t=>t!==this))}getAttractableMagnets(){if(this.disabled||this.unattractable)return[];const{group:t}=this,e=null!==t,n=`magnet-block:not([${m.disabled}]):not([${m.unattractable}])`;return Array.from(document.querySelectorAll(n)).filter((n=>!(n===this||this.contains(n)||e&&t!==n.group)))}judgeMagnetDistance(...[t,e={}]){const{attractDistance:n=this.attractDistance,alignTos:a=this.alignTos}=e;return function(t,e={}){const{attractDistance:n=M[m.attractDistance]}=e;if(t.absDistance>n)return!1;const{alignTos:a=M[m.alignTo]}=e;if(a.includes(f.extend))return!0;const{source:{rect:s},target:{rect:o}}=t;switch(t.alignment){default:return!1;case u.topToTop:case u.topToBottom:case u.bottomToTop:case u.bottomToBottom:case u.yCenterToYCenter:return!(s.right+no.right);case u.rightToRight:case u.rightToLeft:case u.leftToRight:case u.leftToLeft:case u.xCenterToXCenter:return!(s.top-n>o.bottom||s.bottom+n=s.top&&c.bottom+r<=s.bottom;case"rightToRight":case"rightToLeft":case"leftToRight":case"leftToLeft":case"xCenterToXCenter":return c.right+r<=s.right&&c.left+r>=s.left}}(t,{attractDistance:n,alignTos:a,parent:e.parent??this.parentPack,onJudgeDistance:s})}judgeMagnetAttraction=I;judgeMagnetMovement=$;rawDistanceTo(t,e){const n=k(this),a=k(t);return L(n,a,e)}distanceTo(t,e){return function(t,e,n){const a=O(t),s=O(e),o=k(t),r=k(e),i=L(o,r,n);return{source:a,target:s,alignment:n,rawDistance:i,absDistance:P(i)}}(this,t,e)}attractionTo(t,e={}){const{attractDistance:n=this.attractDistance,alignTos:a=this.alignTos,alignments:s,onJudgeDistance:o=this.judgeMagnetDistance}=e;return V(this,t,{attractDistance:n,alignTos:a,alignments:s,onJudgeDistance:o})}attractionToParent(t={}){const{attractDistance:e=this.attractDistance,alignTos:n=this.alignToParents,alignments:a,onJudgeDistance:s=this.judgeMagnetDistance}=t;return V(this,this.parentPack,{attractDistance:e,alignTos:n,alignments:a,onJudgeDistance:s})}multiAttractionsTo(t,e={}){const{attractDistance:n=this.attractDistance,alignTos:a=this.alignTos,alignToParents:s=this.alignToParents,alignments:o,onJudgeDistance:r=this.judgeMagnetDistance,attractionBest:i,onJudgeAttraction:c=this.judgeMagnetAttraction}=e,l=rt.prototype.attractionToParent.call(this,{attractDistance:n,alignTos:s,alignments:o,onJudgeDistance:r,attractionBest:i});return Y(this,t,{attractDistance:n,alignTos:a,alignments:o,onJudgeDistance:r,onJudgeAttraction:c,attractionBest:l?.best})}getMagnetAttractionResultOfPosition(t,n,a){const s=e(t,n),o=(t instanceof DOMPoint?n:a)??{},{width:r,height:i}=this.magnetRect,c=B(s.x,s.y,r,i),l=new E(this,c),{ignoreEvent:u,unattractable:g=this.unattractable,attractDistance:h=this.attractDistance,alignTos:f=this.alignTos,alignments:d,alignToParents:m=this.alignToParents,crossPrevents:b=this.crossPrevents,parentPack:p=this.parentPack,lastAttractionBest:T=this.lastAttractionBest,onJudgeDistance:y=this.judgeMagnetDistance,onJudgeDistanceInParent:D=this.judgeMagnetDistanceInParent,onJudgeAttraction:x=this.judgeMagnetAttraction,onJudgeMovement:v=this.judgeMagnetMovement}=o,P=z(l,this.targetMagnetPacks,{ignoreEvent:u,unattractable:g,attractDistance:h,alignTos:f,alignments:d,alignToParents:m,crossPrevents:b,parentPack:p,lastAttractionBest:T,onJudgeDistance:y,onJudgeDistanceInParent:D,onJudgeAttraction:x,onJudgeMovement:v});return this.resetMagnetRect(),this.resetParentPack(),this.resetTargetMagnetPacks(),P}get lastMagnetOffset(){const{offsetUnit:t,lastOffset:n}=this;switch(t){default:case x.pixel:return e(n);case x.percentage:{const{offsetParent:t}=this,a=B(t??document);return e(n.x/a.width,n.y/a.height)}}}resetMagnetOffset(){this.style.removeProperty(at.offsetX),this.style.removeProperty(at.offsetY),this.lastOffset=e(0,0)}setMagnetOffset(t=this.lastOffset,n){const a=e(t,n),{offsetUnit:s}=this;switch(s){default:case x.pixel:this.style.setProperty(at.offsetX,`${a.x}px`),this.style.setProperty(at.offsetY,`${a.y}px`);break;case x.percentage:{const t=this.offsetParent??document.body,n=globalThis.getComputedStyle(t),{boxSizing:s,width:o,height:r}=n;let i=parseFloat(o),c=parseFloat(r);if("border-box"===s){const{paddingTop:t,paddingRight:e,paddingBottom:a,paddingLeft:s,borderTopWidth:o,borderRightWidth:r,borderBottomWidth:l,borderLeftWidth:u}=n,g=parseFloat(t),h=parseFloat(e),f=parseFloat(a),d=parseFloat(s),m=parseFloat(o),b=parseFloat(r),p=parseFloat(l);i-=h+d+b+parseFloat(u),c-=g+f+m+p}const l=e(a.x/i,a.y/c);this.style.setProperty(at.offsetX,100*l.x+"%"),this.style.setProperty(at.offsetY,100*l.y+"%");break}}this.lastOffset=e(a)}setMagnetPosition(t=e(this.magnetRect),n){const a=e(t,n),{lastOffset:s,magnetRect:o}=this,r=e(o.x-s.x,o.y-s.y);this.setMagnetOffset(a.x-r.x,a.y-r.y),this.resetMagnetRect()}get bestAttraction(){const{lastAttractionBest:t}=this,e=t?.x,n=t?.y,a={};if(e){const{source:t,target:n}=e;a.x={...e,source:new E(t.raw,B(t.rect)),target:new E(n.raw,B(n.rect))}}else a.x=void 0;if(n){const{source:t,target:e}=n;a.y={...n,source:new E(t.raw,B(t.rect)),target:new E(e.raw,B(e.rect))}}else a.y=void 0;return a}}r(rt,st);const it=rt})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LElBQUtuQixFQUFXd0MsRUFBTzdCLGFBR2pEZ0MsRUFBZXBKLE9BQUllLEVBR3JCLEdBQUlkLEVBQUcsQ0FDTCxNQUFNLE9BQUU0RSxFQUFGLE9BQVVvRSxHQUFXaEosRUFFM0JtSixFQUFlbkosRUFBSSxJQUNkQSxFQUNINEUsT0FBUSxJQUFJcUMsRUFBS3JDLEVBQU8rQyxJQUFLbkIsRUFBVzVCLEVBQU91QyxPQUMvQzZCLE9BQVEsSUFBSS9CLEVBQUsrQixFQUFPckIsSUFBS25CLEVBQVd3QyxFQUFPN0IsYUFHakRnQyxFQUFlbkosT0FBSWMsRUFHckIsT0FBT3FJLEdBSVg1QyxFQUFnQmlELEdBQVFoSSxJQUV4QixhIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdHlwZXMvUG9pbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdHlwZXMvQXR0cmFjdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9tdWx0aUF0dHJpYnV0ZVZhbHVlcy50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9yZWdpc3RlckVsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdmFsdWVzL2FsaWdubWVudC50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvYWxpZ25Uby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvYXR0cmlidXRlLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3ZhbHVlcy9jcm9zc1ByZXZlbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdmFsdWVzL2V2ZW50LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3ZhbHVlcy9vZmZzZXRVbml0LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL251bWVyaWMudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvY29yZS50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy90eXBlcy9SZWN0LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3R5cGVzL1BhY2sudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9yYXdEaXN0YW5jZVRvLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL3JldHVyblRydWVGYWxzZS50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9kaXN0YW5jZUJldHdlZW5SZWN0cy50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL211bHRpQXR0cmFjdGlvbnNUby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL3NpbmdsZUF0dHJhY3Rpb25Uby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL2p1ZGdlQXR0cmFjdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL2p1ZGdlTW92ZW1lbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdXRpbHMvZXZlbnRIYW5kbGVyLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL2dldE9mZnNldFRvQmVJblJlY3QudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9hdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9nZXRFdmVudFhZLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL2RyYWdMaXN0ZW5lci50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvc3R5bGUudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvYmxvY2sudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9qdWRnZURpc3RhbmNlLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL21ldGhvZHMvanVkZ2VEaXN0YW5jZUluUGFyZW50LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL21ldGhvZHMvZGlzdGFuY2VUby50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFjaywgeyBSZWN0YWJsZSB9IGZyb20gJy4vUGFjayc7XG5pbXBvcnQgeyBnZXRSZWN0IH0gZnJvbSAnLi9SZWN0JztcblxuaW50ZXJmYWNlIENyZWF0ZVBvaW50IHtcbiAgKHg6IG51bWJlciwgeTogbnVtYmVyKTogRE9NUG9pbnQ7XG4gIChwb2ludDogRE9NUG9pbnQpOiBET01Qb2ludDtcbiAgKHJlY3Q6IERPTVJlY3QpOiBET01Qb2ludDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHBvaW50IG9iamVjdCBmcm9tIGEgcG9pbnQgb3IgKHgsIHkpLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUG9pbnQ6IENyZWF0ZVBvaW50ID0gZnVuY3Rpb24gY3JlYXRlUG9pbnQoXG4gIHg6IG51bWJlciB8IERPTVBvaW50IHwgRE9NUmVjdCxcbiAgeT86IG51bWJlcixcbikge1xuICBpZiAoeCBpbnN0YW5jZW9mIERPTVBvaW50KSB7XG4gICAgcmV0dXJuIERPTVBvaW50LmZyb21Qb2ludCh4KTtcbiAgfVxuICBpZiAoeCBpbnN0YW5jZW9mIERPTVJlY3QpIHtcbiAgICByZXR1cm4gbmV3IERPTVBvaW50KHgueCwgeC55KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgRE9NUG9pbnQoeCwgeSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcG9pbnQgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9pbnQoc291cmNlOiBSZWN0YWJsZSB8IFBhY2sgfCBET01Qb2ludCk6IERPTVBvaW50IHtcbiAgcmV0dXJuIChzb3VyY2UgaW5zdGFuY2VvZiBET01Qb2ludFxuICAgID8gc291cmNlXG4gICAgOiBET01Qb2ludC5mcm9tUG9pbnQoZ2V0UmVjdChzb3VyY2UpKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVQb2ludDtcbiIsImltcG9ydCBEaXN0YW5jZSBmcm9tICcuL0Rpc3RhbmNlJztcbmltcG9ydCBQYWNrIGZyb20gJy4vUGFjayc7XG5pbXBvcnQgeyBjcmVhdGVQb2ludCB9IGZyb20gJy4vUG9pbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJhY3Rpb25CZXN0IHtcbiAgeD86IERpc3RhbmNlO1xuICB5PzogRGlzdGFuY2U7XG59XG5cbmludGVyZmFjZSBBdHRyYWN0aW9uPFQ+IHtcbiAgc291cmNlOiBQYWNrO1xuICB0YXJnZXQ6IFQ7XG4gIHJlc3VsdHM6IERpc3RhbmNlW107XG4gIGJlc3Q6IEF0dHJhY3Rpb25CZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG9mZnNldCBvZiBhdHRyYWN0aW9uIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dHJhY3Rpb25PZmZzZXQoYXR0cmFjdGlvbjogQXR0cmFjdGlvbjx1bmtub3duPik6IERPTVBvaW50IHtcbiAgY29uc3QgeyBiZXN0IH0gPSBhdHRyYWN0aW9uO1xuXG4gIHJldHVybiBjcmVhdGVQb2ludChcbiAgICBiZXN0Lng/LnJhd0Rpc3RhbmNlID8/IDAsXG4gICAgYmVzdC55Py5yYXdEaXN0YW5jZSA/PyAwLFxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBdHRyYWN0aW9uO1xuIiwiY29uc3QgU1BMSVRURVIgPSAvW3w7LFxcc10vO1xuXG4vKipcbiAqIFJldHVybnMgc3BsaXR0ZWQgdmFsdWVzIGZyb20gYXR0cmlidXRlIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWU8ViBleHRlbmRzIHN0cmluZz4oXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICBpbmRleE9iamVjdD86IFJlY29yZDxzdHJpbmcsIFY+LFxuKTogVltdIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gdmFsdWUuc3BsaXQoU1BMSVRURVIpO1xuXG4gIGlmIChpbmRleE9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlcyBhcyBWW107XG4gIH1cblxuICBjb25zdCBpbmRleHMgPSBPYmplY3QudmFsdWVzKGluZGV4T2JqZWN0KTtcblxuICByZXR1cm4gaW5kZXhzXG4gICAgLmZpbHRlcigoaW5kZXgpID0+IHZhbHVlcy5pbmNsdWRlcyhpbmRleCkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgY29tYmluZWQgdmFsdWUgZnJvbSBhcnJheSBvZiB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZUZyb21BcnJheTxUPihcbiAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBpbmRleE9iamVjdD86IFQsXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICBpZiAoaW5kZXhPYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZXMuam9pbignfCcpO1xuICB9XG5cbiAgY29uc3QgaW5kZXhzID0gT2JqZWN0LnZhbHVlcyhpbmRleE9iamVjdCk7XG5cbiAgcmV0dXJuIGluZGV4c1xuICAgIC5maWx0ZXIoKGluZGV4KSA9PiB2YWx1ZXMuaW5jbHVkZXMoaW5kZXgpKVxuICAgIC5qb2luKCd8Jyk7XG59XG4iLCIvKipcbiAqIFJlZ2lzdGVycyBLbm9iIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyRWxlbWVudChcbiAgTm9kZTogdHlwZW9mIEhUTUxFbGVtZW50LFxuICBub2RlTmFtZTogc3RyaW5nLFxuKTogUmV0dXJuVHlwZTx0eXBlb2YgY3VzdG9tRWxlbWVudHMud2hlbkRlZmluZWQ+IHtcbiAgaWYgKGN1c3RvbUVsZW1lbnRzLmdldChub2RlTmFtZSkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBuZXcgRXJyb3IoYEFscmVhZHkgZGVmaW5lZCA8JHtub2RlTmFtZX0+YCksXG4gICAgKTtcbiAgfVxuXG4gIGN1c3RvbUVsZW1lbnRzLmRlZmluZShub2RlTmFtZSwgTm9kZSk7XG5cbiAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLndoZW5EZWZpbmVkKG5vZGVOYW1lKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXJFbGVtZW50O1xuIiwiZW51bSBBbGlnbm1lbnQge1xuICB0b3BUb1RvcCA9ICd0b3BUb1RvcCcsXG4gIHRvcFRvQm90dG9tID0gJ3RvcFRvQm90dG9tJyxcbiAgcmlnaHRUb1JpZ2h0ID0gJ3JpZ2h0VG9SaWdodCcsXG4gIHJpZ2h0VG9MZWZ0ID0gJ3JpZ2h0VG9MZWZ0JyxcbiAgYm90dG9tVG9Ub3AgPSAnYm90dG9tVG9Ub3AnLFxuICBib3R0b21Ub0JvdHRvbSA9ICdib3R0b21Ub0JvdHRvbScsXG4gIGxlZnRUb1JpZ2h0ID0gJ2xlZnRUb1JpZ2h0JyxcbiAgbGVmdFRvTGVmdCA9ICdsZWZ0VG9MZWZ0JyxcbiAgeENlbnRlclRvWENlbnRlciA9ICd4Q2VudGVyVG9YQ2VudGVyJyxcbiAgeUNlbnRlclRvWUNlbnRlciA9ICd5Q2VudGVyVG9ZQ2VudGVyJyxcbn1cblxuZXhwb3J0IGNvbnN0IEFsaWdubWVudFhzOiBBbGlnbm1lbnRbXSA9IFtcbiAgQWxpZ25tZW50LnJpZ2h0VG9SaWdodCxcbiAgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0LFxuICBBbGlnbm1lbnQubGVmdFRvUmlnaHQsXG4gIEFsaWdubWVudC5sZWZ0VG9MZWZ0LFxuICBBbGlnbm1lbnQueENlbnRlclRvWENlbnRlcixcbl07XG5cbmV4cG9ydCBjb25zdCBBbGlnbm1lbnRZczogQWxpZ25tZW50W10gPSBbXG4gIEFsaWdubWVudC50b3BUb1RvcCxcbiAgQWxpZ25tZW50LnRvcFRvQm90dG9tLFxuICBBbGlnbm1lbnQuYm90dG9tVG9Ub3AsXG4gIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbSxcbiAgQWxpZ25tZW50LnlDZW50ZXJUb1lDZW50ZXIsXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBBbGlnbm1lbnQ7XG4iLCJlbnVtIEFsaWduVG8ge1xuICBvdXRlciA9ICdvdXRlcicsXG4gIGlubmVyID0gJ2lubmVyJyxcbiAgY2VudGVyID0gJ2NlbnRlcicsXG4gIGV4dGVuZCA9ICdleHRlbmQnLFxufVxuXG5leHBvcnQgZW51bSBBbGlnblRvUGFyZW50IHtcbiAgaW5uZXIgPSAnaW5uZXInLFxuICBjZW50ZXIgPSAnY2VudGVyJyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgQWxpZ25UbztcbiIsImVudW0gQXR0cmlidXRlIHtcbiAgZGlzYWJsZWQgPSAnZGlzYWJsZWQnLFxuICBncm91cCA9ICdncm91cCcsXG4gIHVuYXR0cmFjdGFibGUgPSAndW5hdHRyYWN0YWJsZScsXG4gIHVubW92YWJsZSA9ICd1bm1vdmFibGUnLFxuICBhdHRyYWN0RGlzdGFuY2UgPSAnYXR0cmFjdC1kaXN0YW5jZScsXG4gIGFsaWduVG8gPSAnYWxpZ24tdG8nLFxuICBhbGlnblRvUGFyZW50ID0gJ2FsaWduLXRvLXBhcmVudCcsXG4gIGNyb3NzUHJldmVudCA9ICdjcm9zcy1wcmV2ZW50JyxcbiAgb2Zmc2V0VW5pdCA9ICdvZmZzZXQtdW5pdCcsXG59XG5cbmV4cG9ydCBkZWZhdWx0IEF0dHJpYnV0ZTtcbiIsImVudW0gQ3Jvc3NQcmV2ZW50IHtcbiAgcGFyZW50ID0gJ3BhcmVudCcsXG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb3NzUHJldmVudDtcbiIsImVudW0gRXZlbnQge1xuICBtYWduZXRzdGFydCA9ICdtYWduZXRzdGFydCcsXG4gIG1hZ25ldG1vdmUgPSAnbWFnbmV0bW92ZScsXG4gIG1hZ25ldGVuZCA9ICdtYWduZXRlbmQnLFxuICBhdHRyYWN0ID0gJ2F0dHJhY3QnLFxuICBhdHRyYWN0ZWQgPSAnYXR0cmFjdGVkJyxcbiAgYXR0cmFjdG1vdmUgPSAnYXR0cmFjdG1vdmUnLFxuICBhdHRyYWN0ZWRtb3ZlID0gJ2F0dHJhY3RlZG1vdmUnLFxuICB1bmF0dHJhY3QgPSAndW5hdHRyYWN0JyxcbiAgdW5hdHRyYWN0ZWQgPSAndW5hdHRyYWN0ZWQnLFxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudDtcbiIsImVudW0gT2Zmc2V0VW5pdCB7XG4gIHBpeGVsID0gJ3B4JyxcbiAgcHggPSAncHgnLFxuICBwZXJjZW50YWdlID0gJyUnLFxuICAnJScgPSAnJScsXG59XG5cbmV4cG9ydCBkZWZhdWx0IE9mZnNldFVuaXQ7XG4iLCJjb25zdCB7IGlzTmFOIH0gPSBnbG9iYWxUaGlzO1xuY29uc3QgeyBhYnMgfSA9IE1hdGg7XG5cbmV4cG9ydCB7IGlzTmFOLCBhYnMgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc291cmNlIGlzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNudW0objogdW5rbm93bik6IG4gaXMgbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiBuID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0ZE51bShuOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIG51bWJlcjogJHtufWApO1xuICB9XG5cbiAgcmV0dXJuIChpc251bShuKSA/IG4gOiBOdW1iZXIobikpO1xufVxuIiwiaW1wb3J0IHsgZ2V0QXR0cmFjdGlvbk9mZnNldCB9IGZyb20gJy4vdHlwZXMvQXR0cmFjdGlvbic7XG5pbXBvcnQgeyBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSwgZ2V0QXR0cmlidXRlVmFsdWVGcm9tQXJyYXkgfSBmcm9tICcuL3V0aWxzL211bHRpQXR0cmlidXRlVmFsdWVzJztcbmltcG9ydCByZWdpc3RlckVsZW1lbnQgZnJvbSAnLi91dGlscy9yZWdpc3RlckVsZW1lbnQnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IEFsaWduVG8sIHsgQWxpZ25Ub1BhcmVudCB9IGZyb20gJy4vdmFsdWVzL2FsaWduVG8nO1xuaW1wb3J0IEF0dHJpYnV0ZSBmcm9tICcuL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuaW1wb3J0IENyb3NzUHJldmVudCBmcm9tICcuL3ZhbHVlcy9jcm9zc1ByZXZlbnQnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4vdmFsdWVzL2V2ZW50JztcbmltcG9ydCBPZmZzZXRVbml0IGZyb20gJy4vdmFsdWVzL29mZnNldFVuaXQnO1xuaW1wb3J0IHsgaXNOYU4gfSBmcm9tICcuL3V0aWxzL251bWVyaWMnO1xuXG5jb25zdCBub2RlTmFtZSA9ICdtYWduZXQtcGFjayc7XG5jb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xuICBbQXR0cmlidXRlLmRpc2FibGVkXTogZmFsc2UsXG4gIFtBdHRyaWJ1dGUuZ3JvdXBdOiBudWxsLFxuICBbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV06IDEwLFxuICBbQXR0cmlidXRlLnVuYXR0cmFjdGFibGVdOiBmYWxzZSxcbiAgW0F0dHJpYnV0ZS51bm1vdmFibGVdOiBmYWxzZSxcbiAgZ2V0IFtBdHRyaWJ1dGUuYWxpZ25Ub10oKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFsaWduVG8ub3V0ZXIsXG4gICAgICBBbGlnblRvLmNlbnRlcixcbiAgICAgIEFsaWduVG8uZXh0ZW5kLFxuICAgIF07XG4gIH0sXG4gIGdldCBbQXR0cmlidXRlLmFsaWduVG9QYXJlbnRdKCkge1xuICAgIHJldHVybiBbXTtcbiAgfSxcbiAgZ2V0IFtBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50XSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gQ3Jvc3NQcmV2ZW50cy5wYXJlbnQsXG4gICAgXTtcbiAgfSxcbiAgW0F0dHJpYnV0ZS5vZmZzZXRVbml0XTogT2Zmc2V0VW5pdC5waXhlbCxcbn07XG5cbnRlbXBsYXRlLmlubmVySFRNTCA9IGBcbiAgPHN0eWxlPlxuICAgIDpob3N0IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxzbG90PlxuICA8L3Nsb3Q+XG5gO1xuXG5jbGFzcyBNYWduZXRQYWNrIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgKHRoaXMuc2hhZG93Um9vdCBhcyBTaGFkb3dSb290KS5hcHBlbmQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICB9XG5cbiAgc3RhdGljIGdldCBBTElHTk1FTlQoKSB7XG4gICAgcmV0dXJuIHsgLi4uQWxpZ25tZW50IH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IEFMSUdOX1RPKCkge1xuICAgIHJldHVybiB7IC4uLkFsaWduVG8gfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQUxJR05fVE9fUEFSRU5UKCkge1xuICAgIHJldHVybiB7IC4uLkFsaWduVG9QYXJlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQ1JPU1NfUFJFVkVOVCgpIHtcbiAgICByZXR1cm4geyAuLi5Dcm9zc1ByZXZlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRVZFTlQoKSB7XG4gICAgcmV0dXJuIHsgLi4uRXZlbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsaWdubWVudCB2YWx1ZXMgY29udmVydGVkIGZyb20gc2lkZXMgb2YgYWxpZ25pbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKHNvdXJjZTogc3RyaW5nW10pOiBBbGlnbm1lbnRbXSB7XG4gICAgY29uc3QgYWxpZ25Ub3MgPSBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiBbc291cmNlXTtcbiAgICBjb25zdCBhbGlnbm1lbnRzOiBBbGlnbm1lbnRbXSA9IFtdO1xuXG4gICAgaWYgKGFsaWduVG9zLmluY2x1ZGVzKEFsaWduVG8ub3V0ZXIpKSB7XG4gICAgICBhbGlnbm1lbnRzLnB1c2goXG4gICAgICAgIEFsaWdubWVudC50b3BUb0JvdHRvbSxcbiAgICAgICAgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0LFxuICAgICAgICBBbGlnbm1lbnQuYm90dG9tVG9Ub3AsXG4gICAgICAgIEFsaWdubWVudC5sZWZ0VG9SaWdodCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhbGlnblRvcy5pbmNsdWRlcyhBbGlnblRvLmlubmVyKSkge1xuICAgICAgYWxpZ25tZW50cy5wdXNoKFxuICAgICAgICBBbGlnbm1lbnQudG9wVG9Ub3AsXG4gICAgICAgIEFsaWdubWVudC5yaWdodFRvUmlnaHQsXG4gICAgICAgIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbSxcbiAgICAgICAgQWxpZ25tZW50LmxlZnRUb0xlZnQsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYWxpZ25Ub3MuaW5jbHVkZXMoQWxpZ25Uby5jZW50ZXIpKSB7XG4gICAgICBhbGlnbm1lbnRzLnB1c2goXG4gICAgICAgIEFsaWdubWVudC54Q2VudGVyVG9YQ2VudGVyLFxuICAgICAgICBBbGlnbm1lbnQueUNlbnRlclRvWUNlbnRlcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsaWdubWVudHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIGF0dHJhY3Rpb24gcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGdldE1hZ25ldEF0dHJhY3Rpb25PZmZzZXQgPSBnZXRBdHRyYWN0aW9uT2Zmc2V0XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBtYWduZXQgaXMgZGlzYWJsZWQuXG4gICAqL1xuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuZGlzYWJsZWQpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZGlzYWJsZWQgb2YgbWFnbmV0LlxuICAgKi9cbiAgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZGlzYWJsZWQsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLmRpc2FibGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBtYWduZXQgZ3JvdXAuXG4gICAqL1xuICBnZXQgZ3JvdXAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuZ3JvdXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWFnbmV0IGdyb3VwLlxuICAgKi9cbiAgc2V0IGdyb3VwKGdyb3VwOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgaWYgKGdyb3VwID09PSBudWxsIHx8IGdyb3VwLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLmdyb3VwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLmdyb3VwLCBncm91cCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5lYXJlc3QgcGFyZW50IG1hZ25ldCBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IHBhcmVudE1hZ25ldCgpOiBNYWduZXRQYWNrIHwgbnVsbCB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZ3JvdXApO1xuXG4gICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudDtcblxuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNYWduZXRQYWNrKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEdyb3VwID0gcGFyZW50LmdldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZ3JvdXApO1xuXG4gICAgICAgIGlmIChncm91cCA9PT0gbnVsbFxuICAgICAgICAgIHx8IHBhcmVudEdyb3VwID09PSBudWxsXG4gICAgICAgICAgfHwgZ3JvdXAgPT09IHBhcmVudEdyb3VwXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtYWduZXQgaGFzIG5vIGF0dHJhY3Rpb24uXG4gICAqL1xuICBnZXQgdW5hdHRyYWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS51bmF0dHJhY3RhYmxlKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVuYXR0cmFjdGFibGUgb2YgbWFnbmV0LlxuICAgKi9cbiAgc2V0IHVuYXR0cmFjdGFibGUodW5hdHRyYWN0YWJsZTogYm9vbGVhbikge1xuICAgIGlmICh1bmF0dHJhY3RhYmxlKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZSwgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFnbmV0IGlzIHVuYWJsZSB0byBiZSBkcmFnZ2VkLlxuICAgKi9cbiAgZ2V0IHVubW92YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS51bm1vdmFibGUpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdW5tb3ZhYmxlIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCB1bm1vdmFibGUodW5tb3ZhYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKHVubW92YWJsZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLnVubW92YWJsZSwgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUudW5tb3ZhYmxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzdGFuY2Ugb2YgYXR0cmFjdGlvbi5cbiAgICovXG4gIGdldCBhdHRyYWN0RGlzdGFuY2UoKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlKTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlXVxuICAgICAgOiBOdW1iZXIodmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXN0YW5jZSBvZiBhdHRyYWN0aW9uLlxuICAgKi9cbiAgc2V0IGF0dHJhY3REaXN0YW5jZShhdHRyYWN0RGlzdGFuY2U6IG51bWJlciB8IG51bGwpIHtcbiAgICBpZiAoYXR0cmFjdERpc3RhbmNlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGlzTmFOKGF0dHJhY3REaXN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0cmFjdGlvbiBkaXN0YW5jZTogJHthdHRyYWN0RGlzdGFuY2V9YCk7XG4gICAgfSBlbHNlIGlmIChhdHRyYWN0RGlzdGFuY2UgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQXR0cmFjdGlvbiBkaXN0YW5jZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDA6ICR7YXR0cmFjdERpc3RhbmNlfWApO1xuICAgIH0gZWxzZSBpZiAoYXR0cmFjdERpc3RhbmNlICE9PSB0aGlzLmF0dHJhY3REaXN0YW5jZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZSwgYCR7YXR0cmFjdERpc3RhbmNlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1hZ25ldCBhdHRyYWN0aW9uIHNpZGVzLlxuICAgKi9cbiAgZ2V0IGFsaWduVG9zKCk6IEFsaWduVG9bXSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRyYWNlTWFnbmV0QXR0cmlidXRlVmFsdWUoQXR0cmlidXRlLmFsaWduVG8pO1xuXG4gICAgcmV0dXJuICh2YWx1ZSA9PT0gbnVsbFxuICAgICAgPyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hbGlnblRvXVxuICAgICAgOiBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSh2YWx1ZSwgQWxpZ25UbylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWFnbmV0IGF0dHJhY3Rpb24gc2lkZXMuXG4gICAqL1xuICBzZXQgYWxpZ25Ub3MoYWxpZ25Ub3M6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXG4gICAgICBBdHRyaWJ1dGUuYWxpZ25UbyxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGFsaWduVG9zKVxuICAgICAgICA/IGFsaWduVG9zXG4gICAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUoYWxpZ25Ub3MsIEFsaWduVG8pXG4gICAgICApKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF0dHJhY3Rpb24gc2lkZXMgZm9yIGl0cyBwYXJlbnQgZWxlbWVudC5cbiAgICovXG4gIGdldCBhbGlnblRvUGFyZW50cygpOiBBbGlnblRvUGFyZW50W10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS5hbGlnblRvUGFyZW50KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudF1cbiAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUodmFsdWUsIEFsaWduVG9QYXJlbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhdHRyYWN0aW9uIHNpZGVzIGZvciBpdHMgcGFyZW50IGVsZW1lbnQuXG4gICAqL1xuICBzZXQgYWxpZ25Ub1BhcmVudHMoYWxpZ25Ub1BhcmVudHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXG4gICAgICBBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudCxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGFsaWduVG9QYXJlbnRzKVxuICAgICAgICA/IGFsaWduVG9QYXJlbnRzXG4gICAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUoYWxpZ25Ub1BhcmVudHMsIEFsaWduVG9QYXJlbnQpXG4gICAgICApKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWFnbmV0IGFsaWdubWVudHMgZm9yIGF0dHJhY3Rpb24uXG4gICAqL1xuICBnZXQgYWxpZ25tZW50cygpOiBBbGlnbm1lbnRbXSB7XG4gICAgcmV0dXJuIE1hZ25ldFBhY2suZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKHRoaXMuYWxpZ25Ub3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWFnbmV0IGFsaWdubWVudHMgZm9yIHBhcmVudCBhdHRyYWN0aW9uLlxuICAgKi9cbiAgZ2V0IHBhcmVudEFsaWdubWVudHMoKTogQWxpZ25tZW50W10ge1xuICAgIHJldHVybiBNYWduZXRQYWNrLmdldEFsaWdubWVudHNGcm9tQWxpZ25Ubyh0aGlzLmFsaWduVG9QYXJlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRhcmdldHMgdGhhdCB0aGUgbWFnbmV0IHdvdWxkIHByZXZlbnQgZnJvbSBjcm9zc2luZy5cbiAgICovXG4gIGdldCBjcm9zc1ByZXZlbnRzKCk6IENyb3NzUHJldmVudFtdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50XVxuICAgICAgOiBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSh2YWx1ZSwgQ3Jvc3NQcmV2ZW50KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0YXJnZXRzIHRoYXQgdGhlIG1hZ25ldCB3b3VsZCBwcmV2ZW50IGZyb20gY3Jvc3NpbmcuXG4gICAqL1xuICBzZXQgY3Jvc3NQcmV2ZW50cyhjcm9zc1ByZXZlbnRzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFxuICAgICAgQXR0cmlidXRlLmNyb3NzUHJldmVudCxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGNyb3NzUHJldmVudHMpXG4gICAgICAgID8gY3Jvc3NQcmV2ZW50c1xuICAgICAgICA6IGdldEFycmF5RnJvbUF0dHJpYnV0ZVZhbHVlKGNyb3NzUHJldmVudHMsIENyb3NzUHJldmVudClcbiAgICAgICkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB1bml0IG9mIG9mZnNldC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgb2Zmc2V0VW5pdCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS5vZmZzZXRVbml0KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUub2Zmc2V0VW5pdF1cbiAgICAgIDogdmFsdWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHVuaXQgb2Ygb2Zmc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBvZmZzZXRVbml0KG9mZnNldFVuaXQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICBpZiAob2Zmc2V0VW5pdCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLm9mZnNldFVuaXQpO1xuICAgIH0gZWxzZSBpZiAoIU9iamVjdC52YWx1ZXMoT2Zmc2V0VW5pdCkuaW5jbHVkZXMob2Zmc2V0VW5pdCBhcyBPZmZzZXRVbml0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCB1bml0OiAke29mZnNldFVuaXR9YCk7XG4gICAgfSBlbHNlIGlmIChvZmZzZXRVbml0ICE9PSB0aGlzLm9mZnNldFVuaXQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKEF0dHJpYnV0ZS5vZmZzZXRVbml0LCBvZmZzZXRVbml0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygc3BlY2lmaWMgYXR0cmlidXRlIG5hbWUuXG4gICAqL1xuICB0cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGFyZW50TWFnbmV0IH0gPSB0aGlzO1xuXG4gICAgcmV0dXJuIChwYXJlbnRNYWduZXRcbiAgICAgID8gcGFyZW50TWFnbmV0LnRyYWNlTWFnbmV0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUpXG4gICAgICA6IG51bGxcbiAgICApO1xuICB9XG59XG5cbnJlZ2lzdGVyRWxlbWVudChNYWduZXRQYWNrLCBub2RlTmFtZSk7XG5cbmV4cG9ydCBkZWZhdWx0IE1hZ25ldFBhY2s7XG4iLCJpbXBvcnQgUGFjaywgeyBSZWN0YWJsZSB9IGZyb20gJy4vUGFjayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdGxpa2UgZXh0ZW5kcyBQYXJ0aWFsPERPTVJlY3Q+IHtcbiAgdG9wPzogbnVtYmVyO1xuICByaWdodD86IG51bWJlcjtcbiAgYm90dG9tPzogbnVtYmVyO1xuICBsZWZ0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjb21wbGV0ZWQgcmVjdCBvYmplY3QgZnJvbSByZWN0YWJsZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWN0KFxuICBzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayB8IG51bWJlcixcbiAgLi4uYXJnczogW251bWJlcj8sIG51bWJlcj8sIG51bWJlcj9dXG4pOiBET01SZWN0IHtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFdpbmRvdykge1xuICAgIHJldHVybiBuZXcgRE9NUmVjdCgwLCAwLCBzb3VyY2UuaW5uZXJXaWR0aCwgc291cmNlLmlubmVySGVpZ2h0KTtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICByZXR1cm4gc291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9XG5cbiAgaWYgKFBhY2suaXNQYWNrKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdChzb3VyY2UucmVjdCk7XG4gIH1cblxuICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCB4ID0gc291cmNlO1xuICAgIGNvbnN0IFt5LCB3aWR0aCwgaGVpZ2h0XSA9IGFyZ3M7XG5cbiAgICByZXR1cm4gbmV3IERPTVJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LFxuICAgIHggPSBsZWZ0IGFzIG51bWJlcixcbiAgICB5ID0gdG9wIGFzIG51bWJlcixcbiAgICB3aWR0aCA9IChyaWdodCBhcyBudW1iZXIpIC0geCxcbiAgICBoZWlnaHQgPSAoYm90dG9tIGFzIG51bWJlcikgLSB5LFxuICB9ID0gc291cmNlO1xuXG4gIHJldHVybiBuZXcgRE9NUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHJlY3Qgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdChzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayk6IERPTVJlY3Qge1xuICBpZiAoUGFjay5pc1BhY2soc291cmNlKSkge1xuICAgIHJldHVybiBzb3VyY2UucmVjdDtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBET01SZWN0KSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSZWN0KHNvdXJjZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJlY3Q7XG4iLCJpbXBvcnQgeyBnZXRSZWN0LCBSZWN0bGlrZSB9IGZyb20gJy4vUmVjdCc7XG5cbmV4cG9ydCB0eXBlIFJlY3RhYmxlID0gUmVjdGxpa2UgfCBET01SZWN0IHwgRWxlbWVudCB8IERvY3VtZW50IHwgV2luZG93O1xuXG5jbGFzcyBQYWNrIHtcbiAgcmVhZG9ubHkgcmF3OiBSZWN0YWJsZTtcblxuICByZWFkb25seSByZWN0OiBET01SZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogUmVjdGFibGUgfCBQYWNrLCByZWN0OiBET01SZWN0ID0gZ2V0UmVjdChzb3VyY2UpKSB7XG4gICAgY29uc3QgcmF3ID0gUGFjay5pc1BhY2soc291cmNlKSA/IHNvdXJjZS5yYXcgOiBzb3VyY2U7XG5cbiAgICB0aGlzLnJhdyA9IHJhdztcbiAgICB0aGlzLnJlY3QgPSByZWN0O1xuXG4gICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgc291cmNlIGlzIHBhY2sgb2JlamN0LlxuICAgKi9cbiAgc3RhdGljIGlzUGFjayhzb3VyY2U6IHVua25vd24pOiBzb3VyY2UgaXMgUGFjayB7XG4gICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIFBhY2s7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHBhY2sgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFjayhzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayk6IFBhY2sge1xuICByZXR1cm4gUGFjay5pc1BhY2soc291cmNlKSA/IHNvdXJjZSA6IG5ldyBQYWNrKHNvdXJjZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhY2s7XG4iLCJpbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuXG4vKipcbiAqIFJldHVybnMgZGlzdGFuY2UgYmV0d2VlbiBzb3VyY2UgdG8gdGFyZ2V0IG9uIHNwZWNpZmljIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gcmF3RGlzdGFuY2VUbyhcbiAgc291cmNlUmVjdDogRE9NUmVjdCxcbiAgdGFyZ2V0UmVjdDogRE9NUmVjdCxcbiAgYWxpZ25tZW50OiBBbGlnbm1lbnQsXG4pOiBudW1iZXIge1xuICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSW5maW5pdHk7XG5cbiAgICBjYXNlIEFsaWdubWVudC50b3BUb1RvcDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QudG9wO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQudG9wVG9Cb3R0b206XG4gICAgICByZXR1cm4gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LnRvcDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9SaWdodDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnJpZ2h0IC0gc291cmNlUmVjdC5yaWdodDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QubGVmdCAtIHNvdXJjZVJlY3QucmlnaHQ7XG5cbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub1RvcDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QuYm90dG9tO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b206XG4gICAgICByZXR1cm4gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LmJvdHRvbTtcblxuICAgIGNhc2UgQWxpZ25tZW50LmxlZnRUb1JpZ2h0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QucmlnaHQgLSBzb3VyY2VSZWN0LmxlZnQ7XG5cbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9MZWZ0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QubGVmdCAtIHNvdXJjZVJlY3QubGVmdDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGFyZ2V0UmVjdC5yaWdodCArIHRhcmdldFJlY3QubGVmdCkgLSAoc291cmNlUmVjdC5yaWdodCArIHNvdXJjZVJlY3QubGVmdClcbiAgICAgICkgLyAyO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQueUNlbnRlclRvWUNlbnRlcjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0YXJnZXRSZWN0LnRvcCArIHRhcmdldFJlY3QuYm90dG9tKSAtIChzb3VyY2VSZWN0LnRvcCArIHNvdXJjZVJlY3QuYm90dG9tKVxuICAgICAgKSAvIDI7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmF3RGlzdGFuY2VUbztcbiIsImV4cG9ydCBjb25zdCByZXR1cm5UcnVlID0gKCkgPT4gdHJ1ZTtcblxuZXhwb3J0IGNvbnN0IHJldHVybkZhbHNlID0gKCkgPT4gZmFsc2U7XG4iLCJpbXBvcnQgY3JlYXRlUG9pbnQgZnJvbSAnLi4vdHlwZXMvUG9pbnQnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi9udW1lcmljJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB4LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5YQ2VudGVyc09mUmVjdHMoXG4gIHNvdXJjZVJlY3Q6IERPTVJlY3QsXG4gIHRhcmdldFJlY3Q6IERPTVJlY3QsXG4pOiBudW1iZXIge1xuICBjb25zdCBzb3VyY2VSZWN0WENlbnRlciA9IHNvdXJjZVJlY3QucmlnaHQgKyBzb3VyY2VSZWN0LmxlZnQ7XG4gIGNvbnN0IHRhcmdldFJlY3RYQ2VudGVyID0gdGFyZ2V0UmVjdC5yaWdodCArIHRhcmdldFJlY3QubGVmdDtcblxuICByZXR1cm4gYWJzKHNvdXJjZVJlY3RYQ2VudGVyIC0gdGFyZ2V0UmVjdFhDZW50ZXIpIC8gMjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB5LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMoXG4gIHNvdXJjZVJlY3Q6IERPTVJlY3QsXG4gIHRhcmdldFJlY3Q6IERPTVJlY3QsXG4pOiBudW1iZXIge1xuICBjb25zdCBzb3VyY2VSZWN0WUNlbnRlciA9IHNvdXJjZVJlY3QudG9wICsgc291cmNlUmVjdC5ib3R0b207XG4gIGNvbnN0IHRhcmdldFJlY3RZQ2VudGVyID0gdGFyZ2V0UmVjdC50b3AgKyB0YXJnZXRSZWN0LmJvdHRvbTtcblxuICByZXR1cm4gYWJzKHNvdXJjZVJlY3RZQ2VudGVyIC0gdGFyZ2V0UmVjdFlDZW50ZXIpIC8gMjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB4LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlbkNlbnRlcnNPZlJlY3RzKFxuICBzb3VyY2VSZWN0OiBET01SZWN0LFxuICB0YXJnZXRSZWN0OiBET01SZWN0LFxuKTogRE9NUG9pbnQge1xuICByZXR1cm4gY3JlYXRlUG9pbnQoXG4gICAgZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QpLFxuICAgIGRpc3RhbmNlQmV0d2VlbllDZW50ZXJzT2ZSZWN0cyhzb3VyY2VSZWN0LCB0YXJnZXRSZWN0KSxcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzdGFuY2VCZXR3ZWVuQ2VudGVyc09mUmVjdHM7XG4iLCJpbXBvcnQgTWFnbmV0IGZyb20gJy4uL2Jsb2NrJztcbmltcG9ydCBNYWduZXRQYWNrLCB7IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCBBdHRyYWN0aW9uLCB7IEF0dHJhY3Rpb25CZXN0IH0gZnJvbSAnLi4vdHlwZXMvQXR0cmFjdGlvbic7XG5pbXBvcnQgUGFjaywgeyBnZXRQYWNrLCBSZWN0YWJsZSB9IGZyb20gJy4uL3R5cGVzL1BhY2snO1xuaW1wb3J0IHsgZ2V0UmVjdCB9IGZyb20gJy4uL3R5cGVzL1JlY3QnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi4vdXRpbHMvbnVtZXJpYyc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IHsgU2luZ2xlQXR0cmFjdGlvblRvT3B0aW9ucyB9IGZyb20gJy4vc2luZ2xlQXR0cmFjdGlvblRvJztcbmltcG9ydCB7IE9uSnVkZ2VBdHRyYWN0aW9uIH0gZnJvbSAnLi9qdWRnZUF0dHJhY3Rpb24nO1xuaW1wb3J0IHsgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuaW1wb3J0IHsgZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzLCBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMgfSBmcm9tICcuLi91dGlscy9kaXN0YW5jZUJldHdlZW5SZWN0cyc7XG5cbmV4cG9ydCB0eXBlIE11bHRpQXR0cmFjdGlvbiA9IEF0dHJhY3Rpb248UGFja1tdPjtcblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aUF0dHJhY3Rpb25zVG9PcHRpb25zIGV4dGVuZHMgU2luZ2xlQXR0cmFjdGlvblRvT3B0aW9ucyB7XG4gIGF0dHJhY3Rpb25CZXN0PzogQXR0cmFjdGlvbkJlc3Q7XG4gIG9uSnVkZ2VBdHRyYWN0aW9uPzogT25KdWRnZUF0dHJhY3Rpb247XG59XG5cbi8qKlxuICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0cyBvbiBhbGlnbm1lbnRzLlxuICovXG5mdW5jdGlvbiBtdWx0aUF0dHJhY3Rpb25zVG8oXG4gIHNvdXJjZTogUmVjdGFibGUgfCBQYWNrLFxuICB0YXJnZXRzOiAoUmVjdGFibGUgfCBQYWNrKVtdLFxuICBvcHRpb25zOiBNdWx0aUF0dHJhY3Rpb25zVG9PcHRpb25zID0ge30sXG4pOiBNdWx0aUF0dHJhY3Rpb24ge1xuICBjb25zdCBzb3VyY2VQYWNrID0gZ2V0UGFjayhzb3VyY2UpO1xuICBjb25zdCB0YXJnZXRQYWNrcyA9IHRhcmdldHMubWFwKCh0YXJnZXQpID0+IGdldFBhY2sodGFyZ2V0KSk7XG4gIGNvbnN0IHtcbiAgICBhdHRyYWN0RGlzdGFuY2UgPSBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hdHRyYWN0RGlzdGFuY2VdLFxuICAgIGFsaWduVG9zID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub10sXG4gICAgYWxpZ25tZW50cyA9IE1hZ25ldFBhY2suZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKGFsaWduVG9zKSxcbiAgICBvbkp1ZGdlRGlzdGFuY2UgPSByZXR1cm5UcnVlLFxuICAgIG9uSnVkZ2VBdHRyYWN0aW9uID0gcmV0dXJuVHJ1ZSxcbiAgICBhdHRyYWN0aW9uQmVzdCA9IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc2luZ2xlQXR0cmFjdGlvbk9wdGlvbnM6IFNpbmdsZUF0dHJhY3Rpb25Ub09wdGlvbnMgPSB7XG4gICAgYXR0cmFjdERpc3RhbmNlLFxuICAgIGFsaWduVG9zLFxuICAgIGFsaWdubWVudHMsXG4gICAgb25KdWRnZURpc3RhbmNlLFxuICB9O1xuICBjb25zdCBtdWx0aUF0dHJhY3Rpb24gPSB0YXJnZXRQYWNrcy5yZWR1Y2U8TXVsdGlBdHRyYWN0aW9uPihcbiAgICAoYXR0cmFjdGlvbiwgdGFyZ2V0UGFjaykgPT4ge1xuICAgICAgY29uc3Qgc2luZ2xlQXR0cmFjdGlvbiA9IE1hZ25ldC5wcm90b3R5cGUuYXR0cmFjdGlvblRvLmNhbGwoXG4gICAgICAgIHNvdXJjZVBhY2ssXG4gICAgICAgIHRhcmdldFBhY2ssXG4gICAgICAgIHNpbmdsZUF0dHJhY3Rpb25PcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYmVzdDogY3VycmVudEJlc3QsXG4gICAgICAgIHJlc3VsdHM6IGN1cnJlbnRSZXN1bHRzLFxuICAgICAgfSA9IHNpbmdsZUF0dHJhY3Rpb247XG4gICAgICBjb25zdCBwYXNzSnVkZ2VtZW50ID0gb25KdWRnZUF0dHJhY3Rpb24oe1xuICAgICAgICBzb3VyY2U6IHNvdXJjZVBhY2ssXG4gICAgICAgIHRhcmdldDogdGFyZ2V0UGFjayxcbiAgICAgICAgcmVzdWx0czogWy4uLmN1cnJlbnRSZXN1bHRzXSxcbiAgICAgICAgYmVzdDoge1xuICAgICAgICAgIHg6IGN1cnJlbnRCZXN0LngsXG4gICAgICAgICAgeTogY3VycmVudEJlc3QueSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhdHRyYWN0aW9uLnRhcmdldC5wdXNoKHRhcmdldFBhY2spO1xuXG4gICAgICBpZiAocGFzc0p1ZGdlbWVudCkge1xuICAgICAgICBjb25zdCB7IHJlc3VsdHMsIGJlc3QgfSA9IGF0dHJhY3Rpb247XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKC4uLmN1cnJlbnRSZXN1bHRzKTtcblxuICAgICAgICBpZiAoY3VycmVudEJlc3QueCkge1xuICAgICAgICAgIGlmIChiZXN0LnggPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50QmVzdC54LmFic0Rpc3RhbmNlIDwgYmVzdC54LmFic0Rpc3RhbmNlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBiZXN0LnggPSBjdXJyZW50QmVzdC54O1xuICAgICAgICAgIH0gZWxzZSBpZiAoYmVzdC54LmFic0Rpc3RhbmNlID09PSBjdXJyZW50QmVzdC54LmFic0Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdChzb3VyY2VQYWNrKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSBjdXJyZW50QmVzdC54LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgY29uc3QgbGFzdEJlc3RSZWN0ID0gYmVzdC54LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERpZmZZID0gZGlzdGFuY2VCZXR3ZWVuWUNlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QpO1xuICAgICAgICAgICAgY29uc3QgZGlmZlkgPSBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMoc291cmNlUmVjdCwgbGFzdEJlc3RSZWN0KTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnREaWZmWSA8IGRpZmZZKSB7XG4gICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnREaWZmWSA9PT0gZGlmZlkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZ2FwID0gYXR0cmFjdERpc3RhbmNlIC8gMztcblxuICAgICAgICAgICAgICBpZiAoY3VycmVudEJlc3QueC5yYXdEaXN0YW5jZSA+IGdhcCkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmVzdC54LmFsaWdubWVudCA9PT0gQWxpZ25tZW50LmxlZnRUb0xlZnQpIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCZXN0LngucmF3RGlzdGFuY2UgPCAtZ2FwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnguYWxpZ25tZW50ID09PSBBbGlnbm1lbnQucmlnaHRUb1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICBiZXN0LnggPSBjdXJyZW50QmVzdC54O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50QmVzdC54LmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UmVjdCA9IGN1cnJlbnRCZXN0LngudGFyZ2V0LnJlY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFJlY3QgPSBiZXN0LngudGFyZ2V0LnJlY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFlCYXNlID0gbGFzdFJlY3QudG9wICsgbGFzdFJlY3QuYm90dG9tO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRZQmFzZSA9IGN1cnJlbnRSZWN0LnRvcCArIGN1cnJlbnRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VZQmFzZSA9IHNvdXJjZVJlY3QudG9wICsgc291cmNlUmVjdC5ib3R0b207XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFlEaXN0YW5jZSA9IGFicyhsYXN0WUJhc2UgLSBzb3VyY2VZQmFzZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFlEaXN0YW5jZSA9IGFicyhjdXJyZW50WUJhc2UgLSBzb3VyY2VZQmFzZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFlEaXN0YW5jZSA8IGxhc3RZRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkpIHtcbiAgICAgICAgICBpZiAoYmVzdC55ID09PSB1bmRlZmluZWQgfHwgY3VycmVudEJlc3QueS5hYnNEaXN0YW5jZSA8IGJlc3QueS5hYnNEaXN0YW5jZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYmVzdC55ID0gY3VycmVudEJlc3QueTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGJlc3QueS5hYnNEaXN0YW5jZSA9PT0gY3VycmVudEJlc3QueS5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlUmVjdCA9IGdldFJlY3Qoc291cmNlUGFjayk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRSZWN0ID0gY3VycmVudEJlc3QueS50YXJnZXQucmVjdDtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RCZXN0UmVjdCA9IGJlc3QueS50YXJnZXQucmVjdDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREaWZmWCA9IGRpc3RhbmNlQmV0d2VlblhDZW50ZXJzT2ZSZWN0cyhzb3VyY2VSZWN0LCB0YXJnZXRSZWN0KTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZYID0gZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIGxhc3RCZXN0UmVjdCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50RGlmZlggPCBkaWZmWCkge1xuICAgICAgICAgICAgICBiZXN0LnkgPSBjdXJyZW50QmVzdC55O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RGlmZlggPT09IGRpZmZYKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGdhcCA9IGF0dHJhY3REaXN0YW5jZSAvIDM7XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkucmF3RGlzdGFuY2UgPCAtZ2FwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b20pIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueSA9IGN1cnJlbnRCZXN0Lnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCZXN0LnkucmF3RGlzdGFuY2UgPiBnYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJlc3QueS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC50b3BUb1RvcCkge1xuICAgICAgICAgICAgICAgICAgYmVzdC55ID0gY3VycmVudEJlc3QueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEJlc3QueS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFJlY3QgPSBjdXJyZW50QmVzdC55LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gYmVzdC55LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RYQmFzZSA9IGxhc3RSZWN0LnJpZ2h0ICsgbGFzdFJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50WEJhc2UgPSBjdXJyZW50UmVjdC5yaWdodCArIGN1cnJlbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlWEJhc2UgPSBzb3VyY2VSZWN0LnJpZ2h0ICsgc291cmNlUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RYRGlzdGFuY2UgPSBhYnMobGFzdFhCYXNlIC0gc291cmNlWEJhc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRYRGlzdGFuY2UgPSBhYnMoY3VycmVudFhCYXNlIC0gc291cmNlWEJhc2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRYRGlzdGFuY2UgPCBsYXN0WERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICBiZXN0LnkgPSBjdXJyZW50QmVzdC55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmFjdGlvbjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICAgIHRhcmdldDogW10sXG4gICAgICByZXN1bHRzOiBbXSxcbiAgICAgIGJlc3Q6IHsgLi4uYXR0cmFjdGlvbkJlc3QgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBtdWx0aUF0dHJhY3Rpb247XG59XG5cbmV4cG9ydCBkZWZhdWx0IG11bHRpQXR0cmFjdGlvbnNUbztcbiIsImltcG9ydCBBdHRyYWN0aW9uIGZyb20gJy4uL3R5cGVzL0F0dHJhY3Rpb24nO1xuaW1wb3J0IFBhY2ssIHsgZ2V0UGFjaywgUmVjdGFibGUgfSBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCBBbGlnbm1lbnQsIHsgQWxpZ25tZW50WHMsIEFsaWdubWVudFlzIH0gZnJvbSAnLi4vdmFsdWVzL2FsaWdubWVudCc7XG5pbXBvcnQgQWxpZ25UbywgeyBBbGlnblRvUGFyZW50IH0gZnJvbSAnLi4vdmFsdWVzL2FsaWduVG8nO1xuaW1wb3J0IHsgT25KdWRnZURpc3RhbmNlIH0gZnJvbSAnLi9qdWRnZURpc3RhbmNlJztcbmltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IHsgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgeyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuXG5leHBvcnQgdHlwZSBTaW5nbGVBdHRyYWN0aW9uID0gQXR0cmFjdGlvbjxQYWNrPjtcblxuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zIHtcbiAgYXR0cmFjdERpc3RhbmNlPzogbnVtYmVyO1xuICBhbGlnblRvcz86IChBbGlnblRvIHwgQWxpZ25Ub1BhcmVudClbXTtcbiAgYWxpZ25tZW50cz86IEFsaWdubWVudFtdO1xuICBvbkp1ZGdlRGlzdGFuY2U/OiBPbkp1ZGdlRGlzdGFuY2U7XG59XG5cbi8qKlxuICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IG9uIGFsaWdubWVudHMuXG4gKi9cbmZ1bmN0aW9uIHNpbmdsZUF0dHJhY3Rpb25UbyhcbiAgc291cmNlOiBSZWN0YWJsZSB8IFBhY2ssXG4gIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICBvcHRpb25zOiBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zID0ge30sXG4pOiBTaW5nbGVBdHRyYWN0aW9uIHtcbiAgY29uc3Qgc291cmNlUGFjayA9IGdldFBhY2soc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UGFjayA9IGdldFBhY2sodGFyZ2V0KTtcbiAgY29uc3Qge1xuICAgIGF0dHJhY3REaXN0YW5jZSA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV0sXG4gICAgYWxpZ25Ub3MgPSBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hbGlnblRvXSxcbiAgICBhbGlnbm1lbnRzID0gTWFnbmV0LmdldEFsaWdubWVudHNGcm9tQWxpZ25UbyhhbGlnblRvcyksXG4gICAgb25KdWRnZURpc3RhbmNlID0gcmV0dXJuVHJ1ZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNpbmdsZUF0dHJhY3Rpb24gPSBhbGlnbm1lbnRzLnJlZHVjZTxTaW5nbGVBdHRyYWN0aW9uPihcbiAgICAoYXR0cmFjdGlvbiwgYWxpZ25tZW50KSA9PiB7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hZ25ldC5wcm90b3R5cGUuZGlzdGFuY2VUby5jYWxsKHNvdXJjZVBhY2ssIHRhcmdldFBhY2ssIGFsaWdubWVudCk7XG4gICAgICBjb25zdCBwYXNzSnVkZ2VtZW50ID0gb25KdWRnZURpc3RhbmNlKFxuICAgICAgICB7IC4uLmRpc3RhbmNlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAocGFzc0p1ZGdlbWVudCkge1xuICAgICAgICBjb25zdCB7IHJlc3VsdHMsIGJlc3QgfSA9IGF0dHJhY3Rpb247XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKGRpc3RhbmNlKTtcblxuICAgICAgICBpZiAoQWxpZ25tZW50WHMuaW5jbHVkZXMoYWxpZ25tZW50KSkge1xuICAgICAgICAgIGlmIChiZXN0LnggPT09IHVuZGVmaW5lZCB8fCBkaXN0YW5jZS5hYnNEaXN0YW5jZSA8IGJlc3QueC5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgYmVzdC54ID0gZGlzdGFuY2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChiZXN0LnguYWJzRGlzdGFuY2UgPT09IGRpc3RhbmNlLmFic0Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBnYXAgPSBhdHRyYWN0RGlzdGFuY2UgLyAzO1xuXG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UucmF3RGlzdGFuY2UgPiBnYXApIHtcbiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LmxlZnRUb0xlZnQpIHtcbiAgICAgICAgICAgICAgICBiZXN0LnggPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5yYXdEaXN0YW5jZSA8IC1nYXApIHtcbiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnJpZ2h0VG9SaWdodCkge1xuICAgICAgICAgICAgICAgIGJlc3QueCA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXIpIHtcbiAgICAgICAgICAgICAgYmVzdC54ID0gZGlzdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFsaWdubWVudFlzLmluY2x1ZGVzKGFsaWdubWVudCkpIHtcbiAgICAgICAgICBpZiAoYmVzdC55ID09PSB1bmRlZmluZWQgfHwgZGlzdGFuY2UuYWJzRGlzdGFuY2UgPCBiZXN0LnkuYWJzRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGJlc3QueSA9IGRpc3RhbmNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYmVzdC55LmFic0Rpc3RhbmNlID09PSBkaXN0YW5jZS5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgZ2FwID0gYXR0cmFjdERpc3RhbmNlIC8gMztcblxuICAgICAgICAgICAgaWYgKGRpc3RhbmNlLnJhd0Rpc3RhbmNlIDwgLWdhcCkge1xuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b20pIHtcbiAgICAgICAgICAgICAgICBiZXN0LnkgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5yYXdEaXN0YW5jZSA+IGdhcCkge1xuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQudG9wVG9Ub3ApIHtcbiAgICAgICAgICAgICAgICBiZXN0LnkgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyKSB7XG4gICAgICAgICAgICAgIGJlc3QueSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmFjdGlvbjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICAgIHRhcmdldDogdGFyZ2V0UGFjayxcbiAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgYmVzdDoge30sXG4gICAgfSxcbiAgKTtcblxuICByZXR1cm4gc2luZ2xlQXR0cmFjdGlvbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2luZ2xlQXR0cmFjdGlvblRvO1xuIiwiaW1wb3J0IHsgU2luZ2xlQXR0cmFjdGlvbiB9IGZyb20gJy4vc2luZ2xlQXR0cmFjdGlvblRvJztcblxuZXhwb3J0IHR5cGUgT25KdWRnZUF0dHJhY3Rpb24gPSAoXG4gIGF0dHJhY3Rpb246IFNpbmdsZUF0dHJhY3Rpb24sXG4pID0+IGJvb2xlYW47XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBhdHRyYWN0aW9uIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gKiBhdHRyYWN0aW9uIHdvdWxkIG5vdCBiZSBvbiB0aGUgcmVzdWx0IGxpc3Qgb2YgYXR0cmFjdGlvbnMuXG4gKi9cbmNvbnN0IGp1ZGdlQXR0cmFjdGlvbjogT25KdWRnZUF0dHJhY3Rpb24gPSBmdW5jdGlvbiBqdWRnZUF0dHJhY3Rpb24oXG4gIGF0dHJhY3Rpb24sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oYXR0cmFjdGlvbi5iZXN0LnggPz8gYXR0cmFjdGlvbi5iZXN0LnkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQganVkZ2VBdHRyYWN0aW9uO1xuIiwiaW1wb3J0IFBhY2sgZnJvbSAnLi4vdHlwZXMvUGFjayc7XG5cbmV4cG9ydCB0eXBlIE9uSnVkZ2VNb3ZlbWVudCA9IChwYWNrOiBQYWNrKSA9PiBib29sZWFuO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlzdGFuY2UgcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZSB0aGVcbiAqIGRpc3RhbmNlIHdvdWxkIG5vdCBiZSBvbiB0aGUgcmVzdWx0IGxpc3Qgb2YgYXR0cmFjdGlvbi5cbiAqL1xuY29uc3QganVkZ2VNb3ZlbWVudDogT25KdWRnZU1vdmVtZW50ID0gZnVuY3Rpb24ganVkZ2VNb3ZlbWVudCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZU1vdmVtZW50O1xuIiwidHlwZSBFdmVudEhvbGRlciA9IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgfCBXaW5kb3c7XG50eXBlIEV2ZW50TGlzdGVuZXIgPSAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbmludGVyZmFjZSBFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gIGNhcHR1cmU/OiBib29sZWFuO1xuICBvbmNlPzogYm9vbGVhbjtcbiAgcGFzc2l2ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBldmVudCBvZiB0eXBlIHRvIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKFxuICByZWY6IEV2ZW50SG9sZGVyLFxuICB0eXBlOiBzdHJpbmcsXG4gIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyLFxuICBvcHRpb25zPzogRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4pOiB2b2lkIHtcbiAgcmVmLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEFkZHMgZXZlbnRzIG9mIHR5cGVzIHRvIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyhcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZXM6IHN0cmluZ1tdLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHR5cGVzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICBhZGRFdmVudExpc3RlbmVyKHJlZiwgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IG9mIHR5cGUgZnJvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZTogc3RyaW5nLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50cyBvZiB0eXBlcyBmcm9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyhcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZXM6IHN0cmluZ1tdLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHR5cGVzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gIH0pO1xufVxuXG5pbnRlcmZhY2UgQ3VzdG9tRXZlbnRJbml0PFQ+IHtcbiAgZGV0YWlsPzogVDtcbiAgYnViYmxlcz86IGJvb2xlYW47XG4gIGNhbmNlbGFibGU/OiBib29sZWFuO1xuICBjb21wb3NlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJpZ2dlcnMgZXZlbnQgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlIGV2ZW50IGlzIGNhbmNlbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJFdmVudDxUID0gdW5kZWZpbmVkPihcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZTogc3RyaW5nLFxuICBvcHRpb25zPzogQ3VzdG9tRXZlbnRJbml0PFQ+LFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZSwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIFRyaWdnZXJzIGV2ZW50cyBhbmQgcmV0dXJucyBmYWxzZSBpZiBhbnkgb2YgdGhlIGV2ZW50IGlzXG4gKiBjYW5jZWxsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRXZlbnRzPFQ+KFxuICByZWY6IEV2ZW50SG9sZGVyLFxuICB0eXBlczogc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBDdXN0b21FdmVudEluaXQ8VD4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVzLmV2ZXJ5KCh0eXBlKSA9PiB0cmlnZ2VyRXZlbnQocmVmLCB0eXBlLCBvcHRpb25zKSk7XG59XG4iLCJpbXBvcnQgY3JlYXRlUG9pbnQgZnJvbSAnLi4vdHlwZXMvUG9pbnQnO1xuXG4vKipcbiAqIFJldHVybnMgb2Zmc2V0IHRvIGtlZXAgc291cmNlIHJlY3QgaW4gdGFyZ2V0IHJlY3QuXG4gKi9cbmZ1bmN0aW9uIGdldE9mZnNldFRvQmVJblJlY3Qoc291cmNlUmVjdDogRE9NUmVjdCwgdGFyZ2V0UmVjdDogRE9NUmVjdCk6IERPTVBvaW50IHtcbiAgbGV0IHggPSAwO1xuICBsZXQgeSA9IDA7XG5cbiAgaWYgKHNvdXJjZVJlY3QubGVmdCA8IHRhcmdldFJlY3QubGVmdCkge1xuICAgIHggPSB0YXJnZXRSZWN0LmxlZnQgLSBzb3VyY2VSZWN0LmxlZnQ7XG4gIH0gZWxzZSBpZiAoc291cmNlUmVjdC5yaWdodCA+IHRhcmdldFJlY3QucmlnaHQpIHtcbiAgICB4ID0gdGFyZ2V0UmVjdC5yaWdodCAtIHNvdXJjZVJlY3QucmlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlUmVjdC50b3AgPCB0YXJnZXRSZWN0LnRvcCkge1xuICAgIHkgPSB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QudG9wO1xuICB9IGVsc2UgaWYgKHNvdXJjZVJlY3QuYm90dG9tID4gdGFyZ2V0UmVjdC5ib3R0b20pIHtcbiAgICB5ID0gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LmJvdHRvbTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQb2ludCh4LCB5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0T2Zmc2V0VG9CZUluUmVjdDtcbiIsImltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IHsgZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQXR0cmFjdGlvbkJlc3QsIGdldEF0dHJhY3Rpb25PZmZzZXQgfSBmcm9tICcuLi90eXBlcy9BdHRyYWN0aW9uJztcbmltcG9ydCBEaXN0YW5jZSBmcm9tICcuLi90eXBlcy9EaXN0YW5jZSc7XG5pbXBvcnQge1xuICBBdHRyYWN0ZWRFdmVudERldGFpbCwgQXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsLCBBdHRyYWN0RXZlbnREZXRhaWwsXG4gIEF0dHJhY3Rtb3ZlRXZlbnREZXRhaWwsIFVuYXR0cmFjdGVkRXZlbnREZXRhaWwsIFVuYXR0cmFjdEV2ZW50RGV0YWlsLFxufSBmcm9tICcuLi90eXBlcy9FdmVudERldGFpbCc7XG5pbXBvcnQgUGFjayBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCBjcmVhdGVQb2ludCBmcm9tICcuLi90eXBlcy9Qb2ludCc7XG5pbXBvcnQgY3JlYXRlUmVjdCwgeyBnZXRSZWN0IH0gZnJvbSAnLi4vdHlwZXMvUmVjdCc7XG5pbXBvcnQgeyB0cmlnZ2VyRXZlbnQgfSBmcm9tICcuLi91dGlscy9ldmVudEhhbmRsZXInO1xuaW1wb3J0IGdldE9mZnNldFRvQmVJblJlY3QgZnJvbSAnLi4vdXRpbHMvZ2V0T2Zmc2V0VG9CZUluUmVjdCc7XG5pbXBvcnQgeyByZXR1cm5GYWxzZSwgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IEFsaWduVG8sIHsgQWxpZ25Ub1BhcmVudCB9IGZyb20gJy4uL3ZhbHVlcy9hbGlnblRvJztcbmltcG9ydCBBdHRyaWJ1dGUgZnJvbSAnLi4vdmFsdWVzL2F0dHJpYnV0ZSc7XG5pbXBvcnQgQ3Jvc3NQcmV2ZW50IGZyb20gJy4uL3ZhbHVlcy9jcm9zc1ByZXZlbnQnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4uL3ZhbHVlcy9ldmVudCc7XG5pbXBvcnQgeyBPbkp1ZGdlQXR0cmFjdGlvbiB9IGZyb20gJy4vanVkZ2VBdHRyYWN0aW9uJztcbmltcG9ydCB7IE9uSnVkZ2VEaXN0YW5jZSB9IGZyb20gJy4vanVkZ2VEaXN0YW5jZSc7XG5pbXBvcnQgeyBPbkp1ZGdlRGlzdGFuY2VJblBhcmVudCB9IGZyb20gJy4vanVkZ2VEaXN0YW5jZUluUGFyZW50JztcbmltcG9ydCB7IE9uSnVkZ2VNb3ZlbWVudCB9IGZyb20gJy4vanVkZ2VNb3ZlbWVudCc7XG5pbXBvcnQgbXVsdGlBdHRyYWN0aW9uc1RvIGZyb20gJy4vbXVsdGlBdHRyYWN0aW9uc1RvJztcbmltcG9ydCBzaW5nbGVBdHRyYWN0aW9uVG8gZnJvbSAnLi9zaW5nbGVBdHRyYWN0aW9uVG8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uT3B0aW9ucyB7XG4gIGlnbm9yZUV2ZW50PzogYm9vbGVhbjtcbiAgdW5hdHRyYWN0YWJsZT86IGJvb2xlYW47XG4gIGF0dHJhY3REaXN0YW5jZT86IG51bWJlcjtcbiAgYWxpZ25Ub3M/OiBBbGlnblRvW107XG4gIGFsaWdubWVudHM/OiBBbGlnbm1lbnRbXTtcbiAgYWxpZ25Ub1BhcmVudHM/OiBBbGlnblRvUGFyZW50W107XG4gIGNyb3NzUHJldmVudHM/OiBDcm9zc1ByZXZlbnRbXTtcbiAgcGFyZW50UGFjaz86IFBhY2s7XG4gIGxhc3RBdHRyYWN0aW9uQmVzdD86IEF0dHJhY3Rpb25CZXN0IHwgbnVsbDtcbiAgb25KdWRnZURpc3RhbmNlPzogT25KdWRnZURpc3RhbmNlO1xuICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudD86IE9uSnVkZ2VEaXN0YW5jZUluUGFyZW50O1xuICBvbkp1ZGdlQXR0cmFjdGlvbj86IE9uSnVkZ2VBdHRyYWN0aW9uO1xuICBvbkp1ZGdlTW92ZW1lbnQ/OiBPbkp1ZGdlTW92ZW1lbnQ7XG59XG5cbmludGVyZmFjZSBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvblJlc3VsdCB7XG4gIHBvc2l0aW9uOiBET01Qb2ludCB8IG51bGw7XG4gIGF0dHJhY3Rpb25CZXN0OiBBdHRyYWN0aW9uQmVzdCB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uKFxuICBzb3VyY2VQYWNrOiBQYWNrLFxuICB0YXJnZXRQYWNrczogUGFja1tdLFxuICBvcHRpb25zOiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMgPSB7fSxcbik6IEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uUmVzdWx0IHtcbiAgY29uc3Qgc291cmNlUmF3ID0gc291cmNlUGFjay5yYXcgYXMgSFRNTEVsZW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBpZ25vcmVFdmVudCA9ICEoc291cmNlUmF3IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpLFxuICAgIGFsaWduVG9QYXJlbnRzID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudF0sXG4gICAgY3Jvc3NQcmV2ZW50cyA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmNyb3NzUHJldmVudF0sXG4gICAgcGFyZW50UGFjayxcbiAgICBsYXN0QXR0cmFjdGlvbkJlc3QsXG4gICAgb25KdWRnZU1vdmVtZW50ID0gcmV0dXJuVHJ1ZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxhc3RCZXN0WCA9IGxhc3RBdHRyYWN0aW9uQmVzdD8ueDtcbiAgY29uc3QgbGFzdEJlc3RZID0gbGFzdEF0dHJhY3Rpb25CZXN0Py55O1xuICBjb25zdCBwYXJlbnRBbGlnbm1lbnRzID0gTWFnbmV0LmdldEFsaWdubWVudHNGcm9tQWxpZ25UbyhhbGlnblRvUGFyZW50cyk7XG4gIGNvbnN0IGFsaWduVG9QYXJlbnQgPSBwYXJlbnRBbGlnbm1lbnRzLmxlbmd0aCA+IDA7XG4gIGNvbnN0IGNyb3NzUHJldmVudFBhcmVudCA9IGNyb3NzUHJldmVudHMuaW5jbHVkZXMoQ3Jvc3NQcmV2ZW50LnBhcmVudCk7XG4gIGNvbnN0IGtlZXBJblBhcmVudCA9IGNyb3NzUHJldmVudFBhcmVudCAmJiBwYXJlbnRQYWNrO1xuICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdChzb3VyY2VQYWNrKTtcbiAgY29uc3Qge1xuICAgIHdpZHRoOiBzb3VyY2VXaWR0aCxcbiAgICBoZWlnaHQ6IHNvdXJjZUhlaWdodCxcbiAgfSA9IHNvdXJjZVJlY3Q7XG4gIGNvbnN0IHBhcmVudFJlY3QgPSBnZXRSZWN0KFxuICAgIHBhcmVudFBhY2tcbiAgICA/PyBzb3VyY2VSZWN0LCAvLyBoYWNrIGZvciB0c2xpbnQgYmVjYXVzZSBgcGFyZW50UmVjdGAgd291bGQgYmUgbmVlZGxlc3NcbiAgKTtcblxuICAvKipcbiAgICogTmVlZCB0byBjb25zaWRlciB0aGUgZHJhZ2dpbmcgZm9yY2Ugd2hlbiB0aGUgbWFnbmV0IGlzIHByZXZlbnRlZFxuICAgKiBmcm9tIGNyb3NzaW5nIHBhcmVudCBlbGVtZW50LiBUaGUgYXR0cmFjdGlvbiBvZiB0aGUgbmVhciBtYWduZXRzXG4gICAqIHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZSBmb3JjZSBpcyBncmVhdGVyIHRoYW4gdGhlIGF0dHJhY3RpbmdcbiAgICogZGlzdGFuY2VzLlxuICAgKi9cbiAgY29uc3Qgc291cmNlUmF3UmVjdCA9IHNvdXJjZVJlY3Q7XG4gIGNvbnN0IHNvdXJjZUluUGFyZW50T2Zmc2V0ID0gKGtlZXBJblBhcmVudFxuICAgID8gZ2V0T2Zmc2V0VG9CZUluUmVjdChzb3VyY2VSYXdSZWN0LCBwYXJlbnRSZWN0KVxuICAgIDogY3JlYXRlUG9pbnQoMCwgMClcbiAgKTtcbiAgY29uc3Qgc291cmNlSW5QYXJlbnRSZWN0ID0gY3JlYXRlUmVjdChcbiAgICBzb3VyY2VSYXdSZWN0LnggKyBzb3VyY2VJblBhcmVudE9mZnNldC54LFxuICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUluUGFyZW50T2Zmc2V0LnksXG4gICAgc291cmNlV2lkdGgsXG4gICAgc291cmNlSGVpZ2h0LFxuICApO1xuICBjb25zdCBzb3VyY2VJblBhcmVudFBhY2sgPSBuZXcgUGFjayhzb3VyY2VSYXcsIHNvdXJjZUluUGFyZW50UmVjdCk7XG4gIGNvbnN0IHBhc3NKdWRnZU1vdmVtZW50ID0gb25KdWRnZU1vdmVtZW50KHNvdXJjZUluUGFyZW50UGFjayk7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgZm9yIHRob3NlIHRhcmdldHMgbmVlZCB0byBkaXNwYXRjaCBldmVudC5cbiAgICovXG4gIGNvbnN0IGF0dHJhY3RSZXN1bHRzOiBEaXN0YW5jZVtdID0gW107XG4gIGNvbnN0IHVuYXR0cmFjdFJlc3VsdHM6IERpc3RhbmNlW10gPSBbXTtcbiAgY29uc3QgYXR0cmFjdG1vdmVSZXN1bHRzOiBEaXN0YW5jZVtdID0gW107XG5cbiAgY29uc3QgZGlzcGF0Y2hBdHRyYWN0RXZlbnRzID0gKHNvdXJjZU5leHRSZWN0OiBET01SZWN0KSA9PiB7XG4gICAgaWYgKGlnbm9yZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXR0cmFjdFJlc3VsdHMuZm9yRWFjaCgoYXR0cmFjdFJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0UGFjayA9IGF0dHJhY3RSZXN1bHQudGFyZ2V0O1xuICAgICAgY29uc3QgdGFyZ2V0RWxlbSA9IHRhcmdldFBhY2sucmF3IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgYXR0cmFjdGVkRXZlbnREZXRhaWw6IEF0dHJhY3RlZEV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRQYWNrLFxuICAgICAgICBzb3VyY2VOZXh0UmVjdCxcbiAgICAgICAgZGlzdGFuY2U6IGF0dHJhY3RSZXN1bHQsXG4gICAgICB9O1xuXG4gICAgICB0cmlnZ2VyRXZlbnQ8QXR0cmFjdGVkRXZlbnREZXRhaWw+KFxuICAgICAgICB0YXJnZXRFbGVtLFxuICAgICAgICBFdmVudC5hdHRyYWN0ZWQsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogYXR0cmFjdGVkRXZlbnREZXRhaWwsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBkaXNwYXRjaFVuYXR0cmFjdEV2ZW50cyA9IChzb3VyY2VOZXh0UmVjdDogRE9NUmVjdCkgPT4ge1xuICAgIGlmIChpZ25vcmVFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVuYXR0cmFjdFJlc3VsdHMuZm9yRWFjaCgodW5hdHRyYWN0UmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRQYWNrID0gdW5hdHRyYWN0UmVzdWx0LnRhcmdldDtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW0gPSB0YXJnZXRQYWNrLnJhdyBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IHVuYXR0cmFjdGVkRXZlbnREZXRhaWw6IFVuYXR0cmFjdGVkRXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFBhY2ssXG4gICAgICAgIHNvdXJjZU5leHRSZWN0LFxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlckV2ZW50PFVuYXR0cmFjdGVkRXZlbnREZXRhaWw+KFxuICAgICAgICB0YXJnZXRFbGVtLFxuICAgICAgICBFdmVudC51bmF0dHJhY3RlZCxcbiAgICAgICAge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB1bmF0dHJhY3RlZEV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZGlzcGF0Y2hBdHRyYWN0bW92ZUV2ZW50cyA9IChzb3VyY2VOZXh0UmVjdDogRE9NUmVjdCkgPT4ge1xuICAgIGlmIChpZ25vcmVFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF0dHJhY3Rtb3ZlUmVzdWx0cy5mb3JFYWNoKChhdHRyYWN0bW92ZVJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0UGFjayA9IGF0dHJhY3Rtb3ZlUmVzdWx0LnRhcmdldDtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW0gPSB0YXJnZXRQYWNrLnJhdyBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGF0dHJhY3RlZG1vdmVFdmVudERldGFpbDogQXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRQYWNrLFxuICAgICAgICBzb3VyY2VOZXh0UmVjdCxcbiAgICAgICAgZGlzdGFuY2U6IGF0dHJhY3Rtb3ZlUmVzdWx0LFxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlckV2ZW50PEF0dHJhY3RlZG1vdmVFdmVudERldGFpbD4oXG4gICAgICAgIHRhcmdldEVsZW0sXG4gICAgICAgIEV2ZW50LmF0dHJhY3RlZG1vdmUsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogYXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcblxuICBpZiAoIXBhc3NKdWRnZU1vdmVtZW50KSB7XG4gICAgaWYgKGxhc3RCZXN0WCkge1xuICAgICAgdW5hdHRyYWN0UmVzdWx0cy5wdXNoKGxhc3RCZXN0WCk7XG4gICAgfVxuICAgIGlmIChsYXN0QmVzdFkpIHtcbiAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFkpO1xuICAgIH1cblxuICAgIGRpc3BhdGNoVW5hdHRyYWN0RXZlbnRzKHNvdXJjZUluUGFyZW50UmVjdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IG51bGwsXG4gICAgICBhdHRyYWN0aW9uQmVzdDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYmVzdCBhdHRyYWN0aW9uIHJlc3VsdCBpZiBtYWduZXQgYWxpZ25zIHRvIHBhcmVudC5cbiAgICovXG4gIGNvbnN0IGF0dHJhY3Rpb25CZXN0OiBBdHRyYWN0aW9uQmVzdCA9IHt9O1xuXG4gIGNvbnN0IHtcbiAgICB1bmF0dHJhY3RhYmxlID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZV0sXG4gICAgYXR0cmFjdERpc3RhbmNlID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlXSxcbiAgICBhbGlnblRvcyA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmFsaWduVG9dLFxuICAgIGFsaWdubWVudHMgPSBNYWduZXQuZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKGFsaWduVG9zKSxcbiAgICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudCA9IHJldHVyblRydWUsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBzb3VyY2VSYXdQYWNrID0gbmV3IFBhY2soc291cmNlUmF3LCBzb3VyY2VSYXdSZWN0KTtcbiAgY29uc3Qgb25KdWRnZURpc3RhbmNlID0gKHVuYXR0cmFjdGFibGVcbiAgICA/IHJldHVybkZhbHNlXG4gICAgOiAob3B0aW9ucy5vbkp1ZGdlRGlzdGFuY2UgPz8gcmV0dXJuVHJ1ZSlcbiAgKTtcblxuICBpZiAoYWxpZ25Ub1BhcmVudCAmJiBwYXJlbnRQYWNrKSB7XG4gICAgY29uc3QgeyBiZXN0IH0gPSBzaW5nbGVBdHRyYWN0aW9uVG8oXG4gICAgICBzb3VyY2VSYXdQYWNrLFxuICAgICAgcGFyZW50UGFjayxcbiAgICAgIHtcbiAgICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgICBhbGlnblRvcyxcbiAgICAgICAgYWxpZ25tZW50cyxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXR0cmFjdGlvbkJlc3QueCA9IGJlc3QueDtcbiAgICBhdHRyYWN0aW9uQmVzdC55ID0gYmVzdC55O1xuICB9XG5cbiAgY29uc3Qgb25KdWRnZU11bHRpRGlzdGFuY2U6IE9uSnVkZ2VEaXN0YW5jZSA9IChrZWVwSW5QYXJlbnRcbiAgICA/ICgoZGlzdGFuY2UpID0+IChcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZUluUGFyZW50KGRpc3RhbmNlLCB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIHBhcmVudDogcGFyZW50UGFjayxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlLFxuICAgICAgfSlcbiAgICApKVxuICAgIDogb25KdWRnZURpc3RhbmNlXG4gICk7XG4gIGNvbnN0IG9uSnVkZ2VBdHRyYWN0aW9uID0gKHVuYXR0cmFjdGFibGVcbiAgICA/IHJldHVybkZhbHNlXG4gICAgOiAob3B0aW9ucy5vbkp1ZGdlQXR0cmFjdGlvbiA/PyByZXR1cm5UcnVlKVxuICApO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uID0gbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgIHNvdXJjZVJhd1BhY2ssXG4gICAgdGFyZ2V0UGFja3MsXG4gICAge1xuICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlOiBvbkp1ZGdlTXVsdGlEaXN0YW5jZSxcbiAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uLFxuICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgfSxcbiAgKTtcbiAgY29uc3Qgc291cmNlQXR0cmFjdGlvbkJlc3QgPSBzb3VyY2VBdHRyYWN0aW9uLmJlc3Q7XG4gIGNvbnN0IHNvdXJjZUF0dHJhY3Rpb25PZmZzZXQgPSBnZXRBdHRyYWN0aW9uT2Zmc2V0KHNvdXJjZUF0dHJhY3Rpb24pO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uUmVjdCA9IGNyZWF0ZVJlY3QoXG4gICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlQXR0cmFjdGlvbk9mZnNldC54LFxuICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUF0dHJhY3Rpb25PZmZzZXQueSxcbiAgICBzb3VyY2VXaWR0aCxcbiAgICBzb3VyY2VIZWlnaHQsXG4gICk7XG4gIGNvbnN0IHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldCA9IChrZWVwSW5QYXJlbnRcbiAgICA/IGdldE9mZnNldFRvQmVJblJlY3Qoc291cmNlQXR0cmFjdGlvblJlY3QsIHBhcmVudFJlY3QpXG4gICAgOiBjcmVhdGVQb2ludCgwLCAwKVxuICApO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uSW5QYXJlbnRSZWN0ID0gY3JlYXRlUmVjdChcbiAgICBzb3VyY2VBdHRyYWN0aW9uUmVjdC54ICsgc291cmNlQXR0cmFjdGlvbkluUGFyZW50T2Zmc2V0LngsXG4gICAgc291cmNlQXR0cmFjdGlvblJlY3QueSArIHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldC55LFxuICAgIHNvdXJjZVdpZHRoLFxuICAgIHNvdXJjZUhlaWdodCxcbiAgKTtcblxuICBpZiAoIWlnbm9yZUV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgeDogY3VycmVudEJlc3RYLFxuICAgICAgeTogY3VycmVudEJlc3RZLFxuICAgIH0gPSBzb3VyY2VBdHRyYWN0aW9uQmVzdDtcbiAgICBjb25zdCBsYXN0VGFyZ2V0WCA9IGxhc3RCZXN0WD8udGFyZ2V0O1xuICAgIGNvbnN0IGxhc3RUYXJnZXRZID0gbGFzdEJlc3RZPy50YXJnZXQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldFggPSBjdXJyZW50QmVzdFg/LnRhcmdldDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0WSA9IGN1cnJlbnRCZXN0WT8udGFyZ2V0O1xuICAgIGNvbnN0IGRpZmZUYXJnZXRYID0gY3VycmVudFRhcmdldFggIT09IGxhc3RUYXJnZXRYO1xuICAgIGNvbnN0IGRpZmZUYXJnZXRZID0gY3VycmVudFRhcmdldFkgIT09IGxhc3RUYXJnZXRZO1xuXG4gICAgLyoqXG4gICAgICogUmVjb3JkcyBhbmQgZGlzcGF0Y2hlcyBldmVudHMgb24geC95IHBhY2tzLlxuICAgICAqL1xuICAgIGlmIChkaWZmVGFyZ2V0WCkge1xuICAgICAgaWYgKGxhc3RUYXJnZXRYKSB7XG4gICAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFgpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRUYXJnZXRYKSB7XG4gICAgICAgIGF0dHJhY3RSZXN1bHRzLnB1c2goY3VycmVudEJlc3RYKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRUYXJnZXRYKSB7XG4gICAgICBjb25zdCBsYXN0QWxpZ25tZW50WCA9IGxhc3RCZXN0WD8uYWxpZ25tZW50O1xuICAgICAgY29uc3QgY3VycmVudEFsaWdubWVudFggPSBjdXJyZW50QmVzdFguYWxpZ25tZW50O1xuXG4gICAgICBpZiAobGFzdEFsaWdubWVudFggIT09IGN1cnJlbnRBbGlnbm1lbnRYKSB7XG4gICAgICAgIGF0dHJhY3RSZXN1bHRzLnB1c2goY3VycmVudEJlc3RYKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF0dHJhY3Rtb3ZlUmVzdWx0cy5wdXNoKGN1cnJlbnRCZXN0WCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZmZUYXJnZXRZKSB7XG4gICAgICBpZiAobGFzdFRhcmdldFkpIHtcbiAgICAgICAgdW5hdHRyYWN0UmVzdWx0cy5wdXNoKGxhc3RCZXN0WSk7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFRhcmdldFkpIHtcbiAgICAgICAgYXR0cmFjdFJlc3VsdHMucHVzaChjdXJyZW50QmVzdFkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3VycmVudFRhcmdldFkpIHtcbiAgICAgIGNvbnN0IGxhc3RBbGlnbm1lbnRZID0gbGFzdEJlc3RZPy5hbGlnbm1lbnQ7XG4gICAgICBjb25zdCBjdXJyZW50QWxpZ25tZW50WSA9IGN1cnJlbnRCZXN0WS5hbGlnbm1lbnQ7XG5cbiAgICAgIGlmIChsYXN0QWxpZ25tZW50WSAhPT0gY3VycmVudEFsaWdubWVudFkpIHtcbiAgICAgICAgYXR0cmFjdFJlc3VsdHMucHVzaChjdXJyZW50QmVzdFkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmFjdG1vdmVSZXN1bHRzLnB1c2goY3VycmVudEJlc3RZKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRyYWN0aW9uIGhhcHBlbnMuXG4gICAgICovXG4gICAgaWYgKGF0dHJhY3RSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dHJhY3RFdmVudERldGFpbDogQXR0cmFjdEV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgbmV4dFJlY3Q6IHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QsXG4gICAgICAgIGF0dHJhY3Rpb246IHNvdXJjZUF0dHJhY3Rpb24sXG4gICAgICB9O1xuICAgICAgY29uc3QgcGFzc0F0dHJhY3RFdmVudCA9IHRyaWdnZXJFdmVudDxBdHRyYWN0RXZlbnREZXRhaWw+KFxuICAgICAgICBzb3VyY2VSYXcsXG4gICAgICAgIEV2ZW50LmF0dHJhY3QsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBhdHRyYWN0RXZlbnREZXRhaWwsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAoIXBhc3NBdHRyYWN0RXZlbnQpIHtcbiAgICAgICAgaWYgKGxhc3RCZXN0WCkge1xuICAgICAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0QmVzdFkpIHtcbiAgICAgICAgICB1bmF0dHJhY3RSZXN1bHRzLnB1c2gobGFzdEJlc3RZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9zaXRpb246IGNyZWF0ZVBvaW50KFxuICAgICAgICAgICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlSW5QYXJlbnRPZmZzZXQueCxcbiAgICAgICAgICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUluUGFyZW50T2Zmc2V0LnksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhdHRyYWN0aW9uQmVzdDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5hdHRyYWN0UmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB1bmF0dHJhY3RFdmVudERldGFpbDogVW5hdHRyYWN0RXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICBuZXh0UmVjdDogc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCxcbiAgICAgICAgYXR0cmFjdGlvbjogc291cmNlQXR0cmFjdGlvbixcbiAgICAgIH07XG5cbiAgICAgIHRyaWdnZXJFdmVudDxVbmF0dHJhY3RFdmVudERldGFpbD4oXG4gICAgICAgIHNvdXJjZVJhdyxcbiAgICAgICAgRXZlbnQudW5hdHRyYWN0LFxuICAgICAgICB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHVuYXR0cmFjdEV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0cmFjdG1vdmVSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dHJhY3Rtb3ZlRXZlbnREZXRhaWw6IEF0dHJhY3Rtb3ZlRXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICBuZXh0UmVjdDogc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCxcbiAgICAgICAgYXR0cmFjdGlvbjogc291cmNlQXR0cmFjdGlvbixcbiAgICAgIH07XG5cbiAgICAgIHRyaWdnZXJFdmVudDxBdHRyYWN0bW92ZUV2ZW50RGV0YWlsPihcbiAgICAgICAgc291cmNlUmF3LFxuICAgICAgICBFdmVudC5hdHRyYWN0bW92ZSxcbiAgICAgICAge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBhdHRyYWN0bW92ZUV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkaXNwYXRjaEF0dHJhY3RFdmVudHMoc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCk7XG4gIGRpc3BhdGNoVW5hdHRyYWN0RXZlbnRzKHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QpO1xuICBkaXNwYXRjaEF0dHJhY3Rtb3ZlRXZlbnRzKHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QpO1xuXG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IGNyZWF0ZVBvaW50KFxuICAgICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlQXR0cmFjdGlvbk9mZnNldC54ICsgc291cmNlQXR0cmFjdGlvbkluUGFyZW50T2Zmc2V0LngsXG4gICAgICBzb3VyY2VSYXdSZWN0LnkgKyBzb3VyY2VBdHRyYWN0aW9uT2Zmc2V0LnkgKyBzb3VyY2VBdHRyYWN0aW9uSW5QYXJlbnRPZmZzZXQueSxcbiAgICApLFxuICAgIGF0dHJhY3Rpb25CZXN0OiBzb3VyY2VBdHRyYWN0aW9uQmVzdCxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb247XG4iLCJpbXBvcnQgeyBjcmVhdGVQb2ludCB9IGZyb20gJy4uL3R5cGVzL1BvaW50JztcblxuLyoqXG4gKiBSZXR1cm5zICh4LCB5KSBvZiBtb3VzdC90b3VjaCBldmVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRYWShldmVudDogUG9pbnRlckV2ZW50KTogRE9NUG9pbnQge1xuICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGV2ZW50O1xuXG4gIHJldHVybiBjcmVhdGVQb2ludChjbGllbnRYLCBjbGllbnRZKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0RXZlbnRYWTtcbiIsImltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uIGZyb20gJy4uL21ldGhvZHMvYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24nO1xuaW1wb3J0IHsgT25KdWRnZU1vdmVtZW50IH0gZnJvbSAnLi4vbWV0aG9kcy9qdWRnZU1vdmVtZW50JztcbmltcG9ydCB7IE1vdmVFdmVudERldGFpbCwgU3RhcnRFdmVudERldGFpbCB9IGZyb20gJy4uL3R5cGVzL0V2ZW50RGV0YWlsJztcbmltcG9ydCBQYWNrIGZyb20gJy4uL3R5cGVzL1BhY2snO1xuaW1wb3J0IGNyZWF0ZVBvaW50IGZyb20gJy4uL3R5cGVzL1BvaW50JztcbmltcG9ydCBjcmVhdGVSZWN0IGZyb20gJy4uL3R5cGVzL1JlY3QnO1xuaW1wb3J0IEF0dHJpYnV0ZSBmcm9tICcuLi92YWx1ZXMvYXR0cmlidXRlJztcbmltcG9ydCBFdmVudCBmcm9tICcuLi92YWx1ZXMvZXZlbnQnO1xuaW1wb3J0IHsgYWRkRXZlbnRMaXN0ZW5lcnMsIHJlbW92ZUV2ZW50TGlzdGVuZXJzLCB0cmlnZ2VyRXZlbnQgfSBmcm9tICcuL2V2ZW50SGFuZGxlcic7XG5pbXBvcnQgZ2V0RXZlbnRYWSBmcm9tICcuL2dldEV2ZW50WFknO1xuXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gWydwb2ludGVyZG93biddO1xuY29uc3QgRVZFTlRfRFJBR19NT1ZFID0gWydwb2ludGVybW92ZSddO1xuY29uc3QgRVZFTlRfRFJBR19FTkQgPSBbJ3BvaW50ZXJ1cCddO1xuXG4vKipcbiAqIFJlc2V0cyBtYWduZXQgY2FjaGVzLlxuICovXG5mdW5jdGlvbiByZXNldE1hZ25ldENhY2hlcyhtYWduZXQ6IE1hZ25ldCk6IHZvaWQge1xuICBtYWduZXQucmVzZXRNYWduZXRSZWN0KCk7XG4gIG1hZ25ldC5yZXNldFBhcmVudFBhY2soKTtcbiAgbWFnbmV0LnJlc2V0VGFyZ2V0TWFnbmV0UGFja3MoKTtcbn1cblxuLyoqXG4gKiBFdmVudCBsaXN0ZW5lciBvZiBkcmFnIG1vdmUgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVMaXN0ZW5lcihcbiAgdGhpczogTWFnbmV0LFxuICBzdGFydFBvaW50OiBET01Qb2ludCxcbiAgc3RhcnRMYXN0T2Zmc2V0OiBET01Qb2ludCxcbiAgbW92ZVBvaW50OiBET01Qb2ludCxcbik6IERPTVBvaW50IHtcbiAgY29uc3Qge1xuICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgdGFyZ2V0TWFnbmV0UGFja3M6IHRhcmdldFBhY2tzLFxuICAgIGp1ZGdlTWFnbmV0TW92ZW1lbnQsXG4gIH0gPSB0aGlzO1xuICBjb25zdCBvbkp1ZGdlTW92ZW1lbnQ6IE9uSnVkZ2VNb3ZlbWVudCA9IChuZXh0U291cmNlUGFjaykgPT4ge1xuICAgIGlmICghanVkZ2VNYWduZXRNb3ZlbWVudChuZXh0U291cmNlUGFjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtb3ZlRXZlbnREZXRhaWw6IE1vdmVFdmVudERldGFpbCA9IHtcbiAgICAgIHNvdXJjZTogbmV4dFNvdXJjZVBhY2ssXG4gICAgICB0YXJnZXRzOiB0YXJnZXRQYWNrcyxcbiAgICAgIHN0YXJ0UG9pbnQ6IGNyZWF0ZVBvaW50KHN0YXJ0UG9pbnQpLFxuICAgICAgbW92ZVBvaW50OiBjcmVhdGVQb2ludChtb3ZlUG9pbnQpLFxuICAgIH07XG4gICAgY29uc3QgcGFzc01vdmVFdmVudCA9IHRyaWdnZXJFdmVudDxNb3ZlRXZlbnREZXRhaWw+KFxuICAgICAgdGhpcyxcbiAgICAgIEV2ZW50Lm1hZ25ldG1vdmUsXG4gICAgICB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IG1vdmVFdmVudERldGFpbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBwYXNzTW92ZUV2ZW50O1xuICB9O1xuICBjb25zdCB7IHBvc2l0aW9uLCBhdHRyYWN0aW9uQmVzdCB9ID0gYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgbmV3IFBhY2sodGhpcywgY3JlYXRlUmVjdChcbiAgICAgIHNvdXJjZVJlY3QueCArIG1vdmVQb2ludC54IC0gc3RhcnRQb2ludC54LFxuICAgICAgc291cmNlUmVjdC55ICsgbW92ZVBvaW50LnkgLSBzdGFydFBvaW50LnksXG4gICAgICBzb3VyY2VSZWN0LndpZHRoLFxuICAgICAgc291cmNlUmVjdC5oZWlnaHQsXG4gICAgKSksXG4gICAgdGFyZ2V0UGFja3MsXG4gICAge1xuICAgICAgdW5hdHRyYWN0YWJsZTogdGhpcy51bmF0dHJhY3RhYmxlLFxuICAgICAgYXR0cmFjdERpc3RhbmNlOiB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zOiB0aGlzLmFsaWduVG9zLFxuICAgICAgYWxpZ25Ub1BhcmVudHM6IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBjcm9zc1ByZXZlbnRzOiB0aGlzLmNyb3NzUHJldmVudHMsXG4gICAgICBwYXJlbnRQYWNrOiB0aGlzLnBhcmVudFBhY2ssXG4gICAgICBsYXN0QXR0cmFjdGlvbkJlc3Q6IHRoaXMubGFzdEF0dHJhY3Rpb25CZXN0LFxuICAgICAgb25KdWRnZURpc3RhbmNlOiB0aGlzLmp1ZGdlTWFnbmV0RGlzdGFuY2UsXG4gICAgICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudDogdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlSW5QYXJlbnQsXG4gICAgICBvbkp1ZGdlQXR0cmFjdGlvbjogdGhpcy5qdWRnZU1hZ25ldEF0dHJhY3Rpb24sXG4gICAgICBvbkp1ZGdlTW92ZW1lbnQsXG4gICAgfSxcbiAgKTtcbiAgdGhpcy5zZXRNYWduZXRPZmZzZXQoXG4gICAgKHBvc2l0aW9uPy54ID8/IHNvdXJjZVJlY3QueCkgLSBzb3VyY2VSZWN0LnggKyBzdGFydExhc3RPZmZzZXQueCxcbiAgICAocG9zaXRpb24/LnkgPz8gc291cmNlUmVjdC55KSAtIHNvdXJjZVJlY3QueSArIHN0YXJ0TGFzdE9mZnNldC55LFxuICApO1xuICB0aGlzLmxhc3RBdHRyYWN0aW9uQmVzdCA9IGF0dHJhY3Rpb25CZXN0O1xuXG4gIHJldHVybiBtb3ZlUG9pbnQ7XG59XG5cbi8qKlxuICogRXZlbnQgbGlzdGVuZXIgb2YgZHJhZyBzdGFydCBldmVudC5cbiAqL1xuZnVuY3Rpb24gc3RhcnRMaXN0ZW5lcihcbiAgdGhpczogTWFnbmV0LFxuICBldmVudDogUG9pbnRlckV2ZW50LFxuKTogdm9pZCB7XG4gIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMudW5tb3ZhYmxlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRQb2ludCA9IGdldEV2ZW50WFkoZXZlbnQpO1xuXG4gIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZTtcbiAgcmVzZXRNYWduZXRDYWNoZXModGhpcyk7XG5cbiAgY29uc3Qge1xuICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgdGFyZ2V0TWFnbmV0UGFja3M6IHRhcmdldFBhY2tzLFxuICB9ID0gdGhpcztcbiAgY29uc3Qgc291cmNlUGFjayA9IG5ldyBQYWNrKHRoaXMsIHNvdXJjZVJlY3QpO1xuICBjb25zdCBzdGFydEV2ZW50RGV0YWlsOiBTdGFydEV2ZW50RGV0YWlsID0ge1xuICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICB0YXJnZXRzOiB0YXJnZXRQYWNrcyxcbiAgICBzdGFydFBvaW50OiBjcmVhdGVQb2ludChzdGFydFBvaW50KSxcbiAgfTtcbiAgY29uc3QgcGFzc1N0YXJ0RXZlbnQgPSB0cmlnZ2VyRXZlbnQ8U3RhcnRFdmVudERldGFpbD4oXG4gICAgdGhpcyxcbiAgICBFdmVudC5tYWduZXRzdGFydCxcbiAgICB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgZGV0YWlsOiBzdGFydEV2ZW50RGV0YWlsLFxuICAgIH0sXG4gICk7XG5cbiAgaWYgKCFwYXNzU3RhcnRFdmVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBsYXN0TW92ZVBvaW50OiBET01Qb2ludCA9IHN0YXJ0UG9pbnQ7XG4gIGNvbnN0IGRyYWdNb3ZlSGFuZGxlciA9IG1vdmVMaXN0ZW5lci5iaW5kKHRoaXMsIHN0YXJ0UG9pbnQsIHRoaXMubGFzdE9mZnNldCk7XG4gIGNvbnN0IGRyYWdNb3ZlTGlzdGVuZXIgPSAoZXZ0OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBjb25zdCBtb3ZlUG9pbnQgPSBnZXRFdmVudFhZKGV2dCk7XG5cbiAgICBsYXN0TW92ZVBvaW50ID0gZHJhZ01vdmVIYW5kbGVyKG1vdmVQb2ludCk7XG4gIH07XG4gIGNvbnN0IGF0dHJpYnV0ZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgIGRyYWdNb3ZlSGFuZGxlcihsYXN0TW92ZVBvaW50KTtcbiAgfSk7XG4gIGNvbnN0IGRyYWdFbmRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICB0aGlzLmlzTW92aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnei1pbmRleCcpO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRvY3VtZW50LCBFVkVOVF9EUkFHX01PVkUsIGRyYWdNb3ZlTGlzdGVuZXIpO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRvY3VtZW50LCBFVkVOVF9EUkFHX0VORCwgZHJhZ0VuZExpc3RlbmVyKTtcbiAgICBhdHRyaWJ1dGVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgcmVzZXRNYWduZXRDYWNoZXModGhpcyk7XG4gICAgdHJpZ2dlckV2ZW50KHRoaXMsIEV2ZW50Lm1hZ25ldGVuZCwge1xuICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5pc01vdmluZyA9IHRydWU7XG4gIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ3otaW5kZXgnLCBgJHtEYXRlLm5vdygpfWApO1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBhZGRFdmVudExpc3RlbmVycyhkb2N1bWVudCwgRVZFTlRfRFJBR19NT1ZFLCBkcmFnTW92ZUxpc3RlbmVyKTtcbiAgYWRkRXZlbnRMaXN0ZW5lcnMoZG9jdW1lbnQsIEVWRU5UX0RSQUdfRU5ELCBkcmFnRW5kTGlzdGVuZXIpO1xuICBhdHRyaWJ1dGVPYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgIGF0dHJpYnV0ZUZpbHRlcjogT2JqZWN0LnZhbHVlcyhBdHRyaWJ1dGUpLFxuICB9KTtcbiAgZHJhZ01vdmVIYW5kbGVyKGxhc3RNb3ZlUG9pbnQpO1xufVxuXG4vKipcbiAqIEFkZHMgYmFzaWMgZHJhZyBldmVudCBsaXN0ZW5lcnMgb2YgbWFnbmV0LlxuICovXG5mdW5jdGlvbiBhZGRCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0OiBNYWduZXQpOiB2b2lkIHtcbiAgYWRkRXZlbnRMaXN0ZW5lcnMobWFnbmV0LCBFVkVOVF9EUkFHX1NUQVJULCBzdGFydExpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGJhc2ljIGRyYWcgZXZlbnQgbGlzdGVuZXJzIG9mIG1hZ25ldC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQmFzaWNEcmFnTGlzdGVuZXJzKG1hZ25ldDogTWFnbmV0KTogdm9pZCB7XG4gIHJlbW92ZUV2ZW50TGlzdGVuZXJzKG1hZ25ldCwgRVZFTlRfRFJBR19TVEFSVCwgc3RhcnRMaXN0ZW5lcik7XG59XG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIGRyYWcgZXZlbnQgbGlzdGVuZXJzIG9mIG1hZ25ldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRHJhZ0xpc3RlbmVycyhtYWduZXQ6IE1hZ25ldCk6IHZvaWQge1xuICBpZiAobWFnbmV0LmRpc2FibGVkIHx8IG1hZ25ldC51bm1vdmFibGUpIHtcbiAgICByZW1vdmVCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0KTtcbiAgfSBlbHNlIHtcbiAgICBhZGRCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBzdGFydExpc3RlbmVyO1xuIiwiZW51bSBTdHlsZSB7XG4gIG9mZnNldFggPSAnLS1vZmZzZXQteCcsXG4gIG9mZnNldFkgPSAnLS1vZmZzZXQteScsXG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0eWxlO1xuIiwiaW1wb3J0IE1hZ25ldFBhY2sgZnJvbSAnLi9jb3JlJztcbmltcG9ydCBkaXN0YW5jZVRvIGZyb20gJy4vbWV0aG9kcy9kaXN0YW5jZVRvJztcbmltcG9ydCByYXdEaXN0YW5jZVRvIGZyb20gJy4vbWV0aG9kcy9yYXdEaXN0YW5jZVRvJztcbmltcG9ydCBtdWx0aUF0dHJhY3Rpb25zVG8sIHsgTXVsdGlBdHRyYWN0aW9uc1RvT3B0aW9ucyB9IGZyb20gJy4vbWV0aG9kcy9tdWx0aUF0dHJhY3Rpb25zVG8nO1xuaW1wb3J0IHNpbmdsZUF0dHJhY3Rpb25UbywgeyBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zIH0gZnJvbSAnLi9tZXRob2RzL3NpbmdsZUF0dHJhY3Rpb25Ubyc7XG5pbXBvcnQganVkZ2VBdHRyYWN0aW9uIGZyb20gJy4vbWV0aG9kcy9qdWRnZUF0dHJhY3Rpb24nO1xuaW1wb3J0IGp1ZGdlRGlzdGFuY2UgZnJvbSAnLi9tZXRob2RzL2p1ZGdlRGlzdGFuY2UnO1xuaW1wb3J0IGp1ZGdlRGlzdGFuY2VJblBhcmVudCBmcm9tICcuL21ldGhvZHMvanVkZ2VEaXN0YW5jZUluUGFyZW50JztcbmltcG9ydCBqdWRnZU1vdmVtZW50IGZyb20gJy4vbWV0aG9kcy9qdWRnZU1vdmVtZW50JztcbmltcG9ydCB7IEF0dHJhY3Rpb25CZXN0IH0gZnJvbSAnLi90eXBlcy9BdHRyYWN0aW9uJztcbmltcG9ydCBQYWNrLCB7IGdldFBhY2ssIFJlY3RhYmxlIH0gZnJvbSAnLi90eXBlcy9QYWNrJztcbmltcG9ydCBjcmVhdGVQb2ludCBmcm9tICcuL3R5cGVzL1BvaW50JztcbmltcG9ydCBjcmVhdGVSZWN0LCB7IGdldFJlY3QgfSBmcm9tICcuL3R5cGVzL1JlY3QnO1xuaW1wb3J0IHsgY2hlY2tEcmFnTGlzdGVuZXJzIH0gZnJvbSAnLi91dGlscy9kcmFnTGlzdGVuZXInO1xuaW1wb3J0IHJlZ2lzdGVyRWxlbWVudCBmcm9tICcuL3V0aWxzL3JlZ2lzdGVyRWxlbWVudCc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4vdmFsdWVzL2FsaWdubWVudCc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4vdmFsdWVzL2F0dHJpYnV0ZSc7XG5pbXBvcnQgT2Zmc2V0VW5pdCBmcm9tICcuL3ZhbHVlcy9vZmZzZXRVbml0JztcbmltcG9ydCBTdHlsZSBmcm9tICcuL3ZhbHVlcy9zdHlsZSc7XG5pbXBvcnQgeyBBbGlnblRvUGFyZW50IH0gZnJvbSAnLi92YWx1ZXMvYWxpZ25Ubyc7XG5pbXBvcnQgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24sIHsgQXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb25PcHRpb25zIH0gZnJvbSAnLi9tZXRob2RzL2F0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uJztcblxuY29uc3Qgbm9kZU5hbWUgPSAnbWFnbmV0LWJsb2NrJztcbmNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcblxudGVtcGxhdGUuaW5uZXJIVE1MID0gYFxuICA8c3R5bGU+XG4gICAgOmhvc3Qge1xuICAgICAgLS14OiB2YXIoJHtTdHlsZS5vZmZzZXRYfSwgMCk7XG4gICAgICAtLXk6IHZhcigke1N0eWxlLm9mZnNldFl9LCAwKTtcblxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0teCksIHZhcigtLXkpKTtcbiAgICAgIHRvdWNoLWFjdGlvbjogbm9uZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxzbG90PlxuICA8L3Nsb3Q+XG5gO1xuXG5jbGFzcyBNYWduZXQgZXh0ZW5kcyBNYWduZXRQYWNrIHtcbiAgcHJvdGVjdGVkIHJlY3RDYWNoZTogRE9NUmVjdCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBwYXJlbnRQYWNrQ2FjaGU6IFBhY2sgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgdGFyZ2V0TWFnbmV0UGFja3NDYWNoZTogUGFja1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGlzTW92aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGxhc3RPZmZzZXQ6IERPTVBvaW50ID0gY3JlYXRlUG9pbnQoMCwgMCk7XG5cbiAgcHJvdGVjdGVkIGxhc3RBdHRyYWN0aW9uQmVzdDogQXR0cmFjdGlvbkJlc3QgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgKHRoaXMuc2hhZG93Um9vdCBhcyBTaGFkb3dSb290KS5hcHBlbmQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIGNoZWNrRHJhZ0xpc3RlbmVycyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgbWFnbmV0IGlzIGRpc2FibGVkLlxuICAgKi9cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGRpc2FibGVkIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHN1cGVyLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgY2hlY2tEcmFnTGlzdGVuZXJzKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFnbmV0IGlzIHVuYWJsZSB0byBiZSBkcmFnZ2VkLlxuICAgKi9cbiAgZ2V0IHVubW92YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIudW5tb3ZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdW5tb3ZhYmxlIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCB1bm1vdmFibGUodW5tb3ZhYmxlOiBib29sZWFuKSB7XG4gICAgc3VwZXIudW5tb3ZhYmxlID0gdW5tb3ZhYmxlO1xuICAgIGNoZWNrRHJhZ0xpc3RlbmVycyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlY3Qgb2JqZWN0IG9mIHRoaXMgbWFnbmV0LlxuICAgKi9cbiAgZ2V0IG1hZ25ldFJlY3QoKTogRE9NUmVjdCB7XG4gICAgaWYgKCF0aGlzLnJlY3RDYWNoZSkge1xuICAgICAgdGhpcy5yZWN0Q2FjaGUgPSBnZXRSZWN0KHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlY3RDYWNoZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHJlY3Qgb2JqZWN0IG9mIHRoaXMgbWFnbmV0LlxuICAgKi9cbiAgcmVzZXRNYWduZXRSZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01vdmluZykge1xuICAgICAgdGhpcy5yZWN0Q2FjaGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBhY2sgb2JqZWN0IG9mIHBhcmVudCBpZiBleGlzdGluZy5cbiAgICovXG4gIGdldCBwYXJlbnRQYWNrKCk6IFBhY2sge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuXG4gICAgaWYgKCF0aGlzLnBhcmVudFBhY2tDYWNoZSkge1xuICAgICAgdGhpcy5wYXJlbnRQYWNrQ2FjaGUgPSBnZXRQYWNrKHBhcmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyZW50UGFja0NhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgcGFjayBvYmplY3Qgb2YgdGhlIHBhcmVudCBvZiBtYWduZXQuXG4gICAqL1xuICByZXNldFBhcmVudFBhY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTW92aW5nKSB7XG4gICAgICB0aGlzLnBhcmVudFBhY2tDYWNoZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFjayBvYmplY3RzIG9mIHRhcmdldCBtYWduZXRzLlxuICAgKi9cbiAgZ2V0IHRhcmdldE1hZ25ldFBhY2tzKCk6IFBhY2tbXSB7XG4gICAgaWYgKCF0aGlzLnRhcmdldE1hZ25ldFBhY2tzQ2FjaGUpIHtcbiAgICAgIHRoaXMudGFyZ2V0TWFnbmV0UGFja3NDYWNoZSA9IHRoaXMuZ2V0QXR0cmFjdGFibGVNYWduZXRzKClcbiAgICAgICAgLm1hcCgodGFyZ2V0KSA9PiBnZXRQYWNrKHRhcmdldCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRhcmdldE1hZ25ldFBhY2tzQ2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBwYWNrIG9iamVjdHMgb2YgdGFyZ2V0IG1hZ25ldHMuXG4gICAqL1xuICByZXNldFRhcmdldE1hZ25ldFBhY2tzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01vdmluZykge1xuICAgICAgdGhpcy50YXJnZXRNYWduZXRQYWNrc0NhY2hlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBvdGhlciBtYWduZXQgZWxlbWVudHMuXG4gICAqL1xuICBnZXRPdGhlck1hZ25ldHMoKTogTWFnbmV0W10ge1xuICAgIHJldHVybiAoQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG5vZGVOYW1lKSkgYXMgTWFnbmV0W10pXG4gICAgICAuZmlsdGVyKChtYWduZXQpID0+IG1hZ25ldCAhPT0gdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhdHRyYWN0YWJsZSBtYWduZXQgZWxlbWVudHMuXG4gICAqL1xuICBnZXRBdHRyYWN0YWJsZU1hZ25ldHMoKTogTWFnbmV0W10ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMudW5hdHRyYWN0YWJsZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ3JvdXAgfSA9IHRoaXM7XG4gICAgY29uc3QgaGFzR3JvdXAgPSBncm91cCAhPT0gbnVsbDtcbiAgICBjb25zdCBub25EaXNhYmxlZFNlbGVjdG9yID0gYDpub3QoWyR7QXR0cmlidXRlLmRpc2FibGVkfV0pYDtcbiAgICBjb25zdCBub25VbmF0dHJhY3RhYmxlU2VsZWN0b3IgPSBgOm5vdChbJHtBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZX1dKWA7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgJHtub2RlTmFtZX0ke25vbkRpc2FibGVkU2VsZWN0b3J9JHtub25VbmF0dHJhY3RhYmxlU2VsZWN0b3J9YDtcbiAgICBjb25zdCBtYWduZXRzID0gKEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpIGFzIE1hZ25ldFtdKVxuICAgICAgLmZpbHRlcigobWFnbmV0KSA9PiAoXG4gICAgICAgIG1hZ25ldCAhPT0gdGhpc1xuICAgICAgICAmJiAhdGhpcy5jb250YWlucyhtYWduZXQpXG4gICAgICAgICYmIChoYXNHcm91cCA/IGdyb3VwID09PSBtYWduZXQuZ3JvdXAgOiB0cnVlKVxuICAgICAgKSk7XG5cbiAgICByZXR1cm4gbWFnbmV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc3RhbmNlIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gICAqIGRpc3RhbmNlIHdvdWxkIG5vdCBiZSBsaXN0ZWQgb24gdGhlIGF0dHJhY3Rpb24gcmVzdWx0LlxuICAgKi9cbiAganVkZ2VNYWduZXREaXN0YW5jZSguLi5bXG4gICAgZGlzdGFuY2UsXG4gICAgb3B0aW9ucyA9IHt9LFxuICBdOiBQYXJhbWV0ZXJzPHR5cGVvZiBqdWRnZURpc3RhbmNlPikge1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSA9IHRoaXMuYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MgPSB0aGlzLmFsaWduVG9zLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIGp1ZGdlRGlzdGFuY2UoZGlzdGFuY2UsIHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1lIGFzIC5qdWRnZU1hZ25ldERpc2FuY2UgYnV0IGNvbnNpZGVyIGEgd3JhcHBlciBlbGVtZW50LlxuICAgKi9cbiAganVkZ2VNYWduZXREaXN0YW5jZUluUGFyZW50KC4uLltcbiAgICBkaXN0YW5jZSxcbiAgICBvcHRpb25zID0ge30sXG4gIF06IFBhcmFtZXRlcnM8dHlwZW9mIGp1ZGdlRGlzdGFuY2VJblBhcmVudD4pIHtcbiAgICBjb25zdCB7XG4gICAgICBhdHRyYWN0RGlzdGFuY2UgPSB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zID0gdGhpcy5hbGlnblRvcyxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSA9IHRoaXMuanVkZ2VNYWduZXREaXN0YW5jZSxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudCA/PyB0aGlzLnBhcmVudFBhY2s7XG5cbiAgICByZXR1cm4ganVkZ2VEaXN0YW5jZUluUGFyZW50KGRpc3RhbmNlLCB7XG4gICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyxcbiAgICAgIHBhcmVudCxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGF0dHJhY3Rpb24gcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZSB0aGVcbiAgICogZGlzdGFuY2UgcmVzdWx0cyBvZiBhdHRyYWN0aW9uIHdvdWxkIG5vdCBiZSBsaXN0ZWQgb24gdGhlIHJlc3VsdCBvZlxuICAgKiBhdHRyYWN0aW9ucy5cbiAgICovXG4gIGp1ZGdlTWFnbmV0QXR0cmFjdGlvbiA9IGp1ZGdlQXR0cmFjdGlvblxuXG4gIC8qKlxuICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2Zmc2V0IG9mIHBhY2sgcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZVxuICAqIHRoZSBtYWduZXQgd291bGQgbm90IGJlIGFwcGxpZWQgdGhlIG1vdmVtZW50LlxuICAqL1xuICBqdWRnZU1hZ25ldE1vdmVtZW50ID0ganVkZ2VNb3ZlbWVudFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRpc3RhbmNlIHZhbHVlIHRvIHRhcmdldCBvbiBzcGVjaWZpYyBhbGlnbm1lbnQuXG4gICAqL1xuICByYXdEaXN0YW5jZVRvKFxuICAgIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICAgIGFsaWdubWVudDogQWxpZ25tZW50LFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdCh0aGlzKTtcbiAgICBjb25zdCB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuXG4gICAgcmV0dXJuIHJhd0Rpc3RhbmNlVG8oc291cmNlUmVjdCwgdGFyZ2V0UmVjdCwgYWxpZ25tZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRpc3RhbmNlIG9iamVjdCB0byB0YXJnZXQgb24gYWxpZ25tZW50LlxuICAgKi9cbiAgZGlzdGFuY2VUbyhcbiAgICB0YXJnZXQ6IFJlY3RhYmxlIHwgUGFjayxcbiAgICBhbGlnbm1lbnQ6IEFsaWdubWVudCxcbiAgKSB7XG4gICAgcmV0dXJuIGRpc3RhbmNlVG8odGhpcywgdGFyZ2V0LCBhbGlnbm1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVzdWx0IG9mIGF0dHJhY3Rpb25zIHRvIHRhcmdldCBvbiBhbGlnbm1lbnRzLlxuICAgKi9cbiAgYXR0cmFjdGlvblRvKFxuICAgIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICAgIG9wdGlvbnM6IFNpbmdsZUF0dHJhY3Rpb25Ub09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXR0cmFjdERpc3RhbmNlID0gdGhpcy5hdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyA9IHRoaXMuYWxpZ25Ub3MsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIHNpbmdsZUF0dHJhY3Rpb25UbyhcbiAgICAgIHRoaXMsXG4gICAgICB0YXJnZXQsXG4gICAgICB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlc3VsdCBvZiBhdHRyYWN0aW9ucyB0byBwYXJlbnQgb24gYWxpZ25tZW50cy5cbiAgICovXG4gIGF0dHJhY3Rpb25Ub1BhcmVudChcbiAgICBvcHRpb25zOiBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zID0ge30sXG4gICkge1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSA9IHRoaXMuYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MgPSB0aGlzLmFsaWduVG9QYXJlbnRzLFxuICAgICAgYWxpZ25tZW50cyxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSA9IHRoaXMuanVkZ2VNYWduZXREaXN0YW5jZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBzaW5nbGVBdHRyYWN0aW9uVG8oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5wYXJlbnRQYWNrLFxuICAgICAge1xuICAgICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICAgIGFsaWduVG9zLFxuICAgICAgICBhbGlnbm1lbnRzLFxuICAgICAgICBvbkp1ZGdlRGlzdGFuY2UsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0cyBvbiBhbGlnbm1lbnRzLlxuICAgKi9cbiAgbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgIHRhcmdldHM6IChSZWN0YWJsZSB8IFBhY2spW10sXG4gICAgb3B0aW9uczogTXVsdGlBdHRyYWN0aW9uc1RvT3B0aW9ucyAmIHtcbiAgICAgIGFsaWduVG9QYXJlbnRzPzogQWxpZ25Ub1BhcmVudFtdO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXR0cmFjdERpc3RhbmNlID0gdGhpcy5hdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyA9IHRoaXMuYWxpZ25Ub3MsXG4gICAgICBhbGlnblRvUGFyZW50cyA9IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgICBvbkp1ZGdlQXR0cmFjdGlvbiA9IHRoaXMuanVkZ2VNYWduZXRBdHRyYWN0aW9uLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBhcmVudEF0dHJhY3Rpb24gPSBNYWduZXQucHJvdG90eXBlLmF0dHJhY3Rpb25Ub1BhcmVudC5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgIHtcbiAgICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgICBhbGlnblRvczogYWxpZ25Ub1BhcmVudHMsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgICAgdGhpcyxcbiAgICAgIHRhcmdldHMsXG4gICAgICB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgb25KdWRnZUF0dHJhY3Rpb24sXG4gICAgICAgIGF0dHJhY3Rpb25CZXN0OiBwYXJlbnRBdHRyYWN0aW9uPy5iZXN0LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmluYWwgYXZhaWxhYmxlIHBvc2l0aW9uIGFuZCBhdHRyYWN0aW9uIG9uIHNwZWNpZmljIHBvc2l0aW9uLlxuICAgKi9cbiAgZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgcG9zaXRpb246IERPTVBvaW50LFxuICAgIG9wdGlvbnM/OiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMsXG4gICk6IFJldHVyblR5cGU8dHlwZW9mIGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uPlxuXG4gIGdldE1hZ25ldEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0aW9ucz86IEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uT3B0aW9ucyxcbiAgKTogUmV0dXJuVHlwZTx0eXBlb2YgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24+XG5cbiAgZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb248QTAgZXh0ZW5kcyBET01Qb2ludCB8IG51bWJlcj4oXG4gICAgYXJnMDogQTAsXG4gICAgYXJnMT86IEEwIGV4dGVuZHMgRE9NUG9pbnQgPyBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMgOiBudW1iZXIsXG4gICAgYXJnMj86IEEwIGV4dGVuZHMgRE9NUG9pbnQgPyB1bmRlZmluZWQgOiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gY3JlYXRlUG9pbnQoYXJnMCBhcyBudW1iZXIsIGFyZzEgYXMgbnVtYmVyKTtcbiAgICBjb25zdCBvcHRpb25zID0gKFxuICAgICAgKGFyZzAgaW5zdGFuY2VvZiBET01Qb2ludCA/IGFyZzEgOiBhcmcyKSA/PyB7fVxuICAgICkgYXMgQXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb25PcHRpb25zO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5tYWduZXRSZWN0O1xuICAgIGNvbnN0IHNvdXJjZVJlY3QgPSBjcmVhdGVSZWN0KFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICApO1xuICAgIGNvbnN0IHNvdXJjZVBhY2sgPSBuZXcgUGFjayh0aGlzLCBzb3VyY2VSZWN0KTtcbiAgICBjb25zdCB7XG4gICAgICBpZ25vcmVFdmVudCxcbiAgICAgIHVuYXR0cmFjdGFibGUgPSB0aGlzLnVuYXR0cmFjdGFibGUsXG4gICAgICBhdHRyYWN0RGlzdGFuY2UgPSB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zID0gdGhpcy5hbGlnblRvcyxcbiAgICAgIGFsaWdubWVudHMsXG4gICAgICBhbGlnblRvUGFyZW50cyA9IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBjcm9zc1ByZXZlbnRzID0gdGhpcy5jcm9zc1ByZXZlbnRzLFxuICAgICAgcGFyZW50UGFjayA9IHRoaXMucGFyZW50UGFjayxcbiAgICAgIGxhc3RBdHRyYWN0aW9uQmVzdCA9IHRoaXMubGFzdEF0dHJhY3Rpb25CZXN0LFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgICAgb25KdWRnZURpc3RhbmNlSW5QYXJlbnQgPSB0aGlzLmp1ZGdlTWFnbmV0RGlzdGFuY2VJblBhcmVudCxcbiAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uID0gdGhpcy5qdWRnZU1hZ25ldEF0dHJhY3Rpb24sXG4gICAgICBvbkp1ZGdlTW92ZW1lbnQgPSB0aGlzLmp1ZGdlTWFnbmV0TW92ZW1lbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcmVzdWx0ID0gYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgICBzb3VyY2VQYWNrLFxuICAgICAgdGhpcy50YXJnZXRNYWduZXRQYWNrcyxcbiAgICAgIHtcbiAgICAgICAgaWdub3JlRXZlbnQsXG4gICAgICAgIHVuYXR0cmFjdGFibGUsXG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIGFsaWduVG9QYXJlbnRzLFxuICAgICAgICBjcm9zc1ByZXZlbnRzLFxuICAgICAgICBwYXJlbnRQYWNrLFxuICAgICAgICBsYXN0QXR0cmFjdGlvbkJlc3QsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlSW5QYXJlbnQsXG4gICAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uLFxuICAgICAgICBvbkp1ZGdlTW92ZW1lbnQsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLnJlc2V0TWFnbmV0UmVjdCgpO1xuICAgIHRoaXMucmVzZXRQYXJlbnRQYWNrKCk7XG4gICAgdGhpcy5yZXNldFRhcmdldE1hZ25ldFBhY2tzKCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwb2ludCBvYmplY3Qgb2YgbWFnbmV0IG9mZnNldC5cbiAgICovXG4gIGdldCBsYXN0TWFnbmV0T2Zmc2V0KCk6IERPTVBvaW50IHtcbiAgICBjb25zdCB7IG9mZnNldFVuaXQsIGxhc3RPZmZzZXQgfSA9IHRoaXM7XG5cbiAgICBzd2l0Y2ggKG9mZnNldFVuaXQpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlIE9mZnNldFVuaXQucGl4ZWw6XG4gICAgICAgIHJldHVybiBjcmVhdGVQb2ludChsYXN0T2Zmc2V0KTtcblxuICAgICAgY2FzZSBPZmZzZXRVbml0LnBlcmNlbnRhZ2U6IHtcbiAgICAgICAgY29uc3QgeyBvZmZzZXRQYXJlbnQgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSBjcmVhdGVSZWN0KG9mZnNldFBhcmVudCA/PyBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGNyZWF0ZVBvaW50KFxuICAgICAgICAgIGxhc3RPZmZzZXQueCAvIHBhcmVudFJlY3Qud2lkdGgsXG4gICAgICAgICAgbGFzdE9mZnNldC55IC8gcGFyZW50UmVjdC5oZWlnaHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBvZmZzZXQgb2YgbWFnbmV0IG1vdmVtZW50LlxuICAgKi9cbiAgcmVzZXRNYWduZXRPZmZzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShTdHlsZS5vZmZzZXRYKTtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KFN0eWxlLm9mZnNldFkpO1xuICAgIHRoaXMubGFzdE9mZnNldCA9IGNyZWF0ZVBvaW50KDAsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZnNldHMgbWFnbmV0IG1vdmVtZW50IHdpdGggKGR4LCBkeSkuXG4gICAqL1xuICBzZXRNYWduZXRPZmZzZXQoZHg6IG51bWJlciwgZHk6IG51bWJlcik6IHZvaWRcblxuICBzZXRNYWduZXRPZmZzZXQob2Zmc2V0PzogRE9NUG9pbnQpOiB2b2lkXG5cbiAgc2V0TWFnbmV0T2Zmc2V0PERYIGV4dGVuZHMgRE9NUG9pbnQgfCBudW1iZXI+KFxuICAgIGR4OiBEWCA9IHRoaXMubGFzdE9mZnNldCBhcyBEWCxcbiAgICBkeT86IERYIGV4dGVuZHMgRE9NUG9pbnQgPyB1bmRlZmluZWQgOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9mZnNldCA9IGNyZWF0ZVBvaW50KGR4IGFzIG51bWJlciwgZHkgYXMgbnVtYmVyKTtcbiAgICBjb25zdCB7IG9mZnNldFVuaXQgfSA9IHRoaXM7XG5cbiAgICBzd2l0Y2ggKG9mZnNldFVuaXQpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlIE9mZnNldFVuaXQucGl4ZWw6XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoU3R5bGUub2Zmc2V0WCwgYCR7b2Zmc2V0Lnh9cHhgKTtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShTdHlsZS5vZmZzZXRZLCBgJHtvZmZzZXQueX1weGApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBPZmZzZXRVbml0LnBlcmNlbnRhZ2U6IHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgPz8gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gZ2xvYmFsVGhpcy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgICAgIGNvbnN0IHsgYm94U2l6aW5nLCB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZXM7XG4gICAgICAgIGxldCBmaW5hbFdpZHRoID0gcGFyc2VGbG9hdCh3aWR0aCk7XG4gICAgICAgIGxldCBmaW5hbEhlaWdodCA9IHBhcnNlRmxvYXQoaGVpZ2h0KTtcblxuICAgICAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYWRkaW5nVG9wLCBwYWRkaW5nUmlnaHQsIHBhZGRpbmdCb3R0b20sIHBhZGRpbmdMZWZ0LFxuICAgICAgICAgICAgYm9yZGVyVG9wV2lkdGgsIGJvcmRlclJpZ2h0V2lkdGgsIGJvcmRlckJvdHRvbVdpZHRoLCBib3JkZXJMZWZ0V2lkdGgsXG4gICAgICAgICAgfSA9IHN0eWxlcztcbiAgICAgICAgICBjb25zdCB0b3AgPSBwYXJzZUZsb2F0KHBhZGRpbmdUb3ApO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VGbG9hdChwYWRkaW5nUmlnaHQpO1xuICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IHBhcnNlRmxvYXQocGFkZGluZ0JvdHRvbSk7XG4gICAgICAgICAgY29uc3QgbGVmdCA9IHBhcnNlRmxvYXQocGFkZGluZ0xlZnQpO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclRvcCA9IHBhcnNlRmxvYXQoYm9yZGVyVG9wV2lkdGgpO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclJpZ2h0ID0gcGFyc2VGbG9hdChib3JkZXJSaWdodFdpZHRoKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJCb3R0b20gPSBwYXJzZUZsb2F0KGJvcmRlckJvdHRvbVdpZHRoKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJMZWZ0ID0gcGFyc2VGbG9hdChib3JkZXJMZWZ0V2lkdGgpO1xuXG4gICAgICAgICAgZmluYWxXaWR0aCAtPSByaWdodCArIGxlZnQgKyBib3JkZXJSaWdodCArIGJvcmRlckxlZnQ7XG4gICAgICAgICAgZmluYWxIZWlnaHQgLT0gdG9wICsgYm90dG9tICsgYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpdmVPZmZzZXQgPSBjcmVhdGVQb2ludChcbiAgICAgICAgICBvZmZzZXQueCAvIGZpbmFsV2lkdGgsXG4gICAgICAgICAgb2Zmc2V0LnkgLyBmaW5hbEhlaWdodCxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KFN0eWxlLm9mZnNldFgsIGAkezEwMCAqIHJlbGF0aXZlT2Zmc2V0Lnh9JWApO1xuICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KFN0eWxlLm9mZnNldFksIGAkezEwMCAqIHJlbGF0aXZlT2Zmc2V0Lnl9JWApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxhc3RPZmZzZXQgPSBjcmVhdGVQb2ludChvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIG1hZ25ldCBtb3ZlbWVudCB0byAoeCwgeSkuXG4gICAqL1xuICBzZXRNYWduZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWRcblxuICBzZXRNYWduZXRQb3NpdGlvbihwb3NpdGlvbj86IERPTVBvaW50KTogdm9pZFxuXG4gIHNldE1hZ25ldFBvc2l0aW9uPFggZXh0ZW5kcyBET01Qb2ludCB8IG51bWJlcj4oXG4gICAgeDogWCA9IGNyZWF0ZVBvaW50KHRoaXMubWFnbmV0UmVjdCkgYXMgWCxcbiAgICB5PzogWCBleHRlbmRzIERPTVBvaW50ID8gdW5kZWZpbmVkIDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGNyZWF0ZVBvaW50KHggYXMgbnVtYmVyLCB5IGFzIG51bWJlcik7XG4gICAgY29uc3Qge1xuICAgICAgbGFzdE9mZnNldCxcbiAgICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qgb3JpZ2luID0gY3JlYXRlUG9pbnQoXG4gICAgICBzb3VyY2VSZWN0LnggLSBsYXN0T2Zmc2V0LngsXG4gICAgICBzb3VyY2VSZWN0LnkgLSBsYXN0T2Zmc2V0LnksXG4gICAgKTtcblxuICAgIHRoaXMuc2V0TWFnbmV0T2Zmc2V0KFxuICAgICAgcG9zaXRpb24ueCAtIG9yaWdpbi54LFxuICAgICAgcG9zaXRpb24ueSAtIG9yaWdpbi55LFxuICAgICk7XG4gICAgdGhpcy5yZXNldE1hZ25ldFJlY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBiZXN0IGF0dHJhY3Rpb24gb2YgbGFzdCBtb3ZlLlxuICAgKi9cbiAgZ2V0IGJlc3RBdHRyYWN0aW9uKCk6IEF0dHJhY3Rpb25CZXN0IHtcbiAgICBjb25zdCB7IGxhc3RBdHRyYWN0aW9uQmVzdCB9ID0gdGhpcztcbiAgICBjb25zdCB4ID0gbGFzdEF0dHJhY3Rpb25CZXN0Py54O1xuICAgIGNvbnN0IHkgPSBsYXN0QXR0cmFjdGlvbkJlc3Q/Lnk7XG4gICAgY29uc3QgYXR0cmFjdGlvbkJlc3Q6IEF0dHJhY3Rpb25CZXN0ID0ge307XG5cbiAgICBpZiAoeCkge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIHRhcmdldCB9ID0geDtcblxuICAgICAgYXR0cmFjdGlvbkJlc3QueCA9IHtcbiAgICAgICAgLi4ueCxcbiAgICAgICAgc291cmNlOiBuZXcgUGFjayhzb3VyY2UucmF3LCBjcmVhdGVSZWN0KHNvdXJjZS5yZWN0KSksXG4gICAgICAgIHRhcmdldDogbmV3IFBhY2sodGFyZ2V0LnJhdywgY3JlYXRlUmVjdCh0YXJnZXQucmVjdCkpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmFjdGlvbkJlc3QueCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoeSkge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIHRhcmdldCB9ID0geTtcblxuICAgICAgYXR0cmFjdGlvbkJlc3QueSA9IHtcbiAgICAgICAgLi4ueSxcbiAgICAgICAgc291cmNlOiBuZXcgUGFjayhzb3VyY2UucmF3LCBjcmVhdGVSZWN0KHNvdXJjZS5yZWN0KSksXG4gICAgICAgIHRhcmdldDogbmV3IFBhY2sodGFyZ2V0LnJhdywgY3JlYXRlUmVjdCh0YXJnZXQucmVjdCkpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmFjdGlvbkJlc3QueSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmFjdGlvbkJlc3Q7XG4gIH1cbn1cblxucmVnaXN0ZXJFbGVtZW50KE1hZ25ldCwgbm9kZU5hbWUpO1xuXG5leHBvcnQgZGVmYXVsdCBNYWduZXQ7XG4iLCJpbXBvcnQgeyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgRGlzdGFuY2UgZnJvbSAnLi4vdHlwZXMvRGlzdGFuY2UnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuLi92YWx1ZXMvYWxpZ25tZW50JztcbmltcG9ydCBBbGlnblRvLCB7IEFsaWduVG9QYXJlbnQgfSBmcm9tICcuLi92YWx1ZXMvYWxpZ25Ubyc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp1ZGdlRGlzdGFuY2VPcHRpb25zIHtcbiAgYXR0cmFjdERpc3RhbmNlPzogbnVtYmVyO1xuICBhbGlnblRvcz86IChBbGlnblRvIHwgQWxpZ25Ub1BhcmVudClbXTtcbn1cblxuZXhwb3J0IHR5cGUgT25KdWRnZURpc3RhbmNlID0gKFxuICBkaXN0YW5jZTogRGlzdGFuY2UsXG4gIG9wdGlvbnM/OiBKdWRnZURpc3RhbmNlT3B0aW9ucyxcbikgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc3RhbmNlIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gKiBkaXN0YW5jZSB3b3VsZCBub3QgYmUgb24gdGhlIHJlc3VsdCBsaXN0IG9mIGF0dHJhY3Rpb24uXG4gKi9cbmNvbnN0IGp1ZGdlRGlzdGFuY2U6IE9uSnVkZ2VEaXN0YW5jZSA9IGZ1bmN0aW9uIGp1ZGdlRGlzdGFuY2UoXG4gIGRpc3RhbmNlLFxuICBvcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGF0dHJhY3REaXN0YW5jZSA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV0sXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChkaXN0YW5jZS5hYnNEaXN0YW5jZSA+IGF0dHJhY3REaXN0YW5jZSkge1xuICAgIC8vIHRvbyBmYXIsIG5vIGNvbnNpZGVyXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGFsaWduVG9zID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub10sXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChhbGlnblRvcy5pbmNsdWRlcyhBbGlnblRvLmV4dGVuZCkpIHtcbiAgICAvLyBhbGlnbiB0byBleHRlbmRlZCBlZGdlc1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHNvdXJjZToge1xuICAgICAgcmVjdDogc291cmNlUmVjdCxcbiAgICB9LFxuICAgIHRhcmdldDoge1xuICAgICAgcmVjdDogdGFyZ2V0UmVjdCxcbiAgICB9LFxuICB9ID0gZGlzdGFuY2U7XG5cbiAgLy8gb25seSBwYXNzIHdoZW4gc291cmNlIG92ZXJsYXBzIHRhcmdldFxuICBzd2l0Y2ggKGRpc3RhbmNlLmFsaWdubWVudCkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlIEFsaWdubWVudC50b3BUb1RvcDpcbiAgICBjYXNlIEFsaWdubWVudC50b3BUb0JvdHRvbTpcbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub1RvcDpcbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbTpcbiAgICBjYXNlIEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyOlxuICAgICAgaWYgKFxuICAgICAgICAoc291cmNlUmVjdC5yaWdodCArIGF0dHJhY3REaXN0YW5jZSkgPCB0YXJnZXRSZWN0LmxlZnRcbiAgICAgICAgfHwgKHNvdXJjZVJlY3QubGVmdCAtIGF0dHJhY3REaXN0YW5jZSkgPiB0YXJnZXRSZWN0LnJpZ2h0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9SaWdodDpcbiAgICBjYXNlIEFsaWdubWVudC5yaWdodFRvTGVmdDpcbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9SaWdodDpcbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9MZWZ0OlxuICAgIGNhc2UgQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXI6XG4gICAgICBpZiAoXG4gICAgICAgIChzb3VyY2VSZWN0LnRvcCAtIGF0dHJhY3REaXN0YW5jZSkgPiB0YXJnZXRSZWN0LmJvdHRvbVxuICAgICAgICB8fCAoc291cmNlUmVjdC5ib3R0b20gKyBhdHRyYWN0RGlzdGFuY2UpIDwgdGFyZ2V0UmVjdC50b3BcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZURpc3RhbmNlO1xuIiwiaW1wb3J0IERpc3RhbmNlIGZyb20gJy4uL3R5cGVzL0Rpc3RhbmNlJztcbmltcG9ydCBQYWNrLCB7IFJlY3RhYmxlIH0gZnJvbSAnLi4vdHlwZXMvUGFjayc7XG5pbXBvcnQgeyBnZXRSZWN0IH0gZnJvbSAnLi4vdHlwZXMvUmVjdCc7XG5pbXBvcnQgeyByZXR1cm5UcnVlIH0gZnJvbSAnLi4vdXRpbHMvcmV0dXJuVHJ1ZUZhbHNlJztcbmltcG9ydCB7IEp1ZGdlRGlzdGFuY2VPcHRpb25zLCBPbkp1ZGdlRGlzdGFuY2UgfSBmcm9tICcuL2p1ZGdlRGlzdGFuY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp1ZGdlRGlzdGFuY2VJblBhcmVudE9wdGlvbnMgZXh0ZW5kcyBKdWRnZURpc3RhbmNlT3B0aW9ucyB7XG4gIHBhcmVudD86IFBhY2sgfCBSZWN0YWJsZSB8IG51bGw7XG4gIG9uSnVkZ2VEaXN0YW5jZT86IE9uSnVkZ2VEaXN0YW5jZTtcbn1cblxuZXhwb3J0IHR5cGUgT25KdWRnZURpc3RhbmNlSW5QYXJlbnQgPSAoXG4gIGRpc3RhbmNlOiBEaXN0YW5jZSxcbiAgb3B0aW9ucz86IEp1ZGdlRGlzdGFuY2VJblBhcmVudE9wdGlvbnMsXG4pID0+IGJvb2xlYW47XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBkaXN0YW5jZSBwYXNzZXMgdGhlIGp1ZGdlbWVudC4gT3RoZXJ3aXNlIHRoZVxuICogZGlzdGFuY2Ugd291bGQgbm90IGJlIG9uIHRoZSByZXN1bHQgbGlzdCBvZiBhdHRyYWN0aW9uLlxuICovXG5jb25zdCBqdWRnZURpc3RhbmNlSW5QYXJlbnQ6IE9uSnVkZ2VEaXN0YW5jZUluUGFyZW50ID0gZnVuY3Rpb24ganVkZ2VEaXN0YW5jZUluUGFyZW50KFxuICBkaXN0YW5jZSxcbiAgb3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBvbkp1ZGdlRGlzdGFuY2UgPSByZXR1cm5UcnVlLFxuICAgIC4uLmp1ZGdlRGlzdGFuY2VPcHRpb25zXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwYXNzSnVkZ2VEaXN0YW5jZSA9IG9uSnVkZ2VEaXN0YW5jZShkaXN0YW5jZSwganVkZ2VEaXN0YW5jZU9wdGlvbnMpO1xuXG4gIGlmICghcGFzc0p1ZGdlRGlzdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSWYgb3B0aW9ucy5wYXJlbnQgaXMgYG51bGxgLCB1c2UgYGRvY3VtZW50LmJvZHlgIGluc3RlYWQuXG4gICAqL1xuICBjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudCA/PyBkb2N1bWVudC5ib2R5O1xuXG4gIGNvbnN0IHBhcmVudFJlY3QgPSBnZXRSZWN0KHBhcmVudCk7XG4gIGNvbnN0IHsgYWxpZ25tZW50LCByYXdEaXN0YW5jZSwgc291cmNlIH0gPSBkaXN0YW5jZTtcbiAgY29uc3Qge1xuICAgIHJlY3Q6IHNvdXJjZVJlY3QsXG4gIH0gPSBzb3VyY2U7XG5cbiAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICd0b3BUb1RvcCc6XG4gICAgY2FzZSAndG9wVG9Cb3R0b20nOlxuICAgIGNhc2UgJ2JvdHRvbVRvVG9wJzpcbiAgICBjYXNlICdib3R0b21Ub0JvdHRvbSc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzb3VyY2VSZWN0LnRvcCArIHJhd0Rpc3RhbmNlID49IHBhcmVudFJlY3QudG9wXG4gICAgICAgICYmIHNvdXJjZVJlY3QuYm90dG9tICsgcmF3RGlzdGFuY2UgPD0gcGFyZW50UmVjdC5ib3R0b21cbiAgICAgICk7XG5cbiAgICBjYXNlICdyaWdodFRvUmlnaHQnOlxuICAgIGNhc2UgJ3JpZ2h0VG9MZWZ0JzpcbiAgICBjYXNlICdsZWZ0VG9SaWdodCc6XG4gICAgY2FzZSAnbGVmdFRvTGVmdCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzb3VyY2VSZWN0LnJpZ2h0ICsgcmF3RGlzdGFuY2UgPD0gcGFyZW50UmVjdC5yaWdodFxuICAgICAgICAmJiBzb3VyY2VSZWN0LmxlZnQgKyByYXdEaXN0YW5jZSA+PSBwYXJlbnRSZWN0LmxlZnRcbiAgICAgICk7XG5cbiAgICBjYXNlICd4Q2VudGVyVG9YQ2VudGVyJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNvdXJjZVJlY3QucmlnaHQgKyByYXdEaXN0YW5jZSA8PSBwYXJlbnRSZWN0LnJpZ2h0XG4gICAgICAgICYmIHNvdXJjZVJlY3QubGVmdCArIHJhd0Rpc3RhbmNlID49IHBhcmVudFJlY3QubGVmdFxuICAgICAgKTtcblxuICAgIGNhc2UgJ3lDZW50ZXJUb1lDZW50ZXInOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgc291cmNlUmVjdC50b3AgKyByYXdEaXN0YW5jZSA+PSBwYXJlbnRSZWN0LnRvcFxuICAgICAgICAmJiBzb3VyY2VSZWN0LmJvdHRvbSArIHJhd0Rpc3RhbmNlIDw9IHBhcmVudFJlY3QuYm90dG9tXG4gICAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZURpc3RhbmNlSW5QYXJlbnQ7XG4iLCJpbXBvcnQgRGlzdGFuY2UgZnJvbSAnLi4vdHlwZXMvRGlzdGFuY2UnO1xuaW1wb3J0IFBhY2ssIHsgZ2V0UGFjaywgUmVjdGFibGUgfSBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCB7IGdldFJlY3QgfSBmcm9tICcuLi90eXBlcy9SZWN0JztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL3V0aWxzL251bWVyaWMnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuLi92YWx1ZXMvYWxpZ25tZW50JztcbmltcG9ydCByYXdEaXN0YW5jZVRvIGZyb20gJy4vcmF3RGlzdGFuY2VUbyc7XG5cbi8qKlxuICogUmV0dXJucyBkaXN0YW5jZSBvYmplY3QgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IG9uIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gZGlzdGFuY2VUbyhcbiAgc291cmNlOiBSZWN0YWJsZSB8IFBhY2ssXG4gIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICBhbGlnbm1lbnQ6IEFsaWdubWVudCxcbik6IERpc3RhbmNlIHtcbiAgY29uc3Qgc291cmNlUGFjayA9IGdldFBhY2soc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UGFjayA9IGdldFBhY2sodGFyZ2V0KTtcbiAgY29uc3Qgc291cmNlUmVjdCA9IGdldFJlY3Qoc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgY29uc3QgcmF3RGlzdGFuY2UgPSByYXdEaXN0YW5jZVRvKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QsIGFsaWdubWVudCk7XG4gIGNvbnN0IGFic0Rpc3RhbmNlID0gYWJzKHJhd0Rpc3RhbmNlKTtcblxuICByZXR1cm4ge1xuICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICB0YXJnZXQ6IHRhcmdldFBhY2ssXG4gICAgYWxpZ25tZW50LFxuICAgIHJhd0Rpc3RhbmNlLFxuICAgIGFic0Rpc3RhbmNlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXN0YW5jZVRvO1xuIl0sIm5hbWVzIjpbImNyZWF0ZVBvaW50IiwieCIsInkiLCJET01Qb2ludCIsImZyb21Qb2ludCIsIkRPTVJlY3QiLCJnZXRBdHRyYWN0aW9uT2Zmc2V0IiwiYXR0cmFjdGlvbiIsImJlc3QiLCJyYXdEaXN0YW5jZSIsIlNQTElUVEVSIiwiZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUiLCJ2YWx1ZSIsImluZGV4T2JqZWN0IiwidmFsdWVzIiwic3BsaXQiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJmaWx0ZXIiLCJpbmRleCIsImluY2x1ZGVzIiwiZ2V0QXR0cmlidXRlVmFsdWVGcm9tQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwiTm9kZSIsIm5vZGVOYW1lIiwiY3VzdG9tRWxlbWVudHMiLCJnZXQiLCJQcm9taXNlIiwicmVqZWN0IiwiRXJyb3IiLCJkZWZpbmUiLCJ3aGVuRGVmaW5lZCIsIkFsaWdubWVudCIsIkFsaWdubWVudFhzIiwicmlnaHRUb1JpZ2h0IiwicmlnaHRUb0xlZnQiLCJsZWZ0VG9SaWdodCIsImxlZnRUb0xlZnQiLCJ4Q2VudGVyVG9YQ2VudGVyIiwiQWxpZ25tZW50WXMiLCJ0b3BUb1RvcCIsInRvcFRvQm90dG9tIiwiYm90dG9tVG9Ub3AiLCJib3R0b21Ub0JvdHRvbSIsInlDZW50ZXJUb1lDZW50ZXIiLCJBbGlnblRvIiwiQWxpZ25Ub1BhcmVudCIsIkF0dHJpYnV0ZSIsIkNyb3NzUHJldmVudCIsIkV2ZW50IiwiT2Zmc2V0VW5pdCIsImlzTmFOIiwiZ2xvYmFsVGhpcyIsImFicyIsIk1hdGgiLCJ0ZW1wbGF0ZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMiLCJpbm5lckhUTUwiLCJNYWduZXRQYWNrIiwiSFRNTEVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwidGhpcyIsImF0dGFjaFNoYWRvdyIsIm1vZGUiLCJzaGFkb3dSb290IiwiYXBwZW5kIiwiY29udGVudCIsImNsb25lTm9kZSIsIkFMSUdOTUVOVCIsIkFMSUdOX1RPIiwiQUxJR05fVE9fUEFSRU5UIiwiQ1JPU1NfUFJFVkVOVCIsIkVWRU5UIiwic291cmNlIiwiYWxpZ25Ub3MiLCJhbGlnbm1lbnRzIiwicHVzaCIsImRpc2FibGVkIiwidHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZSIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImdyb3VwIiwibGVuZ3RoIiwicGFyZW50TWFnbmV0IiwiZ2V0QXR0cmlidXRlIiwicGFyZW50IiwicGFyZW50RWxlbWVudCIsInBhcmVudEdyb3VwIiwidW5hdHRyYWN0YWJsZSIsInVubW92YWJsZSIsImF0dHJhY3REaXN0YW5jZSIsIk51bWJlciIsIlR5cGVFcnJvciIsIlJhbmdlRXJyb3IiLCJhbGlnblRvUGFyZW50cyIsImdldEFsaWdubWVudHNGcm9tQWxpZ25UbyIsInBhcmVudEFsaWdubWVudHMiLCJjcm9zc1ByZXZlbnRzIiwib2Zmc2V0VW5pdCIsImF0dHJOYW1lIiwicmVnaXN0ZXJFbGVtZW50IiwiY3JlYXRlUmVjdCIsImFyZ3MiLCJXaW5kb3ciLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJEb2N1bWVudCIsImJvZHkiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJFbGVtZW50IiwiUGFjayIsImZyb21SZWN0IiwicmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0IiwiZ2V0UmVjdCIsInJhdyIsImlzUGFjayIsImZyZWV6ZSIsImdldFBhY2siLCJzb3VyY2VSZWN0IiwidGFyZ2V0UmVjdCIsImFsaWdubWVudCIsIkluZmluaXR5IiwicmV0dXJuVHJ1ZSIsInJldHVybkZhbHNlIiwiZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzIiwic291cmNlUmVjdFhDZW50ZXIiLCJ0YXJnZXRSZWN0WENlbnRlciIsImRpc3RhbmNlQmV0d2VlbllDZW50ZXJzT2ZSZWN0cyIsInNvdXJjZVJlY3RZQ2VudGVyIiwidGFyZ2V0UmVjdFlDZW50ZXIiLCJ0YXJnZXRzIiwib3B0aW9ucyIsInNvdXJjZVBhY2siLCJ0YXJnZXRQYWNrcyIsIm1hcCIsInRhcmdldCIsIm9uSnVkZ2VEaXN0YW5jZSIsIm9uSnVkZ2VBdHRyYWN0aW9uIiwiYXR0cmFjdGlvbkJlc3QiLCJzaW5nbGVBdHRyYWN0aW9uT3B0aW9ucyIsInJlZHVjZSIsInRhcmdldFBhY2siLCJzaW5nbGVBdHRyYWN0aW9uIiwiTWFnbmV0IiwiY3VycmVudEJlc3QiLCJyZXN1bHRzIiwiY3VycmVudFJlc3VsdHMiLCJwYXNzSnVkZ2VtZW50IiwiYWJzRGlzdGFuY2UiLCJsYXN0QmVzdFJlY3QiLCJjdXJyZW50RGlmZlkiLCJkaWZmWSIsImdhcCIsImxhc3RSZWN0IiwiY3VycmVudFJlY3QiLCJsYXN0WUJhc2UiLCJjdXJyZW50WUJhc2UiLCJzb3VyY2VZQmFzZSIsImxhc3RZRGlzdGFuY2UiLCJjdXJyZW50RGlmZlgiLCJkaWZmWCIsImxhc3RYQmFzZSIsImN1cnJlbnRYQmFzZSIsInNvdXJjZVhCYXNlIiwibGFzdFhEaXN0YW5jZSIsImRpc3RhbmNlIiwiQm9vbGVhbiIsImFkZEV2ZW50TGlzdGVuZXJzIiwicmVmIiwidHlwZXMiLCJsaXN0ZW5lciIsImZvckVhY2giLCJ0eXBlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRyaWdnZXJFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsInNvdXJjZVJhdyIsImlnbm9yZUV2ZW50IiwicGFyZW50UGFjayIsImxhc3RBdHRyYWN0aW9uQmVzdCIsIm9uSnVkZ2VNb3ZlbWVudCIsImxhc3RCZXN0WCIsImxhc3RCZXN0WSIsImFsaWduVG9QYXJlbnQiLCJrZWVwSW5QYXJlbnQiLCJzb3VyY2VXaWR0aCIsInNvdXJjZUhlaWdodCIsInBhcmVudFJlY3QiLCJzb3VyY2VSYXdSZWN0Iiwic291cmNlSW5QYXJlbnRPZmZzZXQiLCJnZXRPZmZzZXRUb0JlSW5SZWN0Iiwic291cmNlSW5QYXJlbnRSZWN0Iiwic291cmNlSW5QYXJlbnRQYWNrIiwicGFzc0p1ZGdlTW92ZW1lbnQiLCJhdHRyYWN0UmVzdWx0cyIsInVuYXR0cmFjdFJlc3VsdHMiLCJhdHRyYWN0bW92ZVJlc3VsdHMiLCJkaXNwYXRjaFVuYXR0cmFjdEV2ZW50cyIsInNvdXJjZU5leHRSZWN0IiwidW5hdHRyYWN0UmVzdWx0IiwidGFyZ2V0RWxlbSIsInVuYXR0cmFjdGVkRXZlbnREZXRhaWwiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwiZGV0YWlsIiwicG9zaXRpb24iLCJvbkp1ZGdlRGlzdGFuY2VJblBhcmVudCIsInNvdXJjZVJhd1BhY2siLCJzaW5nbGVBdHRyYWN0aW9uVG8iLCJvbkp1ZGdlTXVsdGlEaXN0YW5jZSIsInNvdXJjZUF0dHJhY3Rpb24iLCJtdWx0aUF0dHJhY3Rpb25zVG8iLCJzb3VyY2VBdHRyYWN0aW9uQmVzdCIsInNvdXJjZUF0dHJhY3Rpb25PZmZzZXQiLCJzb3VyY2VBdHRyYWN0aW9uUmVjdCIsInNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldCIsInNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QiLCJjdXJyZW50QmVzdFgiLCJjdXJyZW50QmVzdFkiLCJsYXN0VGFyZ2V0WCIsImxhc3RUYXJnZXRZIiwiY3VycmVudFRhcmdldFgiLCJjdXJyZW50VGFyZ2V0WSIsImRpZmZUYXJnZXRZIiwibGFzdEFsaWdubWVudFgiLCJsYXN0QWxpZ25tZW50WSIsImF0dHJhY3RFdmVudERldGFpbCIsIm5leHRSZWN0IiwidW5hdHRyYWN0RXZlbnREZXRhaWwiLCJhdHRyYWN0bW92ZUV2ZW50RGV0YWlsIiwiYXR0cmFjdFJlc3VsdCIsImF0dHJhY3RlZEV2ZW50RGV0YWlsIiwiYXR0cmFjdG1vdmVSZXN1bHQiLCJhdHRyYWN0ZWRtb3ZlRXZlbnREZXRhaWwiLCJkaXNwYXRjaEF0dHJhY3Rtb3ZlRXZlbnRzIiwiZXZlbnQiLCJjbGllbnRYIiwiY2xpZW50WSIsIkVWRU5UX0RSQUdfU1RBUlQiLCJFVkVOVF9EUkFHX01PVkUiLCJFVkVOVF9EUkFHX0VORCIsInJlc2V0TWFnbmV0Q2FjaGVzIiwibWFnbmV0IiwicmVzZXRNYWduZXRSZWN0IiwicmVzZXRQYXJlbnRQYWNrIiwicmVzZXRUYXJnZXRNYWduZXRQYWNrcyIsIm1vdmVMaXN0ZW5lciIsInN0YXJ0UG9pbnQiLCJzdGFydExhc3RPZmZzZXQiLCJtb3ZlUG9pbnQiLCJtYWduZXRSZWN0IiwidGFyZ2V0TWFnbmV0UGFja3MiLCJqdWRnZU1hZ25ldE1vdmVtZW50IiwiYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24iLCJqdWRnZU1hZ25ldERpc3RhbmNlIiwianVkZ2VNYWduZXREaXN0YW5jZUluUGFyZW50IiwianVkZ2VNYWduZXRBdHRyYWN0aW9uIiwibmV4dFNvdXJjZVBhY2siLCJtb3ZlRXZlbnREZXRhaWwiLCJzZXRNYWduZXRPZmZzZXQiLCJzdGFydExpc3RlbmVyIiwiZ2V0RXZlbnRYWSIsImlzTW92aW5nIiwic3RhcnRFdmVudERldGFpbCIsImxhc3RNb3ZlUG9pbnQiLCJkcmFnTW92ZUhhbmRsZXIiLCJiaW5kIiwibGFzdE9mZnNldCIsImRyYWdNb3ZlTGlzdGVuZXIiLCJldnQiLCJhdHRyaWJ1dGVPYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJkcmFnRW5kTGlzdGVuZXIiLCJzdHlsZSIsInJlbW92ZVByb3BlcnR5IiwiZGlzY29ubmVjdCIsInNldFByb3BlcnR5IiwiRGF0ZSIsIm5vdyIsInByZXZlbnREZWZhdWx0Iiwib2JzZXJ2ZSIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJjaGVja0RyYWdMaXN0ZW5lcnMiLCJyZW1vdmVCYXNpY0RyYWdMaXN0ZW5lcnMiLCJhZGRCYXNpY0RyYWdMaXN0ZW5lcnMiLCJTdHlsZSIsInJlY3RDYWNoZSIsInBhcmVudFBhY2tDYWNoZSIsInRhcmdldE1hZ25ldFBhY2tzQ2FjaGUiLCJnZXRBdHRyYWN0YWJsZU1hZ25ldHMiLCJnZXRPdGhlck1hZ25ldHMiLCJmcm9tIiwicXVlcnlTZWxlY3RvckFsbCIsImhhc0dyb3VwIiwic2VsZWN0b3IiLCJjb250YWlucyIsImp1ZGdlRGlzdGFuY2UiLCJqdWRnZURpc3RhbmNlT3B0aW9ucyIsImp1ZGdlRGlzdGFuY2VJblBhcmVudCIsImp1ZGdlQXR0cmFjdGlvbiIsImp1ZGdlTW92ZW1lbnQiLCJyYXdEaXN0YW5jZVRvIiwiZGlzdGFuY2VUbyIsImF0dHJhY3Rpb25UbyIsImF0dHJhY3Rpb25Ub1BhcmVudCIsInBhcmVudEF0dHJhY3Rpb24iLCJwcm90b3R5cGUiLCJjYWxsIiwiZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24iLCJhcmcwIiwiYXJnMSIsImFyZzIiLCJyZXN1bHQiLCJsYXN0TWFnbmV0T2Zmc2V0Iiwib2Zmc2V0UGFyZW50IiwicmVzZXRNYWduZXRPZmZzZXQiLCJkeCIsImR5Iiwib2Zmc2V0Iiwic3R5bGVzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImJveFNpemluZyIsImZpbmFsV2lkdGgiLCJwYXJzZUZsb2F0IiwiZmluYWxIZWlnaHQiLCJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0IiwiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJMZWZ0V2lkdGgiLCJib3JkZXJUb3AiLCJib3JkZXJSaWdodCIsImJvcmRlckJvdHRvbSIsInJlbGF0aXZlT2Zmc2V0Iiwic2V0TWFnbmV0UG9zaXRpb24iLCJvcmlnaW4iLCJiZXN0QXR0cmFjdGlvbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file + //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LElBQUtuQixFQUFXd0MsRUFBTzdCLGFBR2pEZ0MsRUFBZXBKLE9BQUllLEVBR3JCLEdBQUlkLEVBQUcsQ0FDTCxNQUFNLE9BQUU0RSxFQUFGLE9BQVVvRSxHQUFXaEosRUFFM0JtSixFQUFlbkosRUFBSSxJQUNkQSxFQUNINEUsT0FBUSxJQUFJcUMsRUFBS3JDLEVBQU8rQyxJQUFLbkIsRUFBVzVCLEVBQU91QyxPQUMvQzZCLE9BQVEsSUFBSS9CLEVBQUsrQixFQUFPckIsSUFBS25CLEVBQVd3QyxFQUFPN0IsYUFHakRnQyxFQUFlbkosT0FBSWMsRUFHckIsT0FBT3FJLEdBSVg1QyxFQUFnQmlELEdBQVFoSSxJQUV4QixhIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdHlwZXMvUG9pbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdHlwZXMvQXR0cmFjdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9tdWx0aUF0dHJpYnV0ZVZhbHVlcy50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9yZWdpc3RlckVsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdmFsdWVzL2FsaWdubWVudC50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvYWxpZ25Uby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvYXR0cmlidXRlLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3ZhbHVlcy9jcm9zc1ByZXZlbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdmFsdWVzL2V2ZW50LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3ZhbHVlcy9vZmZzZXRVbml0LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL251bWVyaWMudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvY29yZS50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy90eXBlcy9SZWN0LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3R5cGVzL1BhY2sudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9yYXdEaXN0YW5jZVRvLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL3JldHVyblRydWVGYWxzZS50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9kaXN0YW5jZUJldHdlZW5SZWN0cy50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL211bHRpQXR0cmFjdGlvbnNUby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL3NpbmdsZUF0dHJhY3Rpb25Uby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL2p1ZGdlQXR0cmFjdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL2p1ZGdlTW92ZW1lbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdXRpbHMvZXZlbnRIYW5kbGVyLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL2dldE9mZnNldFRvQmVJblJlY3QudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9hdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9nZXRFdmVudFhZLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL2RyYWdMaXN0ZW5lci50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvc3R5bGUudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvYmxvY2sudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9qdWRnZURpc3RhbmNlLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL21ldGhvZHMvanVkZ2VEaXN0YW5jZUluUGFyZW50LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL21ldGhvZHMvZGlzdGFuY2VUby50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFjaywgeyBSZWN0YWJsZSB9IGZyb20gJy4vUGFjayc7XG5pbXBvcnQgeyBnZXRSZWN0IH0gZnJvbSAnLi9SZWN0JztcblxuaW50ZXJmYWNlIENyZWF0ZVBvaW50IHtcbiAgKHg6IG51bWJlciwgeTogbnVtYmVyKTogRE9NUG9pbnQ7XG4gIChwb2ludDogRE9NUG9pbnQpOiBET01Qb2ludDtcbiAgKHJlY3Q6IERPTVJlY3QpOiBET01Qb2ludDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHBvaW50IG9iamVjdCBmcm9tIGEgcG9pbnQgb3IgKHgsIHkpLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUG9pbnQ6IENyZWF0ZVBvaW50ID0gZnVuY3Rpb24gY3JlYXRlUG9pbnQoXG4gIHg6IG51bWJlciB8IERPTVBvaW50IHwgRE9NUmVjdCxcbiAgeT86IG51bWJlcixcbikge1xuICBpZiAoeCBpbnN0YW5jZW9mIERPTVBvaW50KSB7XG4gICAgcmV0dXJuIERPTVBvaW50LmZyb21Qb2ludCh4KTtcbiAgfVxuICBpZiAoeCBpbnN0YW5jZW9mIERPTVJlY3QpIHtcbiAgICByZXR1cm4gbmV3IERPTVBvaW50KHgueCwgeC55KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgRE9NUG9pbnQoeCwgeSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcG9pbnQgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9pbnQoc291cmNlOiBSZWN0YWJsZSB8IFBhY2sgfCBET01Qb2ludCk6IERPTVBvaW50IHtcbiAgcmV0dXJuIChzb3VyY2UgaW5zdGFuY2VvZiBET01Qb2ludFxuICAgID8gc291cmNlXG4gICAgOiBET01Qb2ludC5mcm9tUG9pbnQoZ2V0UmVjdChzb3VyY2UpKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVQb2ludDtcbiIsImltcG9ydCBEaXN0YW5jZSBmcm9tICcuL0Rpc3RhbmNlJztcbmltcG9ydCBQYWNrIGZyb20gJy4vUGFjayc7XG5pbXBvcnQgeyBjcmVhdGVQb2ludCB9IGZyb20gJy4vUG9pbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJhY3Rpb25CZXN0IHtcbiAgeD86IERpc3RhbmNlO1xuICB5PzogRGlzdGFuY2U7XG59XG5cbmludGVyZmFjZSBBdHRyYWN0aW9uPFQ+IHtcbiAgc291cmNlOiBQYWNrO1xuICB0YXJnZXQ6IFQ7XG4gIHJlc3VsdHM6IERpc3RhbmNlW107XG4gIGJlc3Q6IEF0dHJhY3Rpb25CZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG9mZnNldCBvZiBhdHRyYWN0aW9uIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dHJhY3Rpb25PZmZzZXQoYXR0cmFjdGlvbjogQXR0cmFjdGlvbjx1bmtub3duPik6IERPTVBvaW50IHtcbiAgY29uc3QgeyBiZXN0IH0gPSBhdHRyYWN0aW9uO1xuXG4gIHJldHVybiBjcmVhdGVQb2ludChcbiAgICBiZXN0Lng/LnJhd0Rpc3RhbmNlID8/IDAsXG4gICAgYmVzdC55Py5yYXdEaXN0YW5jZSA/PyAwLFxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBdHRyYWN0aW9uO1xuIiwiY29uc3QgU1BMSVRURVIgPSAvW3w7LFxcc10vO1xuXG4vKipcbiAqIFJldHVybnMgc3BsaXR0ZWQgdmFsdWVzIGZyb20gYXR0cmlidXRlIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWU8ViBleHRlbmRzIHN0cmluZz4oXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICBpbmRleE9iamVjdD86IFJlY29yZDxzdHJpbmcsIFY+LFxuKTogVltdIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gdmFsdWUuc3BsaXQoU1BMSVRURVIpO1xuXG4gIGlmIChpbmRleE9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlcyBhcyBWW107XG4gIH1cblxuICBjb25zdCBpbmRleHMgPSBPYmplY3QudmFsdWVzKGluZGV4T2JqZWN0KTtcblxuICByZXR1cm4gaW5kZXhzXG4gICAgLmZpbHRlcigoaW5kZXgpID0+IHZhbHVlcy5pbmNsdWRlcyhpbmRleCkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgY29tYmluZWQgdmFsdWUgZnJvbSBhcnJheSBvZiB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZUZyb21BcnJheTxUPihcbiAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBpbmRleE9iamVjdD86IFQsXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICBpZiAoaW5kZXhPYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZXMuam9pbignfCcpO1xuICB9XG5cbiAgY29uc3QgaW5kZXhzID0gT2JqZWN0LnZhbHVlcyhpbmRleE9iamVjdCk7XG5cbiAgcmV0dXJuIGluZGV4c1xuICAgIC5maWx0ZXIoKGluZGV4KSA9PiB2YWx1ZXMuaW5jbHVkZXMoaW5kZXgpKVxuICAgIC5qb2luKCd8Jyk7XG59XG4iLCIvKipcbiAqIFJlZ2lzdGVycyBLbm9iIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyRWxlbWVudChcbiAgTm9kZTogdHlwZW9mIEhUTUxFbGVtZW50LFxuICBub2RlTmFtZTogc3RyaW5nLFxuKTogUmV0dXJuVHlwZTx0eXBlb2YgY3VzdG9tRWxlbWVudHMud2hlbkRlZmluZWQ+IHtcbiAgaWYgKGN1c3RvbUVsZW1lbnRzLmdldChub2RlTmFtZSkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBuZXcgRXJyb3IoYEFscmVhZHkgZGVmaW5lZCA8JHtub2RlTmFtZX0+YCksXG4gICAgKTtcbiAgfVxuXG4gIGN1c3RvbUVsZW1lbnRzLmRlZmluZShub2RlTmFtZSwgTm9kZSk7XG5cbiAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLndoZW5EZWZpbmVkKG5vZGVOYW1lKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXJFbGVtZW50O1xuIiwiZW51bSBBbGlnbm1lbnQge1xuICB0b3BUb1RvcCA9ICd0b3BUb1RvcCcsXG4gIHRvcFRvQm90dG9tID0gJ3RvcFRvQm90dG9tJyxcbiAgcmlnaHRUb1JpZ2h0ID0gJ3JpZ2h0VG9SaWdodCcsXG4gIHJpZ2h0VG9MZWZ0ID0gJ3JpZ2h0VG9MZWZ0JyxcbiAgYm90dG9tVG9Ub3AgPSAnYm90dG9tVG9Ub3AnLFxuICBib3R0b21Ub0JvdHRvbSA9ICdib3R0b21Ub0JvdHRvbScsXG4gIGxlZnRUb1JpZ2h0ID0gJ2xlZnRUb1JpZ2h0JyxcbiAgbGVmdFRvTGVmdCA9ICdsZWZ0VG9MZWZ0JyxcbiAgeENlbnRlclRvWENlbnRlciA9ICd4Q2VudGVyVG9YQ2VudGVyJyxcbiAgeUNlbnRlclRvWUNlbnRlciA9ICd5Q2VudGVyVG9ZQ2VudGVyJyxcbn1cblxuZXhwb3J0IGNvbnN0IEFsaWdubWVudFhzOiBBbGlnbm1lbnRbXSA9IFtcbiAgQWxpZ25tZW50LnJpZ2h0VG9SaWdodCxcbiAgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0LFxuICBBbGlnbm1lbnQubGVmdFRvUmlnaHQsXG4gIEFsaWdubWVudC5sZWZ0VG9MZWZ0LFxuICBBbGlnbm1lbnQueENlbnRlclRvWENlbnRlcixcbl07XG5cbmV4cG9ydCBjb25zdCBBbGlnbm1lbnRZczogQWxpZ25tZW50W10gPSBbXG4gIEFsaWdubWVudC50b3BUb1RvcCxcbiAgQWxpZ25tZW50LnRvcFRvQm90dG9tLFxuICBBbGlnbm1lbnQuYm90dG9tVG9Ub3AsXG4gIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbSxcbiAgQWxpZ25tZW50LnlDZW50ZXJUb1lDZW50ZXIsXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBBbGlnbm1lbnQ7XG4iLCJlbnVtIEFsaWduVG8ge1xuICBvdXRlciA9ICdvdXRlcicsXG4gIGlubmVyID0gJ2lubmVyJyxcbiAgY2VudGVyID0gJ2NlbnRlcicsXG4gIGV4dGVuZCA9ICdleHRlbmQnLFxufVxuXG5leHBvcnQgZW51bSBBbGlnblRvUGFyZW50IHtcbiAgaW5uZXIgPSAnaW5uZXInLFxuICBjZW50ZXIgPSAnY2VudGVyJyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgQWxpZ25UbztcbiIsImVudW0gQXR0cmlidXRlIHtcbiAgZGlzYWJsZWQgPSAnZGlzYWJsZWQnLFxuICBncm91cCA9ICdncm91cCcsXG4gIHVuYXR0cmFjdGFibGUgPSAndW5hdHRyYWN0YWJsZScsXG4gIHVubW92YWJsZSA9ICd1bm1vdmFibGUnLFxuICBhdHRyYWN0RGlzdGFuY2UgPSAnYXR0cmFjdC1kaXN0YW5jZScsXG4gIGFsaWduVG8gPSAnYWxpZ24tdG8nLFxuICBhbGlnblRvUGFyZW50ID0gJ2FsaWduLXRvLXBhcmVudCcsXG4gIGNyb3NzUHJldmVudCA9ICdjcm9zcy1wcmV2ZW50JyxcbiAgb2Zmc2V0VW5pdCA9ICdvZmZzZXQtdW5pdCcsXG59XG5cbmV4cG9ydCBkZWZhdWx0IEF0dHJpYnV0ZTtcbiIsImVudW0gQ3Jvc3NQcmV2ZW50IHtcbiAgcGFyZW50ID0gJ3BhcmVudCcsXG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb3NzUHJldmVudDtcbiIsImVudW0gRXZlbnQge1xuICBtYWduZXRzdGFydCA9ICdtYWduZXRzdGFydCcsXG4gIG1hZ25ldG1vdmUgPSAnbWFnbmV0bW92ZScsXG4gIG1hZ25ldGVuZCA9ICdtYWduZXRlbmQnLFxuICBhdHRyYWN0ID0gJ2F0dHJhY3QnLFxuICBhdHRyYWN0ZWQgPSAnYXR0cmFjdGVkJyxcbiAgYXR0cmFjdG1vdmUgPSAnYXR0cmFjdG1vdmUnLFxuICBhdHRyYWN0ZWRtb3ZlID0gJ2F0dHJhY3RlZG1vdmUnLFxuICB1bmF0dHJhY3QgPSAndW5hdHRyYWN0JyxcbiAgdW5hdHRyYWN0ZWQgPSAndW5hdHRyYWN0ZWQnLFxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudDtcbiIsImVudW0gT2Zmc2V0VW5pdCB7XG4gIHBpeGVsID0gJ3B4JyxcbiAgcHggPSAncHgnLFxuICBwZXJjZW50YWdlID0gJyUnLFxuICAnJScgPSAnJScsXG59XG5cbmV4cG9ydCBkZWZhdWx0IE9mZnNldFVuaXQ7XG4iLCJjb25zdCB7IGlzTmFOIH0gPSBnbG9iYWxUaGlzO1xuY29uc3QgeyBhYnMgfSA9IE1hdGg7XG5cbmV4cG9ydCB7IGlzTmFOLCBhYnMgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc291cmNlIGlzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNudW0objogdW5rbm93bik6IG4gaXMgbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiBuID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0ZE51bShuOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIG51bWJlcjogJHtufWApO1xuICB9XG5cbiAgcmV0dXJuIChpc251bShuKSA/IG4gOiBOdW1iZXIobikpO1xufVxuIiwiaW1wb3J0IHsgZ2V0QXR0cmFjdGlvbk9mZnNldCB9IGZyb20gJy4vdHlwZXMvQXR0cmFjdGlvbic7XG5pbXBvcnQgeyBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSwgZ2V0QXR0cmlidXRlVmFsdWVGcm9tQXJyYXkgfSBmcm9tICcuL3V0aWxzL211bHRpQXR0cmlidXRlVmFsdWVzJztcbmltcG9ydCByZWdpc3RlckVsZW1lbnQgZnJvbSAnLi91dGlscy9yZWdpc3RlckVsZW1lbnQnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IEFsaWduVG8sIHsgQWxpZ25Ub1BhcmVudCB9IGZyb20gJy4vdmFsdWVzL2FsaWduVG8nO1xuaW1wb3J0IEF0dHJpYnV0ZSBmcm9tICcuL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuaW1wb3J0IENyb3NzUHJldmVudCBmcm9tICcuL3ZhbHVlcy9jcm9zc1ByZXZlbnQnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4vdmFsdWVzL2V2ZW50JztcbmltcG9ydCBPZmZzZXRVbml0IGZyb20gJy4vdmFsdWVzL29mZnNldFVuaXQnO1xuaW1wb3J0IHsgaXNOYU4gfSBmcm9tICcuL3V0aWxzL251bWVyaWMnO1xuXG5jb25zdCBub2RlTmFtZSA9ICdtYWduZXQtcGFjayc7XG5jb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xuICBbQXR0cmlidXRlLmRpc2FibGVkXTogZmFsc2UsXG4gIFtBdHRyaWJ1dGUuZ3JvdXBdOiBudWxsLFxuICBbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV06IDEwLFxuICBbQXR0cmlidXRlLnVuYXR0cmFjdGFibGVdOiBmYWxzZSxcbiAgW0F0dHJpYnV0ZS51bm1vdmFibGVdOiBmYWxzZSxcbiAgZ2V0IFtBdHRyaWJ1dGUuYWxpZ25Ub10oKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFsaWduVG8ub3V0ZXIsXG4gICAgICBBbGlnblRvLmNlbnRlcixcbiAgICAgIEFsaWduVG8uZXh0ZW5kLFxuICAgIF07XG4gIH0sXG4gIGdldCBbQXR0cmlidXRlLmFsaWduVG9QYXJlbnRdKCkge1xuICAgIHJldHVybiBbXTtcbiAgfSxcbiAgZ2V0IFtBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50XSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gQ3Jvc3NQcmV2ZW50cy5wYXJlbnQsXG4gICAgXTtcbiAgfSxcbiAgW0F0dHJpYnV0ZS5vZmZzZXRVbml0XTogT2Zmc2V0VW5pdC5waXhlbCxcbn07XG5cbnRlbXBsYXRlLmlubmVySFRNTCA9IGBcbiAgPHN0eWxlPlxuICAgIDpob3N0IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxzbG90PlxuICA8L3Nsb3Q+XG5gO1xuXG5jbGFzcyBNYWduZXRQYWNrIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgKHRoaXMuc2hhZG93Um9vdCBhcyBTaGFkb3dSb290KS5hcHBlbmQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICB9XG5cbiAgc3RhdGljIGdldCBBTElHTk1FTlQoKSB7XG4gICAgcmV0dXJuIHsgLi4uQWxpZ25tZW50IH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IEFMSUdOX1RPKCkge1xuICAgIHJldHVybiB7IC4uLkFsaWduVG8gfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQUxJR05fVE9fUEFSRU5UKCkge1xuICAgIHJldHVybiB7IC4uLkFsaWduVG9QYXJlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQ1JPU1NfUFJFVkVOVCgpIHtcbiAgICByZXR1cm4geyAuLi5Dcm9zc1ByZXZlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRVZFTlQoKSB7XG4gICAgcmV0dXJuIHsgLi4uRXZlbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsaWdubWVudCB2YWx1ZXMgY29udmVydGVkIGZyb20gc2lkZXMgb2YgYWxpZ25pbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKHNvdXJjZTogc3RyaW5nW10pOiBBbGlnbm1lbnRbXSB7XG4gICAgY29uc3QgYWxpZ25Ub3MgPSBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiBbc291cmNlXTtcbiAgICBjb25zdCBhbGlnbm1lbnRzOiBBbGlnbm1lbnRbXSA9IFtdO1xuXG4gICAgaWYgKGFsaWduVG9zLmluY2x1ZGVzKEFsaWduVG8ub3V0ZXIpKSB7XG4gICAgICBhbGlnbm1lbnRzLnB1c2goXG4gICAgICAgIEFsaWdubWVudC50b3BUb0JvdHRvbSxcbiAgICAgICAgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0LFxuICAgICAgICBBbGlnbm1lbnQuYm90dG9tVG9Ub3AsXG4gICAgICAgIEFsaWdubWVudC5sZWZ0VG9SaWdodCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhbGlnblRvcy5pbmNsdWRlcyhBbGlnblRvLmlubmVyKSkge1xuICAgICAgYWxpZ25tZW50cy5wdXNoKFxuICAgICAgICBBbGlnbm1lbnQudG9wVG9Ub3AsXG4gICAgICAgIEFsaWdubWVudC5yaWdodFRvUmlnaHQsXG4gICAgICAgIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbSxcbiAgICAgICAgQWxpZ25tZW50LmxlZnRUb0xlZnQsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYWxpZ25Ub3MuaW5jbHVkZXMoQWxpZ25Uby5jZW50ZXIpKSB7XG4gICAgICBhbGlnbm1lbnRzLnB1c2goXG4gICAgICAgIEFsaWdubWVudC54Q2VudGVyVG9YQ2VudGVyLFxuICAgICAgICBBbGlnbm1lbnQueUNlbnRlclRvWUNlbnRlcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsaWdubWVudHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIGF0dHJhY3Rpb24gcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGdldE1hZ25ldEF0dHJhY3Rpb25PZmZzZXQgPSBnZXRBdHRyYWN0aW9uT2Zmc2V0XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBtYWduZXQgaXMgZGlzYWJsZWQuXG4gICAqL1xuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuZGlzYWJsZWQpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZGlzYWJsZWQgb2YgbWFnbmV0LlxuICAgKi9cbiAgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZGlzYWJsZWQsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLmRpc2FibGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBtYWduZXQgZ3JvdXAuXG4gICAqL1xuICBnZXQgZ3JvdXAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuZ3JvdXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWFnbmV0IGdyb3VwLlxuICAgKi9cbiAgc2V0IGdyb3VwKGdyb3VwOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgaWYgKGdyb3VwID09PSBudWxsIHx8IGdyb3VwLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLmdyb3VwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLmdyb3VwLCBncm91cCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5lYXJlc3QgcGFyZW50IG1hZ25ldCBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IHBhcmVudE1hZ25ldCgpOiBNYWduZXRQYWNrIHwgbnVsbCB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZ3JvdXApO1xuXG4gICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudDtcblxuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNYWduZXRQYWNrKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEdyb3VwID0gcGFyZW50LmdldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZ3JvdXApO1xuXG4gICAgICAgIGlmIChncm91cCA9PT0gbnVsbFxuICAgICAgICAgIHx8IHBhcmVudEdyb3VwID09PSBudWxsXG4gICAgICAgICAgfHwgZ3JvdXAgPT09IHBhcmVudEdyb3VwXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtYWduZXQgaGFzIG5vIGF0dHJhY3Rpb24uXG4gICAqL1xuICBnZXQgdW5hdHRyYWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS51bmF0dHJhY3RhYmxlKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVuYXR0cmFjdGFibGUgb2YgbWFnbmV0LlxuICAgKi9cbiAgc2V0IHVuYXR0cmFjdGFibGUodW5hdHRyYWN0YWJsZTogYm9vbGVhbikge1xuICAgIGlmICh1bmF0dHJhY3RhYmxlKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZSwgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFnbmV0IGlzIHVuYWJsZSB0byBiZSBkcmFnZ2VkLlxuICAgKi9cbiAgZ2V0IHVubW92YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS51bm1vdmFibGUpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdW5tb3ZhYmxlIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCB1bm1vdmFibGUodW5tb3ZhYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKHVubW92YWJsZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLnVubW92YWJsZSwgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUudW5tb3ZhYmxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzdGFuY2Ugb2YgYXR0cmFjdGlvbi5cbiAgICovXG4gIGdldCBhdHRyYWN0RGlzdGFuY2UoKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlKTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlXVxuICAgICAgOiBOdW1iZXIodmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXN0YW5jZSBvZiBhdHRyYWN0aW9uLlxuICAgKi9cbiAgc2V0IGF0dHJhY3REaXN0YW5jZShhdHRyYWN0RGlzdGFuY2U6IG51bWJlciB8IG51bGwpIHtcbiAgICBpZiAoYXR0cmFjdERpc3RhbmNlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGlzTmFOKGF0dHJhY3REaXN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0cmFjdGlvbiBkaXN0YW5jZTogJHthdHRyYWN0RGlzdGFuY2V9YCk7XG4gICAgfSBlbHNlIGlmIChhdHRyYWN0RGlzdGFuY2UgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQXR0cmFjdGlvbiBkaXN0YW5jZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDA6ICR7YXR0cmFjdERpc3RhbmNlfWApO1xuICAgIH0gZWxzZSBpZiAoYXR0cmFjdERpc3RhbmNlICE9PSB0aGlzLmF0dHJhY3REaXN0YW5jZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZSwgYCR7YXR0cmFjdERpc3RhbmNlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1hZ25ldCBhdHRyYWN0aW9uIHNpZGVzLlxuICAgKi9cbiAgZ2V0IGFsaWduVG9zKCk6IEFsaWduVG9bXSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRyYWNlTWFnbmV0QXR0cmlidXRlVmFsdWUoQXR0cmlidXRlLmFsaWduVG8pO1xuXG4gICAgcmV0dXJuICh2YWx1ZSA9PT0gbnVsbFxuICAgICAgPyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hbGlnblRvXVxuICAgICAgOiBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSh2YWx1ZSwgQWxpZ25UbylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWFnbmV0IGF0dHJhY3Rpb24gc2lkZXMuXG4gICAqL1xuICBzZXQgYWxpZ25Ub3MoYWxpZ25Ub3M6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXG4gICAgICBBdHRyaWJ1dGUuYWxpZ25UbyxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGFsaWduVG9zKVxuICAgICAgICA/IGFsaWduVG9zXG4gICAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUoYWxpZ25Ub3MsIEFsaWduVG8pXG4gICAgICApKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF0dHJhY3Rpb24gc2lkZXMgZm9yIGl0cyBwYXJlbnQgZWxlbWVudC5cbiAgICovXG4gIGdldCBhbGlnblRvUGFyZW50cygpOiBBbGlnblRvUGFyZW50W10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS5hbGlnblRvUGFyZW50KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudF1cbiAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUodmFsdWUsIEFsaWduVG9QYXJlbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhdHRyYWN0aW9uIHNpZGVzIGZvciBpdHMgcGFyZW50IGVsZW1lbnQuXG4gICAqL1xuICBzZXQgYWxpZ25Ub1BhcmVudHMoYWxpZ25Ub1BhcmVudHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXG4gICAgICBBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudCxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGFsaWduVG9QYXJlbnRzKVxuICAgICAgICA/IGFsaWduVG9QYXJlbnRzXG4gICAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUoYWxpZ25Ub1BhcmVudHMsIEFsaWduVG9QYXJlbnQpXG4gICAgICApKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWFnbmV0IGFsaWdubWVudHMgZm9yIGF0dHJhY3Rpb24uXG4gICAqL1xuICBnZXQgYWxpZ25tZW50cygpOiBBbGlnbm1lbnRbXSB7XG4gICAgcmV0dXJuIE1hZ25ldFBhY2suZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKHRoaXMuYWxpZ25Ub3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWFnbmV0IGFsaWdubWVudHMgZm9yIHBhcmVudCBhdHRyYWN0aW9uLlxuICAgKi9cbiAgZ2V0IHBhcmVudEFsaWdubWVudHMoKTogQWxpZ25tZW50W10ge1xuICAgIHJldHVybiBNYWduZXRQYWNrLmdldEFsaWdubWVudHNGcm9tQWxpZ25Ubyh0aGlzLmFsaWduVG9QYXJlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRhcmdldHMgdGhhdCB0aGUgbWFnbmV0IHdvdWxkIHByZXZlbnQgZnJvbSBjcm9zc2luZy5cbiAgICovXG4gIGdldCBjcm9zc1ByZXZlbnRzKCk6IENyb3NzUHJldmVudFtdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50XVxuICAgICAgOiBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSh2YWx1ZSwgQ3Jvc3NQcmV2ZW50KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0YXJnZXRzIHRoYXQgdGhlIG1hZ25ldCB3b3VsZCBwcmV2ZW50IGZyb20gY3Jvc3NpbmcuXG4gICAqL1xuICBzZXQgY3Jvc3NQcmV2ZW50cyhjcm9zc1ByZXZlbnRzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFxuICAgICAgQXR0cmlidXRlLmNyb3NzUHJldmVudCxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGNyb3NzUHJldmVudHMpXG4gICAgICAgID8gY3Jvc3NQcmV2ZW50c1xuICAgICAgICA6IGdldEFycmF5RnJvbUF0dHJpYnV0ZVZhbHVlKGNyb3NzUHJldmVudHMsIENyb3NzUHJldmVudClcbiAgICAgICkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB1bml0IG9mIG9mZnNldC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgb2Zmc2V0VW5pdCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS5vZmZzZXRVbml0KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUub2Zmc2V0VW5pdF1cbiAgICAgIDogdmFsdWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHVuaXQgb2Ygb2Zmc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBvZmZzZXRVbml0KG9mZnNldFVuaXQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICBpZiAob2Zmc2V0VW5pdCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLm9mZnNldFVuaXQpO1xuICAgIH0gZWxzZSBpZiAoIU9iamVjdC52YWx1ZXMoT2Zmc2V0VW5pdCkuaW5jbHVkZXMob2Zmc2V0VW5pdCBhcyBPZmZzZXRVbml0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCB1bml0OiAke29mZnNldFVuaXR9YCk7XG4gICAgfSBlbHNlIGlmIChvZmZzZXRVbml0ICE9PSB0aGlzLm9mZnNldFVuaXQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKEF0dHJpYnV0ZS5vZmZzZXRVbml0LCBvZmZzZXRVbml0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygc3BlY2lmaWMgYXR0cmlidXRlIG5hbWUuXG4gICAqL1xuICB0cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGFyZW50TWFnbmV0IH0gPSB0aGlzO1xuXG4gICAgcmV0dXJuIChwYXJlbnRNYWduZXRcbiAgICAgID8gcGFyZW50TWFnbmV0LnRyYWNlTWFnbmV0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUpXG4gICAgICA6IG51bGxcbiAgICApO1xuICB9XG59XG5cbnJlZ2lzdGVyRWxlbWVudChNYWduZXRQYWNrLCBub2RlTmFtZSk7XG5cbmV4cG9ydCBkZWZhdWx0IE1hZ25ldFBhY2s7XG4iLCJpbXBvcnQgUGFjaywgeyBSZWN0YWJsZSB9IGZyb20gJy4vUGFjayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdGxpa2UgZXh0ZW5kcyBQYXJ0aWFsPERPTVJlY3Q+IHtcbiAgdG9wPzogbnVtYmVyO1xuICByaWdodD86IG51bWJlcjtcbiAgYm90dG9tPzogbnVtYmVyO1xuICBsZWZ0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjb21wbGV0ZWQgcmVjdCBvYmplY3QgZnJvbSByZWN0YWJsZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWN0KFxuICBzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayB8IG51bWJlcixcbiAgLi4uYXJnczogW251bWJlcj8sIG51bWJlcj8sIG51bWJlcj9dXG4pOiBET01SZWN0IHtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFdpbmRvdykge1xuICAgIHJldHVybiBuZXcgRE9NUmVjdCgwLCAwLCBzb3VyY2UuaW5uZXJXaWR0aCwgc291cmNlLmlubmVySGVpZ2h0KTtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICByZXR1cm4gc291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9XG5cbiAgaWYgKFBhY2suaXNQYWNrKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdChzb3VyY2UucmVjdCk7XG4gIH1cblxuICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCB4ID0gc291cmNlO1xuICAgIGNvbnN0IFt5LCB3aWR0aCwgaGVpZ2h0XSA9IGFyZ3M7XG5cbiAgICByZXR1cm4gbmV3IERPTVJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LFxuICAgIHggPSBsZWZ0IGFzIG51bWJlcixcbiAgICB5ID0gdG9wIGFzIG51bWJlcixcbiAgICB3aWR0aCA9IChyaWdodCBhcyBudW1iZXIpIC0geCxcbiAgICBoZWlnaHQgPSAoYm90dG9tIGFzIG51bWJlcikgLSB5LFxuICB9ID0gc291cmNlO1xuXG4gIHJldHVybiBuZXcgRE9NUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHJlY3Qgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdChzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayk6IERPTVJlY3Qge1xuICBpZiAoUGFjay5pc1BhY2soc291cmNlKSkge1xuICAgIHJldHVybiBzb3VyY2UucmVjdDtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBET01SZWN0KSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSZWN0KHNvdXJjZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJlY3Q7XG4iLCJpbXBvcnQgeyBnZXRSZWN0LCBSZWN0bGlrZSB9IGZyb20gJy4vUmVjdCc7XG5cbmV4cG9ydCB0eXBlIFJlY3RhYmxlID0gUmVjdGxpa2UgfCBET01SZWN0IHwgRWxlbWVudCB8IERvY3VtZW50IHwgV2luZG93O1xuXG5jbGFzcyBQYWNrIHtcbiAgcmVhZG9ubHkgcmF3OiBSZWN0YWJsZTtcblxuICByZWFkb25seSByZWN0OiBET01SZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogUmVjdGFibGUgfCBQYWNrLCByZWN0OiBET01SZWN0ID0gZ2V0UmVjdChzb3VyY2UpKSB7XG4gICAgY29uc3QgcmF3ID0gUGFjay5pc1BhY2soc291cmNlKSA/IHNvdXJjZS5yYXcgOiBzb3VyY2U7XG5cbiAgICB0aGlzLnJhdyA9IHJhdztcbiAgICB0aGlzLnJlY3QgPSByZWN0O1xuXG4gICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgc291cmNlIGlzIHBhY2sgb2JlamN0LlxuICAgKi9cbiAgc3RhdGljIGlzUGFjayhzb3VyY2U6IHVua25vd24pOiBzb3VyY2UgaXMgUGFjayB7XG4gICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIFBhY2s7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHBhY2sgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFjayhzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayk6IFBhY2sge1xuICByZXR1cm4gUGFjay5pc1BhY2soc291cmNlKSA/IHNvdXJjZSA6IG5ldyBQYWNrKHNvdXJjZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhY2s7XG4iLCJpbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuXG4vKipcbiAqIFJldHVybnMgZGlzdGFuY2UgYmV0d2VlbiBzb3VyY2UgdG8gdGFyZ2V0IG9uIHNwZWNpZmljIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gcmF3RGlzdGFuY2VUbyhcbiAgc291cmNlUmVjdDogRE9NUmVjdCxcbiAgdGFyZ2V0UmVjdDogRE9NUmVjdCxcbiAgYWxpZ25tZW50OiBBbGlnbm1lbnQsXG4pOiBudW1iZXIge1xuICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSW5maW5pdHk7XG5cbiAgICBjYXNlIEFsaWdubWVudC50b3BUb1RvcDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QudG9wO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQudG9wVG9Cb3R0b206XG4gICAgICByZXR1cm4gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LnRvcDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9SaWdodDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnJpZ2h0IC0gc291cmNlUmVjdC5yaWdodDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QubGVmdCAtIHNvdXJjZVJlY3QucmlnaHQ7XG5cbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub1RvcDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QuYm90dG9tO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b206XG4gICAgICByZXR1cm4gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LmJvdHRvbTtcblxuICAgIGNhc2UgQWxpZ25tZW50LmxlZnRUb1JpZ2h0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QucmlnaHQgLSBzb3VyY2VSZWN0LmxlZnQ7XG5cbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9MZWZ0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QubGVmdCAtIHNvdXJjZVJlY3QubGVmdDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGFyZ2V0UmVjdC5yaWdodCArIHRhcmdldFJlY3QubGVmdCkgLSAoc291cmNlUmVjdC5yaWdodCArIHNvdXJjZVJlY3QubGVmdClcbiAgICAgICkgLyAyO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQueUNlbnRlclRvWUNlbnRlcjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0YXJnZXRSZWN0LnRvcCArIHRhcmdldFJlY3QuYm90dG9tKSAtIChzb3VyY2VSZWN0LnRvcCArIHNvdXJjZVJlY3QuYm90dG9tKVxuICAgICAgKSAvIDI7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmF3RGlzdGFuY2VUbztcbiIsImV4cG9ydCBjb25zdCByZXR1cm5UcnVlID0gKCkgPT4gdHJ1ZTtcblxuZXhwb3J0IGNvbnN0IHJldHVybkZhbHNlID0gKCkgPT4gZmFsc2U7XG4iLCJpbXBvcnQgY3JlYXRlUG9pbnQgZnJvbSAnLi4vdHlwZXMvUG9pbnQnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi9udW1lcmljJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB4LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5YQ2VudGVyc09mUmVjdHMoXG4gIHNvdXJjZVJlY3Q6IERPTVJlY3QsXG4gIHRhcmdldFJlY3Q6IERPTVJlY3QsXG4pOiBudW1iZXIge1xuICBjb25zdCBzb3VyY2VSZWN0WENlbnRlciA9IHNvdXJjZVJlY3QucmlnaHQgKyBzb3VyY2VSZWN0LmxlZnQ7XG4gIGNvbnN0IHRhcmdldFJlY3RYQ2VudGVyID0gdGFyZ2V0UmVjdC5yaWdodCArIHRhcmdldFJlY3QubGVmdDtcblxuICByZXR1cm4gYWJzKHNvdXJjZVJlY3RYQ2VudGVyIC0gdGFyZ2V0UmVjdFhDZW50ZXIpIC8gMjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB5LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMoXG4gIHNvdXJjZVJlY3Q6IERPTVJlY3QsXG4gIHRhcmdldFJlY3Q6IERPTVJlY3QsXG4pOiBudW1iZXIge1xuICBjb25zdCBzb3VyY2VSZWN0WUNlbnRlciA9IHNvdXJjZVJlY3QudG9wICsgc291cmNlUmVjdC5ib3R0b207XG4gIGNvbnN0IHRhcmdldFJlY3RZQ2VudGVyID0gdGFyZ2V0UmVjdC50b3AgKyB0YXJnZXRSZWN0LmJvdHRvbTtcblxuICByZXR1cm4gYWJzKHNvdXJjZVJlY3RZQ2VudGVyIC0gdGFyZ2V0UmVjdFlDZW50ZXIpIC8gMjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB4LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlbkNlbnRlcnNPZlJlY3RzKFxuICBzb3VyY2VSZWN0OiBET01SZWN0LFxuICB0YXJnZXRSZWN0OiBET01SZWN0LFxuKTogRE9NUG9pbnQge1xuICByZXR1cm4gY3JlYXRlUG9pbnQoXG4gICAgZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QpLFxuICAgIGRpc3RhbmNlQmV0d2VlbllDZW50ZXJzT2ZSZWN0cyhzb3VyY2VSZWN0LCB0YXJnZXRSZWN0KSxcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzdGFuY2VCZXR3ZWVuQ2VudGVyc09mUmVjdHM7XG4iLCJpbXBvcnQgTWFnbmV0IGZyb20gJy4uL2Jsb2NrJztcbmltcG9ydCBNYWduZXRQYWNrLCB7IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCBBdHRyYWN0aW9uLCB7IEF0dHJhY3Rpb25CZXN0IH0gZnJvbSAnLi4vdHlwZXMvQXR0cmFjdGlvbic7XG5pbXBvcnQgUGFjaywgeyBnZXRQYWNrLCBSZWN0YWJsZSB9IGZyb20gJy4uL3R5cGVzL1BhY2snO1xuaW1wb3J0IHsgZ2V0UmVjdCB9IGZyb20gJy4uL3R5cGVzL1JlY3QnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi4vdXRpbHMvbnVtZXJpYyc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IHsgU2luZ2xlQXR0cmFjdGlvblRvT3B0aW9ucyB9IGZyb20gJy4vc2luZ2xlQXR0cmFjdGlvblRvJztcbmltcG9ydCB7IE9uSnVkZ2VBdHRyYWN0aW9uIH0gZnJvbSAnLi9qdWRnZUF0dHJhY3Rpb24nO1xuaW1wb3J0IHsgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuaW1wb3J0IHsgZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzLCBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMgfSBmcm9tICcuLi91dGlscy9kaXN0YW5jZUJldHdlZW5SZWN0cyc7XG5cbmV4cG9ydCB0eXBlIE11bHRpQXR0cmFjdGlvbiA9IEF0dHJhY3Rpb248UGFja1tdPjtcblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aUF0dHJhY3Rpb25zVG9PcHRpb25zIGV4dGVuZHMgU2luZ2xlQXR0cmFjdGlvblRvT3B0aW9ucyB7XG4gIGF0dHJhY3Rpb25CZXN0PzogQXR0cmFjdGlvbkJlc3Q7XG4gIG9uSnVkZ2VBdHRyYWN0aW9uPzogT25KdWRnZUF0dHJhY3Rpb247XG59XG5cbi8qKlxuICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0cyBvbiBhbGlnbm1lbnRzLlxuICovXG5mdW5jdGlvbiBtdWx0aUF0dHJhY3Rpb25zVG8oXG4gIHNvdXJjZTogUmVjdGFibGUgfCBQYWNrLFxuICB0YXJnZXRzOiAoUmVjdGFibGUgfCBQYWNrKVtdLFxuICBvcHRpb25zOiBNdWx0aUF0dHJhY3Rpb25zVG9PcHRpb25zID0ge30sXG4pOiBNdWx0aUF0dHJhY3Rpb24ge1xuICBjb25zdCBzb3VyY2VQYWNrID0gZ2V0UGFjayhzb3VyY2UpO1xuICBjb25zdCB0YXJnZXRQYWNrcyA9IHRhcmdldHMubWFwKCh0YXJnZXQpID0+IGdldFBhY2sodGFyZ2V0KSk7XG4gIGNvbnN0IHtcbiAgICBhdHRyYWN0RGlzdGFuY2UgPSBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hdHRyYWN0RGlzdGFuY2VdLFxuICAgIGFsaWduVG9zID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub10sXG4gICAgYWxpZ25tZW50cyA9IE1hZ25ldFBhY2suZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKGFsaWduVG9zKSxcbiAgICBvbkp1ZGdlRGlzdGFuY2UgPSByZXR1cm5UcnVlLFxuICAgIG9uSnVkZ2VBdHRyYWN0aW9uID0gcmV0dXJuVHJ1ZSxcbiAgICBhdHRyYWN0aW9uQmVzdCA9IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc2luZ2xlQXR0cmFjdGlvbk9wdGlvbnM6IFNpbmdsZUF0dHJhY3Rpb25Ub09wdGlvbnMgPSB7XG4gICAgYXR0cmFjdERpc3RhbmNlLFxuICAgIGFsaWduVG9zLFxuICAgIGFsaWdubWVudHMsXG4gICAgb25KdWRnZURpc3RhbmNlLFxuICB9O1xuICBjb25zdCBtdWx0aUF0dHJhY3Rpb24gPSB0YXJnZXRQYWNrcy5yZWR1Y2U8TXVsdGlBdHRyYWN0aW9uPihcbiAgICAoYXR0cmFjdGlvbiwgdGFyZ2V0UGFjaykgPT4ge1xuICAgICAgY29uc3Qgc2luZ2xlQXR0cmFjdGlvbiA9IE1hZ25ldC5wcm90b3R5cGUuYXR0cmFjdGlvblRvLmNhbGwoXG4gICAgICAgIHNvdXJjZVBhY2ssXG4gICAgICAgIHRhcmdldFBhY2ssXG4gICAgICAgIHNpbmdsZUF0dHJhY3Rpb25PcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYmVzdDogY3VycmVudEJlc3QsXG4gICAgICAgIHJlc3VsdHM6IGN1cnJlbnRSZXN1bHRzLFxuICAgICAgfSA9IHNpbmdsZUF0dHJhY3Rpb247XG4gICAgICBjb25zdCBwYXNzSnVkZ2VtZW50ID0gb25KdWRnZUF0dHJhY3Rpb24oe1xuICAgICAgICBzb3VyY2U6IHNvdXJjZVBhY2ssXG4gICAgICAgIHRhcmdldDogdGFyZ2V0UGFjayxcbiAgICAgICAgcmVzdWx0czogWy4uLmN1cnJlbnRSZXN1bHRzXSxcbiAgICAgICAgYmVzdDoge1xuICAgICAgICAgIHg6IGN1cnJlbnRCZXN0LngsXG4gICAgICAgICAgeTogY3VycmVudEJlc3QueSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhdHRyYWN0aW9uLnRhcmdldC5wdXNoKHRhcmdldFBhY2spO1xuXG4gICAgICBpZiAocGFzc0p1ZGdlbWVudCkge1xuICAgICAgICBjb25zdCB7IHJlc3VsdHMsIGJlc3QgfSA9IGF0dHJhY3Rpb247XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKC4uLmN1cnJlbnRSZXN1bHRzKTtcblxuICAgICAgICBpZiAoY3VycmVudEJlc3QueCkge1xuICAgICAgICAgIGlmIChiZXN0LnggPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50QmVzdC54LmFic0Rpc3RhbmNlIDwgYmVzdC54LmFic0Rpc3RhbmNlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBiZXN0LnggPSBjdXJyZW50QmVzdC54O1xuICAgICAgICAgIH0gZWxzZSBpZiAoYmVzdC54LmFic0Rpc3RhbmNlID09PSBjdXJyZW50QmVzdC54LmFic0Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdChzb3VyY2VQYWNrKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSBjdXJyZW50QmVzdC54LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgY29uc3QgbGFzdEJlc3RSZWN0ID0gYmVzdC54LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERpZmZZID0gZGlzdGFuY2VCZXR3ZWVuWUNlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QpO1xuICAgICAgICAgICAgY29uc3QgZGlmZlkgPSBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMoc291cmNlUmVjdCwgbGFzdEJlc3RSZWN0KTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnREaWZmWSA8IGRpZmZZKSB7XG4gICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnREaWZmWSA9PT0gZGlmZlkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZ2FwID0gYXR0cmFjdERpc3RhbmNlIC8gMztcblxuICAgICAgICAgICAgICBpZiAoY3VycmVudEJlc3QueC5yYXdEaXN0YW5jZSA+IGdhcCkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmVzdC54LmFsaWdubWVudCA9PT0gQWxpZ25tZW50LmxlZnRUb0xlZnQpIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCZXN0LngucmF3RGlzdGFuY2UgPCAtZ2FwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnguYWxpZ25tZW50ID09PSBBbGlnbm1lbnQucmlnaHRUb1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICBiZXN0LnggPSBjdXJyZW50QmVzdC54O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50QmVzdC54LmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UmVjdCA9IGN1cnJlbnRCZXN0LngudGFyZ2V0LnJlY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFJlY3QgPSBiZXN0LngudGFyZ2V0LnJlY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFlCYXNlID0gbGFzdFJlY3QudG9wICsgbGFzdFJlY3QuYm90dG9tO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRZQmFzZSA9IGN1cnJlbnRSZWN0LnRvcCArIGN1cnJlbnRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VZQmFzZSA9IHNvdXJjZVJlY3QudG9wICsgc291cmNlUmVjdC5ib3R0b207XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFlEaXN0YW5jZSA9IGFicyhsYXN0WUJhc2UgLSBzb3VyY2VZQmFzZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFlEaXN0YW5jZSA9IGFicyhjdXJyZW50WUJhc2UgLSBzb3VyY2VZQmFzZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFlEaXN0YW5jZSA8IGxhc3RZRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkpIHtcbiAgICAgICAgICBpZiAoYmVzdC55ID09PSB1bmRlZmluZWQgfHwgY3VycmVudEJlc3QueS5hYnNEaXN0YW5jZSA8IGJlc3QueS5hYnNEaXN0YW5jZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYmVzdC55ID0gY3VycmVudEJlc3QueTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGJlc3QueS5hYnNEaXN0YW5jZSA9PT0gY3VycmVudEJlc3QueS5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlUmVjdCA9IGdldFJlY3Qoc291cmNlUGFjayk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRSZWN0ID0gY3VycmVudEJlc3QueS50YXJnZXQucmVjdDtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RCZXN0UmVjdCA9IGJlc3QueS50YXJnZXQucmVjdDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREaWZmWCA9IGRpc3RhbmNlQmV0d2VlblhDZW50ZXJzT2ZSZWN0cyhzb3VyY2VSZWN0LCB0YXJnZXRSZWN0KTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZYID0gZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIGxhc3RCZXN0UmVjdCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50RGlmZlggPCBkaWZmWCkge1xuICAgICAgICAgICAgICBiZXN0LnkgPSBjdXJyZW50QmVzdC55O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RGlmZlggPT09IGRpZmZYKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGdhcCA9IGF0dHJhY3REaXN0YW5jZSAvIDM7XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkucmF3RGlzdGFuY2UgPCAtZ2FwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b20pIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueSA9IGN1cnJlbnRCZXN0Lnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCZXN0LnkucmF3RGlzdGFuY2UgPiBnYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJlc3QueS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC50b3BUb1RvcCkge1xuICAgICAgICAgICAgICAgICAgYmVzdC55ID0gY3VycmVudEJlc3QueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEJlc3QueS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFJlY3QgPSBjdXJyZW50QmVzdC55LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gYmVzdC55LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RYQmFzZSA9IGxhc3RSZWN0LnJpZ2h0ICsgbGFzdFJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50WEJhc2UgPSBjdXJyZW50UmVjdC5yaWdodCArIGN1cnJlbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlWEJhc2UgPSBzb3VyY2VSZWN0LnJpZ2h0ICsgc291cmNlUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RYRGlzdGFuY2UgPSBhYnMobGFzdFhCYXNlIC0gc291cmNlWEJhc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRYRGlzdGFuY2UgPSBhYnMoY3VycmVudFhCYXNlIC0gc291cmNlWEJhc2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRYRGlzdGFuY2UgPCBsYXN0WERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICBiZXN0LnkgPSBjdXJyZW50QmVzdC55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmFjdGlvbjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICAgIHRhcmdldDogW10sXG4gICAgICByZXN1bHRzOiBbXSxcbiAgICAgIGJlc3Q6IHsgLi4uYXR0cmFjdGlvbkJlc3QgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBtdWx0aUF0dHJhY3Rpb247XG59XG5cbmV4cG9ydCBkZWZhdWx0IG11bHRpQXR0cmFjdGlvbnNUbztcbiIsImltcG9ydCBBdHRyYWN0aW9uIGZyb20gJy4uL3R5cGVzL0F0dHJhY3Rpb24nO1xuaW1wb3J0IFBhY2ssIHsgZ2V0UGFjaywgUmVjdGFibGUgfSBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCBBbGlnbm1lbnQsIHsgQWxpZ25tZW50WHMsIEFsaWdubWVudFlzIH0gZnJvbSAnLi4vdmFsdWVzL2FsaWdubWVudCc7XG5pbXBvcnQgQWxpZ25UbywgeyBBbGlnblRvUGFyZW50IH0gZnJvbSAnLi4vdmFsdWVzL2FsaWduVG8nO1xuaW1wb3J0IHsgT25KdWRnZURpc3RhbmNlIH0gZnJvbSAnLi9qdWRnZURpc3RhbmNlJztcbmltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IHsgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgeyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuXG5leHBvcnQgdHlwZSBTaW5nbGVBdHRyYWN0aW9uID0gQXR0cmFjdGlvbjxQYWNrPjtcblxuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zIHtcbiAgYXR0cmFjdERpc3RhbmNlPzogbnVtYmVyO1xuICBhbGlnblRvcz86IChBbGlnblRvIHwgQWxpZ25Ub1BhcmVudClbXTtcbiAgYWxpZ25tZW50cz86IEFsaWdubWVudFtdO1xuICBvbkp1ZGdlRGlzdGFuY2U/OiBPbkp1ZGdlRGlzdGFuY2U7XG59XG5cbi8qKlxuICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IG9uIGFsaWdubWVudHMuXG4gKi9cbmZ1bmN0aW9uIHNpbmdsZUF0dHJhY3Rpb25UbyhcbiAgc291cmNlOiBSZWN0YWJsZSB8IFBhY2ssXG4gIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICBvcHRpb25zOiBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zID0ge30sXG4pOiBTaW5nbGVBdHRyYWN0aW9uIHtcbiAgY29uc3Qgc291cmNlUGFjayA9IGdldFBhY2soc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UGFjayA9IGdldFBhY2sodGFyZ2V0KTtcbiAgY29uc3Qge1xuICAgIGF0dHJhY3REaXN0YW5jZSA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV0sXG4gICAgYWxpZ25Ub3MgPSBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hbGlnblRvXSxcbiAgICBhbGlnbm1lbnRzID0gTWFnbmV0LmdldEFsaWdubWVudHNGcm9tQWxpZ25UbyhhbGlnblRvcyksXG4gICAgb25KdWRnZURpc3RhbmNlID0gcmV0dXJuVHJ1ZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNpbmdsZUF0dHJhY3Rpb24gPSBhbGlnbm1lbnRzLnJlZHVjZTxTaW5nbGVBdHRyYWN0aW9uPihcbiAgICAoYXR0cmFjdGlvbiwgYWxpZ25tZW50KSA9PiB7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hZ25ldC5wcm90b3R5cGUuZGlzdGFuY2VUby5jYWxsKHNvdXJjZVBhY2ssIHRhcmdldFBhY2ssIGFsaWdubWVudCk7XG4gICAgICBjb25zdCBwYXNzSnVkZ2VtZW50ID0gb25KdWRnZURpc3RhbmNlKFxuICAgICAgICB7IC4uLmRpc3RhbmNlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAocGFzc0p1ZGdlbWVudCkge1xuICAgICAgICBjb25zdCB7IHJlc3VsdHMsIGJlc3QgfSA9IGF0dHJhY3Rpb247XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKGRpc3RhbmNlKTtcblxuICAgICAgICBpZiAoQWxpZ25tZW50WHMuaW5jbHVkZXMoYWxpZ25tZW50KSkge1xuICAgICAgICAgIGlmIChiZXN0LnggPT09IHVuZGVmaW5lZCB8fCBkaXN0YW5jZS5hYnNEaXN0YW5jZSA8IGJlc3QueC5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgYmVzdC54ID0gZGlzdGFuY2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChiZXN0LnguYWJzRGlzdGFuY2UgPT09IGRpc3RhbmNlLmFic0Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBnYXAgPSBhdHRyYWN0RGlzdGFuY2UgLyAzO1xuXG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UucmF3RGlzdGFuY2UgPiBnYXApIHtcbiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LmxlZnRUb0xlZnQpIHtcbiAgICAgICAgICAgICAgICBiZXN0LnggPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5yYXdEaXN0YW5jZSA8IC1nYXApIHtcbiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnJpZ2h0VG9SaWdodCkge1xuICAgICAgICAgICAgICAgIGJlc3QueCA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXIpIHtcbiAgICAgICAgICAgICAgYmVzdC54ID0gZGlzdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFsaWdubWVudFlzLmluY2x1ZGVzKGFsaWdubWVudCkpIHtcbiAgICAgICAgICBpZiAoYmVzdC55ID09PSB1bmRlZmluZWQgfHwgZGlzdGFuY2UuYWJzRGlzdGFuY2UgPCBiZXN0LnkuYWJzRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGJlc3QueSA9IGRpc3RhbmNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYmVzdC55LmFic0Rpc3RhbmNlID09PSBkaXN0YW5jZS5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgZ2FwID0gYXR0cmFjdERpc3RhbmNlIC8gMztcblxuICAgICAgICAgICAgaWYgKGRpc3RhbmNlLnJhd0Rpc3RhbmNlIDwgLWdhcCkge1xuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b20pIHtcbiAgICAgICAgICAgICAgICBiZXN0LnkgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5yYXdEaXN0YW5jZSA+IGdhcCkge1xuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQudG9wVG9Ub3ApIHtcbiAgICAgICAgICAgICAgICBiZXN0LnkgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyKSB7XG4gICAgICAgICAgICAgIGJlc3QueSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmFjdGlvbjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICAgIHRhcmdldDogdGFyZ2V0UGFjayxcbiAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgYmVzdDoge30sXG4gICAgfSxcbiAgKTtcblxuICByZXR1cm4gc2luZ2xlQXR0cmFjdGlvbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2luZ2xlQXR0cmFjdGlvblRvO1xuIiwiaW1wb3J0IHsgU2luZ2xlQXR0cmFjdGlvbiB9IGZyb20gJy4vc2luZ2xlQXR0cmFjdGlvblRvJztcblxuZXhwb3J0IHR5cGUgT25KdWRnZUF0dHJhY3Rpb24gPSAoXG4gIGF0dHJhY3Rpb246IFNpbmdsZUF0dHJhY3Rpb24sXG4pID0+IGJvb2xlYW47XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBhdHRyYWN0aW9uIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gKiBhdHRyYWN0aW9uIHdvdWxkIG5vdCBiZSBvbiB0aGUgcmVzdWx0IGxpc3Qgb2YgYXR0cmFjdGlvbnMuXG4gKi9cbmNvbnN0IGp1ZGdlQXR0cmFjdGlvbjogT25KdWRnZUF0dHJhY3Rpb24gPSBmdW5jdGlvbiBqdWRnZUF0dHJhY3Rpb24oXG4gIGF0dHJhY3Rpb24sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oYXR0cmFjdGlvbi5iZXN0LnggPz8gYXR0cmFjdGlvbi5iZXN0LnkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQganVkZ2VBdHRyYWN0aW9uO1xuIiwiaW1wb3J0IFBhY2sgZnJvbSAnLi4vdHlwZXMvUGFjayc7XG5cbmV4cG9ydCB0eXBlIE9uSnVkZ2VNb3ZlbWVudCA9IChwYWNrOiBQYWNrKSA9PiBib29sZWFuO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlzdGFuY2UgcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZSB0aGVcbiAqIGRpc3RhbmNlIHdvdWxkIG5vdCBiZSBvbiB0aGUgcmVzdWx0IGxpc3Qgb2YgYXR0cmFjdGlvbi5cbiAqL1xuY29uc3QganVkZ2VNb3ZlbWVudDogT25KdWRnZU1vdmVtZW50ID0gZnVuY3Rpb24ganVkZ2VNb3ZlbWVudCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZU1vdmVtZW50O1xuIiwidHlwZSBFdmVudEhvbGRlciA9IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgfCBXaW5kb3c7XG50eXBlIEV2ZW50TGlzdGVuZXIgPSAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbmludGVyZmFjZSBFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gIGNhcHR1cmU/OiBib29sZWFuO1xuICBvbmNlPzogYm9vbGVhbjtcbiAgcGFzc2l2ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBldmVudCBvZiB0eXBlIHRvIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKFxuICByZWY6IEV2ZW50SG9sZGVyLFxuICB0eXBlOiBzdHJpbmcsXG4gIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyLFxuICBvcHRpb25zPzogRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4pOiB2b2lkIHtcbiAgcmVmLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEFkZHMgZXZlbnRzIG9mIHR5cGVzIHRvIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyhcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZXM6IHN0cmluZ1tdLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHR5cGVzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICBhZGRFdmVudExpc3RlbmVyKHJlZiwgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IG9mIHR5cGUgZnJvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZTogc3RyaW5nLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50cyBvZiB0eXBlcyBmcm9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyhcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZXM6IHN0cmluZ1tdLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHR5cGVzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gIH0pO1xufVxuXG5pbnRlcmZhY2UgQ3VzdG9tRXZlbnRJbml0PFQ+IHtcbiAgZGV0YWlsPzogVDtcbiAgYnViYmxlcz86IGJvb2xlYW47XG4gIGNhbmNlbGFibGU/OiBib29sZWFuO1xuICBjb21wb3NlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJpZ2dlcnMgZXZlbnQgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlIGV2ZW50IGlzIGNhbmNlbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJFdmVudDxUID0gdW5kZWZpbmVkPihcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZTogc3RyaW5nLFxuICBvcHRpb25zPzogQ3VzdG9tRXZlbnRJbml0PFQ+LFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZSwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIFRyaWdnZXJzIGV2ZW50cyBhbmQgcmV0dXJucyBmYWxzZSBpZiBhbnkgb2YgdGhlIGV2ZW50IGlzXG4gKiBjYW5jZWxsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRXZlbnRzPFQ+KFxuICByZWY6IEV2ZW50SG9sZGVyLFxuICB0eXBlczogc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBDdXN0b21FdmVudEluaXQ8VD4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVzLmV2ZXJ5KCh0eXBlKSA9PiB0cmlnZ2VyRXZlbnQocmVmLCB0eXBlLCBvcHRpb25zKSk7XG59XG4iLCJpbXBvcnQgY3JlYXRlUG9pbnQgZnJvbSAnLi4vdHlwZXMvUG9pbnQnO1xuXG4vKipcbiAqIFJldHVybnMgb2Zmc2V0IHRvIGtlZXAgc291cmNlIHJlY3QgaW4gdGFyZ2V0IHJlY3QuXG4gKi9cbmZ1bmN0aW9uIGdldE9mZnNldFRvQmVJblJlY3Qoc291cmNlUmVjdDogRE9NUmVjdCwgdGFyZ2V0UmVjdDogRE9NUmVjdCk6IERPTVBvaW50IHtcbiAgbGV0IHggPSAwO1xuICBsZXQgeSA9IDA7XG5cbiAgaWYgKHNvdXJjZVJlY3QubGVmdCA8IHRhcmdldFJlY3QubGVmdCkge1xuICAgIHggPSB0YXJnZXRSZWN0LmxlZnQgLSBzb3VyY2VSZWN0LmxlZnQ7XG4gIH0gZWxzZSBpZiAoc291cmNlUmVjdC5yaWdodCA+IHRhcmdldFJlY3QucmlnaHQpIHtcbiAgICB4ID0gdGFyZ2V0UmVjdC5yaWdodCAtIHNvdXJjZVJlY3QucmlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlUmVjdC50b3AgPCB0YXJnZXRSZWN0LnRvcCkge1xuICAgIHkgPSB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QudG9wO1xuICB9IGVsc2UgaWYgKHNvdXJjZVJlY3QuYm90dG9tID4gdGFyZ2V0UmVjdC5ib3R0b20pIHtcbiAgICB5ID0gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LmJvdHRvbTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQb2ludCh4LCB5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0T2Zmc2V0VG9CZUluUmVjdDtcbiIsImltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IHsgZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQXR0cmFjdGlvbkJlc3QsIGdldEF0dHJhY3Rpb25PZmZzZXQgfSBmcm9tICcuLi90eXBlcy9BdHRyYWN0aW9uJztcbmltcG9ydCBEaXN0YW5jZSBmcm9tICcuLi90eXBlcy9EaXN0YW5jZSc7XG5pbXBvcnQge1xuICBBdHRyYWN0ZWRFdmVudERldGFpbCwgQXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsLCBBdHRyYWN0RXZlbnREZXRhaWwsXG4gIEF0dHJhY3Rtb3ZlRXZlbnREZXRhaWwsIFVuYXR0cmFjdGVkRXZlbnREZXRhaWwsIFVuYXR0cmFjdEV2ZW50RGV0YWlsLFxufSBmcm9tICcuLi90eXBlcy9FdmVudERldGFpbCc7XG5pbXBvcnQgUGFjayBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCBjcmVhdGVQb2ludCBmcm9tICcuLi90eXBlcy9Qb2ludCc7XG5pbXBvcnQgY3JlYXRlUmVjdCwgeyBnZXRSZWN0IH0gZnJvbSAnLi4vdHlwZXMvUmVjdCc7XG5pbXBvcnQgeyB0cmlnZ2VyRXZlbnQgfSBmcm9tICcuLi91dGlscy9ldmVudEhhbmRsZXInO1xuaW1wb3J0IGdldE9mZnNldFRvQmVJblJlY3QgZnJvbSAnLi4vdXRpbHMvZ2V0T2Zmc2V0VG9CZUluUmVjdCc7XG5pbXBvcnQgeyByZXR1cm5GYWxzZSwgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IEFsaWduVG8sIHsgQWxpZ25Ub1BhcmVudCB9IGZyb20gJy4uL3ZhbHVlcy9hbGlnblRvJztcbmltcG9ydCBBdHRyaWJ1dGUgZnJvbSAnLi4vdmFsdWVzL2F0dHJpYnV0ZSc7XG5pbXBvcnQgQ3Jvc3NQcmV2ZW50IGZyb20gJy4uL3ZhbHVlcy9jcm9zc1ByZXZlbnQnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4uL3ZhbHVlcy9ldmVudCc7XG5pbXBvcnQgeyBPbkp1ZGdlQXR0cmFjdGlvbiB9IGZyb20gJy4vanVkZ2VBdHRyYWN0aW9uJztcbmltcG9ydCB7IE9uSnVkZ2VEaXN0YW5jZSB9IGZyb20gJy4vanVkZ2VEaXN0YW5jZSc7XG5pbXBvcnQgeyBPbkp1ZGdlRGlzdGFuY2VJblBhcmVudCB9IGZyb20gJy4vanVkZ2VEaXN0YW5jZUluUGFyZW50JztcbmltcG9ydCB7IE9uSnVkZ2VNb3ZlbWVudCB9IGZyb20gJy4vanVkZ2VNb3ZlbWVudCc7XG5pbXBvcnQgbXVsdGlBdHRyYWN0aW9uc1RvIGZyb20gJy4vbXVsdGlBdHRyYWN0aW9uc1RvJztcbmltcG9ydCBzaW5nbGVBdHRyYWN0aW9uVG8gZnJvbSAnLi9zaW5nbGVBdHRyYWN0aW9uVG8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uT3B0aW9ucyB7XG4gIGlnbm9yZUV2ZW50PzogYm9vbGVhbjtcbiAgdW5hdHRyYWN0YWJsZT86IGJvb2xlYW47XG4gIGF0dHJhY3REaXN0YW5jZT86IG51bWJlcjtcbiAgYWxpZ25Ub3M/OiBBbGlnblRvW107XG4gIGFsaWdubWVudHM/OiBBbGlnbm1lbnRbXTtcbiAgYWxpZ25Ub1BhcmVudHM/OiBBbGlnblRvUGFyZW50W107XG4gIGNyb3NzUHJldmVudHM/OiBDcm9zc1ByZXZlbnRbXTtcbiAgcGFyZW50UGFjaz86IFBhY2s7XG4gIGxhc3RBdHRyYWN0aW9uQmVzdD86IEF0dHJhY3Rpb25CZXN0IHwgbnVsbDtcbiAgb25KdWRnZURpc3RhbmNlPzogT25KdWRnZURpc3RhbmNlO1xuICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudD86IE9uSnVkZ2VEaXN0YW5jZUluUGFyZW50O1xuICBvbkp1ZGdlQXR0cmFjdGlvbj86IE9uSnVkZ2VBdHRyYWN0aW9uO1xuICBvbkp1ZGdlTW92ZW1lbnQ/OiBPbkp1ZGdlTW92ZW1lbnQ7XG59XG5cbmludGVyZmFjZSBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvblJlc3VsdCB7XG4gIHBvc2l0aW9uOiBET01Qb2ludCB8IG51bGw7XG4gIGF0dHJhY3Rpb25CZXN0OiBBdHRyYWN0aW9uQmVzdCB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uKFxuICBzb3VyY2VQYWNrOiBQYWNrLFxuICB0YXJnZXRQYWNrczogUGFja1tdLFxuICBvcHRpb25zOiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMgPSB7fSxcbik6IEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uUmVzdWx0IHtcbiAgY29uc3Qgc291cmNlUmF3ID0gc291cmNlUGFjay5yYXcgYXMgSFRNTEVsZW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBpZ25vcmVFdmVudCA9ICEoc291cmNlUmF3IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpLFxuICAgIGFsaWduVG9QYXJlbnRzID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudF0sXG4gICAgY3Jvc3NQcmV2ZW50cyA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmNyb3NzUHJldmVudF0sXG4gICAgcGFyZW50UGFjayxcbiAgICBsYXN0QXR0cmFjdGlvbkJlc3QsXG4gICAgb25KdWRnZU1vdmVtZW50ID0gcmV0dXJuVHJ1ZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxhc3RCZXN0WCA9IGxhc3RBdHRyYWN0aW9uQmVzdD8ueDtcbiAgY29uc3QgbGFzdEJlc3RZID0gbGFzdEF0dHJhY3Rpb25CZXN0Py55O1xuICBjb25zdCBwYXJlbnRBbGlnbm1lbnRzID0gTWFnbmV0LmdldEFsaWdubWVudHNGcm9tQWxpZ25UbyhhbGlnblRvUGFyZW50cyk7XG4gIGNvbnN0IGFsaWduVG9QYXJlbnQgPSBwYXJlbnRBbGlnbm1lbnRzLmxlbmd0aCA+IDA7XG4gIGNvbnN0IGNyb3NzUHJldmVudFBhcmVudCA9IGNyb3NzUHJldmVudHMuaW5jbHVkZXMoQ3Jvc3NQcmV2ZW50LnBhcmVudCk7XG4gIGNvbnN0IGtlZXBJblBhcmVudCA9IGNyb3NzUHJldmVudFBhcmVudCAmJiBwYXJlbnRQYWNrO1xuICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdChzb3VyY2VQYWNrKTtcbiAgY29uc3Qge1xuICAgIHdpZHRoOiBzb3VyY2VXaWR0aCxcbiAgICBoZWlnaHQ6IHNvdXJjZUhlaWdodCxcbiAgfSA9IHNvdXJjZVJlY3Q7XG4gIGNvbnN0IHBhcmVudFJlY3QgPSBnZXRSZWN0KFxuICAgIHBhcmVudFBhY2tcbiAgICA/PyBzb3VyY2VSZWN0LCAvLyBoYWNrIGZvciB0c2xpbnQgYmVjYXVzZSBgcGFyZW50UmVjdGAgd291bGQgYmUgbmVlZGxlc3NcbiAgKTtcblxuICAvKipcbiAgICogTmVlZCB0byBjb25zaWRlciB0aGUgZHJhZ2dpbmcgZm9yY2Ugd2hlbiB0aGUgbWFnbmV0IGlzIHByZXZlbnRlZFxuICAgKiBmcm9tIGNyb3NzaW5nIHBhcmVudCBlbGVtZW50LiBUaGUgYXR0cmFjdGlvbiBvZiB0aGUgbmVhciBtYWduZXRzXG4gICAqIHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZSBmb3JjZSBpcyBncmVhdGVyIHRoYW4gdGhlIGF0dHJhY3RpbmdcbiAgICogZGlzdGFuY2VzLlxuICAgKi9cbiAgY29uc3Qgc291cmNlUmF3UmVjdCA9IHNvdXJjZVJlY3Q7XG4gIGNvbnN0IHNvdXJjZUluUGFyZW50T2Zmc2V0ID0gKGtlZXBJblBhcmVudFxuICAgID8gZ2V0T2Zmc2V0VG9CZUluUmVjdChzb3VyY2VSYXdSZWN0LCBwYXJlbnRSZWN0KVxuICAgIDogY3JlYXRlUG9pbnQoMCwgMClcbiAgKTtcbiAgY29uc3Qgc291cmNlSW5QYXJlbnRSZWN0ID0gY3JlYXRlUmVjdChcbiAgICBzb3VyY2VSYXdSZWN0LnggKyBzb3VyY2VJblBhcmVudE9mZnNldC54LFxuICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUluUGFyZW50T2Zmc2V0LnksXG4gICAgc291cmNlV2lkdGgsXG4gICAgc291cmNlSGVpZ2h0LFxuICApO1xuICBjb25zdCBzb3VyY2VJblBhcmVudFBhY2sgPSBuZXcgUGFjayhzb3VyY2VSYXcsIHNvdXJjZUluUGFyZW50UmVjdCk7XG4gIGNvbnN0IHBhc3NKdWRnZU1vdmVtZW50ID0gb25KdWRnZU1vdmVtZW50KHNvdXJjZUluUGFyZW50UGFjayk7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgZm9yIHRob3NlIHRhcmdldHMgbmVlZCB0byBkaXNwYXRjaCBldmVudC5cbiAgICovXG4gIGNvbnN0IGF0dHJhY3RSZXN1bHRzOiBEaXN0YW5jZVtdID0gW107XG4gIGNvbnN0IHVuYXR0cmFjdFJlc3VsdHM6IERpc3RhbmNlW10gPSBbXTtcbiAgY29uc3QgYXR0cmFjdG1vdmVSZXN1bHRzOiBEaXN0YW5jZVtdID0gW107XG5cbiAgY29uc3QgZGlzcGF0Y2hBdHRyYWN0RXZlbnRzID0gKHNvdXJjZU5leHRSZWN0OiBET01SZWN0KSA9PiB7XG4gICAgaWYgKGlnbm9yZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXR0cmFjdFJlc3VsdHMuZm9yRWFjaCgoYXR0cmFjdFJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0UGFjayA9IGF0dHJhY3RSZXN1bHQudGFyZ2V0O1xuICAgICAgY29uc3QgdGFyZ2V0RWxlbSA9IHRhcmdldFBhY2sucmF3IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgYXR0cmFjdGVkRXZlbnREZXRhaWw6IEF0dHJhY3RlZEV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRQYWNrLFxuICAgICAgICBzb3VyY2VOZXh0UmVjdCxcbiAgICAgICAgZGlzdGFuY2U6IGF0dHJhY3RSZXN1bHQsXG4gICAgICB9O1xuXG4gICAgICB0cmlnZ2VyRXZlbnQ8QXR0cmFjdGVkRXZlbnREZXRhaWw+KFxuICAgICAgICB0YXJnZXRFbGVtLFxuICAgICAgICBFdmVudC5hdHRyYWN0ZWQsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogYXR0cmFjdGVkRXZlbnREZXRhaWwsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBkaXNwYXRjaFVuYXR0cmFjdEV2ZW50cyA9IChzb3VyY2VOZXh0UmVjdDogRE9NUmVjdCkgPT4ge1xuICAgIGlmIChpZ25vcmVFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVuYXR0cmFjdFJlc3VsdHMuZm9yRWFjaCgodW5hdHRyYWN0UmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRQYWNrID0gdW5hdHRyYWN0UmVzdWx0LnRhcmdldDtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW0gPSB0YXJnZXRQYWNrLnJhdyBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IHVuYXR0cmFjdGVkRXZlbnREZXRhaWw6IFVuYXR0cmFjdGVkRXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFBhY2ssXG4gICAgICAgIHNvdXJjZU5leHRSZWN0LFxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlckV2ZW50PFVuYXR0cmFjdGVkRXZlbnREZXRhaWw+KFxuICAgICAgICB0YXJnZXRFbGVtLFxuICAgICAgICBFdmVudC51bmF0dHJhY3RlZCxcbiAgICAgICAge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB1bmF0dHJhY3RlZEV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZGlzcGF0Y2hBdHRyYWN0bW92ZUV2ZW50cyA9IChzb3VyY2VOZXh0UmVjdDogRE9NUmVjdCkgPT4ge1xuICAgIGlmIChpZ25vcmVFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF0dHJhY3Rtb3ZlUmVzdWx0cy5mb3JFYWNoKChhdHRyYWN0bW92ZVJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0UGFjayA9IGF0dHJhY3Rtb3ZlUmVzdWx0LnRhcmdldDtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW0gPSB0YXJnZXRQYWNrLnJhdyBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGF0dHJhY3RlZG1vdmVFdmVudERldGFpbDogQXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRQYWNrLFxuICAgICAgICBzb3VyY2VOZXh0UmVjdCxcbiAgICAgICAgZGlzdGFuY2U6IGF0dHJhY3Rtb3ZlUmVzdWx0LFxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlckV2ZW50PEF0dHJhY3RlZG1vdmVFdmVudERldGFpbD4oXG4gICAgICAgIHRhcmdldEVsZW0sXG4gICAgICAgIEV2ZW50LmF0dHJhY3RlZG1vdmUsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogYXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcblxuICBpZiAoIXBhc3NKdWRnZU1vdmVtZW50KSB7XG4gICAgaWYgKGxhc3RCZXN0WCkge1xuICAgICAgdW5hdHRyYWN0UmVzdWx0cy5wdXNoKGxhc3RCZXN0WCk7XG4gICAgfVxuICAgIGlmIChsYXN0QmVzdFkpIHtcbiAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFkpO1xuICAgIH1cblxuICAgIGRpc3BhdGNoVW5hdHRyYWN0RXZlbnRzKHNvdXJjZUluUGFyZW50UmVjdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IG51bGwsXG4gICAgICBhdHRyYWN0aW9uQmVzdDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYmVzdCBhdHRyYWN0aW9uIHJlc3VsdCBpZiBtYWduZXQgYWxpZ25zIHRvIHBhcmVudC5cbiAgICovXG4gIGNvbnN0IGF0dHJhY3Rpb25CZXN0OiBBdHRyYWN0aW9uQmVzdCA9IHt9O1xuXG4gIGNvbnN0IHtcbiAgICB1bmF0dHJhY3RhYmxlID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZV0sXG4gICAgYXR0cmFjdERpc3RhbmNlID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlXSxcbiAgICBhbGlnblRvcyA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmFsaWduVG9dLFxuICAgIGFsaWdubWVudHMgPSBNYWduZXQuZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKGFsaWduVG9zKSxcbiAgICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudCA9IHJldHVyblRydWUsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBzb3VyY2VSYXdQYWNrID0gbmV3IFBhY2soc291cmNlUmF3LCBzb3VyY2VSYXdSZWN0KTtcbiAgY29uc3Qgb25KdWRnZURpc3RhbmNlID0gKHVuYXR0cmFjdGFibGVcbiAgICA/IHJldHVybkZhbHNlXG4gICAgOiAob3B0aW9ucy5vbkp1ZGdlRGlzdGFuY2UgPz8gcmV0dXJuVHJ1ZSlcbiAgKTtcblxuICBpZiAoYWxpZ25Ub1BhcmVudCAmJiBwYXJlbnRQYWNrKSB7XG4gICAgY29uc3QgeyBiZXN0IH0gPSBzaW5nbGVBdHRyYWN0aW9uVG8oXG4gICAgICBzb3VyY2VSYXdQYWNrLFxuICAgICAgcGFyZW50UGFjayxcbiAgICAgIHtcbiAgICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgICBhbGlnblRvcyxcbiAgICAgICAgYWxpZ25tZW50cyxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXR0cmFjdGlvbkJlc3QueCA9IGJlc3QueDtcbiAgICBhdHRyYWN0aW9uQmVzdC55ID0gYmVzdC55O1xuICB9XG5cbiAgY29uc3Qgb25KdWRnZU11bHRpRGlzdGFuY2U6IE9uSnVkZ2VEaXN0YW5jZSA9IChrZWVwSW5QYXJlbnRcbiAgICA/ICgoZGlzdGFuY2UpID0+IChcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZUluUGFyZW50KGRpc3RhbmNlLCB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIHBhcmVudDogcGFyZW50UGFjayxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlLFxuICAgICAgfSlcbiAgICApKVxuICAgIDogb25KdWRnZURpc3RhbmNlXG4gICk7XG4gIGNvbnN0IG9uSnVkZ2VBdHRyYWN0aW9uID0gKHVuYXR0cmFjdGFibGVcbiAgICA/IHJldHVybkZhbHNlXG4gICAgOiAob3B0aW9ucy5vbkp1ZGdlQXR0cmFjdGlvbiA/PyByZXR1cm5UcnVlKVxuICApO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uID0gbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgIHNvdXJjZVJhd1BhY2ssXG4gICAgdGFyZ2V0UGFja3MsXG4gICAge1xuICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlOiBvbkp1ZGdlTXVsdGlEaXN0YW5jZSxcbiAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uLFxuICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgfSxcbiAgKTtcbiAgY29uc3Qgc291cmNlQXR0cmFjdGlvbkJlc3QgPSBzb3VyY2VBdHRyYWN0aW9uLmJlc3Q7XG4gIGNvbnN0IHNvdXJjZUF0dHJhY3Rpb25PZmZzZXQgPSBnZXRBdHRyYWN0aW9uT2Zmc2V0KHNvdXJjZUF0dHJhY3Rpb24pO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uUmVjdCA9IGNyZWF0ZVJlY3QoXG4gICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlQXR0cmFjdGlvbk9mZnNldC54LFxuICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUF0dHJhY3Rpb25PZmZzZXQueSxcbiAgICBzb3VyY2VXaWR0aCxcbiAgICBzb3VyY2VIZWlnaHQsXG4gICk7XG4gIGNvbnN0IHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldCA9IChrZWVwSW5QYXJlbnRcbiAgICA/IGdldE9mZnNldFRvQmVJblJlY3Qoc291cmNlQXR0cmFjdGlvblJlY3QsIHBhcmVudFJlY3QpXG4gICAgOiBjcmVhdGVQb2ludCgwLCAwKVxuICApO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uSW5QYXJlbnRSZWN0ID0gY3JlYXRlUmVjdChcbiAgICBzb3VyY2VBdHRyYWN0aW9uUmVjdC54ICsgc291cmNlQXR0cmFjdGlvbkluUGFyZW50T2Zmc2V0LngsXG4gICAgc291cmNlQXR0cmFjdGlvblJlY3QueSArIHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldC55LFxuICAgIHNvdXJjZVdpZHRoLFxuICAgIHNvdXJjZUhlaWdodCxcbiAgKTtcblxuICBpZiAoIWlnbm9yZUV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgeDogY3VycmVudEJlc3RYLFxuICAgICAgeTogY3VycmVudEJlc3RZLFxuICAgIH0gPSBzb3VyY2VBdHRyYWN0aW9uQmVzdDtcbiAgICBjb25zdCBsYXN0VGFyZ2V0WCA9IGxhc3RCZXN0WD8udGFyZ2V0O1xuICAgIGNvbnN0IGxhc3RUYXJnZXRZID0gbGFzdEJlc3RZPy50YXJnZXQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldFggPSBjdXJyZW50QmVzdFg/LnRhcmdldDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0WSA9IGN1cnJlbnRCZXN0WT8udGFyZ2V0O1xuICAgIGNvbnN0IGRpZmZUYXJnZXRYID0gY3VycmVudFRhcmdldFggIT09IGxhc3RUYXJnZXRYO1xuICAgIGNvbnN0IGRpZmZUYXJnZXRZID0gY3VycmVudFRhcmdldFkgIT09IGxhc3RUYXJnZXRZO1xuXG4gICAgLyoqXG4gICAgICogUmVjb3JkcyBhbmQgZGlzcGF0Y2hlcyBldmVudHMgb24geC95IHBhY2tzLlxuICAgICAqL1xuICAgIGlmIChkaWZmVGFyZ2V0WCkge1xuICAgICAgaWYgKGxhc3RUYXJnZXRYKSB7XG4gICAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFgpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRUYXJnZXRYKSB7XG4gICAgICAgIGF0dHJhY3RSZXN1bHRzLnB1c2goY3VycmVudEJlc3RYKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRUYXJnZXRYKSB7XG4gICAgICBjb25zdCBsYXN0QWxpZ25tZW50WCA9IGxhc3RCZXN0WD8uYWxpZ25tZW50O1xuICAgICAgY29uc3QgY3VycmVudEFsaWdubWVudFggPSBjdXJyZW50QmVzdFguYWxpZ25tZW50O1xuXG4gICAgICBpZiAobGFzdEFsaWdubWVudFggIT09IGN1cnJlbnRBbGlnbm1lbnRYKSB7XG4gICAgICAgIGF0dHJhY3RSZXN1bHRzLnB1c2goY3VycmVudEJlc3RYKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF0dHJhY3Rtb3ZlUmVzdWx0cy5wdXNoKGN1cnJlbnRCZXN0WCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZmZUYXJnZXRZKSB7XG4gICAgICBpZiAobGFzdFRhcmdldFkpIHtcbiAgICAgICAgdW5hdHRyYWN0UmVzdWx0cy5wdXNoKGxhc3RCZXN0WSk7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFRhcmdldFkpIHtcbiAgICAgICAgYXR0cmFjdFJlc3VsdHMucHVzaChjdXJyZW50QmVzdFkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3VycmVudFRhcmdldFkpIHtcbiAgICAgIGNvbnN0IGxhc3RBbGlnbm1lbnRZID0gbGFzdEJlc3RZPy5hbGlnbm1lbnQ7XG4gICAgICBjb25zdCBjdXJyZW50QWxpZ25tZW50WSA9IGN1cnJlbnRCZXN0WS5hbGlnbm1lbnQ7XG5cbiAgICAgIGlmIChsYXN0QWxpZ25tZW50WSAhPT0gY3VycmVudEFsaWdubWVudFkpIHtcbiAgICAgICAgYXR0cmFjdFJlc3VsdHMucHVzaChjdXJyZW50QmVzdFkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmFjdG1vdmVSZXN1bHRzLnB1c2goY3VycmVudEJlc3RZKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRyYWN0aW9uIGhhcHBlbnMuXG4gICAgICovXG4gICAgaWYgKGF0dHJhY3RSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dHJhY3RFdmVudERldGFpbDogQXR0cmFjdEV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgbmV4dFJlY3Q6IHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QsXG4gICAgICAgIGF0dHJhY3Rpb246IHNvdXJjZUF0dHJhY3Rpb24sXG4gICAgICB9O1xuICAgICAgY29uc3QgcGFzc0F0dHJhY3RFdmVudCA9IHRyaWdnZXJFdmVudDxBdHRyYWN0RXZlbnREZXRhaWw+KFxuICAgICAgICBzb3VyY2VSYXcsXG4gICAgICAgIEV2ZW50LmF0dHJhY3QsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBhdHRyYWN0RXZlbnREZXRhaWwsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAoIXBhc3NBdHRyYWN0RXZlbnQpIHtcbiAgICAgICAgaWYgKGxhc3RCZXN0WCkge1xuICAgICAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0QmVzdFkpIHtcbiAgICAgICAgICB1bmF0dHJhY3RSZXN1bHRzLnB1c2gobGFzdEJlc3RZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9zaXRpb246IGNyZWF0ZVBvaW50KFxuICAgICAgICAgICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlSW5QYXJlbnRPZmZzZXQueCxcbiAgICAgICAgICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUluUGFyZW50T2Zmc2V0LnksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhdHRyYWN0aW9uQmVzdDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5hdHRyYWN0UmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB1bmF0dHJhY3RFdmVudERldGFpbDogVW5hdHRyYWN0RXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICBuZXh0UmVjdDogc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCxcbiAgICAgICAgYXR0cmFjdGlvbjogc291cmNlQXR0cmFjdGlvbixcbiAgICAgIH07XG5cbiAgICAgIHRyaWdnZXJFdmVudDxVbmF0dHJhY3RFdmVudERldGFpbD4oXG4gICAgICAgIHNvdXJjZVJhdyxcbiAgICAgICAgRXZlbnQudW5hdHRyYWN0LFxuICAgICAgICB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHVuYXR0cmFjdEV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0cmFjdG1vdmVSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dHJhY3Rtb3ZlRXZlbnREZXRhaWw6IEF0dHJhY3Rtb3ZlRXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICBuZXh0UmVjdDogc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCxcbiAgICAgICAgYXR0cmFjdGlvbjogc291cmNlQXR0cmFjdGlvbixcbiAgICAgIH07XG5cbiAgICAgIHRyaWdnZXJFdmVudDxBdHRyYWN0bW92ZUV2ZW50RGV0YWlsPihcbiAgICAgICAgc291cmNlUmF3LFxuICAgICAgICBFdmVudC5hdHRyYWN0bW92ZSxcbiAgICAgICAge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBhdHRyYWN0bW92ZUV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkaXNwYXRjaEF0dHJhY3RFdmVudHMoc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCk7XG4gIGRpc3BhdGNoVW5hdHRyYWN0RXZlbnRzKHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QpO1xuICBkaXNwYXRjaEF0dHJhY3Rtb3ZlRXZlbnRzKHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QpO1xuXG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IGNyZWF0ZVBvaW50KFxuICAgICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlQXR0cmFjdGlvbk9mZnNldC54ICsgc291cmNlQXR0cmFjdGlvbkluUGFyZW50T2Zmc2V0LngsXG4gICAgICBzb3VyY2VSYXdSZWN0LnkgKyBzb3VyY2VBdHRyYWN0aW9uT2Zmc2V0LnkgKyBzb3VyY2VBdHRyYWN0aW9uSW5QYXJlbnRPZmZzZXQueSxcbiAgICApLFxuICAgIGF0dHJhY3Rpb25CZXN0OiBzb3VyY2VBdHRyYWN0aW9uQmVzdCxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb247XG4iLCJpbXBvcnQgeyBjcmVhdGVQb2ludCB9IGZyb20gJy4uL3R5cGVzL1BvaW50JztcblxuLyoqXG4gKiBSZXR1cm5zICh4LCB5KSBvZiBtb3VzdC90b3VjaCBldmVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRYWShldmVudDogUG9pbnRlckV2ZW50KTogRE9NUG9pbnQge1xuICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGV2ZW50O1xuXG4gIHJldHVybiBjcmVhdGVQb2ludChjbGllbnRYLCBjbGllbnRZKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0RXZlbnRYWTtcbiIsImltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uIGZyb20gJy4uL21ldGhvZHMvYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24nO1xuaW1wb3J0IHsgT25KdWRnZU1vdmVtZW50IH0gZnJvbSAnLi4vbWV0aG9kcy9qdWRnZU1vdmVtZW50JztcbmltcG9ydCB7IE1vdmVFdmVudERldGFpbCwgU3RhcnRFdmVudERldGFpbCB9IGZyb20gJy4uL3R5cGVzL0V2ZW50RGV0YWlsJztcbmltcG9ydCBQYWNrIGZyb20gJy4uL3R5cGVzL1BhY2snO1xuaW1wb3J0IGNyZWF0ZVBvaW50IGZyb20gJy4uL3R5cGVzL1BvaW50JztcbmltcG9ydCBjcmVhdGVSZWN0IGZyb20gJy4uL3R5cGVzL1JlY3QnO1xuaW1wb3J0IEF0dHJpYnV0ZSBmcm9tICcuLi92YWx1ZXMvYXR0cmlidXRlJztcbmltcG9ydCBFdmVudCBmcm9tICcuLi92YWx1ZXMvZXZlbnQnO1xuaW1wb3J0IHsgYWRkRXZlbnRMaXN0ZW5lcnMsIHJlbW92ZUV2ZW50TGlzdGVuZXJzLCB0cmlnZ2VyRXZlbnQgfSBmcm9tICcuL2V2ZW50SGFuZGxlcic7XG5pbXBvcnQgZ2V0RXZlbnRYWSBmcm9tICcuL2dldEV2ZW50WFknO1xuXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gWydwb2ludGVyZG93biddO1xuY29uc3QgRVZFTlRfRFJBR19NT1ZFID0gWydwb2ludGVybW92ZSddO1xuY29uc3QgRVZFTlRfRFJBR19FTkQgPSBbJ3BvaW50ZXJ1cCddO1xuXG4vKipcbiAqIFJlc2V0cyBtYWduZXQgY2FjaGVzLlxuICovXG5mdW5jdGlvbiByZXNldE1hZ25ldENhY2hlcyhtYWduZXQ6IE1hZ25ldCk6IHZvaWQge1xuICBtYWduZXQucmVzZXRNYWduZXRSZWN0KCk7XG4gIG1hZ25ldC5yZXNldFBhcmVudFBhY2soKTtcbiAgbWFnbmV0LnJlc2V0VGFyZ2V0TWFnbmV0UGFja3MoKTtcbn1cblxuLyoqXG4gKiBFdmVudCBsaXN0ZW5lciBvZiBkcmFnIG1vdmUgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVMaXN0ZW5lcihcbiAgdGhpczogTWFnbmV0LFxuICBzdGFydFBvaW50OiBET01Qb2ludCxcbiAgc3RhcnRMYXN0T2Zmc2V0OiBET01Qb2ludCxcbiAgbW92ZVBvaW50OiBET01Qb2ludCxcbik6IERPTVBvaW50IHtcbiAgY29uc3Qge1xuICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgdGFyZ2V0TWFnbmV0UGFja3M6IHRhcmdldFBhY2tzLFxuICAgIGp1ZGdlTWFnbmV0TW92ZW1lbnQsXG4gIH0gPSB0aGlzO1xuICBjb25zdCBvbkp1ZGdlTW92ZW1lbnQ6IE9uSnVkZ2VNb3ZlbWVudCA9IChuZXh0U291cmNlUGFjaykgPT4ge1xuICAgIGlmICghanVkZ2VNYWduZXRNb3ZlbWVudChuZXh0U291cmNlUGFjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtb3ZlRXZlbnREZXRhaWw6IE1vdmVFdmVudERldGFpbCA9IHtcbiAgICAgIHNvdXJjZTogbmV4dFNvdXJjZVBhY2ssXG4gICAgICB0YXJnZXRzOiB0YXJnZXRQYWNrcyxcbiAgICAgIHN0YXJ0UG9pbnQ6IGNyZWF0ZVBvaW50KHN0YXJ0UG9pbnQpLFxuICAgICAgbW92ZVBvaW50OiBjcmVhdGVQb2ludChtb3ZlUG9pbnQpLFxuICAgIH07XG4gICAgY29uc3QgcGFzc01vdmVFdmVudCA9IHRyaWdnZXJFdmVudDxNb3ZlRXZlbnREZXRhaWw+KFxuICAgICAgdGhpcyxcbiAgICAgIEV2ZW50Lm1hZ25ldG1vdmUsXG4gICAgICB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IG1vdmVFdmVudERldGFpbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBwYXNzTW92ZUV2ZW50O1xuICB9O1xuICBjb25zdCB7IHBvc2l0aW9uLCBhdHRyYWN0aW9uQmVzdCB9ID0gYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgbmV3IFBhY2sodGhpcywgY3JlYXRlUmVjdChcbiAgICAgIHNvdXJjZVJlY3QueCArIG1vdmVQb2ludC54IC0gc3RhcnRQb2ludC54LFxuICAgICAgc291cmNlUmVjdC55ICsgbW92ZVBvaW50LnkgLSBzdGFydFBvaW50LnksXG4gICAgICBzb3VyY2VSZWN0LndpZHRoLFxuICAgICAgc291cmNlUmVjdC5oZWlnaHQsXG4gICAgKSksXG4gICAgdGFyZ2V0UGFja3MsXG4gICAge1xuICAgICAgdW5hdHRyYWN0YWJsZTogdGhpcy51bmF0dHJhY3RhYmxlLFxuICAgICAgYXR0cmFjdERpc3RhbmNlOiB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zOiB0aGlzLmFsaWduVG9zLFxuICAgICAgYWxpZ25Ub1BhcmVudHM6IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBjcm9zc1ByZXZlbnRzOiB0aGlzLmNyb3NzUHJldmVudHMsXG4gICAgICBwYXJlbnRQYWNrOiB0aGlzLnBhcmVudFBhY2ssXG4gICAgICBsYXN0QXR0cmFjdGlvbkJlc3Q6IHRoaXMubGFzdEF0dHJhY3Rpb25CZXN0LFxuICAgICAgb25KdWRnZURpc3RhbmNlOiB0aGlzLmp1ZGdlTWFnbmV0RGlzdGFuY2UsXG4gICAgICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudDogdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlSW5QYXJlbnQsXG4gICAgICBvbkp1ZGdlQXR0cmFjdGlvbjogdGhpcy5qdWRnZU1hZ25ldEF0dHJhY3Rpb24sXG4gICAgICBvbkp1ZGdlTW92ZW1lbnQsXG4gICAgfSxcbiAgKTtcbiAgdGhpcy5zZXRNYWduZXRPZmZzZXQoXG4gICAgKHBvc2l0aW9uPy54ID8/IHNvdXJjZVJlY3QueCkgLSBzb3VyY2VSZWN0LnggKyBzdGFydExhc3RPZmZzZXQueCxcbiAgICAocG9zaXRpb24/LnkgPz8gc291cmNlUmVjdC55KSAtIHNvdXJjZVJlY3QueSArIHN0YXJ0TGFzdE9mZnNldC55LFxuICApO1xuICB0aGlzLmxhc3RBdHRyYWN0aW9uQmVzdCA9IGF0dHJhY3Rpb25CZXN0O1xuXG4gIHJldHVybiBtb3ZlUG9pbnQ7XG59XG5cbi8qKlxuICogRXZlbnQgbGlzdGVuZXIgb2YgZHJhZyBzdGFydCBldmVudC5cbiAqL1xuZnVuY3Rpb24gc3RhcnRMaXN0ZW5lcihcbiAgdGhpczogTWFnbmV0LFxuICBldmVudDogUG9pbnRlckV2ZW50LFxuKTogdm9pZCB7XG4gIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMudW5tb3ZhYmxlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRQb2ludCA9IGdldEV2ZW50WFkoZXZlbnQpO1xuXG4gIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZTtcbiAgcmVzZXRNYWduZXRDYWNoZXModGhpcyk7XG5cbiAgY29uc3Qge1xuICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgdGFyZ2V0TWFnbmV0UGFja3M6IHRhcmdldFBhY2tzLFxuICB9ID0gdGhpcztcbiAgY29uc3Qgc291cmNlUGFjayA9IG5ldyBQYWNrKHRoaXMsIHNvdXJjZVJlY3QpO1xuICBjb25zdCBzdGFydEV2ZW50RGV0YWlsOiBTdGFydEV2ZW50RGV0YWlsID0ge1xuICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICB0YXJnZXRzOiB0YXJnZXRQYWNrcyxcbiAgICBzdGFydFBvaW50OiBjcmVhdGVQb2ludChzdGFydFBvaW50KSxcbiAgfTtcbiAgY29uc3QgcGFzc1N0YXJ0RXZlbnQgPSB0cmlnZ2VyRXZlbnQ8U3RhcnRFdmVudERldGFpbD4oXG4gICAgdGhpcyxcbiAgICBFdmVudC5tYWduZXRzdGFydCxcbiAgICB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgZGV0YWlsOiBzdGFydEV2ZW50RGV0YWlsLFxuICAgIH0sXG4gICk7XG5cbiAgaWYgKCFwYXNzU3RhcnRFdmVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBsYXN0TW92ZVBvaW50OiBET01Qb2ludCA9IHN0YXJ0UG9pbnQ7XG4gIGNvbnN0IGRyYWdNb3ZlSGFuZGxlciA9IG1vdmVMaXN0ZW5lci5iaW5kKHRoaXMsIHN0YXJ0UG9pbnQsIHRoaXMubGFzdE9mZnNldCk7XG4gIGNvbnN0IGRyYWdNb3ZlTGlzdGVuZXIgPSAoZXZ0OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBjb25zdCBtb3ZlUG9pbnQgPSBnZXRFdmVudFhZKGV2dCk7XG5cbiAgICBsYXN0TW92ZVBvaW50ID0gZHJhZ01vdmVIYW5kbGVyKG1vdmVQb2ludCk7XG4gIH07XG4gIGNvbnN0IGF0dHJpYnV0ZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgIGRyYWdNb3ZlSGFuZGxlcihsYXN0TW92ZVBvaW50KTtcbiAgfSk7XG4gIGNvbnN0IGRyYWdFbmRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICB0aGlzLmlzTW92aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnei1pbmRleCcpO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRvY3VtZW50LCBFVkVOVF9EUkFHX01PVkUsIGRyYWdNb3ZlTGlzdGVuZXIpO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRvY3VtZW50LCBFVkVOVF9EUkFHX0VORCwgZHJhZ0VuZExpc3RlbmVyKTtcbiAgICBhdHRyaWJ1dGVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgcmVzZXRNYWduZXRDYWNoZXModGhpcyk7XG4gICAgdHJpZ2dlckV2ZW50KHRoaXMsIEV2ZW50Lm1hZ25ldGVuZCwge1xuICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5pc01vdmluZyA9IHRydWU7XG4gIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ3otaW5kZXgnLCBgJHtEYXRlLm5vdygpfWApO1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBhZGRFdmVudExpc3RlbmVycyhkb2N1bWVudCwgRVZFTlRfRFJBR19NT1ZFLCBkcmFnTW92ZUxpc3RlbmVyKTtcbiAgYWRkRXZlbnRMaXN0ZW5lcnMoZG9jdW1lbnQsIEVWRU5UX0RSQUdfRU5ELCBkcmFnRW5kTGlzdGVuZXIpO1xuICBhdHRyaWJ1dGVPYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgIGF0dHJpYnV0ZUZpbHRlcjogT2JqZWN0LnZhbHVlcyhBdHRyaWJ1dGUpLFxuICB9KTtcbiAgZHJhZ01vdmVIYW5kbGVyKGxhc3RNb3ZlUG9pbnQpO1xufVxuXG4vKipcbiAqIEFkZHMgYmFzaWMgZHJhZyBldmVudCBsaXN0ZW5lcnMgb2YgbWFnbmV0LlxuICovXG5mdW5jdGlvbiBhZGRCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0OiBNYWduZXQpOiB2b2lkIHtcbiAgYWRkRXZlbnRMaXN0ZW5lcnMobWFnbmV0LCBFVkVOVF9EUkFHX1NUQVJULCBzdGFydExpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGJhc2ljIGRyYWcgZXZlbnQgbGlzdGVuZXJzIG9mIG1hZ25ldC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQmFzaWNEcmFnTGlzdGVuZXJzKG1hZ25ldDogTWFnbmV0KTogdm9pZCB7XG4gIHJlbW92ZUV2ZW50TGlzdGVuZXJzKG1hZ25ldCwgRVZFTlRfRFJBR19TVEFSVCwgc3RhcnRMaXN0ZW5lcik7XG59XG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIGRyYWcgZXZlbnQgbGlzdGVuZXJzIG9mIG1hZ25ldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRHJhZ0xpc3RlbmVycyhtYWduZXQ6IE1hZ25ldCk6IHZvaWQge1xuICBpZiAobWFnbmV0LmRpc2FibGVkIHx8IG1hZ25ldC51bm1vdmFibGUpIHtcbiAgICByZW1vdmVCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0KTtcbiAgfSBlbHNlIHtcbiAgICBhZGRCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBzdGFydExpc3RlbmVyO1xuIiwiZW51bSBTdHlsZSB7XG4gIG9mZnNldFggPSAnLS1vZmZzZXQteCcsXG4gIG9mZnNldFkgPSAnLS1vZmZzZXQteScsXG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0eWxlO1xuIiwiaW1wb3J0IE1hZ25ldFBhY2sgZnJvbSAnLi9jb3JlJztcbmltcG9ydCBkaXN0YW5jZVRvIGZyb20gJy4vbWV0aG9kcy9kaXN0YW5jZVRvJztcbmltcG9ydCByYXdEaXN0YW5jZVRvIGZyb20gJy4vbWV0aG9kcy9yYXdEaXN0YW5jZVRvJztcbmltcG9ydCBtdWx0aUF0dHJhY3Rpb25zVG8sIHsgTXVsdGlBdHRyYWN0aW9uc1RvT3B0aW9ucyB9IGZyb20gJy4vbWV0aG9kcy9tdWx0aUF0dHJhY3Rpb25zVG8nO1xuaW1wb3J0IHNpbmdsZUF0dHJhY3Rpb25UbywgeyBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zIH0gZnJvbSAnLi9tZXRob2RzL3NpbmdsZUF0dHJhY3Rpb25Ubyc7XG5pbXBvcnQganVkZ2VBdHRyYWN0aW9uIGZyb20gJy4vbWV0aG9kcy9qdWRnZUF0dHJhY3Rpb24nO1xuaW1wb3J0IGp1ZGdlRGlzdGFuY2UgZnJvbSAnLi9tZXRob2RzL2p1ZGdlRGlzdGFuY2UnO1xuaW1wb3J0IGp1ZGdlRGlzdGFuY2VJblBhcmVudCBmcm9tICcuL21ldGhvZHMvanVkZ2VEaXN0YW5jZUluUGFyZW50JztcbmltcG9ydCBqdWRnZU1vdmVtZW50IGZyb20gJy4vbWV0aG9kcy9qdWRnZU1vdmVtZW50JztcbmltcG9ydCB7IEF0dHJhY3Rpb25CZXN0IH0gZnJvbSAnLi90eXBlcy9BdHRyYWN0aW9uJztcbmltcG9ydCBQYWNrLCB7IGdldFBhY2ssIFJlY3RhYmxlIH0gZnJvbSAnLi90eXBlcy9QYWNrJztcbmltcG9ydCBjcmVhdGVQb2ludCBmcm9tICcuL3R5cGVzL1BvaW50JztcbmltcG9ydCBjcmVhdGVSZWN0LCB7IGdldFJlY3QgfSBmcm9tICcuL3R5cGVzL1JlY3QnO1xuaW1wb3J0IHsgY2hlY2tEcmFnTGlzdGVuZXJzIH0gZnJvbSAnLi91dGlscy9kcmFnTGlzdGVuZXInO1xuaW1wb3J0IHJlZ2lzdGVyRWxlbWVudCBmcm9tICcuL3V0aWxzL3JlZ2lzdGVyRWxlbWVudCc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4vdmFsdWVzL2FsaWdubWVudCc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4vdmFsdWVzL2F0dHJpYnV0ZSc7XG5pbXBvcnQgT2Zmc2V0VW5pdCBmcm9tICcuL3ZhbHVlcy9vZmZzZXRVbml0JztcbmltcG9ydCBTdHlsZSBmcm9tICcuL3ZhbHVlcy9zdHlsZSc7XG5pbXBvcnQgeyBBbGlnblRvUGFyZW50IH0gZnJvbSAnLi92YWx1ZXMvYWxpZ25Ubyc7XG5pbXBvcnQgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24sIHsgQXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb25PcHRpb25zIH0gZnJvbSAnLi9tZXRob2RzL2F0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uJztcblxuY29uc3Qgbm9kZU5hbWUgPSAnbWFnbmV0LWJsb2NrJztcbmNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcblxudGVtcGxhdGUuaW5uZXJIVE1MID0gYFxuICA8c3R5bGU+XG4gICAgOmhvc3Qge1xuICAgICAgLS14OiB2YXIoJHtTdHlsZS5vZmZzZXRYfSwgMCk7XG4gICAgICAtLXk6IHZhcigke1N0eWxlLm9mZnNldFl9LCAwKTtcblxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0teCksIHZhcigtLXkpKTtcbiAgICAgIHRvdWNoLWFjdGlvbjogbm9uZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxzbG90PlxuICA8L3Nsb3Q+XG5gO1xuXG5jbGFzcyBNYWduZXQgZXh0ZW5kcyBNYWduZXRQYWNrIHtcbiAgcHJvdGVjdGVkIHJlY3RDYWNoZTogRE9NUmVjdCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBwYXJlbnRQYWNrQ2FjaGU6IFBhY2sgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgdGFyZ2V0TWFnbmV0UGFja3NDYWNoZTogUGFja1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGlzTW92aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGxhc3RPZmZzZXQ6IERPTVBvaW50ID0gY3JlYXRlUG9pbnQoMCwgMCk7XG5cbiAgcHJvdGVjdGVkIGxhc3RBdHRyYWN0aW9uQmVzdDogQXR0cmFjdGlvbkJlc3QgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgKHRoaXMuc2hhZG93Um9vdCBhcyBTaGFkb3dSb290KS5hcHBlbmQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIGNoZWNrRHJhZ0xpc3RlbmVycyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgbWFnbmV0IGlzIGRpc2FibGVkLlxuICAgKi9cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGRpc2FibGVkIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHN1cGVyLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgY2hlY2tEcmFnTGlzdGVuZXJzKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFnbmV0IGlzIHVuYWJsZSB0byBiZSBkcmFnZ2VkLlxuICAgKi9cbiAgZ2V0IHVubW92YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIudW5tb3ZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdW5tb3ZhYmxlIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCB1bm1vdmFibGUodW5tb3ZhYmxlOiBib29sZWFuKSB7XG4gICAgc3VwZXIudW5tb3ZhYmxlID0gdW5tb3ZhYmxlO1xuICAgIGNoZWNrRHJhZ0xpc3RlbmVycyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlY3Qgb2JqZWN0IG9mIHRoaXMgbWFnbmV0LlxuICAgKi9cbiAgZ2V0IG1hZ25ldFJlY3QoKTogRE9NUmVjdCB7XG4gICAgaWYgKCF0aGlzLnJlY3RDYWNoZSkge1xuICAgICAgdGhpcy5yZWN0Q2FjaGUgPSBnZXRSZWN0KHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlY3RDYWNoZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHJlY3Qgb2JqZWN0IG9mIHRoaXMgbWFnbmV0LlxuICAgKi9cbiAgcmVzZXRNYWduZXRSZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01vdmluZykge1xuICAgICAgdGhpcy5yZWN0Q2FjaGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBhY2sgb2JqZWN0IG9mIHBhcmVudCBpZiBleGlzdGluZy5cbiAgICovXG4gIGdldCBwYXJlbnRQYWNrKCk6IFBhY2sge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuXG4gICAgaWYgKCF0aGlzLnBhcmVudFBhY2tDYWNoZSkge1xuICAgICAgdGhpcy5wYXJlbnRQYWNrQ2FjaGUgPSBnZXRQYWNrKHBhcmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyZW50UGFja0NhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgcGFjayBvYmplY3Qgb2YgdGhlIHBhcmVudCBvZiBtYWduZXQuXG4gICAqL1xuICByZXNldFBhcmVudFBhY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTW92aW5nKSB7XG4gICAgICB0aGlzLnBhcmVudFBhY2tDYWNoZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFjayBvYmplY3RzIG9mIHRhcmdldCBtYWduZXRzLlxuICAgKi9cbiAgZ2V0IHRhcmdldE1hZ25ldFBhY2tzKCk6IFBhY2tbXSB7XG4gICAgaWYgKCF0aGlzLnRhcmdldE1hZ25ldFBhY2tzQ2FjaGUpIHtcbiAgICAgIHRoaXMudGFyZ2V0TWFnbmV0UGFja3NDYWNoZSA9IHRoaXMuZ2V0QXR0cmFjdGFibGVNYWduZXRzKClcbiAgICAgICAgLm1hcCgodGFyZ2V0KSA9PiBnZXRQYWNrKHRhcmdldCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRhcmdldE1hZ25ldFBhY2tzQ2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBwYWNrIG9iamVjdHMgb2YgdGFyZ2V0IG1hZ25ldHMuXG4gICAqL1xuICByZXNldFRhcmdldE1hZ25ldFBhY2tzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01vdmluZykge1xuICAgICAgdGhpcy50YXJnZXRNYWduZXRQYWNrc0NhY2hlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBvdGhlciBtYWduZXQgZWxlbWVudHMuXG4gICAqL1xuICBnZXRPdGhlck1hZ25ldHMoKTogTWFnbmV0W10ge1xuICAgIHJldHVybiAoQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG5vZGVOYW1lKSkgYXMgTWFnbmV0W10pXG4gICAgICAuZmlsdGVyKChtYWduZXQpID0+IG1hZ25ldCAhPT0gdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhdHRyYWN0YWJsZSBtYWduZXQgZWxlbWVudHMuXG4gICAqL1xuICBnZXRBdHRyYWN0YWJsZU1hZ25ldHMoKTogTWFnbmV0W10ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMudW5hdHRyYWN0YWJsZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ3JvdXAgfSA9IHRoaXM7XG4gICAgY29uc3QgaGFzR3JvdXAgPSBncm91cCAhPT0gbnVsbDtcbiAgICBjb25zdCBub25EaXNhYmxlZFNlbGVjdG9yID0gYDpub3QoWyR7QXR0cmlidXRlLmRpc2FibGVkfV0pYDtcbiAgICBjb25zdCBub25VbmF0dHJhY3RhYmxlU2VsZWN0b3IgPSBgOm5vdChbJHtBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZX1dKWA7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgJHtub2RlTmFtZX0ke25vbkRpc2FibGVkU2VsZWN0b3J9JHtub25VbmF0dHJhY3RhYmxlU2VsZWN0b3J9YDtcbiAgICBjb25zdCBtYWduZXRzID0gKEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpIGFzIE1hZ25ldFtdKVxuICAgICAgLmZpbHRlcigobWFnbmV0KSA9PiAoXG4gICAgICAgIG1hZ25ldCAhPT0gdGhpc1xuICAgICAgICAmJiAhdGhpcy5jb250YWlucyhtYWduZXQpXG4gICAgICAgICYmIChoYXNHcm91cCA/IGdyb3VwID09PSBtYWduZXQuZ3JvdXAgOiB0cnVlKVxuICAgICAgKSk7XG5cbiAgICByZXR1cm4gbWFnbmV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc3RhbmNlIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gICAqIGRpc3RhbmNlIHdvdWxkIG5vdCBiZSBsaXN0ZWQgb24gdGhlIGF0dHJhY3Rpb24gcmVzdWx0LlxuICAgKi9cbiAganVkZ2VNYWduZXREaXN0YW5jZSguLi5bXG4gICAgZGlzdGFuY2UsXG4gICAgb3B0aW9ucyA9IHt9LFxuICBdOiBQYXJhbWV0ZXJzPHR5cGVvZiBqdWRnZURpc3RhbmNlPikge1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSA9IHRoaXMuYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MgPSB0aGlzLmFsaWduVG9zLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIGp1ZGdlRGlzdGFuY2UoZGlzdGFuY2UsIHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1lIGFzIC5qdWRnZU1hZ25ldERpc2FuY2UgYnV0IGNvbnNpZGVyIGEgd3JhcHBlciBlbGVtZW50LlxuICAgKi9cbiAganVkZ2VNYWduZXREaXN0YW5jZUluUGFyZW50KC4uLltcbiAgICBkaXN0YW5jZSxcbiAgICBvcHRpb25zID0ge30sXG4gIF06IFBhcmFtZXRlcnM8dHlwZW9mIGp1ZGdlRGlzdGFuY2VJblBhcmVudD4pIHtcbiAgICBjb25zdCB7XG4gICAgICBhdHRyYWN0RGlzdGFuY2UgPSB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zID0gdGhpcy5hbGlnblRvcyxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSA9IHRoaXMuanVkZ2VNYWduZXREaXN0YW5jZSxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudCA/PyB0aGlzLnBhcmVudFBhY2s7XG5cbiAgICByZXR1cm4ganVkZ2VEaXN0YW5jZUluUGFyZW50KGRpc3RhbmNlLCB7XG4gICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyxcbiAgICAgIHBhcmVudCxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGF0dHJhY3Rpb24gcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZSB0aGVcbiAgICogZGlzdGFuY2UgcmVzdWx0cyBvZiBhdHRyYWN0aW9uIHdvdWxkIG5vdCBiZSBsaXN0ZWQgb24gdGhlIHJlc3VsdCBvZlxuICAgKiBhdHRyYWN0aW9ucy5cbiAgICovXG4gIGp1ZGdlTWFnbmV0QXR0cmFjdGlvbiA9IGp1ZGdlQXR0cmFjdGlvblxuXG4gIC8qKlxuICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2Zmc2V0IG9mIHBhY2sgcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZVxuICAqIHRoZSBtYWduZXQgd291bGQgbm90IGJlIGFwcGxpZWQgdGhlIG1vdmVtZW50LlxuICAqL1xuICBqdWRnZU1hZ25ldE1vdmVtZW50ID0ganVkZ2VNb3ZlbWVudFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRpc3RhbmNlIHZhbHVlIHRvIHRhcmdldCBvbiBzcGVjaWZpYyBhbGlnbm1lbnQuXG4gICAqL1xuICByYXdEaXN0YW5jZVRvKFxuICAgIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICAgIGFsaWdubWVudDogQWxpZ25tZW50LFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdCh0aGlzKTtcbiAgICBjb25zdCB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuXG4gICAgcmV0dXJuIHJhd0Rpc3RhbmNlVG8oc291cmNlUmVjdCwgdGFyZ2V0UmVjdCwgYWxpZ25tZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRpc3RhbmNlIG9iamVjdCB0byB0YXJnZXQgb24gYWxpZ25tZW50LlxuICAgKi9cbiAgZGlzdGFuY2VUbyhcbiAgICB0YXJnZXQ6IFJlY3RhYmxlIHwgUGFjayxcbiAgICBhbGlnbm1lbnQ6IEFsaWdubWVudCxcbiAgKSB7XG4gICAgcmV0dXJuIGRpc3RhbmNlVG8odGhpcywgdGFyZ2V0LCBhbGlnbm1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVzdWx0IG9mIGF0dHJhY3Rpb25zIHRvIHRhcmdldCBvbiBhbGlnbm1lbnRzLlxuICAgKi9cbiAgYXR0cmFjdGlvblRvKFxuICAgIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICAgIG9wdGlvbnM6IFNpbmdsZUF0dHJhY3Rpb25Ub09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXR0cmFjdERpc3RhbmNlID0gdGhpcy5hdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyA9IHRoaXMuYWxpZ25Ub3MsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIHNpbmdsZUF0dHJhY3Rpb25UbyhcbiAgICAgIHRoaXMsXG4gICAgICB0YXJnZXQsXG4gICAgICB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlc3VsdCBvZiBhdHRyYWN0aW9ucyB0byBwYXJlbnQgb24gYWxpZ25tZW50cy5cbiAgICovXG4gIGF0dHJhY3Rpb25Ub1BhcmVudChcbiAgICBvcHRpb25zOiBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zID0ge30sXG4gICkge1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSA9IHRoaXMuYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MgPSB0aGlzLmFsaWduVG9QYXJlbnRzLFxuICAgICAgYWxpZ25tZW50cyxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSA9IHRoaXMuanVkZ2VNYWduZXREaXN0YW5jZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBzaW5nbGVBdHRyYWN0aW9uVG8oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5wYXJlbnRQYWNrLFxuICAgICAge1xuICAgICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICAgIGFsaWduVG9zLFxuICAgICAgICBhbGlnbm1lbnRzLFxuICAgICAgICBvbkp1ZGdlRGlzdGFuY2UsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0cyBvbiBhbGlnbm1lbnRzLlxuICAgKi9cbiAgbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgIHRhcmdldHM6IChSZWN0YWJsZSB8IFBhY2spW10sXG4gICAgb3B0aW9uczogTXVsdGlBdHRyYWN0aW9uc1RvT3B0aW9ucyAmIHtcbiAgICAgIGFsaWduVG9QYXJlbnRzPzogQWxpZ25Ub1BhcmVudFtdO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXR0cmFjdERpc3RhbmNlID0gdGhpcy5hdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyA9IHRoaXMuYWxpZ25Ub3MsXG4gICAgICBhbGlnblRvUGFyZW50cyA9IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgICBvbkp1ZGdlQXR0cmFjdGlvbiA9IHRoaXMuanVkZ2VNYWduZXRBdHRyYWN0aW9uLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBhcmVudEF0dHJhY3Rpb24gPSBNYWduZXQucHJvdG90eXBlLmF0dHJhY3Rpb25Ub1BhcmVudC5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgIHtcbiAgICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgICBhbGlnblRvczogYWxpZ25Ub1BhcmVudHMsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgICAgdGhpcyxcbiAgICAgIHRhcmdldHMsXG4gICAgICB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgb25KdWRnZUF0dHJhY3Rpb24sXG4gICAgICAgIGF0dHJhY3Rpb25CZXN0OiBwYXJlbnRBdHRyYWN0aW9uPy5iZXN0LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmluYWwgYXZhaWxhYmxlIHBvc2l0aW9uIGFuZCBhdHRyYWN0aW9uIG9uIHNwZWNpZmljIHBvc2l0aW9uLlxuICAgKi9cbiAgZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgcG9zaXRpb246IERPTVBvaW50LFxuICAgIG9wdGlvbnM/OiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMsXG4gICk6IFJldHVyblR5cGU8dHlwZW9mIGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uPlxuXG4gIGdldE1hZ25ldEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0aW9ucz86IEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uT3B0aW9ucyxcbiAgKTogUmV0dXJuVHlwZTx0eXBlb2YgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24+XG5cbiAgZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb248QTAgZXh0ZW5kcyBET01Qb2ludCB8IG51bWJlcj4oXG4gICAgYXJnMDogQTAsXG4gICAgYXJnMT86IEEwIGV4dGVuZHMgRE9NUG9pbnQgPyBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMgOiBudW1iZXIsXG4gICAgYXJnMj86IEEwIGV4dGVuZHMgRE9NUG9pbnQgPyB1bmRlZmluZWQgOiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gY3JlYXRlUG9pbnQoYXJnMCBhcyBudW1iZXIsIGFyZzEgYXMgbnVtYmVyKTtcbiAgICBjb25zdCBvcHRpb25zID0gKFxuICAgICAgKGFyZzAgaW5zdGFuY2VvZiBET01Qb2ludCA/IGFyZzEgOiBhcmcyKSA/PyB7fVxuICAgICkgYXMgQXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb25PcHRpb25zO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5tYWduZXRSZWN0O1xuICAgIGNvbnN0IHNvdXJjZVJlY3QgPSBjcmVhdGVSZWN0KFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICApO1xuICAgIGNvbnN0IHNvdXJjZVBhY2sgPSBuZXcgUGFjayh0aGlzLCBzb3VyY2VSZWN0KTtcbiAgICBjb25zdCB7XG4gICAgICBpZ25vcmVFdmVudCxcbiAgICAgIHVuYXR0cmFjdGFibGUgPSB0aGlzLnVuYXR0cmFjdGFibGUsXG4gICAgICBhdHRyYWN0RGlzdGFuY2UgPSB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zID0gdGhpcy5hbGlnblRvcyxcbiAgICAgIGFsaWdubWVudHMsXG4gICAgICBhbGlnblRvUGFyZW50cyA9IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBjcm9zc1ByZXZlbnRzID0gdGhpcy5jcm9zc1ByZXZlbnRzLFxuICAgICAgcGFyZW50UGFjayA9IHRoaXMucGFyZW50UGFjayxcbiAgICAgIGxhc3RBdHRyYWN0aW9uQmVzdCA9IHRoaXMubGFzdEF0dHJhY3Rpb25CZXN0LFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgICAgb25KdWRnZURpc3RhbmNlSW5QYXJlbnQgPSB0aGlzLmp1ZGdlTWFnbmV0RGlzdGFuY2VJblBhcmVudCxcbiAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uID0gdGhpcy5qdWRnZU1hZ25ldEF0dHJhY3Rpb24sXG4gICAgICBvbkp1ZGdlTW92ZW1lbnQgPSB0aGlzLmp1ZGdlTWFnbmV0TW92ZW1lbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcmVzdWx0ID0gYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgICBzb3VyY2VQYWNrLFxuICAgICAgdGhpcy50YXJnZXRNYWduZXRQYWNrcyxcbiAgICAgIHtcbiAgICAgICAgaWdub3JlRXZlbnQsXG4gICAgICAgIHVuYXR0cmFjdGFibGUsXG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIGFsaWduVG9QYXJlbnRzLFxuICAgICAgICBjcm9zc1ByZXZlbnRzLFxuICAgICAgICBwYXJlbnRQYWNrLFxuICAgICAgICBsYXN0QXR0cmFjdGlvbkJlc3QsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlSW5QYXJlbnQsXG4gICAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uLFxuICAgICAgICBvbkp1ZGdlTW92ZW1lbnQsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLnJlc2V0TWFnbmV0UmVjdCgpO1xuICAgIHRoaXMucmVzZXRQYXJlbnRQYWNrKCk7XG4gICAgdGhpcy5yZXNldFRhcmdldE1hZ25ldFBhY2tzKCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwb2ludCBvYmplY3Qgb2YgbWFnbmV0IG9mZnNldC5cbiAgICovXG4gIGdldCBsYXN0TWFnbmV0T2Zmc2V0KCk6IERPTVBvaW50IHtcbiAgICBjb25zdCB7IG9mZnNldFVuaXQsIGxhc3RPZmZzZXQgfSA9IHRoaXM7XG5cbiAgICBzd2l0Y2ggKG9mZnNldFVuaXQpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlIE9mZnNldFVuaXQucGl4ZWw6XG4gICAgICAgIHJldHVybiBjcmVhdGVQb2ludChsYXN0T2Zmc2V0KTtcblxuICAgICAgY2FzZSBPZmZzZXRVbml0LnBlcmNlbnRhZ2U6IHtcbiAgICAgICAgY29uc3QgeyBvZmZzZXRQYXJlbnQgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSBjcmVhdGVSZWN0KG9mZnNldFBhcmVudCA/PyBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGNyZWF0ZVBvaW50KFxuICAgICAgICAgIGxhc3RPZmZzZXQueCAvIHBhcmVudFJlY3Qud2lkdGgsXG4gICAgICAgICAgbGFzdE9mZnNldC55IC8gcGFyZW50UmVjdC5oZWlnaHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBvZmZzZXQgb2YgbWFnbmV0IG1vdmVtZW50LlxuICAgKi9cbiAgcmVzZXRNYWduZXRPZmZzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShTdHlsZS5vZmZzZXRYKTtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KFN0eWxlLm9mZnNldFkpO1xuICAgIHRoaXMubGFzdE9mZnNldCA9IGNyZWF0ZVBvaW50KDAsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZnNldHMgbWFnbmV0IG1vdmVtZW50IHdpdGggKGR4LCBkeSkuXG4gICAqL1xuICBzZXRNYWduZXRPZmZzZXQoZHg6IG51bWJlciwgZHk6IG51bWJlcik6IHZvaWRcblxuICBzZXRNYWduZXRPZmZzZXQob2Zmc2V0PzogRE9NUG9pbnQpOiB2b2lkXG5cbiAgc2V0TWFnbmV0T2Zmc2V0PERYIGV4dGVuZHMgRE9NUG9pbnQgfCBudW1iZXI+KFxuICAgIGR4OiBEWCA9IHRoaXMubGFzdE9mZnNldCBhcyBEWCxcbiAgICBkeT86IERYIGV4dGVuZHMgRE9NUG9pbnQgPyB1bmRlZmluZWQgOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9mZnNldCA9IGNyZWF0ZVBvaW50KGR4IGFzIG51bWJlciwgZHkgYXMgbnVtYmVyKTtcbiAgICBjb25zdCB7IG9mZnNldFVuaXQgfSA9IHRoaXM7XG5cbiAgICBzd2l0Y2ggKG9mZnNldFVuaXQpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlIE9mZnNldFVuaXQucGl4ZWw6XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoU3R5bGUub2Zmc2V0WCwgYCR7b2Zmc2V0Lnh9cHhgKTtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShTdHlsZS5vZmZzZXRZLCBgJHtvZmZzZXQueX1weGApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBPZmZzZXRVbml0LnBlcmNlbnRhZ2U6IHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgPz8gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gZ2xvYmFsVGhpcy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgICAgIGNvbnN0IHsgYm94U2l6aW5nLCB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZXM7XG4gICAgICAgIGxldCBmaW5hbFdpZHRoID0gcGFyc2VGbG9hdCh3aWR0aCk7XG4gICAgICAgIGxldCBmaW5hbEhlaWdodCA9IHBhcnNlRmxvYXQoaGVpZ2h0KTtcblxuICAgICAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYWRkaW5nVG9wLCBwYWRkaW5nUmlnaHQsIHBhZGRpbmdCb3R0b20sIHBhZGRpbmdMZWZ0LFxuICAgICAgICAgICAgYm9yZGVyVG9wV2lkdGgsIGJvcmRlclJpZ2h0V2lkdGgsIGJvcmRlckJvdHRvbVdpZHRoLCBib3JkZXJMZWZ0V2lkdGgsXG4gICAgICAgICAgfSA9IHN0eWxlcztcbiAgICAgICAgICBjb25zdCB0b3AgPSBwYXJzZUZsb2F0KHBhZGRpbmdUb3ApO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VGbG9hdChwYWRkaW5nUmlnaHQpO1xuICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IHBhcnNlRmxvYXQocGFkZGluZ0JvdHRvbSk7XG4gICAgICAgICAgY29uc3QgbGVmdCA9IHBhcnNlRmxvYXQocGFkZGluZ0xlZnQpO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclRvcCA9IHBhcnNlRmxvYXQoYm9yZGVyVG9wV2lkdGgpO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclJpZ2h0ID0gcGFyc2VGbG9hdChib3JkZXJSaWdodFdpZHRoKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJCb3R0b20gPSBwYXJzZUZsb2F0KGJvcmRlckJvdHRvbVdpZHRoKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJMZWZ0ID0gcGFyc2VGbG9hdChib3JkZXJMZWZ0V2lkdGgpO1xuXG4gICAgICAgICAgZmluYWxXaWR0aCAtPSByaWdodCArIGxlZnQgKyBib3JkZXJSaWdodCArIGJvcmRlckxlZnQ7XG4gICAgICAgICAgZmluYWxIZWlnaHQgLT0gdG9wICsgYm90dG9tICsgYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpdmVPZmZzZXQgPSBjcmVhdGVQb2ludChcbiAgICAgICAgICBvZmZzZXQueCAvIGZpbmFsV2lkdGgsXG4gICAgICAgICAgb2Zmc2V0LnkgLyBmaW5hbEhlaWdodCxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KFN0eWxlLm9mZnNldFgsIGAkezEwMCAqIHJlbGF0aXZlT2Zmc2V0Lnh9JWApO1xuICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KFN0eWxlLm9mZnNldFksIGAkezEwMCAqIHJlbGF0aXZlT2Zmc2V0Lnl9JWApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxhc3RPZmZzZXQgPSBjcmVhdGVQb2ludChvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIG1hZ25ldCBtb3ZlbWVudCB0byAoeCwgeSkuXG4gICAqL1xuICBzZXRNYWduZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWRcblxuICBzZXRNYWduZXRQb3NpdGlvbihwb3NpdGlvbj86IERPTVBvaW50KTogdm9pZFxuXG4gIHNldE1hZ25ldFBvc2l0aW9uPFggZXh0ZW5kcyBET01Qb2ludCB8IG51bWJlcj4oXG4gICAgeDogWCA9IGNyZWF0ZVBvaW50KHRoaXMubWFnbmV0UmVjdCkgYXMgWCxcbiAgICB5PzogWCBleHRlbmRzIERPTVBvaW50ID8gdW5kZWZpbmVkIDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGNyZWF0ZVBvaW50KHggYXMgbnVtYmVyLCB5IGFzIG51bWJlcik7XG4gICAgY29uc3Qge1xuICAgICAgbGFzdE9mZnNldCxcbiAgICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qgb3JpZ2luID0gY3JlYXRlUG9pbnQoXG4gICAgICBzb3VyY2VSZWN0LnggLSBsYXN0T2Zmc2V0LngsXG4gICAgICBzb3VyY2VSZWN0LnkgLSBsYXN0T2Zmc2V0LnksXG4gICAgKTtcblxuICAgIHRoaXMuc2V0TWFnbmV0T2Zmc2V0KFxuICAgICAgcG9zaXRpb24ueCAtIG9yaWdpbi54LFxuICAgICAgcG9zaXRpb24ueSAtIG9yaWdpbi55LFxuICAgICk7XG4gICAgdGhpcy5yZXNldE1hZ25ldFJlY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBiZXN0IGF0dHJhY3Rpb24gb2YgbGFzdCBtb3ZlLlxuICAgKi9cbiAgZ2V0IGJlc3RBdHRyYWN0aW9uKCk6IEF0dHJhY3Rpb25CZXN0IHtcbiAgICBjb25zdCB7IGxhc3RBdHRyYWN0aW9uQmVzdCB9ID0gdGhpcztcbiAgICBjb25zdCB4ID0gbGFzdEF0dHJhY3Rpb25CZXN0Py54O1xuICAgIGNvbnN0IHkgPSBsYXN0QXR0cmFjdGlvbkJlc3Q/Lnk7XG4gICAgY29uc3QgYXR0cmFjdGlvbkJlc3Q6IEF0dHJhY3Rpb25CZXN0ID0ge307XG5cbiAgICBpZiAoeCkge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIHRhcmdldCB9ID0geDtcblxuICAgICAgYXR0cmFjdGlvbkJlc3QueCA9IHtcbiAgICAgICAgLi4ueCxcbiAgICAgICAgc291cmNlOiBuZXcgUGFjayhzb3VyY2UucmF3LCBjcmVhdGVSZWN0KHNvdXJjZS5yZWN0KSksXG4gICAgICAgIHRhcmdldDogbmV3IFBhY2sodGFyZ2V0LnJhdywgY3JlYXRlUmVjdCh0YXJnZXQucmVjdCkpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmFjdGlvbkJlc3QueCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoeSkge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIHRhcmdldCB9ID0geTtcblxuICAgICAgYXR0cmFjdGlvbkJlc3QueSA9IHtcbiAgICAgICAgLi4ueSxcbiAgICAgICAgc291cmNlOiBuZXcgUGFjayhzb3VyY2UucmF3LCBjcmVhdGVSZWN0KHNvdXJjZS5yZWN0KSksXG4gICAgICAgIHRhcmdldDogbmV3IFBhY2sodGFyZ2V0LnJhdywgY3JlYXRlUmVjdCh0YXJnZXQucmVjdCkpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmFjdGlvbkJlc3QueSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmFjdGlvbkJlc3Q7XG4gIH1cbn1cblxucmVnaXN0ZXJFbGVtZW50KE1hZ25ldCwgbm9kZU5hbWUpO1xuXG5leHBvcnQgZGVmYXVsdCBNYWduZXQ7XG4iLCJpbXBvcnQgeyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgRGlzdGFuY2UgZnJvbSAnLi4vdHlwZXMvRGlzdGFuY2UnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuLi92YWx1ZXMvYWxpZ25tZW50JztcbmltcG9ydCBBbGlnblRvLCB7IEFsaWduVG9QYXJlbnQgfSBmcm9tICcuLi92YWx1ZXMvYWxpZ25Ubyc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp1ZGdlRGlzdGFuY2VPcHRpb25zIHtcbiAgYXR0cmFjdERpc3RhbmNlPzogbnVtYmVyO1xuICBhbGlnblRvcz86IChBbGlnblRvIHwgQWxpZ25Ub1BhcmVudClbXTtcbn1cblxuZXhwb3J0IHR5cGUgT25KdWRnZURpc3RhbmNlID0gKFxuICBkaXN0YW5jZTogRGlzdGFuY2UsXG4gIG9wdGlvbnM/OiBKdWRnZURpc3RhbmNlT3B0aW9ucyxcbikgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc3RhbmNlIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gKiBkaXN0YW5jZSB3b3VsZCBub3QgYmUgb24gdGhlIHJlc3VsdCBsaXN0IG9mIGF0dHJhY3Rpb24uXG4gKi9cbmNvbnN0IGp1ZGdlRGlzdGFuY2U6IE9uSnVkZ2VEaXN0YW5jZSA9IGZ1bmN0aW9uIGp1ZGdlRGlzdGFuY2UoXG4gIGRpc3RhbmNlLFxuICBvcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGF0dHJhY3REaXN0YW5jZSA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV0sXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChkaXN0YW5jZS5hYnNEaXN0YW5jZSA+IGF0dHJhY3REaXN0YW5jZSkge1xuICAgIC8vIHRvbyBmYXIsIG5vIGNvbnNpZGVyXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGFsaWduVG9zID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub10sXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChhbGlnblRvcy5pbmNsdWRlcyhBbGlnblRvLmV4dGVuZCkpIHtcbiAgICAvLyBhbGlnbiB0byBleHRlbmRlZCBlZGdlc1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHNvdXJjZToge1xuICAgICAgcmVjdDogc291cmNlUmVjdCxcbiAgICB9LFxuICAgIHRhcmdldDoge1xuICAgICAgcmVjdDogdGFyZ2V0UmVjdCxcbiAgICB9LFxuICB9ID0gZGlzdGFuY2U7XG5cbiAgLy8gb25seSBwYXNzIHdoZW4gc291cmNlIG92ZXJsYXBzIHRhcmdldFxuICBzd2l0Y2ggKGRpc3RhbmNlLmFsaWdubWVudCkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlIEFsaWdubWVudC50b3BUb1RvcDpcbiAgICBjYXNlIEFsaWdubWVudC50b3BUb0JvdHRvbTpcbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub1RvcDpcbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbTpcbiAgICBjYXNlIEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyOlxuICAgICAgaWYgKFxuICAgICAgICAoc291cmNlUmVjdC5yaWdodCArIGF0dHJhY3REaXN0YW5jZSkgPCB0YXJnZXRSZWN0LmxlZnRcbiAgICAgICAgfHwgKHNvdXJjZVJlY3QubGVmdCAtIGF0dHJhY3REaXN0YW5jZSkgPiB0YXJnZXRSZWN0LnJpZ2h0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9SaWdodDpcbiAgICBjYXNlIEFsaWdubWVudC5yaWdodFRvTGVmdDpcbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9SaWdodDpcbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9MZWZ0OlxuICAgIGNhc2UgQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXI6XG4gICAgICBpZiAoXG4gICAgICAgIChzb3VyY2VSZWN0LnRvcCAtIGF0dHJhY3REaXN0YW5jZSkgPiB0YXJnZXRSZWN0LmJvdHRvbVxuICAgICAgICB8fCAoc291cmNlUmVjdC5ib3R0b20gKyBhdHRyYWN0RGlzdGFuY2UpIDwgdGFyZ2V0UmVjdC50b3BcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZURpc3RhbmNlO1xuIiwiaW1wb3J0IERpc3RhbmNlIGZyb20gJy4uL3R5cGVzL0Rpc3RhbmNlJztcbmltcG9ydCBQYWNrLCB7IFJlY3RhYmxlIH0gZnJvbSAnLi4vdHlwZXMvUGFjayc7XG5pbXBvcnQgeyBnZXRSZWN0IH0gZnJvbSAnLi4vdHlwZXMvUmVjdCc7XG5pbXBvcnQgeyByZXR1cm5UcnVlIH0gZnJvbSAnLi4vdXRpbHMvcmV0dXJuVHJ1ZUZhbHNlJztcbmltcG9ydCB7IEp1ZGdlRGlzdGFuY2VPcHRpb25zLCBPbkp1ZGdlRGlzdGFuY2UgfSBmcm9tICcuL2p1ZGdlRGlzdGFuY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp1ZGdlRGlzdGFuY2VJblBhcmVudE9wdGlvbnMgZXh0ZW5kcyBKdWRnZURpc3RhbmNlT3B0aW9ucyB7XG4gIHBhcmVudD86IFBhY2sgfCBSZWN0YWJsZSB8IG51bGw7XG4gIG9uSnVkZ2VEaXN0YW5jZT86IE9uSnVkZ2VEaXN0YW5jZTtcbn1cblxuZXhwb3J0IHR5cGUgT25KdWRnZURpc3RhbmNlSW5QYXJlbnQgPSAoXG4gIGRpc3RhbmNlOiBEaXN0YW5jZSxcbiAgb3B0aW9ucz86IEp1ZGdlRGlzdGFuY2VJblBhcmVudE9wdGlvbnMsXG4pID0+IGJvb2xlYW47XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBkaXN0YW5jZSBwYXNzZXMgdGhlIGp1ZGdlbWVudC4gT3RoZXJ3aXNlIHRoZVxuICogZGlzdGFuY2Ugd291bGQgbm90IGJlIG9uIHRoZSByZXN1bHQgbGlzdCBvZiBhdHRyYWN0aW9uLlxuICovXG5jb25zdCBqdWRnZURpc3RhbmNlSW5QYXJlbnQ6IE9uSnVkZ2VEaXN0YW5jZUluUGFyZW50ID0gZnVuY3Rpb24ganVkZ2VEaXN0YW5jZUluUGFyZW50KFxuICBkaXN0YW5jZSxcbiAgb3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBvbkp1ZGdlRGlzdGFuY2UgPSByZXR1cm5UcnVlLFxuICAgIC4uLmp1ZGdlRGlzdGFuY2VPcHRpb25zXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwYXNzSnVkZ2VEaXN0YW5jZSA9IG9uSnVkZ2VEaXN0YW5jZShkaXN0YW5jZSwganVkZ2VEaXN0YW5jZU9wdGlvbnMpO1xuXG4gIGlmICghcGFzc0p1ZGdlRGlzdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSWYgb3B0aW9ucy5wYXJlbnQgaXMgYG51bGxgLCB1c2UgYGRvY3VtZW50LmJvZHlgIGluc3RlYWQuXG4gICAqL1xuICBjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudCA/PyBkb2N1bWVudC5ib2R5O1xuXG4gIGNvbnN0IHBhcmVudFJlY3QgPSBnZXRSZWN0KHBhcmVudCk7XG4gIGNvbnN0IHsgYWxpZ25tZW50LCByYXdEaXN0YW5jZSwgc291cmNlIH0gPSBkaXN0YW5jZTtcbiAgY29uc3Qge1xuICAgIHJlY3Q6IHNvdXJjZVJlY3QsXG4gIH0gPSBzb3VyY2U7XG5cbiAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICd0b3BUb1RvcCc6XG4gICAgY2FzZSAndG9wVG9Cb3R0b20nOlxuICAgIGNhc2UgJ2JvdHRvbVRvVG9wJzpcbiAgICBjYXNlICdib3R0b21Ub0JvdHRvbSc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzb3VyY2VSZWN0LnRvcCArIHJhd0Rpc3RhbmNlID49IHBhcmVudFJlY3QudG9wXG4gICAgICAgICYmIHNvdXJjZVJlY3QuYm90dG9tICsgcmF3RGlzdGFuY2UgPD0gcGFyZW50UmVjdC5ib3R0b21cbiAgICAgICk7XG5cbiAgICBjYXNlICdyaWdodFRvUmlnaHQnOlxuICAgIGNhc2UgJ3JpZ2h0VG9MZWZ0JzpcbiAgICBjYXNlICdsZWZ0VG9SaWdodCc6XG4gICAgY2FzZSAnbGVmdFRvTGVmdCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzb3VyY2VSZWN0LnJpZ2h0ICsgcmF3RGlzdGFuY2UgPD0gcGFyZW50UmVjdC5yaWdodFxuICAgICAgICAmJiBzb3VyY2VSZWN0LmxlZnQgKyByYXdEaXN0YW5jZSA+PSBwYXJlbnRSZWN0LmxlZnRcbiAgICAgICk7XG5cbiAgICBjYXNlICd4Q2VudGVyVG9YQ2VudGVyJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNvdXJjZVJlY3QucmlnaHQgKyByYXdEaXN0YW5jZSA8PSBwYXJlbnRSZWN0LnJpZ2h0XG4gICAgICAgICYmIHNvdXJjZVJlY3QubGVmdCArIHJhd0Rpc3RhbmNlID49IHBhcmVudFJlY3QubGVmdFxuICAgICAgKTtcblxuICAgIGNhc2UgJ3lDZW50ZXJUb1lDZW50ZXInOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgc291cmNlUmVjdC50b3AgKyByYXdEaXN0YW5jZSA+PSBwYXJlbnRSZWN0LnRvcFxuICAgICAgICAmJiBzb3VyY2VSZWN0LmJvdHRvbSArIHJhd0Rpc3RhbmNlIDw9IHBhcmVudFJlY3QuYm90dG9tXG4gICAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZURpc3RhbmNlSW5QYXJlbnQ7XG4iLCJpbXBvcnQgRGlzdGFuY2UgZnJvbSAnLi4vdHlwZXMvRGlzdGFuY2UnO1xuaW1wb3J0IFBhY2ssIHsgZ2V0UGFjaywgUmVjdGFibGUgfSBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCB7IGdldFJlY3QgfSBmcm9tICcuLi90eXBlcy9SZWN0JztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL3V0aWxzL251bWVyaWMnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuLi92YWx1ZXMvYWxpZ25tZW50JztcbmltcG9ydCByYXdEaXN0YW5jZVRvIGZyb20gJy4vcmF3RGlzdGFuY2VUbyc7XG5cbi8qKlxuICogUmV0dXJucyBkaXN0YW5jZSBvYmplY3QgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IG9uIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gZGlzdGFuY2VUbyhcbiAgc291cmNlOiBSZWN0YWJsZSB8IFBhY2ssXG4gIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICBhbGlnbm1lbnQ6IEFsaWdubWVudCxcbik6IERpc3RhbmNlIHtcbiAgY29uc3Qgc291cmNlUGFjayA9IGdldFBhY2soc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UGFjayA9IGdldFBhY2sodGFyZ2V0KTtcbiAgY29uc3Qgc291cmNlUmVjdCA9IGdldFJlY3Qoc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgY29uc3QgcmF3RGlzdGFuY2UgPSByYXdEaXN0YW5jZVRvKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QsIGFsaWdubWVudCk7XG4gIGNvbnN0IGFic0Rpc3RhbmNlID0gYWJzKHJhd0Rpc3RhbmNlKTtcblxuICByZXR1cm4ge1xuICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICB0YXJnZXQ6IHRhcmdldFBhY2ssXG4gICAgYWxpZ25tZW50LFxuICAgIHJhd0Rpc3RhbmNlLFxuICAgIGFic0Rpc3RhbmNlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXN0YW5jZVRvO1xuIl0sIm5hbWVzIjpbImNyZWF0ZVBvaW50IiwieCIsInkiLCJET01Qb2ludCIsImZyb21Qb2ludCIsIkRPTVJlY3QiLCJnZXRBdHRyYWN0aW9uT2Zmc2V0IiwiYXR0cmFjdGlvbiIsImJlc3QiLCJyYXdEaXN0YW5jZSIsIlNQTElUVEVSIiwiZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUiLCJ2YWx1ZSIsImluZGV4T2JqZWN0IiwidmFsdWVzIiwic3BsaXQiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJmaWx0ZXIiLCJpbmRleCIsImluY2x1ZGVzIiwiZ2V0QXR0cmlidXRlVmFsdWVGcm9tQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwiTm9kZSIsIm5vZGVOYW1lIiwiY3VzdG9tRWxlbWVudHMiLCJnZXQiLCJQcm9taXNlIiwicmVqZWN0IiwiRXJyb3IiLCJkZWZpbmUiLCJ3aGVuRGVmaW5lZCIsIkFsaWdubWVudCIsIkFsaWdubWVudFhzIiwicmlnaHRUb1JpZ2h0IiwicmlnaHRUb0xlZnQiLCJsZWZ0VG9SaWdodCIsImxlZnRUb0xlZnQiLCJ4Q2VudGVyVG9YQ2VudGVyIiwiQWxpZ25tZW50WXMiLCJ0b3BUb1RvcCIsInRvcFRvQm90dG9tIiwiYm90dG9tVG9Ub3AiLCJib3R0b21Ub0JvdHRvbSIsInlDZW50ZXJUb1lDZW50ZXIiLCJBbGlnblRvIiwiQWxpZ25Ub1BhcmVudCIsIkF0dHJpYnV0ZSIsIkNyb3NzUHJldmVudCIsIkV2ZW50IiwiT2Zmc2V0VW5pdCIsImlzTmFOIiwiZ2xvYmFsVGhpcyIsImFicyIsIk1hdGgiLCJ0ZW1wbGF0ZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMiLCJpbm5lckhUTUwiLCJNYWduZXRQYWNrIiwiSFRNTEVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwidGhpcyIsImF0dGFjaFNoYWRvdyIsIm1vZGUiLCJzaGFkb3dSb290IiwiYXBwZW5kIiwiY29udGVudCIsImNsb25lTm9kZSIsIkFMSUdOTUVOVCIsIkFMSUdOX1RPIiwiQUxJR05fVE9fUEFSRU5UIiwiQ1JPU1NfUFJFVkVOVCIsIkVWRU5UIiwic291cmNlIiwiYWxpZ25Ub3MiLCJhbGlnbm1lbnRzIiwicHVzaCIsImRpc2FibGVkIiwidHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZSIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImdyb3VwIiwibGVuZ3RoIiwicGFyZW50TWFnbmV0IiwiZ2V0QXR0cmlidXRlIiwicGFyZW50IiwicGFyZW50RWxlbWVudCIsInBhcmVudEdyb3VwIiwidW5hdHRyYWN0YWJsZSIsInVubW92YWJsZSIsImF0dHJhY3REaXN0YW5jZSIsIk51bWJlciIsIlR5cGVFcnJvciIsIlJhbmdlRXJyb3IiLCJhbGlnblRvUGFyZW50cyIsImdldEFsaWdubWVudHNGcm9tQWxpZ25UbyIsInBhcmVudEFsaWdubWVudHMiLCJjcm9zc1ByZXZlbnRzIiwib2Zmc2V0VW5pdCIsImF0dHJOYW1lIiwicmVnaXN0ZXJFbGVtZW50IiwiY3JlYXRlUmVjdCIsImFyZ3MiLCJXaW5kb3ciLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJEb2N1bWVudCIsImJvZHkiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJFbGVtZW50IiwiUGFjayIsImZyb21SZWN0IiwicmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0IiwiZ2V0UmVjdCIsInJhdyIsImlzUGFjayIsImZyZWV6ZSIsImdldFBhY2siLCJzb3VyY2VSZWN0IiwidGFyZ2V0UmVjdCIsImFsaWdubWVudCIsIkluZmluaXR5IiwicmV0dXJuVHJ1ZSIsInJldHVybkZhbHNlIiwiZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzIiwic291cmNlUmVjdFhDZW50ZXIiLCJ0YXJnZXRSZWN0WENlbnRlciIsImRpc3RhbmNlQmV0d2VlbllDZW50ZXJzT2ZSZWN0cyIsInNvdXJjZVJlY3RZQ2VudGVyIiwidGFyZ2V0UmVjdFlDZW50ZXIiLCJ0YXJnZXRzIiwib3B0aW9ucyIsInNvdXJjZVBhY2siLCJ0YXJnZXRQYWNrcyIsIm1hcCIsInRhcmdldCIsIm9uSnVkZ2VEaXN0YW5jZSIsIm9uSnVkZ2VBdHRyYWN0aW9uIiwiYXR0cmFjdGlvbkJlc3QiLCJzaW5nbGVBdHRyYWN0aW9uT3B0aW9ucyIsInJlZHVjZSIsInRhcmdldFBhY2siLCJzaW5nbGVBdHRyYWN0aW9uIiwiTWFnbmV0IiwiY3VycmVudEJlc3QiLCJyZXN1bHRzIiwiY3VycmVudFJlc3VsdHMiLCJwYXNzSnVkZ2VtZW50IiwiYWJzRGlzdGFuY2UiLCJsYXN0QmVzdFJlY3QiLCJjdXJyZW50RGlmZlkiLCJkaWZmWSIsImdhcCIsImxhc3RSZWN0IiwiY3VycmVudFJlY3QiLCJsYXN0WUJhc2UiLCJjdXJyZW50WUJhc2UiLCJzb3VyY2VZQmFzZSIsImxhc3RZRGlzdGFuY2UiLCJjdXJyZW50RGlmZlgiLCJkaWZmWCIsImxhc3RYQmFzZSIsImN1cnJlbnRYQmFzZSIsInNvdXJjZVhCYXNlIiwibGFzdFhEaXN0YW5jZSIsImRpc3RhbmNlIiwiQm9vbGVhbiIsImFkZEV2ZW50TGlzdGVuZXJzIiwicmVmIiwidHlwZXMiLCJsaXN0ZW5lciIsImZvckVhY2giLCJ0eXBlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRyaWdnZXJFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsInNvdXJjZVJhdyIsImlnbm9yZUV2ZW50IiwicGFyZW50UGFjayIsImxhc3RBdHRyYWN0aW9uQmVzdCIsIm9uSnVkZ2VNb3ZlbWVudCIsImxhc3RCZXN0WCIsImxhc3RCZXN0WSIsImFsaWduVG9QYXJlbnQiLCJrZWVwSW5QYXJlbnQiLCJzb3VyY2VXaWR0aCIsInNvdXJjZUhlaWdodCIsInBhcmVudFJlY3QiLCJzb3VyY2VSYXdSZWN0Iiwic291cmNlSW5QYXJlbnRPZmZzZXQiLCJnZXRPZmZzZXRUb0JlSW5SZWN0Iiwic291cmNlSW5QYXJlbnRSZWN0Iiwic291cmNlSW5QYXJlbnRQYWNrIiwicGFzc0p1ZGdlTW92ZW1lbnQiLCJhdHRyYWN0UmVzdWx0cyIsInVuYXR0cmFjdFJlc3VsdHMiLCJhdHRyYWN0bW92ZVJlc3VsdHMiLCJkaXNwYXRjaFVuYXR0cmFjdEV2ZW50cyIsInNvdXJjZU5leHRSZWN0IiwidW5hdHRyYWN0UmVzdWx0IiwidGFyZ2V0RWxlbSIsInVuYXR0cmFjdGVkRXZlbnREZXRhaWwiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwiZGV0YWlsIiwicG9zaXRpb24iLCJvbkp1ZGdlRGlzdGFuY2VJblBhcmVudCIsInNvdXJjZVJhd1BhY2siLCJzaW5nbGVBdHRyYWN0aW9uVG8iLCJvbkp1ZGdlTXVsdGlEaXN0YW5jZSIsInNvdXJjZUF0dHJhY3Rpb24iLCJtdWx0aUF0dHJhY3Rpb25zVG8iLCJzb3VyY2VBdHRyYWN0aW9uQmVzdCIsInNvdXJjZUF0dHJhY3Rpb25PZmZzZXQiLCJzb3VyY2VBdHRyYWN0aW9uUmVjdCIsInNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldCIsInNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QiLCJjdXJyZW50QmVzdFgiLCJjdXJyZW50QmVzdFkiLCJsYXN0VGFyZ2V0WCIsImxhc3RUYXJnZXRZIiwiY3VycmVudFRhcmdldFgiLCJjdXJyZW50VGFyZ2V0WSIsImRpZmZUYXJnZXRZIiwibGFzdEFsaWdubWVudFgiLCJsYXN0QWxpZ25tZW50WSIsImF0dHJhY3RFdmVudERldGFpbCIsIm5leHRSZWN0IiwidW5hdHRyYWN0RXZlbnREZXRhaWwiLCJhdHRyYWN0bW92ZUV2ZW50RGV0YWlsIiwiYXR0cmFjdFJlc3VsdCIsImF0dHJhY3RlZEV2ZW50RGV0YWlsIiwiYXR0cmFjdG1vdmVSZXN1bHQiLCJhdHRyYWN0ZWRtb3ZlRXZlbnREZXRhaWwiLCJkaXNwYXRjaEF0dHJhY3Rtb3ZlRXZlbnRzIiwiZXZlbnQiLCJjbGllbnRYIiwiY2xpZW50WSIsIkVWRU5UX0RSQUdfU1RBUlQiLCJFVkVOVF9EUkFHX01PVkUiLCJFVkVOVF9EUkFHX0VORCIsInJlc2V0TWFnbmV0Q2FjaGVzIiwibWFnbmV0IiwicmVzZXRNYWduZXRSZWN0IiwicmVzZXRQYXJlbnRQYWNrIiwicmVzZXRUYXJnZXRNYWduZXRQYWNrcyIsIm1vdmVMaXN0ZW5lciIsInN0YXJ0UG9pbnQiLCJzdGFydExhc3RPZmZzZXQiLCJtb3ZlUG9pbnQiLCJtYWduZXRSZWN0IiwidGFyZ2V0TWFnbmV0UGFja3MiLCJqdWRnZU1hZ25ldE1vdmVtZW50IiwiYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24iLCJqdWRnZU1hZ25ldERpc3RhbmNlIiwianVkZ2VNYWduZXREaXN0YW5jZUluUGFyZW50IiwianVkZ2VNYWduZXRBdHRyYWN0aW9uIiwibmV4dFNvdXJjZVBhY2siLCJtb3ZlRXZlbnREZXRhaWwiLCJzZXRNYWduZXRPZmZzZXQiLCJzdGFydExpc3RlbmVyIiwiZ2V0RXZlbnRYWSIsImlzTW92aW5nIiwic3RhcnRFdmVudERldGFpbCIsImxhc3RNb3ZlUG9pbnQiLCJkcmFnTW92ZUhhbmRsZXIiLCJiaW5kIiwibGFzdE9mZnNldCIsImRyYWdNb3ZlTGlzdGVuZXIiLCJldnQiLCJhdHRyaWJ1dGVPYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJkcmFnRW5kTGlzdGVuZXIiLCJzdHlsZSIsInJlbW92ZVByb3BlcnR5IiwiZGlzY29ubmVjdCIsInNldFByb3BlcnR5IiwiRGF0ZSIsIm5vdyIsInByZXZlbnREZWZhdWx0Iiwib2JzZXJ2ZSIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJjaGVja0RyYWdMaXN0ZW5lcnMiLCJyZW1vdmVCYXNpY0RyYWdMaXN0ZW5lcnMiLCJhZGRCYXNpY0RyYWdMaXN0ZW5lcnMiLCJTdHlsZSIsInJlY3RDYWNoZSIsInBhcmVudFBhY2tDYWNoZSIsInRhcmdldE1hZ25ldFBhY2tzQ2FjaGUiLCJnZXRBdHRyYWN0YWJsZU1hZ25ldHMiLCJnZXRPdGhlck1hZ25ldHMiLCJmcm9tIiwicXVlcnlTZWxlY3RvckFsbCIsImhhc0dyb3VwIiwic2VsZWN0b3IiLCJjb250YWlucyIsImp1ZGdlRGlzdGFuY2UiLCJqdWRnZURpc3RhbmNlT3B0aW9ucyIsImp1ZGdlRGlzdGFuY2VJblBhcmVudCIsImp1ZGdlQXR0cmFjdGlvbiIsImp1ZGdlTW92ZW1lbnQiLCJyYXdEaXN0YW5jZVRvIiwiZGlzdGFuY2VUbyIsImF0dHJhY3Rpb25UbyIsImF0dHJhY3Rpb25Ub1BhcmVudCIsInBhcmVudEF0dHJhY3Rpb24iLCJwcm90b3R5cGUiLCJjYWxsIiwiZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24iLCJhcmcwIiwiYXJnMSIsImFyZzIiLCJyZXN1bHQiLCJsYXN0TWFnbmV0T2Zmc2V0Iiwib2Zmc2V0UGFyZW50IiwicmVzZXRNYWduZXRPZmZzZXQiLCJkeCIsImR5Iiwib2Zmc2V0Iiwic3R5bGVzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImJveFNpemluZyIsImZpbmFsV2lkdGgiLCJwYXJzZUZsb2F0IiwiZmluYWxIZWlnaHQiLCJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0IiwiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJMZWZ0V2lkdGgiLCJib3JkZXJUb3AiLCJib3JkZXJSaWdodCIsImJvcmRlckJvdHRvbSIsInJlbGF0aXZlT2Zmc2V0Iiwic2V0TWFnbmV0UG9zaXRpb24iLCJvcmlnaW4iLCJiZXN0QXR0cmFjdGlvbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/core/static/modal.js b/core/static/modal.js index bf7db64..0535526 100644 --- a/core/static/modal.js +++ b/core/static/modal.js @@ -3,38 +3,38 @@ var modal = document.getElementById("modal"); var html = document.querySelector('html'); var disableModal = function() { - modal.classList.remove('is-active'); - html.classList.remove('is-clipped'); - var modal_refresh = document.getElementsByClassName("modal-refresh"); - for(var i = 0; i < modal_refresh.length; i++) { - modal_refresh[i].remove(); -} + modal.classList.remove('is-active'); + html.classList.remove('is-clipped'); + var modal_refresh = document.getElementsByClassName("modal-refresh"); + for(var i = 0; i < modal_refresh.length; i++) { + modal_refresh[i].remove(); + } } var elements = document.querySelectorAll('.modal-background'); for(var i = 0; i < elements.length; i++) { elements[i].addEventListener('click', function(e) { - // elements[i].preventDefault(); - disableModal(); + // elements[i].preventDefault(); + disableModal(); }); } var elements = document.querySelectorAll('.modal-close'); for(var i = 0; i < elements.length; i++) { elements[i].addEventListener('click', function(e) { - // elements[i].preventDefault(); - disableModal(); + // elements[i].preventDefault(); + disableModal(); }); } function activateButtons() { - var elements = document.querySelectorAll('.modal-close-button'); - for(var i = 0; i < elements.length; i++) { - elements[i].addEventListener('click', function(e) { - // elements[i].preventDefault(); - disableModal(); - }); - } + var elements = document.querySelectorAll('.modal-close-button'); + for(var i = 0; i < elements.length; i++) { + elements[i].addEventListener('click', function(e) { + // elements[i].preventDefault(); + disableModal(); + }); + } } activateButtons(); // modal.querySelector('.modal-close-button').addEventListener('click', function(e) { diff --git a/core/static/style.css b/core/static/style.css index c280f6e..f1d4812 100644 --- a/core/static/style.css +++ b/core/static/style.css @@ -1,21 +1,21 @@ .register a { - color: #700000 !important; - margin-left: 8px; + color: #700000 !important; + margin-left: 8px; } .title { - color: white; + color: white; } body{ - background-color: #252525; + background-color: #252525; } .register p { - font-size: 12px; - padding-top: 10px; + font-size: 12px; + padding-top: 10px; } .logo { - display: block; - margin-left: auto; - margin-right: auto; + display: block; + margin-left: auto; + margin-right: auto; } .vertical-offset-100{ @@ -23,61 +23,61 @@ body{ } .product-container { - background: #ffffff; + background: #ffffff; - justify-content: space-between; + justify-content: space-between; } .product { - display: flex; + display: flex; } .description { - display: flex; - flex-direction: column; - justify-content: center; + display: flex; + flex-direction: column; + justify-content: center; } img { - border-radius: 6px; - margin: 10px; - width: 54px; - height: 57px; + border-radius: 6px; + margin: 10px; + width: 54px; + height: 57px; } h3, h5 { - font-style: normal; - font-weight: 500; - font-size: 14px; - line-height: 20px; - letter-spacing: -0.154px; - color: #242d60; - margin: 0; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 20px; + letter-spacing: -0.154px; + color: #242d60; + margin: 0; } h5 { - opacity: 0.5; + opacity: 0.5; } #checkout-button, #setup-button, #button { - height: 36px; - background: #556cd6; - color: white; - width: 100%; - font-size: 14px; - border: 0; - font-weight: 500; - cursor: pointer; - letter-spacing: 0.6; - border-radius: 0 0 6px 6px; - transition: all 0.2s ease; - box-shadow: 0px 4px 5.5px 0px rgba(0, 0, 0, 0.07); + height: 36px; + background: #556cd6; + color: white; + width: 100%; + font-size: 14px; + border: 0; + font-weight: 500; + cursor: pointer; + letter-spacing: 0.6; + border-radius: 0 0 6px 6px; + transition: all 0.2s ease; + box-shadow: 0px 4px 5.5px 0px rgba(0, 0, 0, 0.07); } #checkout-button:hover { - opacity: 0.8; + opacity: 0.8; } .subtitle { - color: #dddddd; + color: #dddddd; } .search-bar { - margin-bottom: 1rem; + margin-bottom: 1rem; } \ No newline at end of file diff --git a/core/static/tabs.js b/core/static/tabs.js index 5508491..3104adc 100644 --- a/core/static/tabs.js +++ b/core/static/tabs.js @@ -4,33 +4,33 @@ function initTabs(unique) { var CONTENT = [...document.querySelectorAll('#tab-content-'+unique+' div')]; var ACTIVE_CLASS = 'is-active'; TABS.forEach((tab) => { - tab.addEventListener('click', (e) => { - let selected = tab.getAttribute('data-tab'); - updateActiveTab(TABS, ACTIVE_CLASS, tab); - updateActiveContent(CONTENT, ACTIVE_CLASS, selected); - }) + tab.addEventListener('click', (e) => { + let selected = tab.getAttribute('data-tab'); + updateActiveTab(TABS, ACTIVE_CLASS, tab); + updateActiveContent(CONTENT, ACTIVE_CLASS, selected); + }) }) - } +} function updateActiveTab(TABS, ACTIVE_CLASS, selected) { - TABS.forEach((tab) => { - if (tab && tab.classList.contains(ACTIVE_CLASS)) { - tab.classList.remove(ACTIVE_CLASS); - } - }); - selected.classList.add(ACTIVE_CLASS); + TABS.forEach((tab) => { + if (tab && tab.classList.contains(ACTIVE_CLASS)) { + tab.classList.remove(ACTIVE_CLASS); + } + }); + selected.classList.add(ACTIVE_CLASS); } function updateActiveContent(CONTENT, ACTIVE_CLASS, selected) { - CONTENT.forEach((item) => { - if (item && item.classList.contains(ACTIVE_CLASS)) { - item.classList.remove(ACTIVE_CLASS); - } - let data = item.getAttribute('data-content'); - if (data === selected) { - item.classList.add(ACTIVE_CLASS); - } - }); + CONTENT.forEach((item) => { + if (item && item.classList.contains(ACTIVE_CLASS)) { + item.classList.remove(ACTIVE_CLASS); + } + let data = item.getAttribute('data-content'); + if (data === selected) { + item.classList.add(ACTIVE_CLASS); + } + }); } // initTabs(); \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 9700299..c346862 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -3,323 +3,323 @@ - - - - Pathogen - {{ request.path_info }} - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - + - - - + + + - - - {% block outer_content %} - {% endblock %} -
-
- {% block content %} + + {% block outer_content %} {% endblock %} -
-
- +
+
+ {% block content %} + {% endblock %} +
+
+ diff --git a/core/templates/billing.html b/core/templates/billing.html index 95e6817..ffd9e53 100644 --- a/core/templates/billing.html +++ b/core/templates/billing.html @@ -1,46 +1,46 @@ {% extends "base.html" %} {% block content %} - -
-

- This product is currently free. You may cancel any plans above. -

-
-
-

- You cannot pay for access to the raw data. It is hashed to preserve privacy. -

-
- {# {% include "partials/product-list.html" %} #} + +
+

+ This product is currently free. You may cancel any plans above. +

+
+
+

+ You cannot pay for access to the raw data. It is hashed to preserve privacy. +

+
+ {# {% include "partials/product-list.html" %} #} {% endblock %} diff --git a/core/templates/cancel.html b/core/templates/cancel.html index 426cde8..6e86422 100644 --- a/core/templates/cancel.html +++ b/core/templates/cancel.html @@ -2,8 +2,8 @@ {% block content %} -
-

Forgot to add something to your cart? Shop around then come back to pay!

-
+
+

Forgot to add something to your cart? Shop around then come back to pay!

+
{% endblock %} diff --git a/core/templates/denied.html b/core/templates/denied.html index 971d96d..246c0af 100644 --- a/core/templates/denied.html +++ b/core/templates/denied.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} -

Access denied

-

Sorry, you do not have the necessary permissions to view this page.

+

Access denied

+

Sorry, you do not have the necessary permissions to view this page.

{% endblock %} diff --git a/core/templates/index.html b/core/templates/index.html index d8b4138..68e812a 100644 --- a/core/templates/index.html +++ b/core/templates/index.html @@ -2,47 +2,47 @@ {% load static %} {% block content %} -
- {% for block in blocks %} - {% if block.title is not None %} -

{{ block.title }}

- {% endif %} -
-
- {% if block.column1 is not None %} -
- {{ block.column1 }} +
+ {% for block in blocks %} + {% if block.title is not None %} +

{{ block.title }}

+ {% endif %} +
+
+ {% if block.column1 is not None %} +
+ {{ block.column1 }} +
+ {% endif %} + {% if block.column2 is not None %} +
+ {{ block.column2 }} +
+ {% endif %} + {% if block.column3 is not None %} +
+ {{ block.column3 }} +
+ {% endif %} +
+
+ {% if block.image1 is not None %} +
+ +
+ {% endif %} + {% if block.image2 is not None %} +
+ +
+ {% endif %} + {% if block.image3 is not None %} +
+ +
+ {% endif %} +
- {% endif %} - {% if block.column2 is not None %} -
- {{ block.column2 }} -
- {% endif %} - {% if block.column3 is not None %} -
- {{ block.column3 }} -
- {% endif %} -
-
- {% if block.image1 is not None %} -
- -
- {% endif %} - {% if block.image2 is not None %} -
- -
- {% endif %} - {% if block.image3 is not None %} -
- -
- {% endif %} -
-
- {% endfor %} -
+ {% endfor %} +
{% endblock %} diff --git a/core/templates/manage/threshold/irc/network/actions.html b/core/templates/manage/threshold/irc/network/actions.html index 685483e..37df9ab 100644 --- a/core/templates/manage/threshold/irc/network/actions.html +++ b/core/templates/manage/threshold/irc/network/actions.html @@ -1,81 +1,81 @@
- {% include 'manage/threshold/partials/notify.html' %} -
- - - - -
-
-
-
- - - - -
-
+ {% include 'manage/threshold/partials/notify.html' %} +
+ + + -
- +
+
+
+ + + + +
+
+ +
+
+
\ No newline at end of file diff --git a/core/templates/manage/threshold/irc/network/channels.html b/core/templates/manage/threshold/irc/network/channels.html index f87db4c..943924a 100644 --- a/core/templates/manage/threshold/irc/network/channels.html +++ b/core/templates/manage/threshold/irc/network/channels.html @@ -1,44 +1,44 @@
- {% include 'manage/threshold/partials/notify.html' %} - {% if channels is not None %} -
-
- - - - - - - - {% for channel in channels %} - - - - - - {% endfor %} - -
channelnumactions
- {{ channel.name }} - - {{ channel.users }} - - - {{ channel.num }} - - -
-
-
- {% endif %} + {% include 'manage/threshold/partials/notify.html' %} + {% if channels is not None %} +
+
+ + + + + + + + {% for channel in channels %} + + + + + + {% endfor %} + +
channelnumactions
+ {{ channel.name }} + + {{ channel.users }} + + + {{ channel.num }} + + +
+
+
+ {% endif %}
\ No newline at end of file diff --git a/core/templates/manage/threshold/irc/network/edit-network.html b/core/templates/manage/threshold/irc/network/edit-network.html index 9526182..4b260e7 100644 --- a/core/templates/manage/threshold/irc/network/edit-network.html +++ b/core/templates/manage/threshold/irc/network/edit-network.html @@ -1,77 +1,77 @@
-
- - - - - - - {% for key, item in network.items %} - - - +
attributevalue
{{ key }} -
- {% if key == 'auth' %} -
- + + + + + + {% for key, item in network.items %} + + + - - {% endfor %} + {% if item == 'plain' %} + + {% else %} + + {% endif %} + + + {% else %} + + {% endif %} + + + + {% endfor %} - -
attributevalue
{{ key }} +
+ {% if key == 'auth' %} +
+ -
- {% elif key == 'security' %} -
- +
+ {% elif key == 'security' %} +
+ -
- {% else %} - - {% endif %} -
-
- - - +
+ + + -
+
diff --git a/core/templates/manage/threshold/irc/network/info.html b/core/templates/manage/threshold/irc/network/info.html index 5e722a7..4c82aa2 100644 --- a/core/templates/manage/threshold/irc/network/info.html +++ b/core/templates/manage/threshold/irc/network/info.html @@ -1,61 +1,61 @@
- {% include 'manage/threshold/partials/notify.html' %} - {% if network is not None %} -
-
- - - - - - - {% for key, item in network.items %} - - - - - {% endfor %} - -
attributevalue
{{ key }} - {% if key == 'security' %} - {% if item == 'none' %} - - - - {% elif item == 'ssl' %} - - - - {% endif %} - {% elif key == 'relays' %} - - - - {% elif key == 'channels' %} - - - - {% elif key == 'records' %} - - - - {% elif key == 'host' %} - - - - {% endif %} - {% if item is not None %} - {{ item }} - {% endif %} -
-
- + {% include 'manage/threshold/partials/notify.html' %} + {% if network is not None %} +
+
+ + + + + + + {% for key, item in network.items %} + + + + + {% endfor %} + +
attributevalue
{{ key }} + {% if key == 'security' %} + {% if item == 'none' %} + + + + {% elif item == 'ssl' %} + + + + {% endif %} + {% elif key == 'relays' %} + + + + {% elif key == 'channels' %} + + + + {% elif key == 'records' %} + + + + {% elif key == 'host' %} + + + + {% endif %} + {% if item is not None %} + {{ item }} + {% endif %} +
+
+ +
+
-
-
- {% endif %} + {% endif %}
\ No newline at end of file diff --git a/core/templates/manage/threshold/irc/network/modals/registration.html b/core/templates/manage/threshold/irc/network/modals/registration.html index b6e845f..8025483 100644 --- a/core/templates/manage/threshold/irc/network/modals/registration.html +++ b/core/templates/manage/threshold/irc/network/modals/registration.html @@ -3,91 +3,91 @@