velocious 1.0.514 → 1.0.516
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 +4 -3
- package/build/background-jobs/cron-expression.js +9 -9
- package/build/background-jobs/forked-runner-child.js +1 -1
- package/build/background-jobs/job-runner.js +21 -15
- package/build/background-jobs/json-socket.js +4 -0
- package/build/background-jobs/main.js +180 -18
- package/build/background-jobs/status-reporter.js +12 -5
- package/build/background-jobs/store.js +132 -50
- package/build/background-jobs/types.js +11 -3
- package/build/background-jobs/worker.js +9 -5
- package/build/beacon/client.js +13 -6
- package/build/configuration.js +54 -29
- package/build/controller.js +9 -3
- package/build/database/drivers/sqlite/base.js +1 -1
- package/build/database/drivers/sqlite/index.js +15 -14
- package/build/database/migrations-ledger.js +16 -16
- package/build/database/pool/async-tracked-multi-connection.js +16 -0
- package/build/database/pool/base.js +26 -0
- package/build/database/query/where-model-class-hash.js +2 -0
- package/build/database/query/with-count.js +1 -1
- package/build/database/record/acts-as-list.js +2 -2
- package/build/database/record/auditing.js +23 -6
- package/build/database/record/index.js +7 -7
- package/build/database/record/validators/uniqueness.js +3 -3
- package/build/database/tenants/data-copier.js +23 -23
- package/build/database/tenants/schema-cloner.js +27 -27
- package/build/environment-handlers/browser.js +0 -1
- package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
- package/build/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
- package/build/environment-handlers/node.js +1 -1
- package/build/frontend-model-controller.js +26 -18
- package/build/frontend-model-resource/base-resource.js +4 -4
- package/build/frontend-models/base.js +5 -5
- package/build/frontend-models/query.js +12 -12
- package/build/http-server/client/index.js +61 -15
- package/build/http-server/client/request-runner.js +7 -1
- package/build/http-server/client/response.js +17 -1
- package/build/http-server/client/websocket-session.js +13 -13
- package/build/http-server/server-client.js +96 -0
- package/build/http-server/websocket-channel.js +12 -11
- package/build/http-server/websocket-connection.js +12 -11
- package/build/http-server/websocket-events-host.js +1 -1
- package/build/http-server/worker-handler/in-process.js +48 -9
- package/build/http-server/worker-handler/index.js +67 -7
- package/build/http-server/worker-handler/worker-thread.js +68 -0
- package/build/src/background-jobs/cron-expression.d.ts +2 -2
- package/build/src/background-jobs/cron-expression.js +10 -10
- package/build/src/background-jobs/forked-runner-child.js +2 -2
- package/build/src/background-jobs/job-runner.d.ts +5 -1
- package/build/src/background-jobs/job-runner.d.ts.map +1 -1
- package/build/src/background-jobs/job-runner.js +22 -16
- package/build/src/background-jobs/json-socket.d.ts +4 -0
- package/build/src/background-jobs/json-socket.d.ts.map +1 -1
- package/build/src/background-jobs/json-socket.js +5 -1
- package/build/src/background-jobs/main.d.ts +62 -10
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +171 -19
- package/build/src/background-jobs/status-reporter.d.ts +6 -2
- package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
- package/build/src/background-jobs/status-reporter.js +13 -6
- package/build/src/background-jobs/store.d.ts +48 -25
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +123 -50
- package/build/src/background-jobs/types.d.ts +36 -3
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +12 -4
- package/build/src/background-jobs/worker.d.ts +7 -5
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +10 -6
- package/build/src/beacon/client.d.ts +6 -3
- package/build/src/beacon/client.d.ts.map +1 -1
- package/build/src/beacon/client.js +14 -7
- package/build/src/configuration-types.d.ts +1 -1
- package/build/src/configuration.d.ts +42 -29
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +52 -30
- package/build/src/controller.d.ts +3 -0
- package/build/src/controller.d.ts.map +1 -1
- package/build/src/controller.js +9 -4
- package/build/src/database/drivers/sqlite/base.js +2 -2
- package/build/src/database/drivers/sqlite/index.d.ts +7 -6
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +16 -15
- package/build/src/database/migrations-ledger.d.ts +16 -16
- package/build/src/database/migrations-ledger.js +17 -17
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +0 -11
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +16 -1
- package/build/src/database/pool/base.d.ts +21 -0
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +24 -1
- package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
- package/build/src/database/query/where-model-class-hash.js +3 -1
- package/build/src/database/query/with-count.js +2 -2
- package/build/src/database/record/acts-as-list.js +3 -3
- package/build/src/database/record/auditing.d.ts +1 -1
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +24 -7
- package/build/src/database/record/index.d.ts +7 -7
- package/build/src/database/record/index.js +8 -8
- package/build/src/database/record/validators/uniqueness.d.ts +3 -3
- package/build/src/database/record/validators/uniqueness.js +4 -4
- package/build/src/database/tenants/data-copier.d.ts +18 -18
- package/build/src/database/tenants/data-copier.js +24 -24
- package/build/src/database/tenants/schema-cloner.d.ts +27 -27
- package/build/src/database/tenants/schema-cloner.js +28 -28
- package/build/src/environment-handlers/browser.d.ts +9 -0
- package/build/src/environment-handlers/browser.d.ts.map +1 -1
- package/build/src/environment-handlers/browser.js +1 -2
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +3 -2
- package/build/src/environment-handlers/node/cli/commands/lint/relationships.js +3 -3
- package/build/src/environment-handlers/node.js +2 -2
- package/build/src/frontend-model-controller.d.ts +9 -8
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +26 -19
- package/build/src/frontend-model-resource/base-resource.js +5 -5
- package/build/src/frontend-models/base.d.ts +4 -4
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +6 -6
- package/build/src/frontend-models/query.d.ts +7 -7
- package/build/src/frontend-models/query.js +13 -13
- package/build/src/http-server/client/index.d.ts +23 -1
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +55 -17
- package/build/src/http-server/client/request-runner.d.ts.map +1 -1
- package/build/src/http-server/client/request-runner.js +8 -2
- package/build/src/http-server/client/response.d.ts +11 -1
- package/build/src/http-server/client/response.d.ts.map +1 -1
- package/build/src/http-server/client/response.js +16 -2
- package/build/src/http-server/client/websocket-session.d.ts +13 -13
- package/build/src/http-server/client/websocket-session.js +14 -14
- package/build/src/http-server/server-client.d.ts +13 -0
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-client.js +94 -1
- package/build/src/http-server/websocket-channel.d.ts +12 -11
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +13 -12
- package/build/src/http-server/websocket-connection.d.ts +12 -11
- package/build/src/http-server/websocket-connection.d.ts.map +1 -1
- package/build/src/http-server/websocket-connection.js +13 -12
- package/build/src/http-server/websocket-events-host.d.ts +1 -1
- package/build/src/http-server/websocket-events-host.js +2 -2
- package/build/src/http-server/worker-handler/in-process.d.ts +2 -0
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +42 -11
- package/build/src/http-server/worker-handler/index.d.ts +21 -0
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +61 -7
- package/build/src/http-server/worker-handler/worker-thread.d.ts +30 -0
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +61 -1
- package/build/src/sync/device-identity.d.ts +2 -2
- package/build/src/sync/device-identity.d.ts.map +1 -1
- package/build/src/sync/device-identity.js +4 -4
- package/build/src/sync/local-mutation-log.d.ts +0 -1
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +1 -2
- package/build/src/sync/query-scope.d.ts +5 -0
- package/build/src/sync/query-scope.d.ts.map +1 -1
- package/build/src/sync/query-scope.js +7 -2
- package/build/src/sync/sync-client-types.d.ts +2 -2
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +1 -1
- package/build/src/sync/sync-client.d.ts +17 -2
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +28 -14
- package/build/src/sync/sync-realtime-bridge.d.ts +6 -2
- package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
- package/build/src/sync/sync-realtime-bridge.js +14 -3
- package/build/src/sync/sync-resource-base.d.ts +14 -3
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +20 -4
- package/build/src/sync/sync-scope-store.d.ts +3 -3
- package/build/src/sync/sync-scope-store.d.ts.map +1 -1
- package/build/src/sync/sync-scope-store.js +7 -5
- package/build/src/sync/sync-websocket-channel.d.ts +10 -0
- package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
- package/build/src/sync/sync-websocket-channel.js +20 -3
- package/build/src/tenants/tenant-iterator.d.ts +8 -8
- package/build/src/tenants/tenant-iterator.js +9 -9
- package/build/src/tenants/tenant.d.ts +6 -6
- package/build/src/tenants/tenant.js +7 -7
- package/build/src/testing/test-runner.d.ts +16 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +79 -19
- package/build/sync/device-identity.js +3 -3
- package/build/sync/local-mutation-log.js +0 -1
- package/build/sync/query-scope.js +6 -1
- package/build/sync/sync-client-types.js +1 -1
- package/build/sync/sync-client.js +28 -15
- package/build/sync/sync-realtime-bridge.js +13 -2
- package/build/sync/sync-resource-base.js +20 -3
- package/build/sync/sync-scope-store.js +6 -4
- package/build/sync/sync-websocket-channel.js +18 -2
- package/build/tenants/tenant-iterator.js +8 -8
- package/build/tenants/tenant.js +6 -6
- package/build/testing/test-runner.js +86 -20
- package/package.json +2 -2
- package/src/background-jobs/cron-expression.js +9 -9
- package/src/background-jobs/forked-runner-child.js +1 -1
- package/src/background-jobs/job-runner.js +21 -15
- package/src/background-jobs/json-socket.js +4 -0
- package/src/background-jobs/main.js +180 -18
- package/src/background-jobs/status-reporter.js +12 -5
- package/src/background-jobs/store.js +132 -50
- package/src/background-jobs/types.js +11 -3
- package/src/background-jobs/worker.js +9 -5
- package/src/beacon/client.js +13 -6
- package/src/configuration.js +54 -29
- package/src/controller.js +9 -3
- package/src/database/drivers/sqlite/base.js +1 -1
- package/src/database/drivers/sqlite/index.js +15 -14
- package/src/database/migrations-ledger.js +16 -16
- package/src/database/pool/async-tracked-multi-connection.js +16 -0
- package/src/database/pool/base.js +26 -0
- package/src/database/query/where-model-class-hash.js +2 -0
- package/src/database/query/with-count.js +1 -1
- package/src/database/record/acts-as-list.js +2 -2
- package/src/database/record/auditing.js +23 -6
- package/src/database/record/index.js +7 -7
- package/src/database/record/validators/uniqueness.js +3 -3
- package/src/database/tenants/data-copier.js +23 -23
- package/src/database/tenants/schema-cloner.js +27 -27
- package/src/environment-handlers/browser.js +0 -1
- package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
- package/src/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
- package/src/environment-handlers/node.js +1 -1
- package/src/frontend-model-controller.js +26 -18
- package/src/frontend-model-resource/base-resource.js +4 -4
- package/src/frontend-models/base.js +5 -5
- package/src/frontend-models/query.js +12 -12
- package/src/http-server/client/index.js +61 -15
- package/src/http-server/client/request-runner.js +7 -1
- package/src/http-server/client/response.js +17 -1
- package/src/http-server/client/websocket-session.js +13 -13
- package/src/http-server/server-client.js +96 -0
- package/src/http-server/websocket-channel.js +12 -11
- package/src/http-server/websocket-connection.js +12 -11
- package/src/http-server/websocket-events-host.js +1 -1
- package/src/http-server/worker-handler/in-process.js +48 -9
- package/src/http-server/worker-handler/index.js +67 -7
- package/src/http-server/worker-handler/worker-thread.js +68 -0
- package/src/sync/device-identity.js +3 -3
- package/src/sync/local-mutation-log.js +0 -1
- package/src/sync/query-scope.js +6 -1
- package/src/sync/sync-client-types.js +1 -1
- package/src/sync/sync-client.js +28 -15
- package/src/sync/sync-realtime-bridge.js +13 -2
- package/src/sync/sync-resource-base.js +20 -3
- package/src/sync/sync-scope-store.js +6 -4
- package/src/sync/sync-websocket-channel.js +18 -2
- package/src/tenants/tenant-iterator.js +8 -8
- package/src/tenants/tenant.js +6 -6
- package/src/testing/test-runner.js +86 -20
|
@@ -211,7 +211,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
211
211
|
* Removes a closed connection from the session registry. Called by
|
|
212
212
|
* `VelociousWebsocketConnection.close()` after it sends the final
|
|
213
213
|
* `connection-closed` frame.
|
|
214
|
-
* @param {string} connectionId
|
|
214
|
+
* @param {string} connectionId - Closed connection identifier to remove.
|
|
215
215
|
* @returns {void}
|
|
216
216
|
*/
|
|
217
217
|
_removeConnection(connectionId) {
|
|
@@ -397,7 +397,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
397
397
|
* The actual message dispatch, extracted so
|
|
398
398
|
* `configuration.getWebsocketAroundRequest()` can wrap it in any
|
|
399
399
|
* per-request context (AsyncLocalStorage, tracing, etc.).
|
|
400
|
-
* @param {WebsocketSessionMessage} message
|
|
400
|
+
* @param {WebsocketSessionMessage} message - Decoded client frame to dispatch by message type.
|
|
401
401
|
* @returns {Promise<void>}
|
|
402
402
|
*/
|
|
403
403
|
async _handleMessageInner(message) {
|
|
@@ -645,8 +645,8 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
645
645
|
* fragmented message. Returns true when the fragment was accepted
|
|
646
646
|
* and false when the per-message cap was hit and the socket has
|
|
647
647
|
* been closed.
|
|
648
|
-
* @param {Buffer} payload
|
|
649
|
-
* @returns {boolean}
|
|
648
|
+
* @param {Buffer} payload - Continuation-frame bytes to append.
|
|
649
|
+
* @returns {boolean} - Whether the fragment was accepted.
|
|
650
650
|
*/
|
|
651
651
|
_appendFragment(payload) {
|
|
652
652
|
// Guard pushing first so `_enforceFragmentLimits` sees the final
|
|
@@ -662,7 +662,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
662
662
|
* close frame, and tears the session down. Returns true when the
|
|
663
663
|
* caller can continue processing, false when the session is being
|
|
664
664
|
* closed.
|
|
665
|
-
* @returns {boolean}
|
|
665
|
+
* @returns {boolean} - Whether fragment processing may continue.
|
|
666
666
|
*/
|
|
667
667
|
_enforceFragmentLimits() {
|
|
668
668
|
if (this._fragmentedPayloads === null)
|
|
@@ -903,7 +903,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
903
903
|
* The returned promise is stored at pause time and awaited at
|
|
904
904
|
* resume time so we can reject resume attempts from a different
|
|
905
905
|
* authenticated caller (signed out, swapped user, expired cookie).
|
|
906
|
-
* @returns {Promise<?>}
|
|
906
|
+
* @returns {Promise<?>} - Captured authenticated identity for resume validation.
|
|
907
907
|
*/
|
|
908
908
|
async _captureResumeIdentity() {
|
|
909
909
|
const resolver = this.configuration.getWebsocketSessionIdentityResolver?.();
|
|
@@ -963,7 +963,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
963
963
|
* created one whose socket just connected) transfers state from
|
|
964
964
|
* the paused session and instructs the client via
|
|
965
965
|
* `session-resumed` or `session-gone`.
|
|
966
|
-
* @param {Record<string, ?>} message
|
|
966
|
+
* @param {Record<string, ?>} message - Session-resume frame containing the paused session identifier.
|
|
967
967
|
* @returns {Promise<void>}
|
|
968
968
|
*/
|
|
969
969
|
async _handleSessionResume(message) {
|
|
@@ -1031,7 +1031,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1031
1031
|
* Fires `onClose(reason)` on every live app-defined connection, then
|
|
1032
1032
|
* drops them from the registry. No network frame is sent — the
|
|
1033
1033
|
* socket is already going away.
|
|
1034
|
-
* @param {"session_destroyed" | "grace_expired" | "error"} reason
|
|
1034
|
+
* @param {"session_destroyed" | "grace_expired" | "error"} reason - Permanent teardown reason passed to each connection.
|
|
1035
1035
|
* @returns {Promise<void>}
|
|
1036
1036
|
*/
|
|
1037
1037
|
async _teardownConnections(reason) {
|
|
@@ -1054,7 +1054,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1054
1054
|
* registered connection class, stores it on `_connections`, and
|
|
1055
1055
|
* fires `onConnect()`. Sends `connection-opened` on success or
|
|
1056
1056
|
* `connection-error` on failure.
|
|
1057
|
-
* @param {Record<string, ?>} message
|
|
1057
|
+
* @param {Record<string, ?>} message - Connection-open frame naming the connection type and identifier.
|
|
1058
1058
|
* @returns {Promise<void>}
|
|
1059
1059
|
*/
|
|
1060
1060
|
async _handleConnectionOpen(message) {
|
|
@@ -1095,7 +1095,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1095
1095
|
}
|
|
1096
1096
|
/**
|
|
1097
1097
|
* Handles a `{type: "connection-message"}` from the client.
|
|
1098
|
-
* @param {Record<string, ?>} message
|
|
1098
|
+
* @param {Record<string, ?>} message - Connection-message frame containing the target identifier and body.
|
|
1099
1099
|
* @returns {Promise<void>}
|
|
1100
1100
|
*/
|
|
1101
1101
|
async _handleConnectionMessage(message) {
|
|
@@ -1118,7 +1118,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1118
1118
|
/**
|
|
1119
1119
|
* Handles a `{type: "connection-close"}` from the client — fires
|
|
1120
1120
|
* `onClose("client_close")` and confirms with `connection-closed`.
|
|
1121
|
-
* @param {Record<string, ?>} message
|
|
1121
|
+
* @param {Record<string, ?>} message - Connection-close frame containing the target identifier.
|
|
1122
1122
|
* @returns {Promise<void>}
|
|
1123
1123
|
*/
|
|
1124
1124
|
async _handleConnectionClose(message) {
|
|
@@ -1144,7 +1144,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1144
1144
|
* Handles `{type: "channel-subscribe"}` — runs `canSubscribe()`,
|
|
1145
1145
|
* registers with the Configuration's global routing registry on
|
|
1146
1146
|
* success, and sends `channel-subscribed` or `channel-error`.
|
|
1147
|
-
* @param {Record<string, ?>} message
|
|
1147
|
+
* @param {Record<string, ?>} message - Channel-subscribe frame describing the requested subscription.
|
|
1148
1148
|
* @returns {Promise<void>}
|
|
1149
1149
|
*/
|
|
1150
1150
|
async _handleChannelSubscribe(message) {
|
|
@@ -1248,7 +1248,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1248
1248
|
/**
|
|
1249
1249
|
* Handles `{type: "channel-unsubscribe"}` from the client — calls
|
|
1250
1250
|
* `unsubscribed()` and sends `channel-unsubscribed`.
|
|
1251
|
-
* @param {Record<string, ?>} message
|
|
1251
|
+
* @param {Record<string, ?>} message - Channel-unsubscribe frame containing the subscription identifier.
|
|
1252
1252
|
* @returns {Promise<void>}
|
|
1253
1253
|
*/
|
|
1254
1254
|
async _handleChannelUnsubscribe(message) {
|
|
@@ -1618,4 +1618,4 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1618
1618
|
}
|
|
1619
1619
|
}
|
|
1620
1620
|
}
|
|
1621
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxnQkFBZ0IsTUFBTSx5QkFBeUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsc0NBQXNDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV0RixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyx3RUFBd0U7QUFDeEUsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFFdkMsbUVBQW1FO0FBQ25FLE1BQU0sc0NBQXNDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUFFL0QsNkRBQTZEO0FBQzdELE1BQU0sMENBQTBDLEdBQUcsSUFBSSxDQUFBO0FBRXZEOzs7R0FHRztBQUVIOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE9BQU87SUFDL0IsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFDakMs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QztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUUxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBRXRCLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMvQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7cmFuZG9tVVVJRH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlcXVlc3RSdW5uZXIgZnJvbSBcIi4vcmVxdWVzdC1ydW5uZXIuanNcIlxuaW1wb3J0IFdlYnNvY2tldFJlcXVlc3QgZnJvbSBcIi4vd2Vic29ja2V0LXJlcXVlc3QuanNcIlxuaW1wb3J0IFdlYnNvY2tldENoYW5uZWwgZnJvbSBcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCJcbmltcG9ydCB7d2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb259IGZyb20gXCIuLi93ZWJzb2NrZXQtZXZlbnQtbG9nLXN0b3JlLmpzXCJcblxuY29uc3QgV0VCU09DS0VUX0ZJTkFMX0ZSQU1FID0gMHg4MFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04gPSAweDBcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfVEVYVCA9IDB4MVxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9CSU5BUlkgPSAweDJcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UgPSAweDhcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfUElORyA9IDB4OVxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9QT05HID0gMHhBXG5cbi8qKiBDYXAgb24gdGhlIHBhdXNlZCBvdXRib3VuZCBxdWV1ZTsgb2xkZXN0IGZyYW1lcyBkcm9wIG9uIG92ZXJmbG93LiAqL1xuY29uc3QgV0VCU09DS0VUX1BBVVNFRF9RVUVVRV9DQVAgPSAxMDAwXG5cbi8qKiBDYXAgb24gdG90YWwgYnl0ZXMgYnVmZmVyZWQgZm9yIGEgc2luZ2xlIGZyYWdtZW50ZWQgbWVzc2FnZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTID0gMTYgKiAxMDI0ICogMTAyNFxuXG4vKiogQ2FwIG9uIGZyYWdtZW50IGNvdW50IGZvciBhIHNpbmdsZSBmcmFnbWVudGVkIG1lc3NhZ2UuICovXG5jb25zdCBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFMgPSAxMDI0XG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fSB8IHt0eXBlOiBcIm1ldGFkYXRhXCIsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0gfCB7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgUmVjb3JkPHN0cmluZywgPz59IFdlYnNvY2tldFNlc3Npb25NZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBSdW5zIHN1YnNjcmliZSBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59IHwgbnVsbH0gLSBTdWJzY3JpYmUgbWVzc2FnZSB3aGVuIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZU1lc3NhZ2UobWVzc2FnZSkge1xuICByZXR1cm4gbWVzc2FnZS50eXBlID09PSBcInN1YnNjcmliZVwiXG4gICAgPyAvKiogQHR5cGUge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19ICovIChtZXNzYWdlKVxuICAgIDogbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgcmVxdWVzdCBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgbnVsbH0gLSBSZXF1ZXN0IG1lc3NhZ2Ugd2hlbiBtYXRjaGVkLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikgcmV0dXJuIG51bGxcblxuICByZXR1cm4gLyoqIEB0eXBlIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gaWRlbnRpdHkgdmFsdWVzIGZyb20gYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC5cbiAqIE51bGxpc2ggdmFsdWVzIGNvbXBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBidXQgbm90IHRvIGEgcmVhbCBpZGVudGl0eS5cbiAqIFBsYWluIG9iamVjdHMgYXJlIGNvbXBhcmVkIHZpYSBKU09OIHJvdW5kLXRyaXAgc28gYXBwcyBjYW4gcmV0dXJuIGFcbiAqIGB7dXNlcklkLCB0ZW5hbnRJZH1gLXN0eWxlIG9iamVjdCB3aXRob3V0IGJ1aWxkaW5nIHRoZWlyIG93biBlcXVhbGl0eS5cbiAqIEBwYXJhbSB7P30gYSAtIFBhdXNlZC10aW1lIGlkZW50aXR5LlxuICogQHBhcmFtIHs/fSBiIC0gUmVzdW1lLXRpbWUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIHR3byBpZGVudGl0aWVzIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGNhbGxlci5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdGllc01hdGNoKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKHR5cGVvZiBhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhKSA9PT0gSlNPTi5zdHJpbmdpZnkoYilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFdlYnNvY2tldFNlc3Npb24ge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQoKVxuICBjaGFubmVscyA9IG5ldyBTZXQoKVxuICBzdWJzY3JpcHRpb25IYW5kbGVycyA9IG5ldyBNYXAoKVxuICBoYW5kbGVyU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuICBjaGFubmVsVGVuYW50cyA9IG5ldyBNYXAoKVxuICBjaGFubmVsUmVwbGF5U3RhdGVzID0gbmV3IE1hcCgpXG4gIC8qKlxuICAgKiBNZXNzYWdlIHF1ZXVlLlxuICAgKiBAdHlwZSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2VbXX0gKi9cbiAgbWVzc2FnZVF1ZXVlID0gW11cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLmNsaWVudCAtIENsaWVudCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gW2FyZ3MudXBncmFkZVJlcXVlc3RdIC0gSW5pdGlhbCB3ZWJzb2NrZXQgdXBncmFkZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJ9IFthcmdzLm1lc3NhZ2VIYW5kbGVyXSAtIE9wdGlvbmFsIHJhdyBtZXNzYWdlIGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyIHwgdm9pZD59IFthcmdzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZV0gLSBPcHRpb25hbCByYXcgbWVzc2FnZSBoYW5kbGVyIHByb21pc2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50LCBjb25maWd1cmF0aW9uLCB1cGdyYWRlUmVxdWVzdCwgbWVzc2FnZUhhbmRsZXIsIG1lc3NhZ2VIYW5kbGVyUHJvbWlzZX0pIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMudXBncmFkZVJlcXVlc3QgPSB1cGdyYWRlUmVxdWVzdFxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlclxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gbWVzc2FnZUhhbmRsZXJQcm9taXNlXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBCb29sZWFuKG1lc3NhZ2VIYW5kbGVyUHJvbWlzZSlcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7fVxuXG4gICAgLyoqXG4gICAgICogTG9uZy1saXZlZCBwZXItc2Vzc2lvbiBzdGF0ZSBiYWcuIFN0YWJsZSBhY3Jvc3MgcmVjb25uZWN0cyBvbmNlXG4gICAgICogZ3JhY2UtcGVyaW9kIHJlc3VtcHRpb24gbGFuZHMgaW4gUGhhc2UgMjsgdG9kYXkgaXQganVzdCBsaXZlc1xuICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn1cbiAgICAgKi9cbiAgICB0aGlzLmRhdGEgPSB7fVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY29ubmVjdGlvbi5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCB7Y2hhbm5lbFR5cGU6IHN0cmluZywgc3Vic2NyaXB0aW9uOiBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fT59ICovXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZCBhc3NpZ25lZCB0byB0aGlzIHNlc3Npb24gb24gZmlyc3QgY29ubmVjdC4gU2VudCB0byB0aGVcbiAgICAgKiBjbGllbnQgdmlhIGBzZXNzaW9uLWVzdGFibGlzaGVkYDsgdGhlIGNsaWVudCBlY2hvZXMgaXQgYmFjayB2aWFcbiAgICAgKiBgc2Vzc2lvbi1yZXN1bWVgIGFmdGVyIGEgV1MgZHJvcCB0byByZWF0dGFjaCB0byB0aGlzIHNlc3Npb25cbiAgICAgKiB3aXRoaW4gdGhlIGdyYWNlIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc2Vzc2lvbklkID0gcmFuZG9tVVVJRCgpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBhZnRlciBgX2hhbmRsZUNsb3NlYCBwYXVzZXMgaW5zdGVhZCBvZiB0ZWFyaW5nIGRvd24uXG4gICAgICovXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2VcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Pz59IC0gZnJhbWVzIHByb2R1Y2VkIHdoaWxlIHBhdXNlZDsgZmx1c2hlZCBvbiByZXN1bWUuXG4gICAgICovXG4gICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5zb2NrZXQgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUYWlsIG9mIGEgcGVyLXNlc3Npb24gcHJvbWlzZSBjaGFpbiB0aGF0IHNlcmlhbGl6ZXMgbWVzc2FnZVxuICAgICAqIGhhbmRsaW5nLiBQcmV2ZW50cyByYWNlcyB3aGVyZSBtZXNzYWdlIEIgcmVhZHMgYHNlc3Npb24uZGF0YWBcbiAgICAgKiBiZWZvcmUgbWVzc2FnZSBBJ3MgaGFuZGxlciBmaW5pc2hlcyB3cml0aW5nIGl0IChlLmcuIGFcbiAgICAgKiBjb25uZWN0aW9uLW1lc3NhZ2Ugc2V0dGluZyB0aGUgbG9jYWxlIHZzLiBhIHN1YnNlcXVlbnQgcmVxdWVzdFxuICAgICAqIHdob3NlIGFyb3VuZFJlcXVlc3Qgd3JhcHBlciByZWFkcyBpdCkuXG4gICAgICogQHR5cGUge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXV0aCBpZGVudGl0eSBjYXB0dXJlZCBhdCBwYXVzZVxuICAgICAqIHRpbWUgYnkgYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC4gQXdhaXRlZCBhdCByZXN1bWVcbiAgICAgKiB0aW1lIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkuIFVuZGVmaW5lZFxuICAgICAqIG9uIGEgbGl2ZSAobm9uLXBhdXNlZCkgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTw/PiB8IHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICB0aGlzLl9yZXN1bWVJZGVudGl0eVByb21pc2UgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEFjY3VtdWxhdGVzIHBheWxvYWRzIGZvciBhIGZyYWdtZW50ZWQgd2Vic29ja2V0IG1lc3NhZ2UgcGVyXG4gICAgICogUkZDIDY0NTUuIE5vbi1udWxsIHdoaWxlIG1pZC1mcmFnbWVudDsgY2xlYXJlZCB3aGVuIHRoZSBmcmFtZVxuICAgICAqIHdpdGggRklOPTEgY29tcGxldGVzIGFuZCB0aGUgbWVzc2FnZSBpcyBkaXNwYXRjaGVkLlxuICAgICAqIEB0eXBlIHtCdWZmZXJbXSB8IG51bGx9XG4gICAgICovXG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogT3Bjb2RlIChURVhUL0JJTkFSWSkgY2FwdHVyZWQgZnJvbSB0aGUgZmlyc3QgZnJhbWUgb2YgYVxuICAgICAqIGZyYWdtZW50ZWQgbWVzc2FnZS4gQ29udGludWF0aW9uIGZyYW1lcyAob3Bjb2RlIDApIGluaGVyaXQgaXRcbiAgICAgKiBhdCByZWFzc2VtYmx5IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlciB8IG51bGx9XG4gICAgICovXG4gICAgdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA9IG51bGxcblxuICAgIC8qKlxuICAgICAqIFJ1bm5pbmcgYnl0ZSB0b3RhbCBmb3IgYF9mcmFnbWVudGVkUGF5bG9hZHNgLiBVc2VkIHRvIGVuZm9yY2VcbiAgICAgKiBgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVNgIHNvIGEgcGVlciBjYW5ub3RcbiAgICAgKiBleGhhdXN0IG1lbW9yeSBieSBzdHJlYW1pbmcgbm9uLWZpbmFsIGZyYWdtZW50cyBpbmRlZmluaXRlbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPSAwXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmFkZCh0aGlzKVxuXG4gICAgLyoqXG4gICAgICogSGVhcnRiZWF0IGxpdmVuZXNzIGZsYWcuIFNldCB0cnVlIG9uIGV2ZXJ5IGluYm91bmQgZnJhbWVcbiAgICAgKiAoaW5jbHVkaW5nIHRoZSBjbGllbnQncyBhdXRvLXBvbmcpIGFuZCBjbGVhcmVkIGVhY2ggdGltZSBhIHBpbmdcbiAgICAgKiBpcyBzZW50OyBhIHN0aWxsLWZhbHNlIGZsYWcgYXQgdGhlIG5leHQgdGljayBtZWFucyB0aGUgc29ja2V0XG4gICAgICogaGFzIGdvbmUgc2lsZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuX2hlYXJ0YmVhdEFsaXZlID0gdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogUGVyLXNlc3Npb24gaGVhcnRiZWF0IGludGVydmFsIGhhbmRsZS4gU3RhcnRlZCBmcm9tXG4gICAgICogYHNlbmRTZXNzaW9uRXN0YWJsaXNoZWRgIG9uY2UgdGhlIHNvY2tldCBpcyBsaXZlLCBub3QgYXRcbiAgICAgKiBjb25zdHJ1Y3Rpb24sIHNvIGRpcmVjdGx5LWNvbnN0cnVjdGVkIHNlc3Npb25zIGluIHRlc3RzIGRvbid0XG4gICAgICogc3BpbiB1cCBhIGJhY2tncm91bmQgdGltZXIuXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGx9XG4gICAgICovXG4gICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgdGhlIGNsaWVudCBpdHMgc2Vzc2lvbklkICsgZ3JhY2Ugd2luZG93LiBDYWxsZWQgYnlcbiAgICogYFZlbG9jaW91c0h0dHBTZXJ2ZXJDbGllbnRgIGFmdGVyIHRoZSBXUyB1cGdyYWRlIGNvbXBsZXRlcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZW5kU2Vzc2lvbkVzdGFibGlzaGVkKCkge1xuICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgdHlwZTogXCJzZXNzaW9uLWVzdGFibGlzaGVkXCIsXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgZ3JhY2VTZWNvbmRzOiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbkdyYWNlU2Vjb25kcz8uKCkgfHwgMzAwXG4gICAgfSlcblxuICAgIC8vIFRoZSBzb2NrZXQgaXMgbGl2ZSBub3csIHNvIGJlZ2luIHJlYXBpbmcgaXQgaWYgaXQgZ29lcyBzaWxlbnQuXG4gICAgdGhpcy5fc3RhcnRIZWFydGJlYXQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbG9zZWQgY29ubmVjdGlvbiBmcm9tIHRoZSBzZXNzaW9uIHJlZ2lzdHJ5LiBDYWxsZWQgYnlcbiAgICogYFZlbG9jaW91c1dlYnNvY2tldENvbm5lY3Rpb24uY2xvc2UoKWAgYWZ0ZXIgaXQgc2VuZHMgdGhlIGZpbmFsXG4gICAqIGBjb25uZWN0aW9uLWNsb3NlZGAgZnJhbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uSWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uSWQpIHtcbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IC0gQ2xpZW50LXByb3ZpZGVkIG1ldGFkYXRhIChkZWZlbnNpdmUgY29weSkuXG4gICAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gey4uLnRoaXMuX21ldGFkYXRhfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgcGF1c2VkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIHdoaWxlIHRoZSBzZXNzaW9uIGlzIGluIHRoZSBwYXVzZWQvZ3JhY2UgcmVnaXN0cnkuXG4gICAqL1xuICBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF1c2VkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYWRkU3Vic2NyaXB0aW9uKGNoYW5uZWwpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGNoYW5uZWwpXG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fd2Vic29ja2V0U2Vzc2lvbnMuZGVsZXRlKHRoaXMpXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2VcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbCgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNvbm5lY3Rpb25zKFwic2Vzc2lvbl9kZXN0cm95ZWRcIilcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBpdCBoYXMgc3Vic2NyaXB0aW9uLlxuICAgKi9cbiAgaGFzU3Vic2NyaXB0aW9uKGNoYW5uZWwpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb24gZGF0YS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uRGF0YShkYXRhKSB7XG4gICAgLy8gQW55IGluYm91bmQgYnl0ZXMg4oCUIGEgZGF0YSBmcmFtZSwgdGhlIGF1dG8tcG9uZyBhbnN3ZXJpbmcgb3VyXG4gICAgLy8gaGVhcnRiZWF0LCBvciBhIHBhcnRpYWwgZnJhbWUgc3RpbGwgYmVpbmcgdXBsb2FkZWQg4oCUIHByb3ZlIHRoZVxuICAgIC8vIHNvY2tldCBpcyBhbGl2ZS4gTWFyayBpdCBoZXJlLCBiZWZvcmUgYF9wcm9jZXNzQnVmZmVyYCBtYXkgcmV0dXJuXG4gICAgLy8gZWFybHkgd2FpdGluZyBmb3IgdGhlIHJlc3Qgb2YgYW4gaW5jb21wbGV0ZSBmcmFtZS5cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IHRydWVcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBkYXRhXSlcbiAgICB0aGlzLl9wcm9jZXNzQnVmZmVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0gez99IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7e2NyZWF0ZWRBdD86IHN0cmluZywgZXZlbnRJZD86IHN0cmluZywgcmVwbGF5ZWQ/OiBib29sZWFuLCBzZXF1ZW5jZT86IG51bWJlcn19IFtvcHRpb25zXSAtIEV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEV2ZW50KGNoYW5uZWwsIHBheWxvYWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGNoYW5uZWxIYW5kbGVycyA9IHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpXG4gICAgY29uc3QgaGFzQ2hhbm5lbEhhbmRsZXJzID0gQm9vbGVhbihjaGFubmVsSGFuZGxlcnMgJiYgY2hhbm5lbEhhbmRsZXJzLnNpemUgPiAwKVxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmdldChjaGFubmVsKVxuXG4gICAgaWYgKHJlcGxheVN0YXRlPy5yZXBsYXlpbmcgJiYgIW9wdGlvbnMucmVwbGF5ZWQpIHtcbiAgICAgIHJlcGxheVN0YXRlLmJ1ZmZlcmVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSAmJiAhaGFzQ2hhbm5lbEhhbmRsZXJzKSByZXR1cm5cblxuICAgIGlmIChoYXNDaGFubmVsSGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oY2hhbm5lbEhhbmRsZXJzKS5tYXAoYXN5bmMgKGhhbmRsZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50ID0gdGhpcy5jaGFubmVsVGVuYW50cy5nZXQoaGFuZGxlcilcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5yZWNlaXZlZEJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgIGV2ZW50SWQ6IG9wdGlvbnMuZXZlbnRJZCxcbiAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICAgICAgICAgIHNlcXVlbmNlOiBvcHRpb25zLnNlcXVlbmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICBldmVudElkOiBvcHRpb25zLmV2ZW50SWQsXG4gICAgICBwYXlsb2FkLFxuICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICBzZXF1ZW5jZTogb3B0aW9ucy5zZXF1ZW5jZSxcbiAgICAgIHR5cGU6IFwiZXZlbnRcIlxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbml0aWFsaXplIGNoYW5uZWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplQ2hhbm5lbCgpIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3Jlc29sdmVNZXNzYWdlSGFuZGxlclByb21pc2UoKVxuXG4gICAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICBpZiAoIXJlc29sdmVyKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHt9KVxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVyKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVyblxuXG4gICAgICBjb25zdCBjaGFubmVsID0gdHlwZW9mIHJlc29sdmVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBuZXcgcmVzb2x2ZWQoe2NsaWVudDogdGhpcy5jbGllbnQsIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCwgd2Vic29ja2V0U2Vzc2lvbjogdGhpc30pXG4gICAgICAgIDogcmVzb2x2ZWRcblxuICAgICAgaWYgKGNoYW5uZWwgJiYgIShjaGFubmVsIGluc3RhbmNlb2YgV2Vic29ja2V0Q2hhbm5lbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgd2Vic29ja2V0IGNoYW5uZWwgbXVzdCBleHRlbmQgV2Vic29ja2V0Q2hhbm5lbFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbCwgdGVuYW50KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBnb29kYnllLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kR29vZGJ5ZShjbGllbnQpIHtcbiAgICBjb25zdCBmcmFtZSA9IEJ1ZmZlci5mcm9tKFtXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFLCAweDAwXSlcblxuICAgIGNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBmcmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhbmRsZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIC8vIFNlcmlhbGl6ZSBwZXItc2Vzc2lvbjogY2hhaW4gb250byBgX21lc3NhZ2VDaGFpbmAgc28gbWVzc2FnZXNcbiAgICAvLyBhcmUgcHJvY2Vzc2VkIG9uZSBhdCBhIHRpbWUuIFdpdGhvdXQgdGhpcywgZmlyZS1hbmQtZm9yZ2V0XG4gICAgLy8gZGlzcGF0Y2ggZnJvbSBgX3Byb2Nlc3NCdWZmZXJgIGxldHMgbWVzc2FnZSBCIHJlYWRcbiAgICAvLyBgc2Vzc2lvbi5kYXRhYCBiZWZvcmUgQSBoYXMgZmluaXNoZWQgd3JpdGluZyBpdC5cbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX21lc3NhZ2VDaGFpblxuICAgIGNvbnN0IG5leHQgPSBwcmV2aW91cy50aGVuKCgpID0+IHRoaXMuX2Rpc3BhdGNoTWVzc2FnZShtZXNzYWdlKSlcblxuICAgIHRoaXMuX21lc3NhZ2VDaGFpbiA9IG5leHQuY2F0Y2goKCkgPT4ge30pXG4gICAgYXdhaXQgbmV4dFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGlzcGF0Y2ggbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9kaXNwYXRjaE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdD8uKClcblxuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICBhd2FpdCB3cmFwcGVyKHRoaXMsICgpID0+IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgbWVzc2FnZSBkaXNwYXRjaCwgZXh0cmFjdGVkIHNvXG4gICAqIGBjb25maWd1cmF0aW9uLmdldFdlYnNvY2tldEFyb3VuZFJlcXVlc3QoKWAgY2FuIHdyYXAgaXQgaW4gYW55XG4gICAqIHBlci1yZXF1ZXN0IGNvbnRleHQgKEFzeW5jTG9jYWxTdG9yYWdlLCB0cmFjaW5nLCBldGMuKS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlSW5uZXIobWVzc2FnZSkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVGhlIG1lc3NhZ2VIYW5kbGVyIHNob3J0LWNpcmN1aXRzIGRlZmF1bHQgcm91dGluZyBvbmx5IHdoZW4gdGhlXG4gICAgLy8gYXBwIGFjdHVhbGx5IGRlY2xhcmVkIGFuIGBvbk1lc3NhZ2VgIGhvb2suIEFwcHMgdGhhdCBvbmx5IHdhbnRcbiAgICAvLyBzZXNzaW9uLWxpZmVjeWNsZSB0cmFja2luZyAoYG9uT3BlbmAvYG9uQ2xvc2VgKSBzdGlsbCBuZWVkIHRoZVxuICAgIC8vIGJ1aWx0LWluIHN1YnNjcmliZS9jb25uZWN0aW9uL2NoYW5uZWwtc3Vic2NyaWJlIHJvdXRpbmcgYmVsb3csXG4gICAgLy8gb3RoZXJ3aXNlIGV2ZXJ5IGluY29taW5nIG1lc3NhZ2UgaXMgc2lsZW50bHkgZHJvcHBlZC5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlciAmJiB0eXBlb2YgdGhpcy5tZXNzYWdlSGFuZGxlci5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdWJzY3JpYmVQYXlsb2FkID0gc3Vic2NyaWJlTWVzc2FnZShtZXNzYWdlKVxuXG4gICAgaWYgKHN1YnNjcmliZVBheWxvYWQpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSA9IHN1YnNjcmliZVBheWxvYWRcblxuICAgICAgaWYgKCFjaGFubmVsKSB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIGlzIHJlcXVpcmVkIGZvciBzdWJzY3JpYmVcIilcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgICAgaWYgKHJlc29sdmVyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0NoYW5uZWwoY2hhbm5lbCwge2Fja25vd2xlZGdlOiB0cnVlLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJtZXRhZGF0YVwiKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YVBheWxvYWQgPSAvKiogQHR5cGUge3tkYXRhPzogUmVjb3JkPHN0cmluZywgPz59fSAqLyAobWVzc2FnZSlcblxuICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YVBheWxvYWQuZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGFQYXlsb2FkLmRhdGEgPT09IFwib2JqZWN0XCIgPyB7Li4ubWV0YWRhdGFQYXlsb2FkLmRhdGF9IDoge31cblxuICAgICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCh0aGlzLl9tZXRhZGF0YSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwic2Vzc2lvbi1yZXN1bWVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLW9wZW5cIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbk9wZW4obWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1tZXNzYWdlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tY2xvc2VcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbkNsb3NlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtc3Vic2NyaWJlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY2hhbm5lbC11bnN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsVW5zdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikge1xuICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IGBVbmtub3duIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlLnR5cGV9YCwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSlcblxuICAgIGlmICghcmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7Ym9keSwgaGVhZGVycywgaWQsIG1ldGhvZCwgcGF0aH0gPSByZXF1ZXN0UGF5bG9hZFxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBFcnJvcihcIm1ldGhvZCBpcyByZXF1aXJlZFwiKVxuICAgIGlmICghcGF0aCkgdGhyb3cgbmV3IEVycm9yKFwicGF0aCBpcyByZXF1aXJlZFwiKVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBXZWJzb2NrZXRSZXF1ZXN0KHtcbiAgICAgIGJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0YWRhdGE6IHRoaXMuZ2V0TWV0YWRhdGEoKSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGgsXG4gICAgICByZW1vdGVBZGRyZXNzOiB0aGlzLnJlbW90ZUFkZHJlc3MoKVxuICAgIH0pXG4gICAgY29uc3QgcmVxdWVzdFJ1bm5lciA9IG5ldyBSZXF1ZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHJlcXVlc3RcbiAgICB9KVxuXG4gICAgcmVxdWVzdFJ1bm5lci5ldmVudHMub24oXCJkb25lXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVxdWVzdFJ1bm5lci5yZXNwb25zZVxuICAgICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmdldEJvZHkoKVxuICAgICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnNcblxuICAgICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGlkLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCksXG4gICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKSxcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiXG4gICAgICB9KVxuICAgICAgdm9pZCByZXF1ZXN0UnVubmVyLmxvZ0NvbXBsZXRlZFJlcXVlc3QoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBsb2cgY29tcGxldGVkIHJlcXVlc3RcIiwgZXJyb3IpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBhd2FpdCByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcm9jZXNzIGJ1ZmZlci5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3Byb2Nlc3NCdWZmZXIoKSB7XG4gICAgd2hpbGUgKHRoaXMuYnVmZmVyLmxlbmd0aCA+PSAyKSB7XG4gICAgICBjb25zdCBmaXJzdEJ5dGUgPSB0aGlzLmJ1ZmZlclswXVxuICAgICAgY29uc3Qgc2Vjb25kQnl0ZSA9IHRoaXMuYnVmZmVyWzFdXG4gICAgICBjb25zdCBpc0ZpbmFsID0gKGZpcnN0Qnl0ZSAmIFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSkgPT09IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRVxuICAgICAgY29uc3Qgb3Bjb2RlID0gZmlyc3RCeXRlICYgMHgwRlxuICAgICAgY29uc3QgaXNNYXNrZWQgPSAoc2Vjb25kQnl0ZSAmIDB4ODApID09PSAweDgwXG4gICAgICBsZXQgcGF5bG9hZExlbmd0aCA9IHNlY29uZEJ5dGUgJiAweDdGXG4gICAgICBsZXQgb2Zmc2V0ID0gMlxuXG4gICAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyAyKSByZXR1cm5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZCRShvZmZzZXQpXG4gICAgICAgIG9mZnNldCArPSAyXG4gICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgb2Zmc2V0ICsgOCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGJpZ0xlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRCaWdVSW50NjRCRShvZmZzZXQpXG5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IE51bWJlcihiaWdMZW5ndGgpXG4gICAgICAgIG9mZnNldCArPSA4XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hc2tMZW5ndGggPSBpc01hc2tlZCA/IDQgOiAwXG5cbiAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aCkgcmV0dXJuXG5cbiAgICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IHBheWxvYWQgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQgKyBtYXNrTGVuZ3RoLCBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aClcblxuICAgICAgaWYgKGlzTWFza2VkKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIG1hc2tMZW5ndGgpXG4gICAgICAgIHBheWxvYWQgPSB0aGlzLl91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc2xpY2Uob2Zmc2V0ICsgbWFza0xlbmd0aCArIHBheWxvYWRMZW5ndGgpXG5cbiAgICAgIC8vIENvbnRyb2wgZnJhbWVzIChvcGNvZGUgPj0gMHg4KSBtdXN0IG5vdCBiZSBmcmFnbWVudGVkIHBlclxuICAgICAgLy8gUkZDIDY0NTUgYW5kIGNhbiBhcnJpdmUgaW50ZXJsZWF2ZWQgd2l0aCBhIGZyYWdtZW50ZWQgZGF0YVxuICAgICAgLy8gbWVzc2FnZS4gSGFuZGxlIHRoZW0gZmlyc3Qgd2l0aG91dCB0b3VjaGluZyB0aGUgZnJhZ21lbnRcbiAgICAgIC8vIGFjY3VtdWxhdG9yLlxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9QSU5HKSB7XG4gICAgICAgIHRoaXMuX3NlbmRDb250cm9sRnJhbWUoV0VCU09DS0VUX09QQ09ERV9QT05HLCBwYXlsb2FkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFKSB7XG4gICAgICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlKClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9QT05HKSB7XG4gICAgICAgIC8vIEFuc3dlciB0byBhIGhlYXJ0YmVhdCBwaW5nOyBsaXZlbmVzcyBpcyByZWNvcmRlZCBpbiBvbkRhdGEuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPj0gMHg4KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBjb250cm9sIG9wY29kZTogJHtvcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gRGF0YSBmcmFtZSAoVEVYVC9CSU5BUlkvQ09OVElOVUFUSU9OKS4gUmVhc3NlbWJsZSBmcmFnbWVudHNcbiAgICAgIC8vIGJlZm9yZSBkaXNwYXRjaGluZy4gQnJvd3NlcnMgKENocm9tZSkgbGVnaXRpbWF0ZWx5IGZyYWdtZW50XG4gICAgICAvLyBsb25nZXIgY2xpZW504oaSc2VydmVyIHRleHQgZnJhbWVzOyBhIHByaW9yIHZlcnNpb24gZHJvcHBlZFxuICAgICAgLy8gZXZlcnkgZnJhZ21lbnRlZCBtZXNzYWdlIHNpbGVudGx5LCBzbyBhbnkgcGF5bG9hZCBsYXJnZVxuICAgICAgLy8gZW5vdWdoIHRvIGhpdCB0aGUgYnJvd3NlcidzIGZyYWdtZW50YXRpb24gdGhyZXNob2xkXG4gICAgICAvLyAoZS5nLiBhIGNoYW5uZWwtc3Vic2NyaWJlIHdpdGggYW4gYXV0aCB0b2tlbikgbmV2ZXIgcmVhY2hlZFxuICAgICAgLy8gdGhlIGhhbmRsZXIuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTikge1xuICAgICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlJlY2VpdmVkIGNvbnRpbnVhdGlvbiBmcmFtZSB3aXRoIG5vIGZyYWdtZW50ZWQgbWVzc2FnZSBpbiBwcm9ncmVzc1wiKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2FwcGVuZEZyYWdtZW50KHBheWxvYWQpKSByZXR1cm5cblxuICAgICAgICBpZiAoIWlzRmluYWwpIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9URVhUIHx8IG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9CSU5BUlkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNlaXZlZCBuZXcgZGF0YSBmcmFtZSB3aGlsZSBhIGZyYWdtZW50ZWQgbWVzc2FnZSB3YXMgaW4gcHJvZ3Jlc3M7IGRpc2NhcmRpbmcgcHJpb3IgZnJhZ21lbnRzXCIpXG4gICAgICAgICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRmluYWwpIHtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBbcGF5bG9hZF1cbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gb3Bjb2RlXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gcGF5bG9hZC5sZW5ndGhcblxuICAgICAgICAgIGlmICghdGhpcy5fZW5mb3JjZUZyYWdtZW50TGltaXRzKCkpIHJldHVyblxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGRhdGEgb3Bjb2RlOiAke29wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIERlZmluZXMgZmluYWxQYXlsb2FkLlxuICAgICAgICogQHR5cGUge0J1ZmZlcn0gKi9cbiAgICAgIGxldCBmaW5hbFBheWxvYWRcbiAgICAgIC8qKlxuICAgICAgICogRGVmaW5lcyBmaW5hbE9wY29kZS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICBsZXQgZmluYWxPcGNvZGVcblxuICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyAhPT0gbnVsbCkge1xuICAgICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTikge1xuICAgICAgICAgIGZpbmFsUGF5bG9hZCA9IEJ1ZmZlci5jb25jYXQodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzKVxuICAgICAgICAgIGZpbmFsT3Bjb2RlID0gdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA/PyBXRUJTT0NLRVRfT1BDT0RFX1RFWFRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBheWxvYWQgPSBwYXlsb2FkXG4gICAgICAgICAgZmluYWxPcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsUGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgZmluYWxPcGNvZGUgPSBvcGNvZGVcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsT3Bjb2RlICE9PSBXRUJTT0NLRVRfT1BDT0RFX1RFWFQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGRhdGEgb3Bjb2RlIGFmdGVyIHJlYXNzZW1ibHk6ICR7ZmluYWxPcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZmluYWxQYXlsb2FkLnRvU3RyaW5nKFwidXRmLThcIikpXG5cbiAgICAgICAgdGhpcy5faGFuZGxlTWVzc2FnZShtZXNzYWdlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2UsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3JdKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogXCJJbnZhbGlkIHdlYnNvY2tldCBtZXNzYWdlXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjb250aW51YXRpb24tZnJhbWUgcGF5bG9hZCB0byB0aGUgaW4tcHJvZ3Jlc3NcbiAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZnJhZ21lbnQgd2FzIGFjY2VwdGVkXG4gICAqIGFuZCBmYWxzZSB3aGVuIHRoZSBwZXItbWVzc2FnZSBjYXAgd2FzIGhpdCBhbmQgdGhlIHNvY2tldCBoYXNcbiAgICogYmVlbiBjbG9zZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgX2FwcGVuZEZyYWdtZW50KHBheWxvYWQpIHtcbiAgICAvLyBHdWFyZCBwdXNoaW5nIGZpcnN0IHNvIGBfZW5mb3JjZUZyYWdtZW50TGltaXRzYCBzZWVzIHRoZSBmaW5hbFxuICAgIC8vIHN0YXRlOyBvbiBvdmVyZmxvdyB0aGUgcmVzZXQgaW5zaWRlIHRoZSBlbmZvcmNlciBkcm9wcyB0aGVcbiAgICAvLyBidWZmZXJlZCBmcmFnbWVudHMuXG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzPy5wdXNoKHBheWxvYWQpXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzICs9IHBheWxvYWQubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5fZW5mb3JjZUZyYWdtZW50TGltaXRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZnJhZ21lbnRlZCBtZXNzYWdlIGhhcyBub3QgZXhjZWVkZWQgdGhlIGJ5dGUgb3JcbiAgICogZnJhZ21lbnQtY291bnQgY2Fwcy4gT24gb3ZlcmZsb3csIGNsZWFycyB0aGUgYnVmZmVyLCBzZW5kcyBhXG4gICAqIGNsb3NlIGZyYW1lLCBhbmQgdGVhcnMgdGhlIHNlc3Npb24gZG93bi4gUmV0dXJucyB0cnVlIHdoZW4gdGhlXG4gICAqIGNhbGxlciBjYW4gY29udGludWUgcHJvY2Vzc2luZywgZmFsc2Ugd2hlbiB0aGUgc2Vzc2lvbiBpcyBiZWluZ1xuICAgKiBjbG9zZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgX2VuZm9yY2VGcmFnbWVudExpbWl0cygpIHtcbiAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID09PSBudWxsKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgZnJhZ21lbnRDb3VudCA9IHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2Fkcy5sZW5ndGhcbiAgICBjb25zdCBvdmVyQnl0ZXMgPSB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU1xuICAgIGNvbnN0IG92ZXJGcmFnbWVudHMgPSBmcmFnbWVudENvdW50ID4gV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTXG5cbiAgICBpZiAoIW92ZXJCeXRlcyAmJiAhb3ZlckZyYWdtZW50cykgcmV0dXJuIHRydWVcblxuICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1xuICAgICAgXCJGcmFnbWVudGVkIHdlYnNvY2tldCBtZXNzYWdlIGV4Y2VlZGVkIGNhcHM7IGNsb3NpbmcgY29ubmVjdGlvblwiLFxuICAgICAge1xuICAgICAgICBmcmFnbWVudEJ5dGVzOiB0aGlzLl9mcmFnbWVudGVkQnl0ZXMsXG4gICAgICAgIGZyYWdtZW50Q291bnQsXG4gICAgICAgIG1heEJ5dGVzOiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFUyxcbiAgICAgICAgbWF4RnJhZ21lbnRzOiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFNcbiAgICAgIH1cbiAgICBdKVxuXG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMClcbiAgICB0aGlzLnNlbmRHb29kYnllKHRoaXMuY2xpZW50KVxuICAgIHRoaXMuX2hhbmRsZUNsb3NlKClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzZXQgZnJhZ21lbnQgYnVmZmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKSB7XG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBudWxsXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0LiBFYWNoIHRpY2sgcGluZ3MgdGhlIGNsaWVudCBhbmRcbiAgICogcmVhcHMgdGhlIHNlc3Npb24gaWYgdGhlIHByZXZpb3VzIHBpbmcgd2VudCB1bmFuc3dlcmVkLCBzbyBhXG4gICAqIGhhbGYtb3BlbiBzb2NrZXQgKGNsaWVudCBnb25lIHdpdGhvdXQgYSBUQ1AgRklOIC8gY2xvc2UgZnJhbWUpXG4gICAqIGNhbm5vdCBsaW5nZXIgZm9yZXZlciBob2xkaW5nIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy4gRGlzYWJsZWQgd2hlblxuICAgKiB0aGUgY29uZmlndXJlZCBpbnRlcnZhbCBpcyAwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zdGFydEhlYXJ0YmVhdCgpIHtcbiAgICBjb25zdCBpbnRlcnZhbFNlY29uZHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbkhlYXJ0YmVhdFNlY29uZHMoKVxuXG4gICAgaWYgKCFpbnRlcnZhbFNlY29uZHMgfHwgaW50ZXJ2YWxTZWNvbmRzIDw9IDApIHJldHVyblxuXG4gICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLl9oZWFydGJlYXRUaWNrKCksIGludGVydmFsU2Vjb25kcyAqIDEwMDApXG5cbiAgICAvLyBEb24ndCBsZXQgdGhlIGhlYXJ0YmVhdCB0aW1lciBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlLlxuICAgIGlmICh0eXBlb2YgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYoKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSBoZWFydGJlYXQgY3ljbGUuIFJlYXBzIHRoZSBzZXNzaW9uIHZpYSB0aGUgbm9ybWFsIGNsb3NlIHBhdGhcbiAgICogd2hlbiB0aGUgcHJldmlvdXMgcGluZyB3YXMgbm90IGFuc3dlcmVkOyBvdGhlcndpc2UgbWFya3MgaXRcbiAgICogcGVuZGluZyBhbmQgcGluZ3MgYWdhaW4uIEJyb3dzZXJzIGFuZCBSZWFjdCBOYXRpdmUgc29ja2V0cyBhbnN3ZXJcbiAgICogc2VydmVyIHBpbmdzIHdpdGggYW4gYXV0b21hdGljIHBvbmcsIHdoaWNoIGxhbmRzIGluIGBfcHJvY2Vzc0J1ZmZlcmBcbiAgICogYW5kIHJlLW1hcmtzIHRoZSBzZXNzaW9uIGFsaXZlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9oZWFydGJlYXRUaWNrKCkge1xuICAgIGlmICh0aGlzLl9wYXVzZWQgfHwgIXRoaXMuY2xpZW50Py5ldmVudHMpIHJldHVyblxuXG4gICAgaWYgKCF0aGlzLl9oZWFydGJlYXRBbGl2ZSkge1xuICAgICAgLy8gTm8gZnJhbWUgYXJyaXZlZCBzaW5jZSB0aGUgbGFzdCBwaW5nIOKAlCB0aGUgc29ja2V0IGlzIGRlYWQuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGBfaGFuZGxlQ2xvc2VgIHNvIHJlc3VtYWJsZSBzdGF0ZSBzdGlsbCBwYXVzZXNcbiAgICAgIC8vIGZvciB0aGUgZ3JhY2Ugd2luZG93IGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgdG9ybiBkb3duLlxuICAgICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fc2VuZENvbnRyb2xGcmFtZShXRUJTT0NLRVRfT1BDT0RFX1BJTkcsIEJ1ZmZlci5hbGxvYygwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0IHRpbWVyLCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3N0b3BIZWFydGJlYXQoKSB7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKVxuICAgICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBjb250cm9sIGZyYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gb3Bjb2RlIC0gT3Bjb2RlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRDb250cm9sRnJhbWUob3Bjb2RlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBvcGNvZGVcbiAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGpzb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kSnNvbihib2R5KSB7XG4gICAgLy8gV2hpbGUgcGF1c2VkICh3YWl0aW5nIGZvciBhIHJlc3VtZSksIHN0YXNoIGZyYW1lcyBpbiBhblxuICAgIC8vIG91dGJvdW5kIHF1ZXVlIGFuZCBmbHVzaCB0aGVtIGluIG9yZGVyIG9uIHJlc3VtZS4gQ2FwcGVkIHRvXG4gICAgLy8gcHJldmVudCBydW5hd2F5IG1lbW9yeSB1c2Ugd2hpbGUgdGhlIGNsaWVudCBpcyBvZmZsaW5lLlxuICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgIHRoaXMuX291dGJvdW5kUXVldWUgfHw9IFtdXG5cbiAgICAgIGlmICh0aGlzLl9vdXRib3VuZFF1ZXVlLmxlbmd0aCA+PSBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCkge1xuICAgICAgICAvLyBEcm9wIG9sZGVzdCBzbyB0aGUgbW9zdCByZWNlbnQgYWN0aXZpdHkgd2lucyBvbiByZXN1bWUuXG4gICAgICAgIHRoaXMuX291dGJvdW5kUXVldWUuc2hpZnQoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnB1c2goYm9keSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5jbGllbnQ/LmV2ZW50cykgcmV0dXJuXG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmZyb20oanNvbiwgXCJ1dGYtOFwiKVxuICAgIGxldCBoZWFkZXJcblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDEyNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG4gICAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5sZW5ndGggPCA2NTUzNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgICBoZWFkZXJbMV0gPSAxMjZcbiAgICAgIGhlYWRlci53cml0ZVVJbnQxNkJFKHBheWxvYWQubGVuZ3RoLCAyKVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMTApXG4gICAgICBoZWFkZXJbMV0gPSAxMjdcbiAgICAgIGhlYWRlci53cml0ZUJpZ1VJbnQ2NEJFKEJpZ0ludChwYXlsb2FkLmxlbmd0aCksIDIpXG4gICAgfVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9URVhUXG5cbiAgICB0aGlzLmNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIHBheWxvYWRdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWUgb3ZlciB0aGUgY3VycmVudCBzb2NrZXQuXG4gICAqIENhbGxlZCBkdXJpbmcgcmVzdW1lIGFmdGVyIGBzZXNzaW9uLXJlc3VtZWRgIGhhcyBiZWVuIHNlbnQgb25cbiAgICogdGhlIE5FVyBzZXNzaW9uJ3Mgc29ja2V0IChub3QgdGhpcyBzZXNzaW9uJ3MpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9mbHVzaE91dGJvdW5kUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8IFtdXG5cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbihib2R5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN1YnNjcmliZSB0byBjaGFubmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YWNrbm93bGVkZ2U/OiBib29sZWFuLCBjaGFubmVsSGFuZGxlcj86IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Piwgc3Vic2NyaXB0aW9uQ2hhbm5lbD86IHN0cmluZ319IFtvcHRpb25zXSAtIFN1YnNjcmliZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gd2FzIGFkZGVkLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlVG9DaGFubmVsKGNoYW5uZWwsIHthY2tub3dsZWRnZSA9IHRydWUsIGNoYW5uZWxIYW5kbGVyLCBsYXN0RXZlbnRJZCwgcGFyYW1zLCBzdWJzY3JpcHRpb25DaGFubmVsfSA9IHt9KSB7XG4gICAgYXdhaXQgd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKS5tYXJrQ2hhbm5lbEludGVyZXN0ZWQoY2hhbm5lbClcblxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gYXdhaXQgdGhpcy5fcHJlcGFyZVJlcGxheVN0YXRlKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBsYXN0RXZlbnRJZCxcbiAgICAgIHN1YnNjcmlwdGlvbkNoYW5uZWw6IHN1YnNjcmlwdGlvbkNoYW5uZWwgfHwgY2hhbm5lbCxcbiAgICAgIHN1YnNjcmlwdGlvblBhcmFtczogcGFyYW1zXG4gICAgfSlcblxuICAgIGlmIChyZXBsYXlTdGF0ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuICAgIGlmIChyZXBsYXlTdGF0ZSkge1xuICAgICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLnNldChjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICB9XG5cbiAgICB0aGlzLmFkZFN1YnNjcmlwdGlvbihjaGFubmVsKVxuXG4gICAgaWYgKGNoYW5uZWxIYW5kbGVyKSB7XG4gICAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuaGFzKGNoYW5uZWwpKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuc2V0KGNoYW5uZWwsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoY2hhbm5lbCk/LmFkZChjaGFubmVsSGFuZGxlcilcblxuICAgICAgaWYgKCF0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmhhcyhjaGFubmVsSGFuZGxlcikpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5zZXQoY2hhbm5lbEhhbmRsZXIsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbEhhbmRsZXIpPy5hZGQoY2hhbm5lbClcbiAgICB9XG5cbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3JlcGxheUNoYW5uZWxFdmVudHMoe2NoYW5uZWwsIHJlcGxheVN0YXRlfSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2ZpbmlzaFJlcGxheVN0YXRlKGNoYW5uZWwsIHJlcGxheVN0YXRlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY2tub3dsZWRnZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgdHlwZTogXCJzdWJzY3JpYmVkXCJ9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2hhbmRsZUNsb3NlKCkge1xuICAgIC8vIElmIHRoZSBzZXNzaW9uIGhhcyByZXN1bWFibGUgc3RhdGUgKGxpdmUgQ29ubmVjdGlvbiBvclxuICAgIC8vIENoYW5uZWxWMiBzdWJzY3JpcHRpb24pLCBtb3ZlIGl0IGludG8gdGhlIHBhdXNlZCByZWdpc3RyeVxuICAgIC8vIGluc3RlYWQgb2YgdGVhcmluZyBkb3duOyBhIG5ldyBzb2NrZXQgcHJlc2VudGluZyB0aGUgc2Vzc2lvbklkXG4gICAgLy8gdmlhIGBzZXNzaW9uLXJlc3VtZWAgd2l0aGluIHRoZSBncmFjZSB3aW5kb3cgd2lsbCByZWF0dGFjaC5cbiAgICBjb25zdCBoYXNSZXN1bWFibGVTdGF0ZSA9IHRoaXMuX2Nvbm5lY3Rpb25zLnNpemUgPiAwIHx8IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNpemUgPiAwXG5cbiAgICBpZiAoaGFzUmVzdW1hYmxlU3RhdGUgJiYgIXRoaXMuX3BhdXNlZCkge1xuICAgICAgLy8gUGF1c2VkIHNlc3Npb25zIGhhdmUgbm8gbGl2ZSBzb2NrZXQgdG8gcGluZzsgdGhlIGdyYWNlIHRpbWVyXG4gICAgICAvLyBvd25zIHRoZWlyIGV2ZW50dWFsIHRlYXJkb3duIGZyb20gaGVyZS5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAvLyBLaWNrIG9mZiBhdXRoLWlkZW50aXR5IGNhcHR1cmUgZm9yIHJlc3VtZSB2ZXJpZmljYXRpb24uIFJ1bnNcbiAgICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kIOKAlCBgX2hhbmRsZVNlc3Npb25SZXN1bWVgIGF3YWl0c1xuICAgICAgLy8gYF9yZXN1bWVJZGVudGl0eVByb21pc2VgIGJlZm9yZSBjb21wYXJpbmcuIFBhdXNlIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gaXMgc3luY2hyb25vdXMgc28gYSByZXN1bWUgYXJyaXZpbmcgaW1tZWRpYXRlbHkgc3RpbGwgZmluZHNcbiAgICAgIC8vIHRoZSBzZXNzaW9uLlxuICAgICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdGhpcy5fY2FwdHVyZVJlc3VtZUlkZW50aXR5KClcbiAgICAgIHZvaWQgdGhpcy5fZmlyZU9uRGlzY29ubmVjdCgpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3BhdXNlV2Vic29ja2V0U2Vzc2lvbih0aGlzKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyYWNlIHRpbWVyIHdoZW4gdGhlIHBhdXNlZCBwZXJpb2QgZXhwaXJlcyB3aXRob3V0XG4gICAqIGEgcmVzdW1lLiBUZWFycyBkb3duIGFsbCBsaXZlIENvbm5lY3Rpb25zICsgQ2hhbm5lbCBzdWJzIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluYWxpemVHcmFjZUV4cGlyeSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcImdyYWNlX2V4cGlyZWRcIilcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGNvbmZpZ3VyZWQgaWRlbnRpdHkgcmVzb2x2ZXIgYWdhaW5zdCB0aGlzIHNlc3Npb24uXG4gICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHN0b3JlZCBhdCBwYXVzZSB0aW1lIGFuZCBhd2FpdGVkIGF0XG4gICAqIHJlc3VtZSB0aW1lIHNvIHdlIGNhbiByZWplY3QgcmVzdW1lIGF0dGVtcHRzIGZyb20gYSBkaWZmZXJlbnRcbiAgICogYXV0aGVudGljYXRlZCBjYWxsZXIgKHNpZ25lZCBvdXQsIHN3YXBwZWQgdXNlciwgZXhwaXJlZCBjb29raWUpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn1cbiAgICovXG4gIGFzeW5jIF9jYXB0dXJlUmVzdW1lSWRlbnRpdHkoKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXI/LigpXG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IHNlc3Npb24gaWRlbnRpdHkgcmVzb2x2ZXIgZmFpbGVkIGF0IHBhdXNlXCIsIGVycm9yXSlcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uRGlzY29ubmVjdGAgb24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIGFuZCBDaGFubmVsIHN1YiBzb1xuICAgKiBhcHBzIGNhbiBwYXVzZSBwZXItaW5zdGFuY2Ugd29yayB3aGlsZSB0aGUgc2Vzc2lvbiBpcyBwYXVzZWQuXG4gICAqIEVycm9ycyBhcmUgbG9nZ2VkLCBub3QgcmV0aHJvd24g4oCUIG9uZSBicm9rZW4gaGFuZGxlciBtdXN0IG5vdFxuICAgKiBibG9jayB0aGUgcmVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uRGlzY29ubmVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLl9maXJlTGlmZWN5Y2xlQ2FsbGJhY2soXCJvbkRpc2Nvbm5lY3RcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25SZXN1bWVgIG9uIGV2ZXJ5IGxpdmUgQ29ubmVjdGlvbiBhbmQgQ2hhbm5lbCBzdWIgYWZ0ZXJcbiAgICogYSBzdWNjZXNzZnVsIGBzZXNzaW9uLXJlc3VtZWAgaGFuZG9mZi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uUmVzdW1lKCkge1xuICAgIGF3YWl0IHRoaXMuX2ZpcmVMaWZlY3ljbGVDYWxsYmFjayhcIm9uUmVzdW1lXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaXJlIGxpZmVjeWNsZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtcIm9uRGlzY29ubmVjdFwiIHwgXCJvblJlc3VtZVwifSBjYWxsYmFja05hbWUgTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGZpcmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIGV2ZXJ5IGxpdmUgaGFuZGxlciBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gICAqL1xuICBhc3luYyBfZmlyZUxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSkge1xuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbltjYWxsYmFja05hbWVdPy4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2Ake2NhbGxiYWNrTmFtZX0gZmFpbGVkIGZvciAke2Nvbm5lY3Rpb24uY29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHtzdWJzY3JpcHRpb259IG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb25bY2FsbGJhY2tOYW1lXT8uKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgJHtjYWxsYmFja05hbWV9IGZhaWxlZCBmb3IgY2hhbm5lbCBzdWIgJHtzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJzZXNzaW9uLXJlc3VtZVwifWAuIFRoaXMgc2Vzc2lvbiAodGhlIG5ld2x5LVxuICAgKiBjcmVhdGVkIG9uZSB3aG9zZSBzb2NrZXQganVzdCBjb25uZWN0ZWQpIHRyYW5zZmVycyBzdGF0ZSBmcm9tXG4gICAqIHRoZSBwYXVzZWQgc2Vzc2lvbiBhbmQgaW5zdHJ1Y3RzIHRoZSBjbGllbnQgdmlhXG4gICAqIGBzZXNzaW9uLXJlc3VtZWRgIG9yIGBzZXNzaW9uLWdvbmVgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSkge1xuICAgIGNvbnN0IHJlc3VtZVNlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG5cbiAgICBpZiAodHlwZW9mIHJlc3VtZVNlc3Npb25JZCAhPT0gXCJzdHJpbmdcIiB8fCAhcmVzdW1lU2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5fZmluZFBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgaWYgKCFwYXVzZWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQXV0aCByZS12ZXJpZnk6IGNvbXBhcmUgdGhlIGZyZXNoIGNhbGxlcidzIGlkZW50aXR5IGFnYWluc3QgdGhlXG4gICAgLy8gb25lIGNhcHR1cmVkIGF0IHBhdXNlLiBNaXNtYXRjaCBtZWFucyBhIGRpZmZlcmVudCB1c2VyIChvciBhXG4gICAgLy8gc2lnbmVkLW91dCBzZXNzaW9uKSBpcyB0cnlpbmcgdG8gcmVjbGFpbSBzdGF0ZSB0aGF0IGlzbid0XG4gICAgLy8gdGhlaXJzIOKAlCBkZXN0cm95IHRoZSBwYXVzZWQgc2Vzc2lvbiBvdXRyaWdodC5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcj8uKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgcGF1c2VkSWRlbnRpdHkgPSBhd2FpdCBwYXVzZWQuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZVxuICAgICAgbGV0IGZyZXNoSWRlbnRpdHlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IGF3YWl0IHJlc29sdmVyKHRoaXMpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgc2Vzc2lvbiBpZGVudGl0eSByZXNvbHZlciBmYWlsZWQgYXQgcmVzdW1lXCIsIGVycm9yXSlcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAoIWlkZW50aXRpZXNNYXRjaChwYXVzZWRJZGVudGl0eSwgZnJlc2hJZGVudGl0eSkpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuICAgICAgICBwYXVzZWQuX2ZpbmFsaXplR3JhY2VFeHBpcnkoKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgLy8gVHJhbnNmZXIgcmVzdW1hYmxlIHN0YXRlIG9udG8gdGhpcyAobGl2ZSkgc2Vzc2lvbi4gVGhlIHBhdXNlZFxuICAgIC8vIHNlc3Npb24gc2hlbGwgaXMgZGlzY2FyZGVkIGFmdGVyIHRoZSB0cmFuc2Zlci5cbiAgICBmb3IgKGNvbnN0IFtjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb25dIG9mIHBhdXNlZC5fY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3ViSWQsIGVudHJ5XSBvZiBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJJZCwgZW50cnkpXG4gICAgfVxuXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7Li4ucGF1c2VkLl9tZXRhZGF0YX1cbiAgICB0aGlzLmRhdGEgPSBwYXVzZWQuZGF0YVxuICAgIHRoaXMuc2Vzc2lvbklkID0gcmVzdW1lU2Vzc2lvbklkXG5cbiAgICAvLyBUcmFuc2ZlciBhbnkgZnJhbWVzIHF1ZXVlZCB3aGlsZSB0aGUgcGF1c2VkIHNlc3Npb24gaGFkIG5vXG4gICAgLy8gc29ja2V0LiBUaGV5IGZsdXNoIEFGVEVSIHNlc3Npb24tcmVzdW1lZCBzbyB0aGUgY2xpZW50IGtub3dzXG4gICAgLy8gd2hpY2ggc2Vzc2lvbiB0aGV5IGJlbG9uZyB0by5cbiAgICBjb25zdCBxdWV1ZWQgPSBwYXVzZWQuX291dGJvdW5kUXVldWUgfHwgW11cblxuICAgIHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSA9IFtdXG4gICAgcGF1c2VkLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9wYXVzZWQgPSBmYWxzZVxuICAgIHBhdXNlZC5kZXN0cm95KClcblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVkXCIsIHNlc3Npb25JZDogcmVzdW1lU2Vzc2lvbklkfSlcbiAgICBmb3IgKGNvbnN0IGJvZHkgb2YgcXVldWVkKSB0aGlzLnNlbmRKc29uKGJvZHkpXG4gICAgYXdhaXQgdGhpcy5fZmlyZU9uUmVzdW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25DbG9zZShyZWFzb24pYCBvbiBldmVyeSBsaXZlIGFwcC1kZWZpbmVkIGNvbm5lY3Rpb24sIHRoZW5cbiAgICogZHJvcHMgdGhlbSBmcm9tIHRoZSByZWdpc3RyeS4gTm8gbmV0d29yayBmcmFtZSBpcyBzZW50IOKAlCB0aGVcbiAgICogc29ja2V0IGlzIGFscmVhZHkgZ29pbmcgYXdheS5cbiAgICogQHBhcmFtIHtcInNlc3Npb25fZGVzdHJveWVkXCIgfCBcImdyYWNlX2V4cGlyZWRcIiB8IFwiZXJyb3JcIn0gcmVhc29uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ29ubmVjdGlvbnMocmVhc29uKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UocmVhc29uKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuXCJ9YCBtZXNzYWdlIOKAlCBpbnN0YW50aWF0ZXMgdGhlXG4gICAqIHJlZ2lzdGVyZWQgY29ubmVjdGlvbiBjbGFzcywgc3RvcmVzIGl0IG9uIGBfY29ubmVjdGlvbnNgLCBhbmRcbiAgICogZmlyZXMgYG9uQ29ubmVjdCgpYC4gU2VuZHMgYGNvbm5lY3Rpb24tb3BlbmVkYCBvbiBzdWNjZXNzIG9yXG4gICAqIGBjb25uZWN0aW9uLWVycm9yYCBvbiBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25PcGVuKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb25UeXBlID0gbWVzc2FnZS5jb25uZWN0aW9uVHlwZVxuICAgIGNvbnN0IHBhcmFtcyA9IG1lc3NhZ2UucGFyYW1zIHx8IHt9XG5cbiAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb25JZCAhPT0gXCJzdHJpbmdcIiB8fCAhY29ubmVjdGlvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImVycm9yXCIsIGVycm9yOiBcImNvbm5lY3Rpb24tb3BlbiByZXF1aXJlcyBjb25uZWN0aW9uSWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb25UeXBlICE9PSBcInN0cmluZ1wiIHx8ICFjb25uZWN0aW9uVHlwZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogXCJjb25uZWN0aW9uVHlwZSBpcyByZXF1aXJlZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25uZWN0aW9ucy5oYXMoY29ubmVjdGlvbklkKSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogXCJDb25uZWN0aW9uIGlkIGFscmVhZHkgaW4gdXNlXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgQ29ubmVjdGlvbkNsYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENvbm5lY3Rpb25DbGFzcz8uKGNvbm5lY3Rpb25UeXBlKVxuXG4gICAgaWYgKCFDb25uZWN0aW9uQ2xhc3MpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IGBVbmtub3duIGNvbm5lY3Rpb24gdHlwZTogJHtjb25uZWN0aW9uVHlwZX1gfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbkNsYXNzKHtjb25uZWN0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbjogdGhpc30pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbkNvbm5lY3QoKVxuICAgICAgfSlcbiAgICAgIC8vIFJlZ2lzdGVyIG9ubHkgYWZ0ZXIgb25Db25uZWN0IHJlc29sdmVzIHNvIGEgY29ubmVjdGlvbi1tZXNzYWdlXG4gICAgICAvLyBjYW4gbmV2ZXIgYmUgcm91dGVkIHRvIGEgcGFydGlhbGx5IGluaXRpYWxpemVkIGNvbm5lY3Rpb24uXG4gICAgICB0aGlzLl9jb25uZWN0aW9ucy5zZXQoY29ubmVjdGlvbklkLCBjb25uZWN0aW9uKVxuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLW9wZW5lZFwiLCBjb25uZWN0aW9uSWR9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uVHlwZX06JHtjb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKS5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvblwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGB7dHlwZTogXCJjb25uZWN0aW9uLW1lc3NhZ2VcIn1gIGZyb20gdGhlIGNsaWVudC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdHlwZW9mIGNvbm5lY3Rpb25JZCA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpIDogbnVsbFxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBcIlVua25vd24gY29ubmVjdGlvbiBpZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byBoYW5kbGUgY29ubmVjdGlvbi1tZXNzYWdlIGZvciAke2Nvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gaGFuZGxlIG1lc3NhZ2VcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1jbG9zZVwifWAgZnJvbSB0aGUgY2xpZW50IOKAlCBmaXJlc1xuICAgKiBgb25DbG9zZShcImNsaWVudF9jbG9zZVwiKWAgYW5kIGNvbmZpcm1zIHdpdGggYGNvbm5lY3Rpb24tY2xvc2VkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uQ2xvc2UobWVzc2FnZSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IG1lc3NhZ2UuY29ubmVjdGlvbklkXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHR5cGVvZiBjb25uZWN0aW9uSWQgPT09IFwic3RyaW5nXCIgPyB0aGlzLl9jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKSA6IG51bGxcblxuICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICAgIC8vIE1hcmsgY2xvc2VkIGJlZm9yZSBmaXJpbmcgb25DbG9zZSBzbyBhcHAgY29kZSBob2xkaW5nIHRoZVxuICAgIC8vIGhhbmRsZSBzZWVzIGBpc0Nsb3NlZCgpID09PSB0cnVlYCBhbmQgY2FuJ3QgcmUtZW50ZXIgc2VuZE1lc3NhZ2UuXG4gICAgY29ubmVjdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25DbG9zZShcImNsaWVudF9jbG9zZVwiKVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1jbG9zZWRcIiwgY29ubmVjdGlvbklkLCByZWFzb246IFwiY2xpZW50X2Nsb3NlXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtc3Vic2NyaWJlXCJ9YCDigJQgcnVucyBgY2FuU3Vic2NyaWJlKClgLFxuICAgKiByZWdpc3RlcnMgd2l0aCB0aGUgQ29uZmlndXJhdGlvbidzIGdsb2JhbCByb3V0aW5nIHJlZ2lzdHJ5IG9uXG4gICAqIHN1Y2Nlc3MsIGFuZCBzZW5kcyBgY2hhbm5lbC1zdWJzY3JpYmVkYCBvciBgY2hhbm5lbC1lcnJvcmAuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2VcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG4gICAgY29uc3QgY2hhbm5lbFR5cGUgPSBtZXNzYWdlLmNoYW5uZWxUeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cbiAgICBjb25zdCBsYXN0RXZlbnRJZCA9IG1lc3NhZ2UubGFzdEV2ZW50SWRcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIXN1YnNjcmlwdGlvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImVycm9yXCIsIGVycm9yOiBcImNoYW5uZWwtc3Vic2NyaWJlIHJlcXVpcmVzIHN1YnNjcmlwdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGFubmVsVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY2hhbm5lbFR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJjaGFubmVsVHlwZSBpcyByZXF1aXJlZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5oYXMoc3Vic2NyaXB0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIGlkIGFscmVhZHkgaW4gdXNlXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgQ2hhbm5lbENsYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxDbGFzcz8uKGNoYW5uZWxUeXBlKVxuXG4gICAgaWYgKCFDaGFubmVsQ2xhc3MpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogYFVua25vd24gY2hhbm5lbCB0eXBlOiAke2NoYW5uZWxUeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IENoYW5uZWxDbGFzcyh7c3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbjogdGhpc30pXG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzb2x2aW5nIHRoZSB0ZW5hbnQgY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzIChlLmcuIGxvb2tpbmcgdXAgdGhlXG4gICAgICAvLyByZWNvcmQncyBwcm9qZWN0IGFuZCB0aGUgY2FsbGVyJ3MgYWNjZXNzKSwgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUuIFdpdGhvdXQgdGhpcyB0aGUgcmVzb2x2ZXIgYm9ycm93cyBhIGNvbm5lY3Rpb24gdGhhdFxuICAgICAgLy8gaXMgY2hlY2tlZCBiYWNrIGluIGJlZm9yZS93aGlsZSBpdCBxdWVyaWVzLCBpbnRlcm1pdHRlbnRseSBzdXJmYWNpbmcgYXNcbiAgICAgIC8vIFwiQ29ubmVjdGlvbiDigKYgZG9lc24ndCBleGlzdCBhbnkgbW9yZVwiIG9yIGEgZmFsc2VseSB1bmF1dGhvcml6ZWRcbiAgICAgIC8vIHN1YnNjcmlwdGlvbi5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBwYXJhbXN9KVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gZmFsc2VcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGFsbG93ZWQgPSBCb29sZWFuKGF3YWl0IHN1YnNjcmlwdGlvbi5jYW5TdWJzY3JpYmUoKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIG5vdCBhdXRob3JpemVkXCJ9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkKCkpXG5cbiAgICAgICAgLy8gUmVwbGF5IG1pc3NlZCBldmVudHMgQkVGT1JFIHNlbmRpbmcgY2hhbm5lbC1zdWJzY3JpYmVkIHNvXG4gICAgICAgIC8vIHRoZSBjbGllbnQga25vd3M6IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBjb25maXJtYXRpb24gaXNcbiAgICAgICAgLy8gcmVwbGF5ZWQsIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgbGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0RXZlbnRJZCA9PT0gXCJzdHJpbmdcIiAmJiBsYXN0RXZlbnRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9uKVxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gc3Vic2NyaWJlIGNoYW5uZWwgJHtjaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzdWJzY3JpYmVcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgbWlzc2VkIGV2ZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW50IGV2ZW50LWxvZyBzdG9yZSBmb3IgYVxuICAgKiBjaGFubmVsIHN1YnNjcmlwdGlvbiB0aGF0IHByb3ZpZGVkIGBsYXN0RXZlbnRJZGAuIFNlbmRzIGVhY2hcbiAgICogbWlzc2VkIGV2ZW50IGFzIGEgYGNoYW5uZWwtbWVzc2FnZWAgd2l0aCBgcmVwbGF5ZWQ6IHRydWVgLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWxUeXBlIC0gQ2hhbm5lbCB0eXBlIG5hbWUgKGV2ZW50LWxvZyBrZXkpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYXN0RXZlbnRJZCAtIENsaWVudCdzIGxhc3Qtc2VlbiBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fSBhcmdzLnN1YnNjcmlwdGlvbiAtIExpdmUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcblxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsLXJlcGxheS1nYXBcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgbGFzdEV2ZW50SWRcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjZWlsaW5nID0gYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIWNlaWxpbmcgfHwgY2VpbGluZyA8PSBjaGVja3BvaW50LnNlcXVlbmNlKSByZXR1cm5cblxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWxUeXBlLFxuICAgICAgc2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IGNlaWxpbmdcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24uaXNDbG9zZWQoKSkgYnJlYWtcblxuICAgICAgc3Vic2NyaXB0aW9uLnNlbmRNZXNzYWdlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSAqLyAoZXZlbnQucGF5bG9hZCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgY2FsbHNcbiAgICogYHVuc3Vic2NyaWJlZCgpYCBhbmQgc2VuZHMgYGNoYW5uZWwtdW5zdWJzY3JpYmVkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDaGFubmVsVW5zdWJzY3JpYmUobWVzc2FnZSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gbWVzc2FnZS5zdWJzY3JpcHRpb25JZFxuXG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb25JZCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuXG5cbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25JZClcblxuICAgIGlmICghZW50cnkpIHJldHVyblxuXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oZW50cnkuY2hhbm5lbFR5cGUsIGVudHJ5LnN1YnNjcmlwdGlvbilcbiAgICBlbnRyeS5zdWJzY3JpcHRpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4gYXdhaXQgZW50cnkuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlZCgpKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB1bnN1YnNjcmliZSBjaGFubmVsICR7ZW50cnkuY2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uSWR9YCwgZXJyb3JdKVxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC11bnN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGB1bnN1YnNjcmliZWQoKWAgb24gZXZlcnkgbGl2ZSBjaGFubmVsLXYyIHN1YnNjcmlwdGlvbixcbiAgICogcmVtb3ZlcyB0aGVtIGZyb20gdGhlIENvbmZpZ3VyYXRpb24ncyBnbG9iYWwgcmVnaXN0cnksIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbidzIG93biBtYXAuIE5vIG5ldHdvcmsgZnJhbWVzIOKAlCB0aGUgc29ja2V0XG4gICAqIGlzIGFscmVhZHkgZ29pbmcgYXdheS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfdGVhcmRvd25DaGFubmVsU3Vic2NyaXB0aW9ucygpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gWy4uLnRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpXVxuXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuXG4gICAgZm9yIChjb25zdCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0gb2YgZW50cmllcykge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9uKVxuICAgICAgc3Vic2NyaXB0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKCkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB0ZWFyIGRvd24gY2hhbm5lbC12MiAke2NoYW5uZWxUeXBlfToke3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3RlYXJkb3duQ2hhbm5lbCgpIHtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgdGhpcy5jaGFubmVscykge1xuICAgICAgYXdhaXQgdGhpcy5fdGVhcmRvd25TaW5nbGVDaGFubmVsKGNoYW5uZWwpXG4gICAgfVxuICAgIHRoaXMuY2hhbm5lbHMuY2xlYXIoKVxuICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5jbGVhcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0ZWFyZG93biBzaW5nbGUgY2hhbm5lbC5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRDaGFubmVsfSBjaGFubmVsIC0gQ2hhbm5lbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLmNoYW5uZWxUZW5hbnRzLmdldChjaGFubmVsKVxuXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjaGFubmVsPy51bnN1YnNjcmliZWQ/LigpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gdGVhcmRvd24gd2Vic29ja2V0IGNoYW5uZWxcIiwgZXJyb3JdKVxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmdldChjaGFubmVsKVxuXG4gICAgaWYgKHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uQ2hhbm5lbCBvZiBzdWJzY3JpcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KHN1YnNjcmlwdGlvbkNoYW5uZWwpPy5kZWxldGUoY2hhbm5lbClcblxuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoc3Vic2NyaXB0aW9uQ2hhbm5lbCk/LnNpemUgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25DaGFubmVsKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZGVsZXRlKGNoYW5uZWwpXG4gICAgfVxuXG4gICAgdGhpcy5jaGFubmVsVGVuYW50cy5kZWxldGUoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlZ2lzdGVyIGNoYW5uZWwuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0Q2hhbm5lbCB8IHVuZGVmaW5lZH0gY2hhbm5lbCAtIENoYW5uZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gdGVuYW50IC0gVGVuYW50IGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbCwgdGVuYW50KSB7XG4gICAgaWYgKCFjaGFubmVsKSByZXR1cm5cblxuICAgIHRoaXMuY2hhbm5lbHMuYWRkKGNoYW5uZWwpXG4gICAgdGhpcy5jaGFubmVsVGVuYW50cy5zZXQoY2hhbm5lbCwgdGVuYW50KVxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY2hhbm5lbD8uc3Vic2NyaWJlZD8uKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggY29ubmVjdGlvbnMuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF93aXRoQ29ubmVjdGlvbnMoY2FsbGJhY2spIHtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiV2Vic29ja2V0IHNlc3Npb25cIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIGNoYW5uZWwgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3tjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19IGFyZ3MgLSBTdWJzY3JpcHRpb24gYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDaGFubmVsU3Vic2NyaXB0aW9uKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSkge1xuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRlbmFudCByZXNvbHV0aW9uIGNhbiBydW4gZGF0YWJhc2UgcXVlcmllcywgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUgKHNlZSBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZSkuXG4gICAgICBsZXQgdGVuYW50XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHtjaGFubmVsLCBwYXJhbXN9KVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICBzdWJzY3JpcHRpb246IHtjaGFubmVsLCBwYXJhbXN9LFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgZXJyb3I6IFwiU3Vic2NyaXB0aW9uIHJlamVjdGVkXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsSW5zdGFuY2UgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBjaGFubmVsLFxuICAgICAgICAgIHN1YnNjcmlwdGlvblBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbEluc3RhbmNlICYmICEoY2hhbm5lbEluc3RhbmNlIGluc3RhbmNlb2YgV2Vic29ja2V0Q2hhbm5lbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgd2Vic29ja2V0IGNoYW5uZWwgbXVzdCBleHRlbmQgV2Vic29ja2V0Q2hhbm5lbFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbEluc3RhbmNlLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1wiV2Vic29ja2V0IGNoYW5uZWwgc3Vic2NyaXB0aW9uIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCBlcnJvcjogXCJTdWJzY3JpcHRpb24gcmVqZWN0ZWRcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcmVwYXJlIHJlcGxheSBzdGF0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gSW50ZXJuYWwgY2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5sYXN0RXZlbnRJZCAtIExhc3QgcmVjZWl2ZWQgZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN1YnNjcmlwdGlvbkNoYW5uZWwgLSBDbGllbnQtZmFjaW5nIGNoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IHVuZGVmaW5lZH0gYXJncy5zdWJzY3JpcHRpb25QYXJhbXMgLSBDbGllbnQtZmFjaW5nIHBhcmFtcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8ZmFsc2UgfCB7YnVmZmVyZWQ6IGJvb2xlYW4sIGNlaWxpbmdTZXF1ZW5jZTogbnVtYmVyLCBjaGVja3BvaW50U2VxdWVuY2U6IG51bWJlciwgcmVwbGF5aW5nOiBib29sZWFufSB8IG51bGw+fSAtIFJlcGxheSBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIF9wcmVwYXJlUmVwbGF5U3RhdGUoe2NoYW5uZWwsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb25DaGFubmVsLCBzdWJzY3JpcHRpb25QYXJhbXN9KSB7XG4gICAgaWYgKCFsYXN0RXZlbnRJZCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWwsIGlkOiBsYXN0RXZlbnRJZH0pXG5cbiAgICBpZiAoIWNoZWNrcG9pbnQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWw6IHN1YnNjcmlwdGlvbkNoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXM6IHN1YnNjcmlwdGlvblBhcmFtcywgdHlwZTogXCJyZXBsYXktZ2FwXCJ9KVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlcmVkOiBmYWxzZSxcbiAgICAgIGNlaWxpbmdTZXF1ZW5jZTogKGF3YWl0IHN0b3JlLmxhdGVzdFNlcXVlbmNlKGNoYW5uZWwpKSB8fCBjaGVja3BvaW50LnNlcXVlbmNlLFxuICAgICAgY2hlY2twb2ludFNlcXVlbmNlOiBjaGVja3BvaW50LnNlcXVlbmNlLFxuICAgICAgcmVwbGF5aW5nOiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVwbGF5IGNoYW5uZWwgZXZlbnRzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn19IGFyZ3MucmVwbGF5U3RhdGUgLSBSZXBsYXkgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVwbGF5IGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzKHtjaGFubmVsLCByZXBsYXlTdGF0ZX0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBldmVudHMgPSBhd2FpdCBzdG9yZS5nZXRFdmVudHNBZnRlcih7XG4gICAgICBjaGFubmVsLFxuICAgICAgc2VxdWVuY2U6IHJlcGxheVN0YXRlLmNoZWNrcG9pbnRTZXF1ZW5jZSxcbiAgICAgIHVwVG9TZXF1ZW5jZTogcmVwbGF5U3RhdGUuY2VpbGluZ1NlcXVlbmNlXG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFdmVudChjaGFubmVsLCBldmVudC5wYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBldmVudElkOiBldmVudC5pZCxcbiAgICAgICAgcmVwbGF5ZWQ6IHRydWUsXG4gICAgICAgIHNlcXVlbmNlOiBldmVudC5zZXF1ZW5jZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5pc2ggcmVwbGF5IHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YnVmZmVyZWQ6IGJvb2xlYW4sIGNlaWxpbmdTZXF1ZW5jZTogbnVtYmVyLCBjaGVja3BvaW50U2VxdWVuY2U6IG51bWJlciwgcmVwbGF5aW5nOiBib29sZWFufX0gcmVwbGF5U3RhdGUgLSBSZXBsYXkgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gYnVmZmVyZWQgZXZlbnRzIGFyZSBmbHVzaGVkLlxuICAgKi9cbiAgYXN5bmMgX2ZpbmlzaFJlcGxheVN0YXRlKGNoYW5uZWwsIHJlcGxheVN0YXRlKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG5cbiAgICByZXBsYXlTdGF0ZS5yZXBsYXlpbmcgPSBmYWxzZVxuICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5kZWxldGUoY2hhbm5lbClcblxuICAgIGlmICghcmVwbGF5U3RhdGUuYnVmZmVyZWQpIHJldHVyblxuXG4gICAgY29uc3QgbGl2ZUV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBzZXF1ZW5jZTogcmVwbGF5U3RhdGUuY2VpbGluZ1NlcXVlbmNlXG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgbGl2ZUV2ZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kRXZlbnQoY2hhbm5lbCwgZXZlbnQucGF5bG9hZCwge1xuICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuaWQsXG4gICAgICAgIHNlcXVlbmNlOiBldmVudC5zZXF1ZW5jZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvbHZlIHRlbmFudC5cbiAgICogQHBhcmFtIHt7Y2hhbm5lbD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59fSBhcmdzIC0gVGVuYW50IHJlc29sdXRpb24gYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD59IC0gUmVzb2x2ZWQgdGVuYW50LlxuICAgKi9cbiAgYXN5bmMgX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWwsIHBhcmFtc30pIHtcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gdGhpcy51cGdyYWRlUmVxdWVzdD8ucGFyYW1zPy4oKVxuICAgIGNvbnN0IG1lcmdlZFBhcmFtcyA9IHtcbiAgICAgIC4uLihyZXF1ZXN0UGFyYW1zICYmIHR5cGVvZiByZXF1ZXN0UGFyYW1zID09PSBcIm9iamVjdFwiID8gcmVxdWVzdFBhcmFtcyA6IHt9KSxcbiAgICAgIC4uLihwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiA/IHBhcmFtcyA6IHt9KVxuICAgIH1cblxuICAgIHJldHVybiAvKiogQHR5cGUge1Byb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD59ICovICh0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZVRlbmFudCh7XG4gICAgICBwYXJhbXM6IG1lcmdlZFBhcmFtcyxcbiAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICByZXNwb25zZTogdW5kZWZpbmVkLFxuICAgICAgc3Vic2NyaXB0aW9uOiBjaGFubmVsID8ge2NoYW5uZWwsIHBhcmFtc30gOiB1bmRlZmluZWRcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHVubWFzayBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgLSBNYXNrLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSB1bm1hc2sgcGF5bG9hZC5cbiAgICovXG4gIF91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spIHtcbiAgICAvKipcbiAgICAgKiBSZXN1bHQuXG4gICAgICogQHR5cGUge0J1ZmZlcn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSBCdWZmZXIuYWxsb2MocGF5bG9hZC5sZW5ndGgpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBheWxvYWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IHBheWxvYWRbaV0gXiBtYXNrW2kgJSA0XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbk9wZW4gPSBoYW5kbGVyID8gaGFuZGxlci5vbk9wZW4gOiBudWxsXG5cbiAgICAgIGlmIChvbk9wZW4pIHtcbiAgICAgICAgYXdhaXQgb25PcGVuKHtzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG9wZW4gaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biBtZXNzYWdlIGhhbmRsZXIgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIEluY29taW5nIHdlYnNvY2tldCBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbk1lc3NhZ2UgPSBoYW5kbGVyID8gaGFuZGxlci5vbk1lc3NhZ2UgOiBudWxsXG5cbiAgICAgIGlmIChvbk1lc3NhZ2UpIHtcbiAgICAgICAgYXdhaXQgb25NZXNzYWdlKHttZXNzYWdlLCBzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uRXJyb3IgPSBoYW5kbGVyID8gaGFuZGxlci5vbkVycm9yIDogbnVsbFxuXG4gICAgICBpZiAob25FcnJvcikge1xuICAgICAgICBhd2FpdCBvbkVycm9yKHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLCBzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uQ2xvc2UgPSBoYW5kbGVyID8gaGFuZGxlci5vbkNsb3NlIDogbnVsbFxuXG4gICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICBhd2FpdCBvbkNsb3NlKHtzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IGNsb3NlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdGUgYWRkcmVzcy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBSZW1vdGUgYWRkcmVzcyByZXNvbHZlZCBmcm9tIHRoZSB3ZWJzb2NrZXQgdXBncmFkZSByZXF1ZXN0LlxuICAgKi9cbiAgcmVtb3RlQWRkcmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy51cGdyYWRlUmVxdWVzdD8ucmVtb3RlQWRkcmVzcygpIHx8IHRoaXMuY2xpZW50LnJlbW90ZUFkZHJlc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBtZXNzYWdlIGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gaGFuZGxlciAtIEhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TWVzc2FnZUhhbmRsZXIoaGFuZGxlcikge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyXG4gICAgdm9pZCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKVxuICB9XG5cbiAgYXN5bmMgX3Jlc29sdmVNZXNzYWdlSGFuZGxlclByb21pc2UoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlXG5cbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gZmFsc2VcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgICAgLy8gSW5zdGFsbCBoYW5kbGVyIGFuZCBkcmFpbiBvbk9wZW4gYmVmb3JlIHJlcGxheWluZyBxdWV1ZWRcbiAgICAgICAgLy8gbWVzc2FnZXMuIHNldE1lc3NhZ2VIYW5kbGVyKCkgZmlyZXMgb25PcGVuIGFzIGZpcmUtYW5kLWZvcmdldDtcbiAgICAgICAgLy8gYXdhaXRpbmcgX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpIGRpcmVjdGx5IGhlcmUgY2xvc2VzIHRoZVxuICAgICAgICAvLyByYWNlIHdoZXJlIHF1ZXVlZCBzdWJzY3JpYmUvY29ubmVjdGlvbi0qIGZyYW1lcyB3b3VsZFxuICAgICAgICAvLyBkaXNwYXRjaCB3aGlsZSBhbiBhc3luYyBvbk9wZW4gaXMgc3RpbGwgc2V0dGluZyB1cCBzZXNzaW9uXG4gICAgICAgIC8vIHN0YXRlLlxuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlclxuICAgICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKVxuICAgICAgICBhd2FpdCB0aGlzLl9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyOiB0eXBlb2YgaGFuZGxlci5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIHJlc29sdmVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBmYWxzZVxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgdGhpcy5fZmx1c2hRdWV1ZWRNZXNzYWdlcyh7dXNlSGFuZGxlcjogZmFsc2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmx1c2ggcXVldWVkIG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0ge3t1c2VIYW5kbGVyOiBib29sZWFufX0gYXJncyAtIEFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfZmx1c2hRdWV1ZWRNZXNzYWdlcyh7dXNlSGFuZGxlcn0pIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlUXVldWUubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHF1ZXVlZCA9IHRoaXMubWVzc2FnZVF1ZXVlLnNsaWNlKClcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcXVldWVkKSB7XG4gICAgICBpZiAodXNlSGFuZGxlciAmJiB0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyTWVzc2FnZShtZXNzYWdlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlTWVzc2FnZShtZXNzYWdlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
1621
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxnQkFBZ0IsTUFBTSx5QkFBeUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsc0NBQXNDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV0RixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyx3RUFBd0U7QUFDeEUsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFFdkMsbUVBQW1FO0FBQ25FLE1BQU0sc0NBQXNDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUFFL0QsNkRBQTZEO0FBQzdELE1BQU0sMENBQTBDLEdBQUcsSUFBSSxDQUFBO0FBRXZEOzs7R0FHRztBQUVIOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE9BQU87SUFDL0IsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFDakMs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QztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUUxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBRXRCLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMvQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7cmFuZG9tVVVJRH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlcXVlc3RSdW5uZXIgZnJvbSBcIi4vcmVxdWVzdC1ydW5uZXIuanNcIlxuaW1wb3J0IFdlYnNvY2tldFJlcXVlc3QgZnJvbSBcIi4vd2Vic29ja2V0LXJlcXVlc3QuanNcIlxuaW1wb3J0IFdlYnNvY2tldENoYW5uZWwgZnJvbSBcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCJcbmltcG9ydCB7d2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb259IGZyb20gXCIuLi93ZWJzb2NrZXQtZXZlbnQtbG9nLXN0b3JlLmpzXCJcblxuY29uc3QgV0VCU09DS0VUX0ZJTkFMX0ZSQU1FID0gMHg4MFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04gPSAweDBcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfVEVYVCA9IDB4MVxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9CSU5BUlkgPSAweDJcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UgPSAweDhcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfUElORyA9IDB4OVxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9QT05HID0gMHhBXG5cbi8qKiBDYXAgb24gdGhlIHBhdXNlZCBvdXRib3VuZCBxdWV1ZTsgb2xkZXN0IGZyYW1lcyBkcm9wIG9uIG92ZXJmbG93LiAqL1xuY29uc3QgV0VCU09DS0VUX1BBVVNFRF9RVUVVRV9DQVAgPSAxMDAwXG5cbi8qKiBDYXAgb24gdG90YWwgYnl0ZXMgYnVmZmVyZWQgZm9yIGEgc2luZ2xlIGZyYWdtZW50ZWQgbWVzc2FnZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTID0gMTYgKiAxMDI0ICogMTAyNFxuXG4vKiogQ2FwIG9uIGZyYWdtZW50IGNvdW50IGZvciBhIHNpbmdsZSBmcmFnbWVudGVkIG1lc3NhZ2UuICovXG5jb25zdCBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFMgPSAxMDI0XG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fSB8IHt0eXBlOiBcIm1ldGFkYXRhXCIsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0gfCB7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgUmVjb3JkPHN0cmluZywgPz59IFdlYnNvY2tldFNlc3Npb25NZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBSdW5zIHN1YnNjcmliZSBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59IHwgbnVsbH0gLSBTdWJzY3JpYmUgbWVzc2FnZSB3aGVuIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZU1lc3NhZ2UobWVzc2FnZSkge1xuICByZXR1cm4gbWVzc2FnZS50eXBlID09PSBcInN1YnNjcmliZVwiXG4gICAgPyAvKiogQHR5cGUge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19ICovIChtZXNzYWdlKVxuICAgIDogbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgcmVxdWVzdCBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgbnVsbH0gLSBSZXF1ZXN0IG1lc3NhZ2Ugd2hlbiBtYXRjaGVkLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikgcmV0dXJuIG51bGxcblxuICByZXR1cm4gLyoqIEB0eXBlIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gaWRlbnRpdHkgdmFsdWVzIGZyb20gYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC5cbiAqIE51bGxpc2ggdmFsdWVzIGNvbXBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBidXQgbm90IHRvIGEgcmVhbCBpZGVudGl0eS5cbiAqIFBsYWluIG9iamVjdHMgYXJlIGNvbXBhcmVkIHZpYSBKU09OIHJvdW5kLXRyaXAgc28gYXBwcyBjYW4gcmV0dXJuIGFcbiAqIGB7dXNlcklkLCB0ZW5hbnRJZH1gLXN0eWxlIG9iamVjdCB3aXRob3V0IGJ1aWxkaW5nIHRoZWlyIG93biBlcXVhbGl0eS5cbiAqIEBwYXJhbSB7P30gYSAtIFBhdXNlZC10aW1lIGlkZW50aXR5LlxuICogQHBhcmFtIHs/fSBiIC0gUmVzdW1lLXRpbWUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIHR3byBpZGVudGl0aWVzIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGNhbGxlci5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdGllc01hdGNoKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKHR5cGVvZiBhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhKSA9PT0gSlNPTi5zdHJpbmdpZnkoYilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFdlYnNvY2tldFNlc3Npb24ge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQoKVxuICBjaGFubmVscyA9IG5ldyBTZXQoKVxuICBzdWJzY3JpcHRpb25IYW5kbGVycyA9IG5ldyBNYXAoKVxuICBoYW5kbGVyU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuICBjaGFubmVsVGVuYW50cyA9IG5ldyBNYXAoKVxuICBjaGFubmVsUmVwbGF5U3RhdGVzID0gbmV3IE1hcCgpXG4gIC8qKlxuICAgKiBNZXNzYWdlIHF1ZXVlLlxuICAgKiBAdHlwZSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2VbXX0gKi9cbiAgbWVzc2FnZVF1ZXVlID0gW11cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLmNsaWVudCAtIENsaWVudCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gW2FyZ3MudXBncmFkZVJlcXVlc3RdIC0gSW5pdGlhbCB3ZWJzb2NrZXQgdXBncmFkZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJ9IFthcmdzLm1lc3NhZ2VIYW5kbGVyXSAtIE9wdGlvbmFsIHJhdyBtZXNzYWdlIGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyIHwgdm9pZD59IFthcmdzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZV0gLSBPcHRpb25hbCByYXcgbWVzc2FnZSBoYW5kbGVyIHByb21pc2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50LCBjb25maWd1cmF0aW9uLCB1cGdyYWRlUmVxdWVzdCwgbWVzc2FnZUhhbmRsZXIsIG1lc3NhZ2VIYW5kbGVyUHJvbWlzZX0pIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMudXBncmFkZVJlcXVlc3QgPSB1cGdyYWRlUmVxdWVzdFxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlclxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gbWVzc2FnZUhhbmRsZXJQcm9taXNlXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBCb29sZWFuKG1lc3NhZ2VIYW5kbGVyUHJvbWlzZSlcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7fVxuXG4gICAgLyoqXG4gICAgICogTG9uZy1saXZlZCBwZXItc2Vzc2lvbiBzdGF0ZSBiYWcuIFN0YWJsZSBhY3Jvc3MgcmVjb25uZWN0cyBvbmNlXG4gICAgICogZ3JhY2UtcGVyaW9kIHJlc3VtcHRpb24gbGFuZHMgaW4gUGhhc2UgMjsgdG9kYXkgaXQganVzdCBsaXZlc1xuICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn1cbiAgICAgKi9cbiAgICB0aGlzLmRhdGEgPSB7fVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY29ubmVjdGlvbi5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCB7Y2hhbm5lbFR5cGU6IHN0cmluZywgc3Vic2NyaXB0aW9uOiBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fT59ICovXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZCBhc3NpZ25lZCB0byB0aGlzIHNlc3Npb24gb24gZmlyc3QgY29ubmVjdC4gU2VudCB0byB0aGVcbiAgICAgKiBjbGllbnQgdmlhIGBzZXNzaW9uLWVzdGFibGlzaGVkYDsgdGhlIGNsaWVudCBlY2hvZXMgaXQgYmFjayB2aWFcbiAgICAgKiBgc2Vzc2lvbi1yZXN1bWVgIGFmdGVyIGEgV1MgZHJvcCB0byByZWF0dGFjaCB0byB0aGlzIHNlc3Npb25cbiAgICAgKiB3aXRoaW4gdGhlIGdyYWNlIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc2Vzc2lvbklkID0gcmFuZG9tVVVJRCgpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBhZnRlciBgX2hhbmRsZUNsb3NlYCBwYXVzZXMgaW5zdGVhZCBvZiB0ZWFyaW5nIGRvd24uXG4gICAgICovXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2VcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Pz59IC0gZnJhbWVzIHByb2R1Y2VkIHdoaWxlIHBhdXNlZDsgZmx1c2hlZCBvbiByZXN1bWUuXG4gICAgICovXG4gICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5zb2NrZXQgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUYWlsIG9mIGEgcGVyLXNlc3Npb24gcHJvbWlzZSBjaGFpbiB0aGF0IHNlcmlhbGl6ZXMgbWVzc2FnZVxuICAgICAqIGhhbmRsaW5nLiBQcmV2ZW50cyByYWNlcyB3aGVyZSBtZXNzYWdlIEIgcmVhZHMgYHNlc3Npb24uZGF0YWBcbiAgICAgKiBiZWZvcmUgbWVzc2FnZSBBJ3MgaGFuZGxlciBmaW5pc2hlcyB3cml0aW5nIGl0IChlLmcuIGFcbiAgICAgKiBjb25uZWN0aW9uLW1lc3NhZ2Ugc2V0dGluZyB0aGUgbG9jYWxlIHZzLiBhIHN1YnNlcXVlbnQgcmVxdWVzdFxuICAgICAqIHdob3NlIGFyb3VuZFJlcXVlc3Qgd3JhcHBlciByZWFkcyBpdCkuXG4gICAgICogQHR5cGUge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXV0aCBpZGVudGl0eSBjYXB0dXJlZCBhdCBwYXVzZVxuICAgICAqIHRpbWUgYnkgYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC4gQXdhaXRlZCBhdCByZXN1bWVcbiAgICAgKiB0aW1lIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkuIFVuZGVmaW5lZFxuICAgICAqIG9uIGEgbGl2ZSAobm9uLXBhdXNlZCkgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTw/PiB8IHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICB0aGlzLl9yZXN1bWVJZGVudGl0eVByb21pc2UgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEFjY3VtdWxhdGVzIHBheWxvYWRzIGZvciBhIGZyYWdtZW50ZWQgd2Vic29ja2V0IG1lc3NhZ2UgcGVyXG4gICAgICogUkZDIDY0NTUuIE5vbi1udWxsIHdoaWxlIG1pZC1mcmFnbWVudDsgY2xlYXJlZCB3aGVuIHRoZSBmcmFtZVxuICAgICAqIHdpdGggRklOPTEgY29tcGxldGVzIGFuZCB0aGUgbWVzc2FnZSBpcyBkaXNwYXRjaGVkLlxuICAgICAqIEB0eXBlIHtCdWZmZXJbXSB8IG51bGx9XG4gICAgICovXG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogT3Bjb2RlIChURVhUL0JJTkFSWSkgY2FwdHVyZWQgZnJvbSB0aGUgZmlyc3QgZnJhbWUgb2YgYVxuICAgICAqIGZyYWdtZW50ZWQgbWVzc2FnZS4gQ29udGludWF0aW9uIGZyYW1lcyAob3Bjb2RlIDApIGluaGVyaXQgaXRcbiAgICAgKiBhdCByZWFzc2VtYmx5IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlciB8IG51bGx9XG4gICAgICovXG4gICAgdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA9IG51bGxcblxuICAgIC8qKlxuICAgICAqIFJ1bm5pbmcgYnl0ZSB0b3RhbCBmb3IgYF9mcmFnbWVudGVkUGF5bG9hZHNgLiBVc2VkIHRvIGVuZm9yY2VcbiAgICAgKiBgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVNgIHNvIGEgcGVlciBjYW5ub3RcbiAgICAgKiBleGhhdXN0IG1lbW9yeSBieSBzdHJlYW1pbmcgbm9uLWZpbmFsIGZyYWdtZW50cyBpbmRlZmluaXRlbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPSAwXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmFkZCh0aGlzKVxuXG4gICAgLyoqXG4gICAgICogSGVhcnRiZWF0IGxpdmVuZXNzIGZsYWcuIFNldCB0cnVlIG9uIGV2ZXJ5IGluYm91bmQgZnJhbWVcbiAgICAgKiAoaW5jbHVkaW5nIHRoZSBjbGllbnQncyBhdXRvLXBvbmcpIGFuZCBjbGVhcmVkIGVhY2ggdGltZSBhIHBpbmdcbiAgICAgKiBpcyBzZW50OyBhIHN0aWxsLWZhbHNlIGZsYWcgYXQgdGhlIG5leHQgdGljayBtZWFucyB0aGUgc29ja2V0XG4gICAgICogaGFzIGdvbmUgc2lsZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuX2hlYXJ0YmVhdEFsaXZlID0gdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogUGVyLXNlc3Npb24gaGVhcnRiZWF0IGludGVydmFsIGhhbmRsZS4gU3RhcnRlZCBmcm9tXG4gICAgICogYHNlbmRTZXNzaW9uRXN0YWJsaXNoZWRgIG9uY2UgdGhlIHNvY2tldCBpcyBsaXZlLCBub3QgYXRcbiAgICAgKiBjb25zdHJ1Y3Rpb24sIHNvIGRpcmVjdGx5LWNvbnN0cnVjdGVkIHNlc3Npb25zIGluIHRlc3RzIGRvbid0XG4gICAgICogc3BpbiB1cCBhIGJhY2tncm91bmQgdGltZXIuXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGx9XG4gICAgICovXG4gICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgdGhlIGNsaWVudCBpdHMgc2Vzc2lvbklkICsgZ3JhY2Ugd2luZG93LiBDYWxsZWQgYnlcbiAgICogYFZlbG9jaW91c0h0dHBTZXJ2ZXJDbGllbnRgIGFmdGVyIHRoZSBXUyB1cGdyYWRlIGNvbXBsZXRlcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZW5kU2Vzc2lvbkVzdGFibGlzaGVkKCkge1xuICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgdHlwZTogXCJzZXNzaW9uLWVzdGFibGlzaGVkXCIsXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgZ3JhY2VTZWNvbmRzOiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbkdyYWNlU2Vjb25kcz8uKCkgfHwgMzAwXG4gICAgfSlcblxuICAgIC8vIFRoZSBzb2NrZXQgaXMgbGl2ZSBub3csIHNvIGJlZ2luIHJlYXBpbmcgaXQgaWYgaXQgZ29lcyBzaWxlbnQuXG4gICAgdGhpcy5fc3RhcnRIZWFydGJlYXQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbG9zZWQgY29ubmVjdGlvbiBmcm9tIHRoZSBzZXNzaW9uIHJlZ2lzdHJ5LiBDYWxsZWQgYnlcbiAgICogYFZlbG9jaW91c1dlYnNvY2tldENvbm5lY3Rpb24uY2xvc2UoKWAgYWZ0ZXIgaXQgc2VuZHMgdGhlIGZpbmFsXG4gICAqIGBjb25uZWN0aW9uLWNsb3NlZGAgZnJhbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uSWQgLSBDbG9zZWQgY29ubmVjdGlvbiBpZGVudGlmaWVyIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uSWQpIHtcbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IC0gQ2xpZW50LXByb3ZpZGVkIG1ldGFkYXRhIChkZWZlbnNpdmUgY29weSkuXG4gICAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gey4uLnRoaXMuX21ldGFkYXRhfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgcGF1c2VkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIHdoaWxlIHRoZSBzZXNzaW9uIGlzIGluIHRoZSBwYXVzZWQvZ3JhY2UgcmVnaXN0cnkuXG4gICAqL1xuICBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF1c2VkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYWRkU3Vic2NyaXB0aW9uKGNoYW5uZWwpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGNoYW5uZWwpXG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fd2Vic29ja2V0U2Vzc2lvbnMuZGVsZXRlKHRoaXMpXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2VcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbCgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNvbm5lY3Rpb25zKFwic2Vzc2lvbl9kZXN0cm95ZWRcIilcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBpdCBoYXMgc3Vic2NyaXB0aW9uLlxuICAgKi9cbiAgaGFzU3Vic2NyaXB0aW9uKGNoYW5uZWwpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb24gZGF0YS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uRGF0YShkYXRhKSB7XG4gICAgLy8gQW55IGluYm91bmQgYnl0ZXMg4oCUIGEgZGF0YSBmcmFtZSwgdGhlIGF1dG8tcG9uZyBhbnN3ZXJpbmcgb3VyXG4gICAgLy8gaGVhcnRiZWF0LCBvciBhIHBhcnRpYWwgZnJhbWUgc3RpbGwgYmVpbmcgdXBsb2FkZWQg4oCUIHByb3ZlIHRoZVxuICAgIC8vIHNvY2tldCBpcyBhbGl2ZS4gTWFyayBpdCBoZXJlLCBiZWZvcmUgYF9wcm9jZXNzQnVmZmVyYCBtYXkgcmV0dXJuXG4gICAgLy8gZWFybHkgd2FpdGluZyBmb3IgdGhlIHJlc3Qgb2YgYW4gaW5jb21wbGV0ZSBmcmFtZS5cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IHRydWVcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBkYXRhXSlcbiAgICB0aGlzLl9wcm9jZXNzQnVmZmVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0gez99IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7e2NyZWF0ZWRBdD86IHN0cmluZywgZXZlbnRJZD86IHN0cmluZywgcmVwbGF5ZWQ/OiBib29sZWFuLCBzZXF1ZW5jZT86IG51bWJlcn19IFtvcHRpb25zXSAtIEV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEV2ZW50KGNoYW5uZWwsIHBheWxvYWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGNoYW5uZWxIYW5kbGVycyA9IHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpXG4gICAgY29uc3QgaGFzQ2hhbm5lbEhhbmRsZXJzID0gQm9vbGVhbihjaGFubmVsSGFuZGxlcnMgJiYgY2hhbm5lbEhhbmRsZXJzLnNpemUgPiAwKVxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmdldChjaGFubmVsKVxuXG4gICAgaWYgKHJlcGxheVN0YXRlPy5yZXBsYXlpbmcgJiYgIW9wdGlvbnMucmVwbGF5ZWQpIHtcbiAgICAgIHJlcGxheVN0YXRlLmJ1ZmZlcmVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSAmJiAhaGFzQ2hhbm5lbEhhbmRsZXJzKSByZXR1cm5cblxuICAgIGlmIChoYXNDaGFubmVsSGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oY2hhbm5lbEhhbmRsZXJzKS5tYXAoYXN5bmMgKGhhbmRsZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50ID0gdGhpcy5jaGFubmVsVGVuYW50cy5nZXQoaGFuZGxlcilcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5yZWNlaXZlZEJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgIGV2ZW50SWQ6IG9wdGlvbnMuZXZlbnRJZCxcbiAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICAgICAgICAgIHNlcXVlbmNlOiBvcHRpb25zLnNlcXVlbmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICBldmVudElkOiBvcHRpb25zLmV2ZW50SWQsXG4gICAgICBwYXlsb2FkLFxuICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICBzZXF1ZW5jZTogb3B0aW9ucy5zZXF1ZW5jZSxcbiAgICAgIHR5cGU6IFwiZXZlbnRcIlxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbml0aWFsaXplIGNoYW5uZWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplQ2hhbm5lbCgpIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3Jlc29sdmVNZXNzYWdlSGFuZGxlclByb21pc2UoKVxuXG4gICAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICBpZiAoIXJlc29sdmVyKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHt9KVxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVyKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVyblxuXG4gICAgICBjb25zdCBjaGFubmVsID0gdHlwZW9mIHJlc29sdmVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBuZXcgcmVzb2x2ZWQoe2NsaWVudDogdGhpcy5jbGllbnQsIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCwgd2Vic29ja2V0U2Vzc2lvbjogdGhpc30pXG4gICAgICAgIDogcmVzb2x2ZWRcblxuICAgICAgaWYgKGNoYW5uZWwgJiYgIShjaGFubmVsIGluc3RhbmNlb2YgV2Vic29ja2V0Q2hhbm5lbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgd2Vic29ja2V0IGNoYW5uZWwgbXVzdCBleHRlbmQgV2Vic29ja2V0Q2hhbm5lbFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbCwgdGVuYW50KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBnb29kYnllLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kR29vZGJ5ZShjbGllbnQpIHtcbiAgICBjb25zdCBmcmFtZSA9IEJ1ZmZlci5mcm9tKFtXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFLCAweDAwXSlcblxuICAgIGNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBmcmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhbmRsZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIC8vIFNlcmlhbGl6ZSBwZXItc2Vzc2lvbjogY2hhaW4gb250byBgX21lc3NhZ2VDaGFpbmAgc28gbWVzc2FnZXNcbiAgICAvLyBhcmUgcHJvY2Vzc2VkIG9uZSBhdCBhIHRpbWUuIFdpdGhvdXQgdGhpcywgZmlyZS1hbmQtZm9yZ2V0XG4gICAgLy8gZGlzcGF0Y2ggZnJvbSBgX3Byb2Nlc3NCdWZmZXJgIGxldHMgbWVzc2FnZSBCIHJlYWRcbiAgICAvLyBgc2Vzc2lvbi5kYXRhYCBiZWZvcmUgQSBoYXMgZmluaXNoZWQgd3JpdGluZyBpdC5cbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX21lc3NhZ2VDaGFpblxuICAgIGNvbnN0IG5leHQgPSBwcmV2aW91cy50aGVuKCgpID0+IHRoaXMuX2Rpc3BhdGNoTWVzc2FnZShtZXNzYWdlKSlcblxuICAgIHRoaXMuX21lc3NhZ2VDaGFpbiA9IG5leHQuY2F0Y2goKCkgPT4ge30pXG4gICAgYXdhaXQgbmV4dFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGlzcGF0Y2ggbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9kaXNwYXRjaE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdD8uKClcblxuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICBhd2FpdCB3cmFwcGVyKHRoaXMsICgpID0+IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgbWVzc2FnZSBkaXNwYXRjaCwgZXh0cmFjdGVkIHNvXG4gICAqIGBjb25maWd1cmF0aW9uLmdldFdlYnNvY2tldEFyb3VuZFJlcXVlc3QoKWAgY2FuIHdyYXAgaXQgaW4gYW55XG4gICAqIHBlci1yZXF1ZXN0IGNvbnRleHQgKEFzeW5jTG9jYWxTdG9yYWdlLCB0cmFjaW5nLCBldGMuKS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIERlY29kZWQgY2xpZW50IGZyYW1lIHRvIGRpc3BhdGNoIGJ5IG1lc3NhZ2UgdHlwZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2gobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRoZSBtZXNzYWdlSGFuZGxlciBzaG9ydC1jaXJjdWl0cyBkZWZhdWx0IHJvdXRpbmcgb25seSB3aGVuIHRoZVxuICAgIC8vIGFwcCBhY3R1YWxseSBkZWNsYXJlZCBhbiBgb25NZXNzYWdlYCBob29rLiBBcHBzIHRoYXQgb25seSB3YW50XG4gICAgLy8gc2Vzc2lvbi1saWZlY3ljbGUgdHJhY2tpbmcgKGBvbk9wZW5gL2BvbkNsb3NlYCkgc3RpbGwgbmVlZCB0aGVcbiAgICAvLyBidWlsdC1pbiBzdWJzY3JpYmUvY29ubmVjdGlvbi9jaGFubmVsLXN1YnNjcmliZSByb3V0aW5nIGJlbG93LFxuICAgIC8vIG90aGVyd2lzZSBldmVyeSBpbmNvbWluZyBtZXNzYWdlIGlzIHNpbGVudGx5IGRyb3BwZWQuXG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIgJiYgdHlwZW9mIHRoaXMubWVzc2FnZUhhbmRsZXIub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyTWVzc2FnZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaWJlUGF5bG9hZCA9IHN1YnNjcmliZU1lc3NhZ2UobWVzc2FnZSlcblxuICAgIGlmIChzdWJzY3JpYmVQYXlsb2FkKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtc30gPSBzdWJzY3JpYmVQYXlsb2FkXG5cbiAgICAgIGlmICghY2hhbm5lbCkgdGhyb3cgbmV3IEVycm9yKFwiY2hhbm5lbCBpcyByZXF1aXJlZCBmb3Igc3Vic2NyaWJlXCIpXG4gICAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICAgIGlmIChyZXNvbHZlcikge1xuICAgICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsU3Vic2NyaXB0aW9uKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlVG9DaGFubmVsKGNoYW5uZWwsIHthY2tub3dsZWRnZTogdHJ1ZSwgbGFzdEV2ZW50SWQsIHBhcmFtc30pXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwibWV0YWRhdGFcIikge1xuICAgICAgY29uc3QgbWV0YWRhdGFQYXlsb2FkID0gLyoqIEB0eXBlIHt7ZGF0YT86IFJlY29yZDxzdHJpbmcsID8+fX0gKi8gKG1lc3NhZ2UpXG5cbiAgICAgIHRoaXMuX21ldGFkYXRhID0gbWV0YWRhdGFQYXlsb2FkLmRhdGEgJiYgdHlwZW9mIG1ldGFkYXRhUGF5bG9hZC5kYXRhID09PSBcIm9iamVjdFwiID8gey4uLm1ldGFkYXRhUGF5bG9hZC5kYXRhfSA6IHt9XG5cbiAgICAgIGZvciAoY29uc3Qge3N1YnNjcmlwdGlvbn0gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb24ub25NZXRhZGF0YUNoYW5nZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb24ub25NZXRhZGF0YUNoYW5nZWQodGhpcy5fbWV0YWRhdGEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcInNlc3Npb24tcmVzdW1lXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1vcGVuXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25PcGVuKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tbWVzc2FnZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLWNsb3NlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25DbG9zZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjaGFubmVsLXN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsU3Vic2NyaWJlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ2hhbm5lbFVuc3Vic2NyaWJlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlICYmIG1lc3NhZ2UudHlwZSAhPT0gXCJyZXF1ZXN0XCIpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICBpZiAoIXJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogYFVua25vd24gbWVzc2FnZSB0eXBlOiAke21lc3NhZ2UudHlwZX1gLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge2JvZHksIGhlYWRlcnMsIGlkLCBtZXRob2QsIHBhdGh9ID0gcmVxdWVzdFBheWxvYWRcblxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJtZXRob2QgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIXBhdGgpIHRocm93IG5ldyBFcnJvcihcInBhdGggaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLmdldE1ldGFkYXRhKCksXG4gICAgICBtZXRob2QsXG4gICAgICBwYXRoLFxuICAgICAgcmVtb3RlQWRkcmVzczogdGhpcy5yZW1vdGVBZGRyZXNzKClcbiAgICB9KVxuICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSBuZXcgUmVxdWVzdFJ1bm5lcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICByZXF1ZXN0XG4gICAgfSlcblxuICAgIHJlcXVlc3RSdW5uZXIuZXZlbnRzLm9uKFwiZG9uZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHJlcXVlc3RSdW5uZXIucmVzcG9uc2VcbiAgICAgIGNvbnN0IGJvZHkgPSByZXNwb25zZS5nZXRCb2R5KClcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzXG5cbiAgICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBpZCxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLFxuICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCksXG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2VcIlxuICAgICAgfSlcbiAgICAgIHZvaWQgcmVxdWVzdFJ1bm5lci5sb2dDb21wbGV0ZWRSZXF1ZXN0KCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gbG9nIGNvbXBsZXRlZCByZXF1ZXN0XCIsIGVycm9yKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgYXdhaXQgcmVxdWVzdFJ1bm5lci5ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcHJvY2VzcyBidWZmZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9wcm9jZXNzQnVmZmVyKCkge1xuICAgIHdoaWxlICh0aGlzLmJ1ZmZlci5sZW5ndGggPj0gMikge1xuICAgICAgY29uc3QgZmlyc3RCeXRlID0gdGhpcy5idWZmZXJbMF1cbiAgICAgIGNvbnN0IHNlY29uZEJ5dGUgPSB0aGlzLmJ1ZmZlclsxXVxuICAgICAgY29uc3QgaXNGaW5hbCA9IChmaXJzdEJ5dGUgJiBXRUJTT0NLRVRfRklOQUxfRlJBTUUpID09PSBXRUJTT0NLRVRfRklOQUxfRlJBTUVcbiAgICAgIGNvbnN0IG9wY29kZSA9IGZpcnN0Qnl0ZSAmIDB4MEZcbiAgICAgIGNvbnN0IGlzTWFza2VkID0gKHNlY29uZEJ5dGUgJiAweDgwKSA9PT0gMHg4MFxuICAgICAgbGV0IHBheWxvYWRMZW5ndGggPSBzZWNvbmRCeXRlICYgMHg3RlxuICAgICAgbGV0IG9mZnNldCA9IDJcblxuICAgICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNikge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgb2Zmc2V0ICsgMikgcmV0dXJuXG4gICAgICAgIHBheWxvYWRMZW5ndGggPSB0aGlzLmJ1ZmZlci5yZWFkVUludDE2QkUob2Zmc2V0KVxuICAgICAgICBvZmZzZXQgKz0gMlxuICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjcpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IG9mZnNldCArIDgpIHJldHVyblxuICAgICAgICBjb25zdCBiaWdMZW5ndGggPSB0aGlzLmJ1ZmZlci5yZWFkQmlnVUludDY0QkUob2Zmc2V0KVxuXG4gICAgICAgIHBheWxvYWRMZW5ndGggPSBOdW1iZXIoYmlnTGVuZ3RoKVxuICAgICAgICBvZmZzZXQgKz0gOFxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXNrTGVuZ3RoID0gaXNNYXNrZWQgPyA0IDogMFxuXG4gICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgb2Zmc2V0ICsgbWFza0xlbmd0aCArIHBheWxvYWRMZW5ndGgpIHJldHVyblxuXG4gICAgICAvKiogQHR5cGUge0J1ZmZlcn0gKi9cbiAgICAgIGxldCBwYXlsb2FkID0gdGhpcy5idWZmZXIuc2xpY2Uob2Zmc2V0ICsgbWFza0xlbmd0aCwgb2Zmc2V0ICsgbWFza0xlbmd0aCArIHBheWxvYWRMZW5ndGgpXG5cbiAgICAgIGlmIChpc01hc2tlZCkge1xuICAgICAgICBjb25zdCBtYXNrID0gdGhpcy5idWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtYXNrTGVuZ3RoKVxuICAgICAgICBwYXlsb2FkID0gdGhpcy5fdW5tYXNrUGF5bG9hZChwYXlsb2FkLCBtYXNrKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnNsaWNlKG9mZnNldCArIG1hc2tMZW5ndGggKyBwYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAvLyBDb250cm9sIGZyYW1lcyAob3Bjb2RlID49IDB4OCkgbXVzdCBub3QgYmUgZnJhZ21lbnRlZCBwZXJcbiAgICAgIC8vIFJGQyA2NDU1IGFuZCBjYW4gYXJyaXZlIGludGVybGVhdmVkIHdpdGggYSBmcmFnbWVudGVkIGRhdGFcbiAgICAgIC8vIG1lc3NhZ2UuIEhhbmRsZSB0aGVtIGZpcnN0IHdpdGhvdXQgdG91Y2hpbmcgdGhlIGZyYWdtZW50XG4gICAgICAvLyBhY2N1bXVsYXRvci5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfUElORykge1xuICAgICAgICB0aGlzLl9zZW5kQ29udHJvbEZyYW1lKFdFQlNPQ0tFVF9PUENPREVfUE9ORywgcGF5bG9hZClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DTE9TRSkge1xuICAgICAgICB0aGlzLnNlbmRHb29kYnllKHRoaXMuY2xpZW50KVxuICAgICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfUE9ORykge1xuICAgICAgICAvLyBBbnN3ZXIgdG8gYSBoZWFydGJlYXQgcGluZzsgbGl2ZW5lc3MgaXMgcmVjb3JkZWQgaW4gb25EYXRhLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID49IDB4OCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgY29udHJvbCBvcGNvZGU6ICR7b3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIERhdGEgZnJhbWUgKFRFWFQvQklOQVJZL0NPTlRJTlVBVElPTikuIFJlYXNzZW1ibGUgZnJhZ21lbnRzXG4gICAgICAvLyBiZWZvcmUgZGlzcGF0Y2hpbmcuIEJyb3dzZXJzIChDaHJvbWUpIGxlZ2l0aW1hdGVseSBmcmFnbWVudFxuICAgICAgLy8gbG9uZ2VyIGNsaWVudOKGknNlcnZlciB0ZXh0IGZyYW1lczsgYSBwcmlvciB2ZXJzaW9uIGRyb3BwZWRcbiAgICAgIC8vIGV2ZXJ5IGZyYWdtZW50ZWQgbWVzc2FnZSBzaWxlbnRseSwgc28gYW55IHBheWxvYWQgbGFyZ2VcbiAgICAgIC8vIGVub3VnaCB0byBoaXQgdGhlIGJyb3dzZXIncyBmcmFnbWVudGF0aW9uIHRocmVzaG9sZFxuICAgICAgLy8gKGUuZy4gYSBjaGFubmVsLXN1YnNjcmliZSB3aXRoIGFuIGF1dGggdG9rZW4pIG5ldmVyIHJlYWNoZWRcbiAgICAgIC8vIHRoZSBoYW5kbGVyLlxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04pIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNlaXZlZCBjb250aW51YXRpb24gZnJhbWUgd2l0aCBubyBmcmFnbWVudGVkIG1lc3NhZ2UgaW4gcHJvZ3Jlc3NcIilcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hcHBlbmRGcmFnbWVudChwYXlsb2FkKSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKCFpc0ZpbmFsKSBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfVEVYVCB8fCBvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQklOQVJZKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjZWl2ZWQgbmV3IGRhdGEgZnJhbWUgd2hpbGUgYSBmcmFnbWVudGVkIG1lc3NhZ2Ugd2FzIGluIHByb2dyZXNzOyBkaXNjYXJkaW5nIHByaW9yIGZyYWdtZW50c1wiKVxuICAgICAgICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gW3BheWxvYWRdXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA9IG9wY29kZVxuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IHBheWxvYWQubGVuZ3RoXG5cbiAgICAgICAgICBpZiAoIXRoaXMuX2VuZm9yY2VGcmFnbWVudExpbWl0cygpKSByZXR1cm5cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBkYXRhIG9wY29kZTogJHtvcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBEZWZpbmVzIGZpbmFsUGF5bG9hZC5cbiAgICAgICAqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgICBsZXQgZmluYWxQYXlsb2FkXG4gICAgICAvKipcbiAgICAgICAqIERlZmluZXMgZmluYWxPcGNvZGUuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgbGV0IGZpbmFsT3Bjb2RlXG5cbiAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DT05USU5VQVRJT04pIHtcbiAgICAgICAgICBmaW5hbFBheWxvYWQgPSBCdWZmZXIuY29uY2F0KHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcylcbiAgICAgICAgICBmaW5hbE9wY29kZSA9IHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPz8gV0VCU09DS0VUX09QQ09ERV9URVhUXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXlsb2FkID0gcGF5bG9hZFxuICAgICAgICAgIGZpbmFsT3Bjb2RlID0gb3Bjb2RlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbFBheWxvYWQgPSBwYXlsb2FkXG4gICAgICAgIGZpbmFsT3Bjb2RlID0gb3Bjb2RlXG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbE9wY29kZSAhPT0gV0VCU09DS0VUX09QQ09ERV9URVhUKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBkYXRhIG9wY29kZSBhZnRlciByZWFzc2VtYmx5OiAke2ZpbmFsT3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGZpbmFsUGF5bG9hZC50b1N0cmluZyhcInV0Zi04XCIpKVxuXG4gICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgICAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yXSlcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IFwiSW52YWxpZCB3ZWJzb2NrZXQgbWVzc2FnZVwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgY29udGludWF0aW9uLWZyYW1lIHBheWxvYWQgdG8gdGhlIGluLXByb2dyZXNzXG4gICAqIGZyYWdtZW50ZWQgbWVzc2FnZS4gUmV0dXJucyB0cnVlIHdoZW4gdGhlIGZyYWdtZW50IHdhcyBhY2NlcHRlZFxuICAgKiBhbmQgZmFsc2Ugd2hlbiB0aGUgcGVyLW1lc3NhZ2UgY2FwIHdhcyBoaXQgYW5kIHRoZSBzb2NrZXQgaGFzXG4gICAqIGJlZW4gY2xvc2VkLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIENvbnRpbnVhdGlvbi1mcmFtZSBieXRlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGZyYWdtZW50IHdhcyBhY2NlcHRlZC5cbiAgICovXG4gIF9hcHBlbmRGcmFnbWVudChwYXlsb2FkKSB7XG4gICAgLy8gR3VhcmQgcHVzaGluZyBmaXJzdCBzbyBgX2VuZm9yY2VGcmFnbWVudExpbWl0c2Agc2VlcyB0aGUgZmluYWxcbiAgICAvLyBzdGF0ZTsgb24gb3ZlcmZsb3cgdGhlIHJlc2V0IGluc2lkZSB0aGUgZW5mb3JjZXIgZHJvcHMgdGhlXG4gICAgLy8gYnVmZmVyZWQgZnJhZ21lbnRzLlxuICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2Fkcz8ucHVzaChwYXlsb2FkKVxuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyArPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgcmV0dXJuIHRoaXMuX2VuZm9yY2VGcmFnbWVudExpbWl0cygpXG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIGZyYWdtZW50ZWQgbWVzc2FnZSBoYXMgbm90IGV4Y2VlZGVkIHRoZSBieXRlIG9yXG4gICAqIGZyYWdtZW50LWNvdW50IGNhcHMuIE9uIG92ZXJmbG93LCBjbGVhcnMgdGhlIGJ1ZmZlciwgc2VuZHMgYVxuICAgKiBjbG9zZSBmcmFtZSwgYW5kIHRlYXJzIHRoZSBzZXNzaW9uIGRvd24uIFJldHVybnMgdHJ1ZSB3aGVuIHRoZVxuICAgKiBjYWxsZXIgY2FuIGNvbnRpbnVlIHByb2Nlc3NpbmcsIGZhbHNlIHdoZW4gdGhlIHNlc3Npb24gaXMgYmVpbmdcbiAgICogY2xvc2VkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGZyYWdtZW50IHByb2Nlc3NpbmcgbWF5IGNvbnRpbnVlLlxuICAgKi9cbiAgX2VuZm9yY2VGcmFnbWVudExpbWl0cygpIHtcbiAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID09PSBudWxsKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgZnJhZ21lbnRDb3VudCA9IHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2Fkcy5sZW5ndGhcbiAgICBjb25zdCBvdmVyQnl0ZXMgPSB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU1xuICAgIGNvbnN0IG92ZXJGcmFnbWVudHMgPSBmcmFnbWVudENvdW50ID4gV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTXG5cbiAgICBpZiAoIW92ZXJCeXRlcyAmJiAhb3ZlckZyYWdtZW50cykgcmV0dXJuIHRydWVcblxuICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1xuICAgICAgXCJGcmFnbWVudGVkIHdlYnNvY2tldCBtZXNzYWdlIGV4Y2VlZGVkIGNhcHM7IGNsb3NpbmcgY29ubmVjdGlvblwiLFxuICAgICAge1xuICAgICAgICBmcmFnbWVudEJ5dGVzOiB0aGlzLl9mcmFnbWVudGVkQnl0ZXMsXG4gICAgICAgIGZyYWdtZW50Q291bnQsXG4gICAgICAgIG1heEJ5dGVzOiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFUyxcbiAgICAgICAgbWF4RnJhZ21lbnRzOiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFNcbiAgICAgIH1cbiAgICBdKVxuXG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMClcbiAgICB0aGlzLnNlbmRHb29kYnllKHRoaXMuY2xpZW50KVxuICAgIHRoaXMuX2hhbmRsZUNsb3NlKClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzZXQgZnJhZ21lbnQgYnVmZmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKSB7XG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBudWxsXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0LiBFYWNoIHRpY2sgcGluZ3MgdGhlIGNsaWVudCBhbmRcbiAgICogcmVhcHMgdGhlIHNlc3Npb24gaWYgdGhlIHByZXZpb3VzIHBpbmcgd2VudCB1bmFuc3dlcmVkLCBzbyBhXG4gICAqIGhhbGYtb3BlbiBzb2NrZXQgKGNsaWVudCBnb25lIHdpdGhvdXQgYSBUQ1AgRklOIC8gY2xvc2UgZnJhbWUpXG4gICAqIGNhbm5vdCBsaW5nZXIgZm9yZXZlciBob2xkaW5nIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy4gRGlzYWJsZWQgd2hlblxuICAgKiB0aGUgY29uZmlndXJlZCBpbnRlcnZhbCBpcyAwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zdGFydEhlYXJ0YmVhdCgpIHtcbiAgICBjb25zdCBpbnRlcnZhbFNlY29uZHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbkhlYXJ0YmVhdFNlY29uZHMoKVxuXG4gICAgaWYgKCFpbnRlcnZhbFNlY29uZHMgfHwgaW50ZXJ2YWxTZWNvbmRzIDw9IDApIHJldHVyblxuXG4gICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLl9oZWFydGJlYXRUaWNrKCksIGludGVydmFsU2Vjb25kcyAqIDEwMDApXG5cbiAgICAvLyBEb24ndCBsZXQgdGhlIGhlYXJ0YmVhdCB0aW1lciBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlLlxuICAgIGlmICh0eXBlb2YgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYoKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSBoZWFydGJlYXQgY3ljbGUuIFJlYXBzIHRoZSBzZXNzaW9uIHZpYSB0aGUgbm9ybWFsIGNsb3NlIHBhdGhcbiAgICogd2hlbiB0aGUgcHJldmlvdXMgcGluZyB3YXMgbm90IGFuc3dlcmVkOyBvdGhlcndpc2UgbWFya3MgaXRcbiAgICogcGVuZGluZyBhbmQgcGluZ3MgYWdhaW4uIEJyb3dzZXJzIGFuZCBSZWFjdCBOYXRpdmUgc29ja2V0cyBhbnN3ZXJcbiAgICogc2VydmVyIHBpbmdzIHdpdGggYW4gYXV0b21hdGljIHBvbmcsIHdoaWNoIGxhbmRzIGluIGBfcHJvY2Vzc0J1ZmZlcmBcbiAgICogYW5kIHJlLW1hcmtzIHRoZSBzZXNzaW9uIGFsaXZlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9oZWFydGJlYXRUaWNrKCkge1xuICAgIGlmICh0aGlzLl9wYXVzZWQgfHwgIXRoaXMuY2xpZW50Py5ldmVudHMpIHJldHVyblxuXG4gICAgaWYgKCF0aGlzLl9oZWFydGJlYXRBbGl2ZSkge1xuICAgICAgLy8gTm8gZnJhbWUgYXJyaXZlZCBzaW5jZSB0aGUgbGFzdCBwaW5nIOKAlCB0aGUgc29ja2V0IGlzIGRlYWQuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGBfaGFuZGxlQ2xvc2VgIHNvIHJlc3VtYWJsZSBzdGF0ZSBzdGlsbCBwYXVzZXNcbiAgICAgIC8vIGZvciB0aGUgZ3JhY2Ugd2luZG93IGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgdG9ybiBkb3duLlxuICAgICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fc2VuZENvbnRyb2xGcmFtZShXRUJTT0NLRVRfT1BDT0RFX1BJTkcsIEJ1ZmZlci5hbGxvYygwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0IHRpbWVyLCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3N0b3BIZWFydGJlYXQoKSB7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKVxuICAgICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBjb250cm9sIGZyYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gb3Bjb2RlIC0gT3Bjb2RlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRDb250cm9sRnJhbWUob3Bjb2RlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBvcGNvZGVcbiAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGpzb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kSnNvbihib2R5KSB7XG4gICAgLy8gV2hpbGUgcGF1c2VkICh3YWl0aW5nIGZvciBhIHJlc3VtZSksIHN0YXNoIGZyYW1lcyBpbiBhblxuICAgIC8vIG91dGJvdW5kIHF1ZXVlIGFuZCBmbHVzaCB0aGVtIGluIG9yZGVyIG9uIHJlc3VtZS4gQ2FwcGVkIHRvXG4gICAgLy8gcHJldmVudCBydW5hd2F5IG1lbW9yeSB1c2Ugd2hpbGUgdGhlIGNsaWVudCBpcyBvZmZsaW5lLlxuICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgIHRoaXMuX291dGJvdW5kUXVldWUgfHw9IFtdXG5cbiAgICAgIGlmICh0aGlzLl9vdXRib3VuZFF1ZXVlLmxlbmd0aCA+PSBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCkge1xuICAgICAgICAvLyBEcm9wIG9sZGVzdCBzbyB0aGUgbW9zdCByZWNlbnQgYWN0aXZpdHkgd2lucyBvbiByZXN1bWUuXG4gICAgICAgIHRoaXMuX291dGJvdW5kUXVldWUuc2hpZnQoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnB1c2goYm9keSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5jbGllbnQ/LmV2ZW50cykgcmV0dXJuXG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmZyb20oanNvbiwgXCJ1dGYtOFwiKVxuICAgIGxldCBoZWFkZXJcblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDEyNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG4gICAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5sZW5ndGggPCA2NTUzNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgICBoZWFkZXJbMV0gPSAxMjZcbiAgICAgIGhlYWRlci53cml0ZVVJbnQxNkJFKHBheWxvYWQubGVuZ3RoLCAyKVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMTApXG4gICAgICBoZWFkZXJbMV0gPSAxMjdcbiAgICAgIGhlYWRlci53cml0ZUJpZ1VJbnQ2NEJFKEJpZ0ludChwYXlsb2FkLmxlbmd0aCksIDIpXG4gICAgfVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9URVhUXG5cbiAgICB0aGlzLmNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIHBheWxvYWRdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWUgb3ZlciB0aGUgY3VycmVudCBzb2NrZXQuXG4gICAqIENhbGxlZCBkdXJpbmcgcmVzdW1lIGFmdGVyIGBzZXNzaW9uLXJlc3VtZWRgIGhhcyBiZWVuIHNlbnQgb25cbiAgICogdGhlIE5FVyBzZXNzaW9uJ3Mgc29ja2V0IChub3QgdGhpcyBzZXNzaW9uJ3MpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9mbHVzaE91dGJvdW5kUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8IFtdXG5cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbihib2R5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN1YnNjcmliZSB0byBjaGFubmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YWNrbm93bGVkZ2U/OiBib29sZWFuLCBjaGFubmVsSGFuZGxlcj86IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Piwgc3Vic2NyaXB0aW9uQ2hhbm5lbD86IHN0cmluZ319IFtvcHRpb25zXSAtIFN1YnNjcmliZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gd2FzIGFkZGVkLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlVG9DaGFubmVsKGNoYW5uZWwsIHthY2tub3dsZWRnZSA9IHRydWUsIGNoYW5uZWxIYW5kbGVyLCBsYXN0RXZlbnRJZCwgcGFyYW1zLCBzdWJzY3JpcHRpb25DaGFubmVsfSA9IHt9KSB7XG4gICAgYXdhaXQgd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKS5tYXJrQ2hhbm5lbEludGVyZXN0ZWQoY2hhbm5lbClcblxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gYXdhaXQgdGhpcy5fcHJlcGFyZVJlcGxheVN0YXRlKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBsYXN0RXZlbnRJZCxcbiAgICAgIHN1YnNjcmlwdGlvbkNoYW5uZWw6IHN1YnNjcmlwdGlvbkNoYW5uZWwgfHwgY2hhbm5lbCxcbiAgICAgIHN1YnNjcmlwdGlvblBhcmFtczogcGFyYW1zXG4gICAgfSlcblxuICAgIGlmIChyZXBsYXlTdGF0ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuICAgIGlmIChyZXBsYXlTdGF0ZSkge1xuICAgICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLnNldChjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICB9XG5cbiAgICB0aGlzLmFkZFN1YnNjcmlwdGlvbihjaGFubmVsKVxuXG4gICAgaWYgKGNoYW5uZWxIYW5kbGVyKSB7XG4gICAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuaGFzKGNoYW5uZWwpKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuc2V0KGNoYW5uZWwsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoY2hhbm5lbCk/LmFkZChjaGFubmVsSGFuZGxlcilcblxuICAgICAgaWYgKCF0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmhhcyhjaGFubmVsSGFuZGxlcikpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5zZXQoY2hhbm5lbEhhbmRsZXIsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbEhhbmRsZXIpPy5hZGQoY2hhbm5lbClcbiAgICB9XG5cbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3JlcGxheUNoYW5uZWxFdmVudHMoe2NoYW5uZWwsIHJlcGxheVN0YXRlfSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2ZpbmlzaFJlcGxheVN0YXRlKGNoYW5uZWwsIHJlcGxheVN0YXRlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY2tub3dsZWRnZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgdHlwZTogXCJzdWJzY3JpYmVkXCJ9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2hhbmRsZUNsb3NlKCkge1xuICAgIC8vIElmIHRoZSBzZXNzaW9uIGhhcyByZXN1bWFibGUgc3RhdGUgKGxpdmUgQ29ubmVjdGlvbiBvclxuICAgIC8vIENoYW5uZWxWMiBzdWJzY3JpcHRpb24pLCBtb3ZlIGl0IGludG8gdGhlIHBhdXNlZCByZWdpc3RyeVxuICAgIC8vIGluc3RlYWQgb2YgdGVhcmluZyBkb3duOyBhIG5ldyBzb2NrZXQgcHJlc2VudGluZyB0aGUgc2Vzc2lvbklkXG4gICAgLy8gdmlhIGBzZXNzaW9uLXJlc3VtZWAgd2l0aGluIHRoZSBncmFjZSB3aW5kb3cgd2lsbCByZWF0dGFjaC5cbiAgICBjb25zdCBoYXNSZXN1bWFibGVTdGF0ZSA9IHRoaXMuX2Nvbm5lY3Rpb25zLnNpemUgPiAwIHx8IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNpemUgPiAwXG5cbiAgICBpZiAoaGFzUmVzdW1hYmxlU3RhdGUgJiYgIXRoaXMuX3BhdXNlZCkge1xuICAgICAgLy8gUGF1c2VkIHNlc3Npb25zIGhhdmUgbm8gbGl2ZSBzb2NrZXQgdG8gcGluZzsgdGhlIGdyYWNlIHRpbWVyXG4gICAgICAvLyBvd25zIHRoZWlyIGV2ZW50dWFsIHRlYXJkb3duIGZyb20gaGVyZS5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAvLyBLaWNrIG9mZiBhdXRoLWlkZW50aXR5IGNhcHR1cmUgZm9yIHJlc3VtZSB2ZXJpZmljYXRpb24uIFJ1bnNcbiAgICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kIOKAlCBgX2hhbmRsZVNlc3Npb25SZXN1bWVgIGF3YWl0c1xuICAgICAgLy8gYF9yZXN1bWVJZGVudGl0eVByb21pc2VgIGJlZm9yZSBjb21wYXJpbmcuIFBhdXNlIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gaXMgc3luY2hyb25vdXMgc28gYSByZXN1bWUgYXJyaXZpbmcgaW1tZWRpYXRlbHkgc3RpbGwgZmluZHNcbiAgICAgIC8vIHRoZSBzZXNzaW9uLlxuICAgICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdGhpcy5fY2FwdHVyZVJlc3VtZUlkZW50aXR5KClcbiAgICAgIHZvaWQgdGhpcy5fZmlyZU9uRGlzY29ubmVjdCgpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3BhdXNlV2Vic29ja2V0U2Vzc2lvbih0aGlzKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyYWNlIHRpbWVyIHdoZW4gdGhlIHBhdXNlZCBwZXJpb2QgZXhwaXJlcyB3aXRob3V0XG4gICAqIGEgcmVzdW1lLiBUZWFycyBkb3duIGFsbCBsaXZlIENvbm5lY3Rpb25zICsgQ2hhbm5lbCBzdWJzIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluYWxpemVHcmFjZUV4cGlyeSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcImdyYWNlX2V4cGlyZWRcIilcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGNvbmZpZ3VyZWQgaWRlbnRpdHkgcmVzb2x2ZXIgYWdhaW5zdCB0aGlzIHNlc3Npb24uXG4gICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHN0b3JlZCBhdCBwYXVzZSB0aW1lIGFuZCBhd2FpdGVkIGF0XG4gICAqIHJlc3VtZSB0aW1lIHNvIHdlIGNhbiByZWplY3QgcmVzdW1lIGF0dGVtcHRzIGZyb20gYSBkaWZmZXJlbnRcbiAgICogYXV0aGVudGljYXRlZCBjYWxsZXIgKHNpZ25lZCBvdXQsIHN3YXBwZWQgdXNlciwgZXhwaXJlZCBjb29raWUpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBDYXB0dXJlZCBhdXRoZW50aWNhdGVkIGlkZW50aXR5IGZvciByZXN1bWUgdmFsaWRhdGlvbi5cbiAgICovXG4gIGFzeW5jIF9jYXB0dXJlUmVzdW1lSWRlbnRpdHkoKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXI/LigpXG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IHNlc3Npb24gaWRlbnRpdHkgcmVzb2x2ZXIgZmFpbGVkIGF0IHBhdXNlXCIsIGVycm9yXSlcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uRGlzY29ubmVjdGAgb24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIGFuZCBDaGFubmVsIHN1YiBzb1xuICAgKiBhcHBzIGNhbiBwYXVzZSBwZXItaW5zdGFuY2Ugd29yayB3aGlsZSB0aGUgc2Vzc2lvbiBpcyBwYXVzZWQuXG4gICAqIEVycm9ycyBhcmUgbG9nZ2VkLCBub3QgcmV0aHJvd24g4oCUIG9uZSBicm9rZW4gaGFuZGxlciBtdXN0IG5vdFxuICAgKiBibG9jayB0aGUgcmVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uRGlzY29ubmVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLl9maXJlTGlmZWN5Y2xlQ2FsbGJhY2soXCJvbkRpc2Nvbm5lY3RcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25SZXN1bWVgIG9uIGV2ZXJ5IGxpdmUgQ29ubmVjdGlvbiBhbmQgQ2hhbm5lbCBzdWIgYWZ0ZXJcbiAgICogYSBzdWNjZXNzZnVsIGBzZXNzaW9uLXJlc3VtZWAgaGFuZG9mZi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfZmlyZU9uUmVzdW1lKCkge1xuICAgIGF3YWl0IHRoaXMuX2ZpcmVMaWZlY3ljbGVDYWxsYmFjayhcIm9uUmVzdW1lXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaXJlIGxpZmVjeWNsZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtcIm9uRGlzY29ubmVjdFwiIHwgXCJvblJlc3VtZVwifSBjYWxsYmFja05hbWUgTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGZpcmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIGV2ZXJ5IGxpdmUgaGFuZGxlciBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gICAqL1xuICBhc3luYyBfZmlyZUxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSkge1xuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbltjYWxsYmFja05hbWVdPy4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2Ake2NhbGxiYWNrTmFtZX0gZmFpbGVkIGZvciAke2Nvbm5lY3Rpb24uY29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHtzdWJzY3JpcHRpb259IG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb25bY2FsbGJhY2tOYW1lXT8uKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgJHtjYWxsYmFja05hbWV9IGZhaWxlZCBmb3IgY2hhbm5lbCBzdWIgJHtzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJzZXNzaW9uLXJlc3VtZVwifWAuIFRoaXMgc2Vzc2lvbiAodGhlIG5ld2x5LVxuICAgKiBjcmVhdGVkIG9uZSB3aG9zZSBzb2NrZXQganVzdCBjb25uZWN0ZWQpIHRyYW5zZmVycyBzdGF0ZSBmcm9tXG4gICAqIHRoZSBwYXVzZWQgc2Vzc2lvbiBhbmQgaW5zdHJ1Y3RzIHRoZSBjbGllbnQgdmlhXG4gICAqIGBzZXNzaW9uLXJlc3VtZWRgIG9yIGBzZXNzaW9uLWdvbmVgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gU2Vzc2lvbi1yZXN1bWUgZnJhbWUgY29udGFpbmluZyB0aGUgcGF1c2VkIHNlc3Npb24gaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzdW1lU2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcblxuICAgIGlmICh0eXBlb2YgcmVzdW1lU2Vzc2lvbklkICE9PSBcInN0cmluZ1wiIHx8ICFyZXN1bWVTZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGF1c2VkID0gdGhpcy5jb25maWd1cmF0aW9uLl9maW5kUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG5cbiAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLWdvbmVcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBBdXRoIHJlLXZlcmlmeTogY29tcGFyZSB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkgYWdhaW5zdCB0aGVcbiAgICAvLyBvbmUgY2FwdHVyZWQgYXQgcGF1c2UuIE1pc21hdGNoIG1lYW5zIGEgZGlmZmVyZW50IHVzZXIgKG9yIGFcbiAgICAvLyBzaWduZWQtb3V0IHNlc3Npb24pIGlzIHRyeWluZyB0byByZWNsYWltIHN0YXRlIHRoYXQgaXNuJ3RcbiAgICAvLyB0aGVpcnMg4oCUIGRlc3Ryb3kgdGhlIHBhdXNlZCBzZXNzaW9uIG91dHJpZ2h0LlxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyPy4oKVxuXG4gICAgaWYgKHR5cGVvZiByZXNvbHZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBwYXVzZWRJZGVudGl0eSA9IGF3YWl0IHBhdXNlZC5fcmVzdW1lSWRlbnRpdHlQcm9taXNlXG4gICAgICBsZXQgZnJlc2hJZGVudGl0eVxuXG4gICAgICB0cnkge1xuICAgICAgICBmcmVzaElkZW50aXR5ID0gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBzZXNzaW9uIGlkZW50aXR5IHJlc29sdmVyIGZhaWxlZCBhdCByZXN1bWVcIiwgZXJyb3JdKVxuICAgICAgICBmcmVzaElkZW50aXR5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmICghaWRlbnRpdGllc01hdGNoKHBhdXNlZElkZW50aXR5LCBmcmVzaElkZW50aXR5KSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2NsZWFyUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG4gICAgICAgIHBhdXNlZC5fZmluYWxpemVHcmFjZUV4cGlyeSgpXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2NsZWFyUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG5cbiAgICAvLyBUcmFuc2ZlciByZXN1bWFibGUgc3RhdGUgb250byB0aGlzIChsaXZlKSBzZXNzaW9uLiBUaGUgcGF1c2VkXG4gICAgLy8gc2Vzc2lvbiBzaGVsbCBpcyBkaXNjYXJkZWQgYWZ0ZXIgdGhlIHRyYW5zZmVyLlxuICAgIGZvciAoY29uc3QgW2Nvbm5lY3Rpb25JZCwgY29ubmVjdGlvbl0gb2YgcGF1c2VkLl9jb25uZWN0aW9ucykge1xuICAgICAgY29ubmVjdGlvbi5zZXNzaW9uID0gdGhpc1xuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJJZCwgZW50cnldIG9mIHBhdXNlZC5fY2hhbm5lbFN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5zZXNzaW9uID0gdGhpc1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YklkLCBlbnRyeSlcbiAgICB9XG5cbiAgICB0aGlzLl9tZXRhZGF0YSA9IHsuLi5wYXVzZWQuX21ldGFkYXRhfVxuICAgIHRoaXMuZGF0YSA9IHBhdXNlZC5kYXRhXG4gICAgdGhpcy5zZXNzaW9uSWQgPSByZXN1bWVTZXNzaW9uSWRcblxuICAgIC8vIFRyYW5zZmVyIGFueSBmcmFtZXMgcXVldWVkIHdoaWxlIHRoZSBwYXVzZWQgc2Vzc2lvbiBoYWQgbm9cbiAgICAvLyBzb2NrZXQuIFRoZXkgZmx1c2ggQUZURVIgc2Vzc2lvbi1yZXN1bWVkIHNvIHRoZSBjbGllbnQga25vd3NcbiAgICAvLyB3aGljaCBzZXNzaW9uIHRoZXkgYmVsb25nIHRvLlxuICAgIGNvbnN0IHF1ZXVlZCA9IHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSB8fCBbXVxuXG4gICAgcGF1c2VkLl9vdXRib3VuZFF1ZXVlID0gW11cbiAgICBwYXVzZWQuX2Nvbm5lY3Rpb25zLmNsZWFyKClcbiAgICBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICBwYXVzZWQuX3BhdXNlZCA9IGZhbHNlXG4gICAgcGF1c2VkLmRlc3Ryb3koKVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLXJlc3VtZWRcIiwgc2Vzc2lvbklkOiByZXN1bWVTZXNzaW9uSWR9KVxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZWQpIHRoaXMuc2VuZEpzb24oYm9keSlcbiAgICBhd2FpdCB0aGlzLl9maXJlT25SZXN1bWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvbkNsb3NlKHJlYXNvbilgIG9uIGV2ZXJ5IGxpdmUgYXBwLWRlZmluZWQgY29ubmVjdGlvbiwgdGhlblxuICAgKiBkcm9wcyB0aGVtIGZyb20gdGhlIHJlZ2lzdHJ5LiBObyBuZXR3b3JrIGZyYW1lIGlzIHNlbnQg4oCUIHRoZVxuICAgKiBzb2NrZXQgaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKiBAcGFyYW0ge1wic2Vzc2lvbl9kZXN0cm95ZWRcIiB8IFwiZ3JhY2VfZXhwaXJlZFwiIHwgXCJlcnJvclwifSByZWFzb24gLSBQZXJtYW5lbnQgdGVhcmRvd24gcmVhc29uIHBhc3NlZCB0byBlYWNoIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ29ubmVjdGlvbnMocmVhc29uKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UocmVhc29uKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuXCJ9YCBtZXNzYWdlIOKAlCBpbnN0YW50aWF0ZXMgdGhlXG4gICAqIHJlZ2lzdGVyZWQgY29ubmVjdGlvbiBjbGFzcywgc3RvcmVzIGl0IG9uIGBfY29ubmVjdGlvbnNgLCBhbmRcbiAgICogZmlyZXMgYG9uQ29ubmVjdCgpYC4gU2VuZHMgYGNvbm5lY3Rpb24tb3BlbmVkYCBvbiBzdWNjZXNzIG9yXG4gICAqIGBjb25uZWN0aW9uLWVycm9yYCBvbiBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1vcGVuIGZyYW1lIG5hbWluZyB0aGUgY29ubmVjdGlvbiB0eXBlIGFuZCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uT3BlbihtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uVHlwZSA9IG1lc3NhZ2UuY29ubmVjdGlvblR5cGVcbiAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcyB8fCB7fVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjb25uZWN0aW9uLW9wZW4gcmVxdWlyZXMgY29ubmVjdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY29ubmVjdGlvblR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiY29ubmVjdGlvblR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiQ29ubmVjdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENvbm5lY3Rpb25DbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDb25uZWN0aW9uQ2xhc3M/Lihjb25uZWN0aW9uVHlwZSlcblxuICAgIGlmICghQ29ubmVjdGlvbkNsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBgVW5rbm93biBjb25uZWN0aW9uIHR5cGU6ICR7Y29ubmVjdGlvblR5cGV9YH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb25DbGFzcyh7Y29ubmVjdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25Db25uZWN0KClcbiAgICAgIH0pXG4gICAgICAvLyBSZWdpc3RlciBvbmx5IGFmdGVyIG9uQ29ubmVjdCByZXNvbHZlcyBzbyBhIGNvbm5lY3Rpb24tbWVzc2FnZVxuICAgICAgLy8gY2FuIG5ldmVyIGJlIHJvdXRlZCB0byBhIHBhcnRpYWxseSBpbml0aWFsaXplZCBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuZWRcIiwgY29ubmVjdGlvbklkfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uICR7Y29ubmVjdGlvblR5cGV9OiR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb25cIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1tZXNzYWdlXCJ9YCBmcm9tIHRoZSBjbGllbnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2UgLSBDb25uZWN0aW9uLW1lc3NhZ2UgZnJhbWUgY29udGFpbmluZyB0aGUgdGFyZ2V0IGlkZW50aWZpZXIgYW5kIGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0eXBlb2YgY29ubmVjdGlvbklkID09PSBcInN0cmluZ1wiID8gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCkgOiBudWxsXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiVW5rbm93biBjb25uZWN0aW9uIGlkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25NZXNzYWdlKG1lc3NhZ2UuYm9keSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIGhhbmRsZSBjb25uZWN0aW9uLW1lc3NhZ2UgZm9yICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBoYW5kbGUgbWVzc2FnZVwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGB7dHlwZTogXCJjb25uZWN0aW9uLWNsb3NlXCJ9YCBmcm9tIHRoZSBjbGllbnQg4oCUIGZpcmVzXG4gICAqIGBvbkNsb3NlKFwiY2xpZW50X2Nsb3NlXCIpYCBhbmQgY29uZmlybXMgd2l0aCBgY29ubmVjdGlvbi1jbG9zZWRgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1jbG9zZSBmcmFtZSBjb250YWluaW5nIHRoZSB0YXJnZXQgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ29ubmVjdGlvbkNsb3NlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0eXBlb2YgY29ubmVjdGlvbklkID09PSBcInN0cmluZ1wiID8gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCkgOiBudWxsXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZClcbiAgICAvLyBNYXJrIGNsb3NlZCBiZWZvcmUgZmlyaW5nIG9uQ2xvc2Ugc28gYXBwIGNvZGUgaG9sZGluZyB0aGVcbiAgICAvLyBoYW5kbGUgc2VlcyBgaXNDbG9zZWQoKSA9PT0gdHJ1ZWAgYW5kIGNhbid0IHJlLWVudGVyIHNlbmRNZXNzYWdlLlxuICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UoXCJjbGllbnRfY2xvc2VcIilcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjb25uZWN0aW9uICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tY2xvc2VkXCIsIGNvbm5lY3Rpb25JZCwgcmVhc29uOiBcImNsaWVudF9jbG9zZVwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZVwifWAg4oCUIHJ1bnMgYGNhblN1YnNjcmliZSgpYCxcbiAgICogcmVnaXN0ZXJzIHdpdGggdGhlIENvbmZpZ3VyYXRpb24ncyBnbG9iYWwgcm91dGluZyByZWdpc3RyeSBvblxuICAgKiBzdWNjZXNzLCBhbmQgc2VuZHMgYGNoYW5uZWwtc3Vic2NyaWJlZGAgb3IgYGNoYW5uZWwtZXJyb3JgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ2hhbm5lbC1zdWJzY3JpYmUgZnJhbWUgZGVzY3JpYmluZyB0aGUgcmVxdWVzdGVkIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG4gICAgY29uc3QgY2hhbm5lbFR5cGUgPSBtZXNzYWdlLmNoYW5uZWxUeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cbiAgICBjb25zdCBsYXN0RXZlbnRJZCA9IG1lc3NhZ2UubGFzdEV2ZW50SWRcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIXN1YnNjcmlwdGlvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImVycm9yXCIsIGVycm9yOiBcImNoYW5uZWwtc3Vic2NyaWJlIHJlcXVpcmVzIHN1YnNjcmlwdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGFubmVsVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY2hhbm5lbFR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJjaGFubmVsVHlwZSBpcyByZXF1aXJlZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5oYXMoc3Vic2NyaXB0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIGlkIGFscmVhZHkgaW4gdXNlXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgQ2hhbm5lbENsYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxDbGFzcz8uKGNoYW5uZWxUeXBlKVxuXG4gICAgaWYgKCFDaGFubmVsQ2xhc3MpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogYFVua25vd24gY2hhbm5lbCB0eXBlOiAke2NoYW5uZWxUeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IENoYW5uZWxDbGFzcyh7c3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbjogdGhpc30pXG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzb2x2aW5nIHRoZSB0ZW5hbnQgY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzIChlLmcuIGxvb2tpbmcgdXAgdGhlXG4gICAgICAvLyByZWNvcmQncyBwcm9qZWN0IGFuZCB0aGUgY2FsbGVyJ3MgYWNjZXNzKSwgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUuIFdpdGhvdXQgdGhpcyB0aGUgcmVzb2x2ZXIgYm9ycm93cyBhIGNvbm5lY3Rpb24gdGhhdFxuICAgICAgLy8gaXMgY2hlY2tlZCBiYWNrIGluIGJlZm9yZS93aGlsZSBpdCBxdWVyaWVzLCBpbnRlcm1pdHRlbnRseSBzdXJmYWNpbmcgYXNcbiAgICAgIC8vIFwiQ29ubmVjdGlvbiDigKYgZG9lc24ndCBleGlzdCBhbnkgbW9yZVwiIG9yIGEgZmFsc2VseSB1bmF1dGhvcml6ZWRcbiAgICAgIC8vIHN1YnNjcmlwdGlvbi5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBwYXJhbXN9KVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gZmFsc2VcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGFsbG93ZWQgPSBCb29sZWFuKGF3YWl0IHN1YnNjcmlwdGlvbi5jYW5TdWJzY3JpYmUoKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIG5vdCBhdXRob3JpemVkXCJ9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkKCkpXG5cbiAgICAgICAgLy8gUmVwbGF5IG1pc3NlZCBldmVudHMgQkVGT1JFIHNlbmRpbmcgY2hhbm5lbC1zdWJzY3JpYmVkIHNvXG4gICAgICAgIC8vIHRoZSBjbGllbnQga25vd3M6IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBjb25maXJtYXRpb24gaXNcbiAgICAgICAgLy8gcmVwbGF5ZWQsIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgbGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0RXZlbnRJZCA9PT0gXCJzdHJpbmdcIiAmJiBsYXN0RXZlbnRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9uKVxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gc3Vic2NyaWJlIGNoYW5uZWwgJHtjaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzdWJzY3JpYmVcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgbWlzc2VkIGV2ZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW50IGV2ZW50LWxvZyBzdG9yZSBmb3IgYVxuICAgKiBjaGFubmVsIHN1YnNjcmlwdGlvbiB0aGF0IHByb3ZpZGVkIGBsYXN0RXZlbnRJZGAuIFNlbmRzIGVhY2hcbiAgICogbWlzc2VkIGV2ZW50IGFzIGEgYGNoYW5uZWwtbWVzc2FnZWAgd2l0aCBgcmVwbGF5ZWQ6IHRydWVgLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWxUeXBlIC0gQ2hhbm5lbCB0eXBlIG5hbWUgKGV2ZW50LWxvZyBrZXkpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYXN0RXZlbnRJZCAtIENsaWVudCdzIGxhc3Qtc2VlbiBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fSBhcmdzLnN1YnNjcmlwdGlvbiAtIExpdmUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcblxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsLXJlcGxheS1nYXBcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgbGFzdEV2ZW50SWRcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjZWlsaW5nID0gYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIWNlaWxpbmcgfHwgY2VpbGluZyA8PSBjaGVja3BvaW50LnNlcXVlbmNlKSByZXR1cm5cblxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWxUeXBlLFxuICAgICAgc2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IGNlaWxpbmdcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24uaXNDbG9zZWQoKSkgYnJlYWtcblxuICAgICAgc3Vic2NyaXB0aW9uLnNlbmRNZXNzYWdlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSAqLyAoZXZlbnQucGF5bG9hZCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgY2FsbHNcbiAgICogYHVuc3Vic2NyaWJlZCgpYCBhbmQgc2VuZHMgYGNoYW5uZWwtdW5zdWJzY3JpYmVkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIENoYW5uZWwtdW5zdWJzY3JpYmUgZnJhbWUgY29udGFpbmluZyB0aGUgc3Vic2NyaXB0aW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxVbnN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSByZXR1cm5cblxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbklkKVxuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihlbnRyeS5jaGFubmVsVHlwZSwgZW50cnkuc3Vic2NyaXB0aW9uKVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKCkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGNoYW5uZWwgJHtlbnRyeS5jaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXVuc3Vic2NyaWJlZFwiLCBzdWJzY3JpcHRpb25JZH0pXG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYHVuc3Vic2NyaWJlZCgpYCBvbiBldmVyeSBsaXZlIGNoYW5uZWwtdjIgc3Vic2NyaXB0aW9uLFxuICAgKiByZW1vdmVzIHRoZW0gZnJvbSB0aGUgQ29uZmlndXJhdGlvbidzIGdsb2JhbCByZWdpc3RyeSwgYW5kXG4gICAqIGRyb3BzIHRoZSBzZXNzaW9uJ3Mgb3duIG1hcC4gTm8gbmV0d29yayBmcmFtZXMg4oCUIHRoZSBzb2NrZXRcbiAgICogaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4udGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IHtjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9ufSBvZiBlbnRyaWVzKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3VucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG4gICAgICBzdWJzY3JpcHRpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZWQoKSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjaGFubmVsLXYyICR7Y2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfdGVhcmRvd25DaGFubmVsKCkge1xuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiB0aGlzLmNoYW5uZWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbClcbiAgICB9XG4gICAgdGhpcy5jaGFubmVscy5jbGVhcigpXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRlYXJkb3duIHNpbmdsZSBjaGFubmVsLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWx9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duU2luZ2xlQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2hhbm5lbFRlbmFudHMuZ2V0KGNoYW5uZWwpXG5cbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGNoYW5uZWw/LnVuc3Vic2NyaWJlZD8uKClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byB0ZWFyZG93biB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb25DaGFubmVsIG9mIHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoc3Vic2NyaXB0aW9uQ2hhbm5lbCk/LmRlbGV0ZShjaGFubmVsKVxuXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChzdWJzY3JpcHRpb25DaGFubmVsKT8uc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZGVsZXRlKHN1YnNjcmlwdGlvbkNoYW5uZWwpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5kZWxldGUoY2hhbm5lbClcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLmRlbGV0ZShjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIgY2hhbm5lbC5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRDaGFubmVsIHwgdW5kZWZpbmVkfSBjaGFubmVsIC0gQ2hhbm5lbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSB0ZW5hbnQgLSBUZW5hbnQga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVyblxuXG4gICAgdGhpcy5jaGFubmVscy5hZGQoY2hhbm5lbClcbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLnNldChjaGFubmVsLCB0ZW5hbnQpXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjaGFubmVsPy5zdWJzY3JpYmVkPy4oKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3dpdGhDb25uZWN0aW9ucyhjYWxsYmFjaykge1xuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJXZWJzb2NrZXQgc2Vzc2lvblwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgY2hhbm5lbCBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0gYXJncyAtIFN1YnNjcmlwdGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyPy4oKVxuXG4gICAgaWYgKCFyZXNvbHZlcikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgLy8gVGVuYW50IHJlc29sdXRpb24gY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzLCBzbyBpdCBtdXN0IGhhcHBlbiBpbnNpZGUgYVxuICAgICAgLy8gY29ubmVjdGlvbiBzY29wZSAoc2VlIF9oYW5kbGVDaGFubmVsU3Vic2NyaWJlKS5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWwsIHBhcmFtc30pXG4gICAgICB9KVxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVyKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjoge2NoYW5uZWwsIHBhcmFtc30sXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCBlcnJvcjogXCJTdWJzY3JpcHRpb24gcmVqZWN0ZWRcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxJbnN0YW5jZSA9IHR5cGVvZiByZXNvbHZlZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmV3IHJlc29sdmVkKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICBsYXN0RXZlbnRJZCxcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbkNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uUGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgICA6IHJlc29sdmVkXG5cbiAgICAgIGlmIChjaGFubmVsSW5zdGFuY2UgJiYgIShjaGFubmVsSW5zdGFuY2UgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsSW5zdGFuY2UsIHRlbmFudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJXZWJzb2NrZXQgY2hhbm5lbCBzdWJzY3JpcHRpb24gZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIGVycm9yOiBcIlN1YnNjcmlwdGlvbiByZWplY3RlZFwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByZXBhcmUgcmVwbGF5IHN0YXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBJbnRlcm5hbCBjaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBhcmdzLmxhc3RFdmVudElkIC0gTGFzdCByZWNlaXZlZCBldmVudCBpZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3Vic2NyaXB0aW9uQ2hhbm5lbCAtIENsaWVudC1mYWNpbmcgY2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSBhcmdzLnN1YnNjcmlwdGlvblBhcmFtcyAtIENsaWVudC1mYWNpbmcgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxmYWxzZSB8IHtidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59IHwgbnVsbD59IC0gUmVwbGF5IHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgX3ByZXBhcmVSZXBsYXlTdGF0ZSh7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbkNoYW5uZWwsIHN1YnNjcmlwdGlvblBhcmFtc30pIHtcbiAgICBpZiAoIWxhc3RFdmVudElkKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHN0b3JlLmdldEV2ZW50QnlJZCh7Y2hhbm5lbCwgaWQ6IGxhc3RFdmVudElkfSlcblxuICAgIGlmICghY2hlY2twb2ludCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbDogc3Vic2NyaXB0aW9uQ2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtczogc3Vic2NyaXB0aW9uUGFyYW1zLCB0eXBlOiBcInJlcGxheS1nYXBcIn0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyZWQ6IGZhbHNlLFxuICAgICAgY2VpbGluZ1NlcXVlbmNlOiAoYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbCkpIHx8IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICBjaGVja3BvaW50U2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICByZXBsYXlpbmc6IHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXBsYXkgY2hhbm5lbCBldmVudHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YnVmZmVyZWQ6IGJvb2xlYW4sIGNlaWxpbmdTZXF1ZW5jZTogbnVtYmVyLCBjaGVja3BvaW50U2VxdWVuY2U6IG51bWJlciwgcmVwbGF5aW5nOiBib29sZWFufX0gYXJncy5yZXBsYXlTdGF0ZSAtIFJlcGxheSBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByZXBsYXkgY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgX3JlcGxheUNoYW5uZWxFdmVudHMoe2NoYW5uZWwsIHJlcGxheVN0YXRlfSkge1xuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBzZXF1ZW5jZTogcmVwbGF5U3RhdGUuY2hlY2twb2ludFNlcXVlbmNlLFxuICAgICAgdXBUb1NlcXVlbmNlOiByZXBsYXlTdGF0ZS5jZWlsaW5nU2VxdWVuY2VcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KGNoYW5uZWwsIGV2ZW50LnBheWxvYWQsIHtcbiAgICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmlkLFxuICAgICAgICByZXBsYXllZDogdHJ1ZSxcbiAgICAgICAgc2VxdWVuY2U6IGV2ZW50LnNlcXVlbmNlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZpbmlzaCByZXBsYXkgc3RhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59fSByZXBsYXlTdGF0ZSAtIFJlcGxheSBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBidWZmZXJlZCBldmVudHMgYXJlIGZsdXNoZWQuXG4gICAqL1xuICBhc3luYyBfZmluaXNoUmVwbGF5U3RhdGUoY2hhbm5lbCwgcmVwbGF5U3RhdGUpIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIHJlcGxheVN0YXRlLnJlcGxheWluZyA9IGZhbHNlXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmRlbGV0ZShjaGFubmVsKVxuXG4gICAgaWYgKCFyZXBsYXlTdGF0ZS5idWZmZXJlZCkgcmV0dXJuXG5cbiAgICBjb25zdCBsaXZlRXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHNlcXVlbmNlOiByZXBsYXlTdGF0ZS5jZWlsaW5nU2VxdWVuY2VcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBsaXZlRXZlbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFdmVudChjaGFubmVsLCBldmVudC5wYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBldmVudElkOiBldmVudC5pZCxcbiAgICAgICAgc2VxdWVuY2U6IGV2ZW50LnNlcXVlbmNlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgdGVuYW50LlxuICAgKiBAcGFyYW0ge3tjaGFubmVsPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19IGFyZ3MgLSBUZW5hbnQgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gLSBSZXNvbHZlZCB0ZW5hbnQuXG4gICAqL1xuICBhc3luYyBfcmVzb2x2ZVRlbmFudCh7Y2hhbm5lbCwgcGFyYW1zfSkge1xuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5wYXJhbXM/LigpXG4gICAgY29uc3QgbWVyZ2VkUGFyYW1zID0ge1xuICAgICAgLi4uKHJlcXVlc3RQYXJhbXMgJiYgdHlwZW9mIHJlcXVlc3RQYXJhbXMgPT09IFwib2JqZWN0XCIgPyByZXF1ZXN0UGFyYW1zIDoge30pLFxuICAgICAgLi4uKHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiID8gcGFyYW1zIDoge30pXG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gKi8gKHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50KHtcbiAgICAgIHBhcmFtczogbWVyZ2VkUGFyYW1zLFxuICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB1bmRlZmluZWQsXG4gICAgICBzdWJzY3JpcHRpb246IGNoYW5uZWwgPyB7Y2hhbm5lbCwgcGFyYW1zfSA6IHVuZGVmaW5lZFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW5tYXNrIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIE1hc2suXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIHVubWFzayBwYXlsb2FkLlxuICAgKi9cbiAgX3VubWFza1BheWxvYWQocGF5bG9hZCwgbWFzaykge1xuICAgIC8qKlxuICAgICAqIFJlc3VsdC5cbiAgICAgKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYyhwYXlsb2FkLmxlbmd0aClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gcGF5bG9hZFtpXSBeIG1hc2tbaSAlIDRdXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uT3BlbiA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uT3BlbiA6IG51bGxcblxuICAgICAgaWYgKG9uT3Blbikge1xuICAgICAgICBhd2FpdCBvbk9wZW4oe3Nlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgb3BlbiBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcnVuIG1lc3NhZ2UgaGFuZGxlciBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gSW5jb21pbmcgd2Vic29ja2V0IG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uTWVzc2FnZSA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uTWVzc2FnZSA6IG51bGxcblxuICAgICAgaWYgKG9uTWVzc2FnZSkge1xuICAgICAgICBhd2FpdCBvbk1lc3NhZ2Uoe21lc3NhZ2UsIHNlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25FcnJvciA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uRXJyb3IgOiBudWxsXG5cbiAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgIGF3YWl0IG9uRXJyb3Ioe2Vycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksIHNlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlckNsb3NlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25DbG9zZSA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uQ2xvc2UgOiBudWxsXG5cbiAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgIGF3YWl0IG9uQ2xvc2Uoe3Nlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgY2xvc2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW90ZSBhZGRyZXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFJlbW90ZSBhZGRyZXNzIHJlc29sdmVkIGZyb20gdGhlIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqL1xuICByZW1vdGVBZGRyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5yZW1vdGVBZGRyZXNzKCkgfHwgdGhpcy5jbGllbnQucmVtb3RlQWRkcmVzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyfSBoYW5kbGVyIC0gSGFuZGxlciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRNZXNzYWdlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IGhhbmRsZXJcbiAgICB2b2lkIHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gIH1cblxuICBhc3luYyBfcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2VcblxuICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBmYWxzZVxuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAvLyBJbnN0YWxsIGhhbmRsZXIgYW5kIGRyYWluIG9uT3BlbiBiZWZvcmUgcmVwbGF5aW5nIHF1ZXVlZFxuICAgICAgICAvLyBtZXNzYWdlcy4gc2V0TWVzc2FnZUhhbmRsZXIoKSBmaXJlcyBvbk9wZW4gYXMgZmlyZS1hbmQtZm9yZ2V0O1xuICAgICAgICAvLyBhd2FpdGluZyBfcnVuTWVzc2FnZUhhbmRsZXJPcGVuKCkgZGlyZWN0bHkgaGVyZSBjbG9zZXMgdGhlXG4gICAgICAgIC8vIHJhY2Ugd2hlcmUgcXVldWVkIHN1YnNjcmliZS9jb25uZWN0aW9uLSogZnJhbWVzIHdvdWxkXG4gICAgICAgIC8vIGRpc3BhdGNoIHdoaWxlIGFuIGFzeW5jIG9uT3BlbiBpcyBzdGlsbCBzZXR0aW5nIHVwIHNlc3Npb25cbiAgICAgICAgLy8gc3RhdGUuXG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gICAgICAgIGF3YWl0IHRoaXMuX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXI6IHR5cGVvZiBoYW5kbGVyLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgcmVzb2x2ZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IGZhbHNlXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UgPSB1bmRlZmluZWRcbiAgICBhd2FpdCB0aGlzLl9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmbHVzaCBxdWV1ZWQgbWVzc2FnZXMuXG4gICAqIEBwYXJhbSB7e3VzZUhhbmRsZXI6IGJvb2xlYW59fSBhcmdzIC0gQXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyfSkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VRdWV1ZS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgcXVldWVkID0gdGhpcy5tZXNzYWdlUXVldWUuc2xpY2UoKVxuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBxdWV1ZWQpIHtcbiAgICAgIGlmICh1c2VIYW5kbGVyICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLl9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|