@blinkk/root-cms 1.0.0-rc.29 → 1.0.0-rc.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/dist/app.js +2 -1
- package/dist/plugin.d.ts +10 -0
- package/dist/plugin.js +1 -1
- package/dist/ui/ui.css +62 -53
- package/dist/ui/ui.js +1283 -272
- package/package.json +6 -3
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Setting up Firestore
|
|
2
|
+
|
|
3
|
+
Firestore must be setup as `Native Mode` and not `Datastore Mode`
|
|
4
|
+
|
|
5
|
+
Firestore read/writes will need to be locked down by adding the following to the security rules (in Firebase's Firestore UI):
|
|
6
|
+
```
|
|
7
|
+
rules_version = '2';
|
|
8
|
+
service cloud.firestore {
|
|
9
|
+
match /databases/{database}/documents {
|
|
10
|
+
match /Projects/{project}/{document=**} {
|
|
11
|
+
allow write:
|
|
12
|
+
if request.auth != null
|
|
13
|
+
&& exists(/databases/$(database)/documents/Projects/$(project))
|
|
14
|
+
&& get(/databases/$(database)/documents/Projects/$(project)).data.roles[request.auth.token.email] in ['ADMIN', 'EDITOR'];
|
|
15
|
+
allow read:
|
|
16
|
+
if request.auth != null
|
|
17
|
+
&& exists(/databases/$(database)/documents/Projects/$(project))
|
|
18
|
+
&& get(/databases/$(database)/documents/Projects/$(project)).data.roles[request.auth.token.email] in ['ADMIN', 'EDITOR', 'VIEWER'];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
match /Projects/{project}/Collections/{collection}/{document=**} {
|
|
22
|
+
allow write:
|
|
23
|
+
if request.auth != null
|
|
24
|
+
&& exists(/databases/$(database)/documents/Projects/$(project)/Collections/$(collection))
|
|
25
|
+
&& get(/databases/$(database)/documents/Projects/$(project)/Collections/$(collection)).data.roles[request.auth.token.email] in ['ADMIN', 'EDITOR'];
|
|
26
|
+
allow read:
|
|
27
|
+
if request.auth != null
|
|
28
|
+
&& exists(/databases/$(database)/documents/Projects/$(project)/Collections/$(collection))
|
|
29
|
+
&& get(/databases/$(database)/documents/Projects/$(project)/Collections/$(collection)).data.roles[request.auth.token.email] in ['ADMIN', 'EDITOR', 'VIEWER'];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
In Firestore, add a document at `Projects/<yourprojectid>` with a value of `{roles: {"youremail@yourdomain.tld": "ADMIN"}}`.
|
|
36
|
+
|
|
37
|
+
Using Firestore Studio:
|
|
38
|
+
- Under `Give the collection an ID`, set `Collection ID` to `Projects`
|
|
39
|
+
- Under `Add its first document` set `Document ID` to your project ID
|
|
40
|
+
- For the first record set `Field name` to `roles` with a `Field type` of `map`
|
|
41
|
+
- In the map set the new `Field name` to your e-mail, `Field type` to `string` and `Field value` to `ADMIN` and save.
|
package/dist/app.js
CHANGED
|
@@ -77,6 +77,7 @@ async function renderApp(req, res, options) {
|
|
|
77
77
|
i18n: rootConfig.i18n
|
|
78
78
|
},
|
|
79
79
|
firebaseConfig: options.firebaseConfig,
|
|
80
|
+
gapi: cmsConfig.gapi,
|
|
80
81
|
collections
|
|
81
82
|
};
|
|
82
83
|
const projectName = cmsConfig.name || cmsConfig.id || "";
|
|
@@ -156,4 +157,4 @@ export {
|
|
|
156
157
|
renderApp,
|
|
157
158
|
renderSignIn
|
|
158
159
|
};
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9hcHAudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB7UmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge3JlbmRlciBhcyByZW5kZXJUb1N0cmluZ30gZnJvbSAncHJlYWN0LXJlbmRlci10by1zdHJpbmcnO1xuXG5pbXBvcnQge0NvbGxlY3Rpb259IGZyb20gJy4vc2NoZW1hLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmludGVyZmFjZSBBcHBQcm9wcyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN0eDogYW55O1xufVxuXG5mdW5jdGlvbiBBcHAocHJvcHM6IEFwcFByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWw+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPHRpdGxlPntwcm9wcy50aXRsZX08L3RpdGxlPlxuICAgICAgICA8bGluayByZWw9XCJwcmVjb25uZWN0XCIgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb21cIiAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInByZWNvbm5lY3RcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tXCJcbiAgICAgICAgICBjcm9zc09yaWdpbj1cImFub255bW91c1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwic3R5bGVzaGVldFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEAzMDA7NDAwOzUwMDs2MDA7NzAwOzkwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUdvb2dsZStTYW5zOndnaHRANTAwJmRpc3BsYXk9c3dhcFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwie0NTU19VUkx9XCIgLz5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPVwicm9vdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9vdHN0cmFwXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwiYm9vdHN0cmFwX19sb2FkaW5nXCI+TG9hZGluZy4uLjwvaDE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcC1lcnJvclwiPlxuICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgZmFpbHMgdG8gbG9hZCwgdHJ5IGEgZm9yY2UgcmVmcmVzaCBieSBob2xkaW5nIHRoZVxuICAgICAgICAgICAgICBzaGlmdCBrZXkgd2hpbGUgcmVmcmVzaGluZyB0aGUgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IGB3aW5kb3cuX19ST09UX0NUWCA9ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuY3R4KX1gLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIntKU19VUkx9XCI+PC9zY3JpcHQ+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyQXBwKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgb3B0aW9uczogYW55KSB7XG4gIGNvbnN0IGNvbGxlY3Rpb25Nb2R1bGVzID0gaW1wb3J0Lm1ldGEuZ2xvYignL2NvbGxlY3Rpb25zLyouc2NoZW1hLnRzJywge1xuICAgIGVhZ2VyOiB0cnVlLFxuICB9KSBhcyBhbnk7XG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb2xsZWN0aW9uPiA9IHt9O1xuICBPYmplY3Qua2V5cyhjb2xsZWN0aW9uTW9kdWxlcykuZm9yRWFjaCgobW9kdWxlSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHBhdGgucGFyc2UobW9kdWxlSWQpLmJhc2Uuc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCBtb2R1bGUgPSBjb2xsZWN0aW9uTW9kdWxlc1ttb2R1bGVJZF07XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG1vZHVsZS5kZWZhdWx0IGFzIENvbGxlY3Rpb247XG4gICAgY29sbGVjdGlvbnNbY29sbGVjdGlvbklkXSA9IGNvbGxlY3Rpb247XG4gIH0pO1xuICBjb25zdCByb290Q29uZmlnID0gb3B0aW9ucy5yb290Q29uZmlnIHx8IHt9O1xuICBjb25zdCBjbXNDb25maWcgPSBvcHRpb25zLmNtc0NvbmZpZyB8fCB7fTtcbiAgbGV0IGdjaSA9IGNtc0NvbmZpZy5nY2k7XG4gIGlmIChnY2kgPT09IHRydWUpIHtcbiAgICBnY2kgPSAnaHR0cHM6Ly9nY2kucm9vdGpzLmRldic7XG4gIH1cbiAgY29uc3QgY3R4ID0ge1xuICAgIHJvb3RDb25maWc6IHtcbiAgICAgIHByb2plY3RJZDogY21zQ29uZmlnLmlkIHx8ICdkZWZhdWx0JyxcbiAgICAgIHByb2plY3ROYW1lOiBjbXNDb25maWcubmFtZSB8fCBjbXNDb25maWcuaWQgfHwgJycsXG4gICAgICBkb21haW46IHJvb3RDb25maWcuZG9tYWluIHx8ICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgIGJhc2U6IHJvb3RDb25maWcuYmFzZSB8fCAnLycsXG4gICAgICBnY2k6IGdjaSxcbiAgICAgIGkxOG46IHJvb3RDb25maWcuaTE4bixcbiAgICB9LFxuICAgIGZpcmViYXNlQ29uZmlnOiBvcHRpb25zLmZpcmViYXNlQ29uZmlnLFxuICAgIGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9ucyxcbiAgfTtcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBjbXNDb25maWcubmFtZSB8fCBjbXNDb25maWcuaWQgfHwgJyc7XG4gIGNvbnN0IHRpdGxlID0gcHJvamVjdE5hbWUgPyBgJHtwcm9qZWN0TmFtZX0gXHUyMDEzIFJvb3QuanMgQ01TYCA6ICdSb290LmpzIENNUyc7XG5cbiAgY29uc3QgbWFpbkh0bWwgPSByZW5kZXJUb1N0cmluZyg8QXBwIHRpdGxlPXt0aXRsZX0gY3R4PXtjdHh9IC8+KTtcbiAgbGV0IGh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XFxuJHttYWluSHRtbH1gO1xuICBpZiAocmVxLnZpdGVTZXJ2ZXIpIHtcbiAgICBjb25zdCB1aUNzc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvdWkuY3NzJyk7XG4gICAgY29uc3QgdWlKc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvdWkuanMnKTtcbiAgICBjb25zdCB0cGwgPSBodG1sXG4gICAgICAucmVwbGFjZSgne0NTU19VUkx9JywgYC9AZnMke3VpQ3NzUGF0aH1gKVxuICAgICAgLnJlcGxhY2UoJ3tKU19VUkx9JywgYC9AZnMke3VpSnNQYXRofWApO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy91aS5jc3MnKVxuICAgICAgLnJlcGxhY2UoJ3tKU19VUkx9JywgJy9jbXMvc3RhdGljL3VpLmpzJyk7XG4gIH1cbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICByZXMuc2VuZChodG1sKTtcbn1cblxuaW50ZXJmYWNlIFNpZ25JblByb3BzIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgY3R4OiBhbnk7XG59XG5cbmZ1bmN0aW9uIFNpZ25Jbihwcm9wczogU2lnbkluUHJvcHMpIHtcbiAgcmV0dXJuIChcbiAgICA8aHRtbD5cbiAgICAgIDxoZWFkPlxuICAgICAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIiAvPlxuICAgICAgICA8dGl0bGU+e3Byb3BzLnRpdGxlfTwvdGl0bGU+XG4gICAgICAgIDxsaW5rIHJlbD1cInByZWNvbm5lY3RcIiBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbVwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCIgLz5cbiAgICAgICAgPGxpbmtcbiAgICAgICAgICByZWw9XCJwcmVjb25uZWN0XCJcbiAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbVwiXG4gICAgICAgICAgY3Jvc3NPcmlnaW49XCJhbm9ueW1vdXNcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9R29vZ2xlK1NhbnM6NDAwLDUwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIntDU1NfVVJMfVwiIC8+XG4gICAgICA8L2hlYWQ+XG4gICAgICA8Ym9keT5cbiAgICAgICAgPGRpdiBpZD1cInJvb3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcFwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cImJvb3RzdHJhcF9fbG9hZGluZ1wiPkxvYWRpbmcuLi48L2gxPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib290c3RyYXAtZXJyb3JcIj5cbiAgICAgICAgICAgICAgSWYgdGhpcyBwYWdlIGZhaWxzIHRvIGxvYWQsIHRyeSBhIGZvcmNlIHJlZnJlc2ggYnkgaG9sZGluZyB0aGVcbiAgICAgICAgICAgICAgc2hpZnQga2V5IHdoaWxlIHJlZnJlc2hpbmcgdGhlIHBhZ2UuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgX19odG1sOiBgd2luZG93Ll9fUk9PVF9DVFggPSAke0pTT04uc3RyaW5naWZ5KHByb3BzLmN0eCl9YCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgICA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIiBzcmM9XCJ7SlNfVVJMfVwiPjwvc2NyaXB0PlxuICAgICAgPC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJTaWduSW4ocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBvcHRpb25zOiBhbnkpIHtcbiAgY29uc3QgY3R4ID0ge25hbWU6IG9wdGlvbnMubmFtZSwgZmlyZWJhc2VDb25maWc6IG9wdGlvbnMuZmlyZWJhc2VDb25maWd9O1xuICBjb25zdCBtYWluSHRtbCA9IHJlbmRlclRvU3RyaW5nKDxTaWduSW4gdGl0bGU9XCJTaWduIGluXCIgY3R4PXtjdHh9IC8+KTtcbiAgbGV0IGh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XFxuJHttYWluSHRtbH1gO1xuICBpZiAocmVxLnZpdGVTZXJ2ZXIpIHtcbiAgICBjb25zdCBjc3NQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3VpL3NpZ25pbi5jc3MnKTtcbiAgICBjb25zdCBqc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvc2lnbmluLmpzJyk7XG4gICAgY29uc3QgdHBsID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsIGAvQGZzJHtjc3NQYXRofWApXG4gICAgICAucmVwbGFjZSgne0pTX1VSTH0nLCBgL0BmcyR7anNQYXRofWApO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uY3NzJylcbiAgICAgIC5yZXBsYWNlKCd7SlNfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uanMnKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gIHJlcy5zZW5kKGh0bWwpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLE9BQU8sVUFBVTtBQUNqQixTQUFRLHFCQUFvQjtBQUc1QixTQUFRLFVBQVUsc0JBQXFCO0FBY2pDLFNBQ0UsS0FERjtBQVZOLElBQU0sWUFBWSxLQUFLLFFBQVEsY0FBYyxZQUFZLEdBQUcsQ0FBQztBQU83RCxTQUFTLElBQUksT0FBaUI7QUFDNUIsU0FDRSxxQkFBQyxVQUNDO0FBQUEseUJBQUMsVUFDQztBQUFBLDBCQUFDLFdBQU8sZ0JBQU0sT0FBTTtBQUFBLE1BQ3BCLG9CQUFDLFVBQUssS0FBSSxjQUFhLE1BQUssZ0NBQStCO0FBQUEsTUFDM0Q7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLEtBQUk7QUFBQSxVQUNKLE1BQUs7QUFBQSxVQUNMLGFBQVk7QUFBQTtBQUFBLE1BQ2Q7QUFBQSxNQUNBO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxLQUFJO0FBQUEsVUFDSixNQUFLO0FBQUE7QUFBQSxNQUNQO0FBQUEsTUFDQTtB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
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9hcHAudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB7UmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge3JlbmRlciBhcyByZW5kZXJUb1N0cmluZ30gZnJvbSAncHJlYWN0LXJlbmRlci10by1zdHJpbmcnO1xuXG5pbXBvcnQge0NvbGxlY3Rpb259IGZyb20gJy4vc2NoZW1hLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmludGVyZmFjZSBBcHBQcm9wcyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN0eDogYW55O1xufVxuXG5mdW5jdGlvbiBBcHAocHJvcHM6IEFwcFByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWw+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPHRpdGxlPntwcm9wcy50aXRsZX08L3RpdGxlPlxuICAgICAgICA8bGluayByZWw9XCJwcmVjb25uZWN0XCIgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb21cIiAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInByZWNvbm5lY3RcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tXCJcbiAgICAgICAgICBjcm9zc09yaWdpbj1cImFub255bW91c1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwic3R5bGVzaGVldFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEAzMDA7NDAwOzUwMDs2MDA7NzAwOzkwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUdvb2dsZStTYW5zOndnaHRANTAwJmRpc3BsYXk9c3dhcFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwie0NTU19VUkx9XCIgLz5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPVwicm9vdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9vdHN0cmFwXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwiYm9vdHN0cmFwX19sb2FkaW5nXCI+TG9hZGluZy4uLjwvaDE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcC1lcnJvclwiPlxuICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgZmFpbHMgdG8gbG9hZCwgdHJ5IGEgZm9yY2UgcmVmcmVzaCBieSBob2xkaW5nIHRoZVxuICAgICAgICAgICAgICBzaGlmdCBrZXkgd2hpbGUgcmVmcmVzaGluZyB0aGUgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IGB3aW5kb3cuX19ST09UX0NUWCA9ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuY3R4KX1gLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIntKU19VUkx9XCI+PC9zY3JpcHQ+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyQXBwKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgb3B0aW9uczogYW55KSB7XG4gIGNvbnN0IGNvbGxlY3Rpb25Nb2R1bGVzID0gaW1wb3J0Lm1ldGEuZ2xvYignL2NvbGxlY3Rpb25zLyouc2NoZW1hLnRzJywge1xuICAgIGVhZ2VyOiB0cnVlLFxuICB9KSBhcyBhbnk7XG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb2xsZWN0aW9uPiA9IHt9O1xuICBPYmplY3Qua2V5cyhjb2xsZWN0aW9uTW9kdWxlcykuZm9yRWFjaCgobW9kdWxlSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHBhdGgucGFyc2UobW9kdWxlSWQpLmJhc2Uuc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCBtb2R1bGUgPSBjb2xsZWN0aW9uTW9kdWxlc1ttb2R1bGVJZF07XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG1vZHVsZS5kZWZhdWx0IGFzIENvbGxlY3Rpb247XG4gICAgY29sbGVjdGlvbnNbY29sbGVjdGlvbklkXSA9IGNvbGxlY3Rpb247XG4gIH0pO1xuICBjb25zdCByb290Q29uZmlnID0gb3B0aW9ucy5yb290Q29uZmlnIHx8IHt9O1xuICBjb25zdCBjbXNDb25maWcgPSBvcHRpb25zLmNtc0NvbmZpZyB8fCB7fTtcbiAgbGV0IGdjaSA9IGNtc0NvbmZpZy5nY2k7XG4gIGlmIChnY2kgPT09IHRydWUpIHtcbiAgICBnY2kgPSAnaHR0cHM6Ly9nY2kucm9vdGpzLmRldic7XG4gIH1cbiAgY29uc3QgY3R4ID0ge1xuICAgIHJvb3RDb25maWc6IHtcbiAgICAgIHByb2plY3RJZDogY21zQ29uZmlnLmlkIHx8ICdkZWZhdWx0JyxcbiAgICAgIHByb2plY3ROYW1lOiBjbXNDb25maWcubmFtZSB8fCBjbXNDb25maWcuaWQgfHwgJycsXG4gICAgICBkb21haW46IHJvb3RDb25maWcuZG9tYWluIHx8ICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgIGJhc2U6IHJvb3RDb25maWcuYmFzZSB8fCAnLycsXG4gICAgICBnY2k6IGdjaSxcbiAgICAgIGkxOG46IHJvb3RDb25maWcuaTE4bixcbiAgICB9LFxuICAgIGZpcmViYXNlQ29uZmlnOiBvcHRpb25zLmZpcmViYXNlQ29uZmlnLFxuICAgIGdhcGk6IGNtc0NvbmZpZy5nYXBpLFxuICAgIGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9ucyxcbiAgfTtcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBjbXNDb25maWcubmFtZSB8fCBjbXNDb25maWcuaWQgfHwgJyc7XG4gIGNvbnN0IHRpdGxlID0gcHJvamVjdE5hbWUgPyBgJHtwcm9qZWN0TmFtZX0gXHUyMDEzIFJvb3QuanMgQ01TYCA6ICdSb290LmpzIENNUyc7XG5cbiAgY29uc3QgbWFpbkh0bWwgPSByZW5kZXJUb1N0cmluZyg8QXBwIHRpdGxlPXt0aXRsZX0gY3R4PXtjdHh9IC8+KTtcbiAgbGV0IGh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XFxuJHttYWluSHRtbH1gO1xuICBpZiAocmVxLnZpdGVTZXJ2ZXIpIHtcbiAgICBjb25zdCB1aUNzc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvdWkuY3NzJyk7XG4gICAgY29uc3QgdWlKc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvdWkuanMnKTtcbiAgICBjb25zdCB0cGwgPSBodG1sXG4gICAgICAucmVwbGFjZSgne0NTU19VUkx9JywgYC9AZnMke3VpQ3NzUGF0aH1gKVxuICAgICAgLnJlcGxhY2UoJ3tKU19VUkx9JywgYC9AZnMke3VpSnNQYXRofWApO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy91aS5jc3MnKVxuICAgICAgLnJlcGxhY2UoJ3tKU19VUkx9JywgJy9jbXMvc3RhdGljL3VpLmpzJyk7XG4gIH1cbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICByZXMuc2VuZChodG1sKTtcbn1cblxuaW50ZXJmYWNlIFNpZ25JblByb3BzIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgY3R4OiBhbnk7XG59XG5cbmZ1bmN0aW9uIFNpZ25Jbihwcm9wczogU2lnbkluUHJvcHMpIHtcbiAgcmV0dXJuIChcbiAgICA8aHRtbD5cbiAgICAgIDxoZWFkPlxuICAgICAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIiAvPlxuICAgICAgICA8dGl0bGU+e3Byb3BzLnRpdGxlfTwvdGl0bGU+XG4gICAgICAgIDxsaW5rIHJlbD1cInByZWNvbm5lY3RcIiBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbVwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCIgLz5cbiAgICAgICAgPGxpbmtcbiAgICAgICAgICByZWw9XCJwcmVjb25uZWN0XCJcbiAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbVwiXG4gICAgICAgICAgY3Jvc3NPcmlnaW49XCJhbm9ueW1vdXNcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9R29vZ2xlK1NhbnM6NDAwLDUwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIntDU1NfVVJMfVwiIC8+XG4gICAgICA8L2hlYWQ+XG4gICAgICA8Ym9keT5cbiAgICAgICAgPGRpdiBpZD1cInJvb3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcFwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cImJvb3RzdHJhcF9fbG9hZGluZ1wiPkxvYWRpbmcuLi48L2gxPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib290c3RyYXAtZXJyb3JcIj5cbiAgICAgICAgICAgICAgSWYgdGhpcyBwYWdlIGZhaWxzIHRvIGxvYWQsIHRyeSBhIGZvcmNlIHJlZnJlc2ggYnkgaG9sZGluZyB0aGVcbiAgICAgICAgICAgICAgc2hpZnQga2V5IHdoaWxlIHJlZnJlc2hpbmcgdGhlIHBhZ2UuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgX19odG1sOiBgd2luZG93Ll9fUk9PVF9DVFggPSAke0pTT04uc3RyaW5naWZ5KHByb3BzLmN0eCl9YCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgICA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIiBzcmM9XCJ7SlNfVVJMfVwiPjwvc2NyaXB0PlxuICAgICAgPC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJTaWduSW4ocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBvcHRpb25zOiBhbnkpIHtcbiAgY29uc3QgY3R4ID0ge25hbWU6IG9wdGlvbnMubmFtZSwgZmlyZWJhc2VDb25maWc6IG9wdGlvbnMuZmlyZWJhc2VDb25maWd9O1xuICBjb25zdCBtYWluSHRtbCA9IHJlbmRlclRvU3RyaW5nKDxTaWduSW4gdGl0bGU9XCJTaWduIGluXCIgY3R4PXtjdHh9IC8+KTtcbiAgbGV0IGh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XFxuJHttYWluSHRtbH1gO1xuICBpZiAocmVxLnZpdGVTZXJ2ZXIpIHtcbiAgICBjb25zdCBjc3NQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3VpL3NpZ25pbi5jc3MnKTtcbiAgICBjb25zdCBqc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvc2lnbmluLmpzJyk7XG4gICAgY29uc3QgdHBsID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsIGAvQGZzJHtjc3NQYXRofWApXG4gICAgICAucmVwbGFjZSgne0pTX1VSTH0nLCBgL0BmcyR7anNQYXRofWApO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uY3NzJylcbiAgICAgIC5yZXBsYWNlKCd7SlNfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uanMnKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gIHJlcy5zZW5kKGh0bWwpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLE9BQU8sVUFBVTtBQUNqQixTQUFRLHFCQUFvQjtBQUc1QixTQUFRLFVBQVUsc0JBQXFCO0FBY2pDLFNBQ0UsS0FERjtBQVZOLElBQU0sWUFBWSxLQUFLLFFBQVEsY0FBYyxZQUFZLEdBQUcsQ0FBQztBQU83RCxTQUFTLElBQUksT0FBaUI7QUFDNUIsU0FDRSxxQkFBQyxVQUNDO0FBQUEseUJBQUMsVUFDQztBQUFBLDBCQUFDLFdBQU8sZ0JBQU0sT0FBTTtBQUFBLE1BQ3BCLG9CQUFDLFVBQUssS0FBSSxjQUFhLE1BQUssZ0NBQStCO0FBQUEsTUFDM0Q7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLEtBQUk7QUFBQSxVQUNKLE1BQUs7QUFBQSxVQUNMLGFBQVk7QUFBQTtBQUFBLE1BQ2Q7QUFBQSxNQUNBO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxLQUFJO0FBQUEsVUFDSixNQUFLO0FBQUE7QUFBQSxNQUNQO0FBQUEsTUFDQTtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MsS0FBSTtBQUFBLFVBQ0osTUFBSztBQUFBO0FBQUEsTUFDUDtBQUFBLE1BQ0Esb0JBQUMsVUFBSyxLQUFJLGNBQWEsTUFBSyxhQUFZO0FBQUEsT0FDMUM7QUFBQSxJQUNBLHFCQUFDLFVBQ0M7QUFBQSwwQkFBQyxTQUFJLElBQUcsUUFDTiwrQkFBQyxTQUFJLFdBQVUsYUFDYjtBQUFBLDRCQUFDLFFBQUcsV0FBVSxzQkFBcUIsd0JBQVU7QUFBQSxRQUM3QyxvQkFBQyxTQUFJLFdBQVUsbUJBQWtCLGlIQUdqQztBQUFBLFNBQ0YsR0FDRjtBQUFBLE1BQ0E7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLHlCQUF5QjtBQUFBLFlBQ3ZCLFFBQVEsdUJBQXVCLEtBQUssVUFBVSxNQUFNLEdBQUcsQ0FBQztBQUFBLFVBQzFEO0FBQUE7QUFBQSxNQUNGO0FBQUEsTUFDQSxvQkFBQyxZQUFPLE1BQUssVUFBUyxLQUFJLFlBQVc7QUFBQSxPQUN2QztBQUFBLEtBQ0Y7QUFFSjtBQUVBLGVBQXNCLFVBQVUsS0FBYyxLQUFlLFNBQWM7QUFDekUsUUFBTSxvQkFBb0IsWUFBWSxLQUFLLDRCQUE0QjtBQUFBLElBQ3JFLE9BQU87QUFBQSxFQUNULENBQUM7QUFDRCxRQUFNLGNBQTBDLENBQUM7QUFDakQsU0FBTyxLQUFLLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxhQUFxQjtBQUMzRCxVQUFNLGVBQWUsS0FBSyxNQUFNLFFBQVEsRUFBRSxLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDM0QsVUFBTSxTQUFTLGtCQUFrQixRQUFRO0FBQ3pDLFVBQU0sYUFBYSxPQUFPO0FBQzFCLGdCQUFZLFlBQVksSUFBSTtBQUFBLEVBQzlCLENBQUM7QUFDRCxRQUFNLGFBQWEsUUFBUSxjQUFjLENBQUM7QUFDMUMsUUFBTSxZQUFZLFFBQVEsYUFBYSxDQUFDO0FBQ3hDLE1BQUksTUFBTSxVQUFVO0FBQ3BCLE1BQUksUUFBUSxNQUFNO0FBQ2hCLFVBQU07QUFBQSxFQUNSO0FBQ0EsUUFBTSxNQUFNO0FBQUEsSUFDVixZQUFZO0FBQUEsTUFDVixXQUFXLFVBQVUsTUFBTTtBQUFBLE1BQzNCLGFBQWEsVUFBVSxRQUFRLFVBQVUsTUFBTTtBQUFBLE1BQy9DLFFBQVEsV0FBVyxVQUFVO0FBQUEsTUFDN0IsTUFBTSxXQUFXLFFBQVE7QUFBQSxNQUN6QjtBQUFBLE1BQ0EsTUFBTSxXQUFXO0FBQUEsSUFDbkI7QUFBQSxJQUNBLGdCQUFnQixRQUFRO0FBQUEsSUFDeEIsTUFBTSxVQUFVO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBQ0EsUUFBTSxjQUFjLFVBQVUsUUFBUSxVQUFVLE1BQU07QUFDdEQsUUFBTSxRQUFRLGNBQWMsR0FBRyxXQUFXLHdCQUFtQjtBQUU3RCxRQUFNLFdBQVcsZUFBZSxvQkFBQyxPQUFJLE9BQWMsS0FBVSxDQUFFO0FBQy9ELE1BQUksT0FBTztBQUFBLEVBQW9CLFFBQVE7QUFDdkMsTUFBSSxJQUFJLFlBQVk7QUFDbEIsVUFBTSxZQUFZLEtBQUssS0FBSyxXQUFXLFdBQVc7QUFDbEQsVUFBTSxXQUFXLEtBQUssS0FBSyxXQUFXLFVBQVU7QUFDaEQsVUFBTSxNQUFNLEtBQ1QsUUFBUSxhQUFhLE9BQU8sU0FBUyxFQUFFLEVBQ3ZDLFFBQVEsWUFBWSxPQUFPLFFBQVEsRUFBRTtBQUN4QyxXQUFPLE1BQU0sSUFBSSxXQUFZLG1CQUFtQixJQUFJLGFBQWEsR0FBRztBQUFBLEVBQ3RFLE9BQU87QUFDTCxXQUFPLEtBQ0osUUFBUSxhQUFhLG9CQUFvQixFQUN6QyxRQUFRLFlBQVksbUJBQW1CO0FBQUEsRUFDNUM7QUFDQSxNQUFJLFVBQVUsZ0JBQWdCLFdBQVc7QUFDekMsTUFBSSxLQUFLLElBQUk7QUFDZjtBQU9BLFNBQVMsT0FBTyxPQUFvQjtBQUNsQyxTQUNFLHFCQUFDLFVBQ0M7QUFBQSx5QkFBQyxVQUNDO0FBQUEsMEJBQUMsVUFBSyxTQUFRLFNBQVE7QUFBQSxNQUN0QixvQkFBQyxXQUFPLGdCQUFNLE9BQU07QUFBQSxNQUNwQixvQkFBQyxVQUFLLEtBQUksY0FBYSxNQUFLLGdDQUErQjtBQUFBLE1BQzNELG9CQUFDLFVBQUssTUFBSyxZQUFXLFNBQVEseUNBQXdDO0FBQUEsTUFDdEU7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLEtBQUk7QUFBQSxVQUNKLE1BQUs7QUFBQSxVQUNMLGFBQVk7QUFBQTtBQUFBLE1BQ2Q7QUFBQSxNQUNBO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxLQUFJO0FBQUEsVUFDSixNQUFLO0FBQUE7QUFBQSxNQUNQO0FBQUEsTUFDQSxvQkFBQyxVQUFLLEtBQUksY0FBYSxNQUFLLGFBQVk7QUFBQSxPQUMxQztBQUFBLElBQ0EscUJBQUMsVUFDQztBQUFBLDBCQUFDLFNBQUksSUFBRyxRQUNOLCtCQUFDLFNBQUksV0FBVSxhQUNiO0FBQUEsNEJBQUMsUUFBRyxXQUFVLHNCQUFxQix3QkFBVTtBQUFBLFFBQzdDLG9CQUFDLFNBQUksV0FBVSxtQkFBa0IsaUhBR2pDO0FBQUEsU0FDRixHQUNGO0FBQUEsTUFDQTtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MseUJBQXlCO0FBQUEsWUFDdkIsUUFBUSx1QkFBdUIsS0FBSyxVQUFVLE1BQU0sR0FBRyxDQUFDO0FBQUEsVUFDMUQ7QUFBQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLG9CQUFDLFlBQU8sTUFBSyxVQUFTLEtBQUksWUFBVztBQUFBLE9BQ3ZDO0FBQUEsS0FDRjtBQUVKO0FBQ0EsZUFBc0IsYUFBYSxLQUFjLEtBQWUsU0FBYztBQUM1RSxRQUFNLE1BQU0sRUFBQyxNQUFNLFFBQVEsTUFBTSxnQkFBZ0IsUUFBUSxlQUFjO0FBQ3ZFLFFBQU0sV0FBVyxlQUFlLG9CQUFDLFVBQU8sT0FBTSxXQUFVLEtBQVUsQ0FBRTtBQUNwRSxNQUFJLE9BQU87QUFBQSxFQUFvQixRQUFRO0FBQ3ZDLE1BQUksSUFBSSxZQUFZO0FBQ2xCLFVBQU0sVUFBVSxLQUFLLEtBQUssV0FBVyxlQUFlO0FBQ3BELFVBQU0sU0FBUyxLQUFLLEtBQUssV0FBVyxjQUFjO0FBQ2xELFVBQU0sTUFBTSxLQUNULFFBQVEsYUFBYSxPQUFPLE9BQU8sRUFBRSxFQUNyQyxRQUFRLFlBQVksT0FBTyxNQUFNLEVBQUU7QUFDdEMsV0FBTyxNQUFNLElBQUksV0FBWSxtQkFBbUIsSUFBSSxhQUFhLEdBQUc7QUFBQSxFQUN0RSxPQUFPO0FBQ0wsV0FBTyxLQUNKLFFBQVEsYUFBYSx3QkFBd0IsRUFDN0MsUUFBUSxZQUFZLHVCQUF1QjtBQUFBLEVBQ2hEO0FBQ0EsTUFBSSxVQUFVLGdCQUFnQixXQUFXO0FBQ3pDLE1BQUksS0FBSyxJQUFJO0FBQ2Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/dist/plugin.d.ts
CHANGED
|
@@ -27,6 +27,16 @@ type CMSPluginOptions = {
|
|
|
27
27
|
messagingSenderId: string;
|
|
28
28
|
appId: string;
|
|
29
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* GAPI credentials. Include if using Google Drive and Google Sheets features.
|
|
32
|
+
* See: https://developers.google.com/sheets/api/quickstart/js
|
|
33
|
+
*/
|
|
34
|
+
gapi?: {
|
|
35
|
+
/** https://developers.google.com/sheets/api/quickstart/js#create_an_api_key */
|
|
36
|
+
apiKey: string;
|
|
37
|
+
/** https://developers.google.com/sheets/api/quickstart/js#authorize_credentials_for_a_web_application */
|
|
38
|
+
clientId: string;
|
|
39
|
+
};
|
|
30
40
|
/**
|
|
31
41
|
* Secret value(s) used for signing the user authentication cookie.
|
|
32
42
|
* @deprecated This is now handled directly by root's sessionMiddleware under
|
package/dist/plugin.js
CHANGED
|
@@ -564,4 +564,4 @@ function fileExists(filepath) {
|
|
|
564
564
|
export {
|
|
565
565
|
cmsPlugin
|
|
566
566
|
};
|
|
567
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9wbHVnaW4udHMiLCAiLi4vY29yZS9hcGkudHMiLCAiLi4vY29yZS9ydW50aW1lLnRzIiwgIi4uL2NvcmUvY2xpZW50LnRzIiwgIi4uL2NvcmUvdmVyc2lvbnMudHMiLCAiLi4vY29yZS9jcm9uLnRzIiwgIi4uL2NvcmUvY3N2LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge3Byb21pc2VzIGFzIGZzfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHtcbiAgQ29uZmlndXJlU2VydmVyT3B0aW9ucyxcbiAgTmV4dEZ1bmN0aW9uLFxuICBQbHVnaW4sXG4gIFJlcXVlc3QsXG4gIFJlc3BvbnNlLFxuICBTZXJ2ZXIsXG59IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQgYm9keVBhcnNlciBmcm9tICdib2R5LXBhcnNlcic7XG5pbXBvcnQge1xuICBBcHAsXG4gIGFwcGxpY2F0aW9uRGVmYXVsdCxcbiAgZ2V0QXBwLFxuICBpbml0aWFsaXplQXBwLFxufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtnZXRBdXRoLCBEZWNvZGVkSWRUb2tlbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXV0aCc7XG5pbXBvcnQgc2lydiBmcm9tICdzaXJ2JztcbmltcG9ydCB7YXBpfSBmcm9tICcuL2FwaS5qcyc7XG5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG50eXBlIEFwcE1vZHVsZSA9IHR5cGVvZiBpbXBvcnQoJy4vYXBwLmpzJyk7XG5cbi8vIFRoZSBzZXNzaW9uIGtleSBuYW1lIHVzZWQgZm9yIFJvb3QgQ01TIGF1dGhlbnRpY2F0aW9uLlxuY29uc3QgU0VTU0lPTl9DT09LSUVfQVVUSCA9ICdyb290LWNtcy1hdXRoJztcblxuZXhwb3J0IHR5cGUgQ01TVXNlciA9IERlY29kZWRJZFRva2VuO1xuXG5leHBvcnQgdHlwZSBDTVNQbHVnaW5PcHRpb25zID0ge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBwcm9qZWN0LiBEYXRhIHdpbGwgYmUgc3RvcmVkIHVuZGVyIHRoZSBuYW1lc3BhY2VcbiAgICogYFByb2plY3RzLyR7aWR9YCBpbiBmaXJlc3RvcmUuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIFVzZWQgaW4gdGhlIGhlYWRlciBvZiB0aGUgQ01TIHRvIGhlbHAgaWRlbnRpZnlcbiAgICogdGhlIHByb2plY3QuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaXJlYmFzZSBjb25maWcgb2JqZWN0LCB3aGljaCBjYW4gYmUgb2J0YWluZWQgaW4gdGhlIEZpcmViYXNlIENvbnNvbGUgYnlcbiAgICogZ29pbmcgdG8gXCJQcm9qZWN0IFNldHRpbmdzXCIuXG4gICAqL1xuICBmaXJlYmFzZUNvbmZpZzoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICBhcGlLZXk6IHN0cmluZztcbiAgICBhdXRoRG9tYWluOiBzdHJpbmc7XG4gICAgcHJvamVjdElkOiBzdHJpbmc7XG4gICAgc3RvcmFnZUJ1Y2tldDogc3RyaW5nO1xuICAgIG1lc3NhZ2luZ1NlbmRlcklkOiBzdHJpbmc7XG4gICAgYXBwSWQ6IHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogU2VjcmV0IHZhbHVlKHMpIHVzZWQgZm9yIHNpZ25pbmcgdGhlIHVzZXIgYXV0aGVudGljYXRpb24gY29va2llLlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG5vdyBoYW5kbGVkIGRpcmVjdGx5IGJ5IHJvb3QncyBzZXNzaW9uTWlkZGxld2FyZSB1bmRlclxuICAgKiBgc2VydmVyLnNlc3Npb25Db29raWVTZWNyZXRgIGluIHJvb3QuY29uZmlnLnRzLlxuICAgKi9cbiAgY29va2llU2VjcmV0Pzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqIEZ1bmN0aW9uIGNhbGxlZCB0byBjaGVjayBpZiBhIHVzZXIgc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBDTVMuICovXG4gIGlzVXNlckF1dGhvcml6ZWQ/OiAoXG4gICAgcmVxOiBSZXF1ZXN0LFxuICAgIHVzZXI6IENNU1VzZXJcbiAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVVJMIHRvIEdDSSBzZXJ2aWNlIGZvciB0cmFuc2Zvcm1pbmcgdXBsb2FkZWQgR0NTIGltYWdlcyB0byBhIEdvb2dsZSBBcHBcbiAgICogRW5naW5lIEltYWdlcyBBUEkgc2VydmluZyBVUkwuXG4gICAqXG4gICAqIFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgdXNlcyB0aGUgZGVmYXVsdCBob3N0ZWQgc2VydmljZSBhdFxuICAgKiBodHRwczovL2djaS5yb290anMuZGV2LlxuICAgKlxuICAgKiBUbyBzZXQgdXAgR0NJOlxuICAgKlxuICAgKiAtIENyZWF0ZSBhIEdDUyBidWNrZXQgd2l0aCBmaW5lLWdyYWluZWQgcGVybWlzc2lvbnNcbiAgICogLSBTaGFyZSBvd25lciBhY2Nlc3MgdG8gdGhlIGJ1Y2tldCB3aXRoIHRoZSBzZXJ2aWNlIGFjY291bnQgcmV0dXJuZWQgaW5cbiAgICogICBodHRwczovL2djaS5yb290anMuZGV2L18vc2VydmljZV9hY2NvdW50XG4gICAqXG4gICAqIFRvIGRpc2FibGUgR0NJLCBsZWF2ZSB0aGlzIHZhbHVlIGVtcHR5IG9yIHNldCB0byBgZmFsc2VgLCB3aGljaCB3aGljaCB3aWxsXG4gICAqIHNlcnZlIGltYWdlcyBkaXJlY3RseSBmcm9tIEdDUyBpbnN0ZWFkLlxuICAgKi9cbiAgZ2NpPzogc3RyaW5nIHwgYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIENNU1BsdWdpbiA9IFBsdWdpbiAmIHtcbiAgbmFtZTogJ3Jvb3QtY21zJztcbiAgZ2V0Q29uZmlnOiAoKSA9PiBDTVNQbHVnaW5PcHRpb25zO1xuICBnZXRGaXJlYmFzZUFwcDogKCkgPT4gQXBwO1xufTtcblxuZnVuY3Rpb24gaXNFeHBpcmVkKGRlY29kZWRJZFRva2VuOiBEZWNvZGVkSWRUb2tlbikge1xuICBjb25zdCB0cyA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgcmV0dXJuIHRzID49IGRlY29kZWRJZFRva2VuLmV4cDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlyZWJhc2VBcHAoZ2NwUHJvamVjdElkOiBzdHJpbmcpOiBBcHAge1xuICBjb25zdCBhcHBOYW1lID0gJ3Jvb3QtY21zJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0QXBwKGFwcE5hbWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnYXBwL25vLWFwcCcpIHtcbiAgICAgIHJldHVybiBpbml0aWFsaXplQXBwKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvamVjdElkOiBnY3BQcm9qZWN0SWQsXG4gICAgICAgICAgY3JlZGVudGlhbDogYXBwbGljYXRpb25EZWZhdWx0KCksXG4gICAgICAgIH0sXG4gICAgICAgIGFwcE5hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY21zUGx1Z2luKG9wdGlvbnM6IENNU1BsdWdpbk9wdGlvbnMpOiBDTVNQbHVnaW4ge1xuICBjb25zdCBmaXJlYmFzZUNvbmZpZyA9IG9wdGlvbnMuZmlyZWJhc2VDb25maWc7XG4gIGNvbnN0IGFwcCA9IGdldEZpcmViYXNlQXBwKGZpcmViYXNlQ29uZmlnLnByb2plY3RJZCk7XG4gIGNvbnN0IGF1dGggPSBnZXRBdXRoKGFwcCk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBsb2dpbiBpcyByZXF1aXJlZCBmb3IgdGhlIHJlcXVlc3QuIEN1cnJlbnRseSByZXR1cm5zIGB0cnVlYCBpZlxuICAgKiB0aGUgVVJMIHBhdGggc3RhcnRzIHdpdGggL2NtcyBvciBpZiA/cHJldmlldz10cnVlIGlzIGluIHRoZSBVUkwuXG4gICAqL1xuICBmdW5jdGlvbiBsb2dpblJlcXVpcmVkKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICAgIGlmIChyZXEub3JpZ2luYWxVcmwuc3RhcnRzV2l0aCgnL2NtcycpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZXEucXVlcnkucHJldmlldykgPT09ICd0cnVlJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIG5ldyBsb2dpbiByZXF1ZXN0IGZvciBhIHVzZXIuIFRoZSByZXF1ZXN0IGJvZHkgc2hvdWxkIGNvbnRhaW5cbiAgICogYW4gaWRUb2tlbiwgd2hpY2ggaXMgdmVyaWZpZWQgb24gcHJvZCB1c2luZyBGaXJlYmFzZSBBZG1pbiBhbmQgSWRlbnRpdHlcbiAgICogVG9vbGtpdC4gSWYgYSBgaXNVc2VyQXV0aG9yaXplZCgpYCBjb25maWcgaXMgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxzb1xuICAgKiB2ZXJpZnkgdmlhIHRoYXQgZnVuY3Rpb24uIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9naW4gdmVyaWZpY2F0aW9uIHN1Y2NlZWRzLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VXNlckxvZ2luKHJlcTogUmVxdWVzdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGlkVG9rZW4gPSByZXEuYm9keT8uaWRUb2tlbjtcbiAgICBpZiAoIWlkVG9rZW4pIHtcbiAgICAgIGNvbnNvbGUubG9nKCdsb2dpbiBmYWlsZWQ6IG5vIGlkIHRva2VuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT24gbG9jYWwgZGV2LCBzaW1wbHkgdmVyaWZ5IHRoYXQgYW4gaWRUb2tlbiBpcyBzZXQuIFRoZSBpZGVudGl0eSB0b29sa2l0XG4gICAgLy8gdGhhdCB2ZXJpZmllcyBpZCB0b2tlbnMgcmVxdWlyZXMgYSBzZXJ2aWNlIGFjY291bnQsIHdoaWNoIHdlIHdhbnQgdG9cbiAgICAvLyBhdm9pZCBoYXZpbmcgdG8gc2V0IHVwIHdoZW4gdXNlcnMgYXJlIGRvaW5nIGxvY2FsIGRldmVsb3BtZW50LlxuICAgIC8vIEF1dGhlbnRpY2F0aW9uIGlzIHN0aWxsIHJlcXVpcmVkIGJ5IHRoZSBmcm9udGVuZCB1c2luZyBGaXJlYmFzZSBBdXRoLFxuICAgIC8vIHRoaXMganVzdCBieXBhc3NlcyB0aGUgaW5pdGlhbCBzZXJ2ZXIgY2hlY2sgYmVmb3JlIHRoZSB1aSBpcyByZW5kZXJlZC5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGlkVG9rZW4pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqd3QgPSBhd2FpdCBhdXRoLnZlcmlmeUlkVG9rZW4oaWRUb2tlbiwgdHJ1ZSk7XG4gICAgICBpZiAoaXNFeHBpcmVkKGp3dCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGZhaWxlZDogaWQgdG9rZW4gaXMgZXhwaXJlZCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWp3dC5lbWFpbCB8fCAhand0LmVtYWlsX3ZlcmlmaWVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdsb2dpbiBmYWlsZWQ6IGVtYWlsIHVudmVyaWZpZWQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZCkge1xuICAgICAgICBjb25zdCBhdXRob3JpemVkID0gYXdhaXQgb3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKHJlcSwgand0KTtcbiAgICAgICAgaWYgKCFhdXRob3JpemVkKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGZhaWxlZDogdXNlciBpcyBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhdXRob3JpemVkO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHZlcmlmeSBqd3QgdG9rZW4nKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGRlY2lkZSB3aGV0aGVyIHdlIHdhbnQgdG8gZW5mb3JjZSBgaXNVc2VyQXV0aG9yaXplZCgpYC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgc2Vzc2lvbiBzaG91bGQgYmUgYWxsb3dlZCB0byBhY2Nlc3MgdGhlXG4gICAqIENNUy4gUmV0dXJucyB0cnVlIGlmIGFjY2VzcyBpcyBncmFudGVkLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VXNlclNlc3Npb24ocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2Vzc2lvbkNvb2tpZSA9IHJlcS5zZXNzaW9uLmdldEl0ZW0oU0VTU0lPTl9DT09LSUVfQVVUSCk7XG4gICAgaWYgKCFzZXNzaW9uQ29va2llKSB7XG4gICAgICBjb25zb2xlLmxvZygnc2Vzc2lvbiBmYWlsZWQ6IG5vIHNlc3Npb24gY29va2llJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT24gbG9jYWwgZGV2LCBzaW1wbHkgdmVyaWZ5IHRoYXQgYW4gc2Vzc2lvbiBjb29raWUgaXMgc2V0LiBTZWUgbm90ZVxuICAgIC8vIGFib3ZlIGluIGB2ZXJpZnlVc2VyTG9naW4oKWAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihzZXNzaW9uQ29va2llKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgand0ID0gYXdhaXQgYXV0aC52ZXJpZnlTZXNzaW9uQ29va2llKHNlc3Npb25Db29raWUsIHRydWUpO1xuICAgICAgaWYgKGlzRXhwaXJlZChqd3QpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXNzaW9uIGZhaWxlZDogdG9rZW4gaXMgZXhwaXJlZCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWp3dC5lbWFpbCB8fCAhand0LmVtYWlsX3ZlcmlmaWVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXNzaW9uIGZhaWxlZDogZW1haWwgbm90IHZlcmlmaWVkJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQpIHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplZCA9IGF3YWl0IG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZChyZXEsIGp3dCk7XG4gICAgICAgIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXNzaW9uIGZhaWxlZDogbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXV0aG9yaXplZDtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8oc3RldmVubGUpOiBkZWNpZGUgd2hldGhlciB3ZSB3YW50IHRvIGVuZm9yY2UgYGlzVXNlckF1dGhvcml6ZWQoKWAuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byB2ZXJpZnkgand0IHRva2VuJyk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAncm9vdC1jbXMnLFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29uZmlnIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBwbHVnaW4uXG4gICAgICovXG4gICAgZ2V0Q29uZmlnOiAoKSA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgRmlyZWJhc2UgQXBwIGluc3RhbmNlIHVzZWQgYnkgdGhlIHBsdWdpbi5cbiAgICAgKi9cbiAgICBnZXRGaXJlYmFzZUFwcDogKCkgPT4ge1xuICAgICAgcmV0dXJuIGFwcDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBtYXAgb2Ygc3NyIGZpbGVzIHRvIGluY2x1ZGUgd2hlbiBydW5uaW5nIGByb290IGJ1aWxkYC5cbiAgICAgKi9cbiAgICBzc3JJbnB1dDogKCkgPT4gKHtcbiAgICAgIGNtczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vYXBwLmpzJyksXG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBDTVMtc3BlY2lmaWMgbWlkZGxld2FyZSB0byB0aGUgUm9vdC5qcyBzZXJ2ZXIuXG4gICAgICovXG4gICAgY29uZmlndXJlU2VydmVyOiBhc3luYyAoXG4gICAgICBzZXJ2ZXI6IFNlcnZlcixcbiAgICAgIHNlcnZlck9wdGlvbnM6IENvbmZpZ3VyZVNlcnZlck9wdGlvbnNcbiAgICApID0+IHtcbiAgICAgIHNlcnZlci51c2UoYm9keVBhcnNlci5qc29uKCkpO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBnZXRSZW5kZXJlcihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPEFwcE1vZHVsZT4ge1xuICAgICAgICBpZiAoc2VydmVyT3B0aW9ucy50eXBlID09PSAnZGV2Jykge1xuICAgICAgICAgIGNvbnN0IGFwcEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vYXBwLmpzJyk7XG4gICAgICAgICAgY29uc3QgYXBwID0gKGF3YWl0IHJlcS52aXRlU2VydmVyIS5zc3JMb2FkTW9kdWxlKFxuICAgICAgICAgICAgYXBwRmlsZVBhdGhcbiAgICAgICAgICApKSBhcyBBcHBNb2R1bGU7XG4gICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFwcEltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcmVxLnJvb3RDb25maWchLnJvb3REaXIsXG4gICAgICAgICAgJ2Rpc3Qvc2VydmVyL2Ntcy5qcydcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEoYXdhaXQgZmlsZUV4aXN0cyhhcHBJbXBvcnRQYXRoKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZGlzdC9zZXJ2ZXIvY21zLmpzIG5vdCBmb3VuZC4gcnVuIGByb290IGJ1aWxkYCB0byBjcmVhdGUgaXQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBwID0gKGF3YWl0IGltcG9ydChhcHBJbXBvcnRQYXRoKSkgYXMgQXBwTW9kdWxlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0aWNEaXIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAndWknKTtcbiAgICAgIHNlcnZlci51c2UoJy9jbXMvc3RhdGljJywgc2lydihzdGF0aWNEaXIsIHtkZXY6IGZhbHNlfSkpO1xuXG4gICAgICAvLyBMb2dpbiBoYW5kbGVyLlxuICAgICAgc2VydmVyLnVzZSgnL2Ntcy9sb2dpbicsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgPT09ICdQVVQnICYmXG4gICAgICAgICAgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXV0aG9yaXplZCA9IGF3YWl0IHZlcmlmeVVzZXJMb2dpbihyZXEpO1xuICAgICAgICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ05PVF9BVVRIT1JJWkVEJ30pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCBzZXNzaW9uIGV4cGlyYXRpb24gdG8gNSBkYXlzLlxuICAgICAgICAgICAgY29uc3QgZXhwaXJlc0luID0gNjAgKiA2MCAqIDI0ICogNSAqIDEwMDA7XG4gICAgICAgICAgICBjb25zdCBpZFRva2VuID0gcmVxLmJvZHkuaWRUb2tlbiE7XG5cbiAgICAgICAgICAgIGxldCBzZXNzaW9uQ29va2llOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbkNvb2tpZSA9IGlkVG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gYXdhaXQgYXV0aC5jcmVhdGVTZXNzaW9uQ29va2llKGlkVG9rZW4sIHtcbiAgICAgICAgICAgICAgICBleHBpcmVzSW4sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNlc3Npb24uc2V0SXRlbShTRVNTSU9OX0NPT0tJRV9BVVRILCBzZXNzaW9uQ29va2llKTtcbiAgICAgICAgICAgIHJlcy5zYXZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgcmVzLmpzb24oe3N1Y2Nlc3M6IHRydWV9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgIC5zdGF0dXMoNTAwKVxuICAgICAgICAgICAgICAuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTl9TRVJWRVJfRVJST1InfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgZ2V0UmVuZGVyZXIocmVxKTtcbiAgICAgICAgICBhcHAucmVuZGVyU2lnbkluKHJlcSwgcmVzLCBvcHRpb25zKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoJ1VOS05PV04gU0VSVkVSIEVSUk9SJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2dvdXQgaGFuZGxlci5cbiAgICAgIHNlcnZlci51c2UoJy9jbXMvbG9nb3V0JywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICByZXMuc2Vzc2lvbi5yZW1vdmVJdGVtKFNFU1NJT05fQ09PS0lFX0FVVEgpO1xuICAgICAgICByZXMuc2F2ZVNlc3Npb24oKTtcbiAgICAgICAgcmVzLnJlZGlyZWN0KCcvY21zL2xvZ2luJyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2FmZWd1YXJkIHRvIHZlcmlmeSB1c2VyIGxvZ2luIGJlZm9yZSByZW5kZXJpbmcgYW55IENNUyBwYWdlLlxuICAgICAgc2VydmVyLnVzZShhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKCFsb2dpblJlcXVpcmVkKHJlcSkpIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzZXJJc0xvZ2dlZEluID0gYXdhaXQgdmVyaWZ5VXNlclNlc3Npb24ocmVxKTtcbiAgICAgICAgaWYgKHVzZXJJc0xvZ2dlZEluKSB7XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbGxvdyB0aGUgY3JvbiB0byBydW4gdW5hdXRoZW50aWNhdGVkLiBUaGUgY3JvbiBqb2IgaXMgcmVzcG9uc2libGVcbiAgICAgICAgLy8gZm9yIHNhdmluZyB2ZXJzaW9uIGhpc3RvcnkuXG4gICAgICAgIGlmIChyZXEub3JpZ2luYWxVcmwgPT09ICcvY21zL2FwaS9jcm9uLnJ1bicpIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXEub3JpZ2luYWxVcmwuc3RhcnRzV2l0aCgnL2Ntcy9hcGknKSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAxKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdOT1RfQVVUSE9SSVpFRCd9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ3JlZGlyZWN0aW5nIHRvIGxvZ2luIHBhZ2UnKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgY29udGludWU6IHJlcS5vcmlnaW5hbFVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5yZWRpcmVjdChgL2Ntcy9sb2dpbj8ke3BhcmFtcy50b1N0cmluZygpfWApO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIEFQSSBoYW5kbGVycy5cbiAgICAgIGFwaShzZXJ2ZXIpO1xuXG4gICAgICAvLyBSZW5kZXIgdGhlIENNUyBTUEEuXG4gICAgICBzZXJ2ZXIudXNlKCcvY21zJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IGdldFJlbmRlcmVyKHJlcSk7XG4gICAgICAgICAgYXdhaXQgYXBwLnJlbmRlckFwcChyZXEsIHJlcywge1xuICAgICAgICAgICAgcm9vdENvbmZpZzogcmVxLnJvb3RDb25maWcsXG4gICAgICAgICAgICBjbXNDb25maWc6IG9wdGlvbnMsXG4gICAgICAgICAgICBmaXJlYmFzZUNvbmZpZzogb3B0aW9ucy5maXJlYmFzZUNvbmZpZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gVE9ETyhzdGV2ZW5sZSk6IHJlbmRlciBhIGN1c3RvbSBlcnJvciBwYWdlLlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnVU5LTk9XTiBTRVJWRVIgRVJST1InKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhmaWxlcGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBmc1xuICAgIC5hY2Nlc3MoZmlsZXBhdGgpXG4gICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAuY2F0Y2goKCkgPT4gZmFsc2UpO1xufVxuIiwgImltcG9ydCB7U2VydmVyLCBSZXF1ZXN0LCBSZXNwb25zZX0gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7bXVsdGlwYXJ0TWlkZGxld2FyZX0gZnJvbSAnQGJsaW5ray9yb290L21pZGRsZXdhcmUnO1xuaW1wb3J0IHtydW5Dcm9uSm9ic30gZnJvbSAnLi9jcm9uLmpzJztcbmltcG9ydCB7YXJyYXlUb0NzdiwgY3N2VG9BcnJheX0gZnJvbSAnLi9jc3YuanMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBBUEkgbWlkZGxld2FyZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaShzZXJ2ZXI6IFNlcnZlcikge1xuICAvKipcbiAgICogUnVucyBDTVMgY3JvbiBqb2JzLlxuICAgKi9cbiAgc2VydmVyLnVzZSgnL2Ntcy9hcGkvY3Jvbi5ydW4nLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bkNyb25Kb2JzKHJlcS5yb290Q29uZmlnISk7XG4gICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZX0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlfSk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogQWNjZXB0cyBhIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcge2hlYWRlcnM6IFsuLi5dLCByb3dzOiBbLi4uXX0gYW5kIHNlbmRzXG4gICAqIGFuIEhUVFAgcmVzcG9uc2Ugd2l0aCBhIGNvcnJlc3BvbmRpbmcgQ1NWIGZpbGUgYXMgYW4gYXR0YWNobWVudC5cbiAgICpcbiAgICogU2FtcGxlIHJlcXVlc3Q6XG4gICAqXG4gICAqIGBgYGpzb25cbiAgICoge1xuICAgKiAgIFwiaGVhZGVyc1wiOiBbXCJmb29cIl0sXG4gICAqICAgXCJyb3dzXCI6IFtcbiAgICogICAgIHtcImZvb1wiOiBcImJhclwifSxcbiAgICogICAgIHtcImZvb1wiOiBcImJhelwifSxcbiAgICogICBdXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzZXJ2ZXIudXNlKCcvY21zL2FwaS9jc3YuZG93bmxvYWQnLCAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKFxuICAgICAgcmVxLm1ldGhvZCAhPT0gJ1BPU1QnIHx8XG4gICAgICAhU3RyaW5nKHJlcS5nZXQoJ2NvbnRlbnQtdHlwZScpKS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJylcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdCQURfUkVRVUVTVCd9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYm9keSA9IHJlcS5ib2R5IHx8IHt9O1xuICAgICAgY29uc3QgaGVhZGVycyA9IGJvZHkuaGVhZGVycyB8fCBbXTtcbiAgICAgIGNvbnN0IHJvd3MgPSBib2R5LnJvd3MgfHwgW107XG4gICAgICBjb25zdCBjc3YgPSBhcnJheVRvQ3N2KHtoZWFkZXJzLCByb3dzfSk7XG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9jc3YnKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudDsgZmlsZW5hbWU9XCJkYXRhLmNzdlwiJyk7XG4gICAgICByZXMuc3RhdHVzKDIwMCkuZW5kKGNzdik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VOS05PV04nfSk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogSW1wb3J0cyBhIENTViBmaWxlIGFuZCByZXR1cm5zIGEgSlNPTiBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGVcbiAgICogQ1NWLlxuICAgKlxuICAgKiBTYW1wbGUgcmVzcG9uc2U6XG4gICAqXG4gICAqIGBgYGpzb25cbiAgICoge1xuICAgKiAgIFwic3VjY2Vzc1wiOiB0cnVlLFxuICAgKiAgIFwiZGF0YVwiOiBbXG4gICAqICAgICB7XCJmb29cIjogXCJiYXJcIn0sXG4gICAqICAgICB7XCJmb29cIjogXCJiYXpcIn0sXG4gICAqICAgXVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2VydmVyLnVzZShcbiAgICAnL2Ntcy9hcGkvY3N2LmltcG9ydCcsXG4gICAgbXVsdGlwYXJ0TWlkZGxld2FyZSgpLFxuICAgIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXEubWV0aG9kICE9PSAnUE9TVCcgfHwgIXJlcS5maWxlcyB8fCAhcmVxLmZpbGVzLmZpbGUpIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0JBRF9SRVFVRVNUJ30pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSByZXEuZmlsZXMuZmlsZTtcbiAgICAgICAgY29uc3QgY3N2U3RyaW5nID0gZmlsZS5idWZmZXIudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgY29uc3Qgcm93cyA9IGNzdlRvQXJyYXkoY3N2U3RyaW5nKTtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IHJvd3N9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIpO1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTid9KTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG4iLCAiLyoqIEBkZXByZWNhdGVkIFVzZSBjbGllbnQudHMgaW5zdGVhZC4gKi9cblxuaW1wb3J0IHtSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtcbiAgRmllbGRWYWx1ZSxcbiAgUXVlcnksXG4gIFRpbWVzdGFtcCxcbiAgZ2V0RmlyZXN0b3JlLFxufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IHtcbiAgTG9hZFRyYW5zbGF0aW9uc09wdGlvbnMsXG4gIExvY2FsZVRyYW5zbGF0aW9ucyxcbiAgVHJhbnNsYXRpb24sXG4gIFRyYW5zbGF0aW9uc01hcCxcbiAgZ2V0Q21zUGx1Z2luLFxuICB0cmFuc2xhdGlvbnNGb3JMb2NhbGUsXG4gIHVubWFyc2hhbERhdGEsXG59IGZyb20gJy4vY2xpZW50LmpzJztcblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBkb2MgZnJvbSBSb290LmpzIENNUy5cbiAqIEBkZXByZWNhdGVkIFVzZSBSb290Q01TQ2xpZW50LmdldERvYygpIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb2M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBzbHVnOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG4gIH1cbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG4gIC8vIFNsdWdzIHdpdGggc2xhc2hlcyBhcmUgZW5jb2RlZCBhcyBgLS1gIGluIHRoZSBEQi5cbiAgc2x1ZyA9IHNsdWcucmVwbGFjZUFsbCgnLycsICctLScpO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgY29uc3QgZG9jUmVmID0gZGIuZG9jKGRiUGF0aCk7XG4gIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICBjb25zdCBkYXRhID0gZG9jLmRhdGEoKTtcbiAgICByZXR1cm4gdW5tYXJzaGFsRGF0YShkYXRhKSBhcyBUO1xuICB9XG4gIGNvbnNvbGUubG9nKGBkb2Mgbm90IGZvdW5kOiAke2RiUGF0aH1gKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogTGlzdHMgZG9jcyBmcm9tIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAqIEBkZXByZWNhdGVkIFVzZSBSb290Q01TQ2xpZW50Lmxpc3REb2NzKCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3REb2NzPFQ+KFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgb3B0aW9uczoge1xuICAgIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgb3JkZXJCeT86IHN0cmluZztcbiAgICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gICAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbiAgfVxuKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICB9XG4gIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICB9XG4gIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgIGNvbnN0IGRvYyA9IHVubWFyc2hhbERhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICBkb2NzLnB1c2goZG9jKTtcbiAgfSk7XG4gIHJldHVybiB7ZG9jc307XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3MgaW4gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICogQGRlcHJlY2F0ZWQgVXNlIFJvb3RDTVNDbGllbnQuZ2V0RG9jc0NvdW50KCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG51bURvY3MoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICAgIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG4gIH1cbikge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmNvdW50KCkuZ2V0KCk7XG4gIGNvbnN0IGNvdW50ID0gcmVzdWx0cy5kYXRhKCkuY291bnQ7XG4gIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgc2NoZWR1bGVkIGRvY3MuXG4gKiBAZGVwcmVjYXRlZCBVc2UgUm9vdENNU0NsaWVudC5wdWJsaXNoU2NoZWR1bGVkRG9jcygpIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoU2NoZWR1bGVkRG9jcyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuXG4gIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcblxuICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGRiLmNvbGxlY3Rpb25Hcm91cCgnU2NoZWR1bGVkJykuZ2V0KCk7XG4gIGNvbnN0IGRvY3MgPSBzbmFwc2hvdC5kb2NzXG4gICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgLy8gRmlsdGVyIGRvY3MgYnkgcHJvamVjdC5cbiAgICAgIGlmICghZC5yZWYucGF0aC5zdGFydHNXaXRoKHByb2plY3RDb2xsZWN0aW9uc1BhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbHRlciBkb2NzIHdoZXJlIHNjaGVkdWxlZEF0IGlzIGluIHRoZSBwYXN0LlxuICAgICAgLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBtYW51YWxseSBpbnN0ZWFkIG9mIHVzaW5nIGEgcXVlcnlcbiAgICAgIC8vIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYW4gaW5kZXggaW4gZmlyZXN0b3JlLlxuICAgICAgY29uc3QgZGF0YSA9IGQuZGF0YSgpIHx8IHt9O1xuICAgICAgY29uc3Qgc2NoZWR1bGVkQXQ6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCA9IGRhdGEuc3lzPy5zY2hlZHVsZWRBdDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNjaGVkdWxlZEF0ICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzKCkgPD0gbm93XG4gICAgICApO1xuICAgIH0pXG4gICAgLm1hcCgoZCkgPT4ge1xuICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGJQYXRoLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBzbHVnID0gc2VnbWVudHMuYXQoLTEpO1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgIGNvbnN0IGlkID0gYCR7Y29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICBjb25zdCBiYXRjaCA9IGRiLmJhdGNoKCk7XG4gIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgIGNvbnN0IGRyYWZ0UmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3Qge3NjaGVkdWxlZEF0LCBzY2hlZHVsZWRCeSwgLi4uc3lzfSA9IGRhdGEuc3lzIHx8IHt9O1xuXG4gICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0O1xuICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPSBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyAoc2NoZWR1bGVkQnkgfHwgJycpO1xuXG4gICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgIGlkLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHNsdWcsXG4gICAgICBmaWVsZHM6IGRhdGEuZmllbGRzIHx8IHt9LFxuICAgICAgc3lzOiB7XG4gICAgICAgIC4uLnN5cyxcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgZmlyc3RQdWJsaXNoZWRCeTogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgIHB1Ymxpc2hlZEJ5OiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgLy8gUmVtb3ZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICdzeXMucHVibGlzaGVkQnknOiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICB9KTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgIGlmIChiYXRjaENvdW50ID49IDQ5OCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBSb290Q01TQ2xpZW50LmxvYWRUcmFuc2xhdGlvbnMoKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVHJhbnNsYXRpb25zKFxuICByb290Q29uZmlnOiBSb290Q29uZmlnLFxuICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbik6IFByb21pc2U8VHJhbnNsYXRpb25zTWFwPiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuXG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgbGV0IHF1ZXJ5OiBRdWVyeSA9IGRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgaWYgKG9wdGlvbnM/LnRhZ3MpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKCd0YWdzJywgJ2FycmF5LWNvbnRhaW5zLWFueScsIG9wdGlvbnMudGFncyk7XG4gIH1cblxuICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gIGNvbnN0IHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwID0ge307XG4gIHF1ZXJ5U25hcHNob3QuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgY29uc3QgaGFzaCA9IGRvYy5pZDtcbiAgICB0cmFuc2xhdGlvbnNNYXBbaGFzaF0gPSBkb2MuZGF0YSgpIGFzIFRyYW5zbGF0aW9uO1xuICB9KTtcbiAgcmV0dXJuIHRyYW5zbGF0aW9uc01hcDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYFJvb3RDTVNDbGllbnQubG9hZFRyYW5zbGF0aW9uc0ZvckxvY2FsZSgpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGxvY2FsZTogc3RyaW5nLFxuICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbik6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gIGNvbnN0IHRyYW5zbGF0aW9uc01hcCA9IGF3YWl0IGxvYWRUcmFuc2xhdGlvbnMocm9vdENvbmZpZywgb3B0aW9ucyk7XG4gIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xufVxuIiwgImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtQbHVnaW4sIFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge0FwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7XG4gIEZpZWxkVmFsdWUsXG4gIEZpcmVzdG9yZSxcbiAgUXVlcnksXG4gIFRpbWVzdGFtcCxcbiAgZ2V0RmlyZXN0b3JlLFxufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IHtDTVNQbHVnaW59IGZyb20gJy4vcGx1Z2luLmpzJztcblxuLyoqXG4gKiBNYXggbnVtYmVyIG9mIGRvY3MgdGhhdCBjYW4gYmUgcHVibGlzaGVkIGF0IG9uY2UgYnkgYHB1Ymxpc2hEb2NzKClgLlxuICovXG5leHBvcnQgY29uc3QgUFVCTElTSF9ET0NTX0JBVENIX0xJTUlUID0gMTAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIERvYzxGaWVsZHMgPSBhbnk+IHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgLyoqIFRoZSBzbHVnIG9mIHRoZSBkb2MsIGUuZy4gXCJmb28tYmFyXCIuICovXG4gIHNsdWc6IHN0cmluZztcbiAgc3lzOiB7XG4gICAgY3JlYXRlZEF0OiBudW1iZXI7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgbW9kaWZpZWRBdDogbnVtYmVyO1xuICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgICBmaXJzdFB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIGZpcnN0UHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgcHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgcHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgbG9jYWxlcz86IHN0cmluZ1tdO1xuICB9O1xuICBmaWVsZHM6IEZpZWxkcztcbn1cblxuZXhwb3J0IHR5cGUgRG9jTW9kZSA9ICdkcmFmdCcgfCAncHVibGlzaGVkJztcblxuZXhwb3J0IGludGVyZmFjZSBHZXREb2NPcHRpb25zIHtcbiAgLyoqIE1vZGUsIGVpdGhlciBcImRyYWZ0XCIgb3IgXCJwdWJsaXNoZWRcIi4gKi9cbiAgbW9kZTogRG9jTW9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXREb2NPcHRpb25zIHtcbiAgLyoqIE1vZGUsIGVpdGhlciBcImRyYWZ0XCIgb3IgXCJwdWJsaXNoZWRcIi4gKi9cbiAgbW9kZTogRG9jTW9kZTtcbiAgLyoqXG4gICAqIEVtYWlsIG9mIHVzZXIgbW9kaWZ5aW5nIHRoZSBkb2MuIElmIGJsYW5rLCBkZWZhdWx0cyB0byBgcm9vdC1jbXMtY2xpZW50YC5cbiAgICovXG4gIG1vZGlmaWVkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdERvY3NPcHRpb25zIHtcbiAgbW9kZTogRG9jTW9kZTtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgb3JkZXJCeURpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldENvdW50T3B0aW9ucyB7XG4gIG1vZGU6IERvY01vZGU7XG4gIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb24ge1xuICBbbG9jYWxlOiBzdHJpbmddOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uc01hcCB7XG4gIFtoYXNoOiBzdHJpbmddOiBUcmFuc2xhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbGVUcmFuc2xhdGlvbnMge1xuICBbc291cmNlOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZFRyYW5zbGF0aW9uc09wdGlvbnMge1xuICB0YWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBSb290Q01TQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGNtc1BsdWdpbjogQ01TUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3RJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRiOiBGaXJlc3RvcmU7XG5cbiAgY29uc3RydWN0b3Iocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICAgIHRoaXMucm9vdENvbmZpZyA9IHJvb3RDb25maWc7XG4gICAgdGhpcy5jbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4odGhpcy5yb290Q29uZmlnKTtcblxuICAgIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSB0aGlzLmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICB0aGlzLnByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMuYXBwID0gdGhpcy5jbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgICB0aGlzLmRiID0gZ2V0RmlyZXN0b3JlKHRoaXMuYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgZG9jIGRhdGEgZnJvbSBSb290LmpzIENNUy5cbiAgICovXG4gIGFzeW5jIGdldERvYzxGaWVsZHMgPSBhbnk+KFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4gICk6IFByb21pc2U8RG9jPEZpZWxkcz4gfCBudWxsPiB7XG4gICAgY29uc3QgcmF3RGF0YSA9IGF3YWl0IHRoaXMuZ2V0UmF3RG9jKGNvbGxlY3Rpb25JZCwgc2x1Zywgb3B0aW9ucyk7XG4gICAgaWYgKHJhd0RhdGEpIHtcbiAgICAgIHJldHVybiB1bm1hcnNoYWxEYXRhKHJhd0RhdGEpIGFzIERvYzxGaWVsZHM+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcmF3IGRvYyBkYXRhIGFzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIE9ubHkgdXNlIHRoaXMgaWYgeW91IGtub3dcbiAgICogd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmF3RG9jKFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4gICk6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICAvLyBTbHVncyB3aXRoIHNsYXNoZXMgYXJlIGVuY29kZWQgYXMgYC0tYCBpbiB0aGUgREIuXG4gICAgc2x1ZyA9IHNsdWcucmVwbGFjZUFsbCgnLycsICctLScpO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIHNldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIG9wdGlvbnM6IFNldERvY09wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBhd2FpdCBkb2NSZWYuc2V0KGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIGRvY3MgZnJvbSBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBsaXN0RG9jczxUPihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBMaXN0RG9jc09wdGlvbnNcbiAgKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMubGltaXQpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSB1bm1hcnNoYWxEYXRhKHJlc3VsdC5kYXRhKCkpIGFzIFQ7XG4gICAgICBkb2NzLnB1c2goZG9jKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge2RvY3N9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2NzIGluIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldERvY3NDb3VudChjb2xsZWN0aW9uSWQ6IHN0cmluZywgb3B0aW9uczogR2V0Q291bnRPcHRpb25zKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmNvdW50KCkuZ2V0KCk7XG4gICAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggcHVibGlzaGVzIGEgc2V0IG9mIGRvY3MgYnkgaWQuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoRG9jcyhkb2NJZHM6IHN0cmluZ1tdLCBvcHRpb25zPzoge3B1Ymxpc2hlZEJ5OiBzdHJpbmd9KSB7XG4gICAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9uc2A7XG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIC8vIEZldGNoIHRoZSBjdXJyZW50IGRyYWZ0IGRhdGEgZm9yIGVhY2ggZG9jLlxuICAgIGNvbnN0IGRvY1JlZnMgPSBkb2NJZHMubWFwKChkb2NJZCkgPT4ge1xuICAgICAgY29uc3QgW2NvbGxlY3Rpb24sIHNsdWddID0gZG9jSWQuc3BsaXQoJy8nKTtcbiAgICAgIGlmICghY29sbGVjdGlvbiB8fCAhc2x1Zykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZG9jIGlkOiAke2RvY0lkfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRvY1JlZjtcbiAgICB9KTtcbiAgICBjb25zdCBkb2NTbmFwc2hvdHMgPSBhd2FpdCB0aGlzLmRiLmdldEFsbCguLi5kb2NSZWZzKTtcbiAgICBjb25zdCBkb2NzID0gZG9jU25hcHNob3RzXG4gICAgICAvLyBSZXRyaWV2ZSBzbmFwc2hvdCBkYXRhIGZvciBlYWNoIGRvYy5cbiAgICAgIC5tYXAoKHNuYXBzaG90KSA9PiBzbmFwc2hvdC5kYXRhKCkgYXMgRG9jKVxuICAgICAgLy8gUmVtb3ZlIGRvY3MgdGhhdCBkb24ndCBleGlzdC5cbiAgICAgIC5maWx0ZXIoKGQpID0+ICEhZCk7XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPiBQVUJMSVNIX0RPQ1NfQkFUQ0hfTElNSVQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHB1Ymxpc2hEb2NzKCkgaGFzIGEgbGltaXQgb2YgJHtQVUJMSVNIX0RPQ1NfQkFUQ0hfTElNSVR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyAvLyBFYWNoIHRyYW5zYWN0aW9uIG9yIGJhdGNoIGNhbiB3cml0ZSBhIG1heCBvZiA1MDAgb3BzLlxuICAgIC8vIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIHN5cywgZmllbGRzfSA9IGRvYztcbiAgICAgIGNvbnN0IGRyYWZ0UmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3QgcHVibGlzaGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgICApO1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQXQgPVxuICAgICAgICBzeXMuZmlyc3RQdWJsaXNoZWRBdCA/PyBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpO1xuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9IHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IHB1Ymxpc2hlZEJ5O1xuXG4gICAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5zZXQocHVibGlzaGVkUmVmLCB7XG4gICAgICAgIGlkLFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBzbHVnLFxuICAgICAgICBmaWVsZHM6IGZpZWxkcyB8fCB7fSxcbiAgICAgICAgc3lzOiB7XG4gICAgICAgICAgLi4uc3lzLFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQXQ6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRCeTogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgICBwdWJsaXNoZWRBdDogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gUmVtb3ZlIHNjaGVkdWxlZCBkb2MsIGlmIGFueS5cbiAgICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEJ5JzogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRBdCc6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICdzeXMucHVibGlzaGVkQnknOiBwdWJsaXNoZWRCeSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgICAgaWYgKGJhdGNoQ291bnQgPj0gNDk4KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgICByZXR1cm4gcHVibGlzaGVkRG9jcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgc2NoZWR1bGVkIGRvY3MuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoU2NoZWR1bGVkRG9jcygpIHtcbiAgICBjb25zdCBwcm9qZWN0Q29sbGVjdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgICBjb25zdCBub3cgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuXG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLmRiLmNvbGxlY3Rpb25Hcm91cCgnU2NoZWR1bGVkJykuZ2V0KCk7XG4gICAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAgIC5maWx0ZXIoKGQpID0+IHtcbiAgICAgICAgLy8gRmlsdGVyIGRvY3MgYnkgcHJvamVjdC5cbiAgICAgICAgaWYgKCFkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsdGVyIGRvY3Mgd2hlcmUgc2NoZWR1bGVkQXQgaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgIC8vIE5PVEUoc3RldmVubGUpOiB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyBhIHF1ZXJ5XG4gICAgICAgIC8vIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYW4gaW5kZXggaW4gZmlyZXN0b3JlLlxuICAgICAgICBjb25zdCBkYXRhID0gZC5kYXRhKCkgfHwge307XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZEF0OiBUaW1lc3RhbXAgfCB1bmRlZmluZWQgPSBkYXRhLnN5cz8uc2NoZWR1bGVkQXQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgc2NoZWR1bGVkQXQgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMoKSA8PSBub3dcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChkKSA9PiB7XG4gICAgICAgIGNvbnN0IGRiUGF0aCA9IGQucmVmLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGJQYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHNsdWcgPSBzZWdtZW50cy5hdCgtMSk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBzZWdtZW50cy5hdCgtMyk7XG4gICAgICAgIGNvbnN0IGlkID0gYCR7Y29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogZC5kYXRhKCksXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICBzbHVnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHNjaGVkdWxlJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBkYXRhfSA9IGRvYztcbiAgICAgIGNvbnN0IGRyYWZ0UmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3QgcHVibGlzaGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qge3NjaGVkdWxlZEF0LCBzY2hlZHVsZWRCeSwgLi4uc3lzfSA9IGRhdGEuc3lzIHx8IHt9O1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQXQgPSBzeXMuZmlyc3RQdWJsaXNoZWRBdCA/PyBzY2hlZHVsZWRBdDtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPVxuICAgICAgICBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyAoc2NoZWR1bGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCcpO1xuXG4gICAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5zZXQocHVibGlzaGVkUmVmLCB7XG4gICAgICAgIGlkLFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBzbHVnLFxuICAgICAgICBmaWVsZHM6IGRhdGEuZmllbGRzIHx8IHt9LFxuICAgICAgICBzeXM6IHtcbiAgICAgICAgICAuLi5zeXMsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHB1Ymxpc2hlZEJ5OiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBSZW1vdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEJ5JzogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRBdCc6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICdzeXMucHVibGlzaGVkQnknOiBzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JyxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgICAgaWYgKGJhdGNoQ291bnQgPj0gNDk4KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgICByZXR1cm4gcHVibGlzaGVkRG9jcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgc2F2ZWQgaW4gdGhlIHRyYW5zbGF0aW9ucyBjb2xsZWN0aW9uLCBvcHRpb25hbGx5XG4gICAqIGZpbHRlcmVkIGJ5IHRhZy5cbiAgICpcbiAgICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIFwiPGhhc2g+XCI6IHtcInNvdXJjZVwiOiBcIkhlbGxvXCIsIFwiZXNcIjogXCJIb2xhXCIsIFwiZnJcIjogXCJCb25qb3VyXCJ9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9ucyhcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnM/LnRhZ3MpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgICBxdWVyeVNuYXBzaG90LmZvckVhY2goKGRvYykgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IGRvYy5pZDtcbiAgICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIG1hcCBvZiB0cmFuc2xhdGlvbnMsIGUuZy46XG4gICAqIGBgYFxuICAgKiBhd2FpdCBjbGllbnQuc2F2ZVRyYW5zbGF0aW9ucyh7XG4gICAqICAgXCJIZWxsb1wiOiB7XCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNhdmVUcmFuc2xhdGlvbnMoXG4gICAgdHJhbnNsYXRpb25zOiB7XG4gICAgICBbc291cmNlOiBzdHJpbmddOiB7W2xvY2FsZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB9LFxuICAgIHRhZ3M/OiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zbGF0aW9ucykuZm9yRWFjaCgoW3NvdXJjZSwgc291cmNlVHJhbnNsYXRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0VHJhbnNsYXRpb25LZXkoc291cmNlKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUmVmID0gdGhpcy5kYi5kb2MoYCR7dHJhbnNsYXRpb25zUGF0aH0vJHtoYXNofWApO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAuLi5zb3VyY2VUcmFuc2xhdGlvbnMsXG4gICAgICAgIHNvdXJjZTogdGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSxcbiAgICAgIH07XG4gICAgICBpZiAodGFncykge1xuICAgICAgICBkYXRhLnRhZ3MgPSB0YWdzO1xuICAgICAgfVxuICAgICAgYmF0Y2gudXBkYXRlKHRyYW5zbGF0aW9uUmVmLCBkYXRhKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcbiAgICB9KTtcbiAgICBpZiAoYmF0Y2hDb3VudCA+IDUwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cCB0byA1MDAgdHJhbnNsYXRpb25zIGNhbiBiZSBzYXZlZCBhdCBhIHRpbWUuJyk7XG4gICAgfVxuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwia2V5XCIgdXNlZCBmb3IgYSB0cmFuc2xhdGlvbiBhcyBzdG9yZWQgaW4gdGhlIGRiLiBUcmFuc2xhdGlvbnNcbiAgICogYXJlIHN0b3JlZCB1bmRlciBgUHJvamVjdHMvPHByb2plY3QgaWQ+L1RyYW5zbGF0aW9ucy88c2hhMSBoYXNoPmAuXG4gICAqL1xuICBnZXRUcmFuc2xhdGlvbktleShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IHNoYTEgPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAgIC51cGRhdGUodGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgIHJldHVybiBzaGExO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBhIHN0cmluZyB0aGF0J3MgdXNlZCBmb3IgdHJhbnNsYXRpb25zLiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIFJlbW92ZXMgYW55IGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgKiAtIFJlbW92ZXMgc3BhY2VzIGF0IHRoZSBlbmQgb2YgYW55IGxpbmVcbiAgICovXG4gIG5vcm1hbGl6ZVN0cmluZyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmVzID0gU3RyaW5nKHN0cilcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbUVuZCgpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgdGhpcy5sb2FkVHJhbnNsYXRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZzogUm9vdENvbmZpZyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gcm9vdENvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQoKHBsdWdpbikgPT4gcGx1Z2luLm5hbWUgPT09ICdyb290LWNtcycpO1xuICBpZiAoIXBsdWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcm9vdC1jbXMgcGx1Z2luIGNvbmZpZyBpbiByb290LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiBwbHVnaW4gYXMgQ01TUGx1Z2luO1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBUaW1lc3RhbXAgb2JqZWN0cyB0byBtaWxsaXMgYW5kIGFueVxuICogX2FycmF5IG1hcHMgdG8gbm9ybWFsIGFycmF5cy5cbiAqXG4gKiBFLmcuOlxuICpcbiAqIG5vcm1hbGl6ZURhdGEoe1xuICogICBzeXM6IHttb2RpZmllZEF0OiBUaW1lc3RhbXAoMTIzKX0sXG4gKiAgIGZpZWxkczoge1xuICogICAgIF9hcnJheTogWydhc2RmJ10sXG4gKiAgICAgYXNkZjoge3RpdGxlOiAnaGVsbG8nfVxuICogICB9XG4gKiB9KVxuICogLy8gPT4ge3N5czoge21vZGlmaWVkQXQ6IDEyM30sIGZpZWxkczoge2ZvbzogW3t0aXRsZTogJ2hlbGxvJ31dfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgaWYgKHZhbC50b01pbGxpcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbC50b01pbGxpcygpO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHZhbCwgJ19hcnJheScpICYmIEFycmF5LmlzQXJyYXkodmFsLl9hcnJheSkpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdmFsLl9hcnJheS5tYXAoKGFycmF5S2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udW5tYXJzaGFsRGF0YSh2YWxbYXJyYXlLZXldIHx8IHt9KSxcbiAgICAgICAgICAgIF9hcnJheUtleTogYXJyYXlLZXksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gYXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB1bm1hcnNoYWxEYXRhKHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGB1bm1hcnNoYWxEYXRhKClgIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICByZXR1cm4gdW5tYXJzaGFsRGF0YShkYXRhKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheU9iamVjdCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgX2FycmF5OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIGFuIGFycmF5IGludG8gYW4gYEFycmF5T2JqZWN0YCwgZS5nLjpcbiAqXG4gKiBgYGBcbiAqIG1hcnNoYWxBcnJheShbMSwgMiwgM10pXG4gKiAvLyA9PiB7YTogMSwgYjogMiwgYzogMywgX2FycmF5OiBbJ2EnLCAnYicsICdjJ119XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRhdGFiYXNlIHN0b3JhZ2UgbWV0aG9kIG1ha2VzIGl0IGVhc2llciB0byB1cGRhdGUgYSBzaW5nbGUgZmllbGQgaW4gYVxuICogZGVlcGx5IG5lc3RlZCBhcnJheSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJzaGFsQXJyYXkoYXJyOiBhbnlbXSk6IEFycmF5T2JqZWN0IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICByZXR1cm4gYXJyO1xuICB9XG4gIGNvbnN0IGFyck9iamVjdDogQXJyYXlPYmplY3QgPSB7X2FycmF5OiBbXX07XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHtcbiAgICBjb25zdCBrZXkgPSByYW5kU3RyaW5nKDYpO1xuICAgIGFyck9iamVjdFtrZXldID0gaXRlbTtcbiAgICBhcnJPYmplY3QuX2FycmF5LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gYXJyT2JqZWN0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGBBcnJheU9iamVjdGAgdG8gYSBub3JtYWwgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWxBcnJheShhcnJPYmplY3Q6IEFycmF5T2JqZWN0KTogYW55W10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyT2JqZWN0Py5fYXJyYXkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGFyciA9IGFyck9iamVjdC5fYXJyYXkubWFwKChrOiBzdHJpbmcpID0+IGFyck9iamVjdFtrXSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJhbmRTdHJpbmcobGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgY2hhcnMgPVxuICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCByYW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKTtcbiAgICByZXN1bHQucHVzaChjaGFycy5jaGFyQXQocmFuZCkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB0cmFuc2xhdGlvbnMgbWFwIGZyb20gYGxvYWRUcmFuc2xhdGlvbnMoKWAgdG8gYSBtYXAgb2Ygc291cmNlIHRvXG4gKiB0cmFuc2xhdGVkIHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIGxvY2FsZS5cbiAqXG4gKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gKiBgYGBcbiAqIHtcbiAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRpb25zRm9yTG9jYWxlKFxuICB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCxcbiAgbG9jYWxlOiBzdHJpbmdcbikge1xuICBjb25zdCBsb2NhbGVUcmFuc2xhdGlvbnM6IExvY2FsZVRyYW5zbGF0aW9ucyA9IHt9O1xuICBPYmplY3QudmFsdWVzKHRyYW5zbGF0aW9uc01hcCkuZm9yRWFjaCgoc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5nLnNvdXJjZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHN0cmluZ1tsb2NhbGVdIHx8IHN0cmluZy5lbiB8fCBzdHJpbmcuc291cmNlO1xuICAgIGxvY2FsZVRyYW5zbGF0aW9uc1tzb3VyY2VdID0gdHJhbnNsYXRpb247XG4gIH0pO1xuICByZXR1cm4gbG9jYWxlVHJhbnNsYXRpb25zO1xufVxuIiwgIi8qKlxuICogRG9jdW1lbnQgdmVyaW9uIGhpc3RvcnkuXG4gKlxuICogVmVyaW9ucyBzYXZlIHRoZSBzdGF0ZSBvZiBhIGRvY3VtZW50IGF0IGRpZmZlcmVudCBtb21lbnRzIGluIHRpbWUsIGFsbG93aW5nXG4gKiB1c2VycyB0byByZXZlcnQgYmFjayB0byBhIHZlcnNpb24gaWYvd2hlbiBuZWVkZWQuXG4gKlxuICogVGhlIHNhdmVWZXJzaW9ucygpIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIHJ1biB3aXRoaW4gYSBjcm9uIGpvYiAoZS5nIHVzaW5nXG4gKiBmaXJlYmFzZSBmdW5jdGlvbnMpLiBFdmVyeSBtaW51dGUsIHRoZSBydW5uZXIgY2hlY2tzIGZvciBhbGwgZG9jdW1lbnRzIHRoYXRcbiAqIGhhdmUgYmVlbiBlZGl0ZWQgc2luY2UgdGhlIGxhc3QgcnVuLiBUbyBhdm9pZCBzYXZpbmcgXCJwYXJ0aWFsXCIgdmVyc2lvbnNcbiAqICh3aGVuIHRoZSB1c2VyIG1pZ2h0IGJlIGluIHRoZSBtaWRkbGUgb2YgZWRpdGluZyBhIGRvY3VtZW50KSwgdmVyc2lvbnMgb25seVxuICogcnVuIG9uIGRvY3VtZW50cyB0aGF0IGhhdmVuJ3QgYmVlbiBlZGl0ZWQgd2l0aGluIHRoZSBsYXN0IDUgbWlucyB0byBlbnN1cmVcbiAqIHRoYXQgdmVyc2lvbiBpcyBcInN0YWJsZVwiLlxuICpcbiAqIEluIHRoZSBkYXRhYmFzZSwgdmVyc2lvbnMgYXJlIHN0b3JlZCBhczpcbiAqIC9Qcm9qZWN0cy88cHJvamVjdElkPi9Db2xsZWN0aW9ucy88Y29sbGVjdGlvbklkPi9EcmFmdHMvPGRvY0lkPi9WZXJzaW9ucy88dGltZXN0YW1wPlxuICpcbiAqIFdoZXJlIDx0aW1lc3RhbXA+IGlzIHRoZSB1bml4IHRpbWVzdGFtcCAobWlsbGlzKSB0aGF0IHRoZSBkb2N1bWVudCB3YXMgbGFzdFxuICogZWRpdGVkLlxuICovXG5cbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge1xuICBGaXJlc3RvcmUsXG4gIFF1ZXJ5LFxuICBUaW1lc3RhbXAsXG4gIGdldEZpcmVzdG9yZSxcbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCBnbG9iIGZyb20gJ3RpbnktZ2xvYic7XG5pbXBvcnQge2dldENtc1BsdWdpbn0gZnJvbSAnLi9jbGllbnQuanMnO1xuXG4vLyBUbyBhdm9pZCBzYXZpbmcgXCJwYXJ0aWFsXCIgdmVyc2lvbnMgKHdoZW4gdGhlIHVzZXIgbWlnaHQgYmUgaW4gdGhlIG1pZGRsZSBvZlxuLy8gZWRpdGluZyBhIGRvY3VtZW50KSwgdmVyc2lvbnMgb25seSBydW4gb24gZG9jdW1lbnRzIHRoYXQgaGF2ZW4ndCBiZWVuIGVkaXRlZFxuLy8gd2l0aGluIHRoZSBsYXN0IDUgbWlucyB0byBlbnN1cmUgdGhhdCB2ZXJzaW9uIGlzIFwic3RhYmxlXCIuXG5jb25zdCBET0NVTUVOVF9TQVZFX09GRlNFVCA9IDUgKiA2MCAqIDEwMDA7XG5cbmludGVyZmFjZSBQYXJ0aWFsQ01TRG9jIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBpZDogc3RyaW5nO1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIHNsdWc6IHN0cmluZztcbiAgc3lzOiB7XG4gICAgbW9kaWZpZWRBdDogVGltZXN0YW1wO1xuICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFZlcnNpb25zU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdENvbmZpZzogUm9vdENvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9qZWN0SWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkYjogRmlyZXN0b3JlO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgICB0aGlzLnJvb3RDb25maWcgPSByb290Q29uZmlnO1xuICAgIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMucHJvamVjdElkID0gcHJvamVjdElkO1xuICAgIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICAgIHRoaXMuZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHZlcnNpb24gb2YgYWxsIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiBlZGl0ZWQgc2luY2UgdGhlIGxhc3QgcnVuLlxuICAgKi9cbiAgYXN5bmMgc2F2ZVZlcnNpb25zKCkge1xuICAgIC8vIE9mZnNldCB0aGUgXCJsYXN0IHJ1blwiIHRpbWUgYnkgNSBtaW5zLiBWZXJzaW9ucyBpZ25vcmUgZG9jcyB0aGF0IHdlcmVcbiAgICAvLyBlZGl0ZWQgd2l0aGluIHRoZSBsYXN0IDUgbWlucyB0byBhdm9pZCBwb3RlbnRpYWwgXCJwYXJ0aWFsXCIgdmVyc2lvbnMgd2hlblxuICAgIC8vIHVzZXIgaXMgaW4gdGhlIG1pZGRsZSBvZiBlZGl0aW5nIGEgZG9jdW1lbnQuXG4gICAgY29uc3QgbGFzdFJ1biA9IGF3YWl0IHRoaXMuZ2V0TGFzdFJ1bigpO1xuICAgIGNvbnN0IGxhc3RSdW5XaXRoT2Zmc2V0ID1cbiAgICAgIGxhc3RSdW4gPT09IDAgPyBsYXN0UnVuIDogbGFzdFJ1biAtIERPQ1VNRU5UX1NBVkVfT0ZGU0VUO1xuICAgIGNvbnN0IGNoYW5nZWREb2NzID0gYXdhaXQgdGhpcy5nZXREb2NzTW9kaWZpZWRBZnRlcihsYXN0UnVuV2l0aE9mZnNldCk7XG4gICAgY29uc3Qgbm93ID0gVGltZXN0YW1wLm5vdygpLnRvTWlsbGlzKCk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBjaGFuZ2VkRG9jcy5maWx0ZXIoKGRvYykgPT4ge1xuICAgICAgY29uc3QgbW9kaWZpZWRBdCA9IGRvYy5zeXMubW9kaWZpZWRBdC50b01pbGxpcygpO1xuICAgICAgcmV0dXJuIG1vZGlmaWVkQXQgPD0gbm93IC0gRE9DVU1FTlRfU0FWRV9PRkZTRVQ7XG4gICAgfSk7XG4gICAgaWYgKHZlcnNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2F2ZVZlcnNpb25zVG9GaXJlc3RvcmUodmVyc2lvbnMpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVMYXN0UnVuKG5vdyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVWZXJzaW9uc1RvRmlyZXN0b3JlKHZlcnNpb25zOiBQYXJ0aWFsQ01TRG9jW10pIHtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICB2ZXJzaW9ucy5mb3JFYWNoKCh2ZXJzaW9uKSA9PiB7XG4gICAgICBpZiAoIXZlcnNpb24uY29sbGVjdGlvbiB8fCAhdmVyc2lvbi5zbHVnIHx8ICF2ZXJzaW9uLnN5cz8ubW9kaWZpZWRBdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb2RpZmllZEF0TWlsbGlzID0gdmVyc2lvbi5zeXMubW9kaWZpZWRBdC50b01pbGxpcygpO1xuICAgICAgY29uc3QgdmVyc2lvblBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHt2ZXJzaW9uLmNvbGxlY3Rpb259L0RyYWZ0cy8ke3ZlcnNpb24uc2x1Z30vVmVyc2lvbnMvJHttb2RpZmllZEF0TWlsbGlzfWA7XG4gICAgICBjb25zb2xlLmxvZyh2ZXJzaW9uUGF0aCk7XG4gICAgICBjb25zdCB2ZXJzaW9uUmVmID0gdGhpcy5kYi5kb2ModmVyc2lvblBhdGgpO1xuICAgICAgYmF0Y2guc2V0KHZlcnNpb25SZWYsIHZlcnNpb24pO1xuICAgIH0pO1xuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIGNvbnNvbGUubG9nKGB2ZXJzaW9uczogc2F2ZWQgJHt2ZXJzaW9ucy5sZW5ndGh9IHZlcnNpb25zYCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGFzdCB0aW1lIChpbiBtaWxsaXMpIHNhdmVWZXJzaW9ucygpIHdhcyBydW4sIG9yIDAgaWYgaGFzXG4gICAqIG5ldmVyIGJlZW4gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRMYXN0UnVuKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgcHJvamVjdERvY1JlZiA9IHRoaXMuZGIuY29sbGVjdGlvbignUHJvamVjdHMnKS5kb2ModGhpcy5wcm9qZWN0SWQpO1xuICAgIGNvbnN0IHByb2plY3REb2MgPSBhd2FpdCBwcm9qZWN0RG9jUmVmLmdldCgpO1xuICAgIGlmIChwcm9qZWN0RG9jLmV4aXN0cykge1xuICAgICAgY29uc3QgZGF0YSA9IHByb2plY3REb2MuZGF0YSgpIHx8IHt9O1xuICAgICAgY29uc3QgdHMgPSBkYXRhLnZlcnNpb25zTGFzdFJ1biBhcyBUaW1lc3RhbXA7XG4gICAgICBpZiAodHMpIHtcbiAgICAgICAgcmV0dXJuIHRzLnRvTWlsbGlzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHt2ZXJzaW9uTGFzdFJ1bjogPHRpbWVzdGFtcD59IHRvIHRoZSBQcm9qZWN0cy88cHJvamVjdElkPiBkb2MuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVMYXN0UnVuKG1pbGxpczogbnVtYmVyKSB7XG4gICAgY29uc3QgdHMgPSBUaW1lc3RhbXAuZnJvbU1pbGxpcyhtaWxsaXMpO1xuICAgIGNvbnN0IHByb2plY3REb2NSZWYgPSB0aGlzLmRiLmNvbGxlY3Rpb24oJ1Byb2plY3RzJykuZG9jKHRoaXMucHJvamVjdElkKTtcbiAgICBhd2FpdCBwcm9qZWN0RG9jUmVmLnNldCh7dmVyc2lvbnNMYXN0UnVuOiB0c30sIHttZXJnZTogdHJ1ZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBkb2NzIHRoYXQgd2VyZSBlZGl0ZWQgYWZ0ZXIgYSBjZXJ0YWluIHRpbWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERvY3NNb2RpZmllZEFmdGVyKG1pbGxpczogbnVtYmVyKTogUHJvbWlzZTxQYXJ0aWFsQ01TRG9jW10+IHtcbiAgICBjb25zdCB0cyA9IFRpbWVzdGFtcC5mcm9tTWlsbGlzKG1pbGxpcyk7XG4gICAgY29uc3QgcmVzdWx0czogUGFydGlhbENNU0RvY1tdID0gW107XG4gICAgY29uc3QgY29sbGVjdGlvbklkcyA9IGF3YWl0IHRoaXMubGlzdENvbGxlY3Rpb25zKCk7XG4gICAgLy8gTk9URTogSW5kaXZpZHVhbCBjb2xsZWN0aW9ucyBhcmUgcXVlcmllZCBpbnN0ZWFkIG9mIHVzaW5nIGFcbiAgICAvLyBjb2xsZWN0aW9uR3JvdXAgcXVlcnkgYmVjYXVzZSB0aGUgbGF0dGVyIHJlcXVpcmVzIGEgZmlyZXN0b3JlIGluZGV4IHRvIGJlXG4gICAgLy8gc2V0IHVwLlxuICAgIGZvciAoY29uc3QgY29sbGVjdGlvbklkIG9mIGNvbGxlY3Rpb25JZHMpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25QYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS9EcmFmdHNgO1xuICAgICAgY29uc3QgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYlxuICAgICAgICAuY29sbGVjdGlvbihjb2xsZWN0aW9uUGF0aClcbiAgICAgICAgLndoZXJlKCdzeXMubW9kaWZpZWRBdCcsICc+PScsIHRzKTtcbiAgICAgIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgICAgIHF1ZXJ5U25hcHNob3QuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgICAgIHJlc3VsdHMucHVzaChkb2MuZGF0YSgpIGFzIFBhcnRpYWxDTVNEb2MpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGNvbGxlY3Rpb24gaWRzIGZvciB0aGUgUm9vdCBwcm9qZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0Q29sbGVjdGlvbnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY29sbGVjdGlvbkZpbGVOYW1lcyA9IGF3YWl0IGdsb2IoJyouc2NoZW1hLnRzJywge1xuICAgICAgY3dkOiBwYXRoLmpvaW4odGhpcy5yb290Q29uZmlnLnJvb3REaXIsICdjb2xsZWN0aW9ucycpLFxuICAgIH0pO1xuICAgIGNvbGxlY3Rpb25GaWxlTmFtZXMuZm9yRWFjaCgoZmlsZW5hbWUpID0+IHtcbiAgICAgIGNvbGxlY3Rpb25JZHMucHVzaChmaWxlbmFtZS5zbGljZSgwLCAtMTApKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29sbGVjdGlvbklkcztcbiAgfVxufVxuIiwgImltcG9ydCB7Um9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7cHVibGlzaFNjaGVkdWxlZERvY3N9IGZyb20gJy4vcnVudGltZS5qcyc7XG5pbXBvcnQge1ZlcnNpb25zU2VydmljZX0gZnJvbSAnLi92ZXJzaW9ucy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Dcm9uSm9icyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBydW5Dcm9uSm9iKCdwdWJsaXNoU2NoZWR1bGVkRG9jcycsIHJ1blB1Ymxpc2hTY2hlZHVsZWREb2NzLCByb290Q29uZmlnKSxcbiAgICBydW5Dcm9uSm9iKCdzYXZlVmVyc2lvbnMnLCBydW5TYXZlVmVyc2lvbnMsIHJvb3RDb25maWcpLFxuICBdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQ3JvbkpvYihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIC4uLmFyZ3M6IGFueVtdXG4pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmbiguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coYGNyb24gZmFpbGVkOiAke25hbWV9YCk7XG4gICAgY29uc29sZS5lcnJvcihTdHJpbmcoZXJyLnN0YWNrIHx8IGVycikpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QdWJsaXNoU2NoZWR1bGVkRG9jcyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGF3YWl0IHB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TYXZlVmVyc2lvbnMocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICBjb25zdCBzZXJ2aWNlID0gbmV3IFZlcnNpb25zU2VydmljZShyb290Q29uZmlnKTtcbiAgYXdhaXQgc2VydmljZS5zYXZlVmVyc2lvbnMoKTtcbn1cbiIsICJpbXBvcnQge3BhcnNlIGFzIGNzdlBhcnNlfSBmcm9tICdjc3YtcGFyc2Uvc3luYyc7XG5pbXBvcnQge3N0cmluZ2lmeSBhcyBjc3ZTdHJpbmdpZnl9IGZyb20gJ2Nzdi1zdHJpbmdpZnkvc3luYyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVRvQ3N2KHJlcToge1xuICBoZWFkZXJzOiBzdHJpbmdbXTtcbiAgcm93czogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj47XG59KTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzIHx8IFtdO1xuICBjb25zdCByb3dzID0gcmVxLnJvd3MgfHwgW107XG4gIHJldHVybiBjc3ZTdHJpbmdpZnkocm93cywge1xuICAgIGhlYWRlcjogdHJ1ZSxcbiAgICBjb2x1bW5zOiBoZWFkZXJzLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNzdlRvQXJyYXkoY3N2U3RyaW5nOiBzdHJpbmcpIHtcbiAgY29uc3Qgcm93cyA9IGNzdlBhcnNlKGNzdlN0cmluZywge1xuICAgIGNvbHVtbnM6IHRydWUsXG4gICAgc2tpcF9lbXB0eV9saW5lczogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiByb3dzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVEsWUFBWSxVQUFTO0FBQzdCLE9BQU9BLFdBQVU7QUFDakIsU0FBUSxxQkFBb0I7QUFVNUIsT0FBTyxnQkFBZ0I7QUFDdkI7QUFBQSxFQUVFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUSxlQUE4QjtBQUN0QyxPQUFPLFVBQVU7OztBQ25CakIsU0FBUSwyQkFBMEI7OztBQ0VsQztBQUFBLEVBQ0UsY0FBQUM7QUFBQSxFQUdBLGdCQUFBQztBQUFBLE9BQ0s7OztBQ1JQLE9BQU8sWUFBWTtBQUduQjtBQUFBLEVBQ0U7QUFBQSxFQUlBO0FBQUEsT0FDSztBQThmQSxTQUFTLGFBQWEsWUFBbUM7QUFDOUQsUUFBTSxVQUFvQixXQUFXLFdBQVcsQ0FBQztBQUNqRCxRQUFNLFNBQVMsUUFBUSxLQUFLLENBQUNDLFlBQVdBLFFBQU8sU0FBUyxVQUFVO0FBQ2xFLE1BQUksQ0FBQyxRQUFRO0FBQ1gsVUFBTSxJQUFJLE1BQU0seURBQXlEO0FBQUEsRUFDM0U7QUFDQSxTQUFPO0FBQ1Q7OztBRDVZQSxlQUFzQixxQkFBcUIsWUFBd0I7QUFDakUsUUFBTUMsYUFBWSxhQUFhLFVBQVU7QUFDekMsUUFBTSxtQkFBbUJBLFdBQVUsVUFBVTtBQUM3QyxRQUFNLFlBQVksaUJBQWlCLE1BQU07QUFDekMsUUFBTSxNQUFNQSxXQUFVLGVBQWU7QUFDckMsUUFBTSxLQUFLQyxjQUFhLEdBQUc7QUFFM0IsUUFBTSx5QkFBeUIsWUFBWSxTQUFTO0FBQ3BELFFBQU0sTUFBTSxLQUFLLE1BQUssb0JBQUksS0FBSyxHQUFFLFFBQVEsQ0FBQztBQUUxQyxRQUFNLFdBQVcsTUFBTSxHQUFHLGdCQUFnQixXQUFXLEVBQUUsSUFBSTtBQUMzRCxRQUFNLE9BQU8sU0FBUyxLQUNuQixPQUFPLENBQUMsTUFBTTtBQTlJbkI7QUFnSk0sUUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLFdBQVcsc0JBQXNCLEdBQUc7QUFDbEQsYUFBTztBQUFBLElBQ1Q7QUFJQSxVQUFNLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQztBQUMxQixVQUFNLGVBQXFDLFVBQUssUUFBTCxtQkFBVTtBQUNyRCxXQUNFLGVBQWUsWUFBWSxZQUFZLFlBQVksU0FBUyxLQUFLO0FBQUEsRUFFckUsQ0FBQyxFQUNBLElBQUksQ0FBQyxNQUFNO0FBQ1YsVUFBTSxTQUFTLEVBQUUsSUFBSTtBQUNyQixVQUFNLFdBQVcsT0FBTyxNQUFNLEdBQUc7QUFDakMsVUFBTSxPQUFPLFNBQVMsR0FBRyxFQUFFO0FBQzNCLFVBQU0sYUFBYSxTQUFTLEdBQUcsRUFBRTtBQUNqQyxVQUFNLEtBQUssR0FBRyxVQUFVLElBQUksSUFBSTtBQUNoQyxXQUFPO0FBQUEsTUFDTCxNQUFNLEVBQUUsS0FBSztBQUFBLE1BQ2I7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFFSCxNQUFJLEtBQUssV0FBVyxHQUFHO0FBQ3JCLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFJQSxNQUFJLGFBQWE7QUFDakIsUUFBTSxRQUFRLEdBQUcsTUFBTTtBQUN2QixRQUFNLGdCQUF1QixDQUFDO0FBQzlCLGFBQVcsT0FBTyxNQUFNO0FBQ3RCLFVBQU0sRUFBQyxJQUFJLFlBQVksTUFBTSxLQUFJLElBQUk7QUFDckMsVUFBTSxXQUFXLEdBQUc7QUFBQSxNQUNsQixHQUFHLHNCQUFzQixJQUFJLFVBQVUsV0FBVyxJQUFJO0FBQUEsSUFDeEQ7QUFDQSxVQUFNLGVBQWUsR0FBRztBQUFBLE1BQ3RCLEdBQUcsc0JBQXNCLElBQUksVUFBVSxjQUFjLElBQUk7QUFBQSxJQUMzRDtBQUNBLFVBQU0sZUFBZSxHQUFHO0FBQUEsTUFDdEIsR0FBRyxzQkFBc0IsSUFBSSxVQUFVLGNBQWMsSUFBSTtBQUFBLElBQzNEO0FBQ0EsVUFBTSxFQUFDLGFBQWEsYUFBYSxHQUFHLElBQUcsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUd4RCxVQUFNLG1CQUFtQixJQUFJLG9CQUFvQjtBQUNqRCxVQUFNLG1CQUFtQixJQUFJLHFCQUFxQixlQUFlO0FBR2pFLFVBQU0sSUFBSSxjQUFjO0FBQUEsTUFDdEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsUUFBUSxLQUFLLFVBQVUsQ0FBQztBQUFBLE1BQ3hCLEtBQUs7QUFBQSxRQUNILEdBQUc7QUFBQSxRQUNIO0FBQUEsUUFDQTtBQUFBLFFBQ0EsYUFBYUMsWUFBVyxnQkFBZ0I7QUFBQSxRQUN4QyxhQUFhLGVBQWU7QUFBQSxNQUM5QjtBQUFBLElBQ0YsQ0FBQztBQUNELGtCQUFjO0FBR2QsVUFBTSxPQUFPLFlBQVk7QUFDekIsa0JBQWM7QUFJZCxVQUFNLE9BQU8sVUFBVTtBQUFBLE1BQ3JCLG1CQUFtQkEsWUFBVyxPQUFPO0FBQUEsTUFDckMsbUJBQW1CQSxZQUFXLE9BQU87QUFBQSxNQUNyQyx3QkFBd0I7QUFBQSxNQUN4Qix3QkFBd0I7QUFBQSxNQUN4QixtQkFBbUJBLFlBQVcsZ0JBQWdCO0FBQUEsTUFDOUMsbUJBQW1CLGVBQWU7QUFBQSxJQUNwQyxDQUFDO0FBQ0Qsa0JBQWM7QUFFZCxrQkFBYyxLQUFLLEdBQUc7QUFFdEIsUUFBSSxjQUFjLEtBQUs7QUFDckI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFFBQU0sTUFBTSxPQUFPO0FBQ25CLFVBQVEsSUFBSSxhQUFhLGNBQWMsTUFBTSxRQUFRO0FBQ3JELFNBQU87QUFDVDs7O0FFMU5BLE9BQU8sVUFBVTtBQUVqQjtBQUFBLEVBR0UsYUFBQUM7QUFBQSxFQUNBLGdCQUFBQztBQUFBLE9BQ0s7QUFDUCxPQUFPLFVBQVU7QUFNakIsSUFBTSx1QkFBdUIsSUFBSSxLQUFLO0FBYS9CLElBQU0sa0JBQU4sTUFBc0I7QUFBQSxFQUszQixZQUFZLFlBQXdCO0FBQ2xDLFNBQUssYUFBYTtBQUNsQixVQUFNQyxhQUFZLGFBQWEsVUFBVTtBQUN6QyxVQUFNLG1CQUFtQkEsV0FBVSxVQUFVO0FBQzdDLFVBQU0sWUFBWSxpQkFBaUIsTUFBTTtBQUN6QyxTQUFLLFlBQVk7QUFDakIsVUFBTSxNQUFNQSxXQUFVLGVBQWU7QUFDckMsU0FBSyxLQUFLQyxjQUFhLEdBQUc7QUFBQSxFQUM1QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBTSxlQUFlO0FBSW5CLFVBQU0sVUFBVSxNQUFNLEtBQUssV0FBVztBQUN0QyxVQUFNLG9CQUNKLFlBQVksSUFBSSxVQUFVLFVBQVU7QUFDdEMsVUFBTSxjQUFjLE1BQU0sS0FBSyxxQkFBcUIsaUJBQWlCO0FBQ3JFLFVBQU0sTUFBTUMsV0FBVSxJQUFJLEVBQUUsU0FBUztBQUNyQyxVQUFNLFdBQVcsWUFBWSxPQUFPLENBQUMsUUFBUTtBQUMzQyxZQUFNLGFBQWEsSUFBSSxJQUFJLFdBQVcsU0FBUztBQUMvQyxhQUFPLGNBQWMsTUFBTTtBQUFBLElBQzdCLENBQUM7QUFDRCxRQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3ZCLFdBQUssd0JBQXdCLFFBQVE7QUFBQSxJQUN2QztBQUNBLFNBQUssWUFBWSxHQUFHO0FBQUEsRUFDdEI7QUFBQSxFQUVBLE1BQWMsd0JBQXdCLFVBQTJCO0FBQy9ELFVBQU0sUUFBUSxLQUFLLEdBQUcsTUFBTTtBQUM1QixhQUFTLFFBQVEsQ0FBQyxZQUFZO0FBdEZsQztBQXVGTSxVQUFJLENBQUMsUUFBUSxjQUFjLENBQUMsUUFBUSxRQUFRLEdBQUMsYUFBUSxRQUFSLG1CQUFhLGFBQVk7QUFDcEU7QUFBQSxNQUNGO0FBQ0EsWUFBTSxtQkFBbUIsUUFBUSxJQUFJLFdBQVcsU0FBUztBQUN6RCxZQUFNLGNBQWMsWUFBWSxLQUFLLFNBQVMsZ0JBQWdCLFFBQVEsVUFBVSxXQUFXLFFBQVEsSUFBSSxhQUFhLGdCQUFnQjtBQUNwSSxjQUFRLElBQUksV0FBVztBQUN2QixZQUFNLGFBQWEsS0FBSyxHQUFHLElBQUksV0FBVztBQUMxQyxZQUFNLElBQUksWUFBWSxPQUFPO0FBQUEsSUFDL0IsQ0FBQztBQUNELFVBQU0sTUFBTSxPQUFPO0FBQ25CLFlBQVEsSUFBSSxtQkFBbUIsU0FBUyxNQUFNLFdBQVc7QUFBQSxFQUMzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFjLGFBQThCO0FBQzFDLFVBQU0sZ0JBQWdCLEtBQUssR0FBRyxXQUFXLFVBQVUsRUFBRSxJQUFJLEtBQUssU0FBUztBQUN2RSxVQUFNLGFBQWEsTUFBTSxjQUFjLElBQUk7QUFDM0MsUUFBSSxXQUFXLFFBQVE7QUFDckIsWUFBTSxPQUFPLFdBQVcsS0FBSyxLQUFLLENBQUM7QUFDbkMsWUFBTSxLQUFLLEtBQUs7QUFDaEIsVUFBSSxJQUFJO0FBQ04sZUFBTyxHQUFHLFNBQVM7QUFBQSxNQUNyQjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYyxZQUFZLFFBQWdCO0FBQ3hDLFVBQU0sS0FBS0EsV0FBVSxXQUFXLE1BQU07QUFDdEMsVUFBTSxnQkFBZ0IsS0FBSyxHQUFHLFdBQVcsVUFBVSxFQUFFLElBQUksS0FBSyxTQUFTO0FBQ3ZFLFVBQU0sY0FBYyxJQUFJLEVBQUMsaUJBQWlCLEdBQUUsR0FBRyxFQUFDLE9BQU8sS0FBSSxDQUFDO0FBQUEsRUFDOUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWMscUJBQXFCLFFBQTBDO0FBQzNFLFVBQU0sS0FBS0EsV0FBVSxXQUFXLE1BQU07QUFDdEMsVUFBTSxVQUEyQixDQUFDO0FBQ2xDLFVBQU0sZ0JBQWdCLE1BQU0sS0FBSyxnQkFBZ0I7QUFJakQsZUFBVyxnQkFBZ0IsZUFBZTtBQUN4QyxZQUFNLGlCQUFpQixZQUFZLEtBQUssU0FBUyxnQkFBZ0IsWUFBWTtBQUM3RSxZQUFNLFFBQWUsS0FBSyxHQUN2QixXQUFXLGNBQWMsRUFDekIsTUFBTSxrQkFBa0IsTUFBTSxFQUFFO0FBQ25DLFlBQU0sZ0JBQWdCLE1BQU0sTUFBTSxJQUFJO0FBQ3RDLG9CQUFjLFFBQVEsQ0FBQyxRQUFRO0FBQzdCLGdCQUFRLEtBQUssSUFBSSxLQUFLLENBQWtCO0FBQUEsTUFDMUMsQ0FBQztBQUFBLElBQ0g7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYyxrQkFBcUM7QUFDakQsVUFBTSxnQkFBMEIsQ0FBQztBQUNqQyxVQUFNLHNCQUFzQixNQUFNLEtBQUssZUFBZTtBQUFBLE1BQ3BELEtBQUssS0FBSyxLQUFLLEtBQUssV0FBVyxTQUFTLGFBQWE7QUFBQSxJQUN2RCxDQUFDO0FBQ0Qsd0JBQW9CLFFBQVEsQ0FBQyxhQUFhO0FBQ3hDLG9CQUFjLEtBQUssU0FBUyxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQUEsSUFDM0MsQ0FBQztBQUNELFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQzlKQSxlQUFzQixZQUFZLFlBQXdCO0FBQ3hELFFBQU0sUUFBUSxJQUFJO0FBQUEsSUFDaEIsV0FBVyx3QkFBd0IseUJBQXlCLFVBQVU7QUFBQSxJQUN0RSxXQUFXLGdCQUFnQixpQkFBaUIsVUFBVTtBQUFBLEVBQ3hELENBQUM7QUFDSDtBQUVBLGVBQWUsV0FDYixNQUNBLE9BQ0csTUFDSDtBQUNBLE1BQUk7QUFDRixVQUFNLEdBQUcsR0FBRyxJQUFJO0FBQUEsRUFDbEIsU0FBUyxLQUFLO0FBQ1osWUFBUSxJQUFJLGdCQUFnQixJQUFJLEVBQUU7QUFDbEMsWUFBUSxNQUFNLE9BQU8sSUFBSSxTQUFTLEdBQUcsQ0FBQztBQUN0QyxVQUFNO0FBQUEsRUFDUjtBQUNGO0FBRUEsZUFBZSx3QkFBd0IsWUFBd0I7QUFDN0QsUUFBTSxxQkFBcUIsVUFBVTtBQUN2QztBQUVBLGVBQWUsZ0JBQWdCLFlBQXdCO0FBQ3JELFFBQU0sVUFBVSxJQUFJLGdCQUFnQixVQUFVO0FBQzlDLFFBQU0sUUFBUSxhQUFhO0FBQzdCOzs7QUNoQ0EsU0FBUSxTQUFTLGdCQUFlO0FBQ2hDLFNBQVEsYUFBYSxvQkFBbUI7QUFFakMsU0FBUyxXQUFXLEtBR2hCO0FBQ1QsUUFBTSxVQUFVLElBQUksV0FBVyxDQUFDO0FBQ2hDLFFBQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQztBQUMxQixTQUFPLGFBQWEsTUFBTTtBQUFBLElBQ3hCLFFBQVE7QUFBQSxJQUNSLFNBQVM7QUFBQSxFQUNYLENBQUM7QUFDSDtBQUVPLFNBQVMsV0FBVyxXQUFtQjtBQUM1QyxRQUFNLE9BQU8sU0FBUyxXQUFXO0FBQUEsSUFDL0IsU0FBUztBQUFBLElBQ1Qsa0JBQWtCO0FBQUEsRUFDcEIsQ0FBQztBQUNELFNBQU87QUFDVDs7O0FMYk8sU0FBUyxJQUFJLFFBQWdCO0FBSWxDLFNBQU8sSUFBSSxxQkFBcUIsT0FBTyxLQUFjLFFBQWtCO0FBQ3JFLFFBQUk7QUFDRixZQUFNLFlBQVksSUFBSSxVQUFXO0FBQ2pDLFVBQUksT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFDLFNBQVMsS0FBSSxDQUFDO0FBQUEsSUFDdEMsU0FBUyxLQUFLO0FBQ1osY0FBUSxNQUFNLEdBQUc7QUFDakIsVUFBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUMsU0FBUyxNQUFLLENBQUM7QUFBQSxJQUN2QztBQUFBLEVBQ0YsQ0FBQztBQWtCRCxTQUFPLElBQUkseUJBQXlCLENBQUMsS0FBYyxRQUFrQjtBQUNuRSxRQUNFLElBQUksV0FBVyxVQUNmLENBQUMsT0FBTyxJQUFJLElBQUksY0FBYyxDQUFDLEVBQUUsV0FBVyxrQkFBa0IsR0FDOUQ7QUFDQSxVQUFJLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBQyxTQUFTLE9BQU8sT0FBTyxjQUFhLENBQUM7QUFBQSxJQUM3RDtBQUVBLFFBQUk7QUFDRixZQUFNLE9BQU8sSUFBSSxRQUFRLENBQUM7QUFDMUIsWUFBTSxVQUFVLEtBQUssV0FBVyxDQUFDO0FBQ2pDLFlBQU0sT0FBTyxLQUFLLFFBQVEsQ0FBQztBQUMzQixZQUFNLE1BQU0sV0FBVyxFQUFDLFNBQVMsS0FBSSxDQUFDO0FBQ3RDLFVBQUksVUFBVSxnQkFBZ0IsVUFBVTtBQUN4QyxVQUFJLFVBQVUsdUJBQXVCLGlDQUFpQztBQUN0RSxVQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksR0FBRztBQUFBLElBQ3pCLFNBQVMsS0FBSztBQUNaLGNBQVEsTUFBTSxJQUFJLFNBQVMsR0FBRztBQUM5QixVQUFJLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBQyxTQUFTLE9BQU8sT0FBTyxVQUFTLENBQUM7QUFBQSxJQUN6RDtBQUFBLEVBQ0YsQ0FBQztBQWtCRCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0Esb0JBQW9CO0FBQUEsSUFDcEIsQ0FBQyxLQUFjLFFBQWtCO0FBQy9CLFVBQUksSUFBSSxXQUFXLFVBQVUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLE1BQU0sTUFBTTtBQUMxRCxZQUFJLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBQyxTQUFTLE9BQU8sT0FBTyxjQUFhLENBQUM7QUFDM0Q7QUFBQSxNQUNGO0FBRUEsVUFBSTtBQUNGLGNBQU0sT0FBTyxJQUFJLE1BQU07QUFDdkIsY0FBTSxZQUFZLEtBQUssT0FBTyxTQUFTLE1BQU07QUFDN0MsY0FBTSxPQUFPLFdBQVcsU0FBUztBQUNqQyxZQUFJLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBQyxTQUFTLE1BQU0sTUFBTSxLQUFJLENBQUM7QUFBQSxNQUNsRCxTQUFTLEtBQUs7QUFDWixnQkFBUSxNQUFNLElBQUksU0FBUyxHQUFHO0FBQzlCLFlBQUksT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFDLFNBQVMsT0FBTyxPQUFPLFVBQVMsQ0FBQztBQUFBLE1BQ3pEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjs7O0FEekVBLElBQU0sWUFBWUMsTUFBSyxRQUFRLGNBQWMsWUFBWSxHQUFHLENBQUM7QUFLN0QsSUFBTSxzQkFBc0I7QUFxRTVCLFNBQVMsVUFBVSxnQkFBZ0M7QUFDakQsUUFBTSxLQUFLLEtBQUssT0FBTSxvQkFBSSxLQUFLLEdBQUUsUUFBUSxJQUFJLEdBQUk7QUFDakQsU0FBTyxNQUFNLGVBQWU7QUFDOUI7QUFFQSxTQUFTLGVBQWUsY0FBMkI7QUFDakQsUUFBTSxVQUFVO0FBQ2hCLE1BQUk7QUFDRixXQUFPLE9BQU8sT0FBTztBQUFBLEVBQ3ZCLFNBQVMsS0FBSztBQUNaLFFBQUksT0FBTyxJQUFJLFNBQVMsY0FBYztBQUNwQyxhQUFPO0FBQUEsUUFDTDtBQUFBLFVBQ0UsV0FBVztBQUFBLFVBQ1gsWUFBWSxtQkFBbUI7QUFBQSxRQUNqQztBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFFTyxTQUFTLFVBQVUsU0FBc0M7QUFDOUQsUUFBTSxpQkFBaUIsUUFBUTtBQUMvQixRQUFNLE1BQU0sZUFBZSxlQUFlLFNBQVM7QUFDbkQsUUFBTSxPQUFPLFFBQVEsR0FBRztBQU14QixXQUFTLGNBQWMsS0FBdUI7QUFDNUMsUUFBSSxJQUFJLFlBQVksV0FBVyxNQUFNLEdBQUc7QUFDdEMsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLE9BQU8sSUFBSSxNQUFNLE9BQU8sTUFBTSxRQUFRO0FBQ3hDLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFRQSxpQkFBZSxnQkFBZ0IsS0FBZ0M7QUFqSmpFO0FBa0pJLFVBQU0sV0FBVSxTQUFJLFNBQUosbUJBQVU7QUFDMUIsUUFBSSxDQUFDLFNBQVM7QUFDWixjQUFRLElBQUksMkJBQTJCO0FBQ3ZDLGFBQU87QUFBQSxJQUNUO0FBT0EsUUFBSSxRQUFRLElBQUksYUFBYSxlQUFlO0FBQzFDLGFBQU8sUUFBUSxPQUFPO0FBQUEsSUFDeEI7QUFFQSxRQUFJO0FBQ0YsWUFBTSxNQUFNLE1BQU0sS0FBSyxjQUFjLFNBQVMsSUFBSTtBQUNsRCxVQUFJLFVBQVUsR0FBRyxHQUFHO0FBQ2xCLGdCQUFRLElBQUksbUNBQW1DO0FBQy9DLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksZ0JBQWdCO0FBQ3JDLGdCQUFRLElBQUksZ0NBQWdDO0FBQzVDLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxRQUFRLGtCQUFrQjtBQUM1QixjQUFNLGFBQWEsTUFBTSxRQUFRLGlCQUFpQixLQUFLLEdBQUc7QUFDMUQsWUFBSSxDQUFDLFlBQVk7QUFDZixrQkFBUSxJQUFJLHNDQUFzQztBQUFBLFFBQ3BEO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGLFNBQVMsS0FBSztBQUNaLGNBQVEsTUFBTSw0QkFBNEI7QUFDMUMsY0FBUSxNQUFNLEdBQUc7QUFDakIsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQU1BLGlCQUFlLGtCQUFrQixLQUFnQztBQUMvRCxVQUFNLGdCQUFnQixJQUFJLFFBQVEsUUFBUSxtQkFBbUI7QUFDN0QsUUFBSSxDQUFDLGVBQWU7QUFDbEIsY0FBUSxJQUFJLG1DQUFtQztBQUMvQyxhQUFPO0FBQUEsSUFDVDtBQUlBLFFBQUksUUFBUSxJQUFJLGFBQWEsZUFBZTtBQUMxQyxhQUFPLFFBQVEsYUFBYTtBQUFBLElBQzlCO0FBRUEsUUFBSTtBQUNGLFlBQU0sTUFBTSxNQUFNLEtBQUssb0JBQW9CLGVBQWUsSUFBSTtBQUM5RCxVQUFJLFVBQVUsR0FBRyxHQUFHO0FBQ2xCLGdCQUFRLElBQUksa0NBQWtDO0FBQzlDLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksZ0JBQWdCO0FBQ3JDLGdCQUFRLElBQUksb0NBQW9DO0FBQ2hELGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxRQUFRLGtCQUFrQjtBQUM1QixjQUFNLGFBQWEsTUFBTSxRQUFRLGlCQUFpQixLQUFLLEdBQUc7QUFDMUQsWUFBSSxDQUFDLFlBQVk7QUFDZixrQkFBUSxJQUFJLGdDQUFnQztBQUFBLFFBQzlDO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxhQUFPO0FBQUEsSUFDVCxTQUFTLEtBQUs7QUFDWixjQUFRLE1BQU0sNEJBQTRCO0FBQzFDLGNBQVEsTUFBTSxHQUFHO0FBQ2pCLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtOLFdBQVcsTUFBTTtBQUNmLGFBQU87QUFBQSxJQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLQSxnQkFBZ0IsTUFBTTtBQUNwQixhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS0EsVUFBVSxPQUFPO0FBQUEsTUFDZixLQUFLQSxNQUFLLFFBQVEsV0FBVyxVQUFVO0FBQUEsSUFDekM7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBLGlCQUFpQixPQUNmLFFBQ0Esa0JBQ0c7QUFDSCxhQUFPLElBQUksV0FBVyxLQUFLLENBQUM7QUFFNUIscUJBQWUsWUFBWSxLQUFrQztBQUMzRCxZQUFJLGNBQWMsU0FBUyxPQUFPO0FBQ2hDLGdCQUFNLGNBQWNBLE1BQUssUUFBUSxXQUFXLFVBQVU7QUFDdEQsZ0JBQU1DLE9BQU8sTUFBTSxJQUFJLFdBQVk7QUFBQSxZQUNqQztBQUFBLFVBQ0Y7QUFDQSxpQkFBT0E7QUFBQSxRQUNUO0FBRUEsY0FBTSxnQkFBZ0JELE1BQUs7QUFBQSxVQUN6QixJQUFJLFdBQVk7QUFBQSxVQUNoQjtBQUFBLFFBQ0Y7QUFDQSxZQUFJLENBQUUsTUFBTSxXQUFXLGFBQWEsR0FBSTtBQUN0QyxnQkFBTSxJQUFJO0FBQUEsWUFDUjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsY0FBTUMsT0FBTyxNQUFNLE9BQU87QUFDMUIsZUFBT0E7QUFBQSxNQUNUO0FBRUEsWUFBTSxZQUFZRCxNQUFLLFFBQVEsV0FBVyxJQUFJO0FBQzlDLGFBQU8sSUFBSSxlQUFlLEtBQUssV0FBVyxFQUFDLEtBQUssTUFBSyxDQUFDLENBQUM7QUFHdkQsYUFBTyxJQUFJLGNBQWMsT0FBTyxLQUFjLFFBQWtCO0FBQzlELFlBQ0UsSUFBSSxXQUFXLFNBQ2YsSUFBSSxRQUFRLGNBQWMsTUFBTSxvQkFDaEM7QUFDQSxjQUFJO0FBQ0Ysa0JBQU0sZUFBZSxNQUFNLGdCQUFnQixHQUFHO0FBQzlDLGdCQUFJLENBQUMsY0FBYztBQUNqQixrQkFBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUMsU0FBUyxPQUFPLE9BQU8saUJBQWdCLENBQUM7QUFDOUQ7QUFBQSxZQUNGO0FBR0Esa0JBQU0sWUFBWSxLQUFLLEtBQUssS0FBSyxJQUFJO0FBQ3JDLGtCQUFNLFVBQVUsSUFBSSxLQUFLO0FBRXpCLGdCQUFJO0FBQ0osZ0JBQUksUUFBUSxJQUFJLGFBQWEsZUFBZTtBQUMxQyw4QkFBZ0I7QUFBQSxZQUNsQixPQUFPO0FBQ0wsOEJBQWdCLE1BQU0sS0FBSyxvQkFBb0IsU0FBUztBQUFBLGdCQUN0RDtBQUFBLGNBQ0YsQ0FBQztBQUFBLFlBQ0g7QUFDQSxnQkFBSSxRQUFRLFFBQVEscUJBQXFCLGFBQWE7QUFDdEQsZ0JBQUksWUFBWTtBQUNoQixnQkFBSSxLQUFLLEVBQUMsU0FBUyxLQUFJLENBQUM7QUFBQSxVQUMxQixTQUFTLEtBQUs7QUFDWixvQkFBUSxNQUFNLEdBQUc7QUFDakIsZ0JBQUksSUFBSSxPQUFPO0FBQ2Isc0JBQVEsTUFBTSxJQUFJLEtBQUs7QUFBQSxZQUN6QjtBQUNBLGdCQUNHLE9BQU8sR0FBRyxFQUNWLEtBQUssRUFBQyxTQUFTLE9BQU8sT0FBTyx1QkFBc0IsQ0FBQztBQUFBLFVBQ3pEO0FBQ0E7QUFBQSxRQUNGO0FBRUEsWUFBSTtBQUNGLGdCQUFNQyxPQUFNLE1BQU0sWUFBWSxHQUFHO0FBQ2pDLFVBQUFBLEtBQUksYUFBYSxLQUFLLEtBQUssT0FBTztBQUFBLFFBQ3BDLFNBQVMsS0FBSztBQUNaLGtCQUFRLE1BQU0sR0FBRztBQUNqQixjQUFJLElBQUksT0FBTztBQUNiLG9CQUFRLE1BQU0sSUFBSSxLQUFLO0FBQUEsVUFDekI7QUFDQSxjQUFJLE9BQU8sR0FBRyxFQUFFLEtBQUssc0JBQXNCO0FBQUEsUUFDN0M7QUFBQSxNQUNGLENBQUM7QUFHRCxhQUFPLElBQUksZUFBZSxPQUFPLEtBQWMsUUFBa0I7QUFDL0QsWUFBSSxRQUFRLFdBQVcsbUJBQW1CO0FBQzFDLFlBQUksWUFBWTtBQUNoQixZQUFJLFNBQVMsWUFBWTtBQUFBLE1BQzNCLENBQUM7QUFHRCxhQUFPLElBQUksT0FBTyxLQUFjLEtBQWUsU0FBdUI7QUFDcEUsWUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHO0FBQ3ZCLGVBQUs7QUFDTDtBQUFBLFFBQ0Y7QUFDQSxjQUFNLGlCQUFpQixNQUFNLGtCQUFrQixHQUFHO0FBQ2xELFlBQUksZ0JBQWdCO0FBQ2xCLGVBQUs7QUFDTDtBQUFBLFFBQ0Y7QUFHQSxZQUFJLElBQUksZ0JBQWdCLHFCQUFxQjtBQUMzQyxlQUFLO0FBQ0w7QUFBQSxRQUNGO0FBQ0EsWUFBSSxJQUFJLFlBQVksV0FBVyxVQUFVLEdBQUc7QUFDMUMsY0FBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUMsU0FBUyxPQUFPLE9BQU8saUJBQWdCLENBQUM7QUFDOUQ7QUFBQSxRQUNGO0FBQ0EsZ0JBQVEsSUFBSSwyQkFBMkI7QUFDdkMsY0FBTSxTQUFTLElBQUksZ0JBQWdCO0FBQUEsVUFDakMsVUFBVSxJQUFJO0FBQUEsUUFDaEIsQ0FBQztBQUNELFlBQUksU0FBUyxjQUFjLE9BQU8sU0FBUyxDQUFDLEVBQUU7QUFBQSxNQUNoRCxDQUFDO0FBR0QsVUFBSSxNQUFNO0FBR1YsYUFBTyxJQUFJLFFBQVEsT0FBTyxLQUFjLFFBQWtCO0FBQ3hELFlBQUk7QUFDRixnQkFBTUEsT0FBTSxNQUFNLFlBQVksR0FBRztBQUNqQyxnQkFBTUEsS0FBSSxVQUFVLEtBQUssS0FBSztBQUFBLFlBQzVCLFlBQVksSUFBSTtBQUFBLFlBQ2hCLFdBQVc7QUFBQSxZQUNYLGdCQUFnQixRQUFRO0FBQUEsVUFDMUIsQ0FBQztBQUFBLFFBQ0gsU0FBUyxLQUFLO0FBRVosa0JBQVEsTUFBTSxHQUFHO0FBQ2pCLGNBQUksT0FBTyxHQUFHLEVBQUUsS0FBSyxzQkFBc0I7QUFBQSxRQUM3QztBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLFdBQVcsVUFBb0M7QUFDdEQsU0FBTyxHQUNKLE9BQU8sUUFBUSxFQUNmLEtBQUssTUFBTSxJQUFJLEVBQ2YsTUFBTSxNQUFNLEtBQUs7QUFDdEI7IiwKICAibmFtZXMiOiBbInBhdGgiLCAiRmllbGRWYWx1ZSIsICJnZXRGaXJlc3RvcmUiLCAicGx1Z2luIiwgImNtc1BsdWdpbiIsICJnZXRGaXJlc3RvcmUiLCAiRmllbGRWYWx1ZSIsICJUaW1lc3RhbXAiLCAiZ2V0RmlyZXN0b3JlIiwgImNtc1BsdWdpbiIsICJnZXRGaXJlc3RvcmUiLCAiVGltZXN0YW1wIiwgInBhdGgiLCAiYXBwIl0KfQo=
|
|
567
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9wbHVnaW4udHMiLCAiLi4vY29yZS9hcGkudHMiLCAiLi4vY29yZS9ydW50aW1lLnRzIiwgIi4uL2NvcmUvY2xpZW50LnRzIiwgIi4uL2NvcmUvdmVyc2lvbnMudHMiLCAiLi4vY29yZS9jcm9uLnRzIiwgIi4uL2NvcmUvY3N2LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge3Byb21pc2VzIGFzIGZzfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHtcbiAgQ29uZmlndXJlU2VydmVyT3B0aW9ucyxcbiAgTmV4dEZ1bmN0aW9uLFxuICBQbHVnaW4sXG4gIFJlcXVlc3QsXG4gIFJlc3BvbnNlLFxuICBTZXJ2ZXIsXG59IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQgYm9keVBhcnNlciBmcm9tICdib2R5LXBhcnNlcic7XG5pbXBvcnQge1xuICBBcHAsXG4gIGFwcGxpY2F0aW9uRGVmYXVsdCxcbiAgZ2V0QXBwLFxuICBpbml0aWFsaXplQXBwLFxufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtnZXRBdXRoLCBEZWNvZGVkSWRUb2tlbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXV0aCc7XG5pbXBvcnQgc2lydiBmcm9tICdzaXJ2JztcbmltcG9ydCB7YXBpfSBmcm9tICcuL2FwaS5qcyc7XG5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG50eXBlIEFwcE1vZHVsZSA9IHR5cGVvZiBpbXBvcnQoJy4vYXBwLmpzJyk7XG5cbi8vIFRoZSBzZXNzaW9uIGtleSBuYW1lIHVzZWQgZm9yIFJvb3QgQ01TIGF1dGhlbnRpY2F0aW9uLlxuY29uc3QgU0VTU0lPTl9DT09LSUVfQVVUSCA9ICdyb290LWNtcy1hdXRoJztcblxuZXhwb3J0IHR5cGUgQ01TVXNlciA9IERlY29kZWRJZFRva2VuO1xuXG5leHBvcnQgdHlwZSBDTVNQbHVnaW5PcHRpb25zID0ge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBwcm9qZWN0LiBEYXRhIHdpbGwgYmUgc3RvcmVkIHVuZGVyIHRoZSBuYW1lc3BhY2VcbiAgICogYFByb2plY3RzLyR7aWR9YCBpbiBmaXJlc3RvcmUuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIFVzZWQgaW4gdGhlIGhlYWRlciBvZiB0aGUgQ01TIHRvIGhlbHAgaWRlbnRpZnlcbiAgICogdGhlIHByb2plY3QuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaXJlYmFzZSBjb25maWcgb2JqZWN0LCB3aGljaCBjYW4gYmUgb2J0YWluZWQgaW4gdGhlIEZpcmViYXNlIENvbnNvbGUgYnlcbiAgICogZ29pbmcgdG8gXCJQcm9qZWN0IFNldHRpbmdzXCIuXG4gICAqL1xuICBmaXJlYmFzZUNvbmZpZzoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICBhcGlLZXk6IHN0cmluZztcbiAgICBhdXRoRG9tYWluOiBzdHJpbmc7XG4gICAgcHJvamVjdElkOiBzdHJpbmc7XG4gICAgc3RvcmFnZUJ1Y2tldDogc3RyaW5nO1xuICAgIG1lc3NhZ2luZ1NlbmRlcklkOiBzdHJpbmc7XG4gICAgYXBwSWQ6IHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogR0FQSSBjcmVkZW50aWFscy4gSW5jbHVkZSBpZiB1c2luZyBHb29nbGUgRHJpdmUgYW5kIEdvb2dsZSBTaGVldHMgZmVhdHVyZXMuXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc2hlZXRzL2FwaS9xdWlja3N0YXJ0L2pzXG4gICAqL1xuICBnYXBpPzoge1xuICAgIC8qKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zaGVldHMvYXBpL3F1aWNrc3RhcnQvanMjY3JlYXRlX2FuX2FwaV9rZXkgKi9cbiAgICBhcGlLZXk6IHN0cmluZztcbiAgICAvKiogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc2hlZXRzL2FwaS9xdWlja3N0YXJ0L2pzI2F1dGhvcml6ZV9jcmVkZW50aWFsc19mb3JfYV93ZWJfYXBwbGljYXRpb24gKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZWNyZXQgdmFsdWUocykgdXNlZCBmb3Igc2lnbmluZyB0aGUgdXNlciBhdXRoZW50aWNhdGlvbiBjb29raWUuXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbm93IGhhbmRsZWQgZGlyZWN0bHkgYnkgcm9vdCdzIHNlc3Npb25NaWRkbGV3YXJlIHVuZGVyXG4gICAqIGBzZXJ2ZXIuc2Vzc2lvbkNvb2tpZVNlY3JldGAgaW4gcm9vdC5jb25maWcudHMuXG4gICAqL1xuICBjb29raWVTZWNyZXQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKiogRnVuY3Rpb24gY2FsbGVkIHRvIGNoZWNrIGlmIGEgdXNlciBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhlIENNUy4gKi9cbiAgaXNVc2VyQXV0aG9yaXplZD86IChcbiAgICByZXE6IFJlcXVlc3QsXG4gICAgdXNlcjogQ01TVXNlclxuICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBVUkwgdG8gR0NJIHNlcnZpY2UgZm9yIHRyYW5zZm9ybWluZyB1cGxvYWRlZCBHQ1MgaW1hZ2VzIHRvIGEgR29vZ2xlIEFwcFxuICAgKiBFbmdpbmUgSW1hZ2VzIEFQSSBzZXJ2aW5nIFVSTC5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIHRvIGB0cnVlYCB1c2VzIHRoZSBkZWZhdWx0IGhvc3RlZCBzZXJ2aWNlIGF0XG4gICAqIGh0dHBzOi8vZ2NpLnJvb3Rqcy5kZXYuXG4gICAqXG4gICAqIFRvIHNldCB1cCBHQ0k6XG4gICAqXG4gICAqIC0gQ3JlYXRlIGEgR0NTIGJ1Y2tldCB3aXRoIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9uc1xuICAgKiAtIFNoYXJlIG93bmVyIGFjY2VzcyB0byB0aGUgYnVja2V0IHdpdGggdGhlIHNlcnZpY2UgYWNjb3VudCByZXR1cm5lZCBpblxuICAgKiAgIGh0dHBzOi8vZ2NpLnJvb3Rqcy5kZXYvXy9zZXJ2aWNlX2FjY291bnRcbiAgICpcbiAgICogVG8gZGlzYWJsZSBHQ0ksIGxlYXZlIHRoaXMgdmFsdWUgZW1wdHkgb3Igc2V0IHRvIGBmYWxzZWAsIHdoaWNoIHdoaWNoIHdpbGxcbiAgICogc2VydmUgaW1hZ2VzIGRpcmVjdGx5IGZyb20gR0NTIGluc3RlYWQuXG4gICAqL1xuICBnY2k/OiBzdHJpbmcgfCBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQ01TUGx1Z2luID0gUGx1Z2luICYge1xuICBuYW1lOiAncm9vdC1jbXMnO1xuICBnZXRDb25maWc6ICgpID0+IENNU1BsdWdpbk9wdGlvbnM7XG4gIGdldEZpcmViYXNlQXBwOiAoKSA9PiBBcHA7XG59O1xuXG5mdW5jdGlvbiBpc0V4cGlyZWQoZGVjb2RlZElkVG9rZW46IERlY29kZWRJZFRva2VuKSB7XG4gIGNvbnN0IHRzID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApO1xuICByZXR1cm4gdHMgPj0gZGVjb2RlZElkVG9rZW4uZXhwO1xufVxuXG5mdW5jdGlvbiBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQ6IHN0cmluZyk6IEFwcCB7XG4gIGNvbnN0IGFwcE5hbWUgPSAncm9vdC1jbXMnO1xuICB0cnkge1xuICAgIHJldHVybiBnZXRBcHAoYXBwTmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdhcHAvbm8tYXBwJykge1xuICAgICAgcmV0dXJuIGluaXRpYWxpemVBcHAoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9qZWN0SWQ6IGdjcFByb2plY3RJZCxcbiAgICAgICAgICBjcmVkZW50aWFsOiBhcHBsaWNhdGlvbkRlZmF1bHQoKSxcbiAgICAgICAgfSxcbiAgICAgICAgYXBwTmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbXNQbHVnaW4ob3B0aW9uczogQ01TUGx1Z2luT3B0aW9ucyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IGZpcmViYXNlQ29uZmlnID0gb3B0aW9ucy5maXJlYmFzZUNvbmZpZztcbiAgY29uc3QgYXBwID0gZ2V0RmlyZWJhc2VBcHAoZmlyZWJhc2VDb25maWcucHJvamVjdElkKTtcbiAgY29uc3QgYXV0aCA9IGdldEF1dGgoYXBwKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGxvZ2luIGlzIHJlcXVpcmVkIGZvciB0aGUgcmVxdWVzdC4gQ3VycmVudGx5IHJldHVybnMgYHRydWVgIGlmXG4gICAqIHRoZSBVUkwgcGF0aCBzdGFydHMgd2l0aCAvY21zIG9yIGlmID9wcmV2aWV3PXRydWUgaXMgaW4gdGhlIFVSTC5cbiAgICovXG4gIGZ1bmN0aW9uIGxvZ2luUmVxdWlyZWQocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gICAgaWYgKHJlcS5vcmlnaW5hbFVybC5zdGFydHNXaXRoKCcvY21zJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlcS5xdWVyeS5wcmV2aWV3KSA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGEgbmV3IGxvZ2luIHJlcXVlc3QgZm9yIGEgdXNlci4gVGhlIHJlcXVlc3QgYm9keSBzaG91bGQgY29udGFpblxuICAgKiBhbiBpZFRva2VuLCB3aGljaCBpcyB2ZXJpZmllZCBvbiBwcm9kIHVzaW5nIEZpcmViYXNlIEFkbWluIGFuZCBJZGVudGl0eVxuICAgKiBUb29sa2l0LiBJZiBhIGBpc1VzZXJBdXRob3JpemVkKClgIGNvbmZpZyBpcyBzZXQsIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvXG4gICAqIHZlcmlmeSB2aWEgdGhhdCBmdW5jdGlvbi4gUmV0dXJucyB0cnVlIGlmIHRoZSBsb2dpbiB2ZXJpZmljYXRpb24gc3VjY2VlZHMuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiB2ZXJpZnlVc2VyTG9naW4ocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaWRUb2tlbiA9IHJlcS5ib2R5Py5pZFRva2VuO1xuICAgIGlmICghaWRUb2tlbikge1xuICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGZhaWxlZDogbm8gaWQgdG9rZW4nKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBPbiBsb2NhbCBkZXYsIHNpbXBseSB2ZXJpZnkgdGhhdCBhbiBpZFRva2VuIGlzIHNldC4gVGhlIGlkZW50aXR5IHRvb2xraXRcbiAgICAvLyB0aGF0IHZlcmlmaWVzIGlkIHRva2VucyByZXF1aXJlcyBhIHNlcnZpY2UgYWNjb3VudCwgd2hpY2ggd2Ugd2FudCB0b1xuICAgIC8vIGF2b2lkIGhhdmluZyB0byBzZXQgdXAgd2hlbiB1c2VycyBhcmUgZG9pbmcgbG9jYWwgZGV2ZWxvcG1lbnQuXG4gICAgLy8gQXV0aGVudGljYXRpb24gaXMgc3RpbGwgcmVxdWlyZWQgYnkgdGhlIGZyb250ZW5kIHVzaW5nIEZpcmViYXNlIEF1dGgsXG4gICAgLy8gdGhpcyBqdXN0IGJ5cGFzc2VzIHRoZSBpbml0aWFsIHNlcnZlciBjaGVjayBiZWZvcmUgdGhlIHVpIGlzIHJlbmRlcmVkLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oaWRUb2tlbik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGp3dCA9IGF3YWl0IGF1dGgudmVyaWZ5SWRUb2tlbihpZFRva2VuLCB0cnVlKTtcbiAgICAgIGlmIChpc0V4cGlyZWQoand0KSkge1xuICAgICAgICBjb25zb2xlLmxvZygnbG9naW4gZmFpbGVkOiBpZCB0b2tlbiBpcyBleHBpcmVkJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghand0LmVtYWlsIHx8ICFqd3QuZW1haWxfdmVyaWZpZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGZhaWxlZDogZW1haWwgdW52ZXJpZmllZCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKSB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZWQgPSBhd2FpdCBvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQocmVxLCBqd3QpO1xuICAgICAgICBpZiAoIWF1dGhvcml6ZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnbG9naW4gZmFpbGVkOiB1c2VyIGlzIG5vdCBhdXRob3JpemVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gdmVyaWZ5IGp3dCB0b2tlbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBUT0RPKHN0ZXZlbmxlKTogZGVjaWRlIHdoZXRoZXIgd2Ugd2FudCB0byBlbmZvcmNlIGBpc1VzZXJBdXRob3JpemVkKClgLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBzZXNzaW9uIHNob3VsZCBiZSBhbGxvd2VkIHRvIGFjY2VzcyB0aGVcbiAgICogQ01TLiBSZXR1cm5zIHRydWUgaWYgYWNjZXNzIGlzIGdyYW50ZWQuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiB2ZXJpZnlVc2VyU2Vzc2lvbihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzZXNzaW9uQ29va2llID0gcmVxLnNlc3Npb24uZ2V0SXRlbShTRVNTSU9OX0NPT0tJRV9BVVRIKTtcbiAgICBpZiAoIXNlc3Npb25Db29raWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdzZXNzaW9uIGZhaWxlZDogbm8gc2Vzc2lvbiBjb29raWUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBPbiBsb2NhbCBkZXYsIHNpbXBseSB2ZXJpZnkgdGhhdCBhbiBzZXNzaW9uIGNvb2tpZSBpcyBzZXQuIFNlZSBub3RlXG4gICAgLy8gYWJvdmUgaW4gYHZlcmlmeVVzZXJMb2dpbigpYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHNlc3Npb25Db29raWUpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqd3QgPSBhd2FpdCBhdXRoLnZlcmlmeVNlc3Npb25Db29raWUoc2Vzc2lvbkNvb2tpZSwgdHJ1ZSk7XG4gICAgICBpZiAoaXNFeHBpcmVkKGp3dCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiB0b2tlbiBpcyBleHBpcmVkJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghand0LmVtYWlsIHx8ICFqd3QuZW1haWxfdmVyaWZpZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiBlbWFpbCBub3QgdmVyaWZpZWQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZCkge1xuICAgICAgICBjb25zdCBhdXRob3JpemVkID0gYXdhaXQgb3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKHJlcSwgand0KTtcbiAgICAgICAgaWYgKCFhdXRob3JpemVkKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhdXRob3JpemVkO1xuICAgICAgfVxuICAgICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGRlY2lkZSB3aGV0aGVyIHdlIHdhbnQgdG8gZW5mb3JjZSBgaXNVc2VyQXV0aG9yaXplZCgpYC5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHZlcmlmeSBqd3QgdG9rZW4nKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdyb290LWNtcycsXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb25maWcgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHBsdWdpbi5cbiAgICAgKi9cbiAgICBnZXRDb25maWc6ICgpID0+IHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBGaXJlYmFzZSBBcHAgaW5zdGFuY2UgdXNlZCBieSB0aGUgcGx1Z2luLlxuICAgICAqL1xuICAgIGdldEZpcmViYXNlQXBwOiAoKSA9PiB7XG4gICAgICByZXR1cm4gYXBwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIG1hcCBvZiBzc3IgZmlsZXMgdG8gaW5jbHVkZSB3aGVuIHJ1bm5pbmcgYHJvb3QgYnVpbGRgLlxuICAgICAqL1xuICAgIHNzcklucHV0OiAoKSA9PiAoe1xuICAgICAgY21zOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9hcHAuanMnKSxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIENNUy1zcGVjaWZpYyBtaWRkbGV3YXJlIHRvIHRoZSBSb290LmpzIHNlcnZlci5cbiAgICAgKi9cbiAgICBjb25maWd1cmVTZXJ2ZXI6IGFzeW5jIChcbiAgICAgIHNlcnZlcjogU2VydmVyLFxuICAgICAgc2VydmVyT3B0aW9uczogQ29uZmlndXJlU2VydmVyT3B0aW9uc1xuICAgICkgPT4ge1xuICAgICAgc2VydmVyLnVzZShib2R5UGFyc2VyLmpzb24oKSk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldFJlbmRlcmVyKHJlcTogUmVxdWVzdCk6IFByb21pc2U8QXBwTW9kdWxlPiB7XG4gICAgICAgIGlmIChzZXJ2ZXJPcHRpb25zLnR5cGUgPT09ICdkZXYnKSB7XG4gICAgICAgICAgY29uc3QgYXBwRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9hcHAuanMnKTtcbiAgICAgICAgICBjb25zdCBhcHAgPSAoYXdhaXQgcmVxLnZpdGVTZXJ2ZXIhLnNzckxvYWRNb2R1bGUoXG4gICAgICAgICAgICBhcHBGaWxlUGF0aFxuICAgICAgICAgICkpIGFzIEFwcE1vZHVsZTtcbiAgICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwSW1wb3J0UGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICByZXEucm9vdENvbmZpZyEucm9vdERpcixcbiAgICAgICAgICAnZGlzdC9zZXJ2ZXIvY21zLmpzJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIShhd2FpdCBmaWxlRXhpc3RzKGFwcEltcG9ydFBhdGgpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdkaXN0L3NlcnZlci9jbXMuanMgbm90IGZvdW5kLiBydW4gYHJvb3QgYnVpbGRgIHRvIGNyZWF0ZSBpdC4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcHAgPSAoYXdhaXQgaW1wb3J0KGFwcEltcG9ydFBhdGgpKSBhcyBBcHBNb2R1bGU7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXRpY0RpciA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICd1aScpO1xuICAgICAgc2VydmVyLnVzZSgnL2Ntcy9zdGF0aWMnLCBzaXJ2KHN0YXRpY0Rpciwge2RldjogZmFsc2V9KSk7XG5cbiAgICAgIC8vIExvZ2luIGhhbmRsZXIuXG4gICAgICBzZXJ2ZXIudXNlKCcvY21zL2xvZ2luJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxLm1ldGhvZCA9PT0gJ1BVVCcgJiZcbiAgICAgICAgICByZXEuaGVhZGVyc1snY29udGVudC10eXBlJ10gPT09ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaXNBdXRob3JpemVkID0gYXdhaXQgdmVyaWZ5VXNlckxvZ2luKHJlcSk7XG4gICAgICAgICAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgICAgICAgICByZXMuc3RhdHVzKDQwMSkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnTk9UX0FVVEhPUklaRUQnfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IHNlc3Npb24gZXhwaXJhdGlvbiB0byA1IGRheXMuXG4gICAgICAgICAgICBjb25zdCBleHBpcmVzSW4gPSA2MCAqIDYwICogMjQgKiA1ICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IGlkVG9rZW4gPSByZXEuYm9keS5pZFRva2VuITtcblxuICAgICAgICAgICAgbGV0IHNlc3Npb25Db29raWU6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gaWRUb2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlc3Npb25Db29raWUgPSBhd2FpdCBhdXRoLmNyZWF0ZVNlc3Npb25Db29raWUoaWRUb2tlbiwge1xuICAgICAgICAgICAgICAgIGV4cGlyZXNJbixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc2Vzc2lvbi5zZXRJdGVtKFNFU1NJT05fQ09PS0lFX0FVVEgsIHNlc3Npb25Db29raWUpO1xuICAgICAgICAgICAgcmVzLnNhdmVTZXNzaW9uKCk7XG4gICAgICAgICAgICByZXMuanNvbih7c3VjY2VzczogdHJ1ZX0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAgICAgICAgIC5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVTktOT1dOX1NFUlZFUl9FUlJPUid9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhcHAgPSBhd2FpdCBnZXRSZW5kZXJlcihyZXEpO1xuICAgICAgICAgIGFwcC5yZW5kZXJTaWduSW4ocmVxLCByZXMsIG9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnVU5LTk9XTiBTRVJWRVIgRVJST1InKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvZ291dCBoYW5kbGVyLlxuICAgICAgc2VydmVyLnVzZSgnL2Ntcy9sb2dvdXQnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHJlcy5zZXNzaW9uLnJlbW92ZUl0ZW0oU0VTU0lPTl9DT09LSUVfQVVUSCk7XG4gICAgICAgIHJlcy5zYXZlU2Vzc2lvbigpO1xuICAgICAgICByZXMucmVkaXJlY3QoJy9jbXMvbG9naW4nKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYWZlZ3VhcmQgdG8gdmVyaWZ5IHVzZXIgbG9naW4gYmVmb3JlIHJlbmRlcmluZyBhbnkgQ01TIHBhZ2UuXG4gICAgICBzZXJ2ZXIudXNlKGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgICAgICBpZiAoIWxvZ2luUmVxdWlyZWQocmVxKSkge1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlcklzTG9nZ2VkSW4gPSBhd2FpdCB2ZXJpZnlVc2VyU2Vzc2lvbihyZXEpO1xuICAgICAgICBpZiAodXNlcklzTG9nZ2VkSW4pIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbG93IHRoZSBjcm9uIHRvIHJ1biB1bmF1dGhlbnRpY2F0ZWQuIFRoZSBjcm9uIGpvYiBpcyByZXNwb25zaWJsZVxuICAgICAgICAvLyBmb3Igc2F2aW5nIHZlcnNpb24gaGlzdG9yeS5cbiAgICAgICAgaWYgKHJlcS5vcmlnaW5hbFVybCA9PT0gJy9jbXMvYXBpL2Nyb24ucnVuJykge1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcS5vcmlnaW5hbFVybC5zdGFydHNXaXRoKCcvY21zL2FwaScpKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ05PVF9BVVRIT1JJWkVEJ30pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygncmVkaXJlY3RpbmcgdG8gbG9naW4gcGFnZScpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICBjb250aW51ZTogcmVxLm9yaWdpbmFsVXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLnJlZGlyZWN0KGAvY21zL2xvZ2luPyR7cGFyYW1zLnRvU3RyaW5nKCl9YCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUmVnaXN0ZXIgQVBJIGhhbmRsZXJzLlxuICAgICAgYXBpKHNlcnZlcik7XG5cbiAgICAgIC8vIFJlbmRlciB0aGUgQ01TIFNQQS5cbiAgICAgIHNlcnZlci51c2UoJy9jbXMnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgZ2V0UmVuZGVyZXIocmVxKTtcbiAgICAgICAgICBhd2FpdCBhcHAucmVuZGVyQXBwKHJlcSwgcmVzLCB7XG4gICAgICAgICAgICByb290Q29uZmlnOiByZXEucm9vdENvbmZpZyxcbiAgICAgICAgICAgIGNtc0NvbmZpZzogb3B0aW9ucyxcbiAgICAgICAgICAgIGZpcmViYXNlQ29uZmlnOiBvcHRpb25zLmZpcmViYXNlQ29uZmlnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBUT0RPKHN0ZXZlbmxlKTogcmVuZGVyIGEgY3VzdG9tIGVycm9yIHBhZ2UuXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5zZW5kKCdVTktOT1dOIFNFUlZFUiBFUlJPUicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKGZpbGVwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGZzXG4gICAgLmFjY2VzcyhmaWxlcGF0aClcbiAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7XG59XG4iLCAiaW1wb3J0IHtTZXJ2ZXIsIFJlcXVlc3QsIFJlc3BvbnNlfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHttdWx0aXBhcnRNaWRkbGV3YXJlfSBmcm9tICdAYmxpbmtrL3Jvb3QvbWlkZGxld2FyZSc7XG5pbXBvcnQge3J1bkNyb25Kb2JzfSBmcm9tICcuL2Nyb24uanMnO1xuaW1wb3J0IHthcnJheVRvQ3N2LCBjc3ZUb0FycmF5fSBmcm9tICcuL2Nzdi5qcyc7XG5cbi8qKlxuICogUmVnaXN0ZXJzIEFQSSBtaWRkbGV3YXJlIGhhbmRsZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpKHNlcnZlcjogU2VydmVyKSB7XG4gIC8qKlxuICAgKiBSdW5zIENNUyBjcm9uIGpvYnMuXG4gICAqL1xuICBzZXJ2ZXIudXNlKCcvY21zL2FwaS9jcm9uLnJ1bicsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVuQ3JvbkpvYnMocmVxLnJvb3RDb25maWchKTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7c3VjY2VzczogZmFsc2V9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBY2NlcHRzIGEgSlNPTiBvYmplY3QgY29udGFpbmluZyB7aGVhZGVyczogWy4uLl0sIHJvd3M6IFsuLi5dfSBhbmQgc2VuZHNcbiAgICogYW4gSFRUUCByZXNwb25zZSB3aXRoIGEgY29ycmVzcG9uZGluZyBDU1YgZmlsZSBhcyBhbiBhdHRhY2htZW50LlxuICAgKlxuICAgKiBTYW1wbGUgcmVxdWVzdDpcbiAgICpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJoZWFkZXJzXCI6IFtcImZvb1wiXSxcbiAgICogICBcInJvd3NcIjogW1xuICAgKiAgICAge1wiZm9vXCI6IFwiYmFyXCJ9LFxuICAgKiAgICAge1wiZm9vXCI6IFwiYmF6XCJ9LFxuICAgKiAgIF1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHNlcnZlci51c2UoJy9jbXMvYXBpL2Nzdi5kb3dubG9hZCcsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoXG4gICAgICByZXEubWV0aG9kICE9PSAnUE9TVCcgfHxcbiAgICAgICFTdHJpbmcocmVxLmdldCgnY29udGVudC10eXBlJykpLnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICAgICkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0JBRF9SRVFVRVNUJ30pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5ID0gcmVxLmJvZHkgfHwge307XG4gICAgICBjb25zdCBoZWFkZXJzID0gYm9keS5oZWFkZXJzIHx8IFtdO1xuICAgICAgY29uc3Qgcm93cyA9IGJvZHkucm93cyB8fCBbXTtcbiAgICAgIGNvbnN0IGNzdiA9IGFycmF5VG9Dc3Yoe2hlYWRlcnMsIHJvd3N9KTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2NzdicpO1xuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50OyBmaWxlbmFtZT1cImRhdGEuY3N2XCInKTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5lbmQoY3N2KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTid9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgQ1NWIGZpbGUgYW5kIHJldHVybnMgYSBKU09OIGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZVxuICAgKiBDU1YuXG4gICAqXG4gICAqIFNhbXBsZSByZXNwb25zZTpcbiAgICpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJzdWNjZXNzXCI6IHRydWUsXG4gICAqICAgXCJkYXRhXCI6IFtcbiAgICogICAgIHtcImZvb1wiOiBcImJhclwifSxcbiAgICogICAgIHtcImZvb1wiOiBcImJhelwifSxcbiAgICogICBdXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzZXJ2ZXIudXNlKFxuICAgICcvY21zL2FwaS9jc3YuaW1wb3J0JyxcbiAgICBtdWx0aXBhcnRNaWRkbGV3YXJlKCksXG4gICAgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlcS5tZXRob2QgIT09ICdQT1NUJyB8fCAhcmVxLmZpbGVzIHx8ICFyZXEuZmlsZXMuZmlsZSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnQkFEX1JFUVVFU1QnfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHJlcS5maWxlcy5maWxlO1xuICAgICAgICBjb25zdCBjc3ZTdHJpbmcgPSBmaWxlLmJ1ZmZlci50b1N0cmluZygndXRmOCcpO1xuICAgICAgICBjb25zdCByb3dzID0gY3N2VG9BcnJheShjc3ZTdHJpbmcpO1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YTogcm93c30pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVycik7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVTktOT1dOJ30pO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cbiIsICIvKiogQGRlcHJlY2F0ZWQgVXNlIGNsaWVudC50cyBpbnN0ZWFkLiAqL1xuXG5pbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge1xuICBGaWVsZFZhbHVlLFxuICBRdWVyeSxcbiAgVGltZXN0YW1wLFxuICBnZXRGaXJlc3RvcmUsXG59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5pbXBvcnQge1xuICBMb2FkVHJhbnNsYXRpb25zT3B0aW9ucyxcbiAgTG9jYWxlVHJhbnNsYXRpb25zLFxuICBUcmFuc2xhdGlvbixcbiAgVHJhbnNsYXRpb25zTWFwLFxuICBnZXRDbXNQbHVnaW4sXG4gIHRyYW5zbGF0aW9uc0ZvckxvY2FsZSxcbiAgdW5tYXJzaGFsRGF0YSxcbn0gZnJvbSAnLi9jbGllbnQuanMnO1xuXG4vKipcbiAqIFJldHJpZXZlcyBhIGRvYyBmcm9tIFJvb3QuanMgQ01TLlxuICogQGRlcHJlY2F0ZWQgVXNlIFJvb3RDTVNDbGllbnQuZ2V0RG9jKCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvYzxUPihcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIHNsdWc6IHN0cmluZyxcbiAgb3B0aW9uczoge1xuICAgIG1vZGU6ICdkcmFmdCcgfCAncHVibGlzaGVkJztcbiAgfVxuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoYXBwKTtcbiAgLy8gU2x1Z3Mgd2l0aCBzbGFzaGVzIGFyZSBlbmNvZGVkIGFzIGAtLWAgaW4gdGhlIERCLlxuICBzbHVnID0gc2x1Zy5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICBjb25zdCBkb2NSZWYgPSBkYi5kb2MoZGJQYXRoKTtcbiAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICBpZiAoZG9jLmV4aXN0cykge1xuICAgIGNvbnN0IGRhdGEgPSBkb2MuZGF0YSgpO1xuICAgIHJldHVybiB1bm1hcnNoYWxEYXRhKGRhdGEpIGFzIFQ7XG4gIH1cbiAgY29uc29sZS5sb2coYGRvYyBub3QgZm91bmQ6ICR7ZGJQYXRofWApO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMaXN0cyBkb2NzIGZyb20gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICogQGRlcHJlY2F0ZWQgVXNlIFJvb3RDTVNDbGllbnQubGlzdERvY3MoKSBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdERvY3M8VD4oXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgbW9kZTogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvcmRlckJ5Pzogc3RyaW5nO1xuICAgIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xuICB9XG4pOiBQcm9taXNlPHtkb2NzOiBUW119PiB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGxldCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIGlmIChvcHRpb25zLmxpbWl0KSB7XG4gICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KTtcbiAgfVxuICBpZiAob3B0aW9ucy5vZmZzZXQpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5Lm9mZnNldChvcHRpb25zLm9mZnNldCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShvcHRpb25zLm9yZGVyQnksIG9wdGlvbnMub3JkZXJCeURpcmVjdGlvbik7XG4gIH1cbiAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICB9XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgY29uc3QgZG9jczogVFtdID0gW107XG4gIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgY29uc3QgZG9jID0gdW5tYXJzaGFsRGF0YShyZXN1bHQuZGF0YSgpKSBhcyBUO1xuICAgIGRvY3MucHVzaChkb2MpO1xuICB9KTtcbiAgcmV0dXJuIHtkb2NzfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jcyBpbiBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gKiBAZGVwcmVjYXRlZCBVc2UgUm9vdENNU0NsaWVudC5nZXREb2NzQ291bnQoKSBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnVtRG9jcyhcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICBtb2RlOiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG4gICAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbiAgfVxuKSB7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gIGNvbnN0IGFwcCA9IGNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtwcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gIGxldCBxdWVyeTogUXVlcnkgPSBkYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgcmV0dXJuIGNvdW50O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAqIEBkZXByZWNhdGVkIFVzZSBSb290Q01TQ2xpZW50LnB1Ymxpc2hTY2hlZHVsZWREb2NzKCkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG5cbiAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3Byb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICBjb25zdCBub3cgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAvLyBGaWx0ZXIgZG9jcyBieSBwcm9qZWN0LlxuICAgICAgaWYgKCFkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gRmlsdGVyIGRvY3Mgd2hlcmUgc2NoZWR1bGVkQXQgaXMgaW4gdGhlIHBhc3QuXG4gICAgICAvLyBOT1RFKHN0ZXZlbmxlKTogdGhlIGZpbHRlcmluZyBpcyBkb25lIG1hbnVhbGx5IGluc3RlYWQgb2YgdXNpbmcgYSBxdWVyeVxuICAgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBpbmRleCBpbiBmaXJlc3RvcmUuXG4gICAgICBjb25zdCBkYXRhID0gZC5kYXRhKCkgfHwge307XG4gICAgICBjb25zdCBzY2hlZHVsZWRBdDogVGltZXN0YW1wIHwgdW5kZWZpbmVkID0gZGF0YS5zeXM/LnNjaGVkdWxlZEF0O1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc2NoZWR1bGVkQXQgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMoKSA8PSBub3dcbiAgICAgICk7XG4gICAgfSlcbiAgICAubWFwKChkKSA9PiB7XG4gICAgICBjb25zdCBkYlBhdGggPSBkLnJlZi5wYXRoO1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBkYlBhdGguc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHNsdWcgPSBzZWdtZW50cy5hdCgtMSk7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gc2VnbWVudHMuYXQoLTMpO1xuICAgICAgY29uc3QgaWQgPSBgJHtjb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGQuZGF0YSgpLFxuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gIGNvbnN0IGJhdGNoID0gZGIuYmF0Y2goKTtcbiAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1ZywgZGF0YX0gPSBkb2M7XG4gICAgY29uc3QgZHJhZnRSZWYgPSBkYi5kb2MoXG4gICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICk7XG4gICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gZGIuZG9jKFxuICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICApO1xuICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IGRiLmRvYyhcbiAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgKTtcbiAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID0gc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gc2NoZWR1bGVkQXQ7XG4gICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9IHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAnJyk7XG5cbiAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgaWQsXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgc2x1ZyxcbiAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICBzeXM6IHtcbiAgICAgICAgLi4uc3lzLFxuICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICBwdWJsaXNoZWRBdDogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgcHVibGlzaGVkQnk6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAvLyBSZW1vdmUgcHVibGlzaGVkIGRvYy5cbiAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEJ5JzogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgIH0pO1xuICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgaWYgKGJhdGNoQ291bnQgPj0gNDk4KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICByZXR1cm4gcHVibGlzaGVkRG9jcztcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYFJvb3RDTVNDbGllbnQubG9hZFRyYW5zbGF0aW9ucygpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUcmFuc2xhdGlvbnMoXG4gIHJvb3RDb25maWc6IFJvb3RDb25maWcsXG4gIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBwcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gIGNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGFwcCk7XG5cbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7cHJvamVjdElkfS9UcmFuc2xhdGlvbnNgO1xuICBsZXQgcXVlcnk6IFF1ZXJ5ID0gZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICBpZiAob3B0aW9ucz8udGFncykge1xuICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgcXVlcnlTbmFwc2hvdC5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBoYXNoID0gZG9jLmlkO1xuICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gIH0pO1xuICByZXR1cm4gdHJhbnNsYXRpb25zTWFwO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgUm9vdENNU0NsaWVudC5sb2FkVHJhbnNsYXRpb25zRm9yTG9jYWxlKClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgcm9vdENvbmZpZzogUm9vdENvbmZpZyxcbiAgbG9jYWxlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuKTogUHJvbWlzZTxMb2NhbGVUcmFuc2xhdGlvbnM+IHtcbiAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgbG9hZFRyYW5zbGF0aW9ucyhyb290Q29uZmlnLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRyYW5zbGF0aW9uc0ZvckxvY2FsZSh0cmFuc2xhdGlvbnNNYXAsIGxvY2FsZSk7XG59XG4iLCAiaW1wb3J0IGNyeXB0byBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1BsdWdpbiwgUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7QXBwfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtcbiAgRmllbGRWYWx1ZSxcbiAgRmlyZXN0b3JlLFxuICBRdWVyeSxcbiAgVGltZXN0YW1wLFxuICBnZXRGaXJlc3RvcmUsXG59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5pbXBvcnQge0NNU1BsdWdpbn0gZnJvbSAnLi9wbHVnaW4uanMnO1xuXG4vKipcbiAqIE1heCBudW1iZXIgb2YgZG9jcyB0aGF0IGNhbiBiZSBwdWJsaXNoZWQgYXQgb25jZSBieSBgcHVibGlzaERvY3MoKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUJMSVNIX0RPQ1NfQkFUQ0hfTElNSVQgPSAxMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jPEZpZWxkcyA9IGFueT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIGZpZWxkczogRmllbGRzO1xufVxuXG5leHBvcnQgdHlwZSBEb2NNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdldERvY09wdGlvbnMge1xuICAvKiogTW9kZSwgZWl0aGVyIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiLiAqL1xuICBtb2RlOiBEb2NNb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldERvY09wdGlvbnMge1xuICAvKiogTW9kZSwgZWl0aGVyIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiLiAqL1xuICBtb2RlOiBEb2NNb2RlO1xuICAvKipcbiAgICogRW1haWwgb2YgdXNlciBtb2RpZnlpbmcgdGhlIGRvYy4gSWYgYmxhbmssIGRlZmF1bHRzIHRvIGByb290LWNtcy1jbGllbnRgLlxuICAgKi9cbiAgbW9kaWZpZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RG9jc09wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvcmRlckJ5Pzogc3RyaW5nO1xuICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Q291bnRPcHRpb25zIHtcbiAgbW9kZTogRG9jTW9kZTtcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbiB7XG4gIFtsb2NhbGU6IHN0cmluZ106IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25zTWFwIHtcbiAgW2hhc2g6IHN0cmluZ106IFRyYW5zbGF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsZVRyYW5zbGF0aW9ucyB7XG4gIFtzb3VyY2U6IHN0cmluZ106IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkVHJhbnNsYXRpb25zT3B0aW9ucyB7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RDTVNDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY21zUGx1Z2luOiBDTVNQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEZpcmVzdG9yZTtcblxuICBjb25zdHJ1Y3Rvcihyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZztcbiAgICB0aGlzLmNtc1BsdWdpbiA9IGdldENtc1BsdWdpbih0aGlzLnJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IHRoaXMuY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgIHRoaXMucHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5hcHAgPSB0aGlzLmNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICAgIHRoaXMuZGIgPSBnZXRGaXJlc3RvcmUodGhpcy5hcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBkb2MgZGF0YSBmcm9tIFJvb3QuanMgQ01TLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jPEZpZWxkcyA9IGFueT4oXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbiAgKTogUHJvbWlzZTxEb2M8RmllbGRzPiB8IG51bGw+IHtcbiAgICBjb25zdCByYXdEYXRhID0gYXdhaXQgdGhpcy5nZXRSYXdEb2MoY29sbGVjdGlvbklkLCBzbHVnLCBvcHRpb25zKTtcbiAgICBpZiAocmF3RGF0YSkge1xuICAgICAgcmV0dXJuIHVubWFyc2hhbERhdGEocmF3RGF0YSkgYXMgRG9jPEZpZWxkcz47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyByYXcgZG9jIGRhdGEgYXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS4gT25seSB1c2UgdGhpcyBpZiB5b3Uga25vd1xuICAgKiB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAqL1xuICBhc3luYyBnZXRSYXdEb2MoXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbiAgKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIC8vIFNsdWdzIHdpdGggc2xhc2hlcyBhcmUgZW5jb2RlZCBhcyBgLS1gIGluIHRoZSBEQi5cbiAgICBzbHVnID0gc2x1Zy5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgc2V0UmF3RG9jKFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgb3B0aW9uczogU2V0RG9jT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGF3YWl0IGRvY1JlZi5zZXQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgZG9jcyBmcm9tIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGxpc3REb2NzPFQ+KFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IExpc3REb2NzT3B0aW9uc1xuICApOiBQcm9taXNlPHtkb2NzOiBUW119PiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9mZnNldChvcHRpb25zLm9mZnNldCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShvcHRpb25zLm9yZGVyQnksIG9wdGlvbnMub3JkZXJCeURpcmVjdGlvbik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgZG9jczogVFtdID0gW107XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IHVubWFyc2hhbERhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICAgIGRvY3MucHVzaChkb2MpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ZG9jc307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3MgaW4gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jc0NvdW50KGNvbGxlY3Rpb25JZDogc3RyaW5nLCBvcHRpb25zOiBHZXRDb3VudE9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgICBjb25zdCBjb3VudCA9IHJlc3VsdHMuZGF0YSgpLmNvdW50O1xuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBwdWJsaXNoZXMgYSBzZXQgb2YgZG9jcyBieSBpZC5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hEb2NzKGRvY0lkczogc3RyaW5nW10sIG9wdGlvbnM/OiB7cHVibGlzaGVkQnk6IHN0cmluZ30pIHtcbiAgICBjb25zdCBwcm9qZWN0Q29sbGVjdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgICBjb25zdCBwdWJsaXNoZWRCeSA9IG9wdGlvbnM/LnB1Ymxpc2hlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuXG4gICAgLy8gRmV0Y2ggdGhlIGN1cnJlbnQgZHJhZnQgZGF0YSBmb3IgZWFjaCBkb2MuXG4gICAgY29uc3QgZG9jUmVmcyA9IGRvY0lkcy5tYXAoKGRvY0lkKSA9PiB7XG4gICAgICBjb25zdCBbY29sbGVjdGlvbiwgc2x1Z10gPSBkb2NJZC5zcGxpdCgnLycpO1xuICAgICAgaWYgKCFjb2xsZWN0aW9uIHx8ICFzbHVnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkb2MgaWQ6ICR7ZG9jSWR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZG9jUmVmO1xuICAgIH0pO1xuICAgIGNvbnN0IGRvY1NuYXBzaG90cyA9IGF3YWl0IHRoaXMuZGIuZ2V0QWxsKC4uLmRvY1JlZnMpO1xuICAgIGNvbnN0IGRvY3MgPSBkb2NTbmFwc2hvdHNcbiAgICAgIC8vIFJldHJpZXZlIHNuYXBzaG90IGRhdGEgZm9yIGVhY2ggZG9jLlxuICAgICAgLm1hcCgoc25hcHNob3QpID0+IHNuYXBzaG90LmRhdGEoKSBhcyBEb2MpXG4gICAgICAvLyBSZW1vdmUgZG9jcyB0aGF0IGRvbid0IGV4aXN0LlxuICAgICAgLmZpbHRlcigoZCkgPT4gISFkKTtcblxuICAgIGlmIChkb2NzLmxlbmd0aCA+IFBVQkxJU0hfRE9DU19CQVRDSF9MSU1JVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcHVibGlzaERvY3MoKSBoYXMgYSBsaW1pdCBvZiAke1BVQkxJU0hfRE9DU19CQVRDSF9MSU1JVH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gICAgLy8gLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBjb25zdCBwdWJsaXNoZWREb2NzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1Zywgc3lzLCBmaWVsZHN9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCk7XG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEJ5ID0gc3lzLmZpcnN0UHVibGlzaGVkQnkgPz8gcHVibGlzaGVkQnk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZmllbGRzIHx8IHt9LFxuICAgICAgICBzeXM6IHtcbiAgICAgICAgICAuLi5zeXMsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBSZW1vdmUgc2NoZWR1bGVkIGRvYywgaWYgYW55LlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHB1Ymxpc2hlZEJ5LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0OTgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hTY2hlZHVsZWREb2NzKCkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgICBjb25zdCBkb2NzID0gc25hcHNob3QuZG9jc1xuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICAvLyBGaWx0ZXIgZG9jcyBieSBwcm9qZWN0LlxuICAgICAgICBpZiAoIWQucmVmLnBhdGguc3RhcnRzV2l0aChwcm9qZWN0Q29sbGVjdGlvbnNQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWx0ZXIgZG9jcyB3aGVyZSBzY2hlZHVsZWRBdCBpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBtYW51YWxseSBpbnN0ZWFkIG9mIHVzaW5nIGEgcXVlcnlcbiAgICAgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBpbmRleCBpbiBmaXJlc3RvcmUuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBkLmRhdGEoKSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVkQXQ6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCA9IGRhdGEuc3lzPy5zY2hlZHVsZWRBdDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzY2hlZHVsZWRBdCAmJiBzY2hlZHVsZWRBdC50b01pbGxpcyAmJiBzY2hlZHVsZWRBdC50b01pbGxpcygpIDw9IG5vd1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGQpID0+IHtcbiAgICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBkYlBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3Qgc2x1ZyA9IHNlZ21lbnRzLmF0KC0xKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgICAgY29uc3QgaWQgPSBgJHtjb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgIHNsdWcsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ25vIGRvY3MgdG8gc2NoZWR1bGUnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBFYWNoIHRyYW5zYWN0aW9uIG9yIGJhdGNoIGNhbiB3cml0ZSBhIG1heCBvZiA1MDAgb3BzLlxuICAgIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0O1xuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50Jyk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnLFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0OTgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRyYW5zbGF0aW9ucyBzYXZlZCBpbiB0aGUgdHJhbnNsYXRpb25zIGNvbGxlY3Rpb24sIG9wdGlvbmFsbHlcbiAgICogZmlsdGVyZWQgYnkgdGFnLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCI8aGFzaD5cIjoge1wic291cmNlXCI6IFwiSGVsbG9cIiwgXCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2FkVHJhbnNsYXRpb25zKFxuICAgIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zbGF0aW9uc01hcD4ge1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9UcmFuc2xhdGlvbnNgO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucz8udGFncykge1xuICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgndGFncycsICdhcnJheS1jb250YWlucy1hbnknLCBvcHRpb25zLnRhZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCA9IHt9O1xuICAgIHF1ZXJ5U25hcHNob3QuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgICBjb25zdCBoYXNoID0gZG9jLmlkO1xuICAgICAgdHJhbnNsYXRpb25zTWFwW2hhc2hdID0gZG9jLmRhdGEoKSBhcyBUcmFuc2xhdGlvbjtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhbnNsYXRpb25zTWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgbWFwIG9mIHRyYW5zbGF0aW9ucywgZS5nLjpcbiAgICogYGBgXG4gICAqIGF3YWl0IGNsaWVudC5zYXZlVHJhbnNsYXRpb25zKHtcbiAgICogICBcIkhlbGxvXCI6IHtcImVzXCI6IFwiSG9sYVwiLCBcImZyXCI6IFwiQm9uam91clwifSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2F2ZVRyYW5zbGF0aW9ucyhcbiAgICB0cmFuc2xhdGlvbnM6IHtcbiAgICAgIFtzb3VyY2U6IHN0cmluZ106IHtbbG9jYWxlOiBzdHJpbmddOiBzdHJpbmd9O1xuICAgIH0sXG4gICAgdGFncz86IHN0cmluZ1tdXG4gICkge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgT2JqZWN0LmVudHJpZXModHJhbnNsYXRpb25zKS5mb3JFYWNoKChbc291cmNlLCBzb3VyY2VUcmFuc2xhdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRUcmFuc2xhdGlvbktleShzb3VyY2UpO1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25SZWYgPSB0aGlzLmRiLmRvYyhgJHt0cmFuc2xhdGlvbnNQYXRofS8ke2hhc2h9YCk7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSB7XG4gICAgICAgIC4uLnNvdXJjZVRyYW5zbGF0aW9ucyxcbiAgICAgICAgc291cmNlOiB0aGlzLm5vcm1hbGl6ZVN0cmluZyhzb3VyY2UpLFxuICAgICAgfTtcbiAgICAgIGlmICh0YWdzKSB7XG4gICAgICAgIGRhdGEudGFncyA9IHRhZ3M7XG4gICAgICB9XG4gICAgICBiYXRjaC51cGRhdGUodHJhbnNsYXRpb25SZWYsIGRhdGEpO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuICAgIH0pO1xuICAgIGlmIChiYXRjaENvdW50ID4gNTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VwIHRvIDUwMCB0cmFuc2xhdGlvbnMgY2FuIGJlIHNhdmVkIGF0IGEgdGltZS4nKTtcbiAgICB9XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgXCJrZXlcIiB1c2VkIGZvciBhIHRyYW5zbGF0aW9uIGFzIHN0b3JlZCBpbiB0aGUgZGIuIFRyYW5zbGF0aW9uc1xuICAgKiBhcmUgc3RvcmVkIHVuZGVyIGBQcm9qZWN0cy88cHJvamVjdCBpZD4vVHJhbnNsYXRpb25zLzxzaGExIGhhc2g+YC5cbiAgICovXG4gIGdldFRyYW5zbGF0aW9uS2V5KHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2hhMSA9IGNyeXB0b1xuICAgICAgLmNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZSh0aGlzLm5vcm1hbGl6ZVN0cmluZyhzb3VyY2UpKVxuICAgICAgLmRpZ2VzdCgnaGV4Jyk7XG4gICAgcmV0dXJuIHNoYTE7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIGEgc3RyaW5nIHRoYXQncyB1c2VkIGZvciB0cmFuc2xhdGlvbnMuIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gUmVtb3ZlcyBhbnkgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAqIC0gUmVtb3ZlcyBzcGFjZXMgYXQgdGhlIGVuZCBvZiBhbnkgbGluZVxuICAgKi9cbiAgbm9ybWFsaXplU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgbGluZXMgPSBTdHJpbmcoc3RyKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltRW5kKCkpO1xuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgZm9yIGEgcGFydGljdWxhciBsb2NhbGUuXG4gICAqXG4gICAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxMb2NhbGVUcmFuc2xhdGlvbnM+IHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNNYXAgPSBhd2FpdCB0aGlzLmxvYWRUcmFuc2xhdGlvbnMob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc0ZvckxvY2FsZSh0cmFuc2xhdGlvbnNNYXAsIGxvY2FsZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENtc1BsdWdpbihyb290Q29uZmlnOiBSb290Q29uZmlnKTogQ01TUGx1Z2luIHtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSByb290Q29uZmlnLnBsdWdpbnMgfHwgW107XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCgocGx1Z2luKSA9PiBwbHVnaW4ubmFtZSA9PT0gJ3Jvb3QtY21zJyk7XG4gIGlmICghcGx1Z2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByb290LWNtcyBwbHVnaW4gY29uZmlnIGluIHJvb3QuY29uZmlnLnRzJyk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbiBhcyBDTVNQbHVnaW47XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIGRhdGEgdHJlZSBhbmQgY29udmVydHMgYW55IFRpbWVzdGFtcCBvYmplY3RzIHRvIG1pbGxpcyBhbmQgYW55XG4gKiBfYXJyYXkgbWFwcyB0byBub3JtYWwgYXJyYXlzLlxuICpcbiAqIEUuZy46XG4gKlxuICogbm9ybWFsaXplRGF0YSh7XG4gKiAgIHN5czoge21vZGlmaWVkQXQ6IFRpbWVzdGFtcCgxMjMpfSxcbiAqICAgZmllbGRzOiB7XG4gKiAgICAgX2FycmF5OiBbJ2FzZGYnXSxcbiAqICAgICBhc2RmOiB7dGl0bGU6ICdoZWxsbyd9XG4gKiAgIH1cbiAqIH0pXG4gKiAvLyA9PiB7c3lzOiB7bW9kaWZpZWRBdDogMTIzfSwgZmllbGRzOiB7Zm9vOiBbe3RpdGxlOiAnaGVsbG8nfV19fVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tYXJzaGFsRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YVtrZXldO1xuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBpZiAodmFsLnRvTWlsbGlzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsLnRvTWlsbGlzKCk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5oYXNPd24odmFsLCAnX2FycmF5JykgJiYgQXJyYXkuaXNBcnJheSh2YWwuX2FycmF5KSkge1xuICAgICAgICBjb25zdCBhcnIgPSB2YWwuX2FycmF5Lm1hcCgoYXJyYXlLZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi51bm1hcnNoYWxEYXRhKHZhbFthcnJheUtleV0gfHwge30pLFxuICAgICAgICAgICAgX2FycmF5S2V5OiBhcnJheUtleSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBhcnI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IHVubWFyc2hhbERhdGEodmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgYHVubWFyc2hhbERhdGEoKWAgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIHJldHVybiB1bm1hcnNoYWxEYXRhKGRhdGEpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5T2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBfYXJyYXk6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYW4gYXJyYXkgaW50byBhbiBgQXJyYXlPYmplY3RgLCBlLmcuOlxuICpcbiAqIGBgYFxuICogbWFyc2hhbEFycmF5KFsxLCAyLCAzXSlcbiAqIC8vID0+IHthOiAxLCBiOiAyLCBjOiAzLCBfYXJyYXk6IFsnYScsICdiJywgJ2MnXX1cbiAqIGBgYFxuICpcbiAqIFRoaXMgZGF0YWJhc2Ugc3RvcmFnZSBtZXRob2QgbWFrZXMgaXQgZWFzaWVyIHRvIHVwZGF0ZSBhIHNpbmdsZSBmaWVsZCBpbiBhXG4gKiBkZWVwbHkgbmVzdGVkIGFycmF5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcnNoYWxBcnJheShhcnI6IGFueVtdKTogQXJyYXlPYmplY3Qge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIHJldHVybiBhcnI7XG4gIH1cbiAgY29uc3QgYXJyT2JqZWN0OiBBcnJheU9iamVjdCA9IHtfYXJyYXk6IFtdfTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgIGNvbnN0IGtleSA9IHJhbmRTdHJpbmcoNik7XG4gICAgYXJyT2JqZWN0W2tleV0gPSBpdGVtO1xuICAgIGFyck9iamVjdC5fYXJyYXkucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBhcnJPYmplY3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYEFycmF5T2JqZWN0YCB0byBhIG5vcm1hbCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbEFycmF5KGFyck9iamVjdDogQXJyYXlPYmplY3QpOiBhbnlbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJPYmplY3Q/Ll9hcnJheSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgYXJyID0gYXJyT2JqZWN0Ll9hcnJheS5tYXAoKGs6IHN0cmluZykgPT4gYXJyT2JqZWN0W2tdKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmFuZFN0cmluZyhsZW46IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBjaGFycyA9XG4gICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHJhbmQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpO1xuICAgIHJlc3VsdC5wdXNoKGNoYXJzLmNoYXJBdChyYW5kKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHRyYW5zbGF0aW9ucyBtYXAgZnJvbSBgbG9hZFRyYW5zbGF0aW9ucygpYCB0byBhIG1hcCBvZiBzb3VyY2UgdG9cbiAqIHRyYW5zbGF0ZWQgc3RyaW5nIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICpcbiAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAqIGBgYFxuICoge1xuICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gIHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwLFxuICBsb2NhbGU6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGxvY2FsZVRyYW5zbGF0aW9uczogTG9jYWxlVHJhbnNsYXRpb25zID0ge307XG4gIE9iamVjdC52YWx1ZXModHJhbnNsYXRpb25zTWFwKS5mb3JFYWNoKChzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmcuc291cmNlO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gc3RyaW5nW2xvY2FsZV0gfHwgc3RyaW5nLmVuIHx8IHN0cmluZy5zb3VyY2U7XG4gICAgbG9jYWxlVHJhbnNsYXRpb25zW3NvdXJjZV0gPSB0cmFuc2xhdGlvbjtcbiAgfSk7XG4gIHJldHVybiBsb2NhbGVUcmFuc2xhdGlvbnM7XG59XG4iLCAiLyoqXG4gKiBEb2N1bWVudCB2ZXJpb24gaGlzdG9yeS5cbiAqXG4gKiBWZXJpb25zIHNhdmUgdGhlIHN0YXRlIG9mIGEgZG9jdW1lbnQgYXQgZGlmZmVyZW50IG1vbWVudHMgaW4gdGltZSwgYWxsb3dpbmdcbiAqIHVzZXJzIHRvIHJldmVydCBiYWNrIHRvIGEgdmVyc2lvbiBpZi93aGVuIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2F2ZVZlcnNpb25zKCkgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgcnVuIHdpdGhpbiBhIGNyb24gam9iIChlLmcgdXNpbmdcbiAqIGZpcmViYXNlIGZ1bmN0aW9ucykuIEV2ZXJ5IG1pbnV0ZSwgdGhlIHJ1bm5lciBjaGVja3MgZm9yIGFsbCBkb2N1bWVudHMgdGhhdFxuICogaGF2ZSBiZWVuIGVkaXRlZCBzaW5jZSB0aGUgbGFzdCBydW4uIFRvIGF2b2lkIHNhdmluZyBcInBhcnRpYWxcIiB2ZXJzaW9uc1xuICogKHdoZW4gdGhlIHVzZXIgbWlnaHQgYmUgaW4gdGhlIG1pZGRsZSBvZiBlZGl0aW5nIGEgZG9jdW1lbnQpLCB2ZXJzaW9ucyBvbmx5XG4gKiBydW4gb24gZG9jdW1lbnRzIHRoYXQgaGF2ZW4ndCBiZWVuIGVkaXRlZCB3aXRoaW4gdGhlIGxhc3QgNSBtaW5zIHRvIGVuc3VyZVxuICogdGhhdCB2ZXJzaW9uIGlzIFwic3RhYmxlXCIuXG4gKlxuICogSW4gdGhlIGRhdGFiYXNlLCB2ZXJzaW9ucyBhcmUgc3RvcmVkIGFzOlxuICogL1Byb2plY3RzLzxwcm9qZWN0SWQ+L0NvbGxlY3Rpb25zLzxjb2xsZWN0aW9uSWQ+L0RyYWZ0cy88ZG9jSWQ+L1ZlcnNpb25zLzx0aW1lc3RhbXA+XG4gKlxuICogV2hlcmUgPHRpbWVzdGFtcD4gaXMgdGhlIHVuaXggdGltZXN0YW1wIChtaWxsaXMpIHRoYXQgdGhlIGRvY3VtZW50IHdhcyBsYXN0XG4gKiBlZGl0ZWQuXG4gKi9cblxuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7Um9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7XG4gIEZpcmVzdG9yZSxcbiAgUXVlcnksXG4gIFRpbWVzdGFtcCxcbiAgZ2V0RmlyZXN0b3JlLFxufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IGdsb2IgZnJvbSAndGlueS1nbG9iJztcbmltcG9ydCB7Z2V0Q21zUGx1Z2lufSBmcm9tICcuL2NsaWVudC5qcyc7XG5cbi8vIFRvIGF2b2lkIHNhdmluZyBcInBhcnRpYWxcIiB2ZXJzaW9ucyAod2hlbiB0aGUgdXNlciBtaWdodCBiZSBpbiB0aGUgbWlkZGxlIG9mXG4vLyBlZGl0aW5nIGEgZG9jdW1lbnQpLCB2ZXJzaW9ucyBvbmx5IHJ1biBvbiBkb2N1bWVudHMgdGhhdCBoYXZlbid0IGJlZW4gZWRpdGVkXG4vLyB3aXRoaW4gdGhlIGxhc3QgNSBtaW5zIHRvIGVuc3VyZSB0aGF0IHZlcnNpb24gaXMgXCJzdGFibGVcIi5cbmNvbnN0IERPQ1VNRU5UX1NBVkVfT0ZGU0VUID0gNSAqIDYwICogMTAwMDtcblxuaW50ZXJmYWNlIFBhcnRpYWxDTVNEb2Mge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGlkOiBzdHJpbmc7XG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBtb2RpZmllZEF0OiBUaW1lc3RhbXA7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgVmVyc2lvbnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3RJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRiOiBGaXJlc3RvcmU7XG5cbiAgY29uc3RydWN0b3Iocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICAgIHRoaXMucm9vdENvbmZpZyA9IHJvb3RDb25maWc7XG4gICAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICAgIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5wcm9qZWN0SWQgPSBwcm9qZWN0SWQ7XG4gICAgY29uc3QgYXBwID0gY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gICAgdGhpcy5kYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgdmVyc2lvbiBvZiBhbGwgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGVkaXRlZCBzaW5jZSB0aGUgbGFzdCBydW4uXG4gICAqL1xuICBhc3luYyBzYXZlVmVyc2lvbnMoKSB7XG4gICAgLy8gT2Zmc2V0IHRoZSBcImxhc3QgcnVuXCIgdGltZSBieSA1IG1pbnMuIFZlcnNpb25zIGlnbm9yZSBkb2NzIHRoYXQgd2VyZVxuICAgIC8vIGVkaXRlZCB3aXRoaW4gdGhlIGxhc3QgNSBtaW5zIHRvIGF2b2lkIHBvdGVudGlhbCBcInBhcnRpYWxcIiB2ZXJzaW9ucyB3aGVuXG4gICAgLy8gdXNlciBpcyBpbiB0aGUgbWlkZGxlIG9mIGVkaXRpbmcgYSBkb2N1bWVudC5cbiAgICBjb25zdCBsYXN0UnVuID0gYXdhaXQgdGhpcy5nZXRMYXN0UnVuKCk7XG4gICAgY29uc3QgbGFzdFJ1bldpdGhPZmZzZXQgPVxuICAgICAgbGFzdFJ1biA9PT0gMCA/IGxhc3RSdW4gOiBsYXN0UnVuIC0gRE9DVU1FTlRfU0FWRV9PRkZTRVQ7XG4gICAgY29uc3QgY2hhbmdlZERvY3MgPSBhd2FpdCB0aGlzLmdldERvY3NNb2RpZmllZEFmdGVyKGxhc3RSdW5XaXRoT2Zmc2V0KTtcbiAgICBjb25zdCBub3cgPSBUaW1lc3RhbXAubm93KCkudG9NaWxsaXMoKTtcbiAgICBjb25zdCB2ZXJzaW9ucyA9IGNoYW5nZWREb2NzLmZpbHRlcigoZG9jKSA9PiB7XG4gICAgICBjb25zdCBtb2RpZmllZEF0ID0gZG9jLnN5cy5tb2RpZmllZEF0LnRvTWlsbGlzKCk7XG4gICAgICByZXR1cm4gbW9kaWZpZWRBdCA8PSBub3cgLSBET0NVTUVOVF9TQVZFX09GRlNFVDtcbiAgICB9KTtcbiAgICBpZiAodmVyc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zYXZlVmVyc2lvbnNUb0ZpcmVzdG9yZSh2ZXJzaW9ucyk7XG4gICAgfVxuICAgIHRoaXMuc2F2ZUxhc3RSdW4obm93KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVZlcnNpb25zVG9GaXJlc3RvcmUodmVyc2lvbnM6IFBhcnRpYWxDTVNEb2NbXSkge1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIHZlcnNpb25zLmZvckVhY2goKHZlcnNpb24pID0+IHtcbiAgICAgIGlmICghdmVyc2lvbi5jb2xsZWN0aW9uIHx8ICF2ZXJzaW9uLnNsdWcgfHwgIXZlcnNpb24uc3lzPy5tb2RpZmllZEF0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vZGlmaWVkQXRNaWxsaXMgPSB2ZXJzaW9uLnN5cy5tb2RpZmllZEF0LnRvTWlsbGlzKCk7XG4gICAgICBjb25zdCB2ZXJzaW9uUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke3ZlcnNpb24uY29sbGVjdGlvbn0vRHJhZnRzLyR7dmVyc2lvbi5zbHVnfS9WZXJzaW9ucy8ke21vZGlmaWVkQXRNaWxsaXN9YDtcbiAgICAgIGNvbnNvbGUubG9nKHZlcnNpb25QYXRoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25SZWYgPSB0aGlzLmRiLmRvYyh2ZXJzaW9uUGF0aCk7XG4gICAgICBiYXRjaC5zZXQodmVyc2lvblJlZiwgdmVyc2lvbik7XG4gICAgfSk7XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgY29uc29sZS5sb2coYHZlcnNpb25zOiBzYXZlZCAke3ZlcnNpb25zLmxlbmd0aH0gdmVyc2lvbnNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXN0IHRpbWUgKGluIG1pbGxpcykgc2F2ZVZlcnNpb25zKCkgd2FzIHJ1biwgb3IgMCBpZiBoYXNcbiAgICogbmV2ZXIgYmVlbiBydW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldExhc3RSdW4oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBwcm9qZWN0RG9jUmVmID0gdGhpcy5kYi5jb2xsZWN0aW9uKCdQcm9qZWN0cycpLmRvYyh0aGlzLnByb2plY3RJZCk7XG4gICAgY29uc3QgcHJvamVjdERvYyA9IGF3YWl0IHByb2plY3REb2NSZWYuZ2V0KCk7XG4gICAgaWYgKHByb2plY3REb2MuZXhpc3RzKSB7XG4gICAgICBjb25zdCBkYXRhID0gcHJvamVjdERvYy5kYXRhKCkgfHwge307XG4gICAgICBjb25zdCB0cyA9IGRhdGEudmVyc2lvbnNMYXN0UnVuIGFzIFRpbWVzdGFtcDtcbiAgICAgIGlmICh0cykge1xuICAgICAgICByZXR1cm4gdHMudG9NaWxsaXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMge3ZlcnNpb25MYXN0UnVuOiA8dGltZXN0YW1wPn0gdG8gdGhlIFByb2plY3RzLzxwcm9qZWN0SWQ+IGRvYy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUxhc3RSdW4obWlsbGlzOiBudW1iZXIpIHtcbiAgICBjb25zdCB0cyA9IFRpbWVzdGFtcC5mcm9tTWlsbGlzKG1pbGxpcyk7XG4gICAgY29uc3QgcHJvamVjdERvY1JlZiA9IHRoaXMuZGIuY29sbGVjdGlvbignUHJvamVjdHMnKS5kb2ModGhpcy5wcm9qZWN0SWQpO1xuICAgIGF3YWl0IHByb2plY3REb2NSZWYuc2V0KHt2ZXJzaW9uc0xhc3RSdW46IHRzfSwge21lcmdlOiB0cnVlfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGRvY3MgdGhhdCB3ZXJlIGVkaXRlZCBhZnRlciBhIGNlcnRhaW4gdGltZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RG9jc01vZGlmaWVkQWZ0ZXIobWlsbGlzOiBudW1iZXIpOiBQcm9taXNlPFBhcnRpYWxDTVNEb2NbXT4ge1xuICAgIGNvbnN0IHRzID0gVGltZXN0YW1wLmZyb21NaWxsaXMobWlsbGlzKTtcbiAgICBjb25zdCByZXN1bHRzOiBQYXJ0aWFsQ01TRG9jW10gPSBbXTtcbiAgICBjb25zdCBjb2xsZWN0aW9uSWRzID0gYXdhaXQgdGhpcy5saXN0Q29sbGVjdGlvbnMoKTtcbiAgICAvLyBOT1RFOiBJbmRpdmlkdWFsIGNvbGxlY3Rpb25zIGFyZSBxdWVyaWVkIGluc3RlYWQgb2YgdXNpbmcgYVxuICAgIC8vIGNvbGxlY3Rpb25Hcm91cCBxdWVyeSBiZWNhdXNlIHRoZSBsYXR0ZXIgcmVxdWlyZXMgYSBmaXJlc3RvcmUgaW5kZXggdG8gYmVcbiAgICAvLyBzZXQgdXAuXG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uSWQgb2YgY29sbGVjdGlvbklkcykge1xuICAgICAgY29uc3QgY29sbGVjdGlvblBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9L0RyYWZ0c2A7XG4gICAgICBjb25zdCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiXG4gICAgICAgIC5jb2xsZWN0aW9uKGNvbGxlY3Rpb25QYXRoKVxuICAgICAgICAud2hlcmUoJ3N5cy5tb2RpZmllZEF0JywgJz49JywgdHMpO1xuICAgICAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgICAgcXVlcnlTbmFwc2hvdC5mb3JFYWNoKChkb2MpID0+IHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGRvYy5kYXRhKCkgYXMgUGFydGlhbENNU0RvYyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgY29sbGVjdGlvbiBpZHMgZm9yIHRoZSBSb290IHByb2plY3QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RDb2xsZWN0aW9ucygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgY29sbGVjdGlvbklkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjb2xsZWN0aW9uRmlsZU5hbWVzID0gYXdhaXQgZ2xvYignKi5zY2hlbWEudHMnLCB7XG4gICAgICBjd2Q6IHBhdGguam9pbih0aGlzLnJvb3RDb25maWcucm9vdERpciwgJ2NvbGxlY3Rpb25zJyksXG4gICAgfSk7XG4gICAgY29sbGVjdGlvbkZpbGVOYW1lcy5mb3JFYWNoKChmaWxlbmFtZSkgPT4ge1xuICAgICAgY29sbGVjdGlvbklkcy5wdXNoKGZpbGVuYW1lLnNsaWNlKDAsIC0xMCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uSWRzO1xuICB9XG59XG4iLCAiaW1wb3J0IHtSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtwdWJsaXNoU2NoZWR1bGVkRG9jc30gZnJvbSAnLi9ydW50aW1lLmpzJztcbmltcG9ydCB7VmVyc2lvbnNTZXJ2aWNlfSBmcm9tICcuL3ZlcnNpb25zLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNyb25Kb2JzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJ1bkNyb25Kb2IoJ3B1Ymxpc2hTY2hlZHVsZWREb2NzJywgcnVuUHVibGlzaFNjaGVkdWxlZERvY3MsIHJvb3RDb25maWcpLFxuICAgIHJ1bkNyb25Kb2IoJ3NhdmVWZXJzaW9ucycsIHJ1blNhdmVWZXJzaW9ucywgcm9vdENvbmZpZyksXG4gIF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Dcm9uSm9iKFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgLi4uYXJnczogYW55W11cbikge1xuICB0cnkge1xuICAgIGF3YWl0IGZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmxvZyhgY3JvbiBmYWlsZWQ6ICR7bmFtZX1gKTtcbiAgICBjb25zb2xlLmVycm9yKFN0cmluZyhlcnIuc3RhY2sgfHwgZXJyKSk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgYXdhaXQgcHVibGlzaFNjaGVkdWxlZERvY3Mocm9vdENvbmZpZyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNhdmVWZXJzaW9ucyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGNvbnN0IHNlcnZpY2UgPSBuZXcgVmVyc2lvbnNTZXJ2aWNlKHJvb3RDb25maWcpO1xuICBhd2FpdCBzZXJ2aWNlLnNhdmVWZXJzaW9ucygpO1xufVxuIiwgImltcG9ydCB7cGFyc2UgYXMgY3N2UGFyc2V9IGZyb20gJ2Nzdi1wYXJzZS9zeW5jJztcbmltcG9ydCB7c3RyaW5naWZ5IGFzIGNzdlN0cmluZ2lmeX0gZnJvbSAnY3N2LXN0cmluZ2lmeS9zeW5jJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5VG9Dc3YocmVxOiB7XG4gIGhlYWRlcnM6IHN0cmluZ1tdO1xuICByb3dzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pjtcbn0pOiBzdHJpbmcge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnMgfHwgW107XG4gIGNvbnN0IHJvd3MgPSByZXEucm93cyB8fCBbXTtcbiAgcmV0dXJuIGNzdlN0cmluZ2lmeShyb3dzLCB7XG4gICAgaGVhZGVyOiB0cnVlLFxuICAgIGNvbHVtbnM6IGhlYWRlcnMsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3N2VG9BcnJheShjc3ZTdHJpbmc6IHN0cmluZykge1xuICBjb25zdCByb3dzID0gY3N2UGFyc2UoY3N2U3RyaW5nLCB7XG4gICAgY29sdW1uczogdHJ1ZSxcbiAgICBza2lwX2VtcHR5X2xpbmVzOiB0cnVlLFxuICB9KTtcbiAgcmV0dXJuIHJvd3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUSxZQUFZLFVBQVM7QUFDN0IsT0FBT0EsV0FBVTtBQUNqQixTQUFRLHFCQUFvQjtBQVU1QixPQUFPLGdCQUFnQjtBQUN2QjtBQUFBLEVBRUU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFRLGVBQThCO0FBQ3RDLE9BQU8sVUFBVTs7O0FDbkJqQixTQUFRLDJCQUEwQjs7O0FDRWxDO0FBQUEsRUFDRSxjQUFBQztBQUFBLEVBR0EsZ0JBQUFDO0FBQUEsT0FDSzs7O0FDUlAsT0FBTyxZQUFZO0FBR25CO0FBQUEsRUFDRTtBQUFBLEVBSUE7QUFBQSxPQUNLO0FBOGZBLFNBQVMsYUFBYSxZQUFtQztBQUM5RCxRQUFNLFVBQW9CLFdBQVcsV0FBVyxDQUFDO0FBQ2pELFFBQU0sU0FBUyxRQUFRLEtBQUssQ0FBQ0MsWUFBV0EsUUFBTyxTQUFTLFVBQVU7QUFDbEUsTUFBSSxDQUFDLFFBQVE7QUFDWCxVQUFNLElBQUksTUFBTSx5REFBeUQ7QUFBQSxFQUMzRTtBQUNBLFNBQU87QUFDVDs7O0FENVlBLGVBQXNCLHFCQUFxQixZQUF3QjtBQUNqRSxRQUFNQyxhQUFZLGFBQWEsVUFBVTtBQUN6QyxRQUFNLG1CQUFtQkEsV0FBVSxVQUFVO0FBQzdDLFFBQU0sWUFBWSxpQkFBaUIsTUFBTTtBQUN6QyxRQUFNLE1BQU1BLFdBQVUsZUFBZTtBQUNyQyxRQUFNLEtBQUtDLGNBQWEsR0FBRztBQUUzQixRQUFNLHlCQUF5QixZQUFZLFNBQVM7QUFDcEQsUUFBTSxNQUFNLEtBQUssTUFBSyxvQkFBSSxLQUFLLEdBQUUsUUFBUSxDQUFDO0FBRTFDLFFBQU0sV0FBVyxNQUFNLEdBQUcsZ0JBQWdCLFdBQVcsRUFBRSxJQUFJO0FBQzNELFFBQU0sT0FBTyxTQUFTLEtBQ25CLE9BQU8sQ0FBQyxNQUFNO0FBOUluQjtBQWdK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LE1BQU0sa0JBQWtCLEdBQUc7QUFDbEQsWUFBSSxnQkFBZ0I7QUFDbEIsZUFBSztBQUNMO0FBQUEsUUFDRjtBQUdBLFlBQUksSUFBSSxnQkFBZ0IscUJBQXFCO0FBQzNDLGVBQUs7QUFDTDtBQUFBLFFBQ0Y7QUFDQSxZQUFJLElBQUksWUFBWSxXQUFXLFVBQVUsR0FBRztBQUMxQyxjQUFJLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBQyxTQUFTLE9BQU8sT0FBTyxpQkFBZ0IsQ0FBQztBQUM5RDtBQUFBLFFBQ0Y7QUFDQSxnQkFBUSxJQUFJLDJCQUEyQjtBQUN2QyxjQUFNLFNBQVMsSUFBSSxnQkFBZ0I7QUFBQSxVQUNqQyxVQUFVLElBQUk7QUFBQSxRQUNoQixDQUFDO0FBQ0QsWUFBSSxTQUFTLGNBQWMsT0FBTyxTQUFTLENBQUMsRUFBRTtBQUFBLE1BQ2hELENBQUM7QUFHRCxVQUFJLE1BQU07QUFHVixhQUFPLElBQUksUUFBUSxPQUFPLEtBQWMsUUFBa0I7QUFDeEQsWUFBSTtBQUNGLGdCQUFNQSxPQUFNLE1BQU0sWUFBWSxHQUFHO0FBQ2pDLGdCQUFNQSxLQUFJLFVBQVUsS0FBSyxLQUFLO0FBQUEsWUFDNUIsWUFBWSxJQUFJO0FBQUEsWUFDaEIsV0FBVztBQUFBLFlBQ1gsZ0JBQWdCLFFBQVE7QUFBQSxVQUMxQixDQUFDO0FBQUEsUUFDSCxTQUFTLEtBQUs7QUFFWixrQkFBUSxNQUFNLEdBQUc7QUFDakIsY0FBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLHNCQUFzQjtBQUFBLFFBQzdDO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsV0FBVyxVQUFvQztBQUN0RCxTQUFPLEdBQ0osT0FBTyxRQUFRLEVBQ2YsS0FBSyxNQUFNLElBQUksRUFDZixNQUFNLE1BQU0sS0FBSztBQUN0QjsiLAogICJuYW1lcyI6IFsicGF0aCIsICJGaWVsZFZhbHVlIiwgImdldEZpcmVzdG9yZSIsICJwbHVnaW4iLCAiY21zUGx1Z2luIiwgImdldEZpcmVzdG9yZSIsICJGaWVsZFZhbHVlIiwgIlRpbWVzdGFtcCIsICJnZXRGaXJlc3RvcmUiLCAiY21zUGx1Z2luIiwgImdldEZpcmVzdG9yZSIsICJUaW1lc3RhbXAiLCAicGF0aCIsICJhcHAiXQp9Cg==
|