wangzhibo
2023-10-31 86070cd00485c47a2c5c3ffa4a9bae6648dd05c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
import { template as _$template } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { delegateEvents as _$delegateEvents } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { memo as _$memo } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { className as _$className } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { effect as _$effect } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { insert as _$insert } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { createComponent as _$createComponent } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
const _tmpl$ = /*#__PURE__*/_$template(`<div class="flex h-full flex-col gap-2"><div class="flex items-center gap-2"><div class="tabs-boxed tabs gap-2"></div><div class=ml-auto></div></div><div class="flex-1 overflow-y-auto">`),
  _tmpl$2 = /*#__PURE__*/_$template(`<button><span></span><div class="badge badge-sm">`),
  _tmpl$3 = /*#__PURE__*/_$template(`<div class="flex items-center justify-between pr-8"><div class="flex items-center gap-2"><span></span><div class="badge badge-sm">`),
  _tmpl$4 = /*#__PURE__*/_$template(`<div class="text-sm text-slate-500"> `),
  _tmpl$5 = /*#__PURE__*/_$template(`<div class="flex items-center justify-between pr-8"><div class="flex items-center gap-2"><span></span><div class="badge badge-sm"></div></div><div class="flex items-center gap-2">`),
  _tmpl$6 = /*#__PURE__*/_$template(`<div class="text-sm text-slate-500"> :: <!> `);
import { IconBrandSpeedtest, IconReload, IconSettings } from "/node_modules/.vite/deps/@tabler_icons-solidjs.js?v=000c47cd";
import { For, Show, createMemo, createSignal, onMount } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
import { twMerge } from "/node_modules/.vite/deps/tailwind-merge.js?v=d1b42b68";
import { Button, Collapse, ProxiesSettingsModal, ProxyNodeCard, ProxyNodePreview, RenderInTwoColumns, SubscriptionInfo } from "/src/components/index.ts";
import { filterProxiesByAvailability, sortProxiesByOrderingType } from "/src/helpers/index.ts";
import { useI18n } from "/src/i18n/index.tsx";
import { formatTimeFromNow, hideUnAvailableProxies, proxiesOrderingType, useProxies } from "/src/signals/index.ts";
var ActiveTab = /*#__PURE__*/function (ActiveTab) {
  ActiveTab["proxyProviders"] = "proxyProviders";
  ActiveTab["proxies"] = "proxies";
  return ActiveTab;
}(ActiveTab || {});
export default (() => {
  let proxiesSettingsModalRef;
  const [t] = useI18n();
  const {
    fetchProxies,
    proxies,
    selectProxyInGroup,
    latencyMap,
    proxyProviders,
    updateProviderByProviderName,
    updateAllProvider,
    proxyGroupLatencyTest,
    proxyProviderLatencyTest,
    collapsedMap,
    setCollapsedMap,
    proxyGroupLatencyTestingMap,
    proxyProviderLatencyTestingMap,
    isAllProviderUpdating,
    updatingMap
  } = useProxies();
  onMount(fetchProxies);
  const onProxyGroupLatencyTestClick = async (e, groupName) => {
    e.stopPropagation();
    void proxyGroupLatencyTest(groupName);
  };
  const onProxyProviderLatencyTestClick = (e, providerName) => {
    e.stopPropagation();
    void proxyProviderLatencyTest(providerName);
  };
  const onUpdateProxyProviderClick = (e, providerName) => {
    e.stopPropagation();
    void updateProviderByProviderName(providerName);
  };
  const onUpdateAllProviderClick = async e => {
    e.stopPropagation();
    void updateAllProvider();
  };
  const [activeTab, setActiveTab] = createSignal(ActiveTab.proxies);
  const tabs = () => [{
    type: ActiveTab.proxies,
    name: t('proxies'),
    count: proxies().length
  }, {
    type: ActiveTab.proxyProviders,
    name: t('proxyProviders'),
    count: proxyProviders().length
  }];
  return (() => {
    const _el$ = _tmpl$(),
      _el$2 = _el$.firstChild,
      _el$3 = _el$2.firstChild,
      _el$4 = _el$3.nextSibling,
      _el$5 = _el$2.nextSibling;
    _$insert(_el$3, _$createComponent(For, {
      get each() {
        return tabs();
      },
      children: tab => (() => {
        const _el$6 = _tmpl$2(),
          _el$7 = _el$6.firstChild,
          _el$8 = _el$7.nextSibling;
        _el$6.$$click = () => setActiveTab(tab.type);
        _$insert(_el$7, () => tab.name);
        _$insert(_el$8, () => tab.count);
        _$effect(() => _$className(_el$6, twMerge(activeTab() === tab.type && 'tab-active', 'tab tab-sm gap-2 px-2 sm:tab-md')));
        return _el$6;
      })()
    }));
    _$insert(_el$2, _$createComponent(Show, {
      get when() {
        return activeTab() === ActiveTab.proxyProviders;
      },
      get children() {
        return _$createComponent(Button, {
          "class": "btn btn-circle btn-sm",
          get disabled() {
            return isAllProviderUpdating();
          },
          onClick: e => onUpdateAllProviderClick(e),
          get icon() {
            return _$createComponent(IconReload, {
              get ["class"]() {
                return twMerge(isAllProviderUpdating() && 'animate-spin text-success');
              }
            });
          }
        });
      }
    }), _el$4);
    _$insert(_el$4, _$createComponent(Button, {
      "class": "btn-circle btn-sm sm:btn-md",
      onClick: () => proxiesSettingsModalRef?.showModal(),
      get icon() {
        return _$createComponent(IconSettings, {});
      }
    }));
    _$insert(_el$5, _$createComponent(Show, {
      get when() {
        return activeTab() === ActiveTab.proxies;
      },
      get children() {
        return _$createComponent(RenderInTwoColumns, {
          get children() {
            return _$createComponent(For, {
              get each() {
                return proxies();
              },
              children: proxyGroup => {
                const sortedProxyNames = createMemo(() => filterProxiesByAvailability(sortProxiesByOrderingType(proxyGroup.all ?? [], latencyMap(), proxiesOrderingType()), latencyMap(), hideUnAvailableProxies()));
                const title = [(() => {
                  const _el$9 = _tmpl$3(),
                    _el$10 = _el$9.firstChild,
                    _el$11 = _el$10.firstChild,
                    _el$12 = _el$11.nextSibling;
                  _$insert(_el$11, () => proxyGroup.name);
                  _$insert(_el$12, () => proxyGroup.all?.length);
                  _$insert(_el$9, _$createComponent(Button, {
                    "class": "btn-circle btn-sm",
                    get disabled() {
                      return proxyGroupLatencyTestingMap()[proxyGroup.name];
                    },
                    onClick: e => onProxyGroupLatencyTestClick(e, proxyGroup.name),
                    get icon() {
                      return _$createComponent(IconBrandSpeedtest, {
                        get ["class"]() {
                          return twMerge(proxyGroupLatencyTestingMap()[proxyGroup.name] && 'animate-pulse text-success');
                        }
                      });
                    }
                  }), null);
                  return _el$9;
                })(), (() => {
                  const _el$13 = _tmpl$4(),
                    _el$14 = _el$13.firstChild;
                  _$insert(_el$13, () => proxyGroup.type, _el$14);
                  _$insert(_el$13, () => proxyGroup.now?.length > 0 && ` :: ${proxyGroup.now}`, null);
                  return _el$13;
                })(), _$createComponent(Show, {
                  get when() {
                    return !collapsedMap()[proxyGroup.name];
                  },
                  get children() {
                    return _$createComponent(ProxyNodePreview, {
                      get proxyNameList() {
                        return sortedProxyNames();
                      },
                      get now() {
                        return proxyGroup.now;
                      }
                    });
                  }
                })];
                return _$createComponent(Collapse, {
                  get isOpen() {
                    return collapsedMap()[proxyGroup.name];
                  },
                  title: title,
                  onCollapse: val => setCollapsedMap(proxyGroup.name, val),
                  get children() {
                    return _$createComponent(For, {
                      get each() {
                        return sortedProxyNames();
                      },
                      children: proxyName => _$createComponent(ProxyNodeCard, {
                        proxyName: proxyName,
                        get isSelected() {
                          return proxyGroup.now === proxyName;
                        },
                        onClick: () => void selectProxyInGroup(proxyGroup, proxyName)
                      })
                    });
                  }
                });
              }
            });
          }
        });
      }
    }), null);
    _$insert(_el$5, _$createComponent(Show, {
      get when() {
        return activeTab() === ActiveTab.proxyProviders;
      },
      get children() {
        return _$createComponent(RenderInTwoColumns, {
          get children() {
            return _$createComponent(For, {
              get each() {
                return proxyProviders();
              },
              children: proxyProvider => {
                const sortedProxyNames = createMemo(() => sortProxiesByOrderingType(proxyProvider.proxies.map(i => i.name) ?? [], latencyMap(), proxiesOrderingType()));
                const title = [(() => {
                  const _el$15 = _tmpl$5(),
                    _el$16 = _el$15.firstChild,
                    _el$17 = _el$16.firstChild,
                    _el$18 = _el$17.nextSibling,
                    _el$19 = _el$16.nextSibling;
                  _$insert(_el$17, () => proxyProvider.name);
                  _$insert(_el$18, () => proxyProvider.proxies.length);
                  _$insert(_el$19, _$createComponent(Button, {
                    "class": "btn btn-circle btn-sm",
                    get disabled() {
                      return updatingMap()[proxyProvider.name];
                    },
                    onClick: e => onUpdateProxyProviderClick(e, proxyProvider.name),
                    get icon() {
                      return _$createComponent(IconReload, {
                        get ["class"]() {
                          return twMerge(updatingMap()[proxyProvider.name] && 'animate-spin text-success');
                        }
                      });
                    }
                  }), null);
                  _$insert(_el$19, _$createComponent(Button, {
                    "class": "btn btn-circle btn-sm",
                    get disabled() {
                      return proxyProviderLatencyTestingMap()[proxyProvider.name];
                    },
                    onClick: e => onProxyProviderLatencyTestClick(e, proxyProvider.name),
                    get icon() {
                      return _$createComponent(IconBrandSpeedtest, {
                        get ["class"]() {
                          return twMerge(proxyProviderLatencyTestingMap()[proxyProvider.name] && 'animate-pulse text-success');
                        }
                      });
                    }
                  }), null);
                  return _el$15;
                })(), _$createComponent(SubscriptionInfo, {
                  get subscriptionInfo() {
                    return proxyProvider.subscriptionInfo;
                  }
                }), (() => {
                  const _el$20 = _tmpl$6(),
                    _el$21 = _el$20.firstChild,
                    _el$23 = _el$21.nextSibling,
                    _el$22 = _el$23.nextSibling;
                  _$insert(_el$20, () => proxyProvider.vehicleType, _el$21);
                  _$insert(_el$20, () => t('updated'), _el$23);
                  _$insert(_el$20, () => formatTimeFromNow(proxyProvider.updatedAt), null);
                  return _el$20;
                })(), _$createComponent(Show, {
                  get when() {
                    return !collapsedMap()[proxyProvider.name];
                  },
                  get children() {
                    return _$createComponent(ProxyNodePreview, {
                      get proxyNameList() {
                        return sortedProxyNames();
                      }
                    });
                  }
                })];
                return _$createComponent(Collapse, {
                  get isOpen() {
                    return collapsedMap()[proxyProvider.name];
                  },
                  title: title,
                  onCollapse: val => setCollapsedMap(proxyProvider.name, val),
                  get children() {
                    return _$createComponent(For, {
                      get each() {
                        return sortedProxyNames();
                      },
                      children: proxyName => _$createComponent(ProxyNodeCard, {
                        proxyName: proxyName
                      })
                    });
                  }
                });
              }
            });
          }
        });
      }
    }), null);
    _$insert(_el$, _$createComponent(ProxiesSettingsModal, {
      ref: el => proxiesSettingsModalRef = el
    }), null);
    return _el$;
  })();
});
_$delegateEvents(["click"]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJY29uQnJhbmRTcGVlZHRlc3QiLCJJY29uUmVsb2FkIiwiSWNvblNldHRpbmdzIiwiRm9yIiwiU2hvdyIsImNyZWF0ZU1lbW8iLCJjcmVhdGVTaWduYWwiLCJvbk1vdW50IiwidHdNZXJnZSIsIkJ1dHRvbiIsIkNvbGxhcHNlIiwiUHJveGllc1NldHRpbmdzTW9kYWwiLCJQcm94eU5vZGVDYXJkIiwiUHJveHlOb2RlUHJldmlldyIsIlJlbmRlckluVHdvQ29sdW1ucyIsIlN1YnNjcmlwdGlvbkluZm8iLCJmaWx0ZXJQcm94aWVzQnlBdmFpbGFiaWxpdHkiLCJzb3J0UHJveGllc0J5T3JkZXJpbmdUeXBlIiwidXNlSTE4biIsImZvcm1hdFRpbWVGcm9tTm93IiwiaGlkZVVuQXZhaWxhYmxlUHJveGllcyIsInByb3hpZXNPcmRlcmluZ1R5cGUiLCJ1c2VQcm94aWVzIiwiQWN0aXZlVGFiIiwicHJveGllc1NldHRpbmdzTW9kYWxSZWYiLCJ0IiwiZmV0Y2hQcm94aWVzIiwicHJveGllcyIsInNlbGVjdFByb3h5SW5Hcm91cCIsImxhdGVuY3lNYXAiLCJwcm94eVByb3ZpZGVycyIsInVwZGF0ZVByb3ZpZGVyQnlQcm92aWRlck5hbWUiLCJ1cGRhdGVBbGxQcm92aWRlciIsInByb3h5R3JvdXBMYXRlbmN5VGVzdCIsInByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdCIsImNvbGxhcHNlZE1hcCIsInNldENvbGxhcHNlZE1hcCIsInByb3h5R3JvdXBMYXRlbmN5VGVzdGluZ01hcCIsInByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdGluZ01hcCIsImlzQWxsUHJvdmlkZXJVcGRhdGluZyIsInVwZGF0aW5nTWFwIiwib25Qcm94eUdyb3VwTGF0ZW5jeVRlc3RDbGljayIsImUiLCJncm91cE5hbWUiLCJzdG9wUHJvcGFnYXRpb24iLCJvblByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdENsaWNrIiwicHJvdmlkZXJOYW1lIiwib25VcGRhdGVQcm94eVByb3ZpZGVyQ2xpY2siLCJvblVwZGF0ZUFsbFByb3ZpZGVyQ2xpY2siLCJhY3RpdmVUYWIiLCJzZXRBY3RpdmVUYWIiLCJ0YWJzIiwidHlwZSIsIm5hbWUiLCJjb3VudCIsImxlbmd0aCIsIl9lbCQiLCJfdG1wbCQiLCJfZWwkMiIsImZpcnN0Q2hpbGQiLCJfZWwkMyIsIl9lbCQ0IiwibmV4dFNpYmxpbmciLCJfZWwkNSIsIl8kaW5zZXJ0IiwiXyRjcmVhdGVDb21wb25lbnQiLCJlYWNoIiwiY2hpbGRyZW4iLCJ0YWIiLCJfZWwkNiIsIl90bXBsJDIiLCJfZWwkNyIsIl9lbCQ4IiwiJCRjbGljayIsIl8kZWZmZWN0IiwiXyRjbGFzc05hbWUiLCJ3aGVuIiwiZGlzYWJsZWQiLCJvbkNsaWNrIiwiaWNvbiIsImNsYXNzIiwic2hvd01vZGFsIiwicHJveHlHcm91cCIsInNvcnRlZFByb3h5TmFtZXMiLCJhbGwiLCJ0aXRsZSIsIl9lbCQ5IiwiX3RtcGwkMyIsIl9lbCQxMCIsIl9lbCQxMSIsIl9lbCQxMiIsIl9lbCQxMyIsIl90bXBsJDQiLCJfZWwkMTQiLCJub3ciLCJwcm94eU5hbWVMaXN0IiwiaXNPcGVuIiwib25Db2xsYXBzZSIsInZhbCIsInByb3h5TmFtZSIsImlzU2VsZWN0ZWQiLCJwcm94eVByb3ZpZGVyIiwibWFwIiwiaSIsIl9lbCQxNSIsIl90bXBsJDUiLCJfZWwkMTYiLCJfZWwkMTciLCJfZWwkMTgiLCJfZWwkMTkiLCJzdWJzY3JpcHRpb25JbmZvIiwiX2VsJDIwIiwiX3RtcGwkNiIsIl9lbCQyMSIsIl9lbCQyMyIsIl9lbCQyMiIsInZlaGljbGVUeXBlIiwidXBkYXRlZEF0IiwicmVmIiwiZWwiLCJfJGRlbGVnYXRlRXZlbnRzIl0sInNvdXJjZXMiOlsiUHJveGllcy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBJY29uQnJhbmRTcGVlZHRlc3QsXHJcbiAgSWNvblJlbG9hZCxcclxuICBJY29uU2V0dGluZ3MsXHJcbn0gZnJvbSAnQHRhYmxlci9pY29ucy1zb2xpZGpzJ1xyXG5pbXBvcnQgeyBGb3IsIFNob3csIGNyZWF0ZU1lbW8sIGNyZWF0ZVNpZ25hbCwgb25Nb3VudCB9IGZyb20gJ3NvbGlkLWpzJ1xyXG5pbXBvcnQgeyB0d01lcmdlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnXHJcbmltcG9ydCB7XHJcbiAgQnV0dG9uLFxyXG4gIENvbGxhcHNlLFxyXG4gIFByb3hpZXNTZXR0aW5nc01vZGFsLFxyXG4gIFByb3h5Tm9kZUNhcmQsXHJcbiAgUHJveHlOb2RlUHJldmlldyxcclxuICBSZW5kZXJJblR3b0NvbHVtbnMsXHJcbiAgU3Vic2NyaXB0aW9uSW5mbyxcclxufSBmcm9tICd+L2NvbXBvbmVudHMnXHJcbmltcG9ydCB7XHJcbiAgZmlsdGVyUHJveGllc0J5QXZhaWxhYmlsaXR5LFxyXG4gIHNvcnRQcm94aWVzQnlPcmRlcmluZ1R5cGUsXHJcbn0gZnJvbSAnfi9oZWxwZXJzJ1xyXG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSAnfi9pMThuJ1xyXG5pbXBvcnQge1xyXG4gIGZvcm1hdFRpbWVGcm9tTm93LFxyXG4gIGhpZGVVbkF2YWlsYWJsZVByb3hpZXMsXHJcbiAgcHJveGllc09yZGVyaW5nVHlwZSxcclxuICB1c2VQcm94aWVzLFxyXG59IGZyb20gJ34vc2lnbmFscydcclxuXHJcbmVudW0gQWN0aXZlVGFiIHtcclxuICBwcm94eVByb3ZpZGVycyA9ICdwcm94eVByb3ZpZGVycycsXHJcbiAgcHJveGllcyA9ICdwcm94aWVzJyxcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gIGxldCBwcm94aWVzU2V0dGluZ3NNb2RhbFJlZjogSFRNTERpYWxvZ0VsZW1lbnQgfCB1bmRlZmluZWRcclxuXHJcbiAgY29uc3QgW3RdID0gdXNlSTE4bigpXHJcblxyXG4gIGNvbnN0IHtcclxuICAgIGZldGNoUHJveGllcyxcclxuICAgIHByb3hpZXMsXHJcbiAgICBzZWxlY3RQcm94eUluR3JvdXAsXHJcbiAgICBsYXRlbmN5TWFwLFxyXG4gICAgcHJveHlQcm92aWRlcnMsXHJcbiAgICB1cGRhdGVQcm92aWRlckJ5UHJvdmlkZXJOYW1lLFxyXG4gICAgdXBkYXRlQWxsUHJvdmlkZXIsXHJcbiAgICBwcm94eUdyb3VwTGF0ZW5jeVRlc3QsXHJcbiAgICBwcm94eVByb3ZpZGVyTGF0ZW5jeVRlc3QsXHJcbiAgICBjb2xsYXBzZWRNYXAsXHJcbiAgICBzZXRDb2xsYXBzZWRNYXAsXHJcbiAgICBwcm94eUdyb3VwTGF0ZW5jeVRlc3RpbmdNYXAsXHJcbiAgICBwcm94eVByb3ZpZGVyTGF0ZW5jeVRlc3RpbmdNYXAsXHJcbiAgICBpc0FsbFByb3ZpZGVyVXBkYXRpbmcsXHJcbiAgICB1cGRhdGluZ01hcCxcclxuICB9ID0gdXNlUHJveGllcygpXHJcblxyXG4gIG9uTW91bnQoZmV0Y2hQcm94aWVzKVxyXG5cclxuICBjb25zdCBvblByb3h5R3JvdXBMYXRlbmN5VGVzdENsaWNrID0gYXN5bmMgKFxyXG4gICAgZTogTW91c2VFdmVudCxcclxuICAgIGdyb3VwTmFtZTogc3RyaW5nLFxyXG4gICkgPT4ge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgdm9pZCBwcm94eUdyb3VwTGF0ZW5jeVRlc3QoZ3JvdXBOYW1lKVxyXG4gIH1cclxuXHJcbiAgY29uc3Qgb25Qcm94eVByb3ZpZGVyTGF0ZW5jeVRlc3RDbGljayA9IChcclxuICAgIGU6IE1vdXNlRXZlbnQsXHJcbiAgICBwcm92aWRlck5hbWU6IHN0cmluZyxcclxuICApID0+IHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgIHZvaWQgcHJveHlQcm92aWRlckxhdGVuY3lUZXN0KHByb3ZpZGVyTmFtZSlcclxuICB9XHJcblxyXG4gIGNvbnN0IG9uVXBkYXRlUHJveHlQcm92aWRlckNsaWNrID0gKGU6IE1vdXNlRXZlbnQsIHByb3ZpZGVyTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICB2b2lkIHVwZGF0ZVByb3ZpZGVyQnlQcm92aWRlck5hbWUocHJvdmlkZXJOYW1lKVxyXG4gIH1cclxuXHJcbiAgY29uc3Qgb25VcGRhdGVBbGxQcm92aWRlckNsaWNrID0gYXN5bmMgKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgIHZvaWQgdXBkYXRlQWxsUHJvdmlkZXIoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgW2FjdGl2ZVRhYiwgc2V0QWN0aXZlVGFiXSA9IGNyZWF0ZVNpZ25hbChBY3RpdmVUYWIucHJveGllcylcclxuXHJcbiAgY29uc3QgdGFicyA9ICgpID0+IFtcclxuICAgIHtcclxuICAgICAgdHlwZTogQWN0aXZlVGFiLnByb3hpZXMsXHJcbiAgICAgIG5hbWU6IHQoJ3Byb3hpZXMnKSxcclxuICAgICAgY291bnQ6IHByb3hpZXMoKS5sZW5ndGgsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBBY3RpdmVUYWIucHJveHlQcm92aWRlcnMsXHJcbiAgICAgIG5hbWU6IHQoJ3Byb3h5UHJvdmlkZXJzJyksXHJcbiAgICAgIGNvdW50OiBwcm94eVByb3ZpZGVycygpLmxlbmd0aCxcclxuICAgIH0sXHJcbiAgXVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIGZsZXgtY29sIGdhcC0yXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWJveGVkIHRhYnMgZ2FwLTJcIj5cclxuICAgICAgICAgIDxGb3IgZWFjaD17dGFicygpfT5cclxuICAgICAgICAgICAgeyh0YWIpID0+IChcclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz17dHdNZXJnZShcclxuICAgICAgICAgICAgICAgICAgYWN0aXZlVGFiKCkgPT09IHRhYi50eXBlICYmICd0YWItYWN0aXZlJyxcclxuICAgICAgICAgICAgICAgICAgJ3RhYiB0YWItc20gZ2FwLTIgcHgtMiBzbTp0YWItbWQnLFxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEFjdGl2ZVRhYih0YWIudHlwZSl9XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3RhYi5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBiYWRnZS1zbVwiPnt0YWIuY291bnR9PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICA8L0Zvcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPFNob3cgd2hlbj17YWN0aXZlVGFiKCkgPT09IEFjdGl2ZVRhYi5wcm94eVByb3ZpZGVyc30+XHJcbiAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1jaXJjbGUgYnRuLXNtXCJcclxuICAgICAgICAgICAgZGlzYWJsZWQ9e2lzQWxsUHJvdmlkZXJVcGRhdGluZygpfVxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gb25VcGRhdGVBbGxQcm92aWRlckNsaWNrKGUpfVxyXG4gICAgICAgICAgICBpY29uPXtcclxuICAgICAgICAgICAgICA8SWNvblJlbG9hZFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9e3R3TWVyZ2UoXHJcbiAgICAgICAgICAgICAgICAgIGlzQWxsUHJvdmlkZXJVcGRhdGluZygpICYmICdhbmltYXRlLXNwaW4gdGV4dC1zdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L1Nob3c+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtbC1hdXRvXCI+XHJcbiAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNpcmNsZSBidG4tc20gc206YnRuLW1kXCJcclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcHJveGllc1NldHRpbmdzTW9kYWxSZWY/LnNob3dNb2RhbCgpfVxyXG4gICAgICAgICAgICBpY29uPXs8SWNvblNldHRpbmdzIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIG92ZXJmbG93LXktYXV0b1wiPlxyXG4gICAgICAgIDxTaG93IHdoZW49e2FjdGl2ZVRhYigpID09PSBBY3RpdmVUYWIucHJveGllc30+XHJcbiAgICAgICAgICA8UmVuZGVySW5Ud29Db2x1bW5zPlxyXG4gICAgICAgICAgICA8Rm9yIGVhY2g9e3Byb3hpZXMoKX0+XHJcbiAgICAgICAgICAgICAgeyhwcm94eUdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRQcm94eU5hbWVzID0gY3JlYXRlTWVtbygoKSA9PlxyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJQcm94aWVzQnlBdmFpbGFiaWxpdHkoXHJcbiAgICAgICAgICAgICAgICAgICAgc29ydFByb3hpZXNCeU9yZGVyaW5nVHlwZShcclxuICAgICAgICAgICAgICAgICAgICAgIHByb3h5R3JvdXAuYWxsID8/IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1hcCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcHJveGllc09yZGVyaW5nVHlwZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1hcCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGhpZGVVbkF2YWlsYWJsZVByb3hpZXMoKSxcclxuICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IChcclxuICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHByLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57cHJveHlHcm91cC5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGJhZGdlLXNtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3Byb3h5R3JvdXAuYWxsPy5sZW5ndGh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1jaXJjbGUgYnRuLXNtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5R3JvdXBMYXRlbmN5VGVzdGluZ01hcCgpW3Byb3h5R3JvdXAubmFtZV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblByb3h5R3JvdXBMYXRlbmN5VGVzdENsaWNrKGUsIHByb3h5R3JvdXAubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbkJyYW5kU3BlZWR0ZXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz17dHdNZXJnZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlHcm91cExhdGVuY3lUZXN0aW5nTWFwKClbcHJveHlHcm91cC5uYW1lXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmltYXRlLXB1bHNlIHRleHQtc3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtc2xhdGUtNTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7cHJveHlHcm91cC50eXBlfXsnICd9XHJcbiAgICAgICAgICAgICAgICAgICAgICB7cHJveHlHcm91cC5ub3c/Lmxlbmd0aCA+IDAgJiYgYCA6OiAke3Byb3h5R3JvdXAubm93fWB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxTaG93IHdoZW49eyFjb2xsYXBzZWRNYXAoKVtwcm94eUdyb3VwLm5hbWVdfT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxQcm94eU5vZGVQcmV2aWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5TmFtZUxpc3Q9e3NvcnRlZFByb3h5TmFtZXMoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm93PXtwcm94eUdyb3VwLm5vd31cclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9TaG93PlxyXG4gICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICA8Q29sbGFwc2VcclxuICAgICAgICAgICAgICAgICAgICBpc09wZW49e2NvbGxhcHNlZE1hcCgpW3Byb3h5R3JvdXAubmFtZV19XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e3RpdGxlfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ29sbGFwc2U9eyh2YWwpID0+IHNldENvbGxhcHNlZE1hcChwcm94eUdyb3VwLm5hbWUsIHZhbCl9XHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8Rm9yIGVhY2g9e3NvcnRlZFByb3h5TmFtZXMoKX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7KHByb3h5TmFtZSkgPT4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8UHJveHlOb2RlQ2FyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5TmFtZT17cHJveHlOYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ9e3Byb3h5R3JvdXAubm93ID09PSBwcm94eU5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc2VsZWN0UHJveHlJbkdyb3VwKHByb3h5R3JvdXAsIHByb3h5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvRm9yPlxyXG4gICAgICAgICAgICAgICAgICA8L0NvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIDwvRm9yPlxyXG4gICAgICAgICAgPC9SZW5kZXJJblR3b0NvbHVtbnM+XHJcbiAgICAgICAgPC9TaG93PlxyXG5cclxuICAgICAgICA8U2hvdyB3aGVuPXthY3RpdmVUYWIoKSA9PT0gQWN0aXZlVGFiLnByb3h5UHJvdmlkZXJzfT5cclxuICAgICAgICAgIDxSZW5kZXJJblR3b0NvbHVtbnM+XHJcbiAgICAgICAgICAgIDxGb3IgZWFjaD17cHJveHlQcm92aWRlcnMoKX0+XHJcbiAgICAgICAgICAgICAgeyhwcm94eVByb3ZpZGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRQcm94eU5hbWVzID0gY3JlYXRlTWVtbygoKSA9PlxyXG4gICAgICAgICAgICAgICAgICBzb3J0UHJveGllc0J5T3JkZXJpbmdUeXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHByb3h5UHJvdmlkZXIucHJveGllcy5tYXAoKGkpID0+IGkubmFtZSkgPz8gW10sXHJcbiAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1hcCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb3hpZXNPcmRlcmluZ1R5cGUoKSxcclxuICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IChcclxuICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHByLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57cHJveHlQcm92aWRlci5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGJhZGdlLXNtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3Byb3h5UHJvdmlkZXIucHJveGllcy5sZW5ndGh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tY2lyY2xlIGJ0bi1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3VwZGF0aW5nTWFwKClbcHJveHlQcm92aWRlci5uYW1lXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVXBkYXRlUHJveHlQcm92aWRlckNsaWNrKGUsIHByb3h5UHJvdmlkZXIubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvblJlbG9hZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz17dHdNZXJnZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGluZ01hcCgpW3Byb3h5UHJvdmlkZXIubmFtZV0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmltYXRlLXNwaW4gdGV4dC1zdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1jaXJjbGUgYnRuLXNtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3ZpZGVyTGF0ZW5jeVRlc3RpbmdNYXAoKVtwcm94eVByb3ZpZGVyLm5hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Qcm94eVByb3ZpZGVyTGF0ZW5jeVRlc3RDbGljayhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlQcm92aWRlci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJY29uQnJhbmRTcGVlZHRlc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9e3R3TWVyZ2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlQcm92aWRlckxhdGVuY3lUZXN0aW5nTWFwKClbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3ZpZGVyLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdICYmICdhbmltYXRlLXB1bHNlIHRleHQtc3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8U3Vic2NyaXB0aW9uSW5mb1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uSW5mbz17cHJveHlQcm92aWRlci5zdWJzY3JpcHRpb25JbmZvfVxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtc2xhdGUtNTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7cHJveHlQcm92aWRlci52ZWhpY2xlVHlwZX0gOjoge3QoJ3VwZGF0ZWQnKX17JyAnfVxyXG4gICAgICAgICAgICAgICAgICAgICAge2Zvcm1hdFRpbWVGcm9tTm93KHByb3h5UHJvdmlkZXIudXBkYXRlZEF0KX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPFNob3cgd2hlbj17IWNvbGxhcHNlZE1hcCgpW3Byb3h5UHJvdmlkZXIubmFtZV19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFByb3h5Tm9kZVByZXZpZXcgcHJveHlOYW1lTGlzdD17c29ydGVkUHJveHlOYW1lcygpfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvU2hvdz5cclxuICAgICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgPENvbGxhcHNlXHJcbiAgICAgICAgICAgICAgICAgICAgaXNPcGVuPXtjb2xsYXBzZWRNYXAoKVtwcm94eVByb3ZpZGVyLm5hbWVdfVxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0aXRsZX1cclxuICAgICAgICAgICAgICAgICAgICBvbkNvbGxhcHNlPXsodmFsKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0Q29sbGFwc2VkTWFwKHByb3h5UHJvdmlkZXIubmFtZSwgdmFsKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxGb3IgZWFjaD17c29ydGVkUHJveHlOYW1lcygpfT5cclxuICAgICAgICAgICAgICAgICAgICAgIHsocHJveHlOYW1lKSA9PiA8UHJveHlOb2RlQ2FyZCBwcm94eU5hbWU9e3Byb3h5TmFtZX0gLz59XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Gb3I+XHJcbiAgICAgICAgICAgICAgICAgIDwvQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPC9Gb3I+XHJcbiAgICAgICAgICA8L1JlbmRlckluVHdvQ29sdW1ucz5cclxuICAgICAgICA8L1Nob3c+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPFByb3hpZXNTZXR0aW5nc01vZGFsIHJlZj17KGVsKSA9PiAocHJveGllc1NldHRpbmdzTW9kYWxSZWYgPSBlbCl9IC8+XHJcbiAgICA8L2Rpdj5cclxuICApXHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsU0FDRUEsa0JBQWtCLEVBQ2xCQyxVQUFVLEVBQ1ZDLFlBQVksUUFDUCx1QkFBdUI7QUFDOUIsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsWUFBWSxFQUFFQyxPQUFPLFFBQVEsVUFBVTtBQUN2RSxTQUFTQyxPQUFPLFFBQVEsZ0JBQWdCO0FBQ3hDLFNBQ0VDLE1BQU0sRUFDTkMsUUFBUSxFQUNSQyxvQkFBb0IsRUFDcEJDLGFBQWEsRUFDYkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsRUFDbEJDLGdCQUFnQixRQUNYLGNBQWM7QUFDckIsU0FDRUMsMkJBQTJCLEVBQzNCQyx5QkFBeUIsUUFDcEIsV0FBVztB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